Writeln('Vvedite cifru dlya vypolneniya deistviya:');
Writeln('1 - zagruzka spravochnika iz faila');
Writeln('2 - novaya zapis');
Writeln('3 - spisok vseh zapisei');
Writeln('4 - poisk zapisi po familii');
Writeln('5 - sohranenie spravochnika v fail');
Writeln('6 - vyhod iz programmy');
Write('> ');
Readln(MenuNum);
case MenuNum of
1: LoadFromFile(PhoneTable, PhoneCount);
2: AddNewRecord(PhoneTable, PhoneCount);
3: ShowAllRecords(PhoneTable, PhoneCount);
4: FindRecord(PhoneTable, PhoneCount);
5: SaveToFile(PhoneTable, PhoneCount);
end;
until MenuNum = 6;
end.
Следует отметить, что благодаря разбивке программного кода на подпрограммы, основная часть программы оказалась очень простой. Несмотря на «солидный» размер (более 150 строк кода), разобраться в данном примере не составит чрезмерных трудностей (при условии последовательного выполнения всех предыдущих лабораторных работ).
7.7. Варианты заданий
№
| Наименование справочника, поля
| Тип файла
| Поле поиска
|
| Контрагенты. Поля:
наименование контрагента, ИНН, тип (True-юридическое, False-физическое лицо), год регистрации
| Текстовый
| Наименование контрагента
|
| Владельцы сотовых телефонов. Поля:
ФИО владельца, модель телефона, идентификатор телефона (IMEI), дата приобретения
| Типизированный
| ФИО владельца
|
| Участники интернет-форума. Поля:
ФИО участника, пол (True-мужской, False-женский), пароль, дата регистрации,
| Текстовый
| ФИО участника
|
| Улицы вашего города. Поля:
название улицы, количество домов, протяженность (км), год основания
| Типизированный
| Название улицы
|
| Товарно-материальные ценности. Поля:
наименование ТМЦ, штрих-код, количество на складе, стоимость
| Текстовый
| Наименование ТМЦ
|
| Города России. Поля:
наименование города, год основания, число жителей, площадь
| Типизированный
| Наименование города
|
| Учебная нагрузка группы. Поля:
наименование предмета, количество часов, ФИО преподавателя, система оценки знаний (True-экзамен, False-зачет)
| Текстовый
| Наименование предмета
|
| Расписание занятий группы. Поля:
день недели, тип недели (True-первая, False-вторая), наименование предмета, время начала
| Типизированный
| Наименование предмета
|
| Расписание назначенных встреч. Поля:
ФИО, место встречи, дата и время встречи
| Текстовый
| ФИО
|
| Сотрудники. Поля:
ФИО, должность, дата приема на работу, оклад
| Типизированный
| ФИО
|
| Поступления ТМЦ.Поля:
наименование ТМЦ, наименование поставщика, количество, дата оприходования
| Текстовый
| Наименование ТМЦ
|
7.8. Содержание отчета (см. п. 1.11)
7.9. Контрольные вопросы
1) Дать определение записи (record) в языке Pascal.
2) Дать определение понятия «файл». Какова общая особенность любых файлов?
3) Перечислить основные операции с файлами.
4) Дать определение понятия «текстовый файл». Каким образом в языке Pascal объявляется переменная текстового файла?
5) Дать определение понятия «двоичный файл».
6) Дать определение понятия «типизированный файл». Каким образом в языке Pascal объявляется переменная типизированного файла?
7) Перечислить операторы языка Pascal для работы с текстовыми файлами.
8) Перечислить операторы языка Pascal для работы с типизированными файлами.
Список литературы
1 Фаронов В.В. Turbo Pascal 7.0. Начальный курс. Учебное пособие. – М.: «Нолидж», 2001. – 576 с.
2 Лукин С.Н. Pascal 7.0. Самоучитель. – 1999. – 214 с.
3 Долинский М.С. Алгоритмизация и программирование на Turbo Pascal: от простых до олимпиадных задач: Учебное пособие. – СПб.: Питер, 2005. – 234 с.
4 Деревенец О.В. Песни о паскале. – 2011. – 590 с.
5 Фаронов В.В. Delphi 6. Учебный курс. – СПб.: Питер, 2002. – 512 с.
6 Сухарев М.В. Основы Delphi. Профессиональный подход. – СПб: Наука и техника, 2004. – 600 с.
7 Стив Тейксейра, Ксавье Пачеко. Delphi5. Руководство разработчика. – 2000. – 1816 с.
Структуровані типи даних.
Масиви
Масив – це структурований тип даних, який складається із фіксованої кількості елементів одного і того ж типу.
Опис масиву у програмі має вигляд
<ім’я типу> array [<список індексних типів>] of <тип>;
де <ім’я типу> – правильний ідентифікатор; array, of – зарезервовані слова (масив, із); <список індексних типів> – список з одного або декількох індексних типів (розмірність масиву не обмежується), розділених комами; <тип> – тип елементів масиву, може бути будь-яким крім файлового. В ролі індексних типів може використовуватися будь-який порядковий тип (частіше використовується діапазон).
Масив можна описати в розділі Var безпосередньо або за допомогою раніше описаного ідентифікатора типу:
Type Tm= array[1..10] of integer;
Var a, b: array[1..100] of double;
r: array[1..100] of double;
s: array[1..100] of double;
c, d: Tm;
x: array[1..10, 1..10] of integer;
y: array[1..10] of array[1..10] of integer;
тут масиви a, b, r, s описані безпосередньо, масиви c, d описані за допомогою ідентифікатора типу, а матриці x, y описані безпосередньо ідентичними способами.
Для масивів у цілому допускається тільки операція присвоєння, якщо вони описані одним ідентифікатором типу. Тому оператор a:=b; буде вірним і присвоїть елементам масиву a відповідні елементи масиву b, а оператор r:=s; буде невірним.
Для доступу до окремого елемента масиву потрібно за іменем масиву вказати у квадратних дужках його індекс (положення у масиві): a[5], x[3,4] або y[5][6]. З елементами масиву можна працювати як із звичайними скалярними змінними.
Існують так звані динамічні масиви. При опису таких масивів у програмі межі індексів не вказуються. Пам’ять для цих масивів виділяється на етапі виконання програми в динамічній області процедурою SetLength і звільняється процедурою Finalize. Наприклад,
Var a: array of integer;
b: array of array of char;
c: array of array of array of double;
i, j: integer;
Begin
{Розподіл пам’яті}
SetLength(a,10);
{Довжина першого виміру (кількість рядків)}
SetLength(b,10);
{Довжина кожного рядка)}
for i:=0 to 9 do
SetLength(b[i], 20);
{Кубічний масив c[0..2, 0..2, 0..2]}
SetLength(c,3);
for i:=0 to 2 do
begin
SetLength(c[i],3);
for j:=0 to 2 do
SetLength(c[i,j],3);
end;
{Робота з масивами}
………………
{Звільнення пам’яті}
a:=NIL;
Finalize(b);
Finalize(b);
End.
У наведеному прикладі: а – одновимірний масив цілих чисел, якому виділена пам’ять для десяти елементів; b – двовимірний масив символів із 10 рядків по 20 символів у рядку; c – тривимірний масив дійсних чисел. Нижня межа індексів по кожному виміру динамічного масиву завжди дорівнює нулю. У багатовимірних масивах спочатку встановлюється довжина його першого виміру, потім другого, третього і т. д.
Алгоритми обробки масивів.До традиційних алгоритмів обробки даних належать: пошук максимального і мінімального елементів масиву, накопичення сум і добутків елементів масиву, циклічний зсув елементів масиву, побудова об’єднання, перетину, різниці елементів масивів та інші.
Розглянемо алгоритм пошуку максимального елемента масиву
. Візьмемо один із елементів (як правило це перший) і будемо порівнювати його з усіма останніми елементами масиву. Якщо зустрінеться більший елемент, то він запам’ятовується і порівняння продовжується. Після перегляду всіх елементів масиву буде знайдено найбільший елемент. Програма пошуку максимального елемента масиву має вигляд:
Program LABR3_1;
{$APPTYPE CONSOLE}
uses Sysutils;
VAR a: array[1..300] of integer;
maxa: integer;
n, i: integer;
BEGIN
{Введення початкових даних}
writeln(‘Введіть розмір масиву а, (n<=300)’);
readln(n);
writeln(‘Введіть елементи масиву а’);
for i:=1 to n do
read(a[i]);
{Пошук максимального елемента масиву}
maxa:=a[1];
for i:=2 to n do
if maxa < a[i] then maxa:=a[i];
writeln(‘Максимальний елемент =’, maxa);
readln;
END.
Розглянемо алгоритм побудови перерізу двох масивів. Нехай задано два масиви цілих чисел
,
. Розробити програму, яка будує переріз масивів
. Переріз масивів
- це всі елементи масиву
, які містяться у масиві
і взяті по одному разу. Переріз масивів
буде нараховувати не більше 200 елементів. Помістимо їх у масив
.
Для побудови перерізу будемо кожний елемент масиву
порівнювати з усіма елементами масиву
. Якщо елемент масиву
збіжиться з деяким елементом масиву
, то цей елемент буде елементом перерізу, і якщо такого елемента ще немає в масиві
, то він туди записується. Програма побудови перерізу двох масивів має вигляд:
Program LABR3_2;
{$APPTYPE CONSOLE}
uses Sysutils;
VAR a, c: array[1..200] of integer;
b: array[1..300] of integer;
n, m, k, i, j: integer;
f1, f2: boolean;
BEGIN
{Введення початкових даних}
writeln(‘Введіть розмір масиву а, (n<=200)’);
readln(n);
writeln(‘Введіть елементи масиву а’);
for i:=1 to n do
read(a[i]);
writeln(‘Введіть розмір масиву b, (m<=300)’);
readln(m);
writeln(‘Введіть елементи масиву b’);
for i:=1 to m do
read(b[i]);
{Побудова перетину масивів}
k:=0;
for i:=1 to n do
begin
j:=1; f1:=false;
while (j <= m) and (not f1) do
if a[i]=b[j] then f1:=true else j:=j+1;
if f1 then begin
j:=1; f2:=true;
while (j <= k) and f2 do
if a[i]=c[j] then f2:=false else j:=j+1;
if f2 then begin k:=k+1; c[k]:=a[i];end;
end;
end;
{Виведення перетину по п’ять елементів у рядку}
if k=0 then writeln(‘Перетин порожній’)
else
for i:=1 to k do
if i mod 5 <> 0 then write(c[i]:6)
else writeln(c[i]:6);
readln;
END.