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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2009, 18:16   #1
Cade
Новичок
Джуниор
 
Регистрация: 04.07.2009
Сообщений: 1
По умолчанию Помогите найти ошибку в программе на Pascal

uses crt;
type uk=^styd;
styd=record
fio:string[20];
adr:uk;
end;
var p1,p2,first:uk;f:text;
procedure sozd_spis;
begin
assign(f,'c:\prim\famil.txt');
{$I-}reset(f);{$I+}
if ioresult <> 0 then
begin writeln('net faila');
readkey;
exit;
end;
first:=nil;
while not eof(f) do
begin new(p1);
readln(f,p1^.fio);
if first=nil
then first:=p1;
p2:=p1;
end;
p2^.adr:=nil;
end;

procedure vivod_spis;
begin
p1:=first;
while p1<> nil do
begin writeln(p1^.fio,' ');
p1:=p1^.adr;
end;
end;

procedure sort_spis;
var buf:string[20];priz:boolean;
begin
repeat
priz:=true;
p1:=first;
while p1^.adr<>nil do
begin if p1^.fio>p1^.adr^.fio then
begin buf:=p1^.fio;
p1^.fio:=p1^.adr^.fio;
p1^.adr^.fio:=buf;
priz:=false;
end;
p1:=p1^.adr;
end;
until priz;
end;

procedure udal_spis;
var name:string[20];
begin
writeln('vvedite ydal familiy');
readln(name);
p1:=first;
p2:=p1;
while p1 <> nil do
if p1^.fio<> name then
begin p2:=p1;
p1:=p1^.adr;
end
else if p1=first then
begin first:=p1^.adr;
dispose(p1);
p1:=first;
end
else
begin p2^.adr:=p1^.adr;
dispose(p1);
p1:=p2^.adr;
end;
end;

procedure dobav_sort;
var priz:boolean; d:uk;
begin
new(d);
writeln('Введите новое значение');
readln(d^.fio);
d^.adr:=nil;
priz:=true;
p1:=first;
while (p1 <> nil) and priz do
if p1^.fio> d^.fio then
begin priz:=false;
if p1=first then
begin d^.adr:=first;
first:=d;
end
else
begin d^.adr:=p2^.adr;
p2^.adr:=d;
end
end
else
begin p2:=p1;
p1:=p1^.adr;
end;
if priz then p2^.adr:=d;
writeln('Потавили новое значение');
readln;
end;

begin
repeat
clrscr;
writeln('1 - Создание списка');
writeln('2 - Вывод списка');
writeln('3 - Сортировка списка');
writeln('4 - Удаление списка');
writeln('5 - Добавление в список');
writeln('6 - Выход и программы');
case readkey of
'1': sozd_spis;
'2': vivod_spis;
'3': sort_spis;
'4': udal_spis;
'5': dobav_sort;
'6': Exit;
end;
until false;
end.


не выводит дальше первого элемента(((
Cade вне форума Ответить с цитированием
Старый 04.07.2009, 20:07   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ошибка при создании списка не проставляются ссылки в элементе на следующий (поле ADR не заполняется)...
Код:
    if first = nil
      then first := p1
    else
       {если не первая запись, значит надо
         проставить ссылку у предыдущей на текущую}
       p2^.adr := p1;
и ещё. 1) не забывайте использовать тег [СODE] (это можно получить нажав на иконку решёточка #)
2) обязательно добавляйте в конце процедур сообщение и паузу.
Тот же вывод пролетает, потом экран стирается и выводится меню. Вы просто не успеете что-либо увидеть!
Сравните с таким:
Код:
procedure vivod_spis;
begin
  WriteLn('Список:');
  p1 := first;
  while p1 <> nil do
  begin 
    writeln(p1^.fio, ' ');
    p1 := p1^.adr;
  end;
  WriteLn(' для продолжения нажмите любую клавишу...');
  readkey;
end;
p.s. остальное не смотрел...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку в программе Nemles Помощь студентам 0 14.06.2009 14:21
Помогите найти ошибку в программе Wast Паскаль, Turbo Pascal, PascalABC.NET 2 29.12.2008 20:40
помогите на найти ошибку в программе SYL@R Помощь студентам 1 28.11.2008 12:35
Помогите найти ошибку в программе Evgenii Помощь студентам 3 24.07.2008 09:06
Помогите найти ошибку в программе KnDmPetr Паскаль, Turbo Pascal, PascalABC.NET 5 10.03.2008 14:19