
- •Тема 2.2. Основные понятия языка программирования высокого уровня Free Pascal
- •Системы программирования
- •Интегрированная среда разработки FreePascal
- •Введение в язык Паскаль Характеристика языка программирования Паскаль
- •Основные понятия технологии программирования
- •Алфавит языка Паскаль
- •Структура программы на Паскале
- •Типы данных
- •Стандартные типы данных
- •Структуры данных
- •Строковый тип
- •Структурированные переменные
- •Представление основных структур программирования на языке Паскаль Операции и выражения
- •Арифметические операции и выражения
- •Логические операции
- •Оператор присваивания
- •Составной оператор
- •Условный оператор
- •Процедура write
- •Процедура ввода
- •Оператор выбора
- •Операторы повторений
- •Оператор цикла с предусловием
- •Оператор цикла с постусловием
- •Оператор цикла с параметром
- •Метки и операторы перехода
- •Работа с массивами
- •Операции над строками
- •Функция Length
- •Функция Upcase
- •Функция Сopy
- •Функция Pos
- •Процедуры Insert и Delete
- •Процедура Str
- •Процедура val
- •Практические примеры работы со строковыми данными
- •Оператор присоединения with
- •Процедуры и функции Паскаля
- •Формальные и фактические параметры
- •Типизированные константы
- •Interface
- •Implementation
- •Interface
- •Interface
- •Implementation
- •Файловый тип данных Типизированные файлы
- •Текстовые файлы
Оператор присоединения with
Чтобы упростить доступ к полям записи, в Паскале введен специальный оператор присоединения, который записывается следующим образом:
with <переменная>do <оператор>
Здесь with,do – зарезервированные слова (с, делать);
<переменная> – имя переменной типа запись, за которой может следовать список вложенных полей;
<оператор> – любой оператор Паскаля.
Оператор withслужит для упрощения формы записи: в операторе, стоящем послеdo, можно использовать имена полей в качестве обычных переменных, при этом имя переменной-записи присоединяется автоматически. Например,
with pers do name := ‘Иванов’;
with pers.birthday do
begin day := 12; month := 6; year := 1967 end;
Пример.Написать программу, которая вводит массив записей и затем выводит его на экран в виде таблицы. Каждая запись должна содержать следующие поля: фамилию, дату рождения (число, месяц, год) и место рождения (город). Количество записей - до 5.
Решение.Для наглядности введем дополнительный тип данных, представляющий дату и включающий три поля: число, месяц, год (в рамках данной задачи это, строго говоря, необязательно). Тогда основной тип данных будет представлять собой запись со следующими полями: фамилия (строка символов длиной до 20), дата рождения (запись типа дата) и место рождения (строка символов длиной до 20). Фактическое количество записей в массиве будем вводить с клавиатуры. Программа логически делится на две части – ввод и вывод данных. Ввод трудностей не представляет, достаточно попросить пользователя ввести по очереди все поля каждой записи. Для этого подходит циклическая структура типаfor. Вывод реализовать немного сложнее, поскольку последовательный вывод значений полей не образует таблицу. Здесь возможны два варианта – использовать сложный форматный вывод данных с учетом фактической длины строк типаstring, либо позиционирование курсора с помощью процедур и функций модуляCRT. Второй путь проще и дает больше возможностей. Действительно, можно очистить экран, а затем перед выводом очередного поля позиционировать курсор в нужную позицию текущей строки. Чтобы таблица выглядела красиво, нужно еще вывести ее заголовок (шапку) перед циклом вывода данных, а также правильно рассчитать позиции на экране. Текст программы с использованием модуляCRTприведен ниже.
programtest_rec;
{ Программа иллюстрирует работу с данными типа запись }
Uses Crt;
type { объявление типа date }
date = record
day: 1..31;
month: 1..12;
year: word
end;
person = record { объявление типа person }
name: string[20];
birthday: date;
city: string[20];
end;
var
pers: array[1..5] of person; { переменная pers – массив из 5-ти записей типа person }
n,i: integer;
begin
ClrScr; { очистка экрана }
writeln('Введите количество записей - до 5');
readln(n);
fori:=1tondo{ цикл ввода записей по полям }
begin
writeln('ввод записи номер ',i);
with pers[i] do
begin
write('Фамилия ');
readln(name);
write('дата рождения - число, месяц, год ');
readln(birthday.day,birthday.month,birthday.year);
write('Место рождения - город ');
readln(city);
end
end;
{ вывод записей на экран с использованием позиционирования }
Clrscr; { очистка экрана }
writeln(' Фамилия Дата рождения Место рождения');
for i:=1 to 60 do write('-'); { вывод строки из «-» }
writeln;
fori:=1tondo { цикл по количеству записей }
with pers[i] do
begin
write(name); {вывод имени }
GotoXY(21,WhereY); { позиционирование курсора на 21 поз-ю текущей строки}
with birthday do
write(day:2,'.',month:2,'.', year:4); { вывод даты рождения }
GotoXY(40,WhereY); { позиционирование курсора на 40 поз-ю текущей строки}
writeln(city); { вывод места рождения }
end;
readln
end.