abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 21:11 | Nová verze

    Byl vydán Debian 13 s kódovým názvem Trixie. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 1
    včera 15:55 | Zajímavý software

    WLED je open-source firmware pro ESP8266/ESP32, který umožňuje Wi-Fi ovládání adresovatelných LED pásků se stovkami efektů, synchronizací, audioreaktivním módem a Home-Assistant integrací. Je založen na Arduino frameworku.

    Indiánský lotr | Komentářů: 0
    8.8. 15:33 | Nová verze

    Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána v nové verzi 2025.8.

    Ladislav Hagara | Komentářů: 3
    8.8. 14:22 | IT novinky

    Herní studio Hangar 13 vydalo novou Mafii. Mafia: Domovina je zasazena do krutého sicilského podsvětí na začátku 20. století. Na ProtonDB je zatím bez záznamu.

    Ladislav Hagara | Komentářů: 1
    8.8. 13:22 | IT novinky

    Operátor O2 má opět problémy. Jako omluvu za pondělní zhoršenou dostupnost služeb dal všem zákazníkům poukaz v hodnotě 300 Kč na nákup telefonu nebo příslušenství.

    Ladislav Hagara | Komentářů: 8
    8.8. 05:55 | IT novinky

    Společnost OpenAI představila GPT-5 (YouTube).

    Ladislav Hagara | Komentářů: 2
    8.8. 05:00 | Nová verze

    Byla vydána (𝕏) červencová aktualizace aneb nová verze 1.103 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.103 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 0
    7.8. 17:33 | IT novinky

    Americký prezident Donald Trump vyzval nového generálního ředitele firmy na výrobu čipů Intel, aby odstoupil. Prezident to zdůvodnil vazbami nového šéfa Lip-Bu Tana na čínské firmy.

    Ladislav Hagara | Komentářů: 10
    7.8. 16:55 | Nová verze

    Bylo vydáno Ubuntu 24.04.3 LTS, tj. třetí opravné vydání Ubuntu 24.04 LTS s kódovým názvem Noble Numbat. Přehled novinek a oprav na Discourse.

    Ladislav Hagara | Komentářů: 0
    7.8. 16:44 | Nová verze

    Byla vydána verze 1.89.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    Kolik tabů máte standardně otevřeno ve web prohlížeči?
     (46%)
     (20%)
     (4%)
     (5%)
     (3%)
     (1%)
     (1%)
     (19%)
    Celkem 318 hlasů
     Komentářů: 23, poslední 4.8. 13:01
    Rozcestník

    Dotaz: Postfixova kalkulacka v C: osetreni neplatnych vstupu

    tomes.io avatar 14.3.2012 21:38 tomes.io | skóre: 12 | blog: tomesh
    Postfixova kalkulacka v C: osetreni neplatnych vstupu
    Přečteno: 1090×
    Ahoj, tvořím postfixovou kalkulačku a potýkám se s problémem, jak ošetřit neplatné vstupy (špatná čísla -123abc není číslo-, příliš málo operandů pro operátor, úplně prázdný vstup).

    Nize uvadim mou implementaci (bez definic fcí, pouze main, na pochopeni by to melo stacit). Ošetřil jsem případ dělení nulou a neplatného operátoru. Dotaz bych rozdělil do dvou:

    PRVNI - zaporna čísla:

    Tato podoba neumí pracovat se zápornými čísly - považuje je za neplatný vstup. Když však odstraním poslední ELSE s warningem:
               else {
    
                 printf("CHYBA: Neplatny vstup!\n");
                 exit(1);
    tak mi kalkulačka počítá snadno i se zápornými čísly, ale také načítá veškeré další znaky, které při výpočtu ignoruje, ale na vstupu by být neměly.

    Otázka tedy zní, jak tyto znaky odfiltrovat (či jinak ošetřit), aby na vstupu byla pouze čísla, platné operátory a vše ostatní by končilo errorem a koncem programu s příslušnou hláškou. Snad by se to dalo vyřešit nějakou vhodnou podmínkou na vstupu?

    DRUHY - málo nebo žádné znaky na vstupu:

    Zatím jsem nepřišel na to, jak ošetřit vstup, nak terém není nic, mezera, mezera a pouze číslo, mezera číslo a operátor. Prostě nedostatečný vstup. Stand nějak využít fci strncmp?

    Byl bych rád, kdybyste mě někdo nakopnuli správným směrem. Píšu to od rána a už mi to nemyslí :)

    Zde má dosavadní implementace.

    int main()
     {
         //int vysledek;
         int numInp;
         char vstup[15];
         int op;
         int vysledek = 0;
         int i;
         int end = 0;
         
         while(end != EOF){
    
             end = scanf("%s", vstup);   //Program postupně bude brát slova ze vstupu...
             if(end == EOF)
                 break;
    
    
    
         numInp = atoi(vstup);
    
         for(i = 0; i < strlen(vstup); i++){
    
             if(isdigit(vstup[i])) {     //pokud načetl číslo...
    
                 numInp = atoi(vstup);
                 push(numInp);           //...přidá jej na vrchol zásobníku...
    
             }
    
    
    
             else if(strlen(vstup) == 1){
    
                        switch(vstup[i])    /* ...pokud načetl operátor, vezme dvě čísla z vrcholu zásobníku,
                                            *aplikuje na ně načtený operátor a výsledek uloží zpět na zásobník.*/
                        {
                        case '+':
                            vysledek = push(pop() + pop());
                            break;
                        case '-':
                            op = pop();
                            vysledek = push(pop() - op);
                            break;
                        case '*':
                            vysledek = push(pop() * pop());
                            break;
                        case '/':
                            op = pop();
                            if (op == 0){                          
                                 printf("Nelze delit nulou\n");
                                 exit(1);
                               }
                            else
                            vysledek = push(pop() / op);
                            break;
                        default:
                            printf("CHYBA: Neplatny vstup!\n"); //všechny jiné znaky (jednoznakové) než výše uvedené operandy
                            exit(1);
                        }
                 }
    
               else {
    
                 printf("CHYBA: Neplatny vstup!\n"); // filtruje "smetí" typu sdf125, ale i záporná čísla
                 exit(1);
             }
    
           }
         }
    
         printf("%d\n", vysledek);
     return 0;
    }

    Řešení dotazu:


    Odpovědi

    15.3.2012 00:00 kuka
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    To si musis vyjasnit, co vlastne potrebujes. Pokud najdes cislici, tak na to pustis atoi. To samozrejme neni optimalni, viz man atoi. Pokud je vstup primo od uzivatele, je treba ho neustale kontrlovat s jista paranoia je na miste. Tzn. napriklad nacitat tak dlouho, dokud jsou na vstupu cislice nebo desetinna tecka (unarni minus, scientific notace atd...) a terprve pak to prevadet na cislo. Podobne se osetri nespravna sekvence oparatoru (dvakrat plus za sebou) apod.
    16.3.2012 14:51 Sten
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    atoi je zlo. Používejte strtol a příbuzené funkce.
    tomes.io avatar 16.3.2012 22:28 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    Ano, strol to vyresil. Uzaviram tedy problem.
    tomes.io avatar 16.3.2012 22:49 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    no tak koukam, ze ne uplne. pri odecitani napr 4 0 - mi to haze zaporny vysledek.
    tomes.io avatar 16.3.2012 23:12 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    no, vyreseno, byla to jen drobnost :)
    Fuky avatar 16.3.2012 10:38 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    $ man strtol strtod strtof strtold
    int main(int argc, char *argv[]) { int base; char *endptr, *str; long val; if (argc < 2) { fprintf(stderr, "Usage: %s str [base]\n", argv[0]); exit(EXIT_FAILURE); } str = argv[1]; base = (argc > 2) ? atoi(argv[2]) : 10; errno = 0; /* To distinguish success/failure after call */ val = strtol(str, &endptr, base); /* Check for various possible errors */ if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || (errno != 0 && val == 0)) { perror("strtol"); exit(EXIT_FAILURE); } if (endptr == str) { fprintf(stderr, "No digits were found\n"); exit(EXIT_FAILURE); } /* If we got here, strtol() successfully parsed a number */ printf("strtol() returned %ld\n", val); if (*endptr != '\0') /* Not necessarily an error... */ printf("Further characters after number: %s\n", endptr); exit(EXIT_SUCCESS); } $ ./a.out 123 strtol() returned 123 $ ./a.out ' 123' strtol() returned 123 $ ./a.out 123abc strtol() returned 123 Further characters after number: abc $ ./a.out 123abc 55 strtol: Invalid argument $ ./a.out '' No digits were found $ ./a.out 4000000000 strtol: Numerical result out of range
    tomes.io avatar 16.3.2012 14:54 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    Fuky, diky za hint. strtol() je ta fce, kterou asi hledam. Zkusim a dam vedet.
    rADOn avatar 16.3.2012 13:49 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    Nehledáš náhodou nějaký ten flex/bison nebo něco podobného?
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    tomes.io avatar 16.3.2012 14:20 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Postfixova kalkulacka v C: osetreni neplatnych vstupu
    az doted, nez jsem si to diky tobe vygoolil, jsem o zadnem bisonu neslysel :)

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.