Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПЯВУ Лабы

.pdf
Скачиваний:
12
Добавлен:
12.03.2015
Размер:
389.36 Кб
Скачать

Лабораторная работа №6. Множества, строки и записи

Задание на лабораторную работу

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

Необходимая информация

Множества

Множества – это наборы однотипных логически связанных друг с другом объектов. Характер связей между объектами лишь подразумевается программистом и никак не контролируется Турбо Паскалем. Количество элементов, входящих в множество, может меняться от 0 до 256 (множество, не содержащее элементов, называется пустым). Именно непостоянством количества своих элементов множества отличаются от массивов и записей.

Два множества считаются эквивалентными тогда и только тогда, когда все их элементы одинаковы, причем порядок следования элементов в множестве безразличен. Если все элементы одного множества входят также и в другое, говорят о включении первого множества во второе. Пустое множество включается в любое другое.

Пример определения и задания множеств:

type

DigitChar = set of '0'..'9'; Digit = set of 0..9;

var

s1,s2,s3: DigitChar; s4,s5,s6: Digit;

...

s1:=['1','2','3'];

s2:=['3','2','1'];

s1:=['2','3']; s1:=[0..3,6]; s1:=[4,5]; s1:=[3..9];

...

В этом примере множества s1 и s2 эквивалентны, а множество s3 включено в s2, но не эквивалентно ему. Описание типа множество имеет вид

<имя типа> = set of <базовый тип>;

Здесь <имя типа> – правильный идентификатор; set, of – зарезервированные слова (множество, из);

<базовый тип> – базовый тип элементов множества, в качестве которого может использоваться любой порядковый тип, кроме Word, Integer, Longint.

Для задания множества используется так называемый конструктор множества: список спецификаций элементов множества, отделяемых друг от друга запятыми; список обрамляется квадратными скобками. Спецификациями элементов могут быть константы или выражения базового типа, а также – тип-диапазон того же базового типа.

Над множествами определены следующие операции:

* – пересечение множеств; результат содержит элементы, общие для обоих множеств. Например, s4*s6 содержит [3], s4*s5 – пустое множество.

+ – объединение множеств; результат содержит элементы из первого множества дополненные недостающими элементами из второго множества:

s4+s5 содержит [0,1,2,3,4,5,6]; s5+s6 содержит [3,4,5,6,7,8,9];

- – разность множеств; результат содержит те элементы из первого множества, которые не принадлежат второму: s6-s5 содержит [3,6,7,8,9];

s4-s5 содержит [0,1,2,3,6];

= – проверка эквивалентности; возвращает true, если множества эквивалентны.

<> – проверка неэквивалентности; возвращает true, если множества неэквивалентны.

<= – проверка вхождения; возвращает true, если первое множество является подмножеством второго. >= – проверка вхождения; возвращает true, если второе множество является подмножеством первого.

in – проверка принадлежности; в этой бинарной операции первый элемент – выражение, а второй – множество того же типа; возвращает true, если выражение имеет значение, принадлежащее множеству:

3 in s6 возвращает true;

2*2 in s1 возвращает false;

В следующем примере реализуется алгоритм выделения из первой сотни натуральных чисел всех простых. В его основе (также как и в примере из лабораторной работы №3) лежит прием, известный под названием «решето Эратосфена».

{ Выделение всех простых чисел из первых N целых } const

N = 100;

{Количество элементов исходного множества}

type

 

 

SetOfNumber = set of 1..N:

 

var

 

 

n1,next,i : word;

{Вспомогательные переменные}

BeginSet,

 

{Исходное множество}

PrimerSet : SetOfNumber;

{Множество простых чисел} BEGIN

BeginSet := [2..N];

{Создать исходное множество}

PrimerSet := [1];

{Первое простое число}

Next := 2;

 

{Следующее простое число}

while BeginSet <> [] do

{Начало основного цикла}

begin

 

 

n1:= next;

 

{n1-число,кратное очередному

 

 

простому (next)}

while n1 <- N do

{Цикл удаления из исходного

 

 

множества непростых чисел:}

begin

 

 

BeginSet := BeginSet-[n1];

 

n1 :=n1+next;

{Следующее кратное}

end;

 

{Конец цикла удаления}

PrimerSet := PrimerSet+[next];

 

repeat

{Получить следующее простое, которое есть

 

первое невычеркнутое

из исходного множества}

inc(next)

 

 

until (next

In BeginSet) or (next >

N)

end;

{Конец

основного цикла)

{ Вывод результата: }

 

for i := 1 to

N do

 

if I in PrimerSet then write(i:8); writeln;

END.

Записи

Запись – это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. В отличие от массива, компоненты (поля) записи могут быт различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются.

Структура объявления записи такова: <имя типа>= record <список полей> end;

Здесь <имя типа> – правильный идентификатор; record, end – зарезервированные слова;

<список полей> – список полей; представляет собой последовательность разделов записи, между которыми ставится точка с запятой.

Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификатором (идентификаторами) ставится двоеточие и описание типа поля (полей), например:

Type

Birthday=record

day, month: byte;

year

: word;

end;

 

var

 

a,b: Birthday;

...

В этом примере тип Birthday (день рождения) содержит три поля с именами day, month и year (день, месяц и год); переменные a, b сидержат записи типа Birthday.

Как и в массиве, значения переменных типа запись можно присваивать другим переменным того же типа, например A:=b;

К каждому из компонентов записи можно получить доступ, если использовать составное имя, т.е. указать имя переменной, затем точку и имя поля:

a.day:=27;

b.year:=1939;

Для вложенных полей приходится продолжать уточнения:

var

c: record

name : string; bd : Birthday;

end;

...

if c.bd.year=1939 then ...

Варианты индивидуальных заданий

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

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

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

4.Написать программу, в которой описывается массив записей, хранящий следующую информацию: ФИО автора, название книги, общее количество книг в библиотеке, количество выданных книг, номер шкафа, где хранится книга. Программа должна выполнять следующие действия: ввод данных, по заданным полям «Автор» и «Название» определить возможно ли выдать книгу, если да – указать номер шкафа.

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

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

7.Написать программу, в которой описывается массив записей, хранящий следующую информацию: Наименование товара, цена, количество на складе. Программа должна выполнять следующие действия: ввод данных, вывод на экран «счета» (т.е. наименования товара, количества, стоимости единицы товара и общая стоимость заказа) на заданное количество товара, если он есть на складе.

8.Написать программу, в которой описывается массив записей, хранящий следующую информацию: ФИО сотрудника, почасовая оплата, количество часов. Программа должна выполнять следующие действия: ввод данных (изначально информация записывается в поля "ФИО сотрудника" и " почасовая оплата", поле "количество часов" заполняется нулями), запись количества часов заданному сотруднику, расчет и вывод ведомости на зарплату сотрудникам (т.е. выводится таблица с колонками: ФИО сотрудника, почасовая оплата, количество часов, зарплата за месяц).

Лабораторная работа №7. Процедуры и функции

Задание на лабораторную работу

Размерности массивов следует задать именованными константами. Все необходимые данные должны передаваться подпрограммам в качестве параметров; все величины, используемые только внутри подпрограмм, должны быть описаны как локальные. Использование глобальных переменных в подпрограммах не допускается. Вывод результатов работы подпрограмм должен выполняться в главной программе.

Необходимая информация

Заголовок процедуры имеет вид:

PROCEDURE <имя> [(<сп.ф. п. >)];

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

FUNCTION <имя> [(<.сп.ф.п.>)] : <тип>:

Здесь <имя> - имя подпрограммы (правильный идентификатор); <сп.ф.п-> - список формальных параметров, <тип> - тип возвращаемого функцией результата.

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

Procedure SB (a: real; b: Integer: с: char);

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

Function F (а: real; b: real): real;

можно написать проще:

Function F (a, b: real): real;

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

Рассмотрим следующий пример. В языке Турбо Паскаль нет операции возведения в степень, однако с помощью встроенных функций LN(X) и ЕХР(Х) нетрудно реализовать новую функцию с именем, например, POWER, осуществляющую возведение любого вещественного числа в любую вещественную степень. В следующем примере вводится пара чисел X и У и выводится на экран дисплея результат возведения Х сначала в степень +У, а затем - в степень - У. Для выхода из программы нужно ввести Ctrl-Z и «Ввод».

var

х,у : real;

FUNCTION Power(a,b : real) : real; begin {Power}

if a > 0 then Power := exp(b * In(a)) else

If a < 0 then

Power := exp(b * ln(abs(a))) eIse

if b=0 then Power := 1 else Power := 0 end {Power};

BEGIN {main} repeat

readln(x,y);

wrlteln(power(x,y):12:10, power (x, -у) :15:10) until EOF;

END. {main}

Для вызова функции POWER мы просто указали ее в качестве параметра при обращении к встроенной процедуре WRITELN. Параметры Х и У в момент обращения к функции - это фактические параметры. Они подставляются вместо формальных параметров А и В в заголовке функции и затем над ними осуществляются нужные действия. Полученный результат присваивается идентификатору функции - именно он и будет возвращен как значение функции при выходе из нее. В программе функция POWER вызывается дважды - сначала с параметрами Х и Y, а затем Х и -У, поэтому будут получены два разных результата.

Любой из формальных параметров подпрограммы может быть либо параметром-значением, либо параметромпеременной. В предыдущем примере параметры А и В определены как параметры-значения. Если параметры определяются как параметры-переменные, перед ними необходимо ставить зарезервированное слово VAR, например:

Function Power (var a : real; b : real) : real;

Здесь параметр А – параметр-переменная, а В – параметр-значение. Определение формального параметра тем или иным способом существенно только для вызывающей программы: если формальный параметр объявлен как параметр-переменная, то при вызове подпрограммы ему должен соответствовать фактический параметр в виде переменной нужного типа; если формальный параметр объявлен как параметр-значение, то при вызове ему может соответствовать произвольное выражение.

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

const

а : integer = 5; b : integer = 7;

PROCEDURE lnc2 (var с : Integer; b : Integer);

 

 

begin {Inc2}

 

 

 

 

 

 

с := с + с;

 

 

 

 

 

b := b + b;

 

 

 

 

 

writeln('

удвоенные:', c:5, b:5);

 

 

 

end; {Inc2}

 

 

 

 

 

 

BEGIN {main}

 

 

 

 

 

 

writeln('

исходные:'. a:5, b:5);

 

 

 

lnc2(a,b);

 

 

 

 

 

 

writeln('

результат:', a:5, b:5);

 

 

 

END. {main}

 

 

 

 

 

 

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

 

 

Исходные:

5

7 удвоенные

10

14 результат

10

7

Как видно из примера, удвоение второго формального параметра в процедуре INC2 не вызвало изменения фактической переменной В, так как этот параметр описан в заголовке процедуры как параметр-значение. Этот пример может служить еще и иллюстрацией механизма "закрывания" глобальной переменной одноименной локальной: хотя переменная В объявлена как глобальная (она описана в вызывающей программе перед описанием процедуры), в теле процедуры ее «закрыла» локальная переменная В, объявленная как параметр-значение.

1.

Дана целочисленная прямоугольная матрица. Определить:

1.Количество строк, не содержащих ни одного нулевого элемента (оформить в виде функции).

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

2.

Дана целочисленная прямоугольная матрица. Определить количество столбцов, не содержащих ни одного нулевого элемента (оформить в виде функции).

Характеристикой строки целочисленной матрицы назовем сумму ее положительных четных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик (оформить в виде процедуры).

3.

Дана целочисленная прямоугольная матрица. Определить:

1.Количество столбцов, содержащих хотя бы один нулевой элемент (оформить в виде функции),

2.Номер строки, в которой находится самая длинная серия одинаковых элементов (оформить в виде процедуры).

4.

Дана целочисленная квадратная матрица. Определить:

1.Произведение элементов в тех строках, которые не содержат отрицательных элементов (оформить в виде функции).

2.Максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы (оформить в виде процедуры).

5.

Дана целочисленная квадратная матрица. Определить:

1.Сумму элементов в тех столбцах, которые не содержат отрицательных элементов (оформить в виде функции).

2, Минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы (оформить в виде процедуры).

6.

Дана целочисленная прямоугольная матрица. Определить:

1.Сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент (оформить в виде функции).

2.Номера строк и столбцов всех седловых точек матрицы (оформить в виде процедуры).

ПРИМЕЧАНИЕ

Матрица А имеет седловую точку Ау, если Ау является минимальным элементом в i-й строке и максимальным в j-м столбце.

7.

Для заданной матрицы размером 8x8 найти такие kt что k-я строка матрицы совпадает с k-u столбцом (оформить в виде процедуры).

Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент (оформить в виде функции).

8.

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

Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент (оформить в виде функции).

9.

Соседями элемента Аij в матрице назовем элементы Аkl, где i - 1 k i + 1 , j-1≤ ≤ l j + 1, (k,l)(i,j). Операция сглаживания матрицы дает новую матрицу того же размера, каждый элемент которой получается как среднее арифметическое имеющихся соседей соответствующего элемента исходной матрицы. Построить результат сглаживания заданной вещественной матрицы размером 10х10 (оформить в виде процедуры).

В сглаженной матрице найти сумму модулей элементов, расположенных ниже главной диагонали

(оформить в виде функции).

10.

Соседями элемента Аij в матрице назовем элементы Аkl, где i - 1 k i + 1 , j-1≤ ≤ l j + 1, (k,l)(i,j). Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей (определение соседних элементов см. в варианте 9). Подсчитать количество локальных минимумов заданной матрицы размером 10x10 (оформить в виде процедуры).

Найти сумму модулей элементов, расположенных выше главной диагонали (оформить в виде функции).

11.

Коэффициенты системы линейных уравнений заданы в виде прямоугольной матрицы. С помощью допустимых преобразований привести систему к треугольному виду (оформить в виде процедуры).

Найти количество строк, среднее арифметическое элементов которых меньше заданной величины (оформить в виде функции).

12.

Уплотнить заданную матрицу, удаляя из нее строки и столбцы, заполненные нулями (оформить в виде процедуры).

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

13.

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

14.

Осуществить циклический сдвиг элементов квадратной матрицы размером MxN вправо на k элементов таким образом: элементы первой строки сдвигаются в последний столбец сверху вниз, из него — в последнюю строку справа налево, из нее — в первый столбец снизу вверх, из него — в первую строку; для остальных элементов — аналогично (оформить в виде процедуры).

15.

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

16.

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

Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента (оформить в виде функции).

17.

Путем перестановки элементов квадратной вещественной матрицы добиться того, чтобы ее максимальный элемент находился в левом верхнем углу, следующий по величине — в позиции (2, 2), следующий по величине — в позиции (3, 3) и т. д., заполнив таким образом всю главную диагональ (оформить в виде процедуры).

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

18.

Дана целочисленная прямоугольная матрица. Определить:

1.Количество строк, содержащих хотя бы один нулевой элемент (оформить в виде функции).

2.Номер столбца, в котором находится самая длинная серия одинаковых элементов (оформить в виде процедуры).

19.

Дана целочисленная квадратная матрица. Определить:

1.Сумму элементов в тех строках, которые не содержат отрицательных элементов (оформить в виде функции).

2.Минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы (оформить в виде процедуры).

20.

Дани целочисленная прямоугольная матрица. Определить:

1.Количество отрицательных элементов в тех строках, которые содержат хотя бы один нулевой элемент (Оформить в виде функции).

2.Номера строк и столбцов всех седловых точек матрицы (оформить в виде процедуры).

ПРИМЕЧАНИЕ

Матрица А имеет седловую точку Аij, если Aij является минимальным элементом в i-й строке и максимальным в j-м столбце.

Лабораторная работа №8. Файлы

Задание на лабораторную работу

Добавить к программе из лабораторной работы №6 следующие действия:

сохранение информации в текстовый файл

загрузка информации из текстового файла

сохранение информации в текстовый файл

загрузка информации из текстового файла Оформить все действия в виде процедур.

Необходимая информация

Файловый тип или переменную файлового типа можно задать одним из трех способов:

<имя> = file of <тип>;

<имя> = text;

<имя> = file;

Здесь <имя> – имя файлового типа; file, of – зарезервированные слова; text – имя стандартного типа текстовых файлов; <тип> – любой тип Турбо Паскаля, кроме файлов.

В зависимости от способа объявления можно выделить три вида файлов:

3.типизированные файлы (задаются предложением file of …);

4.текстовые файлы (определяются типом text);

5.нетипизированные файлы (определяются типом file).

Файловая переменная связывается с именем файла в результате обращения к стандартной процедуре Assign: Assign(<ф.п.>,<имя файла>);

Здесь <ф.п.> – файловая переменная; <имя файла> – текстовое выражение, содержащее имя файла.

Далее необходимо инициировать файл. Это означает указать для этого файла направление передачи данных. В Турбо Паскале можно открыть файл для чтения, для записи информации, а также для чтения и записи одновременно.

Для чтения файл инициируется с помощью стандартной процедуры Reset:

Reset(<ф.п.>);

Здесь <ф.п.> – файловая переменная связанная ранее процедурой Assign с уже существующим файлом.

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

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

Стандартная процедура Rewrite(<ф.п.>) инициирует запись информации в файл, связанный ранее с файловой переменной <ф.п.>. Процедурой Rewrite нельзя инициировать запись информации в ранее существовавший файл: при выполнении этой процедуры старый файл уничтожается и никаких сообщений об этом в программу не передаётся. Новый файл подготавливается к приему информации и его указатель принимает значение 0.

Стандартная процедура Append(<ф.п.>) инициирует запись в ранее существовавший текстовый файл для его расширения, при этом указатель устанавливается в его конец. Процедура Append применима только к текстовым файлам, т.е. их файловая переменная должна иметь тип Text. Если текстовый файл ранее уже был открыт с помощью Reset или Rewrite, использование процедуры Append приведет к закрытию этого файла и открытию его вновь, но уже для добавления записей.

Процедура Close(<ф.п.>) закрывает файл, однако связь файловой переменной с именем файла, установленная ранее процедурой Assign, сохраняется.

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

Процедура Rename(<ф.п.>, <новое имя>) переименовывает файл. Здесь <новое имя> – строковое выражение, содержащее новое имя файла. Перед выполнением процедуры необходимо закрыть файл, если он был ранее открыт.

Процедура Erase(<ф.п.>) удаляет файл. Перед выполнением процедуры необходимо закрыть файл, если он был ранее открыт.

Функция EOF(<ф.п.>): Boolean. Логическая функция, тестирующая конец файла. Возвращает true, если файловый указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конец файла, а при чтении – что файл исчерпан.

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

Процедура CLOSE. Закрывает файл, однако связь файловой переменной с именем файла, установленная ранее процедурой ASSIGN, сохраняется. Формат обращения:

CLOSE (<ф.п.>)

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

Процедура RENAME. Переименовывает файл. Формат обращения:

RENAME (<ф.п.>, <новое имя>)

Здесь <новое имя> - строковое выражение, содержащее новое ими файла. Перед выполнением процедуры необходимо закрыть файл, если он ранее был открыт процедурами RESET, REWRITE или APPEND.

Процедура ERASE. Уничтожает файл. Формат обращения:

ERASE(<ф.п.>)

Перед выполнением процедуры необходимо закрыть файл, если он ранее был открыт процедурами RESET, REWRITE

или APPEND.

Текстовые файлы

Процедура READ. Обеспечивает ввод символов, строки чисел. Формат обращения:

READ (<ф.п.>,<сп.ввода>);

или

READ (<сп.ввода>);

Здесь <сп.ввода> - список ввода: последовательность из одной или более переменных типа CHAR, STRING, а также любого целого или вещественного типа.

При вводе переменных типа CHAR выполняется чтение одного символа из файла и присваивание считанного значения переменной. Если перед выполнением чтения указатель файла достиг конца очередной строки. то результатом чтения будет символ CR (ASCII код 13), а если достигнут конец файла, то - символ EOF (код 26). При вводе с клавиатуры символ CR вводится при нажатии на клавишу «Ввод», а символ EOF - при одновременном нажатии клавиш CTRL и Z .

При вводе переменных типа STRING количество считанных процедурой и помещенных в строку символов равно максимальной длине строки, если только раньше не встретились символы CR или EOF. В этом случае сами символы CR и EOF в строку не помещаются. Если количество символов во входном потоке данных больше максимальной длины строки, «лишние» символы до конца строки отбрасываются, а новое обращение к READ возвращает пустую строку. Таким образом, процедура READ не в состоянии прочесть последовательность строк: первая строка будет прочитана нормально, а все последующие окажутся пустыми. Для ввода последовательности строк нужно использовать процедуру READLN (см. ниже).

Процедура READLN. Обеспечивает ввод символов, строк и чисел. Эта процедура идентична процедуре READ за исключением того, что после считывания последней переменной оставшаяся часть строки до маркера EOLN пропускается, поэтому следующее обращение к READLN или READ начинается с первого символа новой строки. Кроме того, эту процедуру можно вызвать без параметра <сп.ввода> (см. процедуру READ), что приведет к пропуску всех символов текущей строки вплоть до EOLN.

Процедура WRITE. Обеспечивает вывод информации в текстовый файл или передачу ее на логическое устройство. Формат обращения:

WRITE(<ф.п.>,<сп.вывода>) или WRITE(<сп.вывода>);

Здесь <сп.вывода> - список вывода: последовательность из одного или более выражений типа CHAR, STRING, BOOLEAN, а также любого целого или вещественного типа.

Файловая переменная <ф.п.>, если она указана, должна быть предварительно описана как переменная типа TEXT и связана с именем файла или логическим устройством процедурой ASSIGN. Если файловая переменная отсутствует, подразумевается вывод в стандартный файл OUTPUT, который обычно связан с экраном ПК.

Любой элемент списка вывода может иметь форму

OutExpr [ : MInWidth [ : DecPlaces ] ]

Здесь OUTEXPR - выводимое выражение;