1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
| uses crt; //подключен модуль crt для организации ввода-вывода в отдельном окне
type tovar=record //тип - запись
nomer: integer; //переменная для порядкового номера
nazva: string [20]; //переменная для названия товара, тип строка, ограниченный размер - 20 символов
kolvo: integer; //переменная для количества товара
zena : real; //переменная цена, на всякий случай вещественного типа
end;
f_tovar=file of tovar; //тип - файл записей
var f,g:f_tovar; //переменные f и g - файлы записей
file1_name,file2_name: string; //переменные для имен файлов
vybor: byte; //переменная для считывания выбора пользователя
//процедура ввода или добавления записи в файл, если файл уже существует, то, в принципе, не нужна
procedure Vvodf(ff: f_tovar);
//вспомогательные переменные
var zapis:tovar; //запись
reshenie: char; //переменная символьного типа для решения о внесении еще одной записи в файл
begin
if FileExists(file1_name) then reset(ff) //если файл уже существует, то открыть его для чтения (и добавления записи, в нашем случае)
else rewrite(ff); //иначе - открыть для записи (в нашем случае - создать для записи)
repeat //цикл с постусловием, будет повторяться, пока пользователь будет соглашаться ввести еще запись
with zapis do //обращение к полям записи
begin
write ('Порядковый номер: '); readln (nomer); //запрашиваем и считываем порядковый номер
write ('Название товара: '); readln (nazva); //запрашиваем и считываем название товара
write ('Количество товара: ');readln (kolvo); //запрашиваем и считываем количество
write ('Цена за единицу: '); readln (zena); //запрашиваем и считываем цену
seek(ff,filesize(f)); //перемещаем файловый указатель после последней записи
write(ff,zapis); //дописываем запись в файл
end;
writeln('');
write('Внести еще запись? (y/n)'); readln(reshenie); //запрашиваем и считываем решение о вводе следующей записи
until reshenie='n'; //цикл с постусловием выполняется, пока пользователь не введет "n"
close(ff); //закрываем файл
end;
//процедура вывода содержимого файла на экран
procedure vivodf(ff:f_tovar);
const linija='--------------------------------------------------------'; //константа - линия для таблицы
shapka='|Номер| Наименование |Количество| Цена |'; //константа - шапка таблицы
var zapis:tovar; //вспомогательная переменная - запись
begin
clrscr; //очистить экран
reset(ff); //открыть файл для чтения
seek(ff,0); //установить файловый указатель в нулевую (начальную) позицию (в принципе, это не обязательная процедура, так как reset автоматически устанавливает указатель в начало, но так было в примере..)
//создаем таблицу, в которую будут выведены данные
writeln(linija); //рисуем "линию"
writeln(shapka); //выводим шапку
writeln(linija); //рисуем "линию"
while not eof(ff) do //в цикле с предусловием, пока не дойдем до конца файла, выполнять
begin
read(ff,zapis); //считать запись из файла
with zapis do //обращение к полям записи
//вывод полей записи в таблицу
writeln('|',nomer:4,'|':2,nazva:22,'|':3,kolvo:7,'|':4,zena:9:2,'|':4);
end;
writeln(linija); //рисуем "линию", которая закроет таблицу
close(ff); //закрываем файл
writeln('Enter to continue..'); readln; //ожидаем нажатия любой клавиши, можно и Enter
end;
//процедура поиска и вывода в другой файл записей по условию
procedure Poisk(file1,file2: f_tovar);
//вспомогательные переменные
var zapis:tovar; //запись
k: real; //некое число К, по условию, надо найти товары, с ценой, превосходящей К
begin
write('K='); readln(k); //запрашиваем и считываем К
reset(file1); //исходный (первый) файл открываем для чтения
rewrite(file2); //итоговый (второй) файл открываем для записи
seek(file1,0); //устанавливаем курсор в начало первого файла
while not (eof(file1)) do //в цикле с предусловием, пока не достигнем конца первого файла, выполнять
begin
read(file1,zapis); //считываем запись из исходного файла
if zapis.zena>k then //если значение поля записи "цена" превышает К
write(file2,zapis); //записываем эту запись в итоговый (второй) файл
end;
close(file1); //закрываем файлы
close(file2);
writeln('Enter to continue..'); readln; //ожидаем нажатия любой клавиши, можно и Enter
end;
begin
write('Введите имя исходного файла: '); // вводится полностью путь к каталогу(d:\папка\имя файла)
readln (file1_name); //считываем переменную - имя первого (исходного) файла
write('Введите имя итогового файла: '); // вводится полностью путь к каталогу(d:\папка\имя файла)
readln (file2_name); //считываем переменную - имя второго (итогового) файла
assign(f,file1_name); //ассоциируем переменную с первым файлом
assign(g,file2_name); //ассоциируем переменную со вторым файлом
repeat //цикл с постусловием
clrscr; //очистить экран
//выводим "меню"
writeln('1-внести / добавить данные в исходный файл');
writeln('3-вывести содержимое исходного файла');
writeln('4-вывести содержимое итогового файла');
writeln('0-завершить работу');
readln(vybor); //считываем выбор пользователя
case vybor of //оператор множественного выбора для обработки выбора пользователя
1: Vvodf(f); //запуск процедуры: ввод данных в исходный файл
2: Poisk(f,g); //запуск процедуры: поиск данных, удовлетворяющих условию, и запись их в итоговый файл
3: vivodf(f); //запуск процедуры: вывод исходного файла
4: vivodf(g); //запуск процедуры: вывод итогового файла
else vybor:=0; //если введено другое значение, присваиваем переменной выбора значение 0
end; //конец множественного оператора выбора
until vybor=0; //цикл с постусловием повторяется, пока польователь не введет 0 - завершение работы
end. |