Томский государственный университет систем управления и радиоэлектроники
Опубликован: 01.11.2012 | Доступ: свободный | Студентов: 637 / 74 | Длительность: 06:01:00
Лекция 3:

Управляющие операторы

< Лекция 2 || Лекция 3: 123 || Лекция 4 >

Оператор выбора select case

Обработка клавиш, сообщений, событий, диапазонов целых или символьных данных.

select case (выражение)
  case (множество_значений_1)
       операторы

  case (множество_значений_2) 
       операторы
  ...
  case default 
       операторы
end select

Выражение должно быть целого, символьного или логического типа.

 program calculator  ! программа "Калькулятор"
  real a,b,res
  character op
  logical :: flagERR = .FALSE. 

  write(*,"(A,\)")"a = "; read(*,*) a
  write(*,"(A,\)")"b = "; read(*,*) b
  write(*,"(A,\)")"Operation = "; read(*,*) op  

  select case (op)
    case ('+');  res = a+b
    case ('-');  res = a-b
    case ('*');  res = a*b
    case ('/');  res = a/b
    case default; flagERR = .TRUE. ; write(*,*) "ERROR!"
  end select

  if (.NOT.flagERR) write(*,*) "Result...", res
end
program interval ! попадение в целочисленный интервал
integer k

  write(*,"(A,\)") "Enter number >= 0 ..."
  read(*,*) k

  select case(k)
    case (0);        write(*,*) "0"

    case (1:9);      write(*,*) "1..9"

    case (10:99);    write(*,*) "10..99"

    case (100:999);  write(*,*) "100..999"

    case default 
      write(*,*) "----- OVERFLOW ------"
  end select

end

Операторы goto и continue

Передача управления по метке

goto метка

Оператор continueпустой оператор,не выполняет никаких действий и не оказывает влияния на программу

...
if (ошибка_1) goto 100 ! реакция на ошибки
...! в одном месте
read(*,*,ERR = 100)  ....
...

100 continue
...

Оператор цикла do

имя do переменная = начало, конец, шаг

   операторы ! ----- тело цикла

end do имя

Переменная может быть целого или вещественного типов.

Организация вычислений, итерационные алгоритмы, вычисление сумм, произведений, подсчёт и перебор значений.

Схема выполнения

  1. Переменной цикла присваивается начальное значение.
  2. Выполнение тела цикла.
  3. Переменная цикла увеличивается на шаг цикла.
  4. Если переменная цикла больше конечного значения, то цикл завершает работу, иначе переход на шаг 2.
do k = 1, 15    ! цикл выполнится 15 раз
                ! на последней итерации k=15
    ! после выполнения цикла k=16

do k = 1, 50, 2  ! цикл выполнится 25 раз
                 ! на последней итерации k=49
     ! после выполнения цикла k=51

do k = 30, -10, -4   ! цикл выполнится 11 раз
                     ! на последней итерации k=-10
         ! после выполнения цикла k=-14

do s = 8.0, 10.0 , 0.1

Чему равно s на последней итерации цикла и после выполнения цикла ?

Значение переменной s во время работы цикла

8.400002
8.500002
8.600002
8.700003
8.800003
8.900003
9.000004
9.100004
9.200005
9.300005
9.400005
9.500006
9.600006
9.700006
9.800007
9.900007

после работы цикла 10.00001

Исправление do s = 8.0, 10.0 + 0.1/2 , 0.1

Табулирование функции (1-й способ)

program table_1
real :: x0 = 0.0, xn = 1.0, dx = 0.1 
real x, fx 

  do x = x0, xn + dx/2, dx
    fx = sin(x) 
    write(*,"(2(a,f8.3,10x))") "x = ",x, "f(x) = ",fx
  end do

end

Табулирование функции (2-й способ)

program table_2
integer i            
real :: dx = 0.1
real x, fx

  do i = 0,10
    x = i*dx 
    f = sin(x) 
    write(*,"(2(a,f8.3,10x))") "x = ",x, "f(x) = ",fx
  end do

end

Табулирование функции (3-й способ)

program table_3
integer i
real :: dx = 0.1, x = 0, f

  x = x-dx    ! начальное значение x = -0.1 
  do i = 0,10
    x = x+dx  ! x накапливает сумму 
    f = sin(x) 
    write(*,"(2(a,f8.3,10x))") "x = ",x, "f(x) = ",fx
  end do

end

Вычисление суммы

$ \sum\limits_{k=1}^{10} \frac {k^2} {k+1}$
program summa
integer k
real s
  
  s = 0.0
  do k = 1,10
    s = s + k*k/(k+1.0)
  end do
  write(*,*) s! 47.01988

end
n!
program summa
integer(8) fact
integer, parameter :: N = 10

  fact = 1
  do k = 1,N
    fact = fact*k
  end do

  write(*,*) fact  ! 3628800
end

Оператор цикла do while

имя цикла: do while (логическое условие)

             операторы 

           end do имя цикла

Циклы выполняющиеся неопределенное число раз.

Выполнять операторы пока условие истинно.


Суммировать ряд пока слагаемое > 0.0005

$ \sum\limits_{k=1} \frac {1} {k^3+k^2+1}$
program summa
real :: sum = 0, slag
  slag = 1.0/(k**3+k**2+1) ! первое слагаемое
  do while (slag>0.0005) 
    sum = sum + slag   
    slag = 1.0/(k**3+k**2+1) 
  end do
  write(*,*) "summa = ",sum, "slag = ",slag
end
< Лекция 2 || Лекция 3: 123 || Лекция 4 >