IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Двумерный список, Проблема обнуления инфы второго списка
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Дело вот в чем:
Я создаю список рейсов, заполняю каждый из них пассажирами и инфой о них... Далее я создаю еще один рейс... Вся инфа о пассажирах, введенная ранее пропадает... 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;


Сообщение отредактировано: QDe5n1K -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






QDe5n1K
Ну сколько же можно делать одни и те же действия? Список и работу с ним не нужно "растворять" в программе. Наоборот, вся работа со списком должна производиться с использованием одних и тех же процедур и функции...

Т.е. раз и навсегда (на всю программу) пишется функция инициализации списка, добавления элемента, поиска, удаления элемента, удаления и печати списка. Благодаря чему программа становится в 3 раза короче, и сильно снижается вероятность совершить ошибку...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Похожая проблема с теме же кусками.
Дело в том что после создания списка рейсов и при попытке заполнить один из них пассажирами, заполняются все... Попробовал урезать код на столько , чтобы можно было заполнять только 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

Сообщение отредактировано: QDe5n1K -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.04.2025 18:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name