2024(e)ko otsailaren 19(a), astelehena

4. astea | FOR-DO bat bere barnean beste FOR-DO bat duena (1)


Planteamendua

Jokalarien kopurua ezezaguna da programaren hasieran, eta bere balioa teklatuaren bitartez eman beharko zaio programari.

Irudiak erakusten duen programaren exekuzio horretan jokalariak 5 dira

Jokalariek dado batekin jokatuko dute. Jokalari bakoitzak dadoaren hiru jaurtiketa egin ondoren, bere emaitza lortzeko dadoaren hiru jaurtiketen puntuak batu behar dira (baliorik txikiena 3 izango da eta baliorik handiena 18 izan daiteke). Programaren azken emaitza bikoitza izango da:

  • Jokalari guztien artean zenbatgarrenak irabazi duen
  • Zenbat puntuekin irabazi du jokalari horrek

Jaurtiketa simulatzeko random funtzio estandarra erabiliko da. Dadoaren aukerak 6 direlako random(6) aplikatu beharko da.



Irabazlea

Hiru jaurtiketak egin ondoren haien batura handiena lortuko duen jokalariak irabaziko du. Bi jokalarik (edo gehiagok) puntu-kopuru maximoa lortuz gero, irabazlea lehen jokalaria izango da.


Zenbat jokalari izango diren galdetuko du programak, eta zenbaki oso bat den erabiltzailearen erantzuna iJokalariKopurua aldagaian gordeko da:

{-------------------------------------------------------------
 Zenbat jokalari izango diren zehaztu beharra dago.
 -------------------------------------------------------------}

program DadoenJaurtiketak_1_5;
var
   iJokalariKopurua: integer;
begin
   repeat
      write('Zenbat jokalari dira? ');
      readln(iJokalariKopurua);
   until iJokalariKopurua > 1;  (* gutxienez 2 jokalari *)

   writeln;
   writeln('ENTER sakatu exekuzioa amaitzeko...');
   readln;
end.


Kanpoko begizta planteatzen da, prozesu errepikakor bat delako eta zenbat itzuli eman behar diren ezaguna delako for-to-do agindu bat erabiliko da. Emaitzak izango diren iMaximoa eta iIrabazlea aldagaien hasieraketak begiztatik kanpo egingo dira:

{-------------------------------------------------------------
 Zenbat jokalari izango diren zehaztu beharra dago.
 Kanpoko begiztan jokalarien txandak erakusten dira.
 -------------------------------------------------------------}

program DadoenJaurtiketak_2_5;
var
   iJokalariKopurua, iMaximoa, iIrabazlea: integer;
   k1: integer;
begin
   repeat
      write('Zenbat jokalari dira? ');
      readln(iJokalariKopurua);
   until iJokalariKopurua > 1;  (* gutxienez 2 jokalari *)

   iIrabazlea := 0;
   iMaximoa := 0;
   for k1:=1 to iJokalariKopurua do
   begin
      writeln(k1, '. jokalariaren jarduera, 3 jaurtiketen batura kalkulatu beharko da.');
   end;

   writeln;
   writeln('ENTER sakatu exekuzioa amaitzeko...');
   readln;
end.


Barruko begizta planteatzen da, prozesu errepikakor bat delako eta zenbat itzuli eman behar diren ezaguna delako, berriro ere, for-to-do agindu bat erabiliko da. Jokalari bakoitzaren puntuaketa diren iPuntuenBatura aldagaiaren hasieraketa begiztatik kanpo egingo da. Bestalde, random(6) funtzioak eman ditzaken balioak 0 eta 5 artean daudelako unitate bat gehitu behar zaie:

{-------------------------------------------------------------
 Zenbat jokalari izango diren zehaztu beharra dago.
 Kanpoko begiztan jokalarien txandak erakusten dira.
 Barruko begiztan jokalarien puntuak lortzen dira eta...
 -------------------------------------------------------------}

program DadoenJaurtiketak_3_5;
var
   iJokalariKopurua, iMaximoa, iIrabazlea, iPuntuak, iPuntuenBatura: integer;
   k1, k2: integer;
begin
   repeat
      write('Zenbat jokalari dira? ');
      readln(iJokalariKopurua);
   until iJokalariKopurua > 1;  (* gutxienez 2 jokalari *)

   randomize;
   iIrabazlea := 0;
   iMaximoa := 0;
   for k1:=1 to iJokalariKopurua do
   begin
      writeln;
      iPuntuenBatura := 0;
      for k2:=1 to 3 do
      begin
         iPuntuak := random(6) + 1;  (* random(6)-ek 0 eta 5 arteko balioak emango ditu *)
         writeln(k1, '. jokalariak ', iPuntuak, ' puntu lortu ditu ', k2, '. jaurtiketan.');
         iPuntuenBatura := iPuntuenBatura + iPuntuak;
      end;

      (* irabazlea zein da dagoeneko? *)
   end;

   writeln;
   writeln('ENTER sakatu exekuzioa amaitzeko...');
   readln;
end.


Barruko begizta bukatzean, baina oraindik kanpoko begiztan gaudelarik, une horretan irabazlea zein den erabakitzen da. Ondorioz, emaitzak izango diren iMaximoa eta iIrabazlea aldagaien eguneraketak burutuko dira horrela badagokie:

{-------------------------------------------------------------
 Zenbat jokalari izango diren zehaztu beharra dago.
 Kanpoko begiztan jokalarien txandak erakusten dira.
 Barruko begiztan jokalarien puntuak lortzen dira eta
                  irabazlea erabakitzen da
 -------------------------------------------------------------}

program DadoenJaurtiketak_4_5;
var
   iJokalariKopurua, iMaximoa, iIrabazlea, iPuntuak, iPuntuenBatura: integer;
   k1, k2: integer;
begin
   repeat
      write('Zenbat jokalari dira? ');
      readln(iJokalariKopurua);
   until iJokalariKopurua > 1;  (* gutxienez 2 jokalari *)

   randomize;
   iIrabazlea := 0;
   iMaximoa := 0;
   for k1:=1 to iJokalariKopurua do
   begin
      writeln;
      iPuntuenBatura := 0;
      for k2:=1 to 3 do
      begin
         iPuntuak := random(6) + 1;  (* random(6)-ek 0 eta 5 arteko balioak emango ditu *)
         writeln(k1, '. jokalariak ', iPuntuak, ' puntu lortu ditu ', k2, '. jaurtiketan.');
         iPuntuenBatura := iPuntuenBatura + iPuntuak;
      end;

      if iPuntuenBatura > iMaximoa then
      begin
         iMaximoa := iPuntuenBatura;
         iIrabazlea := k1;
         writeln('Dagoeneko irabazlea ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin.');
      end;
   end;

   (* azken emaitzak erakutsi *)

   writeln;
   writeln('ENTER sakatu exekuzioa amaitzeko...');
   readln;
end.


Programatik irten aurretik, azken emaitzak iMaximoa eta iIrabazlea aldagaien edukiak erakusten dira:

{-------------------------------------------------------------
 Zenbat jokalari izango diren zehaztu beharra dago.
 Kanpoko begiztan jokalarien txandak erakusten dira.
 Barruko begiztan jokalarien puntuak lortzen dira eta
                  irabazlea erabakitzen da
 Azken emaitzak erakusten dira: irabazlea eta maximoa
 -------------------------------------------------------------}

program DadoenJaurtiketak_5_5;
var
   iJokalariKopurua, iMaximoa, iIrabazlea, iPuntuak, iPuntuenBatura: integer;
   k1, k2: integer;
begin
   repeat
      write('Zenbat jokalari dira? ');
      readln(iJokalariKopurua);
   until iJokalariKopurua > 1;  (* gutxienez 2 jokalari *)

   randomize;
   iIrabazlea := 0;
   iMaximoa := 0;
   for k1:=1 to iJokalariKopurua do
   begin
      writeln;
      iPuntuenBatura := 0;
      for k2:=1 to 3 do
      begin
         iPuntuak := random(6) + 1;  (* random(6)-ek 0 eta 5 arteko balioak emango ditu *)
         writeln(k1, '. jokalariak ', iPuntuak, ' puntu lortu ditu ', k2, '. jaurtiketan.');
         iPuntuenBatura := iPuntuenBatura + iPuntuak;
      end;

      if iPuntuenBatura > iMaximoa then
      begin
         iMaximoa := iPuntuenBatura;
         iIrabazlea := k1;
         writeln('Dagoeneko irabazlea ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin.');
      end;
   end;

   writeln;
   writeln('Irabazlea ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin.');

   writeln;
   writeln('ENTER sakatu exekuzioa amaitzeko...');
   readln;
end.


Dadoa hiru aldiz jaurti ondoren puntuen baturak iMaximoa edukiarekin bat egiten badu, berdinketa hausteko txanpon bat erabiliko dugu 4. astea | FOR-DO bat bere barnean beste FOR-DO bat duena (2) artikuluan erakusten den bezala:

{-------------------------------------------------------------
 [1/3]
 Zenbat jokalari izango diren zehaztu beharra dago.
 Kanpoko begiztan jokalarien txandak erakusten dira.
 Barruko begiztan jokalarien puntuak lortzen dira eta
                  irabazlea erabakitzen da, berdinketarik
                  gertatzean txanpon baten laguntzaz erabaki
 Azken emaitzak erakusten dira: irabazlea eta maximoa
 -------------------------------------------------------------}

program DadoenJaurtiketak_Berdinketa;
var
   iJokalariKopurua, iMaximoa, iIrabazlea, iPuntuak, iPuntuenBatura: integer;
   iJokalaria, iJaurtiketa: integer;
begin
   repeat
      write('Zenbat jokalari dira? ');
      readln(iJokalariKopurua);
   until iJokalariKopurua > 1;  (* gutxienez 2 jokalari *)

   randomize;
   iIrabazlea := 0;
   iMaximoa := 0;
   for iJokalaria:=1 to iJokalariKopurua do
   begin
      writeln;
      iPuntuenBatura := 0;
      for iJaurtiketa:=1 to 3 do
      begin
         iPuntuak := random(6) + 1;  (* random(6)-ek 0 eta 5 arteko balioak emango ditu *)
         writeln(iJokalaria, '. jokalariak ', iPuntuak, ' puntu lortu ditu ', iJaurtiketa, '. jaurtiketan.');
         iPuntuenBatura := iPuntuenBatura + iPuntuak;
      end;

      if iPuntuenBatura > iMaximoa then
      begin
         iMaximoa := iPuntuenBatura;
         iIrabazlea := iJokalaria;
         writeln('Dagoeneko irabazlea ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin.');
      end
      else
      begin
         if iPuntuenBatura = iMaximoa then
         begin
            (* random(2) bitartez txanpoi bat jaurtitzen dela simula daiteke *)
            writeln('Berdinketa!!!');
         end;
      end;  (* else *)
   end;     (* kanpoko for *)

   writeln;
   writeln('Irabazlea ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin.');

   writeln;
   writeln('ENTER sakatu exekuzioa amaitzeko...');
   readln;
end.
 

iruzkinik ez:

Argitaratu iruzkina

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