Другие языки программирования и технологии

Помогите дописать прогу на паскале

Помогите дописать запись в файл вот для этой программы:

program Kursach;
uses crt;
type
el=^zap;
zap=record
nomerok:string[30];
Nazvanie_komandi:string[30];
God_osnovaniya:string[30];
Liga:string[30];
Trener:string[30];
Director:string[30];
Zvezdi_v_komande:string[30];
Rezultati_v_UEFA:string[30];
Rezultati_v_strane:string[30];
next:el;
end;

var
t:el;
num,m:integer;
nomerok,Rezultati_v_UEFA,Rezultati_v_strane,Nazvanie_komandi,God_osnovaniya,Liga,Director,Zvezdi_v_komande,Trener:string[100];

procedure add(var n:el;nomerok,Nazvanie_komandi,God_osnovaniya,Liga,Trener, Director,Zvezdi_v_komande,Rezultati_v_UEFA,Rezultati_v_strane:string;num:integer);
var
omega,top:el;
i:integer;
begin

new(omega);
omega^.nomerok:=nomerok;
omega^.Nazvanie_komandi:=Nazvanie_komandi;
omega^.God_osnovaniya:=God_osnovaniya;
omega^.Liga:=Liga;
omega^.Trener:=Trener;
omega^.Director:=Director;
omega^.Zvezdi_v_komande:=Zvezdi_v_komande;
omega^.Rezultati_v_UEFA:=Rezultati_v_UEFA;
omega^.Rezultati_v_strane:=Rezultati_v_strane;
if n=nil then begin
n:=omega;
omega^.next:=nil;
end
else if num=1 then begin
omega^.next:=n;
n:=omega;
end
else begin
i:=0;
top:=n;
while (i<>num-2) and (top^.next<>nil) do begin
i:=i+1;
top:=top^.next;
end;
omega^.next:=top^.next;
top^.next:=omega;
end;
end;

procedure del(num:integer; var n:el);
var omega,top:el;
i: integer;
begin
if n<>nil then begin
if num=1 then begin
omega:=n;
n:=n^.next;
dispose(omega);
end
else begin
i:=0;
top:=n;
while (i<>num-2) and (top^.next<>nil) do begin
i:=i+1;
top:=top^.next;
end;
if top^.next<>nil then begin
omega:=top^.next;
top^.next:=omega^.next;
dispose(omega);
end;
end;
end;
end;

procedure face(n: el);
var
top: el;
i:integer;
begin
clrscr;
top:=n;
i:=0;
if top=nil then writeln ('Список пуст')
else begin
writeln('Список содержит:');
while top <> nil do
begin
inc(i);
write(i,' ',top^.Nazvanie_komandi,' ',top^.God_osnovaniya, ' ', top^.Liga,' ',top^.Trener,top^.Director,top^.Zvezdi_v_komande,top^.Rezultati_v_UEFA,top^.Rezultati_v_strane);
writeln;
top:=top^.next;
end;
end;
end;

procedure List_del(var first:el);
var
p,q:el;
answer:string;
begin
clrscr;
if first <> nil then begin
writeln('Вы хотите удалить весь список? (Да/Нет)');
write('>>>'); readln(answer);
if answer= 'Да' then begin
q:=first;
p:=nil;
while (q<>nil) do begin
p:=q;
q:=q^.next;
dispose(p);
end;
first:=nil;
end;
end
else
writeln('Список пуст');
readln;
end;
Возможность записи в файл должна рассматриваться ещё на стадии проектирования структуры записи (record).
В твоей программе это не предусмотрено!
Нужно было вот так:

type
{ структура записи о команде }
tKomanda = record
nomerok:string[30];
Nazvanie_komandi:string[30];
God_osnovaniya:string[30];
Liga:string[30];
Trener:string[30];
Director:string[30];
Zvezdi_v_komande:string[30];
Rezultati_v_UEFA:string[30];
Rezultati_v_strane:string[30];
end;

{ односвязный список записей }
el=^zap;
zap=record
Komanda : tKomanda; { запись о команде }
next : el; { следующий элемент списка }
end;

Вот с такой структурой и работать проще!
Но! Нужно завести 2 переменные для первого и последнего элементов списка (не искать же последний каждый раз, когда он нам понадобится ;-) :

var First, Last : el;

В начале программы не забыть их обнулить:

First := nil; Last := nil;

К примеру твоя процедура ADD переписывается в вот такой вид:

procedure ADD(Komanda : tKomanda);
var Cur : el;
begin
{ Создаём новый элемент списка }
New(Cur);
Cur^.Komanda := Komanda;
Cur^.Next := nil;
if First = nil then First := Cur { Первый, если список пуст }
else Last^.Next := Cur; { Последний должен ссылаться на новый }
Last := Cur; { Указатель последнего передвинем на новый }
end;

Не правда ли, всё гораздо красивее и понятнее?
Komanda содержит в себе всю запись о команде.
Её заполнение перекладывается на другую процедуру.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

При такой структуре данные записать в файл проще-простого:

procedure SaveFile(Name : String);
var F : File of tKomanda; Cur : el;
begin
Assign(F, Name); Rewrite(F);
Cur := First;
while Cur <> nil do begin Write(F, Cur^.Komanda); Cur := Cur^.Next; end;
Close(F);
end;

Да и обратно прочесть нет проблем:

procedure LoadFile(Name : String);
var F : File of tKomanda; Komanda : tKomanda;
begin
Assign(F, Name); Reset(F);
while Not EOF(F) do begin Read(F, Komanda); Add(Komanda); end;
Close(F);
end;

Здесь мы использовали уже описанную процедуру ADD !!!

Дальше сам.
Удачи!
Sergey Zagumenny
Sergey Zagumenny
95 727
Лучший ответ