Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2009, 10:15   #1
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
Вопрос Сохранение и загрузка списков (Паскаль)

Привет всем

Мое задание - реализовать добавление в список А и удаление их из списка А в список Б, с возможность просмотра текущего состояния списков, с сохранением структуры в файл и загрузкой из файла.

Почти все задание сделано, но никак не могу закончить с сохранением и загрузкой списков. Нужно чтобы списки А и В сохранялись в файл и загружались из него. Но я никак не могу это сделать.

Помогите пожалуста доделать задание. Очень вас прошу.

Код:
program Laba_List;

Type
	plist = ^tl;
	tl = record
		next : plist;
		data: integer;
	end;
	TypList = file of integer;{типизированный файл}

Var  
	HeadA,curA: plist;
	HeadB,curB: plist;
	key: char;
	
	CurX:integer;
	A: TypList;
	startX: plist;
	

//просмотр
procedure ScanList(curTmp ,HeadTmp: plist);
begin
writeln ('Prosmotr spiska');
writeln;
if HeadTmp = nil then
	writeln ('Pustoy spisok')
else
begin
	curTmp := HeadTmp;
	while curTmp <> nil do
	begin
	write(curTmp^.Data, ' ');
	curTmp := curTmp^.Next
	end;
	writeln;
	writeln
end;
writeln;
end;

//добавление
procedure AddList(var curTmp,HeadTmp: plist;p:boolean);
var
temp:plist;
x: integer;
begin
if p then
begin
  Write ('Dobavit element: ');
  Readln (x)
  End  else
  Write('V spisok2 dobavlen element ' , CurX, ' udalen uz spiska1');
	New(temp);
	if p then temp^.Data := x
	  else  temp^.Data:=CurX;
	temp^.Next := nil;
	if HeadTmp = nil then
	begin
	  HeadTmp := temp;
	  curTmp:=HeadTmp
	End else  
	curTmp^.next := temp;
	curTmp := temp;
	if p then Writeln ('Dobavlen: ',curTmp^.Data);
	Writeln;
end;

//удаление элементов из списка А в список В
procedure DelList(var t1,t2,Headt1,Headt2: plist);
var
temp:plist;
begin
if Headt1 = nil then  Writeln('cnicok nycT')
end else
	if t1 = HeadA then
	begin
	HeadA := HeadA^.Next;
	Writeln ('Udalen ',t1^.data);
	CurX:=t1^.data;
	dispose(t1);
	t1 := HeadA
	end
	else
	begin
	temp := t1;
	t1:=HeadA;
	while t1^.Next <> temp do
		t1:= t1^.Next;
	t1^.next:=temp^.next;
	CurX:=temp^.data;
	Writeln ('Udalen ',temp^.data);
	dispose(temp)
	end;
AddList(curB,HeadB,false);
end;

{---вот с этими процедурами проблема----}

{сохранение структуры во внешнем файле} 
procedure Save(curTmp ,HeadTmp: plist; Var F:typlist);
begin
	curTmp := HeadTmp; 
	writeln('saving file');
	assign(f,'my.dat') ;
	reset(f); 
	while curTmp <> nil do 
	begin
	write(f, curTmp^.data);
	curTmp := curTmp^.Next 
	end; 
	close(f); 
end; 

{загрузка структуры из внешнего файла} 
Procedure Load (Var F:typlist; curTmp ,HeadTmp: plist);
var 
temp:plist;
Begin 
	assign(f,'my.dat');
	Writeln ('Loading file');
	reset(f); 
	While not eof(f) do begin 
	read (f, curtmp^.data); 
	curtmp:=curtmp^.next; 
	end; 
	close(f); 
End; 

Begin 
	HeadA:=nil; curA:=nil; 
	HeadB:=nil; curB:=nil; 
	CurX:=0; 
	
	Repeat
	Writeln ('====================');
	Writeln (' PROGRAM List');
	Writeln ('====================');
	Writeln ('1: Dobavit element v spisok-1');
	Writeln ('2: Udalit element v spisok-2 ');
	Writeln ('3: Prosmotr spiska-1');
	Writeln ('4: Prosmotr spiska-2');
	Writeln ('5: Save');
	Writeln ('6: Load');
	Writeln ('0: Exit');
	Writeln ('====================');
	Readln (key); 
	
	case key of 
	'1': AddList(curA,HeadA,true); 
	'2': DelList(curA,curB,HeadA,HeadB); 
	'3': ScanList(curA,HeadA);
	'4': ScanList(curB,HeadB); 
	'5': Save (cura,HeadA,a);
	'6': Load (A, cura,curb); 
	end; 
	until key ='0'; 
End.
diliana вне форума Ответить с цитированием
Старый 24.05.2009, 14:11   #2
Chudo4258
Форумчанин
 
Аватар для Chudo4258
 
Регистрация: 19.02.2009
Сообщений: 622
По умолчанию

Вот посмотри, но только тут двунаправленых список.
Жми на весы!!!

Последний раз редактировалось Chudo4258; 24.05.2009 в 16:11.
Chudo4258 вне форума Ответить с цитированием
Старый 24.05.2009, 15:06   #3
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
По умолчанию

Chudo4258

я посмотрела, ничего не понятно, у тебя же на делфи написано, а мне надо на паскале...

спасибо, конечно, за ответ, только он не решил проблему мою...

Может кто-нибудь поможет, как это на паскале сделать?
Пожалуста...
diliana вне форума Ответить с цитированием
Старый 24.05.2009, 15:14   #4
Chudo4258
Форумчанин
 
Аватар для Chudo4258
 
Регистрация: 19.02.2009
Сообщений: 622
По умолчанию

а разницы особо между паскалем и делфи нет.
AssignFile = Assign
CloseFile = Close

Запись в файл:
Код:
Assign(f,'Zap.txt');
Rewrite(f);
vsp:=S; // S - указатель на начало списка;  vsp:=S - для того чтобы не потерять указатель на начало
if vsp=nil then writeln(f,'Пусто!!!')
           else
while vsp<>nil do
 begin
  writeln(f,IntToStr(vsp^.Inf));
  vsp:=vsp^.Next;
 end;
Close(f);
Жми на весы!!!

Последний раз редактировалось Chudo4258; 24.05.2009 в 15:16.
Chudo4258 вне форума Ответить с цитированием
Старый 24.05.2009, 15:20   #5
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
По умолчанию

Цитата:
Сообщение от Chudo4258 Посмотреть сообщение

writeln(f,IntToStr(vsp^.Inf));
А что это такое???
diliana вне форума Ответить с цитированием
Старый 24.05.2009, 15:26   #6
Chudo4258
Форумчанин
 
Аватар для Chudo4258
 
Регистрация: 19.02.2009
Сообщений: 622
По умолчанию

т.к. у вас файл типизированный и vsp^.data того же типа что и файл, тогда вам надо:
Код:
write(f,vsp^.Inf);
запись в файл у вас вреде бы все верно.
а вот чтенеи из файла ...

Код:
procedure Save(curTmp ,HeadTmp: plist; Var F:typlist);
begin
	curTmp := HeadTmp; 
	writeln('saving file');
	assign(f,'my.dat') ;
	rewrite(f); 
	while curTmp <> nil do 
	begin
	write(f, curTmp^.data);
	curTmp := curTmp^.Next 
	end; 
	close(f); 
end;
Цитата:
загрузка структуры из внешнего файла
: вы предполагаете что у вас список уже создан и вы заполняете только поле data, а нужно список создавать.

чтение из файла:
Код:
assign(f,'my.dat');
Writeln ('Loading file');
reset(f); 
new(vsp);
read(f,vsp^.data);
vsp^.next:=nil;
S:=vsp; // начало списка

While not eof(f) do begin 
new(vsp1);
read (f, vsp1^.data);
vsp^.next:=vsp1; // соединили
vsp:=vsp1; 
end; 
close(f);
и уточните еще
Код:
assign(f,'my.dat');
, а именно my.dat - можно так записывать если
Код:
f: file of integer
.

Мне кажется что надо так:
Код:
assign(f,'my');
Жми на весы!!!

Последний раз редактировалось Stilet; 25.05.2009 в 09:23.
Chudo4258 вне форума Ответить с цитированием
Старый 24.05.2009, 20:27   #7
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
По умолчанию

Chudo4258, спасибо за внимание

вот переделала процедуру Save теперь работает, файл mylist.dat создается, и что-то туда пишется, он во всяком случае не пустой.

Вот код процедуры.

Код:
{сохранение структуры во внешнем файле}
procedure Save(curTmp ,HeadTmp: plist; Var F:typlist);
begin
	writeln('saving file');
	assign(f,'mylist.dat') ;
	Rewrite(f);
	curTmp := HeadTmp;
	while curTmp <> nil do
	begin
		write(f, curTmp^.data);
		curTmp := curTmp^.Next
	end;
	close(f);
end;
и процедура Load.

У меня по этой процедуре вопрос - вот я создала список , сохранила его в файл mylist.dat, затем я как бы могу спокойно закрыть программу (потому что данные сохраненны) и когда я заново запускаю программу могу спокойно загрузить список из сохранненнго файла, но на деле получается только сохранить данные в список, обратноя загрузка данных из файлов в программу почему-то не выходит...
в чем дело или я неправильно понимаю "загрузку списка из файла)...

Обьясните пожалуста.


Вот код
Код:

{загрузка структуры из внешнего файла}
Procedure Load (Var F:typlist; curTmp ,HeadTmp: plist);
var
  vsp, vsp1:plist;

Begin
   assign(f,'mylist.dat');
   Writeln ('Loading file');
   reset(f);
   new(vsp);
   read(f,vsp^.data);
   vsp^.next:=nil;
   HeadTmp:=vsp; // начало списка

   While not eof(f) do begin
   new(vsp1);
   read (f, vsp1^.data);
   vsp^.next:=vsp1; // соединили
   vsp:=vsp1;
   end;
   close(f);
End;



Вот полный листинг, можешь проверить


Код:
program Project_list;

Type
  plist = ^tl;
  tl = record
  next : plist;
  data: integer;
  end;
  TypList = file of integer;{типизированный файл}

Var
  HeadA,curA: plist;
  HeadB,curB: plist;
  key: char;
  CurX:integer;
  A: TypList;

procedure ScanList(curTmp ,HeadTmp: plist);
begin
  writeln ('Prosmotr spiska');
  writeln;
  if HeadTmp = nil then
    writeln ('Pustoy spisok')
  else
  begin
    curTmp := HeadTmp;
    while curTmp <> nil do
    begin
      write(curTmp^.Data, ' ');
      curTmp := curTmp^.Next
    end;
    writeln;
    writeln
  end;
  writeln;
end;
 
procedure AddList(var curTmp,HeadTmp: plist;p:boolean);
var
  temp:plist;
  x: integer;
begin
  if p then
  begin
    Write ('Dobavit element: ');
    Readln (x)
  end
  else
    Write('V spisok2 dobavlen element ' , CurX, ' YdaleNNbli uz pervogo spiska');
  New(temp);
  if p then temp^.Data := x
   else  temp^.Data:=CurX;
  temp^.Next := nil;
  if HeadTmp = nil then
  begin
    HeadTmp := temp;
    curTmp:=HeadTmp
  end
  else  curTmp^.next := temp;
  curTmp := temp;
  if p then Writeln ('Dobavlen: ',curTmp^.Data);
  Writeln;
end;
 
 
procedure DelList(var t1,t2,Headt1,Headt2: plist);
var
  temp:plist;
begin
  if Headt1 = nil then Writeln('cnicok nycT')
    else
    if t1 = HeadA then
    begin
      HeadA := HeadA^.Next;
      Writeln ('Udalen ',t1^.data);
      CurX:=t1^.data;
      dispose(t1);
      t1 := HeadA
    end
    else
    begin
      temp := t1;
      t1:=HeadA;
      while t1^.Next <> temp do
        t1:= t1^.Next;
      t1^.next:=temp^.next;
      CurX:=temp^.data;
      Writeln ('Udalen ',temp^.data);
      dispose(temp)
    end;
  AddList(curB,HeadB,false);
end;


{сохранение структуры во внешнем файле}
procedure Save(curTmp ,HeadTmp: plist; Var F:typlist);
begin
	writeln('saving file');
	assign(f,'mylist.dat') ;
	Rewrite(f);
	curTmp := HeadTmp;
	while curTmp <> nil do
	begin
		write(f, curTmp^.data);
		curTmp := curTmp^.Next
	end;
	close(f);
end;

{загрузка структуры из внешнего файла}
Procedure Load (Var F:typlist; curTmp ,HeadTmp: plist);
var
vsp, vsp1:plist;
stt: integer;
Begin
assign(f,'mylist.dat');
Writeln ('Loading file');
reset(f);
new(vsp);
read(f,vsp^.data);
vsp^.next:=nil;
HeadTmp:=vsp; // начало списка

While not eof(f) do begin
new(vsp1);
read (f, vsp1^.data);
vsp^.next:=vsp1; // соединили
vsp:=vsp1;
end;
close(f);
End;

Begin
HeadA:=nil; curA:=nil;
HeadB:=nil; curB:=nil;
CurX:=0;

Repeat
Writeln ('================================');
Writeln (' PROGRAM List');
Writeln ('================================');
Writeln ('1: Dobavit element v spisok-1  ');
Writeln ('2: Udalit element v spisok-2   ');
Writeln ('3: Prosmotr spiska-1           ');
Writeln ('4: Prosmotr spiska-2           ');
Writeln ('5: Save                        ');
Writeln ('6: Load                        ');
Writeln ('0: Exit                        ');
Writeln ('================================');
Readln (key); 
case key of 
'1': AddList(curA,HeadA,true); 
'2': DelList(curA,curB,HeadA,HeadB); 
'3': ScanList(curA,HeadA);
'4': ScanList(curB,HeadB); 
'5': Save (cura,HeadA,a);
'6': Load (A, cura,HeadA);
end; 
until key ='0'; 
End.

Последний раз редактировалось diliana; 24.05.2009 в 21:09.
diliana вне форума Ответить с цитированием
Старый 24.05.2009, 21:22   #8
Chudo4258
Форумчанин
 
Аватар для Chudo4258
 
Регистрация: 19.02.2009
Сообщений: 622
По умолчанию

попробуй убрать расширения у файлов.
mylist.dat = mylist

Цитата:
У меня по этой процедуре вопрос - вот я создала список , сохранила его в файл mylist.dat, затем я как бы могу спокойно закрыть программу (потому что данные сохраненны) и когда я заново запускаю программу могу спокойно загрузить список из сохранненнго файла, но на деле получается только сохранить данные в список, обратноя загрузка данных из файлов в программу почему-то не выходит...
в чем дело или я неправильно понимаю "загрузку списка из файла)...
По идее должно считываться. Сейчас некогда проверять код, как-нибудь потом...
Жми на весы!!!
Chudo4258 вне форума Ответить с цитированием
Старый 24.05.2009, 21:39   #9
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
По умолчанию

Цитата:
Сообщение от Chudo4258 Посмотреть сообщение
попробуй убрать расширения у файлов.
mylist.dat = mylist
По идее должно считываться. Сейчас некогда проверять код, как-нибудь потом...
пробовала - это бессполезно....
Выходит сообщение «список пуст», то есь процедура Load получается не считывает данные с файла.....

ех, что же делать-то???
diliana вне форума Ответить с цитированием
Старый 25.05.2009, 00:01   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

diliana, я не знаю, сами ли Вы писали данную программу, если да - респект!

чтобы всё заработало добавить VAR в описание процедуры Load:
Код:
Procedure Load (Var F:typlist; var curTmp ,HeadTmp: plist);
да. и ещё.
перед Close(f) в последнем элементе неплохо было бы добавить ссылочку на nil:
Код:
vsp^.next:=nil;
close(f);

to Chudo4258, по поводу расширений. Запомните на будущее, расширения важны только для того, чтобы ОС "думала", что она знает, что это за тип файла. (и, соответственно, отображала нужные значки, запускала назначенные приложения и т.д. и т.п.).
Для человека, пишущего обработку данных расширение — полностью самостоятельный выбор.
Единственное, я бы рекомендовал не использовать широкоизвестные расширения (EXE, COM, DOC, CMD, BAT, RAR, ZIP, JPG и т.д. и т.п.), но не потому, что программа не будет работать, а просто потому, чтобы Ваш файл никто не перепутал!
И в данном случае выбор расширения .DAT - отличный выбор!!

Последний раз редактировалось Serge_Bliznykov; 25.05.2009 в 00:04.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение и загрузка строк из listbox Anfall Компоненты Delphi 4 12.05.2009 13:52
Загрузка/сохранение рисунков Marsik Помощь студентам 20 20.11.2008 18:09
Загрузка и сохранение в файл rainbow Общие вопросы Delphi 16 27.09.2008 11:35
HRGN сохранение-загрузка? Comer_Jus Общие вопросы Delphi 5 21.05.2008 20:12
Сохранение и загрузка информации Slash Общие вопросы Delphi 9 04.02.2007 22:01