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

11.3. Примеры

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

Задача:

Данные о служащих содержат фамилию и оклад.

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

Ограничение: число служащих не больше 10-ти.

Порядок ввода данных:

  • число служащих;

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

Порядок вывода результата:

  • после строки "Результат: " – фамилии служащих, имеющих оклад выше среднего на отдельных строках.

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

Data

Name

Name

...

Name

...

Name

Salary

Salary

Salary

Salary

Sum

[1]

[2]

[i]

[N]

Здесь

  • Data – массив записей, каждая из которых состоит из двух полей (Name, Salary) и содержит сведения об одном служащем;

  • Sum – переменная, в которой будет записана сумма окладов всех служащих.

Для этого в тексте программы надо поместить следующее объявление типа TData:

Frame178

И, в соответствии с приведенным объявлением типа, объявим следующие переменные:

Frame179

Теперь можно приступить к разработке алгоритма. Вначале приведем укрупненный алгоритм на псевдокоде:

Frame180

Ввод сведений об одном служащем будем производить в отдельной подпрограмме, оформив ее как функцию с именем ReadData. Текст функции приведен на следующей странице.

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

Frame181

Продолжение

Frame182

Теперь приведем текст программы, решающей основную задачу.

Frame183

Продолжение

Frame184

Вызов подпрограммы-функции в программе производится в операторе

ReadResult := ReadData(Data[i]);

Здесь Data[i] – фактический параметр функции ReadData. В него возвращается прочитанная запись о служащем.

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

Здесь приведем только текст процедуры и оператор вызова ее в программе. Остальные операторы программы полностью совпадают с приведенными выше. А вызов процедуры в программе оформляется отдельным оператором вида:

ReadData(Data[i], ReadResult);

Текст процедуры приведен на следующей странице.

Вопросы для самоконтроля

  1. Какой вид имеет структура описания процедуры и функции?

  2. B чем состоит отличие описания процедуры и функции?

  3. Что такое область действия идентификатора?

  4. Каковы основные правила определения области действия для идентификаторов процедур и функций?

  5. Какие параметры называются формальными, и какие – фактическими?

  6. По каким признакам различаются параметры?

  7. Какие способы передачи параметров реализованы в Turbo Pascal?

  8. Каковы правила передачи параметров по значению?

  9. Каковы правила передачи параметров по ссылке?

Текст процедуры:

{ Процедура ввода записи о служащем }

{ Формат строки ввода: }

{ <фамилия><пробел><оклад> }

{ Результаты функции - код ошибки при вводе ( 0 или 1 ) }

{ При отсутствии ошибки в переменной Rec возвращаются }

{ сведения о сотруднике. }

{ }

procedure ReadData(var Rec: Tdata; var ErrorCode: Integer);

var

S: string[80];{ строка ввода }

P: integer;{ номер позиции в строке }

SalaryS: string[10];{ строка, содержащая оклад }

begin

readln(S);

if S = '' then {Строка пустая}

ErrorCode := -1

else begin

P := Pos(' ',S);

if P = 0 then {Пробела нет}

ErrorCode := 1

else begin

Rec.Name := Copy(S, 1, P-1);

SalaryS := Copy(S, P+1, 255{до конца строки});

Val(SalaryS, Rec.Salary, ErrorCode);

if ErrorCode <> 0 then {Ошибка}

ErrorCode := 1

else

ErrorCode := 0;

{end if}

end; {if}

end;

end;