- •Оглавление
- •1. Основы алгоритмизации 4
- •2. Введение в языки программирования 16
- •3. Программирование на паскале 21
- •4. Методы построения алгоритмов 89
- •Основы программирования Введение
- •1. Основы алгоритмизации
- •1.1. Алгоритмы и величины
- •1.2. Линейные вычислительные алгоритмы
- •1.3. Ветвления и циклы в вычислительных алгоритмах
- •1.4. Вспомогательные алгоритмы и процедуры
- •2. Введение в языки программирования
- •2.1. История и классификация языков программирования
- •2.2. Структура и способы описания языков программирования высокого уровня
- •3. Программирование на паскале
- •3.1. Первое знакомство с Паскалем
- •3.2. Некоторые сведения о системе Турбо Паскаль
- •3.3. Элементы языка Турбо Паскаль
- •3.4. Типы данных
- •3.5. Арифметические операции, функции, выражения. Арифметический оператор присваивания
- •3.6. Ввод с клавиатуры и вывод на экран
- •3.7. Управление символьным выводом на экран
- •3.8. Логические величины, операции, выражения. Логический оператор присваивания
- •3.9. Функции, связывающие различные типы данных
- •3.10. Логические выражения в управляющих операторах
- •3.11. Цикл по параметру
- •3.12. Особенности целочисленной и вещественной арифметики
- •3.13. Подпрограммы
- •3.14. Вычисление рекуррентных последовательностей
- •3.15. Основные понятия и средства компьютерной графики в Турбо Паскале
- •3.16. Строковый тип данных
- •3.17. Табличные данные и массивы
- •3.18. Понятие множества. Множественный тип данных
- •3.19. Файлы. Файловые переменные
- •3.20. Комбинированный тип данных
- •3.21. Указатели и динамические структуры
- •4. Методы построения алгоритмов
- •4.1. Основные понятия структурного программирования
- •4.2. Метод последовательной детализации
- •4.3. Рекурсивные методы
- •4.4. Методы перебора в задачах поиска
- •4.5. Эвристические методы
- •4.6. Сложность алгоритмов
- •4.7. Методы сортировки данных
- •Приложение 1. Турбо Паскаль. Модуль crt
- •Приложение 2. Турбо Паскаль. Модуль graph
- •Список литературы
3.20. Комбинированный тип данных
Все структурированные типы данных, с которыми мы уже познакомились, представляют собой совокупности однотипных величин. Комбинированный тип данных — это структурированный тип, состоящий из фиксированного числа компонент (полей) разного типа. Комбинированный тип имеет еще и другое название — запись.
Обычно запись содержит совокупность разнотипных атрибутов, относящихся к одному объекту. Например, анкетные сведения о студенте вуза могут быть представлены в виде информационной структуры (рис. 35).
Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа Record (запись). Задать тип и описать соответствующую переменную можно следующим образом:
Type Anketa1=Record
FIO: String[50]; {поля}
Pol: Char;
Dat: String[16]; {записи}
Adres: String[50];
Curs: 1..5; (или элементы)
Grup: 1..10;
Stip: Real {записи}
End;
Var Student: Anketa1;
Такая запись, так же как и соответствующее ей дерево, называется двухуровневой.
К каждому элементу записи можно обратиться, используя составное имя, которое имеет следующую структуру:
<имя переменной>.<имя поля>
Например, student. fio; student. dat и т.п. Если, например, требуется полю курс присвоить значение 3, то это делается так:
Student.Curs:=3 ;
Поля записи могут иметь любой тип, в частности сами могут быть записями. Такая возможность используется в том случае, когда требуется представить многоуровневое дерево (более 2 уровней). Например, те же сведения о студентах можно отобразить трехуровневым деревом (рис.36).
Такая организация данных позволит, например, делать выборки информации по году рождения или по городу, где живут студенты. В этом случае описание соответствующей записи будет выглядеть так:
Type Anketa2=Record
FIO: String[50];
Pol: Char;
Dat: Record
God: Integer;
Mes: String[10];
Den: 1..31
End;
Adres: Record
Gorod: String[20];
UlDomKv: String[30];
End;
Curs: 1..5 ;
Grup: 1..10;
Stip: Real
End;
Var Student: Anketa2;
Поля такой записи, находящиеся на третьем уровне, идентифицируются тройным составным именем.
Например, student.Dat.God; student.Adres.Gorod.
Приведем структурограмму задания комбинированного типа (рис.37).
В программе могут использоваться массивы записей. Если на факультете 500 студентов, то все анкетные данные о них можно представить в массиве:
Var Student: Array[1..500] Of Anketal;
В таком случае, например, год рождения пятого в списке студента хранится в переменной student[5].Dat.God.
Любая обработка записей, в том числе ввод и вывод, производится поэлементно. Например, ввод сведений о 500 студентах можно организовать следующим образом:
For I:=1 То 500 Do
With Student[I] Do
Begin
Write('Ф.И.0.:'); ReadLn(FIO);
Write('Пол (м/ж):'); ReadLn(Pol);
Write('Дата рождения:'); ReadLn(Dat);
Write('Адрес:'); ReadLn(Adres);
Write('Курс:'); ReadLn(Curs);
Write('Группа:'); ReadLn(Grup) ;
Write('Стипендия (руб.):'); ReadLn(Stip)
End;
В этом примере использован оператор присоединения, который имеет следующий вид:
With <переменная типа запись> Do <оператор>;
Он позволяет, один раз указав имя переменной типа запись после слова With, работать в пределах оператора с именами полей как с обычными переменными, т. е. не писать громоздких составных имен.
Тип запись в Паскале может иметь переменный состав полей, который меняется в ходе выполнения программы. Такая возможность реализуется с использованием так называемой вариантной части записи. Подробнее об этом можно прочитать в книгах по Паскалю.
Работа с файлами записей. Чаще всего записи используются как элементы файлов, составляющих компьютерные информационные системы. Рассмотрим примеры программ, работающих с файлами записей.
Пример 1. Сформировать файл FM.dat, содержащий экзаменационную ведомость одной студенческой группы. Записи файла состоят из следующих элементов: фамилия, имя, отчество; номер зачетной книжки; оценка.
Program Examen;
Type Stud=Record
FIO: String[30];
Nz: String[6];
Mark: 2..5
End;
Var Fstud: File Of Stud;
S: Stud;
N,I: Byte;
Begin
Assign(Fstud,'FM.DAT'); Rewrite(Fstud);
Write('Количество студентов в группе?');
ReadLn(N);
For I:=1 To N Do
Begin
Write(I:1,'-й,Фамилия И.О.'); ReadLn(S.FIO);
Write('Номер зачетки:'); ReadLn(S.Nz);
Write('Оценка:'); ReadLn(S.Mark);
Write(Fstud,S)
End;
WriteLn('Формирование файла закончено!');
Close(Fstud)
End.
Прежде чем перейти к следующему примеру, связанному с обработкой сформированного файла, рассмотрим еще одно средство работы с файлами, которое мы пока не обсуждали.
Прямой доступ к записям файла
В стандарте языка Паскаль допустим только последовательный доступ к элементам файла. Одной из дополнительных возможностей, реализованных в Турбо Паскале, является прямой доступ к записям файла.
Как уже отмечалось, элементы файла пронумерованы в порядке их занесения в файл, начиная с нуля. Задав номер элемента файла, можно непосредственно установить на него указатель. После этого можно читать или перезаписывать данный элемент. Установка указателя на нужный элемент файла производится процедурой
Seek(FV,n)
Здесь FV — имя файловой переменной, n — порядковый номер элемента. В следующем примере эта процедура будет использована.
Пример 2. Имеется файл, сформированный программой из предыдущего примера. Пусть некоторые студенты пересдали экзамен и получили новые оценки. Составить программу внесения результатов переэкзаменовки в файл. Программа будет запрашивать номер студента в ведомости и его новую оценку. Работа заканчивается, если вводится несуществующий номер (9999).
Program New_Marks;
Type Stud=Record
FIO: String[30];
Nz: String[6] ;
Mark: 2..5
End;
Var Fstud: File Of Stud;
S: Stud;
N: Integer;
Begin
Assign(Fstud,'FM.DAT');
Reset(Fstud) ;
Write('Номер в ведомости?');
ReadLn(N);
While N<>9999 Do
Begin
Seek(Fstud,N-l);
Read(Fstud,S);
Write(S.FIO,'оценка?');
ReadLn(S.Mark);
Seek(Fstud,N-l);
Write(Fstud,S);
Write('Номер в ведомости?');
ReadLn(N);
End;
WriteLn('Работа закончена!');
Close(Fstud)
End.
Пример требует некоторых пояснений. Список студентов в ведомости пронумерован, начиная от 1, а записи в файле нумеруются от 0. Поэтому, если n — это номер в ведомости, то номер соответствующей записи в файле равен n-1. После прочтения записи «номер n—1» указатель смещается к следующей n-й записи. Для повторного занесения на то же место исправленной записи повторяется установка указателя.