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

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

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

 
 Ответить  Открыть новую тему 
> не могу выйти из цикла, помогите найти и исправить ошибку
сообщение
Сообщение #1





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

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


есть программка:
  type luggage=record
fio: String[20];
number: Integer;
weight: Real
end ;
type uk=^lug;
lug=record
data:luggage;
next:uk;
end;

procedure PrintList (head:uk);
var x:uk;
i:integer;
begin
x:=head;
i:=1;
while x<>nil do
begin
with x^.data do
writeln(i:2,' ',fio:20,' ',number:2,' ',weight:3);
inc(i);
x:=x^.next
end
end;

procedure AddFirst(var head:uk);
var x:luggage;
a:string[20];
b:integer;
c:real;
tmp:uk;
begin
Write('Имя пассажира ');
Readln(a);
x.fio:=a;
Write('Количество вещей ');
Readln(b);
x.number:=b;
Write('Вес ');
Readln©;
x.weight:=c;
new(tmp);
tmp^.data:=x;
tmp^.next:=head;
head:=tmp;
end;

var head,tmp:uk;
n,i,k,z,l:integer;
x:luggage;
m,s:real;

begin
head:=nil;
write('введите число пассажиров ');

readln(n);

i:=0;
for i:=1 to n do begin

AddFirst(head);
end;

PrintList(head);
k:=0;


tmp:=head;
z:=tmp^.data.number;

While tmp^.next <> nil do begin

if z= tmp^.data.number then
k:=k+1;
end;
writeln('k=',k);



readln;
end .


не может выйти из последнего цикла. Я немного запуталась с указателями, поэтому не могу найти ошибку. прошу помощи.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Ты не "продвигаешься" по списку. Надо вот так:

while tmp <> nil do // не надо проверять tmp^.next, просто tmp
begin
if z = ... then k := k + 1;
tmp := tmp^.next; // <--- Этого у тебя нет
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





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

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



IUnknow, большое спасибо! а есть ли возможность запоминать адреса тех элементов , что =Z?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Можно. Только вопрос - в том, где их запоминать? Может, проще сделать новый список из тех элементов, которые удовлетворяют условию?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





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

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


Отличная идея! Еще раз спасибо!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






А если добавить вот такую процедуру после строчки " k:=k+1; " , на какой объект надо добавить ссылку?

 
procedure AddFirst1(var head:uk);
var x:luggage;

tmp:uk;
begin

x.fio:=tmp^.data.fio;

x.number:=tmp^.data.number;

x.weight:=tmp^.data.weight;

new(tmp);
tmp^.data:=x;
tmp^.next:=head;
head:=tmp;
end;





И еще, где можно почитать про списки и указатели? Так, чтобы просто и понятно.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Проще переписать процедуру добавления в список:

procedure AddFirst(var head:uk; data : luggage);
var tmp:uk;
begin
new(tmp);
tmp^.data:=data;
tmp^.next:=head;
head:=tmp;
end;


, а теперь программа будет выглядеть так:
var
head, tmp : uk;
lst_2 : uk;

n,i,k,z : integer;
x : luggage;

begin
head:=nil;
write('введите число пассажиров ');
readln(n);

i:=0;
for i:=1 to n do
begin
Write('Имя пассажира ');
Readln(x.fio);
Write('Количество вещей ');
Readln(x.number);
Write('Вес ');
Readln(x.weight);

AddFirst(head, x);
end;
PrintList(head);
k:=0;

tmp:=head;
z:=tmp^.data.number;

lst_2 := nil;
While tmp <> nil do
begin
if z= tmp^.data.number then
begin
AddFirst(lst_2, tmp^.data);
k:=k+1;
end;
tmp := tmp^.next;
end;

writeln('k=',k);
if k > 0 then
PrintList(lst_2);

readln;
{ Не забывай освобождать память, выделенную под списки !!! }
end.


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

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

 





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