Помощь - Поиск - Пользователи - Календарь
Полная версия: Двумерный список
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
QDe5n1K
Дело вот в чем:
Я создаю список рейсов, заполняю каждый из них пассажирами и инфой о них... Далее я создаю еще один рейс... Вся инфа о пассажирах, введенная ранее пропадает... sad.gif
Код

type
    Ppass=^reis;
    reis=record
    name,prizn,punkt:string;
    next:ppass;
    end;

    Preis=^allreis;
    allreis=record
    number:ppass;
    name:string[10];
    next:preis;
    end;

.........................
procedure add_reis(var pr:preis);
var number:string;
pp,last,nach:preis;

begin
clrscr;
writeln('Na danniy moment sushestvuyut reisi:');
printallreis(pr);
readln;
repeat
clrscr;
gotoxy(1,1); writeln('Vvedite nomer novogo reisa:');
readln(number);
if (number<>'') then
 begin
new(pp);
pp^.name:=number;
pp^.next := nil;
if pr = nil then pr := pp else last^.next := pp;
last := pp;
end;
until number='';
clrscr;
writeln('Na danniy moment sushestvuyut reisi:');
nach:=pr;
printallreis(pr);
while assigned(pr) do
begin
pr^.number^.next:=nil;
pr:=pr^.next;
end;
pr:=nach;
end;



procedure add_pass(var pr:preis; var test:boolean);
label repet,end1,repet2;
var ppas,pp,nachpass:ppass;
   number,s:string;
   b:boolean;
   i,n:integer;
   nachreis:preis;
begin
repet:
nachreis:=pr;
printallreis(pr);
searchreis(pr,b);                         {эта процедура возвращает уже нажный мне рейс, тот, куда я буду заносить пассажирова}
if not b then
begin
repeat;
warning;
writeln('Takogo reisa net. y - povtorit, n - vihod');
if readkey='y' then begin goto repet; pr:=nachreis; end
              else if readkey='n' then begin textcolor(white); goto end1; end;
until readkey=#1;
end;
begin
pp:=pr^.number;
while pp^.next<> nil do pp:=pp^.next;
new(ppas);
repeat
write('Name: ');
readln(ppas^.name);
until ppas^.name<>'';
repeat
write('Info: ');
readln(ppas^.prizn);
until ppas^.prizn<>'';
repeat
write('Fly to: ');
readln(ppas^.punkt);
until ppas^.punkt<>'';
ppas^.next:=nil;
pp^.next:=ppas;
pp:=pr^.number^.next;
end;
nachpass:=pr^.number^.next;
printpass(pr^.number^.next);
pr^.number^.next:=nachpass;
test:=true;
end1:
pr:=nachreis;
end;
volvo
QDe5n1K
Ну сколько же можно делать одни и те же действия? Список и работу с ним не нужно "растворять" в программе. Наоборот, вся работа со списком должна производиться с использованием одних и тех же процедур и функции...

Т.е. раз и навсегда (на всю программу) пишется функция инициализации списка, добавления элемента, поиска, удаления элемента, удаления и печати списка. Благодаря чему программа становится в 3 раза короче, и сильно снижается вероятность совершить ошибку...
QDe5n1K
Похожая проблема с теме же кусками.
Дело в том что после создания списка рейсов и при попытке заполнить один из них пассажирами, заполняются все... Попробовал урезать код на столько , чтобы можно было заполнять только 1 рейс, однако проблема остается... 2 и последующий рейсы я не трогаю, а они заполняются...
Код
type
    Ppass=^reis;
    reis=record
    name:string;
    next:ppass;
    end;

    Preis=^allreis;
    allreis=record
    number:ppass;
    name:string[10];
    next,prev:preis;
    end;

Нижеследующий код на мой взгляд не таит в себе ошибок, но кто знает...
Код

procedure add_reis(var pr1:preis);
var number:string;
pr2,prnach:preis;
ok:boolean;
begin
repeat
clrscr;
prnach:=pr1;
name(number,2);             {vozvrashaet number}
searchreis(pr1,ok,number);  {ishet reis pod nomerrom "number" vozvrashaet
                           nujniy element spiska i ok=true - esli uje est' takoy reis, ili  
                           esli takogo reisa eshe net, to ok=false}
pr1:=prnach;
if (number<>'') and not ok then
begin
new(pr2);
pr2^.next:=nil;
pr2^.name:=number;
pr2^.number:=nil;
if pr1=nil then
pr1:=pr2  else
begin
prnach:=pr1;
while pr1^.next<>nil do
pr1:=pr1^.next;
pr1^.next:=pr2;
pr1:=prnach;
end;
end;
until number='';
end;

И наибольшие сомнения у меня вызывает вот эта процедура. Но ошибки не вижу... хоть убей...
Код

procedure add_pass(var pr:preis);
var ppas,pp:ppass;
   nachreis:preis;
begin
pp:=pr^.number;
while pp^.next<> nil do pp:=pp^.next;
new(ppas);
write('Name: ');
readln(ppas^.name);
ppas^.next:=nil;
pp^.next:=ppas;
end;

И еще, если можете, напишите, ваш вариант второй процедуры (add_pass)
Спасибо... smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.