Управляющие операторы
Оператор выбора 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 имя
Переменная может быть целого или вещественного типов.
Организация вычислений, итерационные алгоритмы, вычисление сумм, произведений, подсчёт и перебор значений.
Схема выполнения
- Переменной цикла присваивается начальное значение.
- Выполнение тела цикла.
- Переменная цикла увеличивается на шаг цикла.
- Если переменная цикла больше конечного значения, то цикл завершает работу, иначе переход на шаг 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 |
Исправление 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
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
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