где р - метка, которой помечен некоторый иной оператор в программе (означает перейти). Предназначен для нарушения естественного порядка выполнения операторов. Например, goto 11 передаст управление оператору 11: writeln.
В качестве меток допускается использовать числа от 1 до 9999.
Метка объявляется, как правило, сразу до или после описания переменных. Например,
var n: integer;
label 1;
Пример программы№4
РАЗРАБОТАТЬ программу, использующую оператор перехода, условный оператор и генератор случайного числа для отгадывания случайного числа от 0 до 5 с выставлением оценки, зависящей от попытки отгадывания.
Var a,b,c: integer;
label 1,2;
Begin
c:=6;
Randomize;
a:=random(5);
1: writeln (‘Vvedite chislo ot 0 do 5’);
read(b);
c:=c-1;
If c<0 then goto 2
else if a<>b then goto 1
else writeln (‘Vasha ocenka za ugadivanie - ’,c);
2: end.
Пример программы№5
разработать программу, использующую оператор перехода и условный оператор для вычисления корней квадратного уравнения вида с определением знака дискриминанта .
Program Diskrim;
var a,b,c,D,x1,x2:real;
label 1,2;
begin
writeln;
writeln ( 'Vvedite a' );
read(a);
writeln ( 'Vvedite b' );
read (b);
writeln ( 'Vvedite c' );
read (c);
D:=sqr(b)-4*a*c;
If D<0 then goto 1 else
x1:=(-b+sqrt(D))/(2*a);
x1:=(-b-sqrt(D))/(2*a);
if D=0 then writeln('Odin koren x1=',x1)else
writeln('Dva kornya - x1=',x1,' x2=',x2);
goto 2;
1:writeln ( 'Korney net');
2:end.
Пример программы№6
Определить принадлежность некоторого действительного числа х одному из двух отрезков [а, b] или [c, d]. Если х принадлежит одному из этих отрезков, то переменной q присвоить значение True. в противном случае – False.
Program Primer 1;
Var a, b, c, d, x: real;
q: boolean;
Begin
write ('Введите x, a, b, c, d ==>');
readln (x, a, b, c, d);
q:=(a<=x)and(x<=b)or(c<=x)and(x<=d);
writeln ('Число принадлежит? ', q);
End.
Лабораторная работа №3ЦИКЛИЧЕСКИЕ АЛГОРИТМЫ
Цикл с условием - оператор WHILE
Оператор цикла WHILE, известный как оператор цикла с предусловием, имеет вид:
while <условие> do begin
{тело цикла}
end;
При выполнении этого оператора сначала вычисляется некоторое логическое выражение <условие>, в случае истинности которого выполняется оператор {тело цикла} (являющийся, как правило, составным оператором). После этого вычисление условия, его проверка и выполнение оператора повторяются до тех пор, пока выражение <условие> не будет истинным. Затем управление передается следующему (после WHILE) оператору в программе. Использованные здесь ключевые слова WHILE и DO имеют смысл пока и выполнять соответственно.
Пример№1Предположим, даны числа X и Y (больше нуля). Требуется получить все члены бесконечной последовательности X, X2, X3, …, которые меньше Y.
Program STEPEN;
Var x, y, z: real;
Begin
Writeln (‘Vvedite znacheniya X i Y’);
read (x,y);
z:=x;
while z<y do
begin
z:=z*x;
writeln (z);
end;
End.
Пример№2Cоставление таблицы функции y = a3/(a2+x2) для х, принадлежащих отрезку [-1; 1] с шагом 0.1. Так как параметр цикла типа for должен быть целочисленным, удобнее использовать цикл while, в котором значение x можно изменять при каждом шаге на х = 0.1.
program cycl_while;
uses crt; {вызов модуля Crt для управления режимом экрана}
var
a, x, y : real ; i : integer;
begin
clrscr ; {процедура очистки экрана из модуля Crt}
writeln('Введите а ' ); readln(a);
x:= -1.; writeln (' x ', ' y ');
while do x<1.05 begin
y:= sqr(a)*a/ (a*a+x*x);
writeln (x:6:2, y:8:4);
x:=x+0.1
end
end.
Оператор REPEAT
Оператор цикла REPEAT, известный как оператор цикла с постусловием, имеет вид:
repeat s until р;
При выполнении этого оператора сначала выполняется тело цикла (S), затем вычисляется некоторое логическое выражение Р (условие); в случае ложности которого вновь выполняется тело цикла. Затем выполнение тела цикла, вычисление условия Р и его проверка повторяются до тех пор, пока выражение Р не становится истинным. После этого управление передается следующему (за REPEAT) оператору в программе. Использованные здесь зарезервированные слова REPEAT и UNTIL имеют смысл повторять и пока не(до) соответственно.
Оператор цикла REPEAT отличается от оператора WHILE, во-первых, тем, что здесь условие проверяется после выполнения тела цикла. Иными словами, гарантируется хотя бы однократное его выполнение. Во-вторых, оператор REPEAT выполняется до тех пор, пока условие равно FALSE, и управление передается следующему (за REPEAT) оператору, когда условие становится равным TRUE (для оператора WHILE имеет место обратная зависимость).
Даже если условие Р равно TRUE с самого начала, тело цикла выполнится хотя бы раз. Если условие Р тождественно FALSE (repeat s until false), цикл будет бесконечным.
Для того чтобы понять разницу между операторами цикла WHILE и REPEAT, рассмотрим соответствующие фрагменты программ, вычисляющих степени числа 3 в диапазоне между 1 и 300.
Цикл WHILE
Цикл REPEAT
а:=1;
while a<300 do
begin
writein(a); а:=а*3
end;
а:=1;
repeat writein(a); а:=а*3
until a>=300
Прежде всего бросается в глаза, что условия повторения цикла для двух случаев противоположны. Это объясняется тем, что в операторе WHILE цикл выполняется, пока условие не примет значение FALSE, а в операторе REPEAT — пока условие не примет значение TRUE
Также следует обратить внимание, что тело цикла REPEAT не требуется заключать в операторные скобки BEGIN.. END. Если в операторе WHILE после ключевого слова DO выполняется единственный оператор (и если требуется циклически выполнять несколько действий, приходится несколько операторов объединять в составной оператор), то в операторе REPEAT между ключевыми словами REPEAT и UNTIL можно ввести любое количество операторов, без необходимости заключать их в операторные скобки.
Наконец, внимательный читатель может заметить, что в операторе REPEAT после последнего оператора в теле цикла нет точки с запятой. Это еще одна особенность оператора REPEAT — перед ключевым словом UNTIL точка с запятой необязательна.
Пример№3 Сгенерировать случайное число а от 0 до 10. Вывести на экран значение а. Если а>5, то рассчитать значение Xa с использованием оператора While … do …, если а<5, то рассчитать значение Yaс использованием оператора Repeat … until … . Величины X и Y вводить с клавиатуры.
var a,x,y,b,w,z:real;
begin
writeln ('Vvedite velichinu x');
read(x);
writeln ('Vvedite velichinu y');
read(y);
randomize;
a:=random(20);
b:=1;
z:=x;
w:=y;
writeln ('a ravno',a);
if a>10 then
begin while b<a do begin x:=z*x; b:=b+1 end; begin writeln('X v stepeni',a,'ravno',x); end; end
else
begin repeat begin y:=w*y; b:=b+1; end until b=a; writeln('Y v stepeni',a, 'ravno',y); end;
end.
Оператор FOR
Оператор цикла FOR, известный как оператор цикла с параметром, имеет вид:
for i=a to b do s;
При выполнении этого оператора сначала вычисляется некоторое начальное значение А, которое присваивается переменной I, называемой параметром цикла. Затем вычисляется конечное значение В и проверяется, имеет ли место равенство I=В. Если равенства нет, выполняется оператор S, который может быть составным, и переменная I увеличивается на единицу. После этого проверка (не равен ли параметр конечному значению), выполнение оператора S и увеличение переменной I на единицу выполняются циклически до тех пор, пока не наступает равенство I=В. Параметр цикла I, а также начальное и конечное значения (А и В) могут принадлежать любому порядковому типу (например, Integer или Char). (Но при этом все они должны быть одного типа.) Если начальное значение превышает или равно конечному значению с самого начала, оператор S не выполнится ни разу.
Использованные здесь зарезервированные слова FOR, TO и DO имеют смысл от, до и выполнять соответственно.
Оператор цикла FOR имеет такие особенности:
• в теле цикла запрещается явно изменять значение параметра цикла (с помощью оператора присваивания, например);
• по завершении работы оператора цикла FOR, значение параметра
(I) считается неопределенным. Возможна и другая форма оператора цикла с параметром:
for i=a downto b do s;
Здесь, чтобы выполнялся оператор S, начальное значение А должно превышать конечное значение В. Кроме того, в этом случае параметр I с каждым циклом уменьшается на единицу, пока не становится равным конечному значению В.
Оператор цикла с параметром следует использовать тогда, когда заранее точно известно, сколько раз должно быть выполнено тело цикла.
Вот примеры оператора цикла с параметром:
for i:=l to 5 do x:=sqr(x);
for i:=z downto a do write (i);
В первом примере значение переменной Х возводится в квадрат, затем полученная величина присваивается переменной Х— и так пять раз.
Во втором примере оператор цикла с параметром использован для вывода букв латинского алфавита в обратном порядке (с z по а). Дело в том, что тип Char является порядковым, причем буквы начала алфавита (как значения типа Char) считаются меньше букв, взятых в конце алфавита. Не будет, например, ошибочным неравенство А<В
Для того чтобы понять разницу между операторами цикла WHILE и FOR, рассмотрим соответствующие фрагменты программ, выводящие на экран пустые строки.
Цикл WHILE
Цикл FOR
line:=l
while line<n do
begin
writeln; line:=line+1
end;
for line=l to n
do writeln
Если переменная Line объявлена (в разделе описания переменных) как принадлежащая типу Integer, оператор FOR выведет на экран N пустых строк. Реализация задачи с помощью оператора FOR выглядит проще, поскольку здесь нет нужды в операторах присваивания line:=l и line:= line+1.
Пример№4: Вывести на экран 20 строк с символами ********************
var a,n,i: integer;
begin
i:=1;
n:=20;
for a:=i to n
do writeln('*********************************************');
end.
Пример№5:
Ввести с клавиатуры число от 2 до 10 и выдать ответ в виде степени введенного числа от 2 до 10. Например:
«2.00 в степени 2 равно 4.00
2.00 в степени 3 равно 8.00
……………………………..
2.00 в степени 10 равно 1024».
Пример данной программы.
var a,b,c:real;
i:integer;
begin
read (b);
c:=b;
for i:=1 to 9 do
begin
c:=b*c; write (b, ' v stepeni ', i+1, ' ravno');
writeln (c); end;
end.
Пример№6
Составить программу, печатающую таблицу значений функции у=sqrt(x) на отрезке [0,9] с шагом 1.
program t;
var x: integer;
begin
write('x', ' ':4);
for x := 0 to 9 do write(x:6);
writeln;
for x := 1 to 68 do write('–');
writeln;
write('sqrt(x)', ' ');
for x := 0 to 9 do
writ Лабораторная работа №4ПОСЛЕДОВАТЕЛЬНОСТИ
Пример№1: Предположим, даны числа X и Y (больше нуля). Требуется получить все члены бесконечной последовательности X, X2, X3, …, которые меньше Y.
Program STEPEN;
Var x, y, z: real;
Begin
Writeln (‘Vvedite znacheniya X i Y’);
read (x,y);
z:=x;
while z<y do
begin
z:=z*x;
writeln (z);
end;
End.
Пример№2:
Пример№3
Пример цикла типа repeat ... until.Определить число n, при котором сумма квадратов натурального ряда чисел от 1 до n не превысит величину K, введенную с клавиатуры. Т.е.,
, где .
program sum_sq; {Сумма квадратов натурального ряда } uses crt; var k, s, n : integer; begin clrscr ; writeln( 'Введите K' ); readln (k); s:=0; n:=1; repeat s :=s+n*n; n := n+1; until s > k; writeln ('N= ', n : 3, ' s= ' , s : 5 ); end.
Пример№4
Вычислить первые 20 членов последовательности чесел Фибоначчи: u1=1; u2=2; u(n)=u(n-1)+u(n-2), а также значение золотого сечения V(n)=u(n)/u(n-1)
const nmax = 20; var i:integer; u1,u2,u3:integer; v:real; beginu1:=1;u2:=2;v:=u2/u1;writeln('u(1) = ',u1);writeln('u(2) = ',u2,' v(2) = ',v:2:2);for i:=3 to nmax do begin u2:=u2+u1; u1:=u2-u1; v:=u2/u1; writeln('u(',i,') = ',u2,' v(',i,') = ',v:2:2);end;readln;end. Пример№5 const nmax = 20; {Число Фибоначчи по заданному n}function fib(n:integer):integer;beginif (n=1) then begin fib:=1;exit;end;if (n=2) then begin fib:=2;exit;end;fib:=fib(n-1)+fib(n-2);end; {Значение золотого сечения по заданному n}function sech(n:integer):real;beginsech:=fib(n)/fib(n-1);end; var i:integer; beginwriteln('u(1) = ',fib(1));for i:=2 to nmax do writeln('u(',i,') = ',fib(i),' v(',i,') = ',sech(i):2:2);readln;end.
Пример№6
С клавиатуры вводятся целые положительные числа п, р и а. Составить программу для вычисления заданного количества членов последовательностей п, а, n!. Вывести на экран полученные значения.
Решение. Будем использовать переменную power (степень) для вычисления степенной функции п ; переменную exponent (показатель) для вычисления показательной функции а и переменную factor (множитель) для вычисления факториала п!. Программы состоят из: • Блока описаний, где указываются используемые модули, используемые переменные и их типы; • Тела программы, включающего; — очистку экрана; — ввод данных с клавиатуры; — вычисление элементов последовательности посредством рекуррентных соотношений, стартовые значения переменных таковы: power = 1, exponent = 1, factor = 1, формулы для общего члена poweri = poweri-11 • п, exponenti = exponenti-11• n, factori = factori-11 • i; — вывод результатов на экран. В программах переменные п, р и а — целого типа integer (для неотрицательных целых чисел диапазон их изменения от 0 до 32 767); переменные power, exponent, factor — действительные числа с по крайней мере 6—7 верными знаками после запятой (для положительных чисел в допустимом для типа диапазоне, например от 1,4 • (10-45) до 3,4 • (1038) ). Используемые типы данных имеют названия single, real, float в языках Бейсик, Паскаль, Си соответственно. При выходе какой-либо переменной за пределы диапазона объявленного типа появляется сообщение об ошибке переполнения (overflow). Форматированный вывод результатов работы программ на всех языках программирования одинаков для примера, где п= 10, р=3, а= 3. Имеем: n = lO = 1000, а = 3^10 = 59 049, n! == 10! = 3 628 800.
{Блок описаний} uses crt; var a, i, n, p : integer; power, exponent, factor: real; {Тело программы} begin {очистка экрана, ввод данных с клавиатуры} clrscr; write ( 'Введите число n = ' ); readln(n); write ( 'Введите степень р = ' ); readln(р); write ( 'Введите основание показательной функции а = ' ); readln (а); {вычисление элементов последовательности посредством рекуррентных соотношений} power := 1; exponent := 1; factor ;= 1; for i := 1 to p do power := power * n; for i := 1 to n do begin exponent := exponent * a; factor := factor * i end; {вывод результатов на экран} writeln ( 'power= ', power:1:1, 'exponent= ',exponent: 1:1, 'factor=', factor:1:1 ); readln end.
Пример№7Составить программу вычисления n!.
Вариант 1
program fact1;
var n, i, p: integer;
begin
write('n='); readln(n);
p: = 1 ;
for i: = 1 to n do p := p∗i;
write('n! =', p)
end.
Вариант 2
program fact2;
var n, i, p: integer;
begin
write('n='); readln(n);
p =: 1;
i := 0;
while i < n do
begin
i := i + 1; p := p∗i
end;
write('n!=', p)
end.
Вариант 3
program fact3;
var n, i, p: integer;
begin
write('n='); readln(n);
p := 1 ;
i := 0;
repeat
i := i + 1; p := p∗i
until 1 >= n;
write('n!=', p)
end.
Пример№8
Не используя стандартные функции (за исключением abs), вычислить с точностью до 0.0001 функцию y=f(x). Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше 0.0001, все последующие слагаемые можно уже не учитывать. Привести и значение функции у, найденное с помощью стандартных функций.