Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава3_ЦИКЛИЧЕСКИЕ АЛГОРИТМЫ.doc
Скачиваний:
3
Добавлен:
08.11.2018
Размер:
571.39 Кб
Скачать

Глава3. Циклические алгоритмы

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

3.1 Циклы с параметром.

Оператор цикла For организует выполнение одного оператора заранее определенное число раз. Его еще называют цикл со счетчиком. Существует две формы оператора:

FOR <параметр> := <nz> TO <kz> DO <оператор>;

FOR <параметр> := <nz> DOWNTO <kz> DO <оператор>;

Здесь параметр цикла (счетчик) представляет собой переменную порядкового (ординального) типа; <nz> и <kz> - выражения, определяющие начальное и конечное значение счетчика; <оператор> - один (возможно составной) оператор, который называют телом цикла, повторяемый определенное число раз.

На первом шаге цикла параметр принимает значение nz. В этот же момент происходит вычисление kz - значения параметра на последнем шаге цикла. После каждого выполнения тела цикла, если параметр цикла не равен kz, происходит изменение параметра на следующее большее или меньшее значение в зависимости от формы оператора for, т.е. неявно происходит выполнение одного из двух операторов:

<параметр> := Succ(<параметр>);

<параметр> := Pred(<параметр>);

В случае nz > kz в первой форме оператора или nz < kz во второй его форме ошибки не происходит, но цикл не выполняется ни разу. После завершения работы цикла значение параметра остается равным kz.

РЕКОМЕНДАЦИИ: Использовать цикл for при заранее известном количестве повторений. Не изменять параметр в теле цикла. При использовании кратных (вложенных) циклов применять разные переменные в качестве параметров. Определять до цикла значения всех используемых в нем переменных. Не ставить точку с запятой после do.

цикл с заданным числом повторений (цикл с параметром- цикл ДЛЯ)

компактная запись

развернутая схема:

а- с возрастающим параметром;

б – с убывающим параметром.

For i:=Iн To Iк Do "оператор";

либо

For i:= Iн DownTo Iк Do "оператор";

В случае связки To цикл выполняется при условии Iн <= Iк и происходит с единичным возрастанием параметра цикла i от Iн до Iк.

В случае связки DownTo цикл выполняется при условии Iн >= Iк и происходит с единичным уменьшением параметра цикла i от Iн до Iк.

Примеры:

  1. s:=0; For a:=1 To 100 Do s:= s + a; Writeln(s);

  2. s:=0; p:=1; For x:=1 To 10 Do Begin s:=s+x; p:=p*x end; Writeln(‘s=’,s, ‘ p=’,p);

  3. For a:=1 To 100 Do Write(sqr(a):5);

  4. For a:=100 DownTo 1 Do Write(sqr(a):5);

  5. Write(‘Введите число: ‘); Readln( n ); For x:=1 To 10 Do Writeln(n, ‘ * ‘, x, ‘ = ‘, x*n);

  6. S1:=0; S2:=0; For i:=1 To 10 Do Begin Write ( ‘Введите очередное число: ’); Readln (a ); If a >0 Then s1:=s1+sqrt( a) Else s2:=s2+sqr(a) end; Writeln(s1: 6, s2 : 6); вложенные циклы:

  7. For i:=’a’ To ‘z’ Do For j:=’a’ To i Do Write (j); Writeln;

  8. For i:=’a’ To ‘z’ Do Begin For j:=’a’ To i Do Write (j); Writeln end;

ПРИМЕР 1: Вводятся 10 чисел, посчитать среди них количество положительных.

program cycle_for1;

var i,kn:byte; x:real;

begin

kn:=0;

for i:=1 to 10 do

begin

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

if x>0 then kn:=kn+1 {увеличиваем количество на 1}

end;

writeln('Вы ввели ',kn,' положительных чисел.');

readln

end.

ПРИМЕР 2: Напечатать буквы от 'Z' до 'A'.

program cycle_for2;

var c:char;

begin

for c:='Z' downto 'A' do write(c);

readln

end.

ПРИМЕР 3: Вычислить N-е число Фиббоначчи. Числа Фиббоначчи строятся следующим образом: F(0)=F(1)=1; F(i+1)=F(i)+F(i-1); для i>=1. Это пример вычислений по рекуррентным формулам.

program Fib;

var a,b,c:word; i,n:byte;

begin

write('введите номер числа Фиббоначчи ');

readln(N);

a:=1; {a=F(0), a соответствует F(i-2)}

b:=1; {b=F(1), b соответствует F(i-1)}

for i:=2 to N do

begin

c:=a+b; {c соответствует F(i)}

a:=b; b:=c; {в качестве a и b берется следующая пара чисел}

end;

writeln(N,'-е число Фиббоначчи =',b); {для N>=2 b=c}

readln

end.

ПРИМЕР 4: Составить программу вычисления значения выражения y=((…(202–192)2 –182)2 –…–12)2.

Решение. В данном случае целесообразно организовать цикл с параметром, изменяющимся от 20 до 1, то есть шаг изменения параметра равен –1.

Обозначим: y – очередное значение квадрата числа; n – параметр цикла. Учитывая это, составим программу:

program Primer;

var y, n:integer;

begin

y:=sqr(20);

For n:=19 Downto 1 Do y:=sqr(y-sqr(n));

writeln('Значение выражения = ',y);

readln

end.

Практическое задание 1

  1. Составьте программу, которая вычисляет сумму чисел от 1 до N. Значение N (N должно быть меньше 100) вводится с клавиатуры.

  2. Напишите программу печати таблицы перевода расстояний из дюймов в сантиметры (1 дюйм = 2,5 см ) для значений длин от 1 до 20 дюймов.

  3. Составьте и отладьте программу, вычисляющую сумму квадратов чисел от 1 до введенного вами целого числа N.

  4. Найти наибольшее и наименьшее значение функции y=3x2 + x – 4, если на заданном интервале [a,b] x изменяется с шагом 0,1.

  5. Вычислить: а) 1 + 2 + 4+ 8 + … + 210 б) (1+2)*(1+2+3)* .. *(1+2+…+10)

  6. В ЭВМ вводятся по очереди данные о росте N учащихся класса. Определить средний рост учащихся класса.

  7. Составьте программу вычисления степени числа а с натуральным показателем N. (Записать варианты программы с разными видами циклов while, repeat, For).

  8. Составьте программу вычисления факториала натурального числа N. Факториалом (N!) натурального числа N называется произведение всех чисел от 1 до N, включая N.

  9. Вычислить: S==1+1/2+1/3+1/4+..+1/n, где n – натуральное число.

  10. Для заданного n составьте программу вычисления суммы S=, где i=1,2,3,..,n.

Часто применяются вложенные операторы цикла. Например, если необходимо провести все варианты расчета при изменении нескольких параметров в заданных диапазонах.

ПРИМЕР 5: Составим программу расчета функции y = A*sin(x) - cos(x)/A; при изменении аргумента "x" в диапазоне от 0 до Pi с шагом Pi/100 и при изменении параметра "A" в диапазоне от 1 до 3 с шагом 0. 5.

Program tabl;

var y, x, a, dx: real; i, j: integer;

Begin

Writeln(' Расчет по формуле: y=A*sin(x)-cos(x)/A; ');

Writeln('--------------------------------------------------');

Writeln('|___X___|__A=1.0_|_A=1.5_|_A=2.0_|_A=2.5_|_A=3.0_|');

Writeln('--------------------------------------------------');

dx:= pi/100;

for i:= 0 to 100 do begin { внешний цикл изменения аргумента "X" }

x:= dx*i; Write( x:8:4 );

for j:= 1 to 5 do begin{ вложеннный цикл изменения параметра "A" }

A:= 0.5*(j+1); y:= A*sin(x)-cos(x)/A; Write(y:8:4)

end;

Writeln; { перевод курсора на новую строчку }

if ((i+1) mod 20) = 0 then

readln { задержка прокрутки экрана до нажатия Enter }

end; readln

End.

Практическое задание N 2

1. Рассчитать значения функции y = sin(x)/(x+a)2 при изменении аргумента "x" в диапазоне от 0 до Pi/2 с шагом Pi/80 и при изменении параметра "A" в диапазоне от 1 до 2 с шагом 0, 2.

2. Рассчитать значения функции y = xa/a3 при изменении аргумента "x" в диапазоне от 1 до 10 с шагом 0, 2 и при изменении параметра "A" в диапазоне от 1 до 5 с шагом 1.