Структуры данных

Меню

Просмотр

procedure d_geben(var f:file_typ);

var s:stadt;

begin процедура просмотра содержимого файла

reset(f); открытие существующего файла (типизированного

while not eof(f) do для записи и чтения)

begin

read(f,s); читаем

s_geben(s); отображаем

end;

end;

 

//8-открытие файлов

procedure ber; Процедура для связывания логичкских и физических имен файлов и открытия основного файла, если он новый

var c:char;

begin

assign(kop,'temp.cop');

write('Имя файла ? ');

readln(n);

{$I-}

assign(f,n);

writeln('Файл ',n,' существует? Д/Н');

readln(c);

case c of

'Н','н','Y','y':

begin

rewrite(f);

close(f);

end

else

begin

Reset(f);

{$I+}

if IOResult <> 0 then

begin

Writeln('Ошибка открытия файла');

Halt(1);

end;

Close(f);

end;

end;

end;

 

 

procedure menue;

var c:char;

begin

clrscr;

quit:=false;

writeln('Что будете делать?');

highvideo;write('У');

lowvideo;writeln('даление');

highvideo;write('Д');

lowvideo;writeln('обавление');

highvideo;write('И');

lowvideo;writeln('зменение');

highvideo;write('П');

lowvideo;writeln('росмотр');

highvideo;write('В');

lowvideo;writeln('ыход');

highvideo;

read(c);

case c of

'Д','д','l','L':append(f);

'У','у','e','E':delete(f);

'И','и','b','B':change(f);

'П','п','g','G':begin

d_geben(f);

writeln('<Enter>');

readln(c);

end;

'В','в','d','D':quit:=true;

end

end;

begin

ber;

repeat (1) Главная программа

menue;

until quit;

end.

 

 

program gorod;

uses crt;

type stadt=record key: Integer;

name:string[20];

ein:longint;

kfz :string[3];

end;

file_typ = file of stadt;

var kop,f:file_typ;

n:string[20];

quit:boolean;

procedure lesen(var s:stadt);

begin

clrscr;

writeln('Конец ввода:код = 0');

write('Код: ');readln(s.key);

if s.key <>0 then

begin

write('Название: ');readln(s.name);

write('Жителей : ');readln(s.ein);

write('Автомобилей: ');readln(s.kfz);

end;

end;

procedure s_geben(s:stadt);

begin

writeln(s.key:4,s.name:22,s.ein:9,s.kfz:5);

end;

 

procedure d_geben(var f:file_typ);

var s:stadt;

begin

reset(f);

while not eof(f) do

begin

read(f,s);

s_geben(s);

end;

end;

procedure ber;

var c:char;

begin

assign(kop,'temp.cop');

write('Имя файла ? ');

readln(n);

{$I-}

assign(f,n);

writeln('Файл ',n,' существует? Д/Н');

readln(c);

case c of

'Н','н','Y','y':

begin

rewrite(f);

close(f);

end

else

begin

Reset(f);

{I+}

if IOResult <> 0 then

begin

Writeln('Ошибка открытия файла');

Halt(1);

end;

Close(f);

end;

end;

end;

 

procedure delete(var f:file_typ);

var s:stadt;

k:integer;

c:char;

found:boolean;

begin

writeln('Какую запись удалить?');

writeln('Задайте код: ');

readln(k);

reset(f);

rewrite(kop);

found:=false;

while not eof(f) do

begin

read(f,s);

if s.key <> k then write(kop,s)

else

begin

found:=true;

s_geben(s);

write('Именно эту запись');

writeln(' удалить?Д/Н');

readln(c);

case c of

'Д','д','L','l':

else write(kop,s)

end;

end;

end;

close(f);close(kop);

if not found then

begin

write('Город с кодом ',k:6);

write(' не найден.');

erase(kop);

writeln('<Enter>');read(c);

end

else

begin

erase(f);

rename(kop,n);

assign(kop,'temp.cop');

end;

end;

 

procedure FileSort(var f:file_typ);

var

s,s1 :Stadt;

i, j :Longint;

begin

Reset(f);

for i:=FileSize(f)-1 downto 1 do

for j:=0 to i-1 do

begin

Seek(f,j);

Read(f,s,s1);

if s.key > s1.key then

begin

Seek(f,j);

Write(f,s1,s);

end;

end;

Close(f);

end;

 

procedure append(var f:file_typ);

var s:stadt;c:char;

begin

reset(f);

seek(f,filesize(f));

lesen(s);

writeln;

s_geben(s);

writeln('Все правильно?Д/Н');

readln(c);

case c of

'Д','д','L','l':write(f,s)

end;

close(f);

end;

 

procedure change(var f:file_typ);

var s:stadt;k:integer;c:char;

begin

writeln('Какую запись нужно изменить?');

writeln('Задайте код: ');

readln(k);

reset(f);

while not eof(f) and (s.key<>k) do

read(f,s);

if s.key = k then

begin

s_geben(s);

write('Новое число жителей: ');

readln(s.ein);

s_geben(s);

writeln('Все правильно?Д/Н');

readln(c);

case c of 'Д','д','L','l':

begin

seek(f,filepos(f)-1);

write(f,s);

end;

end;

end

else

begin

write('Город с кодом',k:6);

writeln(' не найден');

writeln('<Enter>');read(c);

end;

close(f);

end;

procedure menue;

var c:char;

begin

clrscr;

quit:=false;

writeln('Что будете делать?');

highvideo;write('У');

lowvideo;writeln('даление');

highvideo;write('Д');

lowvideo;writeln('обавление');

highvideo;write('И');

lowvideo;writeln('зменение');

highvideo;write('П');

lowvideo;writeln('росмотр');

highvideo;write('В');

lowvideo;writeln('ыход');

highvideo;

read(c);

case c of

'Д','д','l','L':begin

append(f);

FileSort(f);

end;

'У','у','e','E':begin

delete(f);

end;

'И','и','b','B':begin

change(f);

end;

'П','п','g','G':begin

d_geben(f);

writeln('<Enter>');

readln(c);

end;

'В','в','d','D':quit:=true;

end

end;

begin

ber;

repeat

menue;

until quit;

end.

Не все ошибки обрабатываем: сказали, что файла нет, а сами можем выйти на удаление.

 

Еще пример, но работаем с двумя файлами.

Пример работы с двумя файлами: справочником (редко изменяемая информация) и основным(оперативная информация).

Задача:

Организовать работу по вводу и выводу информации о сотрудниках:

1) ввести файл-справочник и основной файл.

2) вывести на экран таблицу следующего вида:

фамилия, название должности, зарплата.

Файл справочник: код должности (первичный ключ), наименование должности, зарплата

Основной файл данных - список сотрудников: фамилия, код должности (внешний ключ)

Особенности предметной области:

а) могут быть сотрудники с одинаковой фамилией;

б) зарплата определяется должностью.

Алгоритм:

1) файлы типизированные

2) ввод данных в файлы

- открываем файл

- последовательно заполняем основной файл, а затем справочник

так, чтобы коды должности совпадали (вообще-то нужен контроль)

3) вывод данных

- последовательно читаем запись из основного файла;

- находим по коду должности соответствующую запись в файле справочнике;

- вывод информацию в нужном формате;

 

Процедуры

1) основная: - ввод имен основного файла и файла справочника

- вызов процедур ввода данных в файлы

- вызов процедуры вывода информации

2) процедура заполнения файла справочника

3) процедура заполнения основного файла данных

4) процедура вывода информации из файлов в нужном формате

 

 

Основной файл

 

 

Назначение Имя Тип Размер, байт
Ф.И.О fio string 30
код должности k integer 2
 

Файл справочник

 

Назначение Имя Тип Размер, байт
код должности kl integer 2
Наименование
Должности nm string 30
зарплата sl integer 2

 

PROGRAM T_2F;

USES CRT;

TYPE

rec_g = ЗАПИСЬ ЧАСТО ИЗМЕНЯЕМОГО ФАЙЛА

RECORD

k : INTEGER;

fio : STRING[30];

END;

rec_s = ЗАПИСЬ ФАЙЛА-СПРАВОЧНИКА

RECORD

kl : INTEGER; КОД ДОЛЖНОСТИ

nm : STRING[30]; НАИМЕНОВАНИЕ ДОЛЖНОСТИ

sl : INTEGER; ЗАРПЛАТА

END;

VAR

nameg, names : STRING;

PROCEDURE inp_g(fname:STRING); ПРОЦЕДУРА ВВОДА ОСНОВНОГО ФАЙЛА

Fname – ВХОДНОЙ ПАРАМЕТР – ИМЯ ОСНОВНОГО ФАЙЛА

VAR

f_g : FILE OF rec_g;

r_g : rec_g; ВСПОМОГАТЕЛЬНАЯ

BEGIN

ASSIGN(f_g, fname);

{$I-}

Reset(f_g);

{$I+}

if IoResult<>0 then

begin

Rewrite(f_g);

with r_g do

begin

WRITE('Введите код должности: ');

READLN(k);

WHILE k <> 0 DO

BEGIN

WRITE(' Введите фамилию: ');

READLN(fio);

WRITE(f_g, r_g);

WRITE('Введите код должности: ');

READLN(k);

END;

end;

end;

CLOSE(f_g);

END;

 

PROCEDURE inp_s(fname:STRING);

ПРОЦЕДУРА ВВОДА ФАЙЛА СПРАВОЧНИКА

Fname – ВХОДНОЙАРАМЕТР ИМЯ ФАЙЛА

VAR

f_s : FILE OF rec_s;

r_s : rec_s;

BEGIN

ASSIGN(f_s, fname);

{$I-}

Reset(f_s);

{$I+}

if IoResult<>0 then

begin

Rewrite(f_s);

with r_s do

begin

WRITE(' Введите код должности: ');

READLN(kl);

WHILE kl<>0 DO

BEGIN

WRITE('Bвeдите название должности: ');

READLN(nm);

WRITE('Bвeдите оклад: ');

READLN(sl);

WRITE(f_s, r_s);

WRITE(' Введите код должности: ');

READLN(kl);

END;

end;

end;

CLOSE(f_s);

END;

 

PROCEDURE proc(g_name,s_name:STRING);

ПРОЦЕДУРА ВЫВОДА РЕЗУЛЬТИРУЮЩЕЙ ТАБЛИЦЫ

ВХОДНЫЕ ПАРАМЕТРЫ:

g_name – ИМЯ ОСНОВНОГО ФАЙЛА

s_name – ИМЯ ФАЙЛА СПРАВОЧНИКА ДОЛЖНОСТЕЙ

VAR

f_g : FILE OF rec_g;

f_s : FILE OF rec_s;

r_g : rec_g;

r_s : rec_s;

n : INTEGER;

BEGIN

ASSIGN(f_g, g_name);

Reset(f_g);

ASSIGN(f_s, s_name);

Reset(f_s);

n := 1;

clrscr;

WHILE NOT EOF(f_g) do

BEGIN

READ(f_g,r_g); СЧИТАТЬ ЗАПИСЬ ОСНОВГО ФАЙЛА

READ(f_s, r_s);

НАЙТИ СООТВЕТСВУЮЩУЮ ЗАПИСЬ ФАЙЛА СПРАВОЧНИКА И СЧИТАТЬ ЕЕ

while (NOT EOF(f_s) and (r_g.k <> r_s.kl)) do READ(f_s, r_s);

GOTOXY(1,n); ВЫВОД ИНФОРМАЦИИ

WRITE(r_g.fio);

GOTOXY(20,n);

WRITE(r_s.nm);

GOTOXY(40,n);

WRITE(r_s.sl);

n := n+1;

seek(f_s,0);

END;

CLOSE(f_g);

CLOSE(f_s);

END;

 

BEGIN

clrscr;

WRITE(' Введите имя основного файла: ');

READLN(nameg);

WRITE ('Введите имя файла-справочника: ');

READLN(names);

CLRSCR;

inp_g(nameg);

inp_s(names);

proc(nameg,names);

READLN;

END.

 

Недостатки:

1. Нет меню

2. Нет обработки ошибок пользователя

3. Нет контроля за соответствием кодов должностей

иначе нужна проверка целостности данных

Более сложные проблемы:

1. Сеть. Одновременная работа с файлами данных нескольких пользователей

2. Хранение истории изменений

3. Распределенная обработка