2022(e)ko martxoaren 30(a), asteazkena

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.







1. urratsa



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.






2. urratsa



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.






3. urratsa



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.






4. urratsa



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.






5. urratsa



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.






Berdinketak hausteko beste modu bat



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.