Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pasca1_09.DOC
Скачиваний:
4
Добавлен:
06.05.2019
Размер:
1.44 Mб
Скачать

4.7Оператор безусловного перехода

Он имеет вид goto <метка>;

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

program rrr;

label 5;

var a,b:real;

BEGIN

5: raedln(a);

if a<0 then goto 5 ;

b:=a*a;

writeln(b)

END

4.8Операторы цикла(повторения)

В языке Паскаль существуют 3 оператора цикла.

1) Оператор цикла с параметром используется для организации цикла с известным числом повторений цикла (оператор для).

for <имя переменной>:= выражение1 to выражение2 do оператор;

или несколько операторов в цикле

for с:= А to В do оператор(серия команд);

Рис1.

Отметим, что в цикле «for» переменная цикла С увеличивается всегда на 1 сама и автоматически от значения С=А до С=В.

Замечание.

1. Внутри цикла нельзя изменять значения А,В і пераменную цыкла С.

2. В операторе for не допускается ихменение переменной цикла на величину, которая не равна 1.

for <имя переменной>:= выражение1 to выражение2 do

begin

оператор1;

оператор2;

end;

Например, (здесь значение переменной увеличивается на единицу 4 раза).

s:=0;

for i:=1 to 4 do s:=s+1; {счет от 1 до 4)

Переменная цикла должна быть только целого типа. Это оператор в модификации «Вниз к» имеет вид:

for i:=a1 downto a2 do оператор;

s:=0; for i:=4 downto 1 do s:=s+1; {счет от 1 до 4)

В этом случае при каждом новом выполнении оператора значение переменной цикла i уменьшается на 1.

Досрочный выход из цикла может быть осуществлен с помощью команды break(только из цикла) exit (выход из программы).

Пример. Дано натуральное число n. Найти наименьший простой сомножитель.

program somn;

var i,n:integer;

BEGIN

write ('введите число '); readln (n);

for i:=2 to n do begin

if n mod i = 0 then begin

write('наименьший сомножитель',i);

exit; end;

end;

END.

Пример 2. Вычислить сумму натуральных чисел от 1 до 100.

;

1-й шаг: ;

2-й шаг: S:=S+2;

3-й шаг: S:=1+2+3=6 — S:=S+3;

4-й шаг: S:=S+4;

…………………..

100-й шаг: S:=S+100.

Итак, получим общую формулу суммы S:=S+n (начало с 0), где и это целое число.

program sum;

const p=100;

var n:integer; s:real;

BEGIN

S:=0;

for n:=1 to p dо S:=S+n;

writeln(‘s=’, s:7:2);

END.

Пример 2. Вычислить 10!. См. блок-схему Рис.1.

program sum;

const p=10;

var n:integer; F:real;

BEGIN

F:=1;

for n:=1 to p dо F:=F*n;

writeln(‘F=’, F:7:2);

END.

формула произведения ф:=ф*n (начало с 1)

Прыклад 2. Составим программу вычисления значения выражения:

.

program sum1;

const р=10;

var n:integer; s,f,f1,f2,t:real;

BEGIN

s:=0; f:=1; f2:=1

for n:=1 to p do

begin

f:=f*n; f1:=f*(n+1)*(n+2); f2:=f2*(2*n-1)*(2*n);

t:=(sin(f)+ехр(1/n))/(cos(f1)+f2);

s:=s+t;

end;

wrinteln(‘s= ‘,s:8:3);

END.

Общая формула суммы S:=S+t (начало с 0), где t –слагаемое, формула которого определяется программистом

Общая формула произведения F:=F*p (начало с 1), где p –множитель, формула которого определяется программистом

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

Пример. .

0

1

1

1

1

2

1+2=3

1

3

3+3=6

2

1

6+2=8

2

2

8+4=12

2

3

12+6=18

3

1

18+3=21

3

2

21+6=27

3

3

27+9=36

4

1

36+4=40

4

2

40+8=48

4

3

48+12=60

5

1

60+5=65

5

2

65+10=75

5

3

75+15=90

s:=0;

for а:= 1 to 5 do

for p:=1 to 3 do

с:=с+а*р;

Рассмотрим пример работы операторов цикла и опрераторов модуля сrt.

Пример. Вывод по диагонали 15 слов информатика

for i:=1 to 15 do

begin gotoxy(i,i); writeln('информатика');

end;

program aa;

uses crt;

var i:byte;

BEGIN

clrscr; write('informatita');

repeat

for i:=2 to 22 do

begin

insline; delay(90);

end;

gotoxy(1,1);

for i:=2 to 22 do

begin

delline; delay(90);

end;

delay(100);

until keypressed;

END.

2) Оператор цикла с предусловием (цикл пока). Этот оператор имеет вид:

while условие

do оператор;.

Рис 2. Рис.3.

while и do – служебные слова, условие – логическое (булево) выражение. Выполняется следующим образом: сначала вычисляется значение булева выражения. Если это значение истинно (true), то выполняется оператор, следующий за служебным словом do (операторы могут быть заключены в операторные скобки begin...end), и снова происходит возврат к вычислению значения булева выражения. Так повторяется, пока значение булева выражения не станет ложным (false). Выполнение оператора, следующего за словом do, прекращается, поэтому такой оператор называется оператором с предусловием. Это означает также, что оператор, следующий за служебным словом do, может быть и не выполнен ни разу, если при первом же вычислении значение булева выражения будет ложным.

На рис 3. Показано, как можно заменить цикл for циклом while, обратное можно сделать не всегда.

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

3) Оператор цикла с постусловием.

repeat

оператор

until условие;

Этот оператор выполняется следующим образом: сначала выполняется оператор, следующий за служебным словом repeat, затем вычисляется значение булева выражения, образующего условие. Если значение булевого выражения ложно, то происходит возврат к выполнению оператора, следующего за служебным словом repeat, и снова вычисляется булево выражение. Так повторяется, пока значение булева выражения остается ложным. Как только оно станет истинным, выполнение оператора цикла прекращается. В отличие от оператора while...do оператор, следующий за служебным словом repeat будет обязательно выполнен хотя бы один раз независимо от значения булева выражения.

repeat

read (b); if b<>0 then m:=m+b;

until b=0;.

Eсли в операторе while...do используется составной оператор, то он записывается с использованием служебных слов begin и end.

Вычисления значения функцуии на отрезке от –10 до 0 с шагом 2.

x:=-10

while x<=0 do { после do точка с запятой не ставится}

begin

y:=sqr(x);

writeln(‘x= ‘,x:7:2,’ y=’,y:7:2);

x:=x+2;

end;

Если такой же составной оператор используется в операторе repeat, то в его записи служебные слова begin и end могут быть опущены.

x:=-10;

repeat

y:=sqr(x);

writeln(‘x= ‘,x:7:2,’ y=’,y:7:2);

x:=x+2;

until x>0;.

Чтобы операторы цикла while и repeat выполнялись конечное число раз и не произошло зацикливания при построении цикла, необходимо предусмотреть, чтобы среди выполняемых операторов обязательно был оператор, выполнение которого влияло бы на значение булева выражения. В этих примерах это оператор x:=x+2.

Для досрочного выхода из цикла, определяемого одним из операторов while, repeat могут быть использованы операторы break или exit.

Пример. Сумма цифр двузначного числа равна 6. Если к этому числу прибавить 18, то получиться число, записанно теми же цифрами, но в обратном порядке. Найдем это двузначное число:

program sls;

var a,b,n:integer;

BEGIN

writeln('вариант 1');

for a:=1 to 6 do

for b:=0 to 5 do

if (a+b=6) and (a*10+b+18=b*10+a) then n:=a*10+b;

writeln(n);

writeln('вариант 2');

a:=1;

while a<=6 do

begin

b:=0;

while b<=5 do begin

if (a+b=6) and (a*10+b+18=b*10+a) then n:=a*10+b;

b:=b+1

end;

a:=a+1

end;

writeln(n);

writeln('вариант 3');

a:=1;

repeat

b:=0;

repeat

if (a+b=6) and (a*10+b+18=b*10+a) then n:=a*10+b;

b:=b+1

until b>5;

a:=a+1

until a>6;

writeln(n)

END.

Пример. Составим программу проверки знаний таблицы умножения:

program tablica;

uses crt;

const k=10; var a,b,c,d,i:integer;

BEGIN

randomize; clrscr;

for i:=1 to k do

begin

a:=random(8)+2; b:=random(8)+2;

c:=a*b;

writeln('Чему равно ', a, '*', b, ' ? ');

write('Введите ответ '); readln(d);

if c=d then writeln ('Правильно')

else writeln('Ошибка');

writeln;

end;END.

program zadacha;

const t1=0.6931478; h=0.001;

var t, s: real; c,n: integer;

BEGIN

s:=1; n:=1; t:=1; c:=1;

while abs( s – t1 )> h do

begin

n:=n+1;

c:=-c;

t:=c*1/n;

s:=s+t;

end;

writeln(' Точное t= ', t1:10:7);

writeln('Приближенное s= ', s:10:7);

END.

Задание. С помощью цикла repeatuntil (цикла с постусловием) вычислить значение функции z=x2+y2, где x=x0(hx)xn, y=y0(hy)yn.

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

program zzz1;

var x,x0,hx,xn,y,y0,hy,yn,z:real;

BEGIN

writeln('vvedite x0 hx xn');

readln(x0, hx, xn);

writeln('vvedite y0 hy yn');

readln(y0, hy, yn);

x:=x0;

repeat

y:=y0;

repeat

z:=x*x+y*y;

writeln('x=',x:7:4, ' y=',y:7:4,' z=',z:7:4);

y:=y+hy;

until y>yn;

x:=x+hx;

until x>xn;

END.

Задание. Для каждого заданного x=x0(hx)xn вычислить

program zzz2;

var x,x0,hx,xn,t,s:real; k,n:integer;

BEGIN

writeln('vvedite x0 hx xn');

readln(x0,hx,xn);

x:=x0;

repeat

s:=0;

for k:=1 to 10 do

for n:=1 to 5 do

begin

t:=(k+n)/2*x;

s:=s+t;

end;

writeln('x=',x:7:4,' s=',s:7:4);

x:=x+hx;

until x>xn;

readln;

END.

Задание. Для каждого заданного x=x0(hx)xn вычислить

program zzz2;

var x,x0,hx,xn,p,t,s,y:real; k,n:integer;

BEGIN

writeln('vvedite x0 hx xn');

readln(x0,hx,xn);

x:=x0;

repeat

if x<1 then

begin

s:=0;

for k:=1 to 10 do

begin

t:=2*k-x;

s:=s+t;

end;

y:=s;

end

else

begin

p:=1;

for n:=1 to 7 do

begin

t:=(n+x)/2;

p:=p*t;

end;

y:=p;

end;

writeln('x=',x:7:4,' y=',y:7:4);

x:=x+hx;

until x>xn;

readln;

END.

Задание. Для каждого заданного x=x0(hx)xn, , y=y0(hy)yn вычислить

program zzz2;

var x,x0,hx,xn,y,y0,hy,yn,p,t,s,z:real; k,n:integer;

BEGIN

writeln('vvedite x0 hx xn');

readln(x0,hx,xn);

writeln('vvedite y0 hy yn');

readln(y0,hy,yn);

x:=x0;

repeat

y:=y0;

repeat

if x*y<1 then

begin

s:=0;

for k:=1 to 10 do

begin

t:=2*k-x+y;

s:=s+t;

end;

z:=s;

end

else

begin

p:=1;

for n:=1 to 7 do

begin

t:=(n+x)/(2*y);

p:=p*t;

end;

z:=p;

end;

writeln('x=',x:7:4,' y=',y:7:4,' z=',z:7:4);

y:=y+hy;

until y>yn;

x:=x+hx;

until x>xn;

readln;

END.

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

Рассмотрим реализацию этого алгоритма для чисел А=8, В=12:

1 шаг: сравниваем числа А и В, если они не равны, то из большего вычитаем меньше

После этого шага А=8, В=4

2 шаг: сравниваем числа А и В, если они не равны, то из большего вычитаем меньше

После этого шага А=4 В=4

Так как числа А и В оказались равны, то алгоритм выполнен:

НОД(8,12)=4

Рассмотрим еще одну реализацию этого алгоритма для чисел А=5, В=7:

А В

5 7

5 2

3 2

  1. 2

  1. 1

Таким образом, НОД(5,7)=1. Такие числа называются взаимно-простые.

program nod;

var a,b,m,n,f:integer;

BEGIN

writeln('vvedite a b '); readln(a,b);

m:=a; n:=b;

while m<>n do

if m>n then m:=m-n

else n:=n-m;

f:=m;

writeln('HOD(' , a, ' ,' , b, ')=' ,f);

readln;

END.

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

Приведем формулы, с использованием НОД для решения задач.

НОК(А,В)=(А*В)/НОД(А,В) - наименьшее общее кратное

НОД(А,В,С)=НОД(А,НОД(В,С))

НОК(А,В,С)=НОК(А,НОК(В,С))

Задание. Определим количество четных цифр в записи даного натурального числа и его првую цифру.

program cifr;

var c,k:integer;n:longint;

BEGIN

write(‘введите натуральное число’);readln(n);

k:=0;

while n<>0 do

begin

c:=n mod 10;

if c mod 2=0 then k:=k+1;

n:=n div 10;

end;

writeln(‘k=’,k,’ c=’,c);

END.

Таблица выполнения программы для числа 3471263

  • n

  • исходное

  • число

  • с

  • цифры

  • числа

  • k

  • счетчик

  • четных цифр

  • 5471263

  • 0

  • начало цикла

  • 547126

  • 3

  • 0

  • 54712

  • 6

  • 1

  • 5471

  • 2

  • 2

  • 547

  • 1

  • 2

  • 54

  • 7

  • 2

  • 5

  • 4

  • 3

  • 0

  • 5

  • 3

  • Ответ: четных цифр в числе -3, первая цифра числа – 5.

  • При таком решении задачи мы ограничены тем, что максимально допустимое для ввода число 2147483647. Рассмотрим второй вариант решения этой задачи:

program cifr;

var n,c:real;k:integer;

BEGIN

write(‘введите натуральное число');readln(n);

k:=0;

while n<>0 do

begin

c:=round(frac(n/10)*10);

if frac(c/2)=0 then k:=k+1;

n:=int(n/10);

k:=k+1;

end;

writeln('k=',k,' c=',c:5:0);

END.

Общее количество цифр в записи натурального числа можно сразу посчитать по формуле .

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]