Avatar
informatik87
Člen
Avatar
informatik87:

Zdravím, nevíte někdo proč se v kódu (viz. níže) provede po zadání poloměru koule ihned podmínka a nečeká se na načtení znaku do proměnné vyber? Vypadá to tak, že se do proměnné vyber uloží enter ze zadání poloměru. Ale jak to opravit, aby program běžel správně?

#include <stdio.h>
#include <math.h>

int main(void)
{
    float r, vysledek;
    char vyber;
    printf("Zadej polomer koule: ");
    scanf("%f", &r);
    printf("Pro vypocitani objemu zadej v a obsahu s: ");
    scanf("%c", &vyber);

    if (vyber == 'v' || vyber == 'V') {
        vysledek = (4 / 3) * M_PI * pow(r, 3);
        printf("Vysledek objemu = %f", vysledek);
    }
    else if (vyber == 's' || vyber == 'S') {
        vysledek = 4 * M_PI * pow(r, 2);
        printf("Vysledek obsahu = %f", vysledek);
    }
    else {
        printf("Spatne pismeno!");
    }

    return 0;
}
 
Odpovědět 20.11.2014 14:38
Avatar
MrPabloz
Člen
Avatar
Odpovídá na informatik87
MrPabloz:

Protože scanf načte první znak co tam je, a protože jsi zadal předtím číslo, a odentroval, tak se načetlo číslo, a enter tam zůstal, a ten pak ten druhy scanf načte :) tedy nečeká až něco zadáš ty:)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 20.11.2014 14:52
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
informatik87
Člen
Avatar
Odpovídá na MrPabloz
informatik87:

Právě jsem na to přišel, musí tam bát místo scanf("%c" ... scanf("%s" ..., že ano?

 
Nahoru Odpovědět 20.11.2014 14:56
Avatar
MrPabloz
Člen
Avatar
Odpovídá na informatik87
MrPabloz:

Ne, zprávně bys měl vyčistit buffer předtím, než načteš znak, tedy něco ve stylu fflush(stdin); není to sice nejkorektnější, ale ano, udělá to to, co ty chceš, tedy načíst znak, co on zadá, tím že tam dáš string, tak se ti načtou i to před tím, tedy nebude to pořád to v, ale teda pokud se nemýlím. Tím fflush se to řeší asi nejrychleji, ti to vyčistí stdin buffer a pak načte znak co zadáš teprv :)

Nahoru Odpovědět 21.11.2014 12:26
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
tomasmanhal
Člen
Avatar
Nahoru Odpovědět 21.11.2014 12:28
Kdyby nám dodali k životu zdrojový kód, vše by bylo jednodušší...
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na informatik87
David Čápka:

Mám dojem, že by mohlo zafungovat když tam zadáš " %c" (s mezerou).

Nahoru Odpovědět  +1 21.11.2014 13:02
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Libor Šimo (libcosenior):

Ja som vždy používal odstránenie znaku ENTER:

scanf("%f", &r);
while (getchar() != '\n') ; // odstranenie enter
printf("Pro vypocitani objemu zadej v a obsahu s: ");
scanf("%c", &vyber);

ale Davidov spôsob sa mi zadá jednoduchší a pokiaľ to nemá nejaké vedľajšie účinky, bude asi najlepší zo všetkých tu uvedených. ;)

Nahoru Odpovědět 21.11.2014 14:41
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Libor Šimo (libcosenior):

Môže niekto skúsenejší vybrať, ktoré s tých troch možností je najsprávnejšia?

scanf("%f", &r);
//while (getchar() != '\n') ; // odstranenie enter
//fflush(stdin); // vyprázdnenie buferu
printf("Pro vypocitani objemu zadej v a obsahu s: ");
scanf(" %c", &vyber); // medzera pred %c
Nahoru Odpovědět 21.11.2014 14:53
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.