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

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

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

 
 Ответить  Открыть новую тему 
> не могу выйти из цикла, помогите найти и исправить ошибку
koal
сообщение 5.04.2012 12:21
Сообщение #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 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 5.04.2012 13:30
Сообщение #2


a.k.a. volvo877
*****

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

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


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

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





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

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



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


a.k.a. volvo877
*****

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

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


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





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

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


Отличная идея! Еще раз спасибо!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
-koal-
сообщение 8.04.2012 14:41
Сообщение #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;





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


a.k.a. volvo877
*****

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

Репутация: -  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 - 8.04.2012 15:09
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 29.03.2024 8:37
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"