Помощь - Поиск - Пользователи - Календарь
Полная версия: не могу выйти из цикла
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
koal
есть программка:
  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(c);
      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 .


не может выйти из последнего цикла. Я немного запуталась с указателями, поэтому не могу найти ошибку. прошу помощи.
IUnknown
Ты не "продвигаешься" по списку. Надо вот так:

while tmp <> nil do // не надо проверять tmp^.next, просто tmp
begin
   if z = ... then k := k + 1;
   tmp := tmp^.next; // <--- Этого у тебя нет
end;
koal

IUnknow, большое спасибо! а есть ли возможность запоминать адреса тех элементов , что =Z?
IUnknown
Можно. Только вопрос - в том, где их запоминать? Может, проще сделать новый список из тех элементов, которые удовлетворяют условию?
koal
Отличная идея! Еще раз спасибо!!!
-koal-
А если добавить вот такую процедуру после строчки " 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
Проще переписать процедуру добавления в список:

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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.