![](/user_photo/2706_HbeT2.jpg)
3.3.Оператор цикла do while (цикл с предусловием)
Схема алгоритма конструкции оператора цикла do while приведена на рис. 3.7
Рисунок 3.7 Схема алгоритма конструкции оператора цикла do. while
Синтаксис оператора цикла do while имеет следующий вид:
do while (logical_expr)
[операторы]
enddo
Тело цикла, аналогичное для цикла с постусловием, будет выполняться до тех пор, пока истинно логическое выражение logical_expr. Как только выражение становится ложно, происходит переход к выполнению операторов после enddo. Т.е. величины, входящие в состав логического выражения, должны изменяться в теле цикла. При этом с каждым изменением они должны стремиться к тому, чтобы логическое выражение стало ложным. В противном случае цикл станет бесконечным.
Если в теле цикла используется конструкция if, Select case, то они должны содержаться целиком внутри цикла.
Решение задачи о табулировании функции с использование оператора цикла do while будет выглядеть следующим образом (схема алгоритма рис. 3.8).
Рис. 3.8 |
X=a Do while (x<=b) Y=x**2 X=x+dx enddo |
Любой оператор цикла может иметь внутри тела цикла другую циклическую структуру. Такая конструкция называется вложенной структурой оператора цикла.
Рассмотрим несколько примеров решения задач с использованием циклических структур.
Пример 1. Вывести на экран 10 единиц, так что на нечетных позициях стоят отрицательные, а на четных положительные.
Program edenitsa
Integer I,p
P=1
Do I,10
P=-p
Write(*,’(i2,&)’), p
Enddo
end
Результат работы программы:
-1 1 -1 1 -1 1 -1 1 -1 1
Пример 2. Вывести на экран все числа, которые кратны 5 в диапазоне от 10 до 50.
Здесь диапазон удобно использовать как начальное и конечное значение счетчика цикла с параметром с шагом 1. То есть сами проверяемые значение будут выступать в качестве параметра. Число кратно 5, если делится на него без остатка. То есть если остаток от деления числа на 5 равен нулю, то оно выводится на экран.
Program kratnost
Integer k !проверяемое число
Do k=10,50
If (mod(k,5) == 0) then
Print ‘(i4,$)’, k
Endif
Enddo
End
Результат:
10 15 20 25 30 35 40 45 50
Пример 3. Задача подсчета количества значений, удовлетворяющих определенному условию. Рассматривается на примере предыдущей задачи. В программе применяется целочисленная переменная-счетчик s. Перед использованием в цикле счетчику присваивается начальное значение, как правило 0. Эта операция называется обнулением или сбросом счетчика.
В случае выполнения условия в теле цикла переменная-счетчик увеличивает свое значение на 1. В итоге после выхода из цикла в s будет храниться количество найденных чисел.
Program kratnost_count
Integer k, s
S=0 ! переменная счетчик количества найденных чисел
Do k=10,50
If (mod(k,5) == 0) then
Print ‘(i4,$)’, k
S=s+1
Endif
Enddo
Print ‘(a,i2)’, ‘Vsego = ’, s
End
Результат:
10 15 20 25 30 35 40 45 50
Vsego = 9
Пример 5. Просуммировать значений чисел от 1 до 10, т.е. найти следующую сумму 1+2+3+…+10.
Program summa
Integer k, s
S=0 ! переменная накапливающая сумму
Do k=1,10
S=s+k
Enddo
Print ‘(a,i2)’, ‘Vsego = ’, s
End
При подсчете количества переменная счетчик увеличивается на 1 на каждом шаге цикла, а переменная-сумматор на каждом шаге последовательно увеличивается на значения, которые нужно просуммировать.
Если рассмотреть работу цикла пошагово, то значения в переменной s будут меняться следующим образом:
Перед началом цикла s=0.
При k=1, s=0+1=1;
При k=2, s=1+2=3;
При k=3, s=3+3=6;
…
При k=9, s=36+9=45;
При k=10, s=45+10=55;
Результат работы программы:
Vsego = 55
Пример 6.
Например найти сумму ряда
с точностью 0,001. Здесь количество
повторений заранее неизвестно. Суммировать
элементы ряда до тех пор, пока с добавлением
последующего элемента сумму не будет
увеличиваться больше чем на 0,001. Как
видно каждый элемент ряда меньше
предыдущего. Значит суммировать надо
до тех пор, пока прибавляемый элемент
станет меньше 0,001. Чтобы наложить условие
на элемент ряда нужно определить
зависимость по которой он вычисляется.
Очевидно что в данном случае элемент
равен
,
где k
– номер элемента в ряде. Если воспользоваться
циклом do
while,
то условие выхода из цикла будет
.
В теле цикла производится суммирование
элементов и подсчет порядкового номера
суммируемого элемента, равный количеству
повторений цикла.
Program row_summa
Integer :: k=1 ! номер элемента ряда
Real :: sum=0, slag
! sum –сумма ряда
! slag – значение текущего єлемента
Slag=1.0/(k*k+1) ! первый элемент ряда
Do while (slag > 0.001) ! проверка условия выхода из цикла
Sum = sum + slag ! накапливаем сумму
K = k+1 ! считаем номер следующего элемента ряда
Slag = 1.0/(k*k+1) ! вычисляем значение следующего элемента ряда
enddo
print ‘(a, f9.6)’, ‘summa=’, sum
print ‘(a, i4)’, ‘kol-vo elementov=’, k
print ‘(a, f9.6)’, ‘poslednee slagaenoe=’, slag
end
Последовательно начиная с k=1 вычисляется и проверяется каждый элемент ряда. Если элемент больше значения 0,001, то он добавляется в переменную sum. Если нет, то происходит выход из цикла и в переменной sum будет находится искомая сумма.
Результат:
Summa = 1.044941
kol-vo elementov= 32
poslednee slagaenoe= 0.000976