Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ динамические переменные ПОМОГИТЕ исправить ошибку

Автор: Mapa 1.06.2006 20:42

ПОМОГИТЕ исправить ошибку ПЛИЗ!

Код
program z13;
uses crt;
type
sp=^kniga;
kniga= record
fio: string[50];
adres:string;
tel:longint;
l:sp;
end;
var
ff: file of kniga;
bf: kniga;
top,p,t,n:sp;
fio,ffio:string[50];
adres,fadres:string;
y,k:integer;
tel,ftel:longint;
r:real;
flag:integer;
{процедура создания файла}
procedure pr(var top:sp);
var
p,t,n:sp;
fio:string[50];
adres:string;
tel:longint;
begin
assign(ff,'kniga.dat');
rewrite(ff);
reset(ff);
if flag=0 then
     begin
     top:=nil;
     flag:=1;
     end;
     clrscr;
     repeat
           write('BB fio - '); readln(bf.fio);
           if length(fio)<>0 then
              begin
              write(' BB adres - '); readln(bf.adres);
              write(' BB tel - '); readln(bf.tel);
              read(ff,bf);
              close(ff);
              new(n);
                n^.adres:=adres;
        n^.fio:=fio;
        n^.tel:=tel;
        n^.l:=nil;
                t:=top;
        p:=nil;
              while (t<>nil) and (fio>t^.fio) do
                    begin
                    p:=t; t:=t^.l;
                    end;
                 if p=nil then begin
                 n^.l:=top; top:=n;
                 end
                 else begin
                 n^.l:=p^.l; p^.l:=n;
                 end;
              end;
     until length(fio)=0;
t:=top;
     clrscr;
     writeln('spisok');
     while t<>nil do begin
           write( t^.fio,' ');
           write( t^.adres,' ');
           writeln( t^.tel,' ');
           t:=t^.l;
           end;

           readln;
end;
{процедура удаления файла}
procedure pdelete(var top:sp);
var
p,t,n:sp;
ffio,fio:string[50];
fadres:string;
ftel:longint;
f:real;
begin
f:=0;
t:=top;
clrscr;
writeln('кого удалить? (fio,adres,tel) ');
readln( ffio); readln( fadres); readln( ftel);
repeat
if (t^.fio = ffio) and (t^.adres = fadres) and (t^.tel = ftel) then begin
           p^.l:=t^.l;
           dispose(t);
           write( ffio,' ');
           write( fadres,' ');
           write( ftel,' ');
           writeln( 'удален');
           f:=1;
           end;
t:=t^.l;
until t=nil;
if f=0 then begin writeln('в списке нет искомого человека');
readln; end;
t:=top;
     writeln('spisok');
     while t<>nil do begin
           write( t^.fio,' ');
           write( t^.adres,' ');
           writeln( t^.tel,' ');
           t:=t^.l;
           end;
           readln;
end;
{основная программа (меню)}
begin
assign(ff,'kniga.dat');
rewrite(ff);
reset(ff);
flag:=0;
clrscr;
repeat
writeln('1 - добавить');
writeln('2 - удалить');
writeln('3 - выйти');
readln(y);
clrscr;
case y of
     1: {writeln('1- процедура выполнена');} pr(top);
     2: {writeln('2- процедура выполнена');} pdelete(top);
end;
if y>3 then
   writeln('ошибка ввода');
until y=3;
end.

Автор: volvo 1.06.2006 21:26

Программа компилируется прекрасно, стало быть "ошибка" - это неправильная работа? Без исходных данных и указания точного места ошибки вопрос останется без ответа.

Кому охота ползать по ТАКОЙ программе в поисках непонятно какой ошибки?

Автор: Rolsik 1.06.2006 22:08

if length(fio)<>0 then
begin
write(' BB adres - '); readln(bf.adres);
write(' BB tel - '); readln(bf.tel);
read(ff,bf);
close(ff);
new(n);


Проблема явно в
 read(ff,bf);
непонятен смысл этой строки, если было думано внести звпись в файл то писать надо было write(ff,bf)

Автор: Mapa 2.06.2006 23:48

проблема вот вчем:
нужно сделать программу Телефонный справочник
1-добавить (фамилию адрес телефон) при этом вывести список
2 -удалить (то же самое)

добавление работает неправильно
люди добрые
помогите сделать чтоб работало (ибо до конца я не понимаю в этих указатель (каюсь))

Автор: Rolsik 3.06.2006 4:06

Если выложите полностью все условия задачи, то я попробую написать код заново... Т.к то, что выложено вами ранее написано так криво что проще переписать всё заново...

Автор: lapp 3.06.2006 15:16

Цитата(Mapa @ 2.06.2006 20:48) *
люди добрые
помогите сделать чтоб работало (ибо до конца я не понимаю в этих указатель (каюсь))

Я причесал твою прогу. Постарайся ее больше не лохматить. Стандартный сдвиг - 2 позиции.
Зайди у себя в Паскалевской среде в Options - Environment - Editor. Там сними крестик с опции "Use tab characters". Поставь Tab size=2 и Indent size=2.
program z13;
uses crt;

type
sp=^kniga;
kniga= record
fio: string[50];
adres:string;
tel:longint;
l:sp;
end;

var
ff: file of kniga;
bf: kniga;
top,p,t,n:sp;
fio,ffio:string[50];
adres,fadres:string;
y,k:integer;
tel,ftel:longint;
r:real;
flag:integer;

{процедура создания файла}
procedure pr(var top:sp);
var
p,t,n:sp;
fio:string[50];
adres:string;
tel:longint;

begin
if flag=0 then begin
top:=nil;
flag:=1;
end;
clrscr;
repeat
write('BB fio - '); readln(bf.fio);
if length(fio)<>0 then begin
write(' BB adres - '); readln(bf.adres);
write(' BB tel - '); readln(bf.tel);
read(ff,bf);
close(ff);
new(n);
n^.adres:=adres;
n^.fio:=fio;
n^.tel:=tel;
n^.l:=nil;
t:=top;
p:=nil;
while (t<>nil) and (fio>t^.fio) do begin
p:=t; t:=t^.l;
end;
if p=nil then begin
n^.l:=top; top:=n;
end
else begin
n^.l:=p^.l; p^.l:=n;
end;
end;
until length(fio)=0;
t:=top;
clrscr;
writeln('spisok');
while t<>nil do begin
write( t^.fio,' ');
write( t^.adres,' ');
writeln( t^.tel,' ');
t:=t^.l;
end;
readln;
end;

{процедура удаления файла}
procedure pdelete(var top:sp);
var
p,t,n:sp;
ffio,fio:string[50];
fadres:string;
ftel:longint;
f:real;
begin
f:=0;
t:=top;
clrscr;
writeln('кого удалить? (fio,adres,tel) ');
readln( ffio); readln( fadres); readln( ftel);
repeat
if (t^.fio = ffio) and (t^.adres = fadres) and (t^.tel = ftel) then begin
p^.l:=t^.l;
dispose(t);
write( ffio,' ');
write( fadres,' ');
write( ftel,' ');
writeln( 'удален');
f:=1;
end;
t:=t^.l;
until t=nil;
if f=0 then begin
writeln('в списке нет искомого человека');
readln;
end;
t:=top;
writeln('spisok');
while t<>nil do begin
write( t^.fio,' ');
write( t^.adres,' ');
writeln( t^.tel,' ');
t:=t^.l;
end;
readln;
end;

{основная программа (меню)}
begin
assign(ff,'kniga.dat');
reset(ff);
flag:=0;
clrscr;
repeat
writeln('1 - добавить');
writeln('2 - удалить');
writeln('3 - выйти');
readln(y);
clrscr;
case y of
1: {writeln('1- процедура выполнена');} pr(top);
2: {writeln('2- процедура выполнена');} pdelete(top);
end;
if y>3 then
writeln('ошибка ввода');
until y=3;
end.

Теперь по делу: у тебя файл открывался в нескольких местах, причем ты в каждом месте использовала и Reset, и Rewrite. Надо сделать это один раз - например, при входе в прогу.

Это для начала smile.gif. Если тебя это заинтересовало, посмотрю дальше..

Автор: Mapa 3.06.2006 16:10

lapp посмотри пожалуйста
Заранее ОГРОМНОЕ СПАСИБО

Автор: volvo 3.06.2006 16:30

Mapa, ты знаешь, Rolsik в чем-то прав... Ту программу, которую ты привела, легче переписать заново, чем исправить... Ну, смотри, что происходит...

Возьмем, например, процедуру создания файла... Почему ты в этой же процедуре занимаешься добавлением элементов в список? Смысл в этом какой? Плюсы есть? Вот минус я тебе приведу: если тебе вдруг понадобится в другом месте программы внести в список ЕЩЕ один элемент, ты будешь переписывать тот же код...

Дело все в том, что программы для работы с динамическими структурами должны строиться по принципу "разделяй и властвуй": добавить элемент в список - отдельная процедура, удалить элемент из списка - отдельная (НЕ привязываясь к файлам)... Распечатка списка - третья процедура... А потом из этих "кирпичиков" создавать программу... А не делать все одним "бетонным блоком". Уж очень этот блок неповоротливым получается...

Автор: lapp 3.06.2006 17:48

Mapa, я посмотрел, но диагноз неутешительный.. Действительно много ошибок и переделка нужна большая. Если ты сама писала этот код - продолжай задавать конкретные вопросы. Если нет - лучше с нуля по рекомендациям volvo и Rolsik'а. А может, и в любом случае лучше с нуля.. С блок-схемы.