2025(e)ko martxoaren 2(a), igandea

7. jarduera (I) | Zenbaki bat asmatzen

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.

  1. Zenbaki oso bat pentsatu dugu, hots, 0 eta 100 bitartean dagoen zenbaki osoa pentsatu dugu
  2. Ezezaguna den zenbakiaren heina [0, 100] da hasieran, behemuga 0 eta goimuga 100. Beraz, iBehemuga:=0 eta iGoimuga:=100
  3. 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)
  4. 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");
}






  • 7a-Jarduera_ZenbakiBatAsmatzen.cbp | main.c  
  • 7b-Jarduera_LetraBatAsmatzen.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina