Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИиП.doc
Скачиваний:
29
Добавлен:
10.04.2015
Размер:
14.43 Mб
Скачать

5. Описание процедур и функций. Этот вопрос рассматривается в пункте 6.

6. Раздел операторов содержит список выполняемых операторов программы. Обязательным является наличие служебного слова Begin в начале и служебного слова End в конце раздела. Весь текст программы должен завершаться точкой.

C.10.2. Лекция 2 (2 часа)Понятие оператора. Классификация операторов. Оператор присваивания. Операторы ввода READ, READLN. Операторы вывода WRITE, WRITELN. Программирование линейных структур алгоритмов. Пример простейших линейных программ.Составной оператор, условный оператор IF, оператор безусловного перехода GOTO, оператор выбора СASE. Примеры разветвляющихся программ. Раздел описания меток. Операторы циклов: REPEAT, WHILE, FOR. Примеры программ на вычисление сумм и произведений рядов.

Оператор присваивания. Оператор присваивания вычисляет значение выражения, стоящего справа от знака “:= “ и присваивает его переменной, указанной слева. Его общий вид

<имя переменной> := <выражение>;

Тип переменной и тип значения выражения должны совпадать за исключением того, что переменной типа Realможет быть присвоено значение выражения типаInteger.

Условный оператор. С помощью условного оператора выбирается и выполняется один из операторов, входящих в его состав. Условный оператор имеет два варианта записи. Полная форма:

If <логическое выражение> Then <оператор1>Else <оператор2> ;

В этом случае в зависимости от значения логического выражения выбирается для выполнения оператор1 или оператор2 .

Неполная форма:

If <логическое выражение> Then <оператор> ;

В этом случае в зависимости от значения логического выражения выполняется записанный после Then оператор или не производится никаких действий.

Если после Then илиElseнеобходимо выполнить действия, описанные несколькими операторами, то эти операторы должны быть заключены в операторные скобкиBegin - End. Такая конструкция называется составным оператором.

Ввод-вывод. В программах на Паскале для ввода и вывода данных используют операторы обращения к процедурам ввода:

Read (список ввода) ;            Readln (список ввода) ;

и процедурам вывода

Write (список вывода) ;        Writeln (список вывода) ;

Процедура Writelnпосле вывода элементов списка переводит курсор на новую строку. В список ввода могут входить переменные типаInteger, Real, Char. В списке вывода могут содержаться константы, переменные, выражения типа Integer, Real, Char и Boolean. При выводе данных можно задавать формат вывода сразу за объектом вывода:

<объект вывода> : <ширина поля>

где <ширина поля> - целое выражение, значение которого определяет количество знаков отводимое для объекта вывода.

Вещественные значения с <шириной поля> и без нее будут иметь экспоненциальную форму записи, поэтому для вывода значений с фиксированной точкой указанный формат вывода можно дополнить целым выражением через “ :”, которое будет соответствовать количеству знаков после запятой:

<объект вывода> : <ширина поля> : <после точки>

Пример: Как будет выведено на экран:

a:=10; b:=2; c:=421.65;

Writeln(a,b,c);        1024.216500000E+02 Writeln(a,b:2,c:8:2)   10 2 421.65  

Операторы цикла.

В языке Паскаль имеются три различных оператора, с помощью которых можно запрограммировать повторяющиеся фрагменты алгоритмов.

Оператор цикла с параметром имеет такую структуру:

For <имя переменной> := <выражение1> To <выражение2> Do <оператор> ;

<имя переменной> - параметр цикла <выражение1> - начальное значение параметра цикла <выражение2> - конечное значение параметра цикла Все три указанных выше объекта должны быть одного порядкового типа. <оператор> - тело цикла.

Этот оператор цикла выполняется следующим образом:

1. Вычисляются значения выражения 1 и выражения 2. 2. Параметру цикла присваивается начальное значение. 3. Параметр цикла сравнивается с конечным значением. Если параметр цикла меньше или равен конечному значению, то перейти к п.4, иначе - конец цикла (переход на следующий оператор после оператора цикла). 4. Выполнить тело цикла. Параметр цикла принимает следующее значение, полученное с помощью функции Succ. Перейти к п.3. Есть еще один вариант этого оператора цикла, когда параметр цикла после каждого выполнения тела цикла принимает следующее значение, полученное с помощью функции Pred. В этом случае служебное слово To заменяется на Dowto и цикл идет до тех пор, пока параметр цикла не станет строго меньше конечного значения.

Пример.Вычислить и напечатать первые 10 чисел Фибоначчи. Решение:

Program Fib; Сonst n=10; {количество чисел} Var i,f1,f2,f3:Integer; Begin         f1 := 1; f2 := 1; {первые два числа Фибоначчи}         For i := 3 To n Do         Begin                 f3 := f1 + f2; {следующее число}                 Writeln(f3);                 f1 := f2; f2 := f3         End End.  

Оператор цикла с предусловием.

While <логическое выражение>Do <оператор> ;

Здесь, тело цикла выполняется до тех пор, пока логическое выражение возвращает значение True.  

Оператор цикла с постусловием.

Repeat <операторы> Until <логическое выражение>;

Здесь, тело цикла выполняется до тех пор, пока логическое выражение возвращает значение False.

Если в теле цикла операторов For и While более одного оператора, то необходимо использовать составной оператор.

Пример. Напечатать таблицу значений функцийsin xиcos x на отрезке [0,1] с шагом 0.1 в следующем виде:

    x              sin(x)          cos(x)

---------------------------------

0.0000        0.0000        1.0000

0.1000        0.0998        0.9950

. . . . . . . . . . . . . . . . . . . . . . . . .

1.0000        0.8415        0.5403

Решение:

Program Table; Const a=0; b=1; h=0.1; { границы и шаг табулирования} Var x: Real; Begin         x:=a;         Writeln(‘x   sin(x)   сos(x)‘); { заголовок таблицы}         Writeln(‘---------------------------------‘);         While x<=b Do         Begin                 Writeln(x:7:4,sin(x):7:4,cos(x):7:4);                 {вывод значений аргумента и функций}                 x:=x+h {увеличение аргумента на шаг}         End; Writeln(‘---------------------------------‘) End.  

Пример.

Найти приближенное значение суммы ряда , учитывающее все слагаемые, от начала ряда до первого, величина которого меньше = 0,0001 .Решение:

Program SumRow;Сonst e=1E-4; {точность вычислений}

C.10.4. Лекция 4 (2 часа) Понятие процедур и функций. Стандартные (встроенные) функции и функции пользователя. Описание процедур и функций и их параметров. Использование готовых процедур и функций (модулей). Формальные и фактические параметры, ограничения на их типы и описания. Параметры – значения и параметры – переменные. Механизм передачи параметров. Примеры программ с процедурами и функциями.

Процедуры и функции в Паскале (как и во многих других языках программирования) являются удобным средством для однократного автономного описания тех фрагментов алгоритма, которые повторяются в разных его частях. Такие описания образуют раздел, который должен быть последним из числа разделов описаний программы. Для выполнения описанных в этом разделе фрагментов алгоритма в разделе операторов программы должны содержаться обращения к соответствующим процедурам и функциям. В некоторых языках программирования (например, Бейсик, Фортран) такие автономные описания частей алгоритма называют подпрограммами.Здесь этот термин будет использоваться для общего обозначения процедур и функций. Описание подпрограммы состоит из заголовка и блока. Заголовок процедуры имеет вид:

Procedure < имя > (< список формальных параметров >);

Заголовок функции:

Function < имя>(< список формальных параметров>): < тип>;

Список формальных параметров необязателен и может отсутствовать. Если же он есть, то в нем должны быть перечислены имена формальных параметров и их тип. Несколько однотипных параметров можно объединять в подсписки, например:     Procedure SB( a : Real; b,d : Integer; c : Char); Операторы подпрограммы рассматривают список формальных параметров как своеобразное расширение раздела описаний: все переменные из этого списка могут использоваться внутри подпрограммы. Обращение к подпрограммам осуществляется указанием имени подпрограммы и списка фактических параметров, в качестве которых могут выступать константы, переменные и выражения, отделяемые друг от друга запятой. Количество и типы фактических параметров при обращении к подпрограмме должны точно соответствовать количеству и типам ее формальных параметров. В момент обращения к подпрограмме происходит замена формальных параметров на фактические. Таким образом осуществляется настройка алгоритма подпрограммы на конкретную задачу. Само обращение к процедурам и функциям происходит по разному. Для обращения к процедуре используется специальный оператор, состоящий из имени процедуры и списка фактических параметров. Для обращения к функции ее имя со списком фактических параметров должно войти как операнд в некоторое выражение. Отсюда вытекает несколько отличий описания функции от описания процедуры:     - в виде функции описывается алгоритм, результатом выполнения которого является скалярная величина;     - в блоке функции должен быть хотя бы один оператор присваивания с именем функции в левой части;     - в заголовке функции должен быть указан тип функции (тип возвращаемого через имя функции результата). Любой из формальных параметров подпрограммы может быть либо параметром-значением, либо параметром-переменной. В предыдущем примере параметры были определены как параметры-значения. Если параметры определяются как параметры-переменные, перед ними необходимо ставить зарезервированное слово Var, например:     Procedure FF( Var a : Real); Если формальный параметр объявлен как параметр-переменная, то при обращении к подпрограмме ему должен соответствовать фактический параметр в виде переменной нужного типа; если формальный параметр объявлен как параметр-значение, то при обращении ему может соответствовать выражение. Для того, чтобы понять, в каких случаях использовать параметры-значения, а в каких - параметры переменные, рассмотрим, как осуществляется замена формальных параметров на фактические в момент обращения к подпрограмме. Если параметр определен как параметр-значение, то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передается подпрограмме. Если же параметр определен как параметр-переменная, то при вызове подпрограммы передается сама переменная, а не ее копия. Любые возможные изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, так как в этом случае изменяется копия фактического параметра, в то время как изменения параметра-переменной приводит к изменению самого фактического параметра в вызывающей программе. Поэтому параметры-переменные могут использоваться как "средство связи" алгоритма, реализованного в подпрограмме, с “внешним миром”, в частности, с помощью этих параметров процедура передает результаты своей работы вызывающей программе. Однако, злоупотребление этими возможностями делает программу, как правило, трудной в понимании и сложной в отладке. В соответствии с требованиями хорошего стиля программирования рекомендуется использовать передачу результатов через фактические параметры для процедур и через имя для функций. Переменные, описанные в разделе описаний переменных подпрограммы, называются локальными переменными этой подпрограммы и доступны только в ней. Концепция глобальных и локальных имен относится не только к переменным но и к другим описываемым объектам Паскаля: константам, типам, процедурам и функциям.

Пример. В программе задается два целых числа 5 и 7, эти числа передаются процедуреInc2,в которой они удваиваются. Один из параметров передается как параметр-переменная, другой - как параметр-значение. Значения параметров до и после вызова процедуры, а так же результат их удвоения выводятся на экран.

    Program Exampl;     Var a,b: Integer;     Procedure Inc2(Var c: Integer; b: Integer);         Begin             c := c + c;             b := b + b;             Writeln(‘Удвоенные :’, c:5, b:5)         End; {Inc2}     Begin {Main}         a:=5; b:=7;         Writeln(‘Исходные :’, a:5, b:5); Inc2(a, b);         Writeln(‘Результат :’, a:5, b:5)     End. {Main}

В результате прогона программы будет выведено:

Исходные : 5    7

Удвоенные : 10    14

Результат : 10    7

Пример.Описать функцию, вычисляющую факториал и использовать ее для вычисления

    Program Calc;     Var n,m: Integer; f: Real;     Function fact(n: Integer): Integer;     Var i,p : Integer;     Begin p:=1;         For i:=2 To n do p := p* i;         fact:= p     End;     Begin         Read(m,n);         f:= fact(n) * fact(m) / fact(n+m);         Writeln(f)     End.

Стандартные процедуры и функции.

Все  функции можно разделить на два вида:  не выводящие за пределы типа, т. е. аргументы и результат относятся к одному типу и те, у которых тип результата не совпадает или может не совпадать с типом результата. Ниже приводится перечень часто используемых функций  Паскаля.

Вызов функции

Тип аргумента

Тип результата

Назначение

 Abs(x)

целый вещественный 

целый вещественный 

Возвращает абсолютное значение x

Pi

вещественный 

Возвращает значение числа ПИ

Sin(x)

целый вещественный 

вещественный 

Возвращает синус xрадиан

Cos(x)

целый вещественный 

вещественный 

Возвращает косинус xрадиан

ArcTan(x)

целый вещественный 

вещественный 

Возвращает арктангенс xрадиан

Sqrt(x)

целый вещественный 

вещественный 

 Возвращает квадратный корень из x>=0

Sqr(x)

целый вещественный 

целый вещественный 

Возвращает значение квадрата x

Exp(x)

целый вещественный 

вещественный 

Возвращает значение e в степени x

Ln(x)

целый вещественный 

вещественный 

Возвращает натуральный логарифм x, x>0

Trunc(x)

вещественный целый 

целый 

Возвращает целую часть значения x

Frac(x)

вещественный целый 

вещественный 

Возвращает дробную часть значения

Int(x)

вещественный целый 

вещественный 

Возвращает целую часть значения x

Round(x)

вещественный целый 

целый 

Округляет xдо ближайшего целого

Odd(x)

целый 

логический 

Проверяет нечетность значения x

Ord(x)

порядковый 

целый 

Возвращает порядковый номер, соответствующий значению x

Chr(x)

символьный 

целый 

Возвращает символ с заданным порядковым номером x

Pred(x)

порядковый 

порядковый 

Возвращает предшествующее значение x

Succ(x)

порядковый 

порядковый 

Возвращает последующее значение x