microbik.ru
1 2 3
Циклы в языке Паскаль
При решении многих задач часть операторов должна выполняться несколько раз. В этом случае вычислительный процесс имеет циклический характер. Циклы позволяют многократно выполнять отдельный характер или последовательность операторов, причем при этом нет необходимости записывать в тексте программы одинаковые операторы одинаковые операторы несколько раз.

Цикл — это многократно выполняемый участок программы. Состоит из начала цикла, тела цикла и конца цикла.

Тело цикла — это последовательность выполняемых в цикле операторов.

В языке Паскаль имеется три вида операторов цикла: 1) оператор с предварительным условием (предусловием); 2) оператор цикла с последующим условием (постусловием); 3) оператор цикла со счетчиком.

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

Форма записи оператора цикла с предусловием:

While булевское_выражение do оператор,

где булевское_выражение — выражение булевского типа, при истинном значении (True) которого будет выполняться цикл, оператортело цикла.

Примечание. Нельзя после служебного слова do ставить точку с запятой. В этом случае компилятор ошибки не выдаст, но программа “зависнет”. Компилятор воспримет точку с запятой как пустой оператор, стоящий в теле цикла. Так как в теле цикла может быть только один оператор по синтаксису Паскаля, то операторы, стоящие после точки с запятой будут расценены компилятором, как операторы, которые нужно выполнять после окончания цикла While. Однако при выполнении программы, при входе в цикл While булевское_выражение должно иметь значение True, так как ни какие операторы в теле цикла его не изменяют (там только пустой оператор), то цикл будет выполняться бесконечное число раз, программного выхода из цикла и программа “зависнет”. В этом случае для останова выполнения программы можно нажать клавиши Ctrl + Break.

Работа этого цикла заключается в следующем. Предварительно проверяется значение булевского_выражения. Пока оно принимает значение True, выполняется тело цикла. Как только значение булевского_выражения становится False, происходит выход из цикла и передача управления следующему за ним оператору. Если с самого начала значение булевского_выражения False, то тело цикла не выполнятся ни разу.

Примечание. Если требуется, чтобы тело цикла While состояло не из одного оператора, а из списка операторов, то их объединяют в один составной оператор, заключая в операторные скобки Begin [список операторов] end.

Пример.

А:= -50; С:=4; {задание начальных значений переменным А и С}

While А<=0 do {пока значение переменной А не положительно}

Begin {выполняется составной оператор тела цикла}

C:=C*2;{изменение значений переменных А и С}

A:=A+10

end; {конец цикла While}

Задача 1. Составить программу построения на всю длину экрана дисплея семейства пересекающихся окружностей (R=50), следующего ниже вида.
Решение. Расположим центры окружностей, например, выше середины экрана относительно оси Оу на 50 пикселей. При построении окружностей координата Y центров окружностей не изменяется и равна GetMaxY div 2-50. По условию задачи центр каждой следующей окружности лежит на предыдущей, следовательно, абсцисса центра одной окружности будет отличаться от координаты X центра предыдущей на величину радиуса и будет равна Х+R, где R — радиус окружности. В переменной X будет храниться текущее значение координаты X. У первой окружности координата Х должна иметь значение больше радиуса (окружность должна поместиться на экране). Выберем для первой окружности координату Х=80. Начальные значения переменным X, Y, R зададим до начала цикла. Построение окружности Circle(X,Y,R) сделаем первым оператором в теле цикла. У второй окружности координата X будет равна 80+R, у третьей (80+R)+R и т.д. Таким образом, для вычисления абсциссы центра следующей окружности можно использовать следующую операцию присвоению: X:=X+R. При выполнении этой операции сначала вычисляется значение арифметического выражения справа от оператора присвоения, а следовательно, значение переменной X равно абсциссе уже построенной окружности, а затем вычисленное значение арифметического выражения назначается переменной X, стоящей слева от оператора присвоения. Таким образом, к началу следующего выполнения тела цикла в переменной Х будет храниться значение равное абсциссе центра окружности, которую необходимо построить. Поэтому выполнение оператора Circle(X,Y,R) выведет на экран вторую окружность, которая будет смещена относительно первой на 50 пикселей. Далее у переменной Х снова увеличится значение на 50 пикселей, и при третьем выполнении тела цикла будет выведена третья окружность смещенная относительно второй на 50 пикселей и т.д. Сколько всего окружностей можно построить на экране мы не знаем. Известно, что окружности должны быть построены на всю длину экрана. Поэтому последняя координата Х не должна превышать значения GetMaxХ-R (последняя окружность должна поместиться на экране). Поэтому все действия по построению окружностей должны выполняться пока координата Х меньше значения GetMaxХ-R.
Program Crossing_Circeles ;

Uses Graph;

Const R=50;

Var Gd, Gm: Integer; X, Y: Integer;

Begin

Gd:=Detect; InitGraph(Gd, Gm, 'C:\LANG\TP\BGI');

Y:=GetMaxY div 2-50; {координата центра окружностей по оси Оу}

X:=80; {присвоение начального значения переменной Х}

While X < GetMaxХ-R do

Begin

Circle(X,Y,R); {построение окружности с текущим значением X}

Х:=Х+R {рассчет координаты Х для следующей окружности}

end;{конец цикла While}

ReadLn; {фиксация изображения на экране}

CloseGraph

end.
Примечание. Таким образом, при составлении программы с циклом необходимо выделить переменные, не изменяющиеся при выполнении цикла, переменные которые изменяются при выполнении цикла, и определить на сколько (или во сколько раз) изменяются они изменяются. Если переменных, изменяющих свои значения, в цикле несколько, то необходимо выразить одни переменные через другие, это позволит создать более компактный текст программы.

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

Repeat [список_операторов] until булевское_выражение.

где список_операторов — тело цикла, операторы в списке операторов разделяются точкой с запятой (;). Точку с запятой после последнего оператора в списке операторов можно не ставить, хотя если ее поставить — ошибки тоже не будет, компилятор воспримет ее как пустой оператор, входящий в список операторов тела цикла. Так как зарезервированные слова Repeat…until обрамляют тело цикла, то операторные скобки Begin…end уже не нужны.

Работает цикл следующим образом. Список_операторов тела цикла выполняется повторно (по крайней мере, один раз) до тех пор, пока значение булевского_выражения равно False. То есть сначала выполняются операторы тела цикла, а затем проверяется условие. В этом отличие работы циклов While…do и Repeat…Until. Цикл прекращает свою работу и передает управление следующему после него оператору, когда значение булевского_выражения становится равным True.

Пример.

А:= -50; С:=4; {Задание начальных значений переменным А и С.}

Repeat{Начало цикла.}

C:=C*2; A:=A+10 {Изменение значений переменных А и С}

until А>0; {до тех пор, пока значение переменной А не станет >0}

Задача 2. Решить предыдущую задачу, используя цикл с постусловием.

Program Crossing_Circles_2;

Uses Graph;

Const R=50;

Var Gd, Gm, X, Y: Integer;

Begin

Gd:=Detect;

InitGraph(Gd, Gm, 'C:\LANG\TP\BGI');

Y:=GetMaxY div 2 -50; {Ордината центра окружностей.}

X:=80; {Присвоение начального значения переменной Х.}

Repeat

Circle(X, Y, R); {Построение окружности.}

Х:=Х+R {Рассчет абсциссы центра следующей окружности.}

until X > GetMaxХ-R;

ReadLn; {Фиксация изображения на экране.}

CloseGraph

end.

3. Цикл со счетчиком. Если при решении задачи известно сколько раз должно повториться тело цикла, то в этом случае используется цикл со счетчиком. В этом операторе обязательно указываются следующие параметры:

  • имя переменной, в которой храниться число сделанных повторений цикла (переменной цикла или счетчика цикла);

  • некоторое начальное значение переменной цикла (счетчика), которое она получает при первом выполнении цикла;

  • некоторое конечное значение переменной цикла, достигнув которое, повторение цикла прекращается (условие завершение цикла).

Существует два варианта оператора цикла со счетчиком:

  1. For имя:= начальное_значение to конечное_значен do оператор;

  2. For имя:= начальное_значен downto конечное_значен do оператор,

— где имя — это идентификатор переменной цикла; начальное_значение, конечное_значение — это выражения того же типа, что и переменная цикла; оператор — тело цикла, которое выполняется повторно для каждого значения счетчика цикла от его начального_значения до его конечного_значения включительно. Первая конструкция применяется, когда начальное_значение счетчика цикла меньше его конечного_значения, и после каждого выполнения тела цикла значение счетчика цикла автоматически увеличивается на 1. Вторая конструкция применяется, когда начальное_значение счетчика цикла больше его конечного_значения, и после каждого выполнения тела цикла значение счетчика цикла автоматически уменьшается на 1.

Примечание. В качестве переменной цикла должна выступать порядковая (перечисляемая) переменная. Использование переменной типа Real не допускается, в этом случае компилятор выдаст следующее сообщение об ошибке: “Error #97: Invalid For control variable” (т.е. недопустимая переменная цикла).

Пример.

  • For I:=1 to 10 do A:=A+1;

  • For I:=1 to N do B:=B+10;

  • For I:=K to N-1 do C:=2*C;

  • For I:=N downto 1 do M:=M/2

  • For I:=N*2 downto K do L:=L*L.

Задача 3. Составить программу, которая выводит на экран букв латинского алфавита от 'A' до 'Z' с их кодами ASCII.

Решение. Так как все буквы латинского алфавита упорядочены, то программа запишется следующим образом.

Program Code_of_Letteres;

Var I: Char; {Описание переменной — счетчика цикла.}

Begin

For I:= 'A' to 'Z' do { Начало цикла. Заголовок цикла For.

Организация "просмотра" латинского алфавита.}

Write(I:3, '—', Ord(I)); {форматный вывод букв и их кодов

ASCII. Буква отделена от своего кода ASCII знаком тире (—)}

end.
Задача 4. Составить программу построения на экране дисплея горизонтальной цепочки из 5 соприкасающихся окружностей радиусом 50.

Решение. Расположим окружности, например, на середине экрана относительно оси Оу. Тогда при построении окружностей необходимо учитывать, что координата Y не изменяется и определяется как GetMaxY div 2. По условию задачи окружности соприкасающиеся, следовательно значение координаты Х будет отличаться от предыдущей на два радиуса, то есть Х:=Х+2*R, где R — радиус окружности. Выберем для первой окружности координату Х=110. Известно, что надо построить 5 окружностей. Поэтому все действия по построению окружностей будут заложены в тело цикла. Текст программы следующий.

Program N_Circles;

Uses Graph; {подключение модуля Graph }

Const N=5; R=50;

Var Gd,Gm,X,Y,I: Integer; {описание переменных}

Begin

Gd:=Detect;

InitGraph(Gd, Gm, 'C:\LANG\TP\BGI');

Y:=GetMaxY div 2;{координата центра окружностей по оси Оу}

SetColor(Blue); {установка цвета для окружностей}

X:=110; {присвоение начального значения переменной Х}

For i:=1 to N do

Begin

Сircle(X, Y, R); {построение окружности}

Х:=Х+2*R {рассчет координаты Х для следующей окружности}

end;

ReadLn; {фиксация изображения на экране}

CloseGraph

end.

Задача 5. Составить программу, которая вычисляет сумму ряда с точностью E = 0.001.

Решение. Для решения задачи воспользуемся оператором While. Опишем следующие переменные: К — номер слагаемого, а также номер прохода цикла, A — K-ое слагаемое, т.е. , S — сумма всех слагаемых до K-ого (или сумма на К-ом проходе цикла), т.е. следующая сумма, С — степень 3K-1, F — факториал (K+2)!. Значение С, которое будет использовать при вычислении следующего слагаемого, в три раза больше текущего значения. Чтобы получить это новое значение запишем операцию присвоения С:=C*3. Значение F, которое будет использовать при вычислении следующего слагаемого, в (K+2) раза больше текущего значения. Получаем это новое значение операцией F:=F*(K+2). Тогда текст программы будет следующий.

Program Summa;Const E=0.001; {Задание точности вычислений.}Var C,F,K:Integer; A,S:Real;

Begin C:=1; F:=6; S:=0; K:=1; While A
S:=S+A; {Добавление К-ого слагаемого к сумме

всех слагаемого стоящих до него.}

K:=K+1; {Увеличение счетчика слагаемых.} F:=F*(K+2); {Вычисление факториала для следующего

прохода цикла.}

C:=C*3; {Вычисление степени для следующего

прохода цикла.}

end;

WriteLn('Сумма ряда равна S= ',S:5:3) {Форматированный вывод

значения суммы.}

end.

Задача 6. Составить программу, рисующую траекторию луча света в зеркальной коробке, в центре которой находится еще одна зеркальная коробка с линейными размерами в три раза меньше, чем у внешней коробки. Луч попадает в коробку под углом 45 градусов к ее стенкам, начиная с точки (1; 1).

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

KeyPressed — функция, которая возвращает значение True, если на клавиатуре была нажата клавиша, и False в противном случае.

Delay(миллисекунды) — подпрограмма, которая выполняет задержку времени выполнения программы на заданное число миллисекунд.

Решение. Отметим, что луч может упасть на любую из поверхностей только под углом 45 градусов, следовательно, отраженный луч будет составлять с поверхностью тоже 45 градусов. Если траекторию рисовать по точкам, то после отражения луча, изменится знак приращения координаты следующей точки, по координатной оси. Причем, если луч отразился относительно горизонтальной линии на экране дисплея, то DY=-DY, а если луч отразился относительно вертикальной линии на экране дисплея, то DX=-DX. Таким образом, решение задачи сводится к одному циклу, который завершается при нажатии любой клавиши, внутри которого будут проверяться условия достижения стенок — их можно оформить как одно сложное условие для горизонтальных стенок и одно — для вертикальных. Если какое-либо из условий выполнено, то изменяется соответствующее приращение. После проверки условий вычисляются координаты следующей точки траектории,

Program Ray_in_Mirror_Box;Uses Graph,Crt;Var Gd,Gm,X,Y,dX,dY,Xt,Yt: Integer; Begin Gd:=Detect; InitGraph(Gd,Gm,'C:\LANG\TP\BGI');

X:=1; Y:=1; dX:=1; dY:=1;

Xt:=GetMaxX div 3;

Yt:=GetMaxY div 3;

Rectangle(0,0,GetMaxX,GetMaxY);

Bar(Xt,Yt,2*Xt,2*Yt);

Repeat

PutPixel(X,Y,White); delay(5);

If (X=0)or(X=GetMaxX)or

(((X=Xt)or(X=2*Xt))and(Y>=Yt)and(Y<=2*Yt))

then dX:=-dX;

If (Y=0)or(Y=GetMaxY)or

(((Y=Yt)or(Y=2*Yt))and(X>=Xt)and(X<=2*Xt))

then dY:=-dY;

X:=X+dX; Y:=Y+dY

until KeyPressed;

CloseGraph

end.

4. Оператор безусловного перехода GoTo. В Turbo Pascal’е, как и в других языках программирования, конструкция безусловного перехода реализована в виде оператора GoTo Метка, где Метка должна быть обязательно описана в разделе описания меток Label.

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

5. Оператор выхода из цикла Break. Этот оператор осуществляет переход на первый оператор, расположенный непосредственно за циклом. Эта конструкция реализована только в Turbo Pascal’е версии 7.0.

Пример. Фрагмент программы вычисления факториала чисел, пока он меньше 10000.

For i=1 to 100 do

Begin

K:=K*I; Writeln(’K!= ’,K);

If K>=10000 then Break;

end;

6. Оператор перехода на следующую итерацию цикла Continue. Этот оператор осуществляет переход на следующую итерацию цикла. Эта конструкция реализована только в Turbo Pascal’е версии 7.0.

Пример. Фрагмент программы вычисления факториала четных чисел.

For i=1 to 10 do

Begin

If K mod 2=1 then Continue;

K:=K*I; Writeln(’K!= ’,K);

end;

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

Вложенный цикл — это цикл, содержащийся в теле другого цикла.

Внешний цикл — это цикл, в тело которого входит другой цикл.

Задача 7. Составить программу, вычисляющую с точностью E=0.001 значение суммы

.

Решение. Для решения этой задачи воспользуемся двумя вложенными циклами While. Внутренний цикл будет служить для вычисления “внутренней” суммы

,

а внешний цикл — суммы

.

Решением каждой из этих подзадач будут случить следующие фрагменты программ. В первом фрагменте вычисляется значение суммы S1 (вложенный цикл), при предположении, что значение переменной N задается ранее, а в нем она не меняет своего значения. Обозначения: A1 — это К-ое слагаемое, S1 — сумма всех слагаемых до K-ого, С — степень (N+3)K-1. Значение С, которое будет использовать при вычислении следующего слагаемого, в (N+3) раза больше текущего значения (т.е С:=C*(N+3) ).

S1:=0; C:=1; K:=0; A1:=1; {Задание начальных значений

переменным, участвующим в цикле.}

While A1>E do

Begin

A1:=1/C; {Вычисление K-ого слагаемого.}

S1:=S1+A1; {Добавление K-ого слагаемого к сумме всех до него.}

K:=K+1; {Увеличение счетчика слагаемых.}

C:=C*(N+3); {Вычисление степени для следующего слагаемого.}

end

Во втором фрагменте вычисляется значение искомой суммы. Обозначения: A — это N-ое слагаемое, S — сумма всех слагаемых до N-ого, F — факториал N!. Значение переменной А, которое будет использовать при вычислении следующего слагаемого, в N раза больше текущего значения(т.е. F:=F*N).
Z:=1; F:=1; S:=0; A:=1; N:=1; {Задание начальных значений

переменным, участвующим в цикле.}

While A>E do

Begin

; {Здесь должны быть операторы вычисления суммы S1/}

A:=Z/Sqr(F)*S1; {Вычисление N-ого слагаемого.}

S:=S+A; {Добавление N-ого слагаемого к сумме всех до него.}

N:=N+1; {Увеличение счетчика слагаемых.}

Z:=-Z; {Изменение знака у следующего слагаемого

на противоположный.}

F:=F*N; {Вычисление факториала для следующего слагаемого.}

end

Объедим эти два фрагмента в одну программу, которая и будет решением задачи.

Program Summa_2;

Const E=0.001;

Var Z,C,F,K,N:Integer; A,A1,S,S1:Real;

Begin

Z:=1; F:=1; S:=0; A:=1; N:=1; {Задание начальных значений

переменным, участвующим

во внешнем цикле.}

While A>E do

Begin {Вычисление суммы S1.}

S1:=0; C:=1; K:=0; A1:=1; {Задание начальных значений

для переменных участвующих

во вложенном цикле.}

While A1>E do {Заголовок вложенного цикла.}

Begin

A1:=1/C;

S1:=S1+A1; {Тело вложенного цикла.}

K:=K+1;

C:=C*(N+3);

end; {Конец вложенного цикла}

A:=Z/Sqr(F)*S1;

S:=S+A;

N:=N+1;

Z:=-Z;

F:=F*N;

end; {Конец внешнего цикла.}

WriteLn('S= ',S:5:3) {Форматированный вывод результата}

end.

Задача 8. Составить программу, которая рисует на экране дисплея орнамент в виде ковра из пятиконечных звезд. Пятиконечные звезды построить при помощи цикла For.

Решение. Для начала построим пятиконечную звезду. Радиус описанной окружности пусть будет равен R. Вся окружность составляет 2π радиан, следовательно, между соседними лучами звезды будет угол 2π/5. Так как вершины звезды соединяются через одну, то задача сводится к построению отрезков, которые соединяют точки, расположенные на окружности через 4π/5. Точки, расположенные на окружности, имеют следующие параметрические уравнения


где X0, Y0координаты центра окружности, а R — ее радиус. Тогда если K — номер точки, — будет изменяться от 0 до 5, то выполняя оператор

LineTo(X0+Round(R*Sin(4*K*Pi/5)), Y0-Round(R*Cos(4*K*Pi/5)))

удастся соединить все вершины звезды, если предварительно переместить текущий указатель в нулевую вершину, т.е. вершину, соответствующую углу в 0 радиан, при помощи оператора

MoveTo(R+I*2*R,J*2*R),

который должен быть поставлен до цикла обхода всех вершин звезды.

Заполним звездами все свободное пространство экрана дисплея по горизонтали. Для этого необходимо в первый параметр оператора Line добавить слагаемое I*2*R, которые осуществит перенос центра звезды на величину диаметра окружности вправо, где I — номер звезды, который изменяется от 0 до своего максимального значения (GetMaxX+1) div (2*R)-1. Аналогично, слагаемое J*2*R, добавленное во второй параметр оператора Line, осуществит перенос центра звезды на величину диаметра окружности вниз. Тогда текст программы будет следующий.

Program Grating;

Uses Graph;

Const R=10;

Var NX,NY,Gd,Gm,I,J,K,X0,Y0:Integer;

Begin

Gd:=Detect;

InitGraph(Gd,Gm,'C:\LANG\ALEXEY\BP\BGI');

X0:=R; Y0:=R;

For I:=0 to (GetMaxX+1)div(2*R)-1 do

For J:=0 to (GetMAxY+1)div(2*R)-1 do

Begin

MoveTo(R+I*2*R,J*2*R);

For K:=1 to 6 do

LineTo(X0+I*2*R+Round(R*Sin(4*K*Pi/5)),

Y0+J*2*R-Round(R*Cos(4*K*Pi/5))) end;

ReadLn;

CloseGraph;

end.

8. Бесконечные циклы. Конструкции бесконечных циклов можно реализовать при помощи уже рассмотренных операторов языка Паскаль.

Бесконечный (закрытый, замкнутый) цикл — это цикл, в котором не предусмотрен выход при достижении некоторого условия и который не будет прерван программным путем.

Примеры. 1. While True do оператор;

2. Repeat список_операторов until False;

3. For I:=1 to 2 do I:=I-1.
Контрольные вопросы

  1. Укажите отличительные особенности оператора цикла While.

  2. Объяснить работу цикла While по блок-схеме.

  3. Будет ли выполняться циклическая часть программы, если логическое выражение является ложным с самого начала в операторе цикла While?

  4. Всегда ли выполняется тело цикла While?

  5. Можно ли после служебного слова do ставить точку с запятой?

  6. Какие требования предъявляются к организации тела цикла?

  7. Должны ли быть определены компоненты условия до начала работы цикла While?

  8. Какие операторы могут быть элементами тела цикла While?

  9. Можно ли закончить досрочно работу оператора цикла While?

  • Каково назначение операторов цикла Repeat?

  • Укажите отличительные особенности оператора цикла Repeat.

  • Объяснить работу цикла по блок-схеме.

  • Будет ли выполняться циклическая часть программы, если логическое выражение является истинным с самого начала в операторе цикла Repeat?

  • Всегда ли выполняется тело цикла Repeat?

  • Можно ли перед служебным словом until ставить точку с запятой?

  • Какие требования предъявляются к организации тела цикла?

  • Должны ли быть определены компоненты условия до начала работы цикла Repeat?

  • Какие операторы могут быть элементами тела цикла Repeat?

  • Можно ли досрочно закончить работу оператора цикла Repeat?

  1. Каково назначение операторов цикла?

  2. Для чего используется цикл со счетчиком?

  3. Какие формы операторов цикла со счетчиком существуют?

  4. Объяснить работу цикла со счетчиком по соответствующей блок-схеме.

  5. Укажите отличительные особенности оператора цикла со счетчиком?

  6. Можно ли изменять программным путем счетчик цикла?

  7. Чему равен шаг изменения счетчика цикла?

  8. Всегда ли цикл со счетчиком конечен?

  9. Чему равен счетчик цикла по окончанию работы оператора цикла со счетчиком?

  10. Допускается ли изменение конечного значения счетчика цикла в процессе работы?

  11. Как закончить досрочно работу оператора цикла с счетчиком?

Упражнения

  1. Сколько раз будет выполнен цикл и какими будут значения переменных А, В и С после завершения этой последовательности:

A:=1; B:=1;

While A + B < 8 do Begin

A:=A + 1; B:=B + 2

end;

C:=A + B;

  1. Какими будут значения переменных А и В после выполнения операторов:

A:=1; B:=1;

While A <= 3 do

A:=A + 1; B:=B +1;

  1. Дана последовательность операторов:

P:=A; S:=0;

While P > 0 do

Begin

S:=S + P mod 10;

P:=P div 10

end;

  1. Определить значение результата Р при следующих значениях: а) А = 23; б) А = 32; в) а = 109.

  2. Дана последовательность операторов, вычисляющих факториал F числа N:

K:=1; F:=0;

While K < N do

F:=F * K

K:=K + 1

которая содержит пять ошибок. Найти ошибки.

  1. В чем особенность следующего цикла:

While A < B do

C:=A + B;

  1. Значение переменной А неизвестно. Указать условия, которые должны иметь место после выполнения следующих операторов:

а) While A > 10 do

A:=A – 1;

б) While A > 10 do

A:=A – 10.

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

а) While C < 0 do C:=C + K;

б) While K<>0 do K:=K + 1;

в) While K<>0 do K:=K – 2.

  1. Сколько раз будет выполнен оператор Х:=Х+1 в ходе выполнения оператора цикла While В do Х:=Х+1;, если Х - это переменная типа Integer, а В - это: а) (SQR(X)>0or(X=0); б) (X>0) and (X<0); в) (X<0) or (X=0) or (X>0).

  2. Определить значение переменной Х после выполнения следующих операторов:

X:=0; I:=1;

Repeat

X:=X+5 div I;

I:=I-1;

until I<=1;

  1. Сколько раз будет выполнен цикл и какими будут значения переменных А. В и С после завершения этой последовательности:

A:=1; B:=1;

Repeat

A:=A + 1; B:=B + 2

until A + B >= 8

C:=A + B;

  1. Какими будут значения переменных А и В после выполнения операторов:

A:=1; B:=1;

Repeat

A:=A + 1

until A <= 3

B:=B +1;

  1. Дана последовательность операторов:

P:=A; S:=0;

Repeat

S:=S + P mod 10; P:=P div 10

until P <= 0;

  1. Определить значение результата Р при следующих значениях: а) А = 23; б) А = 32; в) A = 109.

  2. В чем особенность следующего цикла:

Repeat

C:=A + B

until A < B

  1. Значение переменной А неизвестно. Указать условия, которые должны иметь место после выполнения следующих операторов:

а) Repeat

A:=A - 1

until A <= 10;

б) Repeat

A:=A - 10

until A <= 10;

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

а) Repeat C:=C + K until C > 0;

б) Repeat K:=K + 1 until K = 0;

в) Repeat K:=K - 2 until K = 0.


  1. Сколько раз будут выполнены циклы в следующих фрагментах программ:

а) For K:= -1 to 1 do;

б) For K:= 10 to 20 do;

в) For K:= 20 to 10 do;

г) K:=5; R:=15; For i:= 0 to K * R do;

д) K:=5; R:=15; For i = K + 1 to R - 1 do;

е) K:=R; For i:= K to R do;

ж) K:=5; R:=15; For i:= K downto R do;

з) K:=5; R:=15; For i = R - 1 downto K + 1 do;

и) K:=R; For i:= K * R downto 0 do.

  1. Найти ошибки в следующем фрагменте программы:

а) Y:=0; For X:=0.1 to 0.9 do Y:=Y + sin(X);

б) K:=81; Y:=1; For i:=1 to sqrt(K) do Y:=2 * Y;

в) K:=0; For i:=1 to 9 do K:=K + sqr(i); K:=K:=K * i;

г) K:=1; For i:=1 to 64 do Begin i:=2 * i; K:+K + i end;

д) Y:=0; For X:=0.9 to 0.1 do Y:=Y + sin(X);

е) Y:=0; For X:=0.1 to 0.9 downto do Y:=Y + sin(X).

Задания

  1. Составить и выполнить программу, которая вычисляет значение N!.

  2. Составить и выполнить программу, которая выводит таблицу значений градусов по Цельсию и Фаренгейту (от 0°С до 20°С).

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

  4. Составить и выполнить программу, которая выводит весь латинский алфавит.

  5. Составить и выполнить программу, которая выводит весь латинский алфавит от Z до А.

  6. Даны натуральные числа А и В. Найти все пары дружественных чисел, лежащих в диапазоне от А до В. Два числа называются дружественными, если каждое из них равно сумме всех делителей другого (само число в качестве делителя не рассматривается).

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

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

  9. Составить и выполнить программу, которая выводит на экран К-ую строку треугольника Паскаля.

  10. Старинная задача. Сколько можно купить быков, коров и телят. если плата за быка 10000 рублей, за корову 5000 рублей, за теленка - 500 рублей, если на 100000 рублей надо купить 100 голов скота (в решении задачи использовать не более двух циклов).

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

СЛОВО

Л В


следующая страница >>