Операторы повторений

В языке Турбо Паскаль имеются три оператора, с помощью которых можно задать выполнение оператора (либо последовательности операторов) несколько раз подряд.

Счетный оператор цикла FORимеет следующую структуру:

FOR<Парам. Цик.>:=<Нач. Знач.> To <Кон. Знач> Do <оператор>;

Здесь FOR, TO, DO – зарезервированные слова (для, до, выполнить);

<Парам. Цик.> - параметр цикла – переменная любого порядкового типа;

<Нач. Знач.> - начальное значение – выражение того же типа;

<Кон. Знач> - конечное значение – выражение того же типа;

<оператор> - любой оператор Турбо Паскаль.

 

Блок-схема счетного оператора циклов FOR имеет вид рис. 6.

Счетчик:= Начальное значение

 

 

 
 

 

 


Рис. 6. Блок-схема выполнения счетного оператора циклов FOR.

 

Оператор FOR работает следующим образом. Сначала вычисляется выражение <Нач. Знач.> и осуществляется присваивания параметру цикла начального значения. После этого циклически повторяется:

- проверка условия <Парам. Цик.> <= <Кон. Знач>; если условие выполнено, оператор FOR завершает свою работу;

- выполнение оператора <оператор>;

- наращивание переменной <Парам. Цик.> на единицу.

 

Можно использовать изображение блок-схемы с блоком модификации (рис. 7).

 

 
 

 

 


Рис. 7. Блок-схема выполнения счетного оператора циклов FOR с блоком модификации

Пример:

Программа, которая выводит на экран числовую последовательность целых чисел от 1 до 10.

Program DemoFor;

Var

i: integer;

Begin

for i:=1 to 10 do

write(i:3);

End.

Следует отметить, что оператор FOR выполняет циклически только один оператор. Если необходимо выполнить в цикле последовательность операторов, их необходимо заключить в операторные скобки begin .. end.

Пример:

Программа, которая вычисляет сумму десяти чисел, последовательно введенных с клавиатуры.

               
   
 
   
 
 
 
   
 
   

 

 


Program DemoFor;

Var

i,x,s: integer;

Begin

s:=0;

writeln('Введите последовательно десять целых чисел');

for i:=1 to 10 do

begin

writeln('Введите', i, 'число');

readln(x);

s:=s+x;

end;

writeln('Сумма чисел равна ',s);

End.

 

Следует отметить еще два обстоятельства. Во-первых, условие, управляющее работой оператора FOR, проверяется перед выполнением оператора. Если условие не выполняется в самом начале работы оператора, то он не выполнится ни разу. Другое обстоятельство – шаг наращивания параметра строго постоянен и равен (+1).

Существует другая форма оператора:

FOR<Парам.Цик.>:=<Нач.Знач.> DOWNTO <Кон.Знач> DO <оператор>;

Замена зарезервированного слова TO на DOWNTO означает, что шаг наращивания параметра цикла равен (-1), а управляющее условие приобретает вид <Парам.Цик.> = <Кон.Знач>. Отличие оператора FOR .. TO .. DO от FOR .. DOWNTO DO заключается в том, что первый оператор организует прямой цикл (начальное значение всегда должно быть меньше конечного), а второй – обратный (начальное значение должно быть больше конечного).

Пример:

Программа, которая выводит на экран последовательность целых чисел от 10 до 1.

Program DemoFor;

Var

i: integer;

Begin

for i:=10 downto 1 do

write (i:3);

End.

В операторах цикла FOR в качестве значений параметров цикла могут использоваться переменные и константы. Например, для случая параметра – константы могут использоваться конструкции типа:

Const

n=10;

Var

i: integer;

Begin

for i:=1 to n do

begin

Циклические операторы часто используются для пошагового ввода и вывода данных. Обычно используются конструкции вида:

Var

i, n: integer;

Begin

Writeln('Сколько чисел ввести?');

Readln(n);

for i:=1 to n do

begin

writeln(' Введите ', i, ' число ');

readln(x);

Оператор цикла Repeat с постпроверкой условия.

Оператор цикла с постпроверкой условия целесообразно использовать в тех случаях, когда тело цикла необходимо выполнить не менее одного раза и заранее не известно общее количество повторений цикла. Оператор цикла с постусловием имеет следующий формат:

Repeat

<Оператор1>;

… {Тело цикла}

<ОператорN>;

until <Условие>;

Здесь Repeat, Until – зарезервированные слова (повторять до тех пор, пока не будет выполнено условие);

<Тело цикла> - произвольная последовательность операторов Турбо Паскаль;

<Условие> – это выражение логического типа.

 

Блок-схема оператора цикла Repeat представлена на рис. 8.

 
 

 


Рис. 8. Блок-схема оператора цикла Repeat

Операторы, заключенные между словами repeat и until, составляют тело цикла и выполняются до тех пор, пока не выполнится условие. Поскольку условие проверяется в конце цикла, то операторы цикла выполняются минимумом один раз. В теле цикла может находиться произвольное число операторов без операторных скобок begin и end. Необходимо учитывать, что, по крайней мере, один из операторов тела цикла должен влиять на изменение значения параметра условия, в противном случае произойдет зацикливание программы.

Пример:

Программа, которая выводит на экран числовую последовательность от 1 до 5 с шагом 0.01.

Program DemoRepeat;

Var

i: real;

Begin

i:=1;

repeat

write(i:5:2);

i:=i+0.01;

until i>10;

End.

Программа наглядно демонстрирует особенности использования оператора цикла repeat. Здесь i – параметр условия. Его иногда называют шагом цикла. Как видим из примера, шаг оператора цикла REPEAT может быть вещественным.

Оператор цикла WHILE с предпроверкой условия:

WHILE <условие> DO <оператор>.

Здесь WHILE, DO – зарезервированные слова (пока [выполняется условие], делать);

<условие> - выражение логического типа;

<оператор> - произвольный оператор Турбо Паскаль.

Блок-схема оператора цикла WHILE имеет вид рис. 9.

 

 

Рис.9. Блок-схема оператора цикла WHILE

 

Оператор начинает свою работу с вычисления и проверки условия. Если условие выполняется, то выполняется <Оператор>, после чего вычисление выражения <условие> и его проверка повторяются. Если условие не выполняется, то оператор цикла WHILE прекращает свою работу.

При использовании оператора цикла WHILE следует иметь в виду, что он выполняет циклически только один оператор. Если необходимо выполнить в цикле последовательность операторов, их необходимо заключить в операторные скобки begin…end. Подобно оператору цикла REPEAT в теле цикла оператора WHILE должен быть хотя бы один оператор, влияющий на изменение значения параметра условия. В противном случае произойдет зацикливание программы.

Рассмотрим предыдущий пример, реализованный с помощью оператора цикла WHILE.

Program DemoWhile;

Var

i : real;

Begin

i:=1;

while i<10 do

begin

i:=i+0.1;

write(i:5:2);

end;

End.

Из примера видно, что шаг оператора цикла WHILE может быть вещественным.

Задачи

1. Ввести 10 целых чисел. Найти их среднее арифметическое.

2. Ввести 10 целых чисел. Найти их среднее геометрическое.

3. Ввести n целых чисел. Подсчитать сумму положительных и сумму отрицательных чисел. Найти общую сумму.

4. Ввести n целых чисел. Подсчитать число положительных и отрицательных чисел.

5. Ввести n целых чисел. Определить минимальное и максимальное число.

6. Ввести n целых чисел. Определить четные и нечетные числа.

7. Ввести n целых чисел. Определить числа одновременно кратные 3 и 5.

8. Ввести n целых чисел. Определить числа, которые при делении на 5 дают остаток 2.

9. Вывести на экран числовой ряд вещественных чисел от 10 до 30 с шагом 0,01.

10. Дано целое число n. Вычислить а) 2n; б) n!;

в) ; г) ;

д) .

11. Дано целое число a, целое число n. Вычислить:

а) an; б) a(a+1)…(a+n-1); в) ;

г) д) a(a-n)(a-2n)…(a-n·n).

12. Даны вещественные числа x, а, целое число n. Вычислить .

13. Дано вещественное число a. Найти:

а) среди чисел первое, большее a;

б) такое наименьшее n, что первое, большее a;

в) такое наименьшее n, что .

14. Дано вещественное число n. а) Сколько цифр в числе n? б) Чему равна сумма его цифр? в) Найти первую цифру числа n.

15. Даны вещественные числа m и n. Получить сумму m последних цифр числа n.

16. Дано целое число n.

а) Выяснить, входит ли цифра 3 в запись числа n2.

б) Поменять порядок цифр числа n на обратный.

в) Переставить первую и последнюю цифру числа.

г) Приписать по единице в начало и в конец записи числа n.

17. Даны целые числа n и m. Найти наибольший делитель этих чисел. Для данной задачи удобно использовать алгоритм Евклида. Он основан на следующих свойствах наибольшего общего делителя (НОД). Пусть m и n – одновременно не равные нулю целые неотрицательные числа и пусть m³n. Тогда, если n=0, то НОД(n,m)=m, а если n¹0, то для чисел m, n и r, где r – остаток от деления m на n, выполняется равенство НОД(m,n)=НОД(n,r).

Например: НОД(15,6)=НОД(6,3)=НОД(3,0)=3.

18. Пусть x1 = y1 =1, xi = 0,3xi-1, yi=xi-1+yi-1, i=2,3,… Дано целое n. Найти .

19. Дано целое число n. Получить наименьшее число вида 2r, превосходящее n.

20. Дано целое число n. Вычислить 1·2+2·3·4+…+…+n·(n+1)·…·2n.

21. Вычислить .

22. Дано целое число x¹0. Вычислить .

23. Даны целые числа n, k (n³k³0). Вычислить .

24. Вычислить a) ; б) ; в) ; г) ; д) ;

е) ; ж) ; з)

(Выражение есть краткая запись произведения );

25. Дано целое число n. Вычислить: а) ; б) ;

в) ; г) ; д) ; е) ; ж) .

26. Дано целое число n. Вычислить произведение первых n сомножителей:

а) ; б) .

В программировании достаточно часто используют конструкции, в которых в теле циклических операторов могут находиться другие циклические операторы. Такие внутренние циклы называют вложенными.

for i:=1 to 10 do

for j:=1 to 5 do

begin

end;

Здесь j – внутренний цикл, i – внешний цикл.

Подобные конструкции работают следующим образом. В начальный момент переменной i присваивается значение 1, переменной j – значение 1. Затем выполняется тело цикла (последовательность операторов, заключенная между операторными скобками begin и end). После выполнения тела цикла переменная j увеличивает значение на 1, а переменная i остается равной 1. Затем опять выполняется тело цикла. Это повторяется до тех пор, пока значение переменной j не превысит конечного значения (в нашем случае 5). После этого значение i увеличится на 1, а j станет равным 1. … Таким образом, чтобы внешний цикл увеличил свое значение на 1, необходимо, чтобы выполнился весь внутренний цикл.

Пример:

Ввести целое число n. Вычислить сумму .

Program DemoForFor1;

Var

n,i,j:integer;

a,s,p: real;

 

Begin

s:=0;

writeln('Введите число членов последовательности');

readln(n);

for i:=1 to n do

begin

a:=1/i;

p:=a;

for j:=2 to n do

p:=p*a;

s:=s+p;

end;

writeln('Сумма степеней=',s);

End.

           
 
 
   
 
   

 

     
 
 
   

 

 


Использование вложенных циклов позволяет решать задачи вывода информации.

Пример:

Программа, которая выводит на экран рисунок вида:

1 2 2 2 2 2 2 2 1

0 1 2 2 2 2 2 1 0

0 0 1 2 2 2 1 0 0

0 0 0 1 2 1 0 0 0

0 0 0 0 1 0 0 0 0

0 0 0 1 2 1 0 0 0

0 0 1 2 2 2 1 0 0

0 1 2 2 2 2 2 1 0

1 2 2 2 2 2 2 2 1

 

Program DemoForFor;

Var

x,y: integer;

Begin

writeln;

for y:=1 to 9 do

begin

for x:=1 to 9 do

begin

if (x=y) or (x=10-y) then write(1:2)

else if ((x>y) and (x<10-y))

or ((x<y) and (x>10-y)) then write(2:2)

else write(0:2);

end;

writeln;

end;

End.

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

По внешнему циклу программы выполняются два оператора, заключенные в операторные скобки – это вложенный циклический оператор for x:=1 to 9 do и writeln. Оператор writeln в данном случае используется для перевода указателя в начало следующей строки после выведения строки x. Подобные приемы достаточно часто используются в программировании.

Задачи

1. Ввести вещественные числа а1, …, а10. Вычислить .

2. Ввести вещественные числа а1, …, а10. Получить последовательность b1, …, b10, где

,

. . . .

3. Ввести целое число n. Вычислить последовательность

а) б) в)

г) д)

4. Ввести целое число n. Вычислить последовательность

а) б)

в) г)

д)

5. Ввести целое число n, вещественные числа a1, …, an. Вычислить:

а) , б)

а) указать тройку x, y, z таких целых чисел, что x2 + y2 + z2 = n;

б) указать все тройки x, y, z таких целых чисел, что x2 + y2 + z2 = n.

9. Ввести целое число n≥2. Разложить число n на простые множители. Простой множитель p должен быть выведен a раз, где a - натуральное число такое, что n делится на pa и не делится на pa+1.

Указание. Использовать операторы следующего вида:

While p<n do

Begin

While n mod p =0 do begin

end;

p:=p+1;

end

10. В условие предыдущей задачи вносится изменение: каждый простой множитель может использоваться не более одного раза.

11. Прямоугольное хоккейное поле размера a × b освещено n рядами ламп по m ламп в ряду, расположенными на высоте h от поверхности льда. Расстояние между рядами ламп равно , расстояние между лампами в ряду . Определить освещенность хоккейного поля в точке, расстояния от которой до бортов соответственно равны x и y (x≤a, y≤b). Мощность ламп – 200 Вт, КПД ламп – 1%.

 

 

12. Вывести на экран рисунок следующего вида:

а)0 0 0 0 1 2 2 2 2 0 0 0 0 1 2 2 2 2 0 0 0 0 1 2 2 2 2 0 0 0 0 1 2 2 2 2 1 1 1 1 1 1 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 3 3 3 3 б)1 0 0 0 0 0 0 0 0 2 2 1 0 0 0 0 0 0 2 2 2 2 1 0 0 0 0 2 2 2 2 2 2 1 0 0 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 0 0 2 2 2 2 1 0 0 0 0 2 2 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 в)1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 1 2 2 0 0 0 0 0 1 2 2 2 0 0 1 1 1 1 1 2 2 0 0 0 1 3 3 3 3 3 0 0 1 3 3 3 3 3 3 0 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 г)0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 1 2 2 0 0 0 0 0 1 2 2 2 0 0 0 0 1 2 2 2 2 0 0 0 0 0 1 2 2 2 0 0 0 0 0 0 1 2 2 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 1

13. Ввести действительные числа x и y. Определить, принадлежит ли точка с координатами x и y области, обозначенной цифрой 1 на рисунке.

а)1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 б)0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 в)1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 г)0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1

 

Вывести на экран рисунок, где положение точки обозначается цифрой 2.