[C] ošetření vstupních hodnot

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod julie_24 10. 5. 2013 11:34

potřebovala bych pomoct. Přes proměnou jakToDopadlo potřebuji zajistit, aby mi fungoval program jenom na čísla. Když zadám nějaké písmeno, tak se mi to zacyklí a to je špatně. Díky za jakoukoliv pomoc. :'(

Kód: Vybrat vše
#include <stdio.h>
#include <conio.h>



int PVez(int vyska, int odkud,int kam,int pomoci)   // deklerování promìných
{
    static int counter;
    counter ++;
    if (vyska > 0)
    {
        PVez((vyska-1), odkud, pomoci, kam);
        printf("Prenes kotouc z %i tyce na %i tyc\n ", odkud, kam);
        PVez((vyska-1), pomoci, kam, odkud);
    }
    return counter;
}
int main()
{
    printf("********************************\nVYTEJTE V PROGRAMU HANOJSKE VEZE\n********************************\n");
    int n;
    int cnt;
    int jakToDopadlo;
    while (1)
    {
        printf("Zadej pocet kotoucu :\n") ;
        jakToDopadlo = scanf("%i", &n);
        if (n > 10)
        {
            printf("Nelze zadat vice kotoucu nez 10!\n");
        }
        else if (n <= 0)
        {
            printf("Bez kotoucu to nepujde!\n");
        }

        else
        {
            break;
        }
    }
    cnt=PVez(n,1,2,3);
    printf("Pocet volani: %i\n", cnt);
    getchar();
    return 0;

}
julie_24
Kolemjdoucí

Odeslat příspěvekod soban 10. 5. 2013 12:18

Musíš tu proměnnou kontrolovat a pokud fukce scanf neproběhla správně tak znovu zavolat funkci scanf tak dlouho pokud nepřečte číslo.

Kód: Vybrat vše
while (scanf("%i", &n) != 1) printf("Spatny vstup - zadejte pouze jedno cislo!");
Naposledy upravil soban dne 10. 5. 2013 12:23, celkově upraveno 1
/----------------------------------------\
| Petr Šobáň |
| Olomouc |
\----------------------------------------/
soban
Pokročilý

Odeslat příspěvekod Nargon 10. 5. 2013 12:22

Mohlo by stačit tu poslední část "else" v tom cyklu upravit:

Kód: Vybrat vše
else if (n > 0 && n <= 10)
{
    break
}
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod julie_24 10. 5. 2013 12:47

Teoreticky vím, co mám udělat, ale nedokážu to sama implementovat. On mi st tím z větší části pomáhal kámoš, ale odjel a nechal mě v tom samotnou a já to sama asi neudělám, ale díky za radu.
julie_24
Kolemjdoucí

Odeslat příspěvekod root 10. 5. 2013 13:30

Zkus si to nějak upravit, ale celej ten kód je blbě :)

Kód: Vybrat vše
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>     /* strtol */

#ifdef WIN32
#include <conio.h>
#else
#include <curses.h>
#endif


int PVez(int vyska, int odkud,int kam,int pomoci)   // deklerování promìných
{
    static int counter;
    counter ++;
    if (vyska > 0)
    {
        PVez((vyska-1), odkud, pomoci, kam);
        printf("Prenes kotouc z %i tyce na %i tyc\n ", odkud, kam);
        PVez((vyska-1), pomoci, kam, odkud);
    }
    return counter;
}
int main()
{
    printf("********************************\nVYTEJTE V PROGRAMU HANOJSKE VEZE\n********************************\n");
    int n;
    int cnt;
    int jakToDopadlo;
    char* temp = (char*)malloc(1024);
   
    while (1)
    {
        printf("Zadej pocet kotoucu :\n") ;
        errno = 0;
       
        /* Prevod stringu na cislo se dela pres funkce ato(i,...) */
        scanf("%s", temp);
        if (!(n = strtol (temp, &temp, 10))) {
            printf("Bez kotoucu to nepujde!\n");
        } else if (n > 10) {
            printf("Nelze zadat vice kotoucu nez 10!\n");
        } else {
            break;
        }

        /*if ((jakToDopadlo = scanf("%i", &n) != 1) or (errno != 0)) {
            printf("Input musi byt cislo.\n");
            continue;   
        }

        if (n > 10)
        {
            printf("Nelze zadat vice kotoucu nez 10!\n");
        }
        else if (n <= 0)
        {
            printf("Bez kotoucu to nepujde!\n");
        }

        else
        {
            break;
        }*/
    }
    cnt=PVez(n,1,2,3);
    printf("Pocet volani: %i\n", cnt);
    getchar();
    return 0;

}


Edit: Rekurze je v zadání povolena? Nebo to má být program na 40 znaků? (Vůbec neřeším jestli to opravdu dělá co to dělat má :))
root
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků