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í
×
    dnes 12:33 | Zajímavý projekt

    MALUS je kontroverzní proprietarní nástroj, který svým zákazníkům umožňuje nechat AI, která dle tvrzení provozovatelů nikdy neviděla původní zdrojový kód, analyzovat dokumentaci, API a veřejná rozhraní jakéhokoliv open-source projektu a následně úplně od píky vygenerovat funkčně ekvivalentní software, ovšem pod libovolnou licencí.

    NUKE GAZA! 🎆 | Komentářů: 11
    dnes 03:55 | Bezpečnostní upozornění

    Příspěvek na blogu Ubuntu upozorňuje na několik zranitelností v rozšíření Linuxu o mandatorní řízení přístupu AppArmor. Společně jsou označovány jako CrackArmor. Objevila je společnost Qualys (technické detaily). Neprivilegovaný lokální uživatel se může stát rootem. Chyba existuje od roku 2017. Doporučuje se okamžitá aktualizace. Problém se týká Ubuntu, Debianu nebo SUSE. Red Hat nebo Fedora pro mandatorní řízení přístupu používají SELinux.

    Ladislav Hagara | Komentářů: 2
    včera 17:22 | Nová verze

    Byla vydána nová verze 19 integrovaného vývojového prostředí (IDE) Qt Creator. Podrobný přehled novinek v changelogu.

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

    Bitwig Studio (Wikipedie) bylo vydáno ve verzi 6. Jedná se o proprietární multiplatformní (macOS, Windows, Linux) digitální pracovní stanici pro práci s audiem (DAW).

    Ladislav Hagara | Komentářů: 4
    včera 02:11 | Komunita

    Společnost Igalia představila novou linuxovou distribuci (framework) s názvem Moonforge. Jedná se o distribuci určenou pro vestavěné systémy. Vychází z projektů Yocto a OpenEmbedded.

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

    Google Chrome 146 byl prohlášen za stabilní. Nejnovější stabilní verze 146.0.7680.71 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 29 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    včera 00:22 | Nová verze

    D7VK byl vydán ve verzi 1.5. Jedná se o fork DXVK implementující překlad volání Direct3D 3 (novinka), 5, 6 a 7 na Vulkan. DXVK zvládá Direct3D 8, 9, 10 a 11.

    Ladislav Hagara | Komentářů: 0
    11.3. 23:22 | Nová verze

    Bylo vydáno Eclipse IDE 2026-03 aneb Eclipse 4.39. Představení novinek tohoto integrovaného vývojového prostředí také na YouTube.

    Ladislav Hagara | Komentářů: 4
    11.3. 10:22 | Upozornění

    Ze systému Slavia pojišťovny uniklo přibližně 150 gigabajtů citlivých dat. Jedná se například o pojistné dokumenty, lékařské záznamy nebo přímou komunikaci s klienty. Za únik může chyba dodavatelské společnosti.

    Ladislav Hagara | Komentářů: 14
    11.3. 10:11 | IT novinky

    Sněmovna propustila do dalšího kola projednávání vládní návrh zákona o digitální ekonomice, který má přinést bezpečnější on-line prostředí. Reaguje na evropské nařízení DSA o digitálních službách a upravuje třeba pravidla pro on-line tržiště nebo sociální sítě a má i víc chránit děti.

    Ladislav Hagara | Komentářů: 36
    Které desktopové prostředí na Linuxu používáte?
     (16%)
     (7%)
     (0%)
     (11%)
     (29%)
     (2%)
     (5%)
     (2%)
     (13%)
     (25%)
    Celkem 1066 hlasů
     Komentářů: 26, poslední včera 08:56
    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: 2384×
    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.