Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции+Pascal.doc
Скачиваний:
28
Добавлен:
02.12.2018
Размер:
647.17 Кб
Скачать

9.3 Параметры

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

Параметры могут иметь любой тип, включая структурированный. В Pascal различают два метода передачи параметров:

  • по значению;

  • по ссылкам.

9.3.1 Параметры – значения

Изменение формальных параметров не влечет за собой изменения фактических параметров. Это основная причина использования таких параметров, так как позволяет устранить несанкционированное изменение собственного параметра программы. Однако передать информацию из подпрограммы в основную программу с помощью таких параметров также нельзя. Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие – типом.

Procedure Konc(A,B,C:Integer;D:Real);

Function Doc(S1,S2:Real):Real;

Запись

Procedure Okl((M:array[1..12] Of Integer); - ошибочна

Необходимо тип переменной определить ранее в разделе описания типов блока:

Type Massiv=array[1..12] Of Integer;

Procedure Okl((M:Massiv);

Пример. Функция вычисления максимального элемента в массиве.

Type

Tarr=Array[1..100] Of Integer;

Var

Massiv:Tarr;

Maxim:Integer;

Function Max(Mas:Tarr;N:Byte):Integer;

{Определение максимального элемента}

Var

Ma:Integer;

I:Byte;

Begin

Ma:=Mas[1];

For I:=2 To N Do

If Ma<Mas[I] Then Ma:=Mas[I];

Max:=Ma;

End;

Теперь, например, для определения максимального числа из первых пяти чисел массива Massiv и записи его в переменную Maxim можно записать оператор:

Maxim:=Max(Massiv,5);

9.3.2 Параметры - переменные

Любое изменение формального параметра означает изменение фактического параметра. Для описания параметров-переменных служит слово Var. Действие слова Var распространяется до ближайшей точки с запятой, т.е. в пределах одной группы.

Procedure MaxMin(A:Tarr; Var Max,Min: Real; C:Integer);

Max, Min – параметры-переменные, A,C – параметры-значения.

Пример. Функция вычисления максимального элемента в массиве.

Function Max(Var Mas:Tarr;N:Byte):Integer;

{Определение максимального элемента}

Var

Ma:Integer;

I:Byte;

Begin

Ma:=Mas[1];

For I:=2 To N Do

If Ma<Mas[I] Then Ma:=Mas[I];

Max:=Ma;

End;

При такой передаче параметра, возможно его нежелательное изменение.

Демонстрационный пример.

Var

A, B: Byte;

K, N: Integer;

I1,I2,J1,J2:Integer;

Procedure WW1;

Begin

A:=A+4; {Глобальная переменная}

End;

Procedure WW2(Var R,T:integer); {Процедура передает в программу значения R,T}

Begin {R,T- параметры-переменные}

R:=555;

T:=666;

End;

Procedure WW3(R1,R2:integer; Var X1,X2:Integer); {R1,R2-принимает}

Begin {X1,X2-передает}

X1:=R1+R2;

X2:=R1*R2;

End;

Begin

A:=9;

WriteLn(A:5);

WW1;

WriteLn(A:5);

WW2(K,N); {в K,N содержатся результаты работы процедуры WW2}

WriteLn(K:5,N:5);

J1:=23; J2:=178;

WW3(I1,I2,J1,J2); {Значения I1,I2 передаются в процедуру}

WriteLn(J1:5,J2:5); {J1,J2 – принимаются из процедуры}

End.

Задания для самостоятельной работы

  1. Вычислить арифметическое выражение Y=A*B-tgA . Использовать функцию для:

  • вычисления функции tg;

  • умножения двух чисел, используя только операцию сложения.

  1. Длины отрезков заданы координатами концов. Найти самый длинный отрезок. Для нахождения длины отрезка использовать функцию.

  2. Дан массив целых чисел, состоящий из 10 элементов. Заполнить его с клавиатуры. Найти:

  • сумму отрицательных элементов. Сумму отрицательных элементов передать в основную программу, используя параметр-переменную.

  • количество тех элементов, значения которых положительны и не превосходят заданного числа А. Значение А задать в основной программе, в процедуру передать это значение;

  • номер последней пары соседних элементов с разными знаками.

Массив заполнить в основной программе, в процедуры массив передать. Обработку элементов массива произвести в отдельных процедурах.

  1. Дан массив целых чисел, состоящий из 10 элементов. Заполнить его с клавиатуры. Найти:

  • сумму элементов, имеющих нечетное значение;

  • вывести индексы тех элементов, значения которых больше заданного числа А. Значение А задать в основной программе, в процедуру передать это значение;

  • количество положительных элементов, кратных К. (К вводится с клавиатуры). Количество положительных элементов передать в основную программу, используя параметр-переменную.

Массив заполнить в основной программе, в процедуры массив передать. Обработку элементов массива произвести в отдельных процедурах.

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

  • сумма цифр;

  • первая цифра;

  • количество делителей;

  • сумма всех делителей.

Вычисление данных значений произвести с использованием функций.

6. Дано n целых чисел. Написать программу подсчета чисел, в записи которых нет цифры 8. при этом требуется использовать функцию вида

Function Yes8(x:LongInt):Boolean;

Ответ: 729.

7. Составить программу перестановки значений переменных a, b, c в порядке возрастания, т.е. так, чтобы a<=b<=c.

Файлы

Вывод в файл

Язык Pascal позволяет сохранить результаты работы программы в файл на диске компьютера.

Существует два метода доступа к информации, хранящейся в файлах:

  • последовательный доступ;

  • прямой доступ.

Файлы последовательного доступа наиболее просты как в организации, так и в работе с ними. Записи обрабатываются последовательно одна за другой. Подобные файлы легко просматриваются на экране, используя любой простейший редактор.

Объявление файла

Формат:

Имя: file of <тип элемента>;

Например:

Res: file of char; {файл символов}

или

Res: text; {файл символов}

Koef: file of real; {файл вещественных чисел}

F: file of integer; {файл целых чисел}

Назначение файла

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

Формат:

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

Имя файла может быть полным (указание пути к файлу и имени файла) или с указанием только имени файла.

Например:

Assign(f,’a:\result.txt’);

Fname:=’otcet.txt’;

Assign(f,fname);

Процедуры вывода в файл

Вывод в текстовый файл осуществляется при помощи процедур write и writeln.

Формат:

Write(<имя файловой переменной>,<список выводимых значений>);

Например:

Write(f,’Корни уравнения:’,x1,x2);

Открытие файла для вывода

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

  • перезапись (запись нового файла поверх существующего или создание нового файла);

  • добавление в существующий файл.

Формат в режиме перезаписи:

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

Формат в режиме добавления:

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

Например:

1.создание нового файла.

Var

F:text;

I:integer;

Begin

Assign(f,’test.txt’);

Rewrite(f); {открытие в режиме перезаписи}

For i:=1 to 5 do

Writeln(f,’Строка ’,i:2);

Close(f); {закрыть файл}

End.

В результате выполнения программы на диске появится файл с именем test.txt.

2. запись в файл в режиме добавления.

Var

F:text;

I:integer;

Begin

Assign(f,’test.txt’);

append(f); {открытие в режиме добавления}

For i:=6 to 8 do

Writeln(f,’Строка ’,i:2);

Close(f); {закрыть файл}

End.

Ошибки открытия файла

Выяснить, завершилась ли успехом процедура открытия файла, можно, проверив значение функции IOResult (результат ввода/вывода). Функция IOResult() возвращает 0, если операция ввода/вывода завершилась успешно, в противном случае – не ноль. Однако чтобы программа могла проверить результат выполнения операции ввода/вывода, нужно разрешить ей это делать, добавив перед вызовом процедуры открытия файла строку {$I-}. После инструкции открытия файла следует поместить {$I+}.

Например:

Assign(f,’test.txt’);

{$I-}

Append(f); { открытие в режиме добавления }

{$I+}

If IOResult<>0 then {если файла нет}

rewrite(f); {создать новый}

Пример. Решение квадратного уравнения и вывод результатов в файл.

var

a,b,c,x1,x2:real; {Коэффициенты и корни уравнения}

d:real; {дискриминант}

f:text; {файл для вывода результатов работы программы}

i:integer;

begin

writeln('Введите значения коэффициентов в одной строке');

readln(a,b,c);

assign(f,'c:\result.txt');

append(f);

writeln(f,'Решение квадратного урафнения');

writeln(f,'Коэффициенты уравнения:',a:6:1,b:6:1,c:6:1);

d:=b*b-4*a*c;

if d>=0 then begin

x1:=-b+sqrt(d)/(2*a); x2:=-b-sqrt(d)/(2*a);

writeln(f,'Корни уравнения:',x1:6:1,x2:6:1);

end;

if d<0 then

writeln(f,'Корней нет');

for i:=1 to 4 do

write(f,i:3);

close(f); {закрываем файл}

end.

Ввод из файла

Язык Pascal позволяет вводить исходные данные для программы не только с клавиатуры, но и из текстового файла.

Открытие файла

Открытие файла для ввода (чтения) выполняется вызовом процедуры reset, имеющей один параметр – файловую переменную.

Формат:

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

Например:

Assign(f,’c:\data.txt’);

Reset(f);

Если имя файла указано неверно, т.е. файла с таким именем нет на диске, то возникает ошибка времени выполнения программы. Как и при открытии файла для добавления, программа может взять на себя задачу обработки возможной ошибки при открытии файла, используя функцию IOResult.

Пример. Демонстрация использования функции IOResult при открытии файла.

Label fin;

Var

F:text;

Fname: string[80]; {имя файла}

Res: integer; {результат открытия файла}

Otv: char; {ответ на предложение повторить попытку открыть файл}

Begin

Fname:=’a:\test.txt’;

Assign(f,fname);

Repeat

{$I-}

Reset(f); {открыть файл для чтения}

{$I+}

Res:= IOResult;

If res<>0 then begin

WriteLn(‘ОШИБКА: файл ’,fname,’ не найден или диск не готов’);

WriteLn(‘Повторить попытку?(д/н)-> ’);

Readln(otv);

End;

Until (res=0) or (otv=’н’);

If res<>0 then goto fin;

{здесь операторы программы}

Fin:

End.

Чтение из файла

Чтение из файла выполняется при помощи процедур read и readln.

Формат:

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

ReadLn(<имя файловой переменной>,<список переменных>);

Имена переменных разделены запятыми.

Чтение чисел

Следует помнить, что в текстовом файле находятся не числа, а их изображения. Действие процедур read и readln состоят из двух:

  • из файла читаются символы до появления разделителя (пробела или конца строки)

  • прочитанные символы, являющиеся изображением числа, преобразуются в число, и полученное значение присваивается переменной.

Отличие процедуры ReadLn от Read в том, что при считывании последнего числа процедурой ReadLn происходит переход к следующей строке файла.

Например, пусть файл ishod.txt такой:

12 5 97 10

15 5 97 12

Во время выполнения программы

Var

F:text;

a,b,c:integer;

Begin

Assign(f,’ishod.txt’);

Reset(f);

Read(f,a);

Readln(f,b);

Read(f,c);

End.

Переменная а получит значение 12, b-5, c-15.

Если при чтении значения переменной в файл вместо изображения числа будет какая-то последовательность символов, то происходит ошибка.

Чтение строк

В программе строковая переменная может быть описана с указанием длины или без. Например: str1:string[10] или str2:string. При чтении из файла значения строковой переменной, длина которой явно задана в описании переменной, из файла читается столько символов, сколько указано в описании, но не больше, чем в оставшейся непрочитанной части текущей строки.

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

Пусть текстовый файл gioups.txt содержит строки:

Beatles Paul Mc'Cartney

Beatles John Lennon

Описание переменных и инструкции чтения из файла

Значения переменных после чтения из файла

group:string[8];

f_name:string[5];

l_name:string[6];

read(f,group,f name, 1_ name);

group='Beatles '

f_name='Paul '

l_name=’Mc'Car’

group:string;

f_name:string;

l_name:string;

read(f,group,f_name,l_name) ;

group= ‘Beatles Paul Mc'Cartney’

f_name=’’

l_name=’’

group:string!8] ;

f_name:string[ 8 ] ;

l_name:string i 8] ;

read(f,group,f_name,l_name)

group='Beatles '

f_name='Paul Mc’’

l_name=’Cartney’

group:atring[8] ;

f_namer:string[5] ;

l_name:string[6] ;

readln(f,group) ;

readln(f,f_name,l_name);

group='Beatles '

f_name=’Beatl’

l_name=’es Joh’

В следующей таблице приведены описания переменных, инструкции чтения из файла groups.txt и значения переменных после выполнения инструкций чтения.

Конец файла

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

250 Чтение лекций

1000 Гонорар за книгу

120 Доход по акциям ГАЗПРОМ

Пусть нужно вычислить суммарный доход. Решение задачи довольно оче­видно: открыть файл, прочитать число из первой строки и добавить его к сумме, прочитать число из второй строки и добавить его к сумме и т. д. После прочтения последней строки вывести результат.

Но как определить, что прочитана последняя строка, или, другими словами, достигнут конец файла?

Для этого нужно проверить значение, возвращаемое функцией eof (End Of File — коней файла), описание которой выглядит так:

Формат:

function E0F(имя файловой переменной);

У функции eof один параметр — файловая переменная. Функция eof воз­вращает true, если достигнут конец файла, иначе — false.

Например. Чтение из файла с использованием функции eof {rdfromf.pas)

program rdfromf; var

f:text; {файловая переменная}

incom:real; {доход-значение из очередной строки файла}

sum: real; {суммарный доход}

begin

assign(f,'incom.txt’);

{$I-}

reset(f); {откроем для чтения}

if IOResult=0 then begin

sum: =0;

writeln('Чтение данных’);

while not EOF(f) do {пока не достигнут конец файла}

begin

readln(f,incom);

sum: =sum+incom;

end;

close(f);

writeln('Суммарный доход: ' ,sum:ll:2);

end

else writeln('Ошибка открытия файла.');

end.

Обратите внимание: значение eof проверяется перед каждым чтением, в том числе и перед первым. Перед первым чтением eof проверяется, так как хотя открываемый файл может существовать на диске, он может быть пустым (не содержать строк).

Пример 1.

Хоккейные команды "Черные ястребы" и "Красные крылья" хранят в последовательных файлах имена всех своих двенадцати нападающих, число заброшенных ими шайб, сделанных голевых передач и заработанное штрафное время.

  • Создайте файлы Black.dat и Red.dat, содержащие информацию о каждой из двух команд.

uses crt;

var

fam:string[10];

s,t:integer;

f,f1:text;

i:integer;

begin

clrscr;

assign(f,'c:\Black.txt');

assign(f1,'c:\Red.txt');

rewrite(f);

rewrite(f1);

for i:=1 to 5 do begin

readln(fam,s,t);

writeln(f,fam:10,s:4,t:4);

end;

for i:=1 to 5 do begin

readln(fam,s,t);

writeln(f1,fam:10,s:4,t:4);

end;

close(f);

close(f1);

end.

Ваша программа по данным, извлеченным из этих файлов, должна создавать новый файл Allstars.dat, в котором содержались бы имя, команда и сумма очков (голы и передачи) для шести лучших игроков обеих команд. Пусть имена и показатели результативности хок­кеистов выводятся на экран.

uses crt;

var

fam:string[10];

s,t:string[4];

pp:string;

m:array[1..10,1..3] of string;

f,f1:text;

i,j,a,cod:integer;

begin

clrscr;

assign(f,'c:\Black.txt');

assign(f1,'c:\Red.txt');

reset(f);

reset(f1);i:=1;

while not eof(f) do begin

readln(f,fam,s,t);

m[i,1]:=fam;

m[i,2]:=s;

m[i,3]:=t;

inc(i);

end;

while not eof(f1) do begin

readln(f1,fam,s,t);

m[i,1]:=fam;

m[i,2]:=s;

m[i,3]:=t;

inc(i);

end;

for i:=1 to 9 do

for j:=i+1 to 10 do

if m[i,2]<m[j,2] then begin

pp:=m[i,1]; m[i,1]:=m[j,1]; m[j,1]:=pp;

pp:=m[i,2]; m[i,2]:=m[j,2]; m[j,2]:=pp;

pp:=m[i,3]; m[i,3]:=m[j,3]; m[j,3]:=pp;

end;

for i:=1 to 6 do begin

for j:=1 to 3 do

write(m[i,j]);

writeln;

end;

end.

Задания для самостоятельной работы

1. Школе необходим последовательный файл для учета выпускников.

  • Создайте для канцелярии последовательный файл по учету выпускников. Храните в нем фамилию, имя, год выпуска, любимый вид спорта и нынешний род занятий выпускника. Для образца составьте файл на десять человек.

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

2. Компьютерная фирма ведет файл со сведениями о двадцати своих сотрудниках.

  • Создайте последовательный файл, содержащий имя и адрес каждого сотрудника (с указанием улицы, дома, квартиры и почтового индекса).

  • По содержимому файла напечатайте почтовые адреса для рассылки чеков еженедельной заработной платы.

3. Гидрометцентр ведет статистику выпадения снега по регионам, для каждого из которых заведен последовательный файл. Во всех файлах присутствуют три элемента данных: имя метеоролога, название региона, количество выпавшего за зиму снега в мм.

  • Напишите программу ввода данных, заполните файлы для трех регионов.

  • Просмотрите все три файла и подсчитайте средний уровень снежных осадков по трем областям. Результат выведите на экран.

4. Налоговая инспекция поощряет налогоплательщиков, вносящих подоходный налог до истечения апрельского контрольного срока, делая им скидку.

  • Создайте файл, в котором содержались бы имена, сведения о сроках уплаты и размере налога для каждого налогоплательщика (ограничьтесь группой из шести человек).

  • Пусть ваша программа читает файл и делает скидку в 10% для тех, кто уплатил налог досрочно, а также выводит на экран их имена и размер скидки в рублях.

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

  • Напишите программу, которая создала бы последовательный файл контрагентов.

  • Напишите программу, которая создала бы два последовательных файла с именами Good.dat и Bad.dat соответственно для фирм с высокой и низкой кредитоспособностью.

  • Пусть ваша программа спрашивает у бухгалтера, какой из двух спи­сков ему представить, а затем выдает названия фирм и их местоположение из соответствующего файла.

6. Предположим, адвокат Михаил Бурщевский с помощью компьютера ведет учет своих клиентов и их дел.

  • Напишите программу, которая позволяла бы ему вводить в последовательный файл следующие сведения: имя клиента, обвинение, ис­ход дела.

  • Клиент Мицкевич "из огня попадает в полымя". Напишите программу, которая заменяла бы неопределенное решение суда на "Проиграно".

  • Напечатайте обновленный файл.

Таблица. Исходные данные задачи

Имя клиента Обвинение Исход дела

Сердюков Клевета Выиграно

Прохоров Оскорбление Проиграно

Мицкевич Поджог ?????

Максимова Взлом Выиграно

Лермзн Взятка Проиграно

7. Хоккейные команды "Черные ястребы" и "Красные крылья" хранят в последовательных файлах имена всех своих двенадцати нападающих, число заброшенных ими шайб, сделанных голевых передач и заработанное штрафное время.

  • Создайте файлы Black.dat и Red.dat, содержащие информацию о каждой из двух команд.

  • Ваша программа по данным, извлеченным из этих файлов, должна создавать новый файл Allstars.dat, в котором содержались бы имя, команда и сумма очков (голы и передачи) для шести лучших игроков обеих команд. Пусть имена и показатели результативности хок­кеистов выводятся на экран.

8. Имена и адреса всех, кто обращается за информацией в фирму, попа­дают в список рекламной рассылки.

  • Создайте основной файл Master.dat из десяти записей в качестве списка рассылки и меньший файл Family.dat из пяти записей для вновь обратившихся с запросами в фирму. Добавьте данные из второго файла в конец первого.

  • Напишите программу, которая случайным образом выбирала бы из основного файла одну запись и посылала бы адресату письмо с уведомлением о выигрыше приза.

9. Инспектор колледжа ведет файл академических занятий студентов.

• Создайте последовательный файл и заполните его фамилиями, на званиями академических курсов и оценочным коэффициентом студентов. Воспользуйтесь данными, перечисленными в табл. 4.5.

Таблица. Исходные данные

Фамилия студента Курс Оценочный

коэффициент

Югов Программирование 78

Северов Японский язык 91

Западов Психология 56

Востоков Психология 45

Зюйдов Корейский язык 39

Вестов Программирование 66

Полюсов Психология 90

Выберите "умных" студентов, т. е. тех, кто имеет оценку выше 88, и запишите сведения о них в файл Best.dat. Пусть программа помогает инспектору формировать на основе этого файла группы углубленного обучения. По названию курса она должна выдавать список «умных» студентов, зачисленных в такую группу.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]