ZER DAKIDAN: Algoritmoak programatzen badakit. ZER IKASIKO DUDAN: Joko bat programatuko dut, programak letra bat zehaztu eta erabiltzaileak asmatuko du. |
Ordenadoreak letra bat pentsatuko du eta guk asmatu beharko dugu
A eta Z bitartean dagoen letra bat aukeratuko du ordenadoreak eta ezezaguna den letra hori guk asmatuko dugu. Egiten dugun saiakera bakoitzeko, programak informazioa emango digu esanez letra ezezaguna zein tartetan dagoen.
- Ordenadoreak letra bat aukeratuko du, A eta Z bitartean dagoen letra bat aukeratuko du. Horretarako, random() funtzio estandarra erabiliko du (randomize prozedurarekin batera). programak aukeratzen duen letra cAsmatzeko aldagaian gordeko da
- Ezezaguna den letraren heina [A, Z] da hasieran, behemuga A eta goimuga Z. Beraz, cProposatutakoTxikiena:='A' eta cProposatutakoHandiena:='Z'
- Errepikatu letra asmatu arte edo 5 saiakera egin arte:
- Teklatuaren bitartez irakurriz, soluzio bat proposatuko diogu programari. Nahi dugun soluzioa proposatuko diogu programari, modurik eraginkorrena da tartearen erdiko letra proposatzea programari: M lehen saiakeran, G edo T bigarren saiakeran...
- Gure proposamenaren arabera, programak bi aukera izango ditu eta honela jokatuko du:
- Proposatutako letra eta programak asmatutakoa bat datoz, letra asmatu dugunez begiztatik irten
- Proposatutako letra eta programak asmatutakoa ez datoz bat, ez dugunez letra asmatu beste saiakera bat emango digu programak (5 saiakeraren muga ez badugu oraindik gainditu). Hurrengo saiakeraran erakutsiko digun tartea egokituko du programak, honelaxe:
- Proposatu diogun letra programarena baino handiagoa bada (tartearen cProposatutakoHandiena aldatu eta 3. urratsaren hasierara itzuli saiakera berri bat egiteko)
- Proposatu diogun letra programarena baino txikiagoa bada (tartearen cProposatutakoTxikiena aldatu eta 3. urratsaren hasierara itzuli saiakera berri bat egiteko)
- Emaitza erakutsi, begiztatik irteteko aukerak:
- Letra asmatu diogu programari, zorionak eta iSaiakera erakutsi
- Saiakerak 5 baino gehiago izan dira, cAsmatzeko aldagaiaren edukia erakutsi
Zergatik 5 saiakera?
A-ren eta Z-ren artean 26 karaktere. Urrats bakoitzean,
karaktere guztietatik erdiak baztertzen dira. Beraz:
log2(26)=4,70044
logaritmo (2 oinarrian) 26 zenbakiarena 4,70044 da
2x = 26 >>> ln(2x) = ln(26) >>> x·ln(2) = ln(26) >>> x = ln(26)/ln(2) x = 3.25810/0.69315 = 4.70044 >>> x=5 |
Hona hemen programaren balizko exekuzio bat:
Eskatzen den programa jarraian erakusten da. Antzeko algoritmoa aplikatzen da 7. jarduera (I) | Zenbaki bat asmatzen ariketan, non erabiltzaileak zenbaki bat aukeratzen duen eta programak asmatzen dion.
/* 7b-Jarduera_LetraBatAsmatzen: programak letra finkatu eta erabiltzaileak asmatuko du. */ /* 'A' eta 'Z' arteko letra bat programak aukeratuko du, letra hori guk asmatuko dugu erantzun hauek emanez: 00000000011111111112222222 12345678901234567890123456 ABCDEFGHIJKLMNOPQRSTUVWXYZ M 1. saikera G T 2. saikera D J P W 3. saikera B F R Y 4. saikera 5. saikera --------------------------------------- Zergatik 5 saiakera? log2(26)=4.7 logaritmo 2 oinarrian 26 zenbakiarena 4.7 da A eta Z artean 26 karaktere */ #include <stdio.h> #include <time.h> // time() funtziorako #include <stdlib.h> // srand(), rand() eta system() funtzioetarako #include <conio.h> // getch() eta getche() funtzioetarak #include <ctype.h> // toupper() funtziorako #define SAIAKERA_MAX 5 int main() { char cLetra, cAsmatzeko, cProposatutakoTxikiena = 'A', cProposatutakoHandiena = 'Z'; int iEsparrua, iAleatorioa, iSaiakera = 1; int boAsmatua = 0; // hasierako mezua printf("'A' eta 'Z' arteko letra bat aukeratuko du konputagailuak eta\n"); printf("ea letra hori asmatzeko gai zaren. Zure proposamenak egitean\n"); printf("\"Bilaketa Bitarra\" deitzen den estrategia erabil ezazu\n\n"); printf("Aurrera egiteko edozein tekla sakatu!\n\n"); getch(); system("cls"); printf("//////////////////////////////////////\n\n"); // letra aleatorioa aukeratu srand(time(0)); iEsparrua = 'Z' - 'A' + 1; iAleatorioa = rand() % iEsparrua; cAsmatzeko = 'A' + iAleatorioa; printf("MEZU HAU EZKUTATU!!! Programak aukeratutako letra: %c\n\n", cAsmatzeko); // bilaketa bitarrarekin asmatzen saiatu while (iSaiakera <= SAIAKERA_MAX && !boAsmatua) { do { printf("Saiakera=%d Zein da ezkutatu dugun letra maiuskula? \n", iSaiakera); printf(" %c..%c alfabetoko letra bat eman, eta ea asmatzen duzun: ", cProposatutakoTxikiena, cProposatutakoHandiena); cLetra = getche(); printf("\n"); cLetra = toupper(cLetra); if (cLetra < cProposatutakoTxikiena || cLetra > cProposatutakoHandiena) { printf("Datua '%c' eta '%c' artekoa, mesedez!\n", cProposatutakoTxikiena, cProposatutakoHandiena); } } while (cLetra < cProposatutakoTxikiena || cLetra > cProposatutakoHandiena); if (cLetra == cAsmatzeko) { boAsmatua = 1; printf("\nOSO ONDO!\n"); } else { iSaiakera++; printf("EZ, EZ DUZU ASMATU! "); if (cAsmatzeko < cLetra) { cProposatutakoHandiena = cLetra - 1; printf("Saiatu bilatzen '%c' eta '%c' bitartean\n", cProposatutakoTxikiena, cProposatutakoHandiena); } else { cProposatutakoTxikiena = cLetra + 1; printf("Saiatu bilatzen '%c' eta '%c' bitartean\n", cProposatutakoTxikiena, cProposatutakoHandiena); } printf("\n"); } } if (boAsmatua) { printf("%d saiakera egin ondoren asmatu duzu\n", iSaiakera); } else { printf("Saiakerak agortu dituzu eta ez duzu asmatu\n"); printf("Asmatu beharreko letra hau izan da: %c\n", cAsmatzeko); } printf("\n//////////////////////////////////////\n"); getch(); // bukatu aurretik itxaron return 0; } // 00000000011111111112222222 // 12345678901234567890123456 // ABCDEFGHIJKLMNOPQRSTUVWXYZ // M 1. saikera // G T 2. saikera // D J P W 3. saikera // B F R Y 4. saikera // 5. saikera
iruzkinik ez:
Argitaratu iruzkina