Цикл с предусловием: Программа вычисления наибольшего общего делителя
Программа вычисляет наибольший общий делитель двух натуральных чисел. В программе использован алгоритм Эвклида, блок-схема которого приведена ранее.
program ex02_04;
{ программа вычисляет наибольший общий делитель}
{ двух натуральных чисел }
var
a, b: integer;
begin
write('a = '); readln(a);
write('b = '); readln(b);
while a <> b do
if a > b then a := a - b else b := b - a;
writeln('NOD = ', a);
end.
Результат работы программы:
a = 125
b = 75
NOD = 25
Цикл с постусловием: программа определяет, является ли число простым
В программе последовательно находится остаток от деления заданного числа последовательно на 2,затем на 3 и так далее. Если остаток от деления не равен нулю, делитель увеличивается на единицу. Если остаток от деления окажется равным нулю, выполнение цикла прекращается. Если к тому же делитель будет равен самому числу (то есть число разделилось без остатка только на себя), то число простое.
Program ex02_05;
{программа определяет, является ли введенное число простым}
Var
n, d, r: Integer; { число, делитель, остаток }
begin
writeln('введите целое число -> ');
readln(n);
d:=2; {сначала делим на 2}
repeat
r:= n mod d;
if r<>0 Then d:=d+1;
until r=0;
if d=n Then writeln(n, '- простое число')
else writeln(n, '- не простое число');
readln;
end.
Результат работы программы:
введите целое число -> 16769023
16769023- простое число
Рекомендуется самостоятельно нарисовать блок-схему алгоритма.
Цикл в постусловием: наименьшее положительное из введенных чисел
Создать программу, которая вычисляет наименьшее из вводимых положительных действительных чисел. Окончание ввода - любое отрицательное число.
program ex02_06;
{ создать программу, которая вычисляет наименьшее из }
{ вводимых положительных действительных чисел. }
{ Окончание ввода - любое отрицательное число }
var
min, x: real;
n: integer;
begin
min:=1.0e6;
repeat
writeln('введите число: '); readln(x);
if (x>=0) and (min>x) then min:=x;
until x<0;
writeln('наименьшее число: ',min:10:3);
readln;
end.
Цикл со счетчиком (с параметром): пример вывода таблицы значений
Для температур по шкале Фаренгейта от F0 до F1 вывести значения температуры по шкале Цельсия:
Обратите внимание: в приведенном ниже варианте программы значения F0 и F1 входят как параметры цикла. Однако согласно стандарту языка параметры цикла for должны целочисленного или порядкового типа. Поэтому приведенный вариант программы пригоден только для целочисленных значений температуры.
program ex02_07;
var
F, f0, f1: integer;
C: real;
begin
writeln('введите начальное значение F:');
readln(f0);
writeln('введите конечное F:');
readln(f1);
for f:=f0 to f1 do begin
c:=5*(f-32)/9;
writeln('F = ',f,' C = ',c:6:2);
end;
readln;
end.
Предлагаем самостоятельно написать программу, в которой начальное и конечное значение температуры, а также шаг изменения были вещественными числами. При этом рекомендуется использовать цикл с пост- или предусловием.
Вывод кодов латинских и русских букв
Вывести латинские и русские буквы в кодовой странице 866.
В программе параметр цикла ch последовательно изменяется от 'A' до 'Z', то есть является не числом, а символом. Аналогично выполняются остальные циклы.
program ex02_08;
var
ch:char;
code: integer;
begin
writeln('Латинский алфавит');
for ch:='A' to 'Z' do write(ch,':',ord(ch):3,' ');
writeln;
for ch:='a' to 'z' do write(ch,':',ord(ch):3,' ');
writeln;
writeln('Кириллица');
for ch:='А' to 'Я' do write(ch,':',ord(ch):3,' ');
writeln;
for ch:='а' to 'п' do write(ch,':',ord(ch):3,' ');
writeln;
for ch:='р' to 'я' do write(ch,':',ord(ch):3,' ');
writeln;
readln;
end.
Результат работы программы:
Латинский алфавит
A: 65 B: 66 C: 67 D: 68 E: 69 F: 70 G: 71 H: 72
I: 73 J: 74 K: 75 L: 76 M: 77 N: 78 O: 79 P: 80
Q: 81 R: 82 S: 83 T: 84 U: 85 V: 86 W: 87 X: 88
Y: 89 Z: 90
a: 97 b: 98 c: 99 d:100 e:101 f:102 g:103 h:104 i:105 j:106 k:107 l:108 m:109 n:110 o:111 p:112 q:113 r:114 s:115 t:116 u:117 v:118 w:119 x:120 y:121 z:122
Кириллица
А:128 Б:129 В:130 Г:131 Д:132 Е:133 Ж:134 З:135 И:136 Й:137 К:138 Л:139 М:140 Н:141 О:142 П:143 Р:144 С:145 Т:146 У:147 Ф:148 Х:149 Ц:150 Ч:151 Ш:152 Щ:153 Ъ:154 Ы:155 Ь:156 Э:157 Ю:158 Я:159
а:160 б:161 в:162 г:163 д:164 е:165 ж:166 з:167 и:168 й:169 к:170 л:171 м:172 н:173 о:174 п:175
р:224 с:225 т:226 у:227 ф:228 х:229 ц:230 ч:231 ш:232 щ:233 ъ:234 ы:235 ь:236 э:237 ю:238 я:239
Пример использования процедуры break для прерывания выполнения цикла
Вычислить сумму положительных значений синуса.
Так как для отрицательных значений аргумента суммирование не требуется, то в этом случае тело цикла дальше не выполняется и происходит переход к следующей итерации.
program ex02_09;
var
i: integer; s: real;
BEGIN
s:=0;
FOR i:=1 to 20 do BEGIN
{ Если sin(i)<0 - дальше не выполнять, вернуться к for }
IF sin(i)<0 then break;
s:=s + sin(i);
writeln('sin(',i,')= ', sin(i):12:9);
END;
writeln('Сумма равна: ', s);
readln;
END.
Цикл с параметром: пример вычисления суммы ряда
Вычислить сумму S= 1 + 1/3 + 1/5 + ... для n слагаемых.
Как следует из задания, каждое слагаемое вычисляется по формуле: 1/(2i +1), где i – номер слагаемого от 0 до n. Тогда программа может иметь вид:
program ex02_10;
{ вычислить сумму S = 1 + 1/3 +1/5 . . . }
{ для N слагаемых }
var
i, n: integer;
s: double;
begin
writeln('введите число слагаемых:');
readln(n);
s:=0.0;
for i:=0 to n do begin
s:=s + 1/(2.0*i + 1);
end;
writeln('сумма равна: ',s:10:5);
readln;
end.
Процедуры и функции
Пример процедуры без параметров: сокращение дроби
Чтобы сократить дробь, необходимо найти наибольший общий делитель числителя и знаменателя. Для этого используется процедура NOD. В программе определена глобальная переменная m, значение которой изменяется в подпрограмме.
Для вычисления НОД используем простейшую процедуру без параметров. Ниже приводится текст программы с использованием такой процедуры:
program ex03_01;
{ сокращение дроби: используется процедура вычисления }
{ наибольшего общего делителя без параметров }
var
nom, denom, m: integer;
procedure NOD;
var a,b: integer;
begin
a:=nom; b:=denom; // сохранение параметров;
while a <> b do
if a > b then a := a - b else b := b - a;
m:= a;
end;
begin // головная программа
writeln('введите числитель и знаменатель:');
readln(nom, denom);
NOD; // вызов процедуры
nom:=nom div m; denom:=denom div m;
writeln('результат: ', nom, '/',denom);
readln;
end.
Обратите внимание: как и у головной программы, у процедуры есть заголовок, раздел описаний и раздел операторов. Процедура объявлена до начала вызывающей – в данном случае головной – программы.
В данном примере в подпрограмме описаны две переменные a и b. Это – локальные переменные, они доступны только операторам внутри процедуры. В головной же программе описаны переменные nom, denom и m. Это – глобальные данные.
Процедура NOK вначале присваивает своим (локальным) переменным a и b значения переменных nom и denom. Так как nom и denom объявлены в головной программе, то они доступны подпрограмме. Результат работы процедуры присваивается переменной m. Эта переменная тоже объявлена как глобальная. Таким образом, обмен информацией между подпрограммой и процедурой без параметром происходит через глобальные переменные.
Сокращение дроби: пример процедуры с параметрами
Создадим еще одну программу сокращения дроби. На этот раз используем процедуру, которая имеет два параметра – два целых числа. Алгоритм вычислений такой же, как и в предыдущем примере.
program ex03_02;
{ сокращение дроби: используется процедура вычисления}
{ наибольшего общего делителя с параметрами }
var
nom, denom, m: integer;
procedure NOD(a,b:integer);
begin
while a <> b do
if a > b then a := a - b else b := b - a;
m:= a;
end;
begin // головная программа
writeln('введите числитель и знаменатель:');
readln(nom, denom);
NOD(nom, denom); // вызов процедуры
nom:=nom div m; denom:=denom div m;
writeln('результат: ', nom, '/',denom);
readln;
end.
Пример процедуры с передачей параметра по ссылке: вычисление периметра треугольника по координатам его вершин
Пусть, например, требуется вычислить периметр треугольника по координатам его точек. Как уже говорилось, при этом потребуется трижды вычислить расстояние между точками треугольника. Создадим процедуру dist, в которой будут производиться эти вычисления.
Program ex03_03;
{вычисление периметра треугольника }
var
x1,y1,x2,y2,x3,y3:real; { координаты точек }
d1,d2,d3:real; { расстояния – длины сторон }
procedure dist(xx1,yy1,xx2,yy2:real; var d:real);
begin
d:=sqrt(sqr(xx2-xx1)+sqr(yy2-yy1));
end;
begin { ГОЛОВНАЯ ПРОГРАММА }
write('Введите координаты первой вершины:');
readln(x1,y1);
write('Введите координаты второй вершины:');
readln(x2,y2);
write('Введите координаты третьей вершины:');
readln(x3,y3);
dist(x1,y1,x2,y2,d1);
dist(x2,y2,x3,y3,d2);
dist(x1,y1,x3,y3,d3);
writeln ('Периметр треугольника равен',d1+d2+d3);
end.
В процедуре dist параметры x1, x2, y1, y2 передаются по значению, а параметр d – по ссылке. Это означает, что вычисленное значение d изменится и в вызывающей программе.
Пример функции: вычисление периметра треугольника
Рассмотрим снова программу вычисления периметра треугольника, но теперь создадим функцию вычисления расстояния:
Program ex03_04;{вычисление периметра треугольника}
{ используется функция }
var x1,y1,x2,y2,x3,y3,d1,d2,d3:real;
function dist(xx1,yy1,xx2,yy2:real):real;
begin
dist:=sqrt(sqr(xx2-xx1)+sqr(yy2-yy1));
end;
begin
write('Введите координаты первой вершины, через пробел:');
readln(x1,y1);
write('Введите координаты второй вершины:');
readln(x2,y2);
write('Введите координаты третьей вершины:');
readln(x3,y3);
d1:=dist(x1,y1,x2,y2);
d2:=dist(x2,y2,x3,y3);
d3:=dist(x1,y1,x3,y3);
writeln ('Периметр треугольника равен',(d1+d2+d3):10:5);
end.
В подобных случаях использование функций предпочтительнее использования процедур.
Пример: Вычисление действительной степени числа
В языке Pascal нет стандартной функции возведения действительного числа в степень с действительным показателем.
При необходимости программисты используют следующий прием. Как известно, логарифм степени равен произведению логарифма числа на показатель степени:
С другой стороны, основное логарифмическое тождество имеет вид:
Для конкретности используем натуральные логарифмы. Тогда
Ниже приведен пример функции возведения числа в действительную степень и программы, использующей эту функцию.
program pow;
{ возведение числа в действительную степень }
function power(x,b: double):double;
begin
power:=exp(b*ln(x));
end;
var y,a,p: double;
begin
write('a, p: '); readln(a,p);
y:=Power(a,p);
writeln('y= ',y:10:4);
readln;
end.
Пример работы программы: вычисление 20,5:
a, p: 2 0.5
y= 1.4142