abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 0
    dnes 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    dnes 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    dnes 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    dnes 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    dnes 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    včera 22:44 | IT novinky

    IBM kupuje společnost HashiCorp (Terraform, Packer, Vault, Boundary, Consul, Nomad, Waypoint, Vagrant, …) za 6,4 miliardy dolarů, tj. 35 dolarů za akcii.

    Ladislav Hagara | Komentářů: 12
    včera 15:55 | Nová verze

    Byl vydán TrueNAS SCALE 24.04 “Dragonfish”. Přehled novinek této open source storage platformy postavené na Debianu v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 13:44 | IT novinky

    Oznámeny byly nové Raspberry Pi Compute Module 4S. Vedle původní 1 GB varianty jsou nově k dispozici také varianty s 2 GB, 4 GB a 8 GB paměti. Compute Modules 4S mají na rozdíl od Compute Module 4 tvar a velikost Compute Module 3+ a předchozích. Lze tak provést snadný upgrade.

    Ladislav Hagara | Komentářů: 0
    včera 04:44 | Nová verze

    Po roce vývoje od vydání verze 1.24.0 byla vydána nová stabilní verze 1.26.0 webového serveru a reverzní proxy nginx (Wikipedie). Nová verze přináší řadu novinek. Podrobný přehled v souboru CHANGES-1.26.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (72%)
     (9%)
     (2%)
     (17%)
    Celkem 753 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: Kalkulačka v jazyku C s jasně zadaným vstupem

    19.11.2013 14:37 anakin
    Kalkulačka v jazyku C s jasně zadaným vstupem
    Přečteno: 2310×
    Ahoj, mohl by mi někdo prosím vylepšit můj kód aby splňoval tato kritéria:

    1)Vstup je jasně daný: a oper b, kde a a b jsou typu double, oper je +,-,* nebo /

    Přičemž program ignoruje mezery mezi jednotlivými vstupy - příklad: 3 + 1 program interpretuje jako 3+1 nehledě na to že uživatel zadal mnoho mezer mezi jednotlivými vstupy

    2) Pokud uživatel zadá nějaký nesmysl - například 4 nebo 3a a zmáčkne ENTER tak se objeví chybová hláška

    Takto vypadá můj současný kód:

    int main()
    {
       char oper;
       double a, b;
    
       printf("Napiste co chcete vypocitat\n");
       scanf("%lf", &a);
       getchar();
       oper = getchar();
       scanf("%lf", &b);
    
       switch(oper)
       {
        case '+':
            printf("%f+%f=%.2f",a,b,a+b);
            break;
        case '-':
            printf("%f-%f=%.2f",a,b,a-b);
            break;
        case '*':
            printf("%f*%f=%.2f",a,b,a*b);
            break;
        case '/':
            if(b != 0)
            {
                        printf("%f/%f=%.2f",a,b,a/b);
                break;
            }
            else
            {
                printf("Error! Delite nulou.");
                break;
            }
        default:
            printf("Error! Spatne zadany operator.");
            break;
       }
       return 0;
    }


    Řešení dotazu:


    Odpovědi

    Josef Kufner avatar 19.11.2013 15:04 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    char oper[2] = {0, 0};
    double a, b;
    if (3 == scanf("%lf %1[+/*-] %lf", &a, &oper, &b)) {
        printf("%f %c %f = %.2f\n", a, oper[0], b, a + b);
    } else {
        fprintf(stderr, "Nejaka blbost.\n");
    }
    Hello world ! Segmentation fault (core dumped)
    19.11.2013 15:20 potato
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    Jo, pravda, %[ ukládá ještě na konec NUL, takže moje řešení je blbě...
    19.11.2013 15:17 potato
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    scanf() je mnohem inteligentnější, než se obecně ví...
        double a, b;
        char op;
    
        if (scanf("%lf %1[-+/*] %lf", &a, &op, &b) != 3)
            printf("Error.\n");
        else {
            /* ... */
        }
    
    19.11.2013 15:39 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    scanf() je mnohem inteligentnější, než se obecně ví...
    Ještě ho naučit, že tečka i čárka u plavacích čísel totéž je (ehm tedy desetinný oddělovač, bez ohledu na locale) a bylo by vystarané...
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    20.11.2013 09:16 dword
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    jeste ze mame roury a sed
    20.11.2013 10:36 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    To je k ničemu, je to o tom, že prostě nelze jednoduše řádkově žádat vstup uživatele. Je třeba si to sám upravovat, protože lidi mají různé nastavení a různé aplikace, používají různé vstupy a rozlišit kdy kde tečku nebo čárku v krajích česko-německých je na zblbnutí...
    Zjednodušeně musíš vzít řetězec místo čísla, zjistit si co tam má být, udělat harakiry, a přehnat to přes nějakou scanf fci, pak teprve máš user-friendly zadávaní vstupu.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    19.11.2013 18:12 anakin
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    JJ. To funguje perfektně. To pole+scanf je geniální řešení pro to ignorování mezer, přesto mi vrtá hlavou proč tam nefunguje to printf(error) v případech pokud zadám vstup tohoto typu např.: 394 a zmáčknu ENTER tak se mi ta hláška ERROR nechce zobrazit, zatímco pokud zadám 3 56 nebo CauLidi tak se hláška ERROR zobrazí. Nevíte v čem je problém?
    19.11.2013 19:00 axel
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    scanf neni prilis vhodny nastroj pro tento ukol. Lepe receno tak jak je formulovan by snad sel resit (neni tam ale potencialni problem s arithmetic overflow?), ale obecne parsovat stdin pomoci scanf nekonci dobre. Napsal bych si parsing komplet jako jednoduchy automat a jeste bych si pri tom procvicil cecko, coz je asi smyslem tohoto zadani:-)
    19.11.2013 19:56 potato
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    Jaký problém s arithmetic overflow? Program samozřejmě korektně načítá i výrazy jako 1+inf, nan/nan a podobně.

    Napsát správné parsování a konverzi čísel s plovoucí řádovou čárkou není žádné jednoduché cvičení.
    21.11.2013 10:16 axel
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    Treba pro integer tento problem nastava (zada se dlouha posloupnost cislic a nacte se nesmysl), s tim jsem se primo setkal. Mozna pro double to je osetrene a nenastava to, s tim zkusenost nemam a patrat se mi po tom nechce:-)
    19.11.2013 19:25 potato
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    Hm, ano, problém je validní leč neúplný vstup, protože se má něco stát hned po Enteru, ne na konci vstupu. V tom případě je možné třeba číst po řádcích (např. pomocí getline()) a použít sscanf() na ten řádek.
    19.11.2013 19:56 anakin
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    Zkoušel jsem toto:
    
    int main()
    {
       char oper;
       double a, b;
       char buffer[256];
    
       printf("Napiste co chcete vypocitat\n");
       fgets(buffer, 256, stdin);
       if (sscanf("%lf %1[-+/*] %lf", &a, &oper, &b) != 3)
            printf("ERROR.\n");
       else
            { .... zbytek kódu je stejný....
    
    Problémem ale teď je že pokud zadám normální vstup
    3 + 1
    tak to zmrzne jako předtím.

    Ovšem když zadám
    3458
    tak se doopravdy objeví ERROR

    Mohli byste mi to prosím vysvětlit a opravit?
    Řešení 1× (anakin (tazatel))
    Josef Kufner avatar 19.11.2013 20:00 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    sscanf(buffer, …
    Hello world ! Segmentation fault (core dumped)
    Josef Kufner avatar 19.11.2013 19:59 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    Druhou možností je lépe specifikovat mezery:
    scanf("%lf%*[ \t]%1[+/*-]%*[ \t]%lf", &a, &oper, &b)
    Ale jinak se mi taktéž osvědčilo nejdříve načíst řádek a pak teprve ho parsovat. Pokud konec řádku nese význam, je to spolehlivější a lépe to reaguje na chyby ve vstupu.
    Hello world ! Segmentation fault (core dumped)
    Josef Kufner avatar 19.11.2013 20:04 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Kalkulačka v jazyku C s jasně zadaným vstupem
    Pokud to však chceš udělat opravdu pěkně, přečti si zdejší seriál Jazyky a překladače. Najdeš tam, jak to udělat tak, aby fungovaly například i závorky a libovolný počet operátorů, včetně jejich priorit.
    Hello world ! Segmentation fault (core dumped)

    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.