C - guess number

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

flushed
Level 1
Level 1
Příspěvky: 78
Registrován: duben 12
Pohlaví: Muž
Stav:
Offline

C - guess number

Příspěvekod flushed » 29 dub 2012 17:21

Zdravím, učím se programovat v C a napsal jsem program, který vygeneruje náhodné číslo od 1 do 10 a vy pak hádáte. Zajímalo by mě, co říkáte na řešení. Jestli by to třeba nešlo vyřešit jednodušeji a tak.

Kód: Vybrat vše

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main(void){
   int i = 0;
   int x, user;
   
   srand(time(0));
   x = (1 + rand() % 10);
   
   do{
      printf("Guess my number (1-10): ");
      scanf("%d", &user);
      
      if(x == user){
         i++;
      }else{
         printf("Wrong\n");
         
         if(user > x){
            printf("<");
         }else{
            printf(">");
         }
         
         getch();
         system("cls");
      }
   }while(i<1);
   
   printf("Right");

   getch();
   return 0;
}

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: C - guess number

Příspěvekod faraon » 29 dub 2012 18:43

Chtělo by to ošetřit chybný vstup, může se stát že uživatel zadá číslo mimo limit nebo chybný znak. Funkce scanf je na zadání písmena místo čísla dost alergická, je potřeba kontrolovat návratovou hodnotu (počet správně načtených položek) a chybný znak odstranit z bufferu, než to zkusíš znovu.

A také není dobré cpát konstanty přímo do kódu, říká se že v programu se smí vyskytovat jen čísla 0 a 1, a ta ještě jen v krajním případě! Když tě třeba napadne že bys chtěl hádat čísla od 1 do 100, budeš muset prohledat celý zdroják a všechny desítky přepsat ručně, což u většího programu může trvat dost dlouho, a zaručeně některou zapomeneš, nebo naopak přepíšeš desítku co měla jiný účel. Když si konstanty nadefinuješ předem, stačí změnit jediné číslo na začátku, a máš úplně nový program ;-)

Kód: Vybrat vše

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MIN 1
#define MAX 10

int main(void)
    {
    int x,u;

    srand(time(NULL));
    x=rand()%(MAX-MIN+1)+MIN;

    do {
       do {
          printf("Hádej číslo (%d-%d): ",MIN,MAX);
          while (!scanf("%d",&u))
                getchar();
          } while (u<MIN || u>MAX);
       if (u<x)
          printf("Málo!\n");
       else
          if (u>x)
             printf("Moc!\n");
       } while (u!=x);

    printf("Zásah!\n");
    getchar();

    return 0;
    }


Zkus si nastavit MIN -10 8)
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

flushed
Level 1
Level 1
Příspěvky: 78
Registrován: duben 12
Pohlaví: Muž
Stav:
Offline

Re: C - guess number

Příspěvekod flushed » 29 dub 2012 20:13

díky moc :-).. jenom nechápu jednu věc. V této části kódu jsi napsal 2x while:

Kód: Vybrat vše

do {
          printf("Hádej číslo (%d-%d): ",MIN,MAX);
          while (!scanf("%d",&u))
                getchar();
          } while (u<MIN || u>MAX);

nestačí to napsat prostě takhle?

Kód: Vybrat vše

do{
         printf("Hadej cislo (%d-%d): ", MIN, MAX);
         scanf("%d", &u);
      }while(u < MIN || u > MAX);

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: C - guess number

Příspěvekod faraon » 29 dub 2012 20:47

V podstatě by to stačilo, ale představ si že nastoupíš do auta, a pokusíš se nastartovat špatným klíčem. Ten se do spínačky nechá klidně zastrčit, jenže místo startéru se začne otáčet celé auto :lol:

Zkus si zadat nějaký nesmysl, třeba .5 a uvidíš jak na to bude program reagovat. Mě to udělalo tohle a musel jsem ho odstřelit Ctrl+C:

Kód: Vybrat vše

Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10): Hádej číslo (1-10):
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: C - guess number

Příspěvekod faraon » 01 kvě 2012 09:30

Ještě bych přidal odpověď na otázku, "jestli by to třeba nešlo vyřešit jednodušeji". Samozřejmě že by šlo, pokud by ti nevadilo že program bude občas "mluvit z cesty":

Kód: Vybrat vše

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MIN 1
#define MAX 10

int main(void)
    {
    int x,u;

    for (srand(time(NULL)),u=!(x=rand()%(MAX-MIN+1)+MIN);printf("Hádej číslo (%d-%d): ",MIN,MAX),!scanf("%d",&u)||u!=x;printf("%s!\n",u>x?"Moc":"Málo"),getchar());

    printf("Zásah!\n");
    getchar();

    return 0;
    }


Ale nezkoušej to pochopit, a už vůbec ne napodobit!!! Tohle opravdu není dobrý způsob jak psát programy, a hlavně se v tom šíleně těžko hledá jakákoliv chyba.
Céčko je velmi ostře nabroušená břitva, můžeš se s ní perfektně oholit (pokud budeš opatrný), dokonce udělat operaci slepého střeva, ale také si uříznout půlku obličeje (při jediném chybném pohybu) :evil:
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

flushed
Level 1
Level 1
Příspěvky: 78
Registrován: duben 12
Pohlaví: Muž
Stav:
Offline

Re: C - guess number

Příspěvekod flushed » 01 kvě 2012 10:45

Tak tohle sem vážně moc nepochopil :shock: . Radši zůstanu u toho, co zatím chápu :D . Díky


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů