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 |
Ikusi LetraAsmatu.exe programaren balizko exekuzio bat:
Eskatzen den ariketaren hurbilpen hau LetraAsmatu_hasiera.pas abiapuntutzat har daiteke. Hau da eskatzen den LetraAsmatu.pas iturburu-programa bat. Zein da zurea?
Hona hemen programaren kodifikazioa non, mesedez, pantaila-irteeran agertzen diren koloreei jaramonik ez diezuen egin behar. Aldiz, oso interesgarria da boAsmatua aldagai boolear laguntzilearen erabilera. Ikusi ere random(), chr(), ord(), pred() eta succ() funtzioek programari egiten dioten ekarpena:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | { '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 } program LetraAsmatu; uses crt; const iSAIAKERAKOPURUMAXIMOA = 5 ; var cLetra, cAsmatzeko, cProposatutakoTxikiena, cProposatutakoHandiena, cItxaron: char ; iEsparrua, iAleatorioa, iSaiakera: integer ; boAsmatua: boolean ; begin clrscr; writeln ; writeln ( '' 'A' ' eta ' 'Z' ' arteko letra bat aukeratuko du konputagailuak eta' ); writeln ( 'ea letra hori asmatzeko gai zaren. Zure proposamenak egitean' ); writeln ( '"Bilaketa Bitarra" deitzen den estrategia erabil ezazu' ); writeln ; writeln ; writeln ( 'Aurrera egiteko tekla bat sakatu!' ); writeln ; writeln ; cItxaron := readkey; writeln (cItxaron); clrscr; writeln ( '//////////////////////////////////////' ); writeln ; randomize; iEsparrua := ord( 'Z' ) - ord( 'A' ) + 1 ; iAleatorioa := random(iEsparrua); (* *) writeln ( 'iAleatorioa=' , iAleatorioa); cAsmatzeko := chr(iAleatorioa + ord( 'A' )); (* 0-A, 1-B, 2-C, ... 24-Y, 25-Z *) (* *) writeln ( 'cAsmatzeko=' , cAsmatzeko); writeln ; boAsmatua := FALSE ; iSaiakera := 1 ; cProposatutakoTxikiena := 'A' ; cProposatutakoHandiena := 'Z' ; repeat repeat writeln ( 'Saiakera=' , iSaiakera, ' Zein da ezkutatu dugun letra maiuskula? ' ); // kolorerik gabe write ( ' ' , cProposatutakoTxikiena, '..' , cProposatutakoHandiena, ' alfabetoko letra bat eman, eta ea asmatzen duzun: ' ); // koloreekin { write(' '); textcolor(Cyan); write(cProposatutakoTxikiena); textcolor(LightGray); write('..'); textcolor(Cyan); write(cProposatutakoHandiena); textcolor(LightGray); write(' alfabetoko letra bat eman, eta ea asmatzen duzun: '); } readln(cLetra); cLetra := upcase(cLetra); if (cLetra < cProposatutakoTxikiena) or (cLetra > cProposatutakoHandiena) then begin // kolorerik gabe writeln ( 'Datua ' '' , cProposatutakoTxikiena, '' ' eta ' '' , cProposatutakoHandiena, '' ' artekoa, mesedez!' ); // koloreekin { write('Datua '); textcolor(Red); write('''', cProposatutakoTxikiena, ''''); textcolor(LightGray); write(' eta '); textcolor(Red); write('''', cProposatutakoHandiena, ''''); textcolor(LightGray); writeln(' artekoa, mesedez!'); } end ; until (cLetra >= cProposatutakoTxikiena) and (cLetra <= cProposatutakoHandiena); if cLetra=cAsmatzeko then begin boAsmatua := TRUE ; writeln ; // kolorerik gabe writeln ( 'OSO ONDO!' ); // koloreekin { textcolor(Green); writeln('OSO ONDO!'); textcolor(LightGray); } end else begin iSaiakera := iSaiakera + 1 ; // kolorerik gabe write ( 'EZ, EZ DUZU ASMATU! ' ); // koloreekin { textcolor(Red); write('EZ, EZ DUZU ASMATU! '); textcolor(LightGray); } if cAsmatzeko < cLetra then begin cProposatutakoTxikiena := cProposatutakoTxikiena; {esleipen hau soberan egon daiteke} cProposatutakoHandiena := pred(cLetra); // kolorerik gabe writeln ( 'Saiatu bilatzen ' '' , cProposatutakoTxikiena, '' ' eta ' '' , cProposatutakoHandiena, '' ' bitartean' ); // koloreekin { write('Saiatu bilatzen '); textcolor(Cyan); write('''', cProposatutakoTxikiena, ''''); textcolor(LightGray); write(' eta '); textcolor(Cyan); write('''', cProposatutakoHandiena, ''''); textcolor(LightGray); writeln(' bitartean'); } end ; if cAsmatzeko > cLetra then begin cProposatutakoHandiena := cProposatutakoHandiena; {esleipen hau soberan egon daiteke} cProposatutakoTxikiena := succ(cLetra); // kolorerik gabe writeln ( 'Saiatu bilatzen ' '' , cProposatutakoTxikiena, '' ' eta ' '' , cProposatutakoHandiena, '' ' bitartean' ); // koloreekin { write('Saiatu bilatzen '); textcolor(Cyan); write('''', cProposatutakoTxikiena, ''''); textcolor(LightGray); write(' eta '); textcolor(Cyan); write('''', cProposatutakoHandiena, ''''); textcolor(LightGray); writeln(' bitartean'); } end ; writeln ; end ; until (iSaiakera > iSAIAKERAKOPURUMAXIMOA) or boAsmatua; if boAsmatua then begin writeln (iSaiakera, ' saiakera egin ondoren asmatu duzu' ); end else begin writeln ( 'Saiakerak agortu dituzu eta ez duzu asmatu' ); write ( 'Asmatu beharreko letra hau izan da: ' ); // kolorerik gabe writeln (cAsmatzeko); // koloreekin { textcolor(Red); writeln(cAsmatzeko); textcolor(LightGray); } end ; writeln ; writeln ( '//////////////////////////////////////' ); readln; end . 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
Iruzkinen bat idazteko Google-ko kontu bat behar duzu. Iruzkin guztien moderazio-ardura blogeko administratzaileari dagokio.