Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Roxanne
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 5
1

Сохранить бинарное дерево в файл

08.06.2013, 22:17. Просмотров 1071. Ответов 7
Метки нет (Все метки)

Подскажите, пожалуйста, как сохранить бинарное дерево в файл?
Суть задачи: необходимо создать бинарное дерего, добавить к нему листы, просмотреть его, а так же напечатать все элементы каждого листа. Все это должно сохраняться и считываться из файла. При попытке сохранить выдает exit code 103.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type zap=record 
         nomer:string[5];
         st_otp:string[15];
         st_pr:string[15];
         vr_otp:string[5];
         vr_pr:string[5];
         stoim:string[10];
         end;
 
     TreePtr=^Tree; 
          Tree=record
          Data:zap;
          Left,Right:TreePtr;
          end;
 
var top:TreePtr;
    Z:zap;
    i: integer;
    number: integer;
    f: file of zap;
Сама процедура:
Pascal
1
2
3
4
5
6
7
8
9
10
11
procedure sohr(top:treeptr);
 
  begin
   rewrite(f);
   while top<>nil do
   begin
    write(f,top^.data);
    end;
   readln;
  close(f);
  end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2013, 22:17
Ответы с готовыми решениями:

бинарное дерево
как сделать бинарное дерево???

Бинарное дерево
кто нибудь!!!!!!!!!!! помогите!!!!! мне нужно к зачету сдать задачу, а как с...

Бинарное дерево
Привет, соседи! Столкнулся со следующей задачей: Написать программу, которая...

Бинарное дерево
Создать простое бинарное дерево с именем, кто сможет помоч?

Бинарное дерево
Отобразить с помощью бинарного дерева предложение: &quot;Боженко Роксолана изучает...

7
Apostol584
242 / 148 / 118
Регистрация: 26.11.2012
Сообщений: 375
Завершенные тесты: 2
09.06.2013, 06:09 2
У вас Data это структура, то нужно обратится к каждому ее элементу.
Pascal
1
2
3
4
5
6
write(f,top^.data.nomer);
write(f,top^.data.st_otp);
write(f,top^.data.st_pr);
write(f,top^.data.vr_otp);
write(f,top^.data.vr_pr);
write(f,top^.data.stoim);
0
Roxanne
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 5
09.06.2013, 11:31  [ТС] 3
Не работает Пишет "Incompatible types: got 'ShortStrig' expected zap)
0
Apostol584
242 / 148 / 118
Регистрация: 26.11.2012
Сообщений: 375
Завершенные тесты: 2
09.06.2013, 11:36 4
можете дать код?
0
Roxanne
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 5
09.06.2013, 17:29  [ТС] 5
Вот сам код программы:

Pascal
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
program lab10;
uses crt;
type zap=record {описание записи о поезде}
         nomer:string[5];  {номер поезда}
         st_otp:string[15]; {станция отправления }
         st_pr:string[15];  {станция прибытия }
         vr_otp:string[5];  {время отправления }
         vr_pr:string[5];    {время прибытия }
         stoim:string[10];  {стоимость}
         end;
     TreePtr=^Tree; {описание узла дерева}
              Tree=record
                   Data:zap; {типа значения, хранимый в вершине}
                   Left,Right:TreePtr; {указатели на левое и правое поддерево }
              end;
var top:TreePtr; {указатель}
      Z:zap; {запись, добавляемая в дерево}
      i: integer;
      number: integer; {значение пункта меню}
      f: file of zap; {переменная файлового типа}
{функция, добавляющая лист к дереву}
function AddTree (top: treeptr; newnode: zap):treeptr;
                 {top – указатель на дерево(поддерево)};
                 newnode – добавление значения в дерево}
   begin
     if top=nil then {указатель нулевой, если дошли до листа}
         begin
            new(top); {выделить память для нового узла}
            top^.data:=newnode; {записать в узел значение}
            top^.left:=nil; {указатели на поддеревья пустые }
            top^.right:=nil;
         end
        else
    if top^.data.nomer>newnode.nomer then {поиск места вставки}
        top^.left:=addtree(top^.left,newnode)
     else
        top^.right:=addtree(top^.right,newnode);
   addtree:=top
   end;
procedure readfile(top: treeptr); {процедура чтения фалйа}
       var p:treeptr; r:zap;
   begin
     top:=nil;
     reset(f); {открыть файл для чтения и добавления записей}
     while not eof(f) do begin {пока не конец файла}
        read(f,r); {считывание по строчке}
        top:=addtree(top,r); {добавить элемента}
     end;
   close(f); {закрыть файл}
  end;
procedure sohr(top:treeptr); {процедура сохранения файла}
   begin
     rewrite(f); {открыть файл для чтения и записи}
     if top<>nil then {если дерево не пустое}
        begin
          sohr(top^.left);  {обойти левое поддерево}
          sohr(top^.right); {обойти правое поддерево}
          write(f,top^.data);
       end;
      close(f);
      end;
procedure orgtree; {процедура организации дерева}
  begin 
     reset(f); {открыть файл для чтения и добавления записей}
    seek(f,filesize(f)); {установить указатель в позицию, определяемую размером файла}
    writeln('Организация дерева');
    writeln(' ');
  writeln('____________________________________________________________________');
  writeln('|                 |                  Станция                   |         Время                   |   Стоимость    |');
  writeln('|№ поезда |_________________________|   __________________|         билета      |');
  writeln('|                 |   отправление  |   прибытие    |отправление|прибытие|          (грн)       |');
  writeln('|___________________________________________________________________|');
   top:=nil;
   while true do
     begin
       writeln('Для завершения нажмите *');
       readln(z.nomer);
         if z.nomer='*' then exit;
       readln(z.st_otp);
       readln(z.st_pr);
       readln(z.vr_otp);
       readln(z.vr_pr);
       readln(z.stoim);
       write(f,z); {запись в файл}
       top:=addtree(top,z); {функция, добавляющая лист к дереву}
     end;
    sohr(top); {процедура сохранения файла}
   end;
procedure dobl; {процедура добавления листа к дереву}
   begin
     reset(f);
     seek(f,filesize(f));
     writeln('');
  writeln('Добавления листа к дереву');
   writeln('____________________________________________________________________');
  writeln('|                 |                  Станция                   |         Время                   |   Стоимость    |');
  writeln('|№ поезда |_________________________|   __________________|         билета      |');
  writeln('|                 |   отправление  |   прибытие    |отправление|прибытие|          (грн)       |');
  writeln('|___________________________________________________________________|');
     readln(z.nomer);
     readln(z.st_otp);
     readln(z.st_pr);
     readln(z.vr_otp);
     readln(z.vr_pr);
    readln(z.stoim);
    write(f,z);
  top:=addtree(top,z);
  sohr(top);
 end;
procedure prosmotr(top:treeptr);
{процедура просмотра узлов дерева слева направо}
   begin
   reset(f);
   seek(f,0);
   writeln('');  
   writeln('Просмотр дерева');           writeln('____________________________________________________________________');
writeln('|                 |                  Станция                   |         Время                   |   Стоимость    |');
writeln('|№ поезда |_________________________|   __________________|         билета      |');
writeln('|                 |   отправление  |   прибытие    |отправление|прибытие|          (грн)       |');
writeln('|___________________________________________________________________|');
   if top<>nil then begin
     read(f,z); {считывание записей из файла}
     prosmotr(top^.left); {обойти левое поддерево}
     writeln(i,' ',top^.data.nomer,' ',top^.data.st_otp,' ',top^.data.st_pr,
            ' ',top^.data.vr_otp,' ',top^.data.vr_pr,' ',top^.data.stoim);
        i:=i+1;
     prosmotr(top^.right); {обойти правое поддерево}
    end;
   close(f);
  end;
procedure otobr(top:treeptr; otstup:integer); {процедура отображения структуры дерева}
  begin
    reset(f);
    seek(f,0);
    if top<>nil then
      begin
        read(f,z);
       otstup:=otstup+3;
       otobr(top^.left,otstup);
       writeln('':otstup,top^.data.nomer);
       otobr(top^.right,otstup);
     end;
   close(f);
   readln;
 end;
procedure printlist (anode:treeptr); {процедура просмотра элементов всех листьев дерева}
   begin
     reset(f);
     seek(f,0);
    writeln('');
    writeln('Просмотр всех элементов листьев дерева');
  writeln('____________________________________________________________________');
  writeln('|                 |                  Станция                   |         Время                   |   Стоимость    |');
  writeln('|№ поезда |_________________________|   __________________|         билета      |');
  writeln('|                 |   отправление  |   прибытие    |отправление|прибытие|          (грн)       |');
  writeln('|___________________________________________________________________|');
    if anode<>nil then
      begin
        read(f,z);
         if(anode^.left=nil) and (top^.right=nil) then {установить указатель на листья дерева}
           printlist(anode^.left); {обход листьев слева}
           writeln(' ',anode^.data.nomer,' ',anode^.data.st_otp,' ',anode^.data.st_pr,
                        ' ',anode^.data.vr_otp,' ',anode^.data.vr_pr,' ',anode^.data.stoim);
          printlist(anode^.right); {обход листьев справа}
      end;
  close(f);
  readln;
 end;
 {основная программа}
begin
   assign(f,'data.txt'); {установить связь логического и физического файлов}
     {$I-} {отключить проверку ошибок ввода-вывода }
      reset(f); {открыть файл для чтения и добавления записей}
     {$I+} {включить проверку ошибок ввода-вывода }
   if IOResult=0 then writeln('Запись в существующий файл')
     else begin  rewrite(f); {создание и открытие файла для чтения/записи}
                       writeln('Запись в новый файл');
          end;  
readln;
 repeat;
 clrscr;
 writeln(' _______________________________________);
 writeln('| 1 – Организация двоичного дерева                   |');
 writeln('| 2 – Добавления листа к дереву                          |');
 writeln('| 3 – Просмотр дерева                                           |');
 writeln('| 4 – Просмотр всех элементов листьев дерева  |');
 writeln('| 5 - Выход                                                              |');
 writeln('|________________________________________|');
 writeln('                          Выбор пункта меню       ');
 readln(number); {выход необходимой процедуры по номеру}
 case number of
  1:orgtree;
  2:dobl;
  3:begin
    i:=1;
    prosmotr(top);
    otobr(top,1);
    writeln('Нажмите клавишу Enter');
    readln;
    end;
  4:begin
    printlist(top);
    readln;
    end;
  end;
 until number=5;
 end.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26343 / 17674 / 6998
Регистрация: 22.10.2011
Сообщений: 31,100
Записей в блоге: 6
09.06.2013, 20:15 6
Roxanne, не-не, так не пойдет. У тебя Sohr рекурсивная, и на каждом уровне файл будет пересоздаваться, в результате будет сохранено только одно значение (один лист). Создавай файл перед вызовом этой процедуры, и закрывай после возврата из нее.

Хотя ошибки 103 нет (проверял в FPC)
0
Roxanne
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 5
09.06.2013, 22:27  [ТС] 7
Сделала вот так:
Pascal
1
2
3
4
5
6
7
8
9
procedure sohr(top:treeptr); {процедура сохранения файла}
   begin
        if top<>nil then {если дерево не пустое}
        begin
          sohr(top^.left);  {обойти левое поддерево}
          sohr(top^.right); {обойти правое поддерево}
          write(f,top^.data);
       end;
      end;
А в процедуре организции дерева и добвления листа после процедуры sohr дописала close(f). Не сохраняется, а при попытке просмотра дерева выдает "мой любимый" exit code 3.
Не подскажите, что опять ему не нравится?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26343 / 17674 / 6998
Регистрация: 22.10.2011
Сообщений: 31,100
Записей в блоге: 6
10.06.2013, 00:58 8
Цитата Сообщение от Roxanne Посмотреть сообщение
Не сохраняется
Да, не сохраняется, потому что Exit, который выполняется при вводе звездочки, выходит не из цикла, а из процедуры orgtree, соответственно, до sohr дело даже не доходит... Если честно - не совсем понятно, чего ты хочешь добиться, сохранять дерево через sohr, или сохранять данные через write(f, ...), не используя sohr. вместе это использовать не нужно. А судя по дальнейшей работе с файлом (попытка добавления в конец файла из dobl, последовательное чтение из файла в процедуре prosmotr) - тебе нужно именно второе.

Либо вообще убери все попытки работать с файлом кроме как sohr + readfile:

Pascal
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
procedure dobl; {процедура добавления листа к дереву}
begin
  writeln('Добавления листа к дереву');
  readln(z.nomer);
  readln(z.st_otp);
  readln(z.st_pr);
  readln(z.vr_otp);
  readln(z.vr_pr);
  readln(z.stoim);
  top:=addtree(top,z); // добавили к дереву узел
  rewrite(f);
  sohr(top); // сохранили полностью дерево в файле
  close(f);
end;
 
procedure orgtree; {процедура организации дерева}
var answer : char;
begin 
  writeln('Организация дерева');
  writeln(' ');
  top:=nil;
  repeat
    dobl; // добавляем узел, используя процедуру dobl, не надо дублировать код !!!
    writeln('еще узел? (y/n)');
    readln(answer);
  until not (answer in ['y', 'Y']); 
  // ничего не надо сохранять, сохранение всего дерева
  // делается после ввода узла в dobl
end;
В общем, программу проще полностью переписать с нуля, чем исправить, в ней я вижу копи-паст как минимум из трех разных программ, и работать оно правильно уже не будет, всё перемешано...
1
10.06.2013, 00:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2013, 00:58

Бинарное дерево на Паскале.
Помогите пожалуйста реализовать дерево ____A __B___C ______D ____E___F...

вывести бинарное дерево на экран
у меня задание 1 построить дерево двоичного поиска, вывести его на экран любым...

Бинарное дерево поиска (вывод на экран)
Бинарное дерево поиска (вывод на экран) Помогите, не могу вывести нормально...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru