2024(e)ko otsailaren 7(a), asteazkena

4. astea | REPEAT-UNTIL aginduaren egitura eta adibide bat








Jarraian REPEAT-UNTIL agindu errepikakorraren eskema erakusten da:

Ikusi 4. astea | WHILE-DO eta REPEAT-UNTIL: Segida baten batukaria ariketa non REPEAT-UNTIL eta WHILE-DO sententziak alderatzen diren

REPEAT-UNTIL agindu errepikakorrari, WHILE-DO aginduari bezala, errepikatu behar den sententzia multzo bat dagokio eta horren aurretik galdera bat integraturik dauka. Galderaren erantzuna gezurra izatean (FALSE Pascal lengoaian) multzoaren sententziak berriro egikarituko dira begizta bat sortuz. Adierazpen boolearraren erantzuna egia izango denean (TRUE Pascal lengoaian) multzoaren barneko sententziak ez dira gehiagotan exekutatzen eta besterik gabe REPEAT-UNTIL agindua amaitutzat jo daiteke, bere jarraian datorren sententziak hartuko luke txanda.

Sintaxiari dagokiola REPEAT-UNTIL aginduak ez dauka BEGIN eta END markarik. Eta bere baldintzaren logika alderantzizkoa da WHILE-DO aginduaren adierazpen boolearrarekiko, horregatik honako egoera bi hauek baliokideak dira:
  while (rZbk > 7.4) AND (iKont <> 3) do   
  ...

  ...
  until (rZbk <= 7.4) OR (iKont = 3) ;    
Izan ere, aurrekoa De Morgan Legeen ondorioa besterik ez da. Hemen duzu De Morgan Legeen azalpen grafikoak Venn diagramak erabiliz:


De Morgan Legea laborategian aplikatu dugu kasik konturatu gabe. Gogora ezazu lehenengo koadrantean kokatzen den A puntuaren rAx eta rAy koordenatuak irakurtzean egin genuena:
program Triangelu_1_4 ;
var
   rAx, rAy : real ;
begin
   { A puntua lehen koandrantekoa izan behar da }
   repeat
      writeln('OXY lehen koandratean lan eginez') ;
      write('Eman A puntuaren x koordenatua: ') ;
      readln (rAx) ;
      write('Eman A puntuaren y koordenatua: ') ;
      readln(rAy) ;
      if (rAx < 0.0) or (rAy < 0.0) then
         writeln('A puntuaren koordenatuak ezin dira negatiboak izan') ;
   until (rAx >= 0.0) and (rAy >= 0.0) ;
   writeln ;
   ...
end.

Egia-taulen bitartez froga daitezke De Morgan Legeak:

 A   B  (A AND B) (A AND B)'  A'   B'   A' OR B'
T
T
F
F
T
F
T
F
T
F
F
F
F
T
T
T
F
F
T
T
F
T
F
T
F
T
T
T

 A   B   (A OR B)  (A OR B)'  A'   B'  A' AND B'
T
T
F
F
T
F
T
F
T
T
T
F
F
F
F
T
F
F
T
T
F
T
F
T
F
F
F
T




RepeatFaktoriala.pas
Berresten dugu zenbaki baten faktoriala kalkulatzeko egiturarik egokiena FOR-DO dela, baina 4. astea | WHILE-DO aginduaren egitura eta adibide bat artikuluan egingo dugun bezala, ekin diezaiogun faktorialaren ariketari REPEAT-UNTIL agindua erabiliz.

iZbk zenbaki osoa eta positiboa teklatuaren bitartez irakurri ondoren, bere faktoriala honelaxe definitzen da:
iZbk! = 1 * 2 * 3 * ... * (iZbk-1) * iZbk

REPEAT-UNTIL aginduari buruz goraxeago emandako azalpenak aintzat harturik, RepeatFaktoriala.pas programa idatz dezakegu:
{--------------------------------------------------------------------------
  iZbk kopuru osoa eta positiboa teklatuaren bitartez irakurri ondoren
  batukari hau kalkulatu:

      liFaktoriala  <===  iZbk! = 1 * 2 * 3 * ... * (iZbk-1) * iZbk
---------------------------------------------------------------------------}

program FaktorialaKalkulatuRepeatBitartez;
const
   MAXIMOA = 12;  (* longint datu-motarekin 12! ondo kalkulatzen da, baina 13! txarto *)
var
   iZbk: integer; 
   iKontagailua: integer;
   liFaktoriala: longint;
begin
   writeln; 
   writeln;
   
   repeat
      write('Zenbaki osoa eta positiboa eman: ');
      readln(iZbk);
      if (iZbk < 0) or (iZbk > MAXIMOA) then
      begin
         writeln('Datua 0 eta 12 artean (biak barne)');
         writeln;
      end;
   until (iZbk >= 0) and (iZbk <= MAXIMOA);

   writeln;

   liFaktoriala := 1;
   iKontagailua := 1;
   repeat 
      liFaktoriala := liFaktoriala * iKontagailua;
      writeln('iKontagailua = ':20, iKontagailua:2, 'liFaktoriala = ':25, liFaktoriala);
      iKontagailua := iKontagailua + 1;
   until iKontagailua > iZbk;
   
   writeln;
   writeln(iZbk:16, '! = ', liFaktoriala);
 
   writeln;
   writeln;
   writeln('=======================');
   writeln('RETURN sakatu amaitzeko');
   writeln('=======================');
   readln;
end.

iruzkinik ez:

Argitaratu iruzkina

Iruzkinen bat idazteko Google-ko kontu bat behar duzu. Iruzkin guztien moderazio-ardura blogeko administratzaileari dagokio.