Proszę o napisanie 3 programów w PASCALU z zastosowaniem pętli UNTIL REPEAT. Zależy mi na przedstawieniu prostych i bardziej złożonych programów. Czyli jeden może być prosty a dwa pozostałe bardziej złożone. Proszę jeszcze o wyjaśnienie czym się dodatkowo ona różni od pętli WHILE. Z góry dziękuję za pomoc.
" Life is not a problem to be solved but a reality to be experienced! "
© Copyright 2013 - 2024 KUDO.TIPS - All rights reserved.
Pętla "repeat" różni się od "while" miejscem sprawdzania warunku oraz istotą działania.
Otóż pętla "repeat" przestaje się wykonywać, gdy warunek zostaje spełniony (a biorąc pod uwagę konstrukcję tej pętli, wykona się ona przynajmniej jeden raz, bo warunek sprawdzany jest na sam koniec pętli i dopiero potem jest ewentualny skok na jej początek). Natomiast pętla "while" przestaje się wykonywać, gdy warunek staje się fałszem, ponadto sprawdzany jest on na samym początku tejże pętli, przez co może się ona nie wykonać w ogóle.
Na polski można by je przetłumaczyć jako:
"repeat" -> "powtarzaj dopóki warunek się nie spełni"
"while" -> "powtarzaj dopóki warunek jest spełniony"
A teraz kody, pisane pod FPC 2.6.0:
[ wstawka ]
Od pewnego czasu w moich kodach korzystam z następujących definicji typów (w tym wypadku dla Win32; aby były przenośne pomiędzy platformami):
uint8 = Byte; // unsigned byte; -> 0 .. 255
int8 = ShortInt; // signed byte; -> -128 .. 127
uint16 = Word; // unsigned word; -> 0 .. 65.535
int16 = SmallInt; // signed word; -> -32.768 .. 32.767
uint32 = LongWord; // unsigned int; -> 0 .. 4.294.967.295
int32 = LongInt; // signed int; -> -2.147.483.648 .. 2.147.483.647
uint64 = QWord; // unsigned int64;
Także i w tych kodach.
Kod 1 - zamiana liczby bezznakowej na ciąg znaków:
http://pastebin.com/67TFk1EP
Function intstr(Int: uint32): String;
Var Num : String = '';
Len, I: uint8;
Begin
if (Int = 0) Then
Exit('0');
Result := '';
Repeat
Num += char(Int mod 10 + ord('0'));
Int := Int div 10;
Until (Int = 0);
Len := Length(Num); // tak naprawdę, można to wyliczyć z logarytmów (round(log10(Int)-1)), ale ten sposób jest poniekąd bardziej oczywisty
For I := Len Downto 1 Do
Result += Num[I];
End;
Kod 2 - wyszukiwanie null-terminatora (znaku 0x00) we wskaźniku na ciąg znaków:
http://pastebin.com/qxm2Kr1g
Function strlen(Str: PChar): uint16;
Begin
Result := 0;
While (Str^ <> #0) Do
Begin
Inc(Str);
Inc(Result);
End;
End;
Kod 3 - generowanie tabliczki mnożenia (Max - maksymalna wielkość, Sep - odległość pomiędzy liczbami (w uproszczeniu: `ceil(log10(max*max)+1))`)
http://pastebin.com/iNXYNm8a
// tak naprawdę, ten przykład jest nieco naciągany, bo tutaj znacznie lepiej pasowałaby pętla "for"
Procedure MultTable(const Max, Sep: uint16);
Var X, Y, I: uint16;
Begin
X := 1; // kompilator i tak usunie to przypisane, ale zostawiam je tutaj dla czytelności
Y := 1;
Repeat
X := 1;
Repeat
Write(X*Y:Sep);
Inc(X);
Until (X >= Max);
Writeln;
Inc(Y);
Until (Y >= Max);
End;