logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Turbo Pascal – jak przerwać pętlę po wpisaniu 0 lub 5 liczb i zapisać do tablicy?

jasiu_16 24 Mar 2007 11:11 1975 16
REKLAMA
  • #1 3713645
    jasiu_16
    Poziom 11  
    Posty: 71
    Ocena: 1
    Chce napisać program, w którym użytkownik poda ciąg liczb, a program je przetworzy. Dodatkowo chce zrobić coś takiego, żę gdy się wpisze 0 to, pętla która zczytuje liczby, ma się zatrzymać. I tu właśnie mam problem. Liczby które zczytuje są zapisywane w tablicy. I nie wiem jak zrobić żeby właśnie po wpisaniu 0 pętla się zatrzymywała.
    Zrobiłem cos takiego ale nie działa:(
    
    [...]
    repeat
     begin
      write('Podaj ',i,' liczbe: ');
      readln(a[i]);
      i:=i+1;
     end;
    until (i>5) or (a[i]=0);
    


    Jak więc to zrobić aby po wpisaniu 0 lub osiągnięciu 5 liczb przerywało pętlę? Proszę o pomoc:)
  • REKLAMA
  • #2 3713658
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    Problem w tym że zanim sprawdzisz wartość nowo wpisanej liczby to zwiększasz wskaźnik i, co powoduje odczytywanie kolejnej komórki a nie tej nowo wpisanej. W warunku wyjścia możesz zmienić a[i] na a[i-1].
  • #3 3713672
    jasiu_16
    Poziom 11  
    Posty: 71
    Ocena: 1
    Niestety nie pomogło:(
  • #4 3714334
    Hopin
    Poziom 15  
    Posty: 75
    Pomógł: 20
    Ocena: 2
    Witam

    Spróbuj tak:
    
    repeat 
     begin 
      write('Podaj ',i,' liczbe: '); 
      readln(a[i]); 
      if a[i]=0 then BREAK;
      i:=i+1; 
     end; 
    until (i>5); 
    


    Pozdrawiam
  • REKLAMA
  • #5 3714549
    przemo_wielki
    Poziom 24  
    Posty: 583
    Pomógł: 61
    Ocena: 10
    Trochę niejasno sie wyrażasz z tego co widać po kodzie to chcesz wczytać tylko 5 elementów tablicy pomocna będzie pętla for ... to ... do a warunek a[i]=0 możesz wrzucić w if ... then np:
      for i:=1 to 5 do begin
      write('Podaj ',i,' liczbe: ');
      readln(a[i]);
      if a[i]=0 then exit;
     end;

    Możesz również zrobić to po swojemu ale w taki sposób ( uwaga wcześniej trzeba przypisać zmiennej i wartość początkową np i:=0) np:
    begin
      i:=0;
      writeln('Wypelnij tablice');
    repeat
      i:=i+1;
      write('Podaj ',i,' liczbe: ');
      readln(a[i]);
    until (i=5)or(a[i]=0);
    end.
  • #6 3714747
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    przemo_wielki napisał:

      for i:=1 to 5 do begin
      write('Podaj ',i,' liczbe: ');
      readln(a[i]);
      if a[i]=0 then exit;
     end;


    Zmieniłbym instrukcję exit na break. Exit wyjdzie z całej procedury, a w szczególności jeśli jest umieszczone w programie głównym to zakończy działanie całego programu. Break wyskoczy tylko z aktualnej pętli.
  • #7 3715215
    przemo_wielki
    Poziom 24  
    Posty: 583
    Pomógł: 61
    Ocena: 10
    Tak masz racje miało być przerwij zamiast zakończ. A mam jeszcze pytanie do Ciebie wcześniej napisałeś że inc(i) zwiększa wskaźnik a nie jest przypadkiem tak że zmieniana jest wartość ?? pamięć jest zaalokowana dla zmiennej i i nie widać tutaj poruszania się po pamięci mógłbyś to szerzej wytłumaczyć.
  • REKLAMA
  • #8 3715319
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    Nie chodziło mi o zmianę wskaźnika jako takiego, to było tylko określenie jako "wskaźnik = wskaźnik pozycji w tablicy, indeks" ;-)
  • #9 3716318
    przemo_wielki
    Poziom 24  
    Posty: 583
    Pomógł: 61
    Ocena: 10
    No to teraz wszystko jasne ;)
  • #10 3717696
    jasiu_16
    Poziom 11  
    Posty: 71
    Ocena: 1
    z tym 'break' działa, ale wyszedł jeszcze jeden problem. Ja te liczby co wprowadzam przetwarzam w różny sposób(szukam parzystych, minimalnej, maksymalnej, itp). Jak więc zrobić aby tego ostatniego 0 nie brało pod uwage?
  • #11 3717757
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    Musisz sobie zapamiętać ilość wprowadzonych liczb w jakiejś zmiennej. Po wyjściu z pętli możesz napisać coś takiego:
    if a[i]=0 then ilosc:=i-1 else ilosc:=i;


    I potem sprawdzać tylko komórki tablicy o numerach od 1 do ilosc.
  • REKLAMA
  • #12 3717803
    przemo_wielki
    Poziom 24  
    Posty: 583
    Pomógł: 61
    Ocena: 10
    Możesz zrobić tak żeby niemożna było w ogóle 0 przypisać
    repeat
    readln(a[i]);
    until(a[i]<>0);
    

    Za każdym razem jak wybierzesz 0 to warunek pętli nie będzie spełniony i poprosi Cię o ponowne wybranie.
  • #13 3718681
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    Albo jeszcze inna metoda:
    
    var
    tmp : integer;
    
    ......
    
    for i:=1 to 5 do 
    begin 
      write('Podaj ',i,' liczbe: '); 
      readln(tmp); 
      if (tmp = 0) then break else a[i] := tmp;
    end;
  • #14 3719087
    przemo_wielki
    Poziom 24  
    Posty: 583
    Pomógł: 61
    Ocena: 10
    Tylko że w takim wypadku cała tablica nie zostanie uzupełniona ( gdy wcześniej tmp=0) ;)
  • #15 3719302
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    No ale o to właśnie chyba chodziło - ma wczytać kilka liczb, maksymalnie 5 LUB do momentu podania 0. :>
  • #16 3719578
    przemo_wielki
    Poziom 24  
    Posty: 583
    Pomógł: 61
    Ocena: 10
    Hmm możliwe ale tak jak napisałem na początku autor trochę niejasno się wyraża ...
  • #17 3720468
    Fyszo
    Poziom 37  
    Posty: 3987
    Pomógł: 223
    Ocena: 115
    Cały problem lezy w tym ze przed warunkiem 'a[i]=0' masz inkrementacje 'i:=i+1' i sprawdzasz nie 5 index ale 6. Użyj petli :
    While a[i]<>0 do begin
    ...
    end;

Podsumowanie tematu

✨ Dyskusja dotyczy problemu przerwania pętli w Turbo Pascal podczas wczytywania liczb do tablicy po wpisaniu wartości 0 lub po osiągnięciu 5 elementów. Problemem było niewłaściwe zwiększanie indeksu przed sprawdzeniem warunku zakończenia pętli, co powodowało odczytanie niewłaściwego elementu tablicy. Zaproponowano użycie instrukcji BREAK po wykryciu wartości 0, co skutecznie przerywa pętlę, oraz poprawne zarządzanie indeksem i warunkiem pętli. Alternatywnie zasugerowano użycie pętli for z warunkiem if sprawdzającym wartość 0 i wyjściem z pętli. Omówiono także sposób pomijania ostatniej wartości 0 podczas dalszego przetwarzania danych poprzez zapamiętanie faktycznej liczby wprowadzonych elementów. Wskazano, że instrukcja BREAK przerywa tylko pętlę, natomiast EXIT kończy całą procedurę lub program. Zaproponowano również wczytywanie do zmiennej tymczasowej i przypisywanie do tablicy tylko, gdy wartość jest różna od 0, co pozwala uniknąć zapisywania wartości kończącej. Podkreślono konieczność poprawnego zarządzania indeksem i warunkami pętli, aby uniknąć błędów indeksowania i niepożądanego zapisu wartości 0.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA