Рабочая тетрадь Паскаль
.pdf
Рабочая тетрадь по программированию. Паскаль
var |
|
|
|
|
n: integer; |
|
|
|
|
a : array [ |
|
] of |
; |
|
|
|
|
|
|
i,j: integer; |
|
|
|
|
begin |
|
|
|
|
writeln('введите размерность матрицы:');
read(n); |
|
|
|
|
|
||
for |
to |
|
do begin |
||||
|
for |
|
|
|
to |
|
do begin |
;
;
;
end;
;
end; еnd.
Турнир по программированию - http://compilers.infoznaika.ru/
31
Рабочая тетрадь по программированию. Паскаль
Задача нахождения максимума и минимума в массиве
Решим задачу поиска наибольшего элемента в таблице А из N вещественных чисел. Найдем максимум и индекс этого элемента.
var
a:array[1..30] of real; max: real;
j,i,n: integer;
begin
write('размерность массива ='); readln(n);
for i:=1 to n do read(a[i]); for i:=1 to n do write(a[i], ' ');
max:=a[1]; //максимальным элементом считаем первый j:=1; //запоминаем значение индекса первого
элемента //сравниваем максимальный с очередным элементом массива
for i:=2 to n do if max<a[i] then begin
//найдя элемент с большим значением запоминаем его и индекс max:=a[i];
j:=i;
end; writeln('Максимум=', max );
writeln('Индекс максимума =', j );
end.
Алгоритм поиска максимума:
1. .
.
2. .
.
Турнир по программированию - http://compilers.infoznaika.ru/
32
Рабочая тетрадь по программированию. Паскаль
3. .
.
4. .
.
Пример 1. Найти минимум главной диагонали квадратной матрицы.
var |
a:array[ |
|
|
|
|
|
|
] of real; |
|
|
||||||
|
|
|
|
min: real; |
|
|
|
|
|
|
|
|
||||
|
|
|
|
j,i,n,k: integer; |
|
|
|
|
|
|||||||
begin |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
Write('Размерность матрицы = '); |
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
|
|
for |
|
|
|
to |
|
do |
|
|
|
|
|
|||||
|
|
|
|
for |
to |
do |
; |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
|
|
for |
|
|
|
to |
|
do if |
|
|
|
|
then begin |
|||||
;
;
end; writeln('Минимум главной диагонали=', min );
end.
Турнир по программированию - http://compilers.infoznaika.ru/
33
Рабочая тетрадь по программированию. Паскаль
Рекурсия.
Введем понятие рекуррентной последовательности: пусть известно k чисел а1 ..., ак. Эти числа являются первыми числами числовой последовательности. Следующие элементы данной последовательности вычисляются так:
ак+1 = F{a1 ..., ак); |
ак+2 = F(a2, ..., ак+1); |
ak+i= F(a3, ..., ак+2); ... |
Здесь F— функция от k аргументов. Формула вида:
|
ai = F(ai-1, ai-2, … , ai-k) |
|
|
||
называется |
. |
Величина |
k |
||
называется |
|
. |
|
|
|
Другими словами, можно сказать, что рекуррентная последовательность
— это
.
Примерами рекуррентных последовательностей являются арифметическая
(1) и геометрическая (2) прогрессии:
a1 |
= 1, |
а2=3, а3=5, а4=7, a5 = 9, |
(1) |
а1 |
= 1, |
а2 = 2, a3 = 4, а4 = 8, а5 = 16, |
(2) |
Рекуррентная формула для указанной арифметической прогрессии:
аi = ai-1 + 2.
Рекуррентная формула для данной геометрической прогрессии:
ai= |
|
. |
Глубина рекурсии в обоих случаях равна единице (такую зависимость еще называют одношаговой рекурсией). В целом рекуррентная последовательность описывается совокупностью начальных значений и рекуррентной формулы. Все
Турнир по программированию - http://compilers.infoznaika.ru/
34
Рабочая тетрадь по программированию. Паскаль
это можно объединить в одну ветвящуюся формулу. Для арифметической прогрессии:
|
1, |
|
если i 1, |
ai |
|
2, |
если i 1. |
|
ai 1 |
Для геометрической прогрессии:
Следующая числовая последовательность известна в математике под названием чисел Фибоначчи:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
Начиная с третьего элемента каждое число равно сумме значений двух предыдущих, т.е. это рекуррентная последовательность с глубиной равной 2 (двухшаговая рекурсия). Опишем ее в ветвящейся форме:
|
1, |
|
если i 1, i 2 |
ai |
|
fi 2 , |
если i 2. |
|
fi 1 |
Введение представления о рекуррентных последовательностях позволяет по-новому взглянуть на некоторые уже известные нам задачи. Например, факториал целого числа n! можно рассматривать как значение n-го элемента следующего ряда чисел:
a0 = 1, а1 = 1!, а2 = 2!, a3 = 3!, а4 = 4!, ...
Рекуррентное описание такой последовательности выглядит следующим образом:
|
1, |
|
если i 0, |
ai |
|
i, |
если i 0. |
|
ai 1 |
Пример 1. Вычислить n-й элемент арифметической прогрессии (1).
Var N, I: 0 ... Maxint;
A: Real;
Begin
Write('N = ');
Readln (N) ;
Турнир по программированию - http://compilers.infoznaika.ru/
35
Рабочая тетрадь по программированию. Паскаль
A: = 1;
For I: = 2 to N do А:=А+2;
Writeln ('A(', N:1, ') = ', A)
End.
Рекуррентная формула ai= ai-1 + 2 перешла в оператор А:= А + 2.
Посмотрите на описание арифметической прогрессии в форме рекуррентной последовательности. Из него непосредственно вытекает способ определения функции для вычисления заданного элемента прогрессии.
Сделаем это для общего случая, определив арифметическую прогрессию с первым членом а0 и разностью d:
|
a |
0 |
, |
если i 1, |
ai |
|
|
если i 1. |
|
|
ai 1 d, |
|||
Соответствующая подпрограмма-функция выглядит так:
Function Progres(А0, D: Real; i: Integer): Real;
Begin
If i=1 Then Progres:=A0
Else Progres:=Progres(А0, D,i-1) + D
End;
Пример 2. Вывести на экран первые 20 чисел Фибоначчи.
Var К: integer;
Function Fibon(N: Integer): Integer;
Begin
If (N=1) Or (N=2) Then Fibon:=1
Else Fibon:=Fibon(N-1)+Fibon(N-2)
End;
Begin
For K:=1 To 20 do WriteLn(Fibon(K))
End.
Турнир по программированию - http://compilers.infoznaika.ru/
36
Рабочая тетрадь по программированию. Паскаль
Требования к оформлению программ на языке PASCAL.
1. Соглашения по идентификаторам
1.1 Подбор идентификаторов
1.1.1 Все идентификаторы должны выбираться из соображений читаемости и максимальной семантической нагрузки.
Например:
const
Eps = 0.0001; { точность } var
Sum : Integer;{ сумма } Message: String; { сообщение }
Неудачными можно считать идентификаторы:
const
UU = 0.0001; { точность } var
Kk : Integer;{ сумма }
Zz : String; { сообщение }
1.1.2. Идентификаторы рекомендуется подбирать из слов английского языка. Например:
1)procedure Beep(Hertz, MSec: Word);
{выдает звуковой сигнал заданной частоты и длительности }
2)function ExistFile(FName: String): Boolean;
{выдает True, если файл с именем FName существует }
3)var
Done: Boolean; { признак окончания работы с программой } Width, Height: Real; { размеры изделия (ширина, высота) }
Не очень удачными можно считать идентификаторы:
1)procedure Zvuk(Chast, Dlit: Word);
{выдает звуковой сигнал заданной частоты и длительности }
2)function EstFile(Im: String): Boolean;
{выдает True, если файл с именем Im существует }
3)var
Konec: Boolean; { признак окончания работы с программой } Shirina, Vysota: Real; { размеры изделия (ширина, высота) }
Турнир по программированию - http://compilers.infoznaika.ru/
37
Рабочая тетрадь по программированию. Паскаль
1.2 Написание идентификаторов
1.2.1 Зарезервированные слова языка Turbo Pascal писать только маленькими буквами.
Например:
type, var, const; procedure, function; begin, end; if, then, else;
repeat, until; case; while; and, not, or; unit, uses, interface, implementation.
1.2.2 В любых идентификаторах каждое слово, входящее в идентификатор, писать, начиная с большой буквы, остальные буквы -- маленькие. В этом смысле символ подчеркивания "_" между словами
идентификатора можно считать излишним. Например:
1) var
NextX, LastX: Real; { следующая и предыдущая итерация } BeepOnError: Boolean; { подавать ли звуковой сигнал при
неправильном вводе пользователя? }
2)function GraphErrorMsg(ErrCode: Word): String;
{стандартная функция модуля Graph; выдает описание ошибки использования графики по ее коду }
3)begin
Write('Введите целое число, большее 10 ==>_ ');
ReadLn(Num);
if Num > 10 then WriteLn('OK'); end.
4) var
FileName: String;{ а не File_Name }
type
ByteArray = array [0..65534] of Byte; { а не Array_Of_Byte }
1.2.3 Рекомендуется идентификаторы, состоящие из одной буквы, писать большой буквой, если они не являются счетчиками циклов.
Например:
1)A := A + B; B := A - B; A := A - B;
2)procedure DeleteNode(var L: List; I: Word);
{удалить звено c номером I из списка L }
3)for i := 1 to N do
Турнир по программированию - http://compilers.infoznaika.ru/
38
Рабочая тетрадь по программированию. Паскаль
for j := 1 to N do
A[i, j] := (i + j) / 2;
2. Соглашения по самодокументируемости программ
2.1 Комментарии
2.1.1Комментарии в теле программы следует писать на русском языке и по существу так, чтобы программист, не участвовавший в разработке программы (но имеющий опыт работы на языке
Turbo Pascal), мог без
особого труда разобраться в логике программы, и, при необходимости, сопровождать данный программный продукт.
2.1.2Рекомендуется комментарии программы писать внутри символов { и }, а (* и *) использовать при отладке программы как "заглушки" участков программного кода.
2.2 Спецификация пользовательской процедуры или функции
Для каждой пользовательской процедуры или функции должна быть описана в виде комментария спецификация, содержащая следующую информацию:
а) назначение процедуры или функции; б) описание семантики параметров-значений (параметров, передаваемых по значению), если она неочевидна;
в) описание семантики параметров-переменных (параметров, передаваемых по ссылке), если она неочевидна.
г) для функции: описание семантики возвращаемого значения, если она неочевидна.
Например:
1)семантика параметров и возвращаемого значения очевидна function IsLeapYear(Y: Word): Boolean;
{возвращает True, если год Y -- високосный }
2)семантика параметров очевидна, семантика возвращаемого значения неочевидна
function DayOfWeek(D, M, Y: Word): Byte;
{Возвращает день недели даты D/M/Y;
год Y должен быть в отрезке 1582..4902; результат: ВСК = 0, ПНД = 1, ВТР = 2, ... СБТ = 6 }
3) семантика параметров и возвращаемого значения неочевидна const
MaxN = 10;
Турнир по программированию - http://compilers.infoznaika.ru/
39
Рабочая тетрадь по программированию. Паскаль
type
Matrix = array [1..MaxN, 1..MaxN] of Real; Vector = array [1..MaxN] of Real;
procedure Gauss(A: Matrix; B: Vector; Eps: Real; var X: Vector;
var HasSolution: Boolean; var NumOfRoots: Integer; var Det: Real;
var AForReverse: Matrix; var BForReverse: Vector); { Решение системы линейных алгебраических уравнений
методом Гаусса. Входные данные:
A-- матрица коэффициентов системы;
B-- столбец свободных членов системы; Eps -- точность вычислений.
Выходные данные:
X -- вектор решения;
HasSolution -- флаг, устанавливаемый в True, если решение системы существует, и в False во всех
остальных случаях;
NumOfRoots -- число корней в решении системы, может
|
принимать значения: |
|
0 -- если решение системы не существует, |
|
MaxN -- если решение системы существует и |
|
единственно, |
|
MaxInt -- если существует бесконечное |
|
множество решений; |
Det |
-- значение определителя матрицы A; |
AForReverse -- нижняя треугольная матрица, полученная из A в в результате выполнения прямого хода алгоритма Гаусса;
BForReverse -- столбец свободных членов, полученный из B в в результате выполнения прямого хода алгоритма Гаусса. }
Замечание:
Если процедура (функция) реализует какой-либо вычислительный метод (например: нахождение площади фигуры методом трапеций, поиск минимума функции методом Ньютона и т.п.), рекомендуется в теле
процедуры (функции) поместить комментарий с кратким описанием метода, либо ссылку на источник, где описан метод.
Турнир по программированию - http://compilers.infoznaika.ru/
40
