trains_hr.gif
 


В ПОМОЩЬ СТУДЕНТУ И ШКОЛЬНИКУ

 


Горбачев Л.И. Основы программирования в среде Turbo Pascal.

[НАЗАД]    [ДАЛЕЕ]

2.4. Операторы повтора (цикла).

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

   В Турбо Паскале различают три вида операторов организации циклов:

  • while - оператор цикла с предварительным условием (цикл с предусловием);
  • repeat - оператор цикла с последующим условием (цикл с постусловием);
  • for - оператор цикла с управляющим параметром (цикл с параметром).

      2.4.1. Оператор цикла while.

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

Общий вид оператора следующий:
while <логическое_выражение> do <оператор>;
где <оператор> - простой или составной оператор, а <логическое_выражение> - выражение булевского типа.

   Оператор цикла while действует следующим образом. Предварительно проверяется значение логического выражения. Пока оно истинно, выполняется оператор циклической части (после do). Как только значение логического выражения становится ложным, происходит выход из цикла.

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

Пример: Вычислить значение выражения A**7 при любом значении A (например, при A < 0, когда выражение Exp(7 * Ln(A)) недопустимо).
program prg;
uses СRT;
var I : integer; A, P : real;
Begin
ClrScr;
I := 1; P := 1;
Write('Введите основание степени: '); ReadLn(A);
while I <= 7 do
begin
P := P * A;
I := I + 1 { Можно использовать функцию Inc(I) }
end;
Write('Значение выражения A**7 равно ', P:5:10);
ReadLn
End.

Пример: Программа для вычисления и вывода на дисплей таблицы значений функции Y = a * X * X при X = 5, 6, 7,..., 35; a = 10.2 с помощью цикла while.
program prg;
uses CRT;
var Y, a : real; X : integer;
Begin
ClrScr;
X := 5; a := 10.2;
while X <= 35 do
begin
Y := a * X * X;
WriteLn(' X =', X,' Y =', Y:5:3);
Inc(X)
end;
ReadLn
End.

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

Пример: while True do write('Бесконечный цикл');
while 5 = 5 do write('Бесконечный цикл');
{ Очевидно, что результат 5 = 5 всегда равен True }

      2.4.2. Оператор цикла repeat.

   Оператор повтора repeat состоит из заголовка (repeat), тела цикла и условия окончания (until). Цикл с постусловием характерен тем, что вначале обязательно выполняются хотя бы один раз команды, составляющие тело цикла.

   После выполнения операторов циклической части проверяется условие. Если условие ложно, то вновь выполняются операторы циклической части. Если условие истинно, то цикл заканчивается.
Общий вид оператора следующий:
repeat
<оператор_1>;
<оператор_2>;
...........
<оператор_n>
until <логическое_выражение>;

   <Логическое_выражение> (условие) - выражение булевского типа. При написании условия допустимы булевские операции и операции отношения. Операторы, заключенные между словами repeat и until, являются телом цикла.

   Оператор цикла repeat действует следующим образом:

  • выполняются операторы циклической части, проверяется значение логического выражения: если оно ложно, то вновь выполняются операторы циклической части; если же оно истинно, то цикл заканчивается;
  • если значение логического выражения истинно с самого начала, то операторы циклической части выполняются один раз. Если же логическое выражение никогда не принимает значение "истинно", то операторы циклической части выполняются бесконечное число раз, т.е. происходит "зацикливание";
  • нижняя граница операторов циклической части четко обозначена словом until, поэтому нет необходимости заключать эти операторы в операторные скобки begin - end. В то же время дополнительное наличие операторных скобок не является ошибкой.


Пример: В приведенном фрагменте программы описано вычисление A**7 с использованием цикла repeat:
..............
I := 1; P := 1;
repeat
P := P * A; Inc(I)
until I > 7;
..............

Пример: Программа нахождения простых чисел. Как известно, число называется простым, если оно делится только на единицу и себя. Проверить, является ли число N простым, можно делением на 2, на 3 и т.д. до N и проверкой остатка после каждого деления. Если остаток равен 0, то следовательно найдено число, на которое N делится без остатка. Сравнив N и полученное таким образом число, можно определить, является ли N простым.
program ProstoeChislo;
uses CRT;
var N, d, r : integer;
Begin
ClrScr;
Write('Введите целое число: '); ReadLn(N);
d := 2; { сначала делим на 2 }
repeat
r := N mod d; { вычисление остатка от деления }
{ если N не разделилось нацело на d }
if r <> 0 then d := d + 1;
until r = 0; { выполнять, пока не нашли число, на которое
делится N }
{ если число N равно d, то ... }
if d = N then WriteLn(N, '- простое число')
else WriteLn(N, '- не является простым числом');
repeat until KeyPressed
End.

Примечание: Оператор repeat until KeyPressed (исполняется "пустой" цикл до тех пор, пока не будет нажата любая клавиша) служит для задержки результата выполнения программы до нажатия на любую клавишу.

   Для преждевременного выхода из цикла можно использовать оператор goto (хотя в большинстве случаев можно обойтись и без него, присвоив параметру цикла выходящее за допустимый диапазон значение):
.....................
repeat
S := 200 / A; S1 := A / S;
if S < 0.5 then goto Metka;
A := A + 1
until (A <= 100) and (S1 <> 0);
Metka:
.....................

Пример: Программа нахождения суммы четных чисел в интервале от 0 до 50 включительно
program SumChetChisel;
uses CRT;
var I, Sum : integer;
Begin
I := 0; Sum := 0;
repeat
Sum := Sum + I; I := I + 2
until I > 50;
WriteLn('Сумма четных чисел равна: ', Sum)
End.

      2.4.3. Оператор цикла for.

   Цикл с параметром характерен тем, что количество исполняемых циклов определено в заголовке цикла при записи оператора for.

Общий вид оператора: for I := N1 to N2 do <оператор>;
где I - переменная (параметр) цикла; N1, N2 - начальное и конечное значения переменной цикла.

   В качестве переменной I может использовать только простую переменную, а в качестве N1, N2 могут использоваться выражения (за исключением вещественного типа real).

   Параметры I, N1, N2 должны быть одного и того же скалярного типа, но не real (т.е. целого, символьного, ограниченного типа или типа "перечисление"). Переменная цикла I принимает последовательные значения данного типа от N1 до N2. Если I, N1, N2 - целого типа, то в этом случае шаг изменения переменной цикла всегда равен +1.

Пример:
program Pr6;
const A = 10.2;
var X : integer;
Begin
for X := 5 to 35 do Writeln('Y=', A * X * X)
End.

   Пример цикла, когда параметр принимает значения символьного типа: for I = 'A' to 'W' do Write(' ', I). В примере осуществляется печать букв латинского алфавита от A до W.

   Пример цикла, когда параметр принимает значения типа "перечисление".
Пусть переменная D типа Day = (Pn, Vt, Sr, Ch, Pt, Sb, Vs):
........................................
type Day = (Pn, Vt, Sr, Ch, Pt, Sb, Vs);
var
D: Day; V: Day;
........................................
Тогда можно записать следующий оператор for:
for D := Pn to Vs do
begin
..............
if V > D then exit;
..............
end;

   Если необходимо записать цикл по убывающим значениям параметра I от N1 до N2, то используется следующий оператор:

for I := N2 downto N1 do <оператор>;

В этом случае параметр I принимает последовательные убывающие значения данного типа от N2 до N1.

Пример: for I := 20 downto 1 do S := S + 1;
Здесь I изменяется от 20 до 1 с шагом -1.

Пример: Программа вычисления суммы при m = 8:
V=      
m mk/2 < tr>
Σ
< tr>
k=1 2(m-1)  
program prg;
uses CRT;
var m, k : integer; V : real;
Begin
ClrScr;
m := 8; V := 1.0;
for k := 1 to m do
V := V * Sqrt(Exp(k / 2 * Ln(m))) / (2 * (m - 1));
Write('V=', V:5:8)
repeat until KeyPressed
End.

   Для выхода из цикла до момента достижения параметром цикла конечного значения можно воспользоваться оператором goto:
......
for I := 1 to 45 do
begin
F := F + 1;
if (F > 100) or (I = 30) then goto 100
end;
100:
......

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

   В теле оператора for могут находиться другие операторы for. Это позволяет строить циклы, содержащие внутренние циклы. Такие внутренние циклы называются вложенными, например:
for I := 1 to 10 do
for J := 1 to 5 do Array[I, J] := 0;

Пример: Вычислить сумму 5-ти первых элементов ряда 1 + 1/2 + 1/3 + ... (значение i-го элемента ряда связано с его номером формулой 1/i). После вычисления очередного элемента ряда выводится номер элемента и его значение.
program Summa;
uses CRT;
var i : integer; { номер элемента ряда }
elem : real; { значение элемента ряда }
sum : real; { сумма элементов ряда }
Begin
ClrScr;
sum := 0;
for i := 1 to 5 do
begin
elem := 1/i;
sum := sum + elem;
WriteLn(i:2, ' ', elem:4:2);
end;
WriteLn('Сумма элементов ряда: ', sum:4:2);
ReadLn
End.

Пример: Вычисление числа π с задаваемой с клавиатуры точностью. Вычисление значения π основано на том, что сумма ряда чисел 1 - 1/3 + 1/5 - 1/7 +1/9 +... приближается к значению π * 4 при достаточно большом количестве членов ряда. Член ряда вычисляется по формуле 1/(2 * n - 1) и умножается на -1, если n четное. Вычисление заканчивается когда значение очередного члена ряда становится меньше, чем заданная точность вычисления. Переменные: Pi - вычисляемое значение, e - точность вычислений, elem - значение члена ряда, n - номер члена ряда.
Program ChisloPi;
Uses CRT;
Var Pi, E, elem : real; n : integer;
Begin
ClrScr;
Pi := 0; n := 1; elem := 1; { Начальные значения }
Write('Точность вычисления Pi: '); ReadLn(E);
WriteLn('Вычисление Pi с точностью ', E:9:8);
while elem >= E do
begin
elem := 1 / (2 * n - 1);
{ Проверка остатка от деления n на 2 }
if (n MOD 2) = 0 then Pi := Pi - elem
else Pi := Pi + elem;
Inc(n);
end;
Pi := Pi * 4;
WriteLn('Значение Pi с точностью ',E:9:8,' равно',Pi:12:8);
WriteLn('Просуммировано ',n,' членов ряда');
ReadLn
End.

   При Е=0.001 значение Pi=3.14358866. Просуммировано 502 члена ряда.

[НАЗАД]    [ДАЛЕЕ]


Главная
Новости
TurboPascal
Учебное пособие
Лекции
Исходники
Математика
Книги
Лекции
Шпоры
ЦТ и ЕГЭ
Физика

Книги

Шпоры
ЦТ и ЕГЭ

Литература

Сочинения

Краткие содержания

Другое
Мой родной край
Фотогалерея
Форум
Ссылки

Гостевая






 

                                        © Copyright(c) 2004 Amro Group. All rights reserved

 

Hosted by uCoz