вот наступила оень пора закрывать сессию!=)
вот смотрю я на свою прогу и не могу понять зачем я в ней счётчик сделал?
без него вроде не работает .. а что он делает я не поёму (забыл за лето)
может опытный глаз профи увидит недочёты
program laba_4_a;
uses crt;
type
link=^komanda;
komanda=record
name:string[20];
shayb:integer;
peredach:integer;
stime:integer;
nkom:string[10];
score:integer;
next:link;
end;
fkom=file of komanda;
var
f:fkom;
xxx,k,z,n,i:integer;
s,newrec:link;
p:pointer;
beg:link;
min_score:integer;
begin
xxx:=0;
repeat;clrscr;
writeln(' ....laba....');
gotoxy (1,10);
writeln ('1. VvoD DaHHbIX..........');
writeln ('2. View DaHHbIX..........');
writeln ('3. SaVe DaHHbIE..........');
writeln ('4. Load DaHHbIE..........');
writeln ('5. Delete................');
writeln ('9. BEST PLAYERS..........');
writeln (' ');
writeln ('0. E-X-I-T');
writeln ('Press 1-4:');
readln (z);
case z of
1:
begin
xxx:=xxx+1;
clrscr;
writeln ('BBeDuTe Kol-vo igrokov:');
readln (n);
mark(p);
beg:=nil;
for i:=1 to n do begin
new(s);
write ('N',i);
write (' Name of player:'); readln (s^.name);
write (' Kol-vo shayb:'); readln (s^.shayb);
write (' Kol-vo peregach:'); readln (s^.peredach);
write (' Shtraf.time:'); readln (s^.stime);
s^.score:=s^.shayb+s^.peredach;
s^.next:=beg;
beg:=s;
end;
end;
2:
begin
clrscr;
s:=beg;
writeln('Name of player Kol-vo shayb Kol-vo peredach Shraf.Time');
repeat
writeln(s^.name,' ',s^.shayb,' ',s^.peredach,' ',s^.stime);
s:=s^.next;
until s=nil;
readln;
end;
3:
begin
assign (f,'file.dat');
rewrite(f);
s:=beg;
repeat
write (f,s^);
s:=s^.next
until s=nil;
release(p);
end;
4:
begin
if xxx>0 then release(p);
assign (f,'file.dat');
reset(f);
mark(p);
s:=beg;
for i:=1 to filesize (f) do
begin new (s);
read(f,s^);
s^.next:=beg;
beg:=s;
end;
close (f);
{s:=beg;}
end;
9:
begin
clrscr;
writeln ('Enter min. Score');
readln (min_score);
s:=beg;
writeln('Name of player Kol-vo shayb Kol-vo peredach Shraf.Time');
repeat
if (min_score<=s^.score) then
writeln(s^.name,' ',s^.shayb,' ',s^.peredach,' ',s^.stime);
s:=s^.next;
until s=nil;
readln;
end;
5:
begin
writeln ('Enter Number...');
readln (n);
if n=1 then
begin newrec:=beg;
beg:=beg^.next;
end
else begin
s:=beg;
for i:=1 to n-2 do s:=s^.next;
newrec:=s^.next;
s^.next:=newrec^.next;
end;
dispose(newrec);
end;
end;
until z=0;
end.
ой блин осенило!!! он нужен чтоб нельзя была зайти в просмотр таблицы без еёё введения! сори за беспокойство!!
может есть недочёты в проге?
Что именно "не получается"?
Я имел в виду вот так:
Var
p_start: Pointer;
begin
WriteLn('Доступно памяти: ', MemAvail);
mark(p_start); { запомнил первоначальное состояние }
xxx:=0;
repeat; clrscr;
...
case z of
1 ...
end;
until z=0;
release(p_start); { вернулся к первоначальному состоянию }
WriteLn('Доступно памяти: ', MemAvail);
end.
я правильно понял твою мысль?
так?
Да объясни ты наконец, что значит "ругается"? Что, не работает, или сбоит, или вообще не запускается? Я ж не телепат...
"ругается" - вылетает.
может что-то не так с выделением памити и её отчисткой?
На самом деле это и должно происходить, потому что при выполнении "Сохранить" ты делаешь Release(P), а потом, например при "Удалить", хочешь освободить уже несуществующий указатель. Это - ошибка работы с памятью. Если тебе достаточно "залатать дыры", и заставить быстро программу работать - просто закомментируй описание
p: Pointer;и все вызовы Mark(P)/Release(P) ... Все равно перед выходом Release(p_start) вернет всю память системе.
Спасибо! попрбую перелопатить...
блин...
значит мне надо идти по этому пути 2) Отказаться от Mark/Release, и пользоваться только New/Dispose, это более сложный (может потребоваться реорганизация структуры программы), но и более надежный путь.
попрую с нуля написать...
а на форуме есть примеры прог похлжих на мою?
если есть подскажите где! спс!
program list;
uses CRT;
Type
SS=^Obj;
Obj=recoed
name:string[20];
shayb:integer;
peredach:integer;
stime:integer;
nkom:string[10];
score:integer;
next:SS;
end;
Var
Procedure Create (var Beg: SS );
Var P:SS;
Begin
Beg:=Nil;
Repeat
New (P);
writeln ('BBeDuTe Kol-vo igrokov:');
readln (n);
for i:=1 to n do begin
new(s);
write ('N',i);
write (' Name of player:'); readln (p^.name);
write (' Kol-vo shayb:'); readln (p^.shayb);
write (' Kol-vo peregach:'); readln (p^.peredach);
write (' Shtraf.time:'); readln (p^.stime);
p^.score:=p^.shayb+p^.peredach;
p^.next:=beg;
beg:=p;
end;
end;
:no: Попробуй разобраться:
Прикрепленные файлы
GOOD.PAS ( 4.02 килобайт )
Кол-во скачиваний: 263
спасибо :molitva: :flowers:
я конечно в шоке... вся ночь уйдёт на понимание ....
я наверно ещё свой набросок минут через 5ть покажу
program list;
uses CRT;
Type
SS=^Obj;
Obj=record
name:string[20];
shayb:integer;
peredach:integer;
stime:integer;
nkom:string[10];
score:integer;
next:SS;
end;
Var
PBeg :pointer;
N,i :integer;
Procedure Create (var Beg: pointer );
Var P :SS;
tmp :SS;
Begin
if (beg=nil) then begin
new(P);
beg:=P;
end else begin
tmp:=beg;
while tmp^.next<>nil do tmp:=tmp^.next;
new(p);
tmp^.next:=p;
end;
write (' Name of player:'); readln (p^.name);
write (' Kol-vo shayb:'); readln (p^.shayb);
write (' Kol-vo peregach:'); readln (p^.peredach);
write (' Shtraf.time:'); readln (p^.stime);
p^.next:=nil;
p^.score:=p^.shayb+p^.peredach;
end;
Procedure View (beg:pointer);
Var P:SS;
Begin
P:=Beg;
writeln('Name of player Kol-vo shayb Kol-vo peredach Shraf.Time');
repeat
writeln(p^.name,' ',p^.shayb,' ',p^.peredach,' ',p^.stime);
p:=p^.next;
until p=nil;
readln;
end;
BEGIN
PBeg := nil;
clrscr;
write('Please enter the number players: ');
ReadLn(n);
for i:=1 to n do begin
Writeln;
WriteLn('Enter info about player n. ',i);
Create(PBeg);
end;
ReadLn;
clrscr;
View(PBeg);
END.
Уже лучше, чем было, но все равно есть еще много над чем работать. Например, возьмем структуру Obj... Ты прямо в этой структуре хранишь указатель на следующий элемент (next), так? А зачем? Если ты запишешь эту структуру в файл, а потом прочитаешь, то прочитаешь ты элементы в другие адреса памяти, т.е. для сохранения работоспособности придется в поле next заново заносить правильную информацию, т.е. производятся лишние действия. Кроме того, размер файла тоже увеличивается (всего на 2 байта для каждого элемента списка, но все-таки, этого тоже можно избежать)...
Далее... При добавлении всех возможностей программы ты обязательно столкнешься с тем, что вот этот кусок будет дублироваться почти в каждой процедуре:
P:=Beg;Этого можно избежать (посмотри, как я это сделал). Кстати, с таким кодом ты элементарно можешь получить Run-Time Error: например, если в момент вызова View список еще не сформирован, и следовательно Beg = nil, что приведет к попытке перехода по нулевому указателю, а это Ошибка !!! Вот так будет гораздо правильнее:
...
repeat
{ Произвести какое-то действие с каждым элементом списка }
p:=p^.next;
until p = nil;
P:=Beg;Теперь если Beg = nil, то ты вообще не войдешь в цикл, как и должно быть...
...
While p <> nil Do Begin
{ Произвести какое-то действие с каждым элементом списка }
p:=p^.next;
End;
репит на вайл поменял=) спасибо! :molitva: :molitva: :molitva:
а вот с нехт не догнал...