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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
| program project1;
{$mode objfpc}{$H+}
uses
Classes, SysUtils
{62,5*8*5*4 = 10000 you can add units after this };
type
ptr_istoch = ^istochnic; // структура запись для построения
istochnic = record // списков источников
id:integer; // уникальный номер для раздела
nazv_ist:string[255];
next:ptr_istoch;
end;
Plist_branches = ^SP_branches; // Структура таблица
SP_branches = record
id:integer;
key:string; // ключ
character:string[255]; // краткая характеристика информации
next:Plist_branches;
current_branche:ptr_istoch;
end;
TableObj = object
// объявление глобальных переменных
list_begin:Plist_branches; // перемещение по таблице
list_branches:Plist_branches; // вход в таблицу
list_rec:ptr_istoch;
temp_branch:Plist_branches;
temp_rec:ptr_istoch;
// i:integer;
t_obchay: ptr_istoch; // для передачи указателя в таблицу
t_book: ptr_istoch; // для построения списка данных (книги)
t_newspaper: ptr_istoch; // -||- газеты
t_journal: ptr_istoch; // -||- журналы
a_glob:integer;
k_razdelov:integer;
procedure create_table(); // cоздание таблицы
// procedure save(); // процедура сохранения таблицы в файле
constructor init();
procedure create_list_book(dan:istochnic); // процедура создания списка источников книг
procedure create_list_newspaper(dan:istochnic); // процедура создания списка источников газет
procedure create_list_journal(dan:istochnic); // процедура создания списка источников журналов
procedure outlist;
procedure sort_table(); // процедура сортировки таблицы по полю ключ
procedure vibor_inf(); // выбор информмации и выбор к этой информации всех известных источников
// (т.е. вывод 2-го и третьего столбца по условию выборки)
procedure ist(); // процедура определения и ввода информации в источники
procedure show_table(); // процедура просмотра всей таблицы
procedure add_branche();
procedure show_branche(); // процедура вывода только разделов
// destructor done;
end;
// объявление глобальных переменных
var
obj:TableObj;
file_table:file of SP_branches; // файловая переменная для сохранения таблицы в файле
// file_rec:file of SP_rec;
procedure TableObj.ist(); // процедура создания списков источников
var
dan: istochnic;
a: integer;
begin
// Внимание списков много !!!!!!
writeln('Chtobi_vvesti_istochnik_nazmite_sootvetstvuychuy_cifry');
writeln('BOOK - 1');
writeln('NEWSPAPER - 2');
writeln('JOURNAL - 3');
readln(a);
case a of
1: begin writeln('Vvedite nazvanie istochnika_KNIGI');
readln(dan.nazv_ist);
create_list_book(dan); // передача аргумента процедуре для создания списка книг
end;
2: begin writeln('Vvedite nazvanie istochnika_NEWSPAPERS');
readln(dan.nazv_ist);
create_list_newspaper(dan); // -//- для создания списка газет
end;
3: begin writeln('Vvedite nazvanie istochnika_JOURNAL');
readln(dan.nazv_ist);
create_list_journal(dan); // -//- для создания списка журналов
end;
end;
if (a<1)or (a>3) then
begin
writeln('Vvedinnaya vami cifra must be 1-3');
ist(); // рекурсивное обращение
end;
end; // конец процедуре создания источников
procedure TableObj.create_list_book(dan: istochnic);// процедура формирования списка (типа очередь) для книг
var
v_book: ptr_istoch; // возможно переменную нужно сделать глобальной
link_book: ptr_istoch;
begin
new(v_book);
v_book^:=dan;
if t_book=nil then // если конец списка
begin
new(t_book);
t_book:=v_book;
end
else
begin
link_book:=t_book; // ссылка на конец списка
while link_book^.next<>nil do
link_book:=link_book^.next;
link_book^.next:=v_book;
end;
v_book^.next:=nil;
t_obchay:=v_book; // глобальной общей, присвоить адрес текущего введенного
end; // конец процедуры создания списка источников книг
procedure TableObj.sort_table(); // прцедура сортировки таблицы по полю key
var
i,j:integer;
buf: Plist_branches;
temp: Plist_branches;
temp1: Plist_branches;
begin
k_razdelov:=0;
temp1:=list_begin;
while temp1<>nil do
begin
inc(k_razdelov);
temp1:=temp1^.next;
end;
for j:=1 to k_razdelov-1 do
begin
temp:=list_begin;
for i:=1 to k_razdelov-j do
begin
// writeln(temp^.key);
// writeln(temp^.next^.key);
if (temp^.key) > (temp^.next^.key) then
begin
new(buf);
// writeln(temp^.key);
// writeln(temp^.next^.key);
buf^.key:=temp^.key;
buf^.id:=temp^.id;
buf^.character:=temp^.character;
// buf^.current_branche:=temp^.current_branche;
temp^.key:=temp^.next^.key;
temp^.id:=temp^.next^.id;
temp^.character:=temp^.next^.character;
// temp^.current_branche:=temp^.next^.current_branche;
temp^.next^.key:=buf^.key;
temp^.next^.id:=buf^.id;
temp^.next^.character:=buf^.character;
// temp^.next^.current_branche:=buf^.current_branche;
dispose(buf);
end;
/// перемещение по списку
temp:=temp^.next;
end;
end;
writeln('');
show_table();
end; // конец процедуры сортировки
procedure TableObj.vibor_inf();
var
ss:string; // переменная для условия отбора
begin
writeln('Vvedite nazvanie inform kotoraya neobchodima');
readln(ss);
list_branches:= list_begin;
while list_branches <> nil do
begin
if ss = list_branches^.character
then
begin
write('| ',list_branches^.key, ' ');
write('| ',list_branches^.character, ' ');
temp_rec := list_branches^.current_branche;
while temp_rec <> nil do
begin
if list_branches^.id = temp_rec^.id then
begin
write('| ', temp_rec^.nazv_ist);
end;
temp_rec := temp_rec^.next;
end;
end;
list_branches:= list_branches^.next;
end;
writeln('');
end;
// Показать всю таблицу
procedure TableObj.show_table();
begin
list_branches:= list_begin;
while list_branches <> nil do
begin
write('| ',list_branches^.key, ' ');
write('| ',list_branches^.character, ' ');
temp_rec:=list_begin^.current_branche;
while temp_rec <> nil do
begin
if list_branches^.id = temp_rec^.id then
begin
write('| ', temp_rec^.nazv_ist);
end;
temp_rec := temp_rec^.next;
end;
writeln('');
list_branches:= list_branches^.next;
// inc(k_razdelov);
end;
end; // конец процедуры просмотра таблицы
// Процедура вывода только разделов
procedure Tableobj.show_branche();
begin
writeln('');
list_branches:=list_begin;
while list_branches<>nil do
begin
write('| ',list_branches^.key,' ');
write('| ',list_branches^.character,' ');
list_branches:=list_branches^.next;
writeln('');
end;
end;
procedure TableObj.add_branche(); // процедура добавления разделов
var temp:Plist_branches;
h,n: char;
link:ptr_istoch;
begin
n:='y';
new(temp); // буферная ячейка для добавления разделов
temp^.next := nil;
temp^.current_branche := nil;
temp^.id:=a_glob;
write('Vvedite key:');
readln(temp^.key);
write('Vvedite characteristiky:');
readln(temp^.character);
writeln('VIberite istochnick');
while n='y' do
begin
ist; // обращение к процедуре выбора источников
// присвоение указателю на источник адреса, где хранится имя источника при
// при добавлении превого элемента
if temp^.current_branche = nil then
begin
//new();
temp^.current_branche:=t_obchay;
temp^.current_branche^.id:=a_glob;
temp^.id:=a_glob;
end
else
begin
link:=temp^.current_branche;
while link^.next<>nil do
link:=link^.next;
link^.next:=t_obchay;
link^.next^.id:=a_glob;
end;
t_obchay^.next:=nil;
// writeln('peredav ist ',list_branches^.ptr_ist^.nazv_ist);
writeln('Dly etogo razdela est eche istochniki y/n');
readln(n);
end;
if not eof(file_table) then
Seek(file_table,FileSize(file_table));
write(file_table,temp^);
list_branches := list_begin; // к началу разделов
while list_branches^.next <> nil do // быстрый переход в конец разделов
list_branches := list_branches^.next;
list_branches^.next := temp;
writeln('Chotite vstavit razdel y/n');
readln(h);
if h='y' then
begin
inc(a_glob);
add_branche(); // рекурсивное заполнение таблицы
end;
end; // конец процедуры добавления разделов
procedure TableObj.create_list_newspaper(dan: istochnic); // для газет
var
v_newspaper: ptr_istoch; // возможно переменную нужно сделать глобальной
link_newspaper: ptr_istoch;
begin
new(v_newspaper);
v_newspaper^:=dan;
if t_newspaper=nil then // если конец списка
begin
new(t_newspaper);
t_newspaper:=v_newspaper;
end
else
begin
link_newspaper:=t_newspaper; // ссылка на конец списка
while link_newspaper^.next<>nil do
link_newspaper:=link_newspaper^.next;
link_newspaper^.next:=v_newspaper;
end;
v_newspaper^.next:=nil;
new(t_obchay);
t_obchay:=v_newspaper; // глобальной общей присвоить адрес текущего введенного
end; // конец процедуры создания списка источников газет
procedure TableObj.create_list_journal(dan: istochnic); // для журналов
var
v_journal: ptr_istoch; // возможно переменную нужно сделать глобальной
link_journal: ptr_istoch;
begin
new(v_journal);
v_journal^:=dan;
if t_journal=nil then // если конец списка
begin
new(t_journal);
t_journal:=v_journal;
end
else
begin
link_journal:=t_journal; // ссылка на конец списка
while link_journal^.next<>nil do
link_journal:=link_journal^.next;
link_journal^.next:=v_journal;
end;
v_journal^.next:=nil;
new(t_obchay);
t_obchay:=v_journal; // глобальной общей присвоить адрес текущего введенного
end; // конец процедуры создания списка источников журналов
procedure TableOBj.outlist; // процедура вывода на экран
var
v: ptr_istoch;
begin
v:=t_journal; // перемещение в начало списка
while v<>nil do
begin
writeln(v^.nazv_ist);
v:= v^.next;
end;
end; // конец процедуры вывода
procedure TableObj.create_table(); //создание таблицы и одновременно сохранение в файл
var link:ptr_istoch;
n:char;
begin
n:='y';
//Если файл не пустой
if not eof(file_table) then
begin
new(list_begin);
list_branches := list_begin;
list_branches^.next := nil;
list_branches^.current_branche := nil
end
else
begin
//Если файл пустой
new(list_branches);
list_begin := list_branches;
list_branches^.next := nil;
list_branches^.current_branche := nil;
// writeln('branches file id empty... insert data.');
list_branches^.id:=a_glob;
write('vvedite_Key:');
readln(list_branches^.key);
write('Vvedite charakteristiky:');
readln(list_branches^.character);
writeln('VIberite istochnick');
while n='y' do
begin
ist; // обращение к процедуре выбора источников
// присвоение указателю на источник адреса, где хранится имя источника при
// при добавлении превого элемента
if list_branches^.current_branche = nil then
begin
list_branches^.current_branche:=t_obchay;
list_branches^.current_branche^.id:=a_glob; // для первого раздела
list_branches^.id:=a_glob;
end
else
begin
link:=list_branches^.current_branche;
while link^.next<>nil do
link:=link^.next;
link^.next:=t_obchay;
link^.next^.id:=a_glob;
end;
t_obchay^.next:=nil;
writeln('Dly etogo razdela est eche istochniki y/n');
readln(n);
end;
end;
write(file_table, list_branches^);
inc(a_glob);
add_branche();
end; // конец процедуры создания и сохранения таблицы
constructor TableObj.init();
begin
t_book:= nil;
t_newspaper:= nil;
t_journal:= nil;
a_glob:=1;
assignfile(file_table, 'file_table.f');
if (FileExists('file_table.f')) then
begin
reset (file_table);
writeln('file_table - reset'); // файл открыт для записи
end
else
begin
rewrite(file_table);
writeln('file_table - rewrite'); // файл создан и открыт для записи
end;
writeln('file create and ready...');
//заполняем таблицу
// create_table();
end; // конец конструктора
procedure Menu();
var
hh: integer;
begin
writeln('Dly vibora deystviy vvedite:');
writeln('Crete table - 1 ');
writeln('Sort tablici - 2 ');
writeln('Show only branches - 3 ');
writeln('Vibor_information - 4 ');
writeln('Show_table - 5 ');
writeln('Exit - 6');
readln(hh);
case hh of
1:obj.create_table();
2:obj.sort_table();
3:obj.show_branche();
4:obj.vibor_inf();
5:obj.show_table();
6:exit;
end;
Menu();
end;
// тело программы
begin
obj.init(); // обращение к конструктору
Menu();
close(file_table);
readln;
end. |