- •Министерство образования и науки российской федерации
- •Начальный курс программирования на основе алгоритмического языка Паскаль
- •Введение
- •Часть. Основы программирования на Паскале
- •1.1. Структура простейшей Паскаль-программы
- •1.2. Данные и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных
- •1.2.3. Правила записи констант
- •1.2.4. Описание переменных и именованных констант в Паскале
- •1.2.5. Выражения
- •1.3. Операторы преобразования данных
- •1.3.1. Оператор присваивания
- •1.3.2. Понятие ввода и вывода
- •1.3.3. Оператор вывода
- •1.3.4. Оператор ввода
- •1.4. Разработка простейших программ
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Паскале
- •1. Следование
- •2. Ветвление (развилка)
- •If условие then
- •If условие then
- •3. Цикл
- •1.4.5. Примеры разработки программ
- •1.5. Массивы
- •1.5.1. Понятие массива. Основные правила работы с массивами в Паскале
- •1.5.2. Примеры программ с массивами
- •1.614. Структура паскаль-программы
- •Часть.Подпрограммы
- •2.1. Общие сведения о подпрограммах
- •2.2. Процедуры в Паскале
- •2.2.1.Описание процедур
- •2.2.2. Обращение к процедуре
- •2.3. Функции Паскаля
- •2.3.1. Описание функций
- •2.3.2. Обращение к функции
- •2.4. Глобальные и локальные имена
- •2.5. Использование подпрограммы в качестве параметра другой подпрограммы
- •2.6. Модули
- •2.6.1. Общие сведения
- •2.6.2. Структура модуля
- •2.6.3. Использование модулей
- •2.6.4. Модули как средство программирования
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации
- •3.1.1. Символьный тип
- •3.1.2.Строковые типы
- •3.1.3. Подпрограммы, работающие со строками
- •Функции
- •Процедуры
- •3.2. Тип запись
- •3.3. Файлы
- •3.3.1. Общие понятия
- •3.3.2. Файлы в Турбо Паскале
- •3.3.3. Текстовые файлы
- •Пример 1
- •Пример 2
- •3.3.4. Типизированные файлы
- •3.3.5. Нетипизированные файлы
- •Часть IV. Работа с динамическими массивами
- •О статическом и динамическом распределении памяти
- •Указатели в Паскале
- •Динамические массивы
- •Формальные параметры-массивы без указания границ
- •Приложение 1. Краткая инструкция по работе в среде Turbo (Borland) Pascal.
- •Режимы компиляции программы, использующей модули
- •Приложение 2. Краткая инструкция по работе в режиме консольного приложения средыDelphi. Создание консольного приложения
- •Сохранение консольного приложения.
- •Отладка программы
- •Контрольные вопросы
- •Заключение
- •Библиографические ссылки
- •Содержание
- •Часть IV. Работа с динамическими массивами 98
3.2. Тип запись
Пока мы рассматривали одну сложную структуру (сложный тип) - массив; одним из основных свойств массива является однотипность его компонент. Многие информационно-логические задачи связаны с обработкой документов, содержащих в себе информация разного типа (числовую, символьную и т. д.) Примеры таких документов: платежные ведомости (фамилии и имена - символьная информация, денежные суммы - числовая), карточки больных в поликлинике, библиотечная информация. Как обрабатывать такие данные с помощью строковых типов, показано в §3.1.3; при этом приходится выделять подстроки и переводить некоторые из них в число. Для упрощения программирования алгоритмов обработки такой информации необходимо иметь сложный тип, объединяющий разнотипные компоненты. Таким типом в Паскале является запись.
Запись- это переменная, состоящая из фиксированного числа компонент, вообще говоря, разного типа, причем каждая компонента имеет свое имя. Компоненты записи также называютсяполями записи. Сравним два типа - массив и запись. Компоненты массива имеют одинаковый тип; компоненты записи могут иметь разный тип (хотя могут быть и однотипны). Для обращения к элементу массива надо указать его номер (индекс), при обращении к полю записи указывается его имя.
Описание типа запись:
TYPE имя_типа= RECORD
список_1_имен_полей:тип_1;
список_2_имен_полей:тип_2;
. . .
список_N_имен_полей:тип_N;
END;
Например:
TYPE COMPLEX=RECORD{значения переменныx этого типа - комплексные числа}
Re,Im:REAL {действительная и мнимая части}
END;
DATE = RECORD {для описания дат (число, месяц, год)}
Day : 1..31; {число}
Month = (January, February, March, April, May, June, July, August, September, October, November, December); {месяц}
Year : Integer; {год}
END;
BOOK = RECORD {для описания книг в каталоге библиотеки}
Author,Title,Publisher:String;
{автор, название, издательство}
Year,Volume,Pages:Integer;
{год издания,том,количество страниц}
END;
Память, занимаемая записью, равна сумме объемов памяти полей (если исключить из рассмотрения особенности, связанные с выравниванием). В любом случае для определения размера памяти записи можно использовать функцию sizeof(переменная_или_тип).
Для обращения к полю записинадо указать имя записи, а затем, через точку, имя поля. Например:
VAR C:COMPLEX; D,D1:DATE; B:BOOK;
BEGIN . . . C.Re:=5; D.Month:=January; B.Author:='Smith';
{*} D1.Day:=6; D1.Month:=June; D1.Year:=1799;{*} . . .
Чтобы не писать многократно имя записи при работе с ее полями, используется оператор
WITHИмя_записи DOоператор
Три оператора, ограниченные {*}, эквивалентны оператору:
WITH D1 DO
BEGIN Day:=6; Month:=June; Year:=1799
END;
Пример. Ниже приведена программа для задачи §3.1.3, использующая для отображения строки таблицы тип запись (вместо типа строка)
Program Toys;
TYPE SVED=RECORD {тип "запись", описывающий игрушку}
name:String; {название игрушки}
MinAge, MaxAge,Rub:Real;
{возрастные границы и стоимость}
END;
VAR N:Integer; {число наименований игрушек}
Toy:SVED; {переменная, описывающая игрушку}
max:Real; {максимальная стоимость конструктора для детей до 7 лет}
namemax:String; {название искомого конструктора}
i:Integer; {счетчик наименований игрушек}
BEGIN
Writeln(' Введите число наименований игpушек');
ReadLn(N);
max:=0;
For i:=1 to N Do
With Toy Do {работаем с полями записи Toy}
BEGIN
Writeln('Введите название игpушки с номером', i:2);
Readln(name);
Writeln('Введите мин. и макс. возраст и стоимость');
Readln(Minage,Maxage,Rub); {вводим запись по полям}
If ((Pos('констpуктоp',name)>0) or {содержит ли название}
(Pos('Констpуктоp',name)>0)) and {слово "конструктор" }
(MaxAge<=7) Then
If Rub>max Then
BEGIN
max:=Rub;
namemax:=name
END;
END;
If max=0 Then
WriteLn(' Констpуктоpов для детей до семи лет нет')
Else
BEGIN
WriteLn('Cамый доpогой констpуктоp для детей до семи лет');
WriteLn(namemax);
WriteLn('стоит ', max:6:0, ' pублей')
END;
END.
Замечания:
Программа, использующая запись, конечно, алгоритмически проще, чем программа со строками. Платой за упрощение является разрушение структуры таблицы при вводе: строка таблицы распределяется по нескольким строкам экрана монитора компьютера.
Недостатки программы, отмеченные в §3.1.3, имеют место и для этой программы. Они устраняются использованием файлов.