| ZER DAKIDAN: Funtzioak erabiliz algoritmoak programatzen badakit. ZER IKASIKO DUDAN: Joko bat programatuko dut, erabiltzaileak zenbaki bat zehaztu eta programak asmatuko dio. |
Guk pentsaturiko zenbakia ordenadoreak asmatuko digu
0 eta 100 bitartean dagoen zenbaki osoa pentsatuko dugu eta ordenagailuak galdera batzuk eginez zenbaki hori asmatuko digu. Saiakera bakoitzeko, ordenagailuari informazioa emango diogu esanez zenbaki ezezaguna zein tartetan dagoen.
- Zenbaki oso bat pentsatu dugu, hots, 0 eta 100 bitartean dagoen zenbaki osoa pentsatu dugu
- Ezezaguna den zenbakiaren heina [0, 100] da hasieran, behemuga 0 eta goimuga 100. Beraz, iBehemuga:=0 eta iGoimuga:=100
- Errepikatu zenbakia asmatu arte edo 7 saiakera egin arte:
- Programak proposatuko digun soluzioa kalkulatuko du, soluzioa: baligarria den heinaren erdia. Beraz, iSoluzioa := (iBehemuga + iGoimuga) div 2
- Programak galdetuko digu proposatu duen soluzioa egokia den ala ez, aukerak:
- B, bai, proposatu digun zenbakia guk pentsatu duguna izan da (begiztatik irten)
- H, ez, proposatu digun zenbakia ez da guk pentsatutakoa, proposatu digun zenbakia gurea baino handiagoa da (heinaren iGoimuga aldatu eta 3. urratsaren hasierara itzuli saiakera berri bat egiteko)
- T, ez, proposatu digun zenbakia ez da guk pentsatutakoa, proposatu digun zenbakia gurea baino txikiagoa da (heinaren iBehemuga aldatu eta 3. urratsaren hasierara itzuli saiakera berri bat egiteko)
- Emaitza erakutsi, begiztatik irteteko aukerak:
- Gure erantzuna B izan denez, ordenagailuak gure zenbakia asmatu du: iSoluzioa erakutsi
- Saiakerak 7 baino gehiago izan dira, horrek esan nahi du ez dugula zuzen jokatu eta gure erantzunetan gezurra esan diogula programari
Zergatik 7 saiakera?
0-tik 100-ra, biak barne, 101 aukera. Urrats bakoitzean,
aukera guztietatik erdiak baztertzen dira. Beraz:
log2(101)=6,658
logaritmo (2 oinarrian) 101 zenbakiarena 6,658 da
2x = 101 >>> ln(2x) = ln(101) >>> x·ln(2) = ln(101) >>> x = ln(101)/ln(2) x = 4.61512/0.69315 = 6.65821 >>> x=7 |
Hona hemen programaren balizko exekuzio bat:
Eskatzen den programa jarraian erakusten da. Antzeko algoritmoa aplikatzen da 7. jarduera (II) | Letra bat asmatzen ariketan, non makinak letra bat aukeratzen duen eta guk asmatu behar dugun.
/* 7a-Jarduera_ZenbakiBatAsmatzen: erabiltzaileak zenbakia finkatu
eta programak asmatuko du. */
// 0-tik 100-era dauden aukerak 101 dira guztira
// log (oinarria 2) 101 zenbakiarena = 6,6438
// horregatik 7 saiakerekin ziur asmatzen dela
#include <stdio.h>
#include <stdlib.h> // system() funtziorako
#include <conio.h> // getch() funtziorako
#include <ctype.h> // toupper() funtziorako
#define SAIAKERAMUGA 7
void HasierakoMezua();
char cKonparaketarenEmaitza(int iSoluzioa, int iSaiakera);
void EmaitzaErakutsi(char cErantzuna, int iSoluzioa);
int main()
{
int iSoluzioa, iSaiakera, iBehemuga, iGoimuga;
char cErantzuna;
HasierakoMezua();
system("cls");
iBehemuga = 0; // hasieraketak
iGoimuga = 100;
iSoluzioa = (iGoimuga + iBehemuga) / 2;
iSaiakera = 1;
// bilaketa bitarraren algoritmoa
do
{
printf("\n");
cErantzuna = cKonparaketarenEmaitza(iSoluzioa, iSaiakera);
if (cErantzuna == 'H')
iGoimuga = iSoluzioa - 1;
else
if (cErantzuna == 'T')
iBehemuga = iSoluzioa + 1;
iSoluzioa = (iGoimuga + iBehemuga) / 2;
iSaiakera++;
} while (cErantzuna != 'B' && iSaiakera <= SAIAKERAMUGA);
printf("\n\n");
EmaitzaErakutsi(cErantzuna, iSoluzioa);
printf("Irteteko edozein tekla sakatu.");
getch();
return 0;
}
// hasierako mezua erakusten duen funtzioa
void HasierakoMezua()
{
system("cls");
printf("0 eta 100 artean aurkitzen den zenbaki bat pentsa ezazu eta hainbat galdera\n");
printf("eginez ordenadoreak zenbakia asmatuko dizu. Galdereetako erantzunetan zuzen\n");
printf("jokatuz eta gezurrik esaten ez baduzu, programak 7garrenerako asmatuko du.\n\n");
printf("Aurrera egiteko edozein tekla sakatu...\n\n");
getch();
}
// zenbakia konparatzen duen funtzioa
char cKonparaketarenEmaitza(int iSoluzioa, int iSaiakera)
{
char cErantzuna;
printf("%d. saiakeran ordenadoreak aukeratutako zenbakia: %d\n", iSaiakera, iSoluzioa);
printf("%d zenbakia zurearekin konparatuta, nolakoa da?\n", iSoluzioa);
printf(" B Berdina\n");
printf(" H Handiagoa\n");
printf(" T Txikiagoa\n");
do
{
printf("Erantzuna: ");
cErantzuna = getch();
printf("%c\n", cErantzuna);
cErantzuna = toupper(cErantzuna);
} while (cErantzuna != 'B' && cErantzuna != 'H' && cErantzuna != 'T');
return cErantzuna;
}
// azken emaitza erakusten duen funtzioa
void EmaitzaErakutsi(char cErantzuna, int iSoluzioa)
{
if (cErantzuna == 'B')
printf("Pentsatu duzun zenbakia %d da.\n", iSoluzioa);
else
printf("Erantzunetan okertu zara ala gezurti hutsa zara\n");
}

iruzkinik ez:
Argitaratu iruzkina