
- •Лекция-3
- •1.10.2. Некоторые правила ввода.
- •1.10.3. Ввод и вывод данных из текстового файла.
- •§ 1.11. Операторы stop, pause, goto, continue
- •§ 1.12. Операторные функции
- •§ 1.13. Циклы
- •1.13.1. Понятие о цикле.
- •1.13.2. Простейшая конструкция do.
- •1.13.3. Do-цикл с параметром (цикл с шагом).
- •1.13.4. Цикл с условием.
- •1.13.5. Операторы прерывания циклов.
- •1.13.6. О вложенности do-конструкций.
- •1.13.7. Некоторые правила работы с do и do while циклами.
- •1.13.8. Примеры организации циклов.
1.13.4. Цикл с условием.
Циклы с условием используются при заранее неизвестном количестве повторений. Рекомендуемая форма соответствующего DO WHILE-цикла:
[имя:] DO WHILE(ЛВ)
БОК
END DO [имя]
Если DO WHILE-цикл не содержит операторов прерывания цикла, тоБОКвыполняется до тех пор, пока истинноЛВ.
1.13.5. Операторы прерывания циклов.
Оператор
EXIT [имя]
передает управление из DO-конструкции на первый следующий за этой конструкцией выполняемый оператор. Еслиимяопущено, тоEXITобеспечивает выход из текущего цикла, в противном случаеEXITобеспечивает выход из цикла, имя которого присутствует в оператореEXIT.
Оператор
CYCLE [имя]
передает управление на начало DO-конструкции, при этом операторы, расположенные междуCYCLEи операторомEND DOконца цикла, не выполняются. Еслиимяопущено, тоCYCLEобеспечивает переход на начало текущего цикла, в противном случаеCYCLEобеспечивает переход на начало цикла,имякоторого присутствует в оператореCYCLE.
Кроме того, DO-цикл,DO-цикл с параметром иDO WHILE-цикл могут быть прерваны операторамиGOTOиRETURN.
1.13.6. О вложенности do-конструкций.
DO-конструкции могут быть вложенными, причем степень вложения неограниченна. ВложеннымDO-конструкциям с некоторых позиций полезно давать имена, тем самым повышая их наглядность и позволяя в ряде случаев сократить объем программирования и время отладки программы.
В случае вложенных DOиDO WHILE-циклов два или болееDOиDO WHILE-цикла могут иметь общую завершающую метку (однако надо иметь в виду, что данная возможность в современном Фортране рассматривается как нежелательная). Вместе с темEND DOможет завершать только одинDOилиDO WHILE-цикл.
1.13.7. Некоторые правила работы с do и do while циклами.
1) Переменная DO-цикла с параметромIне может быть изменена операторами этого цикла.
2) Не допускается переход внутрь цикла посредством выполнения оператора GOTOили альтернативного возврата из подпрограммы.
3) Не допускается переход на начало DO-конструкции посредством оператораCYCLE, расположенного за пределами этой конструкции (попытка такого перехода может быть предпринята при работе с именованными вложеннымиDO-конструкциями).
4) Если оператор IFпоявляется внутри цикла, то соответствующий ему операторEND IFдолжен быть внутри того же цикла.
5) Если шаг изменения параметра цикла положителен, а начальное значение счетчика больше конечного, то цикл не выполняется ни разу (то же относится к случаю, когда при отрицательном шаге начальное значение счетчика меньше конечного).
6) Последним оператором цикла, имеющим метку, могут быть только следующие операторы: оператор присваивания, операторы READ, PRINT, CALL, END DO, CONTINUE, а также условный логический оператор IF, в правой части которого стоит один из операторов, перечисленных выше.
1.13.8. Примеры организации циклов.
Пример 1.13.1.Вычислить сумму членов степенного ряда
с
точностью
.
Рассмотрим математическую сторону
задачи. Пусть
.
Погрешность суммы членов
знакочередующегося ряда не превосходит
модуля первого отброшенного члена.
Тогда условия выполнения тела цикла
имеет вид
.
Из отношения двух последовательных
членов получаем рекуррентную формулу
,
причем
.
Реализующая программа имеет вид (в
частности, при
):
program sample_1_13_1 real(4) :: x=0.5, u, s, y integer(4) k y=-x**2; u=x; s=u; k=2 do while(abs(u)>1.e-6) u=u*y/(k*(k+1)); s=s+u; k=k+2 end do print *,’s=’,s end |
Результаты расчета:
s= 0.4794255
Пример 1.13.2.Вычислить сумму членов ряда
Реализующая программа имеет вид (задано
):
program sample_1_13_2 real(4) :: s=0 integer(4) k,n print *,’ Vvedite n’ read *,n do k=1,n s=s+1./(k**2+1) end do print 1,n,s 1 format(/2x,’Kolichestvo uchitivaemikh chlenov ryada n=’,i3,& /2x,’Iskomaya summa ryada s=’,g12.4) end |
Результаты расчета:
Kolichestvo uchitivaemikh chlenov ryada n= 10
Iskomaya summa ryada s= 0.9818
Пример 1.13.3.Вычислить сумму членов ряда
Реализующая программа имеет вид (задано
):
program sample_1_13_3 real(4) :: znak,s=0 integer(4) k,n print *,’ Vvedite n’ read *,n k=1; znak=(-1)**(k+1) do k=1,n s=s+znak/(k**2+1) znak=-znak end do print 1,n,s 1 format(/2x,’Kolichestvo uchitivaemikh chlenov ryada n=’,i3,& /2x,’Iskomaya summa ryada s=’,g12.4) end |
Результаты расчета:
Kolichestvo uchitivaemikh chlenov ryada n= 10
Iskomaya summa ryada s= 0.3595
По представленным текстам последних двух программ (примеры 1.13.2 и 1.13.3) необходимо сделать ряд пояснений:
1. Математическому выражению
соответствует выражение на Фортране
.
Константа1.имеет
вещественный тип, поэтому результат
деления будет также вещественным (в
этом случае дробная часть не отбрасывается).
При записи заданного выражения на
Фортране в виде
его результат для
будет всегда нулевым, т.к. константа 1
имеет целый тип, и, следовательно,
результат деления также будет целого
типа (дробная часть отбрасывается).
2. Введение переменной znakдля вычисления величиныделает вычислительный процесс более
экономичным, т.к. фактически выражение
принимает только два значения (1 и -1). К
тому же переменнаяznakимеет вещественный тип, и, следовательно,
результат деления будет также вещественного
типа (сохраняется дробная часть).
Пример 1.13.4.Требуется запросить у пользователя семь произвольных вещественных чисел и подсчитать их сумму. Однако если будет введено отрицательное число, следует прекратить подсчет и вывести имеющуюся сумму на экран.
Реализующая программа имеет вид (задано
):
program sample_1_13_4 real(4):: x,s=0. integer(4):: i,n=7 do i=1,n print *,’Vvedite chislo’ read *,x print *,’ Vvedennoe znachenie chisla =’,x if(x<0.) exit ! Если число отрицательное, то выход из цикла s=s+x end do print *,’ Summa s=’,s end |
Результаты расчета:
Vvedennoe znachenie chisla = 5.000000
Vvedennoe znachenie chisla = 5.000000
Vvedennoe znachenie chisla = 3.000000
Vvedennoe znachenie chisla = 10.00000
Vvedennoe znachenie chisla = 5.000000
Vvedennoe znachenie chisla = -8.000000
Summa s= 28.00000