Курганской области
Е. Г. Квашнин
Курган 2004
Turbo Pascal – сборник задач c решениями: Сопровождение курса лекций / Авт.- сост. Е. Г.
Квашнин; Институт повышения квалификации и переподготовки работников образования Курганской
области. – Курган, 2004. – 37 стр.
Данное учебное пособие содержит краткие справочные данные и задачи с решениями по курсу
«Основы языка программирования». Изложение ведется с использованием языка программирования
Турбо Паскаль. Рассматриваются некоторые классические алгоритмы. Приводятся примеры типовых
задач с решениями.
Пособие предназначено для учителей информатики и слушателей данного курса.
Оглавление
Стр.
Программа, выводящая на экран слово «МИР». Буквы этого слова состоят из символов «*», высота каждой буквы
– 6 символов.
Program mir;
Uses Crt;
Begin
Clrscr;
writeln(‘* * * * *******’);
writeln(‘* * * * * ** * *’);
writeln(‘* ** * * * * * *’);
writeln(‘* * * * * * *******’);
writeln(‘* * ** * * ’);
writeln(‘* * * * * ’);
readln;
End.
Программа, вычисляющая произведение трёх чисел.
Program umnogenie;
Uses Crt;
var a, b, c: real;
Begin
Clrscr;
writeln(‘Введите первое число ’);
readln(а);
writeln(‘Введите второе число ’);
readln(b);
writeln(‘Введите третье число ’);
readln(с);
writeln(‘Произведение чисел равно ’, a*b*c );
readln;
End.
3
Begin
Clrscr;
writeln(‘Введите первый угол ’);
readln(а);
writeln(‘Введите второй угол ’);
readln(b);
writeln(‘Третий угол равен ’, 180-a-b );
readln;
End.
5 x
Program Uravnenie;
Uses Crt;
var x, b: real;
Begin
Clrscr;
write(‘Введите значение переменной х ’);
readln(x);
b:= (exp(x*ln(5))+exp(5*ln(х)))/(5+х);
writeln(‘Значение арифметического выражения равно’, b:5:3);
readln;
End.
5
readln(b);
с:=round(a);
d:=exp(b*ln(c));
writeln(‘Округление числа ’, a, ‘=’c );
writeln(‘числа ’, с,’ в степени ’, ’ b’, ‘=’, d );
readln;
End.
Условный оператор
1) ifусловие then оператор 1 else оператор 2;
2) ifусловие 1 and условие 2 then оператор 1 else оператор 2;
3) ifусловие 1 or условие 2 then оператор 1 else оператор 2;
4) ifусловие then
begin
оператор 1;
оператор 2;
…
end
else
begin
оператор 1;
оператор 2;
…
end ;
5) Краткая форма записи условного оператора: if условие then оператор;
Условие задачи: развивая предельно возможную скорость, жираф пробегает за t1с S1м (например, за 23
с 335,8 м). Заяц пробегает за t2c S2м (например, за 55 с 918,5 м). Кто из них достоин звания чемпиона?
Program champion;
Uses Crt;
var sl, s2, tl, t2, vl, v2: real;
7
Begin
Clrscr;
writeln ('Введите показатели жирафа ');
readln (sl, tl);
writeln ('Введите показатели зайца ');
readln (s2, t2);
vl:= sl/tl;
v2:= s2/t2;
if vl = v2.then
begin
textcolor (10) ;
writeln ('Победила дружба');
end
else if vl > v2 then
begin
textcolor (14);
writeln ('Жираф — чемпион');
end
else
begin
textcolor (9) ;
writeln ('Заяц — чемпион');
end;
readln;
End.
8
If (a=0) and (b=0) and (c<>0) then writeln('Heпpaвильнoe уравнение.')
else
begin
D:= b*b - 4*a*c;
If D>0 then
begin
xl:=(-b + Sqrt(D)) / (2*a);
x2:=(-b - Sqrt(D)) / (2*a);
writeln('xl=' , xl:6:2 , '; x2=' , x2:6:2);
end
else
If D=0 then
begin
xl := -b/(2*a);
witeln(Корни равны: xl = ', xl:6:2, '; x2 = ', xl:6:2)
еnd
else writeln('Действительных корней нет.');
end;
readln;
End.
Программа нахождения координат точки пересечения двух заданных прямых (ax1+bx1+c1=0,
ax2+bx2+c2=0).
Program Intersection;
Uses Crt;
var а1, bl, с1,
a2, b2, с2,
x, y: real;
Begin
CIrScr;
write('Введите а1, b1, с1:’);
readln( а1, bl, с1);
write('Введите a2, b2, с2 : ') ');
readln( a2, b2, с2);
writeln; Write('0 т в е т : ');
If ((al=0) and (bl=0) ) or ( (a2=0) and (b2=0) then writeln( 'это не прямая (прямые).’)
else
if (al*b2=a2*bl) and (a 1*c2=a2*c1) then writeln( 'прямые совпадают.' )
else
if al*b2 = a2*bl then writeln('пpямыe параллельны.')
else
begin
x:=(cl*b2-c2*bl)/(bl*a2-b2*al);
y:=(c2*al-cl*a2)/(bl*a2-b2*al);
writeln(‘Координаты точки пересечения: х= ’,x:5:2, ‘, y= ‘, y:5:2);
end;
readln;
End.
метод решения:
|c1 b1| |a1 c1|
|c2 b2| |a2 c2|
x=--------- y=---------
|a1 b1| |a1 b1|
|a2 b2| |a2 b2|
10
x:=dx/d; y:=dy/d;
writeln('x = ', x); writeln('y = ', y);
end;
readln;
Еnd.
метод решения:
|d1 b1 c1| |a1 d1 c1| |a1 b1 d1|
|d2 b2 c2| |a2 d2 c2| |a2 b2 d2|
|d3 b3 c3| |a3 d3 c3| |a3 b3 d3|
x = ---------- y = ---------- z = ----------
|a1 b1 c1| |a1 b1 c1| |a1 b1 c1|
|a2 b2 c2| |a2 b2 c2| |a2 b2 c2|
|a3 b3 c3| |a3 b3 c3| |a3 b3 c3|
В старояпонском календаре был принят двенадцатилетний цикл. Годы "внутри цикла носили названия
животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, петуха, собаки и
свиньи. Написать программу, которая позволяет ввести номер года и печатает его название по
старояпонскому календарю.
Справка: 1996 г. — Год Крысы — начало очередного цикла.
Program Goroskop;
Uses Crt;
var Year : integers;
Begin
Clrscr;
write('Введите год ');
readln(Year);
Case Year mod 12 of
0: writeln('Год Обезьяны');
1: writeln(' Год Петуха');
2: writeln(' Год Собаки');
3: writeln(' Год Свиньи');
4: writeln(‘ Год Крысы');
5: writeln(‘ Год Коровы');
6: writeln(‘ Год Тигра');
:7: writeln(‘ Год Зайца');
8: writeln(‘ Год Дракона');
9: writeln(‘ Год Змеи');
10: writeln(‘ Год Лошади');
11: writeln(‘ Год Овцы');
end;
readln;
End.
Циклы
Цикл с предусловием: Цикл с постусловием: Цикл со счётчиком:
while условие do repeat for переменная:= начальное
begin оператор 1; значение to конечное значение
оператор 1; оператор 2; do
оператор 2; … begin
… оператор n; оператор 1;
оператор n; until условие; оператор 2;
end; …
оператор n;
13
end;
Цикл со счётчиком:
(1 способ) (2 способ)
Program Star; Program Star;
Uses Crt; Uses Crt;
var х : Integer; var х : Integer;
Begin Begin
Clrscr; Clrscr;
for x:=1 to 100 do for x:=100 downto 1 do
begin begin
write(‘*’); write(‘*’);
end; end;
readln; readln;
End. End.
1 1 1 1
Программа, вычисляющая сумму слагаемых .
1 2 3 100
Цикл с предусловием: Цикл с постусловием:
Program summa; Program summa;
Uses Crt; Uses Crt;
var i, s : Integer; var i, s : Integer;
Begin Begin
Clrscr; Clrscr;
i:=1; s:=0; i:=1; s:=0;
while i<100 do repeat
begin s:=1/i+s;
s:=1/i+s; i:=i+1;
i:=i+1; until i>100;
end; writeln(‘Сумма элементов равна’, s);
writeln(‘Сумма элементов равна’, s); readln;
readln; End.
End.
Цикл со счётчиком:
Program summa;
Uses Crt;
var i, х, s : Integer;
Begin
Clrscr;
i:=1; s:=0;
for i=1 to 100 do s:=1/i+s;
writeln(‘Сумма элементов равна’, s);
readln;
End.
Цикл со счётчиком:
Рrogram Celsius to Fahrenheit;
Uses Crt;
var i, Celsius: Integer; Fahrenheit: real;
Вegin
Clrscr;
writeln("Таблица соответствия между
температурными шкалами');
writeln('Цельсия и Фаренгейта');
writeln;
for i := 0 to 20 do
begin
Celsius := 5 * i;
Fahrenheit := 32 + Celsius * 9 div 5;
write(‘ С =' , Celsius) ;
write(‘ F =', Fahrenheit);
writeln;
end;
readln;
End.
Программа, загадывающая число от 0 до 10. Если пользователь его угадывает, то программа поздравляет
его, а если нет, то просит попытаться ещё раз, но убавляя количество призовых баллов.
Рrogram roulette;
Uses Crt;
var number, guess, bonus: byte;
Вegin
Clrscr;
bonus:=10;
Randomize;
number := Random(ll);
writeln('Задумано целое число от 0 до 10. Угадайте!');
writeln;
wr1teln('Введите целое число от 0 до 10');
readln(guess);
while guess <> number do
begin
Dec(bonus);
writeln('Bы не угадали.');
writeln;
16
if guess < number then writeln('Ваше число меньше задуманного')
else
writeln('Ваше число больше задуманного');
writeln('Попытайтесь еще раз!');
readln(guess);
end;
writeln('Поздравляю! Вы угадали и набрали ', bonus, ' очков');
readln;
Еnd.
Массивы
Одномерный массив
Var Имя массива : array[начальный индекс .. конечный индекс] of тип данных;
Двумерный массив
Var Имя массива : array[номер первой строки .. номер последней строки , номер первого столбца
номер последнего столбца] of тип элементов массива;
20
type Mas = array[0..100] of integer;
var A: Mas;
i, j, n: integer;
x, p: real;
Begin
write('степень многочлена = ');
readln(n);
writeln('введите целые коэффициенты : ');
for i:=0 to n do read(A[i]);
write('значение X = ');
readln(x);
p:=0;
for i:=0 to n do p:=p*x+A[i];
writeln('Pn(X) = ',p);
readln;
End.
Вычисление суммы элементов заданного одномерного числового массива А=(а1, а2, …, аn).
Program Summa;
Uses Crt;
Type Mas = Array [1..20] of Real;
var A : Mas;
i, N : Integer;
S : Real;
Begin
CIrScr;
write('Введите N =');
readln(N);
For i := 1 to N do
begin
write('A [', i ,']=');
readln(A[i]);
end;
S := 0;
For i := 1 to N do S := S+A[i];
writeln;
writeln('Cyммa равна', S : 5 :1);
readln;
End.
Формирование нового одномерного массива из элементов заданного массива. (Дан массив X(N).
Получим новый массив Y(N), такой, что в нём сначала идут положительные числа, затем нулевые и
затем отрицательные из Х).
Program NewOrder;
Uses Crt;
var N, i, k : Integer;
X,Y : Array [1..20] of Real;
Begin
CIrScr;
Write(‘ Введите N =');
readln(N);
For i := 1 to N do
begin
Write('X[', i,' ] = ');
readln(X[i]);
end;
k:=0;
For i := 1 to N do
If X[i]>0 then
begin
k:=k+l;
Y[k]:=X[i];
end;
For i := 1 to N do
If X[i]=0 then
begin
k:=k+l;
Y[k]:=X[i];
end;
For i:= 1 to N do
If X[i]<0 then
begin
k:=k+l;
Y[k]:=X[i];
end;
write('O т в е т: полученный массив');
For i := 1 to N do write(Y[i]: 5 : 1);
writeln;
readln;
End.
23
end;
end;
writeln( 'Сумма элементов массива = ', s );
readln;
Еnd.
24
for i:=1 to 10 do
begin
if (a[i]>=C) and (a[i]<=D) then writeln(a[i]);
end;
readln;
Еnd.
25
i,j:integer;
Вegin
CIrScr;
writeln('введите 10 элементов массива');
for i:=1 to 10 do readln( a[i] );
i:=1;
while (i<10) and (j<11) do begin
j:=i+1;
while (j<11) and (a[i]<>a[j]) do inc(j);
inc(i);
end;
if i<11 then writeln('в массиве есть одинаковые элементы')
else writeln('все элементы массива различны');
readln;
Еnd.
АЛГОРИТМЫ СОРТИРОВКИ
Простейшая задача сортировки заключается в упорядочении элементов массива по возрастанию
или убыванию. Другой задачей является упорядочение элементов массива в соответствии с некоторым
критерием. Обычно в качестве такого критерия выступают значения определенной функции,
аргументами которой выступают элементы массива. Эту функцию принято называть упорядочивающей
функцией.
Существуют различные методы сортировки. Будем рассматривать каждый из методов на примере
задачи сортировки по возрастанию массива из N целых чисел.
СОРТИРОВКА ВЫБОРОМ
Идея метода заключается в том, что находится максимальный элемент массива и меняется
местами с последним элементом (с номером N). Затем, максимум ищется среди элементов с первого до
предпоследнего и ставится на N-1 место, и так далее. Необходимо найти N-1 максимум. Можно искать
не максимум, а минимум и ставить его на первое, второе и так далее место. Также применяют
модификацию этого метода с одновременным поиском максимума и минимума. В этом случае
количество шагов внешнего цикла N div 2
Вычислительная сложность сортировки выбором - величина порядка N*N, что обычно
записывают как O(N*N). Это объясняется тем, что количество сравнений при поиске первого максимума
равно N-1. Затем N-2, N-3, и так далее до 1, итого: N*(N-1)/2.
ПРИМЕР: Сортировка выбором по возрастанию массива A из N целых чисел.
Рrogram Vybor1;
Uses Crt;
var A: array [1..100] of integer;
N, i, m, k, x : integer;
Вegin
CIrScr;
write('количество элементов массива ');
read(N);
for i:=1 to n do read(A[i]);
for k:=n downto 2 do { k - количество элементов для поиска max }
begin
m:=1; { m - место max }
for i:=2 to k do if A[i]>A[m] then m:=i;
{меняем местами элементы с номером m и номером k}
26
x:=A[m]; A[m]:=A[k]; A[k]:=x;
end;
for i:=1 to n do write(A[i],' '); {упорядоченный массив}
readln;
Еnd.
Можно заметить, что если при выполнении очередного прохода в сортировке обменом не
произведено ни одной перестановки, то это означает, что массив уже упорядочен. Таким образом, можно
модифицировать алгоритм, чтобы следующий проход делался только при наличии перестановок в
предыдущем.
ПРИМЕР: Сортировка обменом с проверкой факта перестановки.
Рrogram Obmen2;
Uses Crt;
var A: array [1..100] of integer;
N, i, k, x : integer; p: boolean;
Вegin
CIrScr;
write('количество элементов массива ');
read(N);
for i:=1 to n do read(A[i]);
k:=n-1; {количество пар при первом проходе}
p:=true; {логическая переменная p истинна, если были
перестановки, т.е. нужно продолжать сортировку}
while p do
begin
p:=false;
{Начало нового прохода. Пока перестановок не было.}
for i:=1 to k do
if A[i]>A[i+1] then
begin
x:=A[i]; A[i]:=A[i+1]; A[i+1]:=x;
{меняем элементы местами}
p:=true; {и запоминаем факт перестановки}
28
end;
k:=k-1;
{уменьшаем количество пар для следующего прохода}
end;
for i:=1 to n do write(A[i],' '); {упорядоченный массив}
readln;
Еnd.
Следующая модификация алгоритма сортировки обменом получается при запоминании места
последней перестановки. Если при очередном проходе последней парой элементов, которые поменялись
местами, были A[i] и A[i+1], то элементы массива с i+1 до последнего уже стоят на своих местах.
Использование этой информации позволяет нам сделать количество пар для следующего прохода
равным i-1.
ПРИМЕР: Сортировка обменом с запоминанием места последней перестановки.
Рrogram Obmen3;
Uses Crt;
var A: array [1..100] of integer;
N, i, k, x, m : integer;
Вegin
CIrScr;
write('количество элементов массива ');
read(N);
for i:=1 to n do read(A[i]);
k:=n-1; {количество пар при первом проходе}
while k>0 do
begin
m:=0;
{пока перестановок на этом проходе нет, место равно 0}
for i:=1 to k do
if A[i]>A[i+1] then
begin
x:=A[i]; A[i]:=A[i+1]; A[i+1]:=x; {меняем элементы местами}
m:=i; {и запоминаем место перестановки}
end;
k:=m-1; {количество пар зависит от места последней перестановки}
end;
for i:=1 to n do write(A[i],' '); {упорядоченный массив}
readln;
Еnd.
ШЕЙКЕРНАЯ СОРТИРОВКА
Этот алгоритм, по сути, является модификацией сортировки обменом. Отличие состоит только в
том, что если в сортировке обменом проходы осуществлялись только в одном направлении, то здесь
направление каждый раз меняется. В шейкерной сортировке также можно проверять факт перестановки
29
или запоминать место последней перестановки. В базовом алгоритме количество двойных проходов
равно N div 2. Вычислительная сложность шейкерной сортировки O(N*N).
ПРИМЕР: Шейкерная сортировка по возрастанию массива A из N целых чисел.
Рrogram Shaker;
Uses Crt;
var A: array [1..100] of integer;
N, i, k, x, j, d : integer;
Вegin
CIrScr;
write('количество элементов массива ');
read(N);
for i:=1 to n do read(A[i]);
d:=1; i:=0;
for k:=n-1 downto 1 do { k - количество сравниваемых пар }
begin
i:=i+d;
for j:=1 to k do
begin
if (A[i]-A[i+d])*d>0 then
{меняем местами соседние элементы}
begin x:=A[i]; A[i]:=A[i+d]; A[i+d]:=x; end;
i:=i+d;
end;
d:=-d;
{меняем направление движения на противоположное}
end;
for i:=1 to n do write(A[i],' '); {упорядоченный массив}
readln;
Еnd.
СОРТИРОВКА ВКЛЮЧЕНИЕМ
Идея данного метода состоит в том, что каждый раз, имея уже упорядоченный массив из K
элементов, мы добавляем еще один элемент, включая его в массив таким образом, чтобы
упорядоченность не нарушилась. Сортировка может производиться одновременно со вводом массива.
В начале сортировки упорядоченная часть массива содержит только один элемент, который
вводится отдельно или, если массив уже имеется, считается единственным, стоящим на нужном месте.
Различные методы поиска места для включаемого элемента приводят к различным модификациям
сортировки включением.
При использовании линейного поиска вычислительная сложность сортировки включением
составляет O(N*N), а при использовании двоичного поиска - O(N*LogN) (имеется в виду логарифм по
основанию 2).
ПРИМЕР: Сортировка по возрастанию массива A из N целых чисел включением с линейным поиском.
Рrogram Include1;
30
Uses Crt;
var A: array [1..100] of integer;
N, i, k, x : integer;
Вegin
CIrScr;
write('количество элементов массива ');
read(N);
read(A[1]); {for i:=1 to n do read(A[i]);}
{k - количество элементов в упорядоченной части массива}
for k:=1 to n-1 do
begin
read(x); {x:=A[k+1];}
i:=k;
while (i>0)and(A[i]>x) do
begin
A[i+1]:=A[i];
i:=i-1;
end;
A[i+1]:=x;
end;
for i:=1 to n do write(A[i],' '); {упорядоченный массив}
readln;
Еnd.
Процедуры
begin
раздел операторов процедуры
end;
Определение наличия среди элементов главной диагонали заданной целочисленной матрицы А(N, N)
хотя бы одного положительного нечётного элемента.
33
Program Diagonal;
Uses Crt;
Type Mas = Array [1.. 10, 1.. 10] of Integer;
var A: Mas;
N, i, j: Integer;
Flag: Boolean;
Procedure InputOutput(Var A : Mas); {описание процедуры ввода- вывода исходных данных}
Begin
CIrScr;
write('Количество строк и столбцов — '); readln(N);
For i:= 1 to N do
For j := 1 to N do
begin
write('A[', i, ‘, ‘, j, '] = ');
readln(A[i, j]);
end;
writeln;
writeln('Заданная матрица ;');
For i := 1 to N do
begin
For j := 1 to N do Write(A[i, j] : 5);
writeln;
end;
writeln;
End; { of InputOutput }
Procedure Solution(Var A : Mas); {описание процедуры поиска решения}
var Flag : Boolean;
Begin
Flag:=FALSE; i:=l;
While (i<=N) and not Flag do
If (A[i, i]>0) and (A[i, i] mod 2 = 1) then Flag:=TRUE else i:=i+l;
writeln(‘ Ответ :’);
write('Cpeди элементов главной диагонали ');
If Flag then writeln('ecть нечетные положительные.') else writeln('нет нечетных
положительных.');
readln;
End; { Solution}
Begin
InputOutput(A); {вызов процедуры ввода-вывода данных }
Solution(A); {вызов процедуры поиска решения задачи}
End.
{Глобальные переменные}
var
а, b, с : Real;
yl, y2 : Real;
flag : Boolean;
Procedure kvur(var yl,y2 : Real; var flag : Boolean);
35
Рекурсивные алгоритмы: генерация перестановок.
Program bikvur;
Uses Crt;
const n = 3; { количество элементов в перестановке}
var a:array[1..n] of integer;
index : integer;
procedure generate (l,r:integer);
var i, v:integer;
begin
if (l=r) then begin
for i:=1 to n do write(a[i],' ');
writeln;
end else begin
for i := l to r do begin
v:=a[l]; a[l]:=a[i]; a[i]:=v; {обмен a[i],a[j]}
generate(l+1,r); {вызов новой генерации}
v:=a[l]; a[l]:=a[i]; a[i]:=v; {обмен a[i],a[j]}
end;
end;
end;
Вegin
CIrScr;
for index := 1 to N do A[index]:=index;
generate( 1,n );
readln;
Еnd.
СОРТИРОВКА ХОАРА
Эту сортировку также называют быстрой сортировкой. Метод был разработан в 1962 году
профессором Оксфордского университета К. Хоаром. Это прекрасный пример использования рекурсии.
Рассмотрим принцип работы алгоритма при упорядочении массива A из N элементов по возрастанию.
Значение какого-нибудь элемента, обычно центрального, записывается в переменную X.
Просматриваются элементы массива. При движении слева-направо ищем элемент больше или равный X.
А при движении справа-налево ищем элемент меньше или равный X. Найденные элементы меняются
местами и продолжается встречный поиск.
После этого массив окажется разделенным на две части. В первой находятся элементы меньше
либо равные X, а справа - больше либо равные X. Можно заменить исходную задачу о сортировке
массива A на две подзадачи о сортировке полученных частей массива.
Вычислительная сложность одного вызова данного рекурсивного алгоритма пропорциональна
количеству элементов сортируемого фрагмента массива. В лучшем случае деление на части
производится пополам, поэтому вычислительная сложность всего алгоритма быстрой сортировки
составляет величину порядка N*LogN (логарифм по основанию 2). Вычислительная сложность в
среднем того же порядка.
ПРИМЕР: Быстрая сортировка по возрастанию массива A из N целых чисел.
Рrogram Quick_Sort;
var A: array [1..100] of integer;
N, i : integer;
{В процедуру передаются левая и правая границы сортируемого фрагмента}
36
procedure QSort(L,R:integer);
Uses Crt;
var X, y, i, j: integer;
Вegin
CIrScr;
X:=A[(L+R) div 2];
i:=L; j:=R;
while i<=j do
begin
while A[i]<X do i:=i+1;
while A[j]>X do j:=j-1;
if i<=j then
begin
y:=A[i]; A[i]:=A[j]; A[j]:=y;
i:=i+1; j:=j-1;
end;
end;
if L<j then QSort(L,j);
if i<R then QSort(i,R);
end;
begin
write('количество элементов массива ');
read(N);
for i:=1 to n do read(A[i]);
QSort(1,n); {упорядочить элементы с первого до n-го}
for i:=1 to n do write(A[i],' '); {упорядоченный массив}
readln;
Еnd.
Функции
function имя функции(параметр 1 : тип 1;
параметр 2 : тип 2; раздел описаний функции
...
параметр n : тип n) : тип функции;
begin
раздел операторов функции
имя функции := выражение;
end;
37
If n=0 then fact:=1 else fact:=n*fuct(n-1);
End; {fact}
Begin
CIrScr;
writeln(‘Введите число, факториал которого вы хотите получить’);
readln(n);
if n<0 then writeln(‘Для отрицательного числа факториал не определён’) else writeln(‘Факториал ’,
n, ‘равен: ’, fact(n));
readln;
End.
38
write('Введите координаты 1-й и 2-й вершин ');
readln(x[l] , у[1], х[2] , у[2]);
i := 2;
su := 0;
repeat
i := i + 1; {Подсчет вершин}
write('Введите координаты ', i, '-и вершины');
readln(x[i] , у[I]) ;
space(l, i - 1, i, pi);
su := su + pi;
until i = n;
writeln(‘Площадь = ', su:10:5);
readln;
End.
Графика
Библиотека CRT
Библиотека (модуль) CRT содержит константы, переменные, процедуры и функции,
обеспечивающие управление текстовым режимом работы монитора и звуковым генератором.
Процедуры
ClrScr Очищает экран или окно и помещает курсор в верхний левый угол.
Delay(D: Word) Приостанавливает работу программы на указанное число D миллисекунд. Практически
время задержки зависит от тактовой частоты процессора.
GotoXY(X, Y: Byte) Перемещает курсор в позицию Х строки Y экрана.
NoSound Выключает источник звука.
Sound(F: Word) Запускает источник звука с частотой F (Гц).
TextBackGround(Color: Byte) Устанавливает цвет фона.
TextColor(Color: Byte) Устанавливает цвет символов.
Wmdow(Xl, Yl, X2, Y2: Byte) Определяет текстовое окно на экране. XI, Yl - координаты левого
верхнего угла окна, X2, Y2 - правого нижнего угла окна.
Функции
KeyPressed: Boolean Анализирует нажатие клавиши. Результат TRUE, если на клавиатуре нажата
клавиша (кроме Alt, Ctrl и т. п.), и FALSE в противном случае. Не задерживает исполнение программы.
ReadKey: Char Читает символ с клавиатуры без эхоповтора на экране. Приостанавливает исполнение
программы до нажатия на любую клавишу, кроме Alt, Ctrl и т. п.
Библиотека GRAPH
Библиотека (модуль) GRAPH содержит константы, процедуры и функции для управления графическим
режимом работы монитора.
Константы цвета
Black 0 Чёрный DarkGray 8 Тёмно-серый
Blue 1 Синий LightBlue 9 Ярко-синий
Green 2 Зелёный LightGreen 10 Ярко-зелёный
Cyan 3 Голубой LightCyan 11 Ярко-голубой
Red 4 Красный LightRed 12 Розовый
Magenta 5 Фиолетовый LightMagenta 13 Малиновый
Brown 6 Коричневый Yellow 14 Жёлтый
LightGray 7 Светло - серый White 15 Белый
43
SolidFill 1 Сплошное заполнение заданным цветом
Процедуры
Arc(X, Y: Integer; Ul, U2, R: Word) Строит дугу окружности текущим цветом с текущими параметрами
линии. X, Y — координаты центра дуги; Ul — угол до начальной точки дуги, отсчитываемый против
часовой стрелки от горизонтальной оси, направленной слева направо; U2 — угол до конечной точки
дуги, отсчитываемый так же, как Ul; R — радиус дуги.
Bar(Xl, Yl, X2, Y2: Integer) Строит прямоугольник, закрашенный текущим цветом с использованием
текущего стиля (орнамента, штриховки). XI, Yl, X2, Y2 — координаты левого верхнего и правого
нижнего углов прямоугольника.
Bar3D(Xl, Yl, X2, Y2: Integer; Glubina; Word; Top: Boolean) Строит параллелепипед,
используя текущий стиль и цвет. XI, Yl, X2, Y2 — координаты левого верхнего и правого
нижнего углов передней грани; Glubina — ширина боковой грани (отсчитывается по
горизонтали); Тор — признак включения верхней грани (если True — верхняя грань
вычерчивается, False — не вычерчивается).
Circle(X, Y: Integer; R: Word) Рисует текущим цветом окружность радиуса R с центром в точке (X, Y).
ClearDevice Очищает графический экран, закрашивает его в цвет фона.
ClearViewPort Очищает выделенное графическое окно, закрашивает его в цвет фона.
CloseGraph Закрывает графический режим, т. е. освобождает память, распределенную под
драйверы графики и файлы шрифтов, и восстанавливает текстовый режим работы экрана.
Ellipse(X, Y: Integer; Ul, U2, XR, YR: Word) Рисует дугу эллипса текущим цветом. X, Y — координаты
центра эллипса; Ul, U2 - углы до начальной и конечной точек дуги эллипса (см. процедуру Arc); XR, YR
— горизонтальная и вертикальная полуоси эллипса.
FillEllipse(X, Y: Integer; XR, YR: Word) Рисует заштрихованный эллипс, используя X, Y как центр и
XR, как горизонтальную и вертикальную полуоси эллипса.
FillPoly(N: Word; Var PolyPoints) Рисует и штрихует многоугольник, содержащий N вершин с
координатами в PolyPoints.
InitGraph(Var Driver, Mode: Integer; Path: String) Организует переход в графический режим.
Переменные Driver и Mode содержат тип графического драйвера и его режим работы. Третий параметр
определяет маршрут поиска графического драйвера. Если строка пустая (т. е. равна "), считается, что
драйвер находится в текущем каталоге.
Line(Xl, Yl, X2, Y2: Integer) Рисует линию от точки XI, Yl до точки X2, Y2.
LineTo(X, Y: Integer) Рисует линию от текущего указателя к точке X, Y.
MoveTo(X, Y: Integer) Смещает текущий указатель к точке X, Y.
OutTextXY(X, Y: Integer; TextString: String) Выводит текст в заданное место экрана.
PieSlice(X, Y: Integer; Ul, U2, Radius: Word) Строит сектор круга, закрашенный текущей штриховкой и
цветом заполнения. X, Y - координаты центра сектора круга; Ul и U2 - начальный и конечный углы
сектора, отсчитываемые против часовой стрелки от горизонтальной оси, направленной вправо; Radius
— радиус сектора.
44
PutPixel(X, Y: Integer; Color: Word) Выводит точку цветом Color с координатами X, Y.
Rectangle(Xl, Yl, X2, Y2) Рисует контур прямоугольника, используя текущий цвет и тип линии. XI, Yl —
координаты левого верхнего угла прямоугольника; X2, Y2 — координаты правого нижнего угла
прямоугольника.
Sector(X, Y: Integer; Ul, U2, XR, YR: Word) Рисует и штрихует сектор эллипса радиусами XR, YR с
центром в X, Y от начального угла Ul к конечному углу U2.
SetBkColor(Color: Word) Устанавливает цвет фона.
SetColor(Color: Word) Устанавливает основной цвет рисования.
SetFaiStyle(Pattern, Color: Word) Устанавливает образец штриховки и цвет.
SetLineStyle(LineStile, Pattern, Thickness: Word) Устанавливает толщину и стиль линии.
SetTextStyle(Font, Direction, CharSize: Word) Устанавливает текущий шрифт, направление
(горизонтальное или вертикальное) и размер текста.
SetViewPort(Xl, Yl, X2, Y2: Integer; ClipOn: Boolean) Устанавливает прямоугольное окно на
графическом экране. Параметр ClipOn определяет «отсечку» элементов изображения, не умещающихся
в окне.
Функции
GetMaxX и GetMaxY Возвращают значения максимальных координат экрана в текущем режиме работы
соответственно по горизонтали и вертикали.
GraphResult Возвращает значение GrOk, соответствующее коду 0, если все графические операции
программы выполнились без ошибок, или возвращает числовой код ошибки (от -1 до -14).
Program diagonals;
Uses Graph;
var gd, gm, i : Integer;
Begin
gd := Detect;
InitGraph(gd, gm, ' ');
i := -GetMaxY;
while i <= GetMaxY do
begin
Line(0, i, GetMaxX, i GetMaxY);
i := i + 20:
end;
Readln;
CloseGraph;
End.
Program bubbles;
Uses Graph, Crt;
var gd, gm, ec, uf : Integer;
Begin
gd := Detect;
gm := 0;
InitGraph(gd, gm, ' ');
Randomize; {Инициализация датчика случайных чисел}
for gm := 1 to 500 do
begin
ес := ес + 1;
if ec = 16 then ec := 1;
SetColor(ec);
Circle(Random(GetMaxX), Random(GetMaxY), Random(gd + 10));
end;
SetColor(Random(White));
SetTextStyle(0, HorizDir, 5);
OutTextXY(50, 29, 'Bubbles');
ReadKey;
CloseGraph;
End.
Программа рисует 16 разноцветных кружков, равномерно расположенных на отрезке прямой,
соединяющем точки (х1, у1) и (х2, у2), в каждом из которых помещен один символ текстовой строки:
Program vinnie;
Uses Graph, Crt;
46
var
х1, у1, х2, у2, с, г : Integer;
x, y, dx, dy : Real;
gm, gd : Integer;
a : String;
Begin
a := ' Vinnie The Pooh ';
gd := Detect;
InitGraph(gd, gm, ' ');
writeln('Введите х1, у1, х2, у2:');
readln(xl, у1, х2, у2);
ClearDevice;
dx := (х2 - х1) / 19;
dy := (у2 - у1) / 19;
SetColor(Green);
r := Round(Sqrt(dx * dx + dy * dy) / 2);
x := х1;
y := у1;
for с := 0 to 18 do {с-цвет}
begin
SetColor(c mod 13 + 1);
SetTextStyle(l, 0, 2);
Circle(round(x), round(y), r);
OutTextXY(Round(x) , Round(y), a[c +1]);
x := x + dx;
у := у + dy;
end;
readln;
CloseGraph;
End.
47
SetFillStyle(1, Red).; {Закрашивание человека}
FloodFill(320, 200, Red);
FloodFill(320, 230, Red);
SetColor(Yellow) ;
Circle(3l5. 190, 2); {Левый глаз}
Circle(325, 190, 2);{Правый глаз}
Line(3l5, 210, 325, 210);{Рот}
Readln:
CloseGraph;
End.
Символы (строки)
Функции и команды обработки строк
Процедуры
Delete(Var S:String; N, MJnteger) Удаляет М символов из строки S, начиная с позиции N.
Insert(SubS: String; Var S:String; N:Integer) Вставляет подстроку SubS в строку S, начиная с позиции
N.
Str(X:Integer; Var S:String) Возвращает представление числа Х в его символьной форме S.
Val(S:String; Var X, Code: Integer) Возвращает представление символов строки S в ее числовой форме
К-Параметр Code содержит признак ошибки преобразования (если Code = 0 ошибки нет).
Функции
Chr(X:Byte):Char Возвращает символ с заданным порядковым номером X.
Concat(Sl[, S2, .... SN]):String Выполняет сцепку (конкатенацию) последовательности строк.
Copy(S:String; N, M:Integer):String Возвращает подстроку из строки S, начиная с позиции N и длиной
М символов.
Length(S:String):Byte Возвращает количество символов в строке S.
Ord(X:Char):LongInt Возвращает порядковый номер символа Х в таблице кодов символов.
Pos(SubS, S: String):Byte Возвращает номер позиции, начиная с которой в строке S располагается
подстрока SubS (если значение функции равно нулю, то S не содержит SubS).
Сравнение строк
Метод сортировки трёх строк по алфавиту.
Program primer 2;
Uses crt;
var a, b, c, d : string [20] ;
48
Begin
Clrscr;
writeln ('Введите 1-е слово');
readln (a) ;
writeln ('Введите 2-е слово');
readln (b) ;
writeln ('Введите 3-е слово');
readln (с) ;
d : = ‘ ‘;
If a > b then
begin
d:= a ;
a:= b;
b:= d;
end;
If b > с then
begin
if с < a then
begin
d = a;
a = c;
с = d;
end;
d:= b;
b:= c;
c:= d;
end;
writeln (a);
writeln (b);
writeln (c);
readln;
End.
Объединение строк
Составление предложения.
Program primer 3;
Uses Crt;
var
a, b, c, d : string[30];
Begin
Clrscr; В результате получим:
a:='To be'; To be or not To be That is the question
b: = 'or not';
c:='That is the question';
d:=a+b+a;
writeln (d);
writeln (c);
readln;
End.
Сцепление строк.
Program primer 4 ;
49
Uses Crt;
var
a, b, c, d , 1, m, n, p : string [10]; В результате работы этой программы на
экране появятся следующие слова
Begin
Clrscr; парад паром сом сад
а:='пар';
b:='ад';
с:='ом';
d:='c';
l:=a+b; m:=a+c; n:=d+c; p:=d+b;
writeln (1, ' ' , m, ' ', n, ' ', p);
readln;
End.
Копирование подстроки
Составление простых слов из более сложного.
Program primer 5 ;
Uses Crt;
var
a, b, c, d , e : string [15] ;
Begin
Clrscr;
a:='стихотворение' ; В результате работы этой программы получим:
b:=copy(a, 1, 4) ; стих, тихо, творение, вор
c:=copy(a, 2, 4) ;
d:=copy(a, 6, 8) ;
e:=copy(a, 7,3);
writeln (b, ' , ' , с, ' , ' , d, ' , ' , е);
readln;
End.
Поиск подстроки
Поиск слов в предложении.
Program primer 7;
Uses Crt;
var
a, b, с : string [100];
m, n : integer;
Begin
Clrscr;
a ='Жил-был в норе под землей хоббит';
b :='был';
с :='хоббит';
m :=pos (b, a);
n :=pos (с, а);
writeln (b, ' - ', m); {был - 5}
writeln (с, ' - ', n); {хоббит – 27}
readln;
End.
Преобразование строк
Программа, определяющая и сравнивающая в введённом с клавиатуры числе количество чётных и
нечётных цифр.
Program primer 9;
Uses Crt;
var a: string[5] ;
b: string[1];
i, k, s, sn , x : integer;
Begin
Clrscr;
s: =0; sn: =0 ;
write('Задайте число'); readln(a);
for i:=l to length(a) do
begin
b:=copy(a,i,l) ;
val(b,x,k) ;
if x mod 2=0 then s:=s+l else sn:=sn+l;
end;
if s>sn then writeln ('Четных цифр больше');
if s<sn then writeln ('Нечетных цифр больше');
51
if s=sn then writeln ('Одинаково');
readln;
End.
End.
Вegin
ClrScr;
writeln('Введите любой текст');
readln(s);
writeln('Этот же текст большими буквами:');
writeln(BigAlpha(s));
readln;
Еnd.
55