Stránka 1 z 1

C - guess number

Napsal: 29 dub 2012 17:21
od flushed
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;
}

Re: C - guess number

Napsal: 29 dub 2012 18:43
od faraon
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)

Re: C - guess number

Napsal: 29 dub 2012 20:13
od flushed
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);

Re: C - guess number

Napsal: 29 dub 2012 20:47
od faraon
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):

Re: C - guess number

Napsal: 01 kvě 2012 09:30
od faraon
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:

Re: C - guess number

Napsal: 01 kvě 2012 10:45
od flushed
Tak tohle sem vážně moc nepochopil :shock: . Radši zůstanu u toho, co zatím chápu :D . Díky