Portál AbcLinuxu, 12. května 2025 05:16

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: 2342×
Odpovědět | Admin
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:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

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
Odpovědět | | Sbalit | Link | Blokovat | Admin
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
Odpovědět | | Sbalit | Link | Blokovat | Admin
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
Odpovědět | | Sbalit | Link | Blokovat | Admin
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, (c) 1999-2007 Stickfish s.r.o.