3. 3 Оператор перехода Goto. Циклы



Скачать 175.43 Kb.
Дата12.11.2016
Размер175.43 Kb.


3.3 Оператор перехода Goto. Циклы.

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

Для реализации такого перехода в языке Турбо-Паскаль служит оператор безусловного перехода

GoTo n

Здесь n – метка той строки в программе, которая должна выполняться после перехода.



Метка – это либо целое число без знака в диапазоне 0…9999, либо идентификатор, определяемый программистом. Метки используются в разделе операторов. Они ставятся перед операторами и отделяются от них двоеточием. Метки должны быть объявлены в разделе описания меток прежде, чем они будут использоваться. Объявление метки начинается словом Label, за которым следует список используемых меток, разделенных запятыми.

Большинство языков программирования , в т. ч. Паскаль устроены так, что операторы выполняются в том порядке , в котором они записаны. Встречая оператор Goto, компьютер прерывает последовательное выполнение программы и переходит к оператору, следующему за указанной меткой. В качестве примера создадим программу, которая бы бесконечно печатала «Это наш первый цикл». Мы хотим заставить компьютер много раз выполнять одно и тоже действие – иначе говоря, организовать цикл.



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

Label M1;

Begin

M1:WriteLn(‘This is our first cicle’);

Goto M1;

ReadLn;

End.

Для прерывания бесконечного цикла используется комбинация клавиш Ctrl+Break (Ctrl+C).

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

Label M1;

Var I:Integer;

Begin

I:=1000;

M1:Write(I,' ');

i:=I-1;

If I>=600 then

Goto M1;

ReadLn;

End.

В этом примере печать чисел производится, пока выполнено условие I>=600, после чего управление передается оператору ReadLn.



Еще один пример: Напечатать числа 1 2 3 …99 100 99 …3 2 1. Здесь мы воспользуемся двумя метками, чтобы напечатать как прямой, так и обратный счет. То есть мы организуем два цикла.

Label M1,M2;

Var A:Integer;

Begin

A:=1;

M1:Write(A,' ');

A:=A+1;

If A<100 then goto M1

Else

M2:Write(A,' ');

A:=A-1;

If A>=1 then goto M2;

readLn;

End.

Рассмотрим последнюю задачу на эту тему: Для х=2700, 900, 300, 100 … и т.д. вычислять и печатать у=х/4+20 и z=2y+0.23 до тех пор, пока yz не станет меньше 1/х.



LABEL M1;

VAR X,Y,Z:REAL;

BEGIN

X:=2700;

M1:Y:=X/4+20;

Z:=2*Y+0.23;

WRITELN('X=',X:12:6,' Y=',Y:12:6,' Z=',Z:12:6);

X:=X/3;

IF Y*Z>1/X THEN GOTO M1;

READLN

END.
Но лучше метками и, соответственно, оператором Goto не пользоваться, так как они усложняют программу и противоречат принципам структурного программирования. Присутствие этого оператора в программе нарушает её целостность и наглядность. Такую программу трудно читать, редактировать и отлаживать. Турбо-Паскаль обладает средствами, позволяющими обходится без использования меток и оператора Goto.
3. 4 Оператор цикла Repeat…until.
Довольно часто при решении задач возникает необходимость выполнять одни и те же операции несколько раз. При реализации многократного повторения некоторых операций линейной конструкцией необходимо снова и снова повторять одни и те же операторы. Для более компактной реализации этих операций во всех языках программирования используются циклические конструкции, суть которых заключается в том, что вместо многократного переписывания одних и тех же строк программы управление в нужном месте передается предыдущим операторам с тем, чтобы они повторялись.

Оператор Repeatuntil (повторяй, пока не будет выполнено условие) имеет следующий формат записи:



Repeat


Операторы циклической



части.


Until <Условие>;
Схематически цикл с оператором Repeat изображается следующим образом.

На блок-схеме циклической конструкции (см. рисунрк) Р – это логическое выражение; Тело цикла – один или несколько операторов. Как видно из рисунка, особенностью цикла с оператором Until является то, что тело цикла выполняется всегда хотя бы один раз. Это происходит из-за того, что проверка условия происходит после выполнения тела цикла.

Оператор работает таким образом. Сначала программа выполняет операторы, стоящие после Repeat, пока не дойдет до слова Until, после чего проверяет истинность условия, стоящего после Until. Если условие не выполнено, то программа снова по очереди выполняет эти операторы и опять проверяет истинность условия и т. д. Если условие окажется выполненным (истинным), то работа оператора Until прекращается и программа переходит к выполнению следующего по порядку оператора.

Напечатать 10 раз слово computer.



Var i:Integer;

Begin

i:=1;

Repeat

WriteLn('Computer');

i:=i+1;

Until i>10;

ReadLn;

End.
Вычислить значение функции y=x2 при х=8, 6, 4, 2.

Var x,y:Integer;

Begin

x:=8;

Repeat

Y:=x*x;

WriteLn(x:3,y:3);

x:=x-2;

Until x=0;

WriteLn(‘End!’);

ReadLn;

End.

Вычислить сумму всех нечетных чисел в интервале [1; n].


Вывести на экран последовательность 1 2 3 …100.


Var i, n, s: Integer;

Begin

WriteLn(‘n-?’);

Readln (n);

i := 1; s := 0;

Repeat

If i mod 2<>0 then

s := s+i;

i:=i+1;

Until (i >n);

Writeln (‘summa:’s);

End.


VAR A:INTEGER;

BEGIN

A:=1;

REPEAT

WRITE(A,' ');

A:=A+1;

UNTIL A>100;

READLN ;

END.

Приведем еще несколько примеров на применение циклического оператора Until.



Для х=2700 900 300 и т.д. вычислить и напечатать y=x/4+20 и z=2y+0.23 до тех пор, пока yz не станет меньше 1/x.


Вариант 1
VAR X:REAL;

BEGIN

X:=1200;

REPEAT

WRITELN(X/4+20:8:6,2*(X/4+20)+0.23);

X:=X/3

UNTIL (X/4+20)*(2*(X/4+20)+0.23)<1/X;

READLN

END.


Вариант 2
VAR X,Y,Z:real;

BEGIN

X:=1200;

REPEAT

X:=X/3;

Y:=X/4+20;

Z:=2*Y+0.23;

WRITELN('X=',X:6:3,' Y=',Y:8:6,' Z=',Z:8:6);

UNTIL Y*Z<1/X;

READLN

END.

Найти сумму всех целых чисел в диапазоне от 0 до 100, делящихся на 7.



Var a,s:Integer;

Begin

a:=0;s:=0;

Repeat

If a mod 7=0 then

s:=s+a;

a:=a+1;

Until a>100;

ReadLn;

End.

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



Найти сумму чисел 1+1/2+1/3+…1/50.

Найти сумму целых чисел от M до N.

VAR N:INTEGER;

S:REAL;

BEGIN

S:=0; N:=1;

REPEAT

S:=S+1/N;

N:=N+1

UNTIL N>51;

WRITELN('S=',S:6:4);

READLN;

END.

{Результат=4.992}



VAR S,M,N:INTEGER;

BEGIN

WRITELN('ENTER M AND N:');

READLN(M,N);

S:=0;

REPEAT

S:=S+M;

M:=M+1

UNTIL M>N;

WRITELN('S=',S);

READLN

END.





Вычислить значение бесконечной суммы 1+1/22+1/32+... (стремится к 2/6 1,644934.


VAR I,N:INTEGER; {I-переменная цикла, N-число членов ряда}

S:REAL; {Сумма}

BEGIN

WRITELN('N-?');



READLN(N);

I:=1;S:=0;

REPEAT

S:=S+1/(I*I);



I:=I+1

UNTIL I>N;

WRITELN('S=',6*S:8:8);

READLN


END.



С точностью 0,0001 вычислить бесконечную сумму 1/(1*2)+1/(2*3)+1/(3*4)... Предел=1.

VAR I:LongInt; {Переменная цикла имеет формат LongInt ,

S:Real; т. к. произведение (I*(I+1) при заданной

BEGIN точности вычислений значительно

I:=1; превосходит формат Integer}

S:=0;

REPEAT

S:=S+1/(I*(I+1));

I:=I+1;

UNTIL (1-S)<0.0001;

WRITELN('S=',S:10:7);

READLN

END.
Написать программу для нахождения суммы n членов ряда 1/(1*2)+1/(2*3)+1/(3*4)+...

Var I,N:LongInt;

S:Real;

Begin

WriteLn('N-?');

ReadLn(N);

S:=0; I:=1;

Repeat

S:=S+1/(I*(I+1));

I:=I+1;

Until I>N;

WriteLn('S=',S:10:8);

Readln;



Даны числа a и b (a>b; a>1). Получить все члены последовательности a, a2 , a3 … , меньшие b.

VAR A,B,C:REAL;

BEGIN

WRITELN('VVEDI A AND B, A<

READLN(A,B);

C:=A;


REPEAT

WRITELN(C:8:6);

C:=C*A

UNTIL C>B;

READLN

END.





Даны числа a и b (a>b; a>1). Получить первый элемент последовательности a, a2 , a3 …,больший числа b.

VAR A,B,C:REAL;

BEGIN

WRITELN('VVEDI A AND B, A<

READLN(A,B);

C:=A;


REPEAT

C:=C*A

UNTIL C>B;

WRITELN(C:8:6);

READLN

END.

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


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

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


VAR A,B,C:INTEGER; {A и B – вводимые числа, С – счетчик положительных чисел}

BEGIN

C:=0;

REPEAT

WRITELN('ENTER A AND B');

READLN(A,B);

IF A+B=13 THEN

C:=C+1

UNTIL (A=0) AND (B=0);

WRITELN(C);

READLN

END.

В компьютер вводится N чисел. Посчитать и напечатать количество положительных, отрицательных чисел и чисел, больших 10.


V
{I – переменная цикла, N – количество чисел, X – очередное вводимое число.

Здесь мы организуем одновременно три счетчика: PL, MI – для подсчета положительных и отрицательных чисел, С – для чисел, больших 10 }


AR I,X, PL,MI,C,N:INTEGER;


BEGIN

WRITE('N= ');

READLN(N);

I:=0;PL:=0;MI:=0;C:=0;

REPEAT

WriteLn(‘x-?’);

READLN(X);

IF X>0 THEN

PL:=PL+1;

IF X<0 THEN

MI:=MI+1;

IF X>10 THEN

C:=C+1

UNTIL C+PL+MI>N;

WRITELN('PL=',PL,' MI= ',MI,' C=',C);

READLN

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

В некоторой стране жили добрые слоники, каждый из них имел собственный домик. Неожиданно на них напали злые мамонты. Слоники решили оградить свои домики высокими заборами: каждый домик окружен забором, каждая группа домиков окружена забором, причем заборы не должны пересекаться. Все домики окружены общим забором (см. рисунок). Зная количество слоников найти минимальное число построенных заборов. Проверку выполнить для числа слоников 100, 5000 и 1000000. Результат представить в виде:

sloniki=3; zabori=5.






 





Program Sloniki;

Var s,z:LongInt;

ch:char;

Begin

Repeat

WriteLn('Number of slonik-?');

ReadLn(s);

z:=2*s-1;

WriteLn('Sloniki=',s,' ','zabori=',z);

WRITE('Continue? Yes? ');

READLN(CH);

UNTIL CH='q';

End.

C – количество слоников;

S – количество заборов;

Ch – символьная переменная для завершения работы программы.

Между числом слоников и числом заборов существует соотношение:

s=2c-1.

При нажатии клавиши ‘q’ программа завершает работу, при нажатии любой другой клавиши предлагается выполнить еще один расчет.



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

Написать программу для нахождения суммы n членов последовательности:


Мar m,n:LongInt;

s:real;


Begin

WriteLn('n-?');

ReadLn(n);

s:=0; m:=1;

Repeat

if m mod 2<>0 then



s:=s+1/(m*m)

else


s:=s-1/(m*m);

m:=m+1;


Until m>n;

WriteLn('s=',s:6:4);

ReadLn;

End.


3.5 Оператор цикла While … do

(оператор с предварительным условием).
Форма записи оператора:

While <логическое условие> do

Begin

Операторы циклической части;

End;

Вся конструкция переводится так: «Пока условие истинно, выполняй операторы». Работает оператор следующим образом. Сначала программа проверяет истинность условия, стоящего после While. Если условие истинно, то выполняются операторы, стоящие после Do. Затем снова проверяется истинность условия и в случае истинности снова выполняются операторы и т. д. Если условие ложно, то оператор While прекращает свою работу и программа переходит к выполнению следующего оператора. Рассмотрим ряд примеров.





Напечатать 12 раз слово Computer.

Var i:Integer;

Begin

I:=1;

While i<13 do

Begin

WriteLn(‘Computer’);

I:=i+1;

End;

ReadLn;

End.


Вывести на экран последовательность целых чисел от M до N.

Вывести на экран квадраты натуральных чисел от введенного числа до 1.

VAR I,M,N:INTEGER;

BEGIN


WRITELN('ENTER M AND N');

READLN(M,N);

I:=M;

WHILE I<=N DO



BEGIN

WRITE(I,' ');

I:=I+1

END;


WRITELN('END');

READLN


END.


Var N: Integer;

Begin


Write (‘Enter N’);

ReadLn (N);

While N > 0 do

Begin


WriteLn(N*N);

N = N – 1;

End;

ReadLn;


End.

Найти сумму чисел от 1 до N для произвольного N.

Вычислить сумму S=1+1/2+1/3+ …+1/50


VAR I,N,SUM:INTEGER;

BEGIN


WRITELN('ENTER N:');

READLN(N);

SUM:=0;I:=1;

WHILE I<=N DO

BEGIN

SUM:=SUM+I;



I:=I+1

END;


WRITELN('SUM=',S);

READLN;


END.


VAR N:INTEGER; S:REAL;

BEGIN

S:=0; N:=1;

WHILE N<=50 DO

BEGIN

S:=S+1/N;

N:=N+1

END;

WRITELN('S=',S:6:4);

READLN

END.




Возведение целого числа

в целую степень.
VAR A,N,S,I:INTEGER;

{VOZVEDENIE TSELOGO CHISLA V TSELIU STEPEN}

BEGIN

WRITELN('ENTER A AND N');



READLN(A,N);

S:=1;I:=1;

WHILE I<=N DO

BEGIN


S:=S*A;I:=I+1

END;


WRITELN('S=',S);

READLN


END.


Возведение произвольного числа

в целую степень.
VAR N,I:INTEGER;

A,S:REAL;

{VOZVEDENIE LUBOGO CHISLA V TSELIU STEPEN}

BEGIN


WRITELN('ENTER A AND N');

READLN(A,N);

S:=1;I:=1;

WHILE I<=N DO

BEGIN

S:=S*A;I:=I+1



END;

WRITELN('S=',S:6:4);

READLN

END.


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




PROGRAM VKLAD;

USES CRT;

VAR AMOUNT,INTEREST:REAL;

TIME:INTEGER;

CH:CHAR;

BEGIN


REPEAT

CLRSCR;


WRITELN('Vvedite summu');

READLN(AMOUNT);

WRITELN('Vvedite procent');

READLN(INTEREST);

INTEREST:=INTEREST/100;

WRITELN('Vvedite srok');

READLN(TIME);

WHILE TIME>0 DO

BEGIN

AMOUNT:=AMOUNT*(1+INTEREST);



TIME:=TIME-1

END;


WRITELN('Konechnaya summa=',AMOUNT:9:2);

WRITE('Continue? Yes? ');

READLN(CH);

UNTIL CH='q'

END.
Вычислить сумму всех нечетных чисел в интервале [1;2k+1]. К

Решение с использованием цикла с предусловием:

Program sum;

Var

n, s, a ,k: integer;



Begin

n: = 1; a: = 1; s: = 0;

WriteLn(‘r-?’);

Readln(k);

While (n <=k) do

Begin

a: = s+a;

a:= a+2;

n: = n+1;



End;

Writeln(s:5);

ReadLn;


End.

Отличия операторов Repeat и While.
Оператор FOR … DO

Для решения многих задач цикл нужно выполнять определенное, заранее известное число раз. В этом случае удобно использовать оператор FORDO. В Турбо-Паскале имеются два оператора для организации регулярного цикла: прямой и обратный. Прямой пересчет идет от известного меньшего числа до известного большего, на каждом шаге прибавляется единица (например, от 20 до 30: 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30).

Оператор прямого пересчета:

For i := n1 to n2 do

оператор;

Здесь i – параметр цикла (счетчик), эта переменная такого типа, значение которого известно точно, например, целочисленная. При прямом пересчете всегда меняется от меньшего значения к большему;

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

После заголовка (for i := nl to n2 do) оператора должен стоять один оператор, который повторяется циклически (тело цикла). Тело цикла может не содержать операторов (пустой цикл), а в общем случае содержит составной оператор (один и более операторов). При i = n1 цикл выполняется первый раз (если значение n1 не превышает n2). Затем берется следующее значение переменной i (для целочисленной переменной это i+1) и осуществляется проверка, не превысило ли полученное значение величину n2. Если i+1 <= n2, то оператор выполняется, если нет, то происходит выход из цикла и выполнение следующего по порядку оператора программы.

Оператор обратного пересчета:

For i := n2 downto n1 do (n2>n1)

оператор;

Рассмотрим ряд примеров на использование оператора FOR.

Напечатать 20 раз слово computer.

VAR I:INTEGER;

BEGIN

FOR I:=1 TO 20 DO



WRITELN(‘computer’);

READLN


END.


Напечатать все буквы латинского алфавита.
VAR SIM:CHAR;

{WRITE THE LATIN LETTRES}

BEGIN

WRITELN('LATIN LETTRES:');



FOR SIM:='A' TO 'Z' DO

WRITE(SIM,' ');

READLN

END.


{Самостоятельно – в обратном порядке}

Для К=1,2,3 и N=2,4,6,8 вычислить и вывести на экран значения Y=2K+N.
VAR N,K,Y:INTEGER; ?

BEGIN


FOR N:=1 TO 3 DO

BEGIN


K:=2;

WHILE K<=8 DO

BEGIN

Y:=2*K+N;



WRITELN(N:4,K:4,Y:4);

K:=K+2


END;

END;


READLN

END.



Напечатать : Прямой счет: -5,-4,-3,-2,-1,0,1,2,3,4,5 Обратный счет: 5,4,3,2,1,0,-1,-2,-3,-4,-5 Конец счета
VAR I:INTEGER;

BEGIN


WRITE('RIGHT COUNTER ');

FOR I:=-5 TO 5 DO

WRITE(I,' ');

WRITELN('INVERSE COUNTER ');

FOR I:=5 DOWNTO -5 DO

WRITELN(I,' ');

WRITELN('END OF COUNTER!');

READLN


END.


Программа счетчик.

В компьтер вводится N чисел. Посчитать и напечатать, сколько среди них положительных.
VAR I,C,N:INTEGER;

A:REAL;


BEGIN

WRITELN('N=');

READLN(N);

C:=0;


FOR I:=1 TO N DO

BEGIN


READLN(A);

IF A>0 THEN

C:=C+1

END;


WRITELN('POSITIV=',C);

READLN


END.


Программа сумматор.

В компьютер вводится N любых чисел. Вычислить и напечатать их сумму.
VAR I,N:INTEGER;

A,S:REAL;

{SUMMA N REAL TSISEL}

BEGIN


WRITELN('ENTER N=');

READLN(N);

S:=0;

FOR I:=1 TO N DO



BEGIN

WRITELN('ENTER A=');

READLN(A);

S:=S+A


END;

WRITELN('S=',S:6:4);


READLN

END.











Пусть надо вычислить аn. Для получения целой степени n числа его надо умножить само на себя n раз. Это произведение при выполнении программы будет храниться в ячейке с именем p. Каждый раз, при очередном выполнении цикла, из этой ячейки будет считываться предыдущий результат, домножаться на основание степени а и снова записываться в ячейку p. Этот оператор в теле цикла повторяется n раз и имеет вид:

p := p * a;

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

Вот эта программа:


Program St;

Var a, p: real;

i, n: integer;



Begin

Write (‘Enter a’);

Readln (a);

Write (‘Enter n’);

Readln (n);

p := 1;


For i := 1 to n do

p := p * a;



Write (‘p =’, p);

Readln;

End.

Задание 3.2.

1) Вычислить и напечатать на экране квадраты чисел 0, 0,1 0,2 … 1,000.

2) Вывести на экран все числа от 100 до 200, кроме тех, что делятся на 3.

3) Найти сумму квадратов целых чисел от М до N.

4) Вычислить сумму всех четных чисел в интервале [1; n].

5) Написать программу вычисления суммы квадратов нечетных чисел от 1 до n.

6) Написать программу для нахождения суммы n членов ряда 1/(1*3)+1/(2*4)+1/(3*5)+...

7) Написать программу для нахождения суммы n членов ряда 1/(x)+1/(2x)+1/(3x)+...

8) Написать программу для нахождения суммы n членов ряда 1+ 1/(2^3)+1/(3^3)+1/(4^3)+...

9) С клавиатуры вводятся пары целых чисел. Подсчитать, сколько среди них пар, в которых первое число больше второго. Подсчет завершить после ввода двух десяток.

10) С клавиатуры вводятся пары целых чисел. Подсчитать, сколько среди них пар, которые в сумме дают нечетное число Подсчет завершить после ввода двух пятерок.

11) В компьютер вводятся n любых чисел. Написать программу, которая подсчитывает, сколько среди них положительных и сколько, равных нулю. Подсчет завершить после ввода -1.

12) Найти сумму n членов последовательности





База данных защищена авторским правом ©bezogr.ru 2016
обратиться к администрации

    Главная страница