Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Pascal - redact Мигунов.doc
Скачиваний:
8
Добавлен:
20.09.2019
Размер:
434.69 Кб
Скачать

Подпрограммы-функции

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

Подпрограмма функции имеет следующую структуру:

Function <имя функции> (формальные параметры): <тип результата функции>;

<переменная результата>:<тип результата>;

begin

{блок оператора}

<имя функции>:<переменная результата>;

end;

Program ma;

Var

A, b,nod,nok:integer;

Function nod(x,y:integer):integer;

Begin

If x<y then

Z:=y

Else

Z:=x;

Nod:=z;

{основная программа}

Begin

Write (‘a,b=’);

Readln (a,b);

Nok:=(a*b)/nod;

Write (‘nod=’,nod);

Write (‘nok=’,nok);

Readln;

End.

Параметры массивы и параметры строки.

Типом любого параметра в списке формальных параметров процедуры или функции может быть только стандартный тип данных или объявленный ранее тип данных. Поэтому нельзя написать:

Procedure vvod (d:array [1..10] of byte);

Рекурсия

Рекурсия – это способ организации вычислительного процессу, при котором процедура или функция в ходе выполнения составляющих ее операторов обращается сама к себе, вызывает сама себя.

Процедура является рекурсивной, если она обращается сама к себе прямо или косвенно (через другие процедуры).

Пример рекурсивной функции вычисления факториала:

Function factorial(N: integer) : longint;

Begin

If N= 0 then

Factorial := 1

Else Factorial := factorial(N-1) * N

End;

Пример рекурсивной процедуры, возводящей число в степень:

Procedure Power (X: real; N: integer; var Y: real);

Begin

If N=0 then

Y:= 1

Else Begin Power(X, N-1,Y);

Y:= Y*X;

End;

End;

Задача: Построить последовательность чисел следующим образом: возьмем целое число i>1. Следующий член последовательности равен i/2, если i четное, и 3 i+1, если i нечетное. Если i=1, то последовательность останавливается.

Применение рекурсии позволяет решить задачу без использования циклов, как в основной программе, так и в процедуре:

Program Arsac;

Var first: word;

Procedure posledov (i: word);

Begin

Writeln (i);

If i=1 then exit;

If odd(i) then posledov(3*i+1) else posledov(i div 2);

End;

Begin

Write (‘ введите первое значение ’); readln (first);

Posledov (first);

Readln ;

End.

Типизированные константы

В ТР допускается использование типизированных констант, которые описываются в разделе описания констант.

Const

<имя констант>:<тип констант>=<значение>;

Типизированным константам можно присвоить другие значения в процессе работы программы и фактически они являются переменными с указанным начальным значением. Указанное в описании начальное значение константа принимает только один раз. В момент начала работы программы.

Типизированные константы могут быть любого типа, кроме файлов. Типизированную константу нельзя использовать в качестве значения при объявлении других констант или границ типа диапазона.

Описание типизированной константы с простым типом:

const

Maximum : integer = 9999;

Factor : real = -0.1;

Breakchar : char = #3;

Описание типизированной константы строкового типа:

const

Heading : string[7] = 'Section';

NewLine : string[2] = #13#10;

TrueStr : string[5] = 'Yes';

FalseStr : string[5] = 'No';

Файлы

Файл с точки зрения программирования – это структурированный тип данных, где элементы имеют один тип и одну длину, и хранятся на внешнем носителе. Размерность файла ограничена только свободным пространством диска. Файлы бывают типизированные и не типизированные. В программе конкретный файл, находящийся на диске, представляет файловая переменная, которая описывается следующим образом:

var

<файловая переменная>: file;

< файловая переменная >: file of <тип элементов>;

< файловая переменная >: text;

Пример:

var

f1: file;

f2: file of integer;

f3: text;

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

Количество элементов, хранящихся в данный момент в файле, называется текущей длиной файла. Для доступа к элементам файла используют специальную величину, которая называется указателем файла. Указатель файла – это специальная ячейка памяти, которая хранит адрес элемента файла, предназначенного для текущей обработки. Указатель файла в программе явно не указывается.

Любые файлы могут быть доступны программе только после выполнения специальной процедуры открытия файла. Эта процедура связывает раннее объявленную файловую переменную с именем файла на диске.

Это связывание осуществляется с помощью встроенной процедуры.

Assign (<файловая переменная>; <имя файла на диске>:string);

Assign (f2, ‘c:\ студенты \ гр 248. dat’);

Файл открыть можно только по чтению или только по записи. Чтобы открыть файл для записи используют процедуру Rewrite с параметром файловой переменной.

Rewrite (f2);

Данная процедура создает новый файл с указанным именем и если файл с указанным именем уже существует, то информация теряется без предупреждения, указатель восставляется на первый элемент с номером ноль.

Чтобы открыть файл для чтения используют процедуру Reset с параметром файловой переменной.

Пример:

Reset (f2);

Указатель файла восставляется на первый элемент и открыть для чтения можно только уже существующий файл. В противном случае выдается ошибка и программа завершает работу аварийно.

Записать информацию в файл можно следующим образом:

Write (<файловая переменная>,<элементы оперативной памяти>);

Пример:

Write (f2, A);

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

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

Read (<файловая переменная>, <элементы оперативной памяти>);

Пример:

Read (f2, B);

После выполнения всех работ над данными файла файл необходимо закрыть, в противном случае вся информация теряется. Закрыть файл можно с помощью процедуры Close.

Close (<файловая переменная>);

Пример:

Close (f2);

Уничтожить файл можно с помощью процедуры Erase. Уничтожить можно только закрытый файл.

Erase (<файловая переменная>);

Пример:

Erase (f2);

Переименовать файл можно с помощью процедуры Rename.

Rename (<файловая переменная>, <новое имя файловой переменной>: string);

Пример:

Rename (f2, f7: string);

Переместить указатель файла на элемент с нужным номером можно с помощью процедуры Seek.

Seek (<файловая переменная>, <номер элемента>);

Пример:

Seek (f2, 4);

Чтобы определить длину файла используют функцию Filesize.

Filesize (<файловая переменная>);

Пример:

Filesize (f2);

Чтобы определить местонахождение указателя файла используют функцию Filepos.

Filepos (<файловая переменная>);

Пример:

Filepos (f2);

Чтобы определить находиться ли указатель файла на маркере конца файла используют функцию Eof. Значение функции равно true. Если указатель файла находиться сразу за последним элементом файла, или равно false, если в любом другом месте.

Eof (<файловая переменная>);

Пример:

Eof (f2);

Обычно эта функция используется в конструкции:

While not Eof (f2) do

Begin

…………

End;

Чтобы иметь возможность после неправильного ввода имени файла при открытии для чтения ввести нужное Ия файла используют функцию Ioresult, которая возвращает число являющееся условным признаком последней операции ввода-вывода. Если операция завершилась успешно, функция возвращает значение равное нулю. Значение функции доступно, если отключен автоматический контроль ошибок ввода-вывода. Он отключается указанием директиву компилятора следующим образом:

{$I-} - выключить

{$I+} – включить.

Programma BASKET;

Type

Spisok = record

FIO: string [50];

ROST: integer;

Ves: integer;

God: integer;

End;

F: file of spisok;

Stud: spisok;

NR: byte;

Procedure sozd;

Var

Fname: string[50];

I: byte;

N: byte;

Begin

Write (‘введите имя файла’);

Readln (Fname);

Assign (F,Fname);

Rewrite (F);

For i:=1 to 28 do begin

Writeln (‘введите ФИО’);

Readln (stud.FIO);

Writeln (‘введите рост, вес, год рождения’)

Readln (stud.ROST, stud.ves, stud.GOD);

Write (F,stud);

End;

Procedure dob;

Var

Fname: string [50];

Otv:char;

Begin

{$I-}

Repeat

Write (‘введите имя файла’);

Readln (Fname);

Assign (F, Fname);

Reset (F);

Until IO result = 0;

{$I+}

0 = ‘Y’

Seek (F, filesize(F));

While (otv = ‘Y’) or (otv = ‘Y’) do begin

Write (‘введите FIO’);

Readln (stud.FIO);

Writeln (‘введите рост, вес, год рождения’)

Readln (stud.ROST, stud.ves, stud.GOD);

Write (F,stud);

Write (‘будете вводить еще?’);

Read (otv);

Close (F);

End;

Procedure poisk;

Var

Fname:string [50];

Otv: char;

Begin

{$I-}

Repeat

Write (‘введите имя файла’);

Readln (Fname);

Assign (F, Fname);

Reset (F);

Until IO result = 0;

{$I+}

0 = ‘Y

Writeln (‘список студентов, чей рост >170’);

While not EOF (F) do begin

Read (F, stud);

If stud.ROST > 170 then

Writeln (stud.FIO,’ ‘, stud.ROST,’ ‘, stud.god);

End;

Close(F);

Readln;

End;

{основная программа}

Begin

While 1=1 do

Begin

Writeln (‘1.создание файла’);

Writeln (‘2.добавление в файл’);

Writeln (‘3.поиск рост >170’);

Writeln (‘4.выход из программы’);

Writeln (‘выберите номер работы’);

Readln(NR);

Case NR of

1:sozd;

2:dob;

3:poisk;

4:exit;

End;

End;

End.