- •Дмитров 2015 Содержание
- •Введение
- •Профессиональные компетенции
- •Приемы программирования основных алгоритмических структур на языке Паскаль
- •1.1 Программирование ветвящихся алгоритмов
- •1.2 Практические работы по программированию ветвлений
- •1.3 Программирование циклических алгоритмов
- •1.4 Практические работы по программированию циклов
- •Подпрограммы в Паскале
- •Заключение
1.4 Практические работы по программированию циклов
Результат набора и отладки программ:
Программа Summ_1 (цикл с предусловием)
Program Summ_1;
Var S, Eps: Real;
I : Integer;
Begin
S:=0;
I:=1;
While (1/I >= Eps) And (I< MaxInt) Do
Begin
S := S + 1/I;
I := I + 1
End;
WriteLn('S= ', S, ' I= ', I)
End.
Программа Summ_2 (цикл с постусловием)
Program Summ_2;
Var S, Eps: Real;
I : integer;
Begin
S :=0;
I :=1;
Repeat
S := S+1/I;
I :=I+1
Until (1/I < Eps) Or (I>= MaxInt);
WriteLn ('S= ', S, ' I= ', I);
End.
Программа Adding (структура цикла «Пока»)
Program Adding;
Var I, M, N, Summa : Integer;
Begin
Write (‘M= ‘);
ReadLn(M);
Write (‘N= ‘);
ReadLn(N0;
Summa := 0;
I := M;
While I <= N Do
Begin
Summa := Summa + I;
I := Succ(I0
End;
WriteLn (‘Сумма равна’,Summa)
End.
Программа Summering_2 (цикл по параметру)
Program Summering_2;
Var I, M, N, Summa : Integer;
Begin Write ('M= ');
ReadLn(M);
Write('N= ');
ReadLn(N);
Summa :=0;
For I :=M To N Do
Summa := Summa+I;
WriteLn('Summa Ravna ', Summa:8)
End.
Программа Summering_3 (цикл по параметру в обратном порядке)
Program Summering_3;
Var I, M, N, Summa : Integer;
Begin Write ('M= ');
ReadLn(M);
Write('N= ');
ReadLn(N);
Summa :=0;
For I :=N DownTo M Do
Summa := Summa+I;
WriteLn('Summa Ravna ', Summa:8)
End.
Упражнение 4
Составить программу, по которой последовательность символов будет вводиться до тех пор, пока не встретится строчная или прописная латинская буква «z». Подсчитать, сколько раз среди вводимых символов встретится буква «W».
Program Sim;
Var S : Integer;
I : Char;
Begin
S := 0;
Repeat
Read (I);
If I='W'
Then S := S+1
Until (I='Z') Or (I='z');
Write ('W=' , S);
End.
Упражнение 6
Вычислить
число точек с целочисленными координатами,
попадающих в круг с радиусом
и с центром в начале координат.
Program Chislo_tochek;
Var M, K, x, y, R : Integer;
Begin
R :=1;
For y :=-R To R Do
For x :=-R To R Do
If sqr(x) + sqr(y) <=sqr(R)
Then K := K+1;
Write (' K=', K);
End.
Подпрограммы в Паскале
Понятие вспомогательного алгоритма уже рассматривалось в подразд. 1.5.[1]. В языках программирования вспомогательные алгоритмы называются подпрограммами. В паскале различают два вида подпрограмм: процедуры и функции.
Рассмотрим
следующий пример: даны два натуральных
числа а
и
b.
Требуется определить наибольший общий
делитель трех величин: a
+b,
|a
– b|,
a
b.
Запишем
это в виде: НОД (a+b,
|a-b|,
a
b).
Идея решения данной задачи состоит в следующем математическом факте: если x, y, z – три натуральных числа, то НОД (x, y, z) = НОД (НОД(x, y,) z). Иначе говоря, сначала следует найти НОД двух величин, а затем НОД полученного значения и третьего числа (попробуйте это доказать).
Очевидно, что вспомогательным алгоритмом для решения поставленной задачи является алгоритм получения наибольшего общего делителя двух чисел. Следовательно, эта задача решается с помощью известного алгоритма Евклида (см. подразд. 1.3.[1]), который запишем в форме процедуры на алгоритмическом языке:
процедура Евклид (цел M, N, K);
нач
пока M <> N
нц
если M > N
то M := M – N
иначе N := N – M
кв
кц;
К := М
Кон
Здесь M и N являются формальными параметрами процедуры, т. е. это параметры-аргументы, а К – параметр-результат.
Основной алгоритм решения исходной задачи следующий:
алг задача
цел a, b, c
нач ввод (а, b)
Евклид (а + b, |а - b|, c)
Евклид (с, а * b,с)
вывод (с)
кон
Процедуры. В отличи от АЯ, где процедура является внешней по отношению к вызывающей программе, процедуры в паскале описываются в разделе описания подпрограмм. Программа решения исходной поставленной задачи на ТурбоПаскале будет иметь следующий вид (см. раздел 6. программа NOD_1).
В данном случае обмен аргументами и результатами между основной программой и процедурой производится через параметры (формальные и фактические). Существует и другой механизм обмена – через глобальные переменные, что будет рассмотрено далее.
Синтаксическая диаграмма описания процедуры показана на рис. 9.
Из диаграммы видно, что процедура может иметь параметры, а может и не иметь. Чаще всего аргументы представляются как параметры-значения (но они могут быть и параметрами-переменными), для передачи результатов используются параметры-переменные.
;
<Описание процедуры> <Заголовок процедуры> <Блок>
<Заголовок> Procedure <Имя>
)
(
<Список формальных параметров>
<Формальные параметры> ::= <Параметры-значения> | <Параметры-переменные>
:
:
Рис. 9. Синтаксическая диаграмма описания процедуры
<Оператор процедуры> <Имя процедуры>
)
(
<Список фактических параметров>
Рис.10. Структура оператора обращения к процедуре
Процедура в качестве результата может передавать в вызывающую программу множество значений (в частном случае – одно), а может и не передавать ни одного значения. Теперь рассмотрим правила обращения к процедуре. Обращение к процедуре производится в форме оператора процедуры (рис. 10).
Если описана процедура с формальными параметрами, то и обращение к ней производится оператором процедуры с фактическими параметрами. Правила соответствия между формальными и фактическими параметрами следующие: соответствие по количеству, по последовательности и по типам.
Первый вариант взаимодействия формальных и фактических параметров называется передачей по значению: вычисляется значение фактического параметра (выражения) и это значение присваивается соответствующему формальному параметру. Второй вариант взаимодействия формальных и фактических параметров называется передачей по имени: при выполнении процедуры имя формальной переменной заменяется именем соответствующей фактической переменной (в откомпилированной программе имени переменной соответствует адрес ячейки памяти).
В рассмотренном примере формальные параметры M и N являются параметрами-значениями. Это аргументы процедуры, при обращении к которым первый раз им соответствуют значения выражений A + B и Abs(A – B), а второй раз – значения С и А·В. Параметр К является параметром-переменной, в которой получают результат работы процедуры. В обоих обращениях к процедуре соответствующим фактическим параметром является переменная С, через которую основная программа получает результат.
Теперь рассмотрим пример программы, решающей исходную поставленную задачу с использованием процедуры без параметров (см. раздел 6. программу NOD_2).
Чтобы разобраться в этом примере, требуется рассмотреть понятие область действия описания.
Областью действия описания любого программного объекта (переменной, типа, константы и т.д.) является тот блок, в котором расположено это описание. Если данный блок вложен в другой (подпрограмма), то присутствующие в нем описания являются локальными и действуют только в пределах внутреннего блока. Описания же, стоящие во внешнем блоке, являются глобальными по отношению к внутреннему блоку. Если глобально описанный объект используется во внутреннем блоке, то на него распространяется внешнее (глобальное) описание.
В программе NOD1 переменные M, N, K – локальные внутри процедуры, а переменные А, В, С – глобальные. Однако внутри процедуры переменные А, В, С не используются. Связь между внешним блоком и процедурой осуществляется через параметры.
В программе NOD2 все переменные являются глобальными. В процедуре Evklid нет ни одной локальной переменной (нет и параметров), поэтому используемые в ней переменные
