Priklad z Herouta – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Priklad z Herouta – C / C++ – Fórum – Programujte.comPriklad z Herouta – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
24. 2. 2014   #1
-
0
-

Ahoj,

         muze mi nekdo vysvetlit, proc scanf v nize uvedenem kodu poprve necha uzivatele zadat hodnotu a podruhe (pokud prvni vstup bylo napr. pismeno) uz ne?

int main(int argc, const char * argv[])
{
    int vstup, n, i = 1, pocet = 0;
    
    printf("Napis pocet cisel, ktera budes zadavat.\n");
    scanf("%d", &n);
    
    for ( ; n > 0 ; n--) {
        printf("Zadej %d. cislo.\n", i);
        if ((scanf("%d", &vstup)) != 1) {
            n++;
            continue;
        }
        if (vstup >= 25 && vstup <= 38) {
            pocet++;
        }
        i++;
    }
    
    printf("Z vami zadanych cisel jsou %d cisla z intervalu <25, 38>.\n", pocet);
    
    return 0;
}

Kod je mysleny tak, aby pri chybnem vstupu opakoval vyzvu pro zadani hodnoty a jeji zadani. Ovsem kdyz zadam nenumericky vstup, tak uz scanf nefunguje a "krasne" se mi to zacykli. Je mi jasny, ze je problem ve scanf, ale nechapu, jak se v tomto pripade chova..

Predem diky.

Nahlásit jako SPAM
IP: 62.201.23.–
Reklama
Reklama
KIIV+42
God of flame
24. 2. 2014   #2
-
0
-

no jde o to, ze kdyz ti nekdo zada treba pismeno, tak pri nacitani cisla se to pismeno neodstrani ... takze pri kazdem opakovani tam mas porad pismeno... (uzivatel uz toho moc nezada)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
24. 2. 2014   #3
-
0
-

#2 KIIV
Jasne, to jsem tak nejak tusil :-) Nevis jak to obejit? Nejak vynulovat tu hodnotu?

Nahlásit jako SPAM
IP: 62.201.23.–
KIIV+42
God of flame
24. 2. 2014   #4
-
+1
-
Zajímavé

no v tom bloku, kde mas n++ dej odstranit (nacist) jedno slovo "%s" (nebo jeden znak "%c")

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hlucheucho+10
Posthunter
24. 2. 2014   #5
-
+1
-
Zajímavé

.. a abys nemusel mít parametr, kam to načíst, mělo by fungovat "%*s" a pro znak "%*c". V takovém případě čte a nikam neuloží.

http://www.cplusplus.com/reference/cstdio/scanf/

hu

Nahlásit jako SPAM
IP: 195.178.67.–
24. 2. 2014   #6
-
0
-

Skvele, diky. Pouzil jsem nacteni %*c a funguje paradne.

Nahlásit jako SPAM
IP: 62.201.23.–
26. 2. 2014   #7
-
0
-

Ahoj, mam tu podobnou vec. Jedna se o fscanf. Kdyz dam "%d ", tak mi to vrati spravny soucet 1001. Pokud dam jen "%d", tak mi to nacte cislo '2' dvakrat. Proc to tak je? 

Ja si to (ocividne spatne) vysvetluju tak, ze po nacteni dvojky je uz jen EOF (tedy -1), proto nechapu proc to nacita '2' dvakrat.. Predem diky. (to horni je ukazka souboru, z ktereho program cte)

$$$998
$1
$$$$$$$$$$$$$$$$$$$$$2
FILE *fr;
    int c, cislo, soucet = 0;
    
    if ( (fr = fopen("soucet.txt", "r")) == NULL )
        printf("Soubor se nepodarilo nacist.\n");
    
    while (1) {
        while ( (c = getc(fr)) == '$')
            ;
        ungetc(c, fr);
        
        fscanf(fr, "%d ", &cislo);
        printf("%d\n", cislo);
        soucet += cislo;
        if (getc(fr) == EOF)
            break;
    }
    
    printf("Soucet je %d\n", soucet);
    
    if (fclose(fr) == EOF)
        printf("Soubor se nepodarilo zavrit.\n");
    
    return 0;
Nahlásit jako SPAM
IP: 62.201.23.–
KIIV+42
God of flame
27. 2. 2014   #8
-
0
-

chtelo by to kontrolu, jestli se ti to cislo vubec nacist povedlo... pak to bude fungovat

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hlucheucho+10
Posthunter
27. 2. 2014   #9
-
0
-

fscanf vrací počet načtených položek (tím jsem chtěl předejít otázce jak)   

hu

Nahlásit jako SPAM
IP: 195.178.67.–
27. 2. 2014   #10
-
0
-

#9 hlucheucho
To vim..

#8 KIIV
Ale nevim, jak mi tohle pomuze s pochopenim toho dvojiho nacitani ty dvojky..?!

Diky

Nahlásit jako SPAM
IP: 62.201.23.–
hlucheucho+10
Posthunter
27. 2. 2014   #11
-
0
-

V proměnné cislo zůstává načteno číslo z předchozího cyklu dokud není přepsáno právě načtenou hodnotou. Pokud tedy není načteno nic, přičte se číslo načtené v předešlém cyklu.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
27. 2. 2014   #12
-
0
-

#11 hlucheucho
diky :-)

Nahlásit jako SPAM
IP: 62.201.23.–
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, 119 hostů

Podobná vlákna

Knihy od Pavla Herouta — založil Anon

Příklad v c++ — založil Petr

Příklad v C++ — založil squirrel

Priklad — založil ukulele

Příklad — založil Ovladač

Moderátoři diskuze

 

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