C - proč se mi program zacyklí? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C - proč se mi program zacyklí? – C / C++ – Fórum – Programujte.comC - proč se mi program zacyklí? – C / C++ – Fórum – Programujte.com

 

Martin
~ Anonymní uživatel
1602 příspěvků
16. 11. 2013   #1
-
0
-

Dobrý den, mám problém s tímto cyklem:

do {
printf("Zadejte nominalni domaci produkt daneho roku: ");
scanf("%f", &n_hdp);
} while (n_hdp < 1 || n_hdp > 99999999999999999 )

Není to konečná verze té podmínky, ale nerozumím tomu, proč když napíšu např 0, tak vše funguje jak má a znova mě program požádá at zadám to číslo... ALE když vložím např písmeno, tak se program dostane do nekonečného cyklu..?

Vůbec nejradějí bych byl, pokud byste mi i poradili, jak to ošetřit jinou podmínkou než je tato (aby se pokračovalo pouze pokud uživatel vloží číslo?

Nahlásit jako SPAM
IP: 85.119.89.–
nergal+1
Návštěvník
16. 11. 2013   #2
-
0
-

treba ošetriť úspešnoť vykonania funkcie scanf a prípadne vyprázdniť buffer napríklad takéto niečo by mohlo fungovať:

    do {
        printf("Zadejte nominalni domaci produkt daneho roku: ");
        if (1 != scanf("%f", &n_hdp)) {
            while (getchar() != '\n');
            continue;
        }
    } while (n_hdp < 1 || n_hdp > 99999999999999999);
Nahlásit jako SPAM
IP: 85.135.220.–
viem že neviem čo viem
Martin
~ Anonymní uživatel
1602 příspěvků
16. 11. 2013   #3
-
0
-

Díky moc, tohle je paráda :)

Nahlásit jako SPAM
IP: 85.119.89.–
Martin
~ Anonymní uživatel
1602 příspěvků
16. 11. 2013   #4
-
0
-

Tak beru zpět, je to sice o dobré, ale ne 100% funkční. Pokud totiž zadám nejdřív 0 nebo záp. číslo a pak zkouším zadávat písmena, tak to funguje, ALE pokud nejdřív zadám písmeno program pokračuje dál a z písmena si vytvoří jakési číslo :/

Nahlásit jako SPAM
IP: 85.119.89.–
nergal+1
Návštěvník
16. 11. 2013   #5
-
0
-

hmm fakt, ak sa n_hdp nenainicializuje tak to funguje zle :) toto by malo fungovať

    n_hdp = 0.0f;
    do {
        printf("Zadejte nominalni domaci produkt daneho roku: ");
        if (1 != scanf("%f", &n_hdp)) {
            while (getchar() != '\n');
            continue;
        }
    } while (n_hdp < 1 || n_hdp > 99999999999999999);
Nahlásit jako SPAM
IP: 85.135.220.–
viem že neviem čo viem
KIIV
~ Moderátor
+43
God of flame
16. 11. 2013   #6
-
+1
-
Zajímavé

  

cim to asi je :) smeti v ram, neuspesne nacteni ve scanf nemeni promennou... a tak

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Robo
~ Anonymní uživatel
82 příspěvků
17. 11. 2013   #7
-
0
-

#1 Martin
Ja len takú malú vychytávku :)
to že tam zadávaš 99999999999999999, tak to asi znamená, že to chceš porovnať s najväčším možným číslom (alebo s nejakým, ktoré vieš že nedosiahneš). Tak nato sa zvykne využívať INT_MAX (definovaný v limits.h), ktorý ti vráti najväčšie možné číslo ktoré vieš uložiť do premennej typu int

Nahlásit jako SPAM
IP: 178.253.138.–
Martin
~ Anonymní uživatel
1602 příspěvků
17. 11. 2013   #8
-
0
-

Díky, tahle verze už funguje korektně jen k tomu s tím <999999999 za to se omlouvám, že sem vás zmátl. Tím sem se pouze snažil ošetřit, aby tam nešlo nic jinýho než čísla (neúspěšně). Takže teď mám pouze tu podmínku, že to musí betj větší než 0 :)

A vysvětlil by mi někdo, co přesně dělá to f za n_hdp = 0.0 ?

Nahlásit jako SPAM
IP: 85.119.89.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 35 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý