Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lek-3 по инфе.doc
Скачиваний:
13
Добавлен:
03.03.2015
Размер:
213.5 Кб
Скачать

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

12

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]