C++ prečo 2 krát?!?

Programovacie jazyky, rady, poradňa...
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

C++ prečo 2 krát?!?

Príspevok od používateľa Mick_14 »

Čaute, učím sa základy v C++ a pri tomto programe (zadávam znaky, kým nezadám 'X') mi to hned pri druhom znaku ked ho zadám vypíše vždy 2x"Skus dalsi znak" a "Zadajte znak prosim" ..kde tam mám chybu? :)

Kód: Vybrať všetko

#include<stdio.h>
main()
{
      char znak;

      while (znak!='X')
      {
            printf("Zadajte znak prosim\n");
            scanf("%c", &znak);
            if (znak=='X')
               printf("Goood!!! :D\n");
            else printf("Skus dalsi znak \n");
      }
      system("pause");
}
Prílohy
Bez názvu.jpg
Azmeh
Novice
Novice
Príspevky: 3
Registrovaný: 24 máj 2012, 21:42

Re: C++ prečo 2 krát?!?

Príspevok od používateľa Azmeh »

Mal by si premennú "znak" vyprázdniť pred ďalším použitím.
Ono to myslím ukladá aj prázdny znak [ENTER].

// self edit: Nereaguj, keď ešte spíš!
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: C++ prečo 2 krát?!?

Príspevok od používateľa Mick_14 »

čo myslíš presne tým vyprázdniť? Som začiatočník, do premenej znak mám niečo priradiť či ako?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ prečo 2 krát?!?

Príspevok od používateľa BX »

Ty si cez scanf vypýtaš jeden znak. Zadáš teda znak a potvrdíš enterom. Zadaný znak sa uloží do premennej a enter sa nechá v zasobníku. V ďalšom cykle scanf očakáva znak, nájde si v zásobníku enter a tak ho použije. V ďalšom cykle už v zásobníku nič nemá, tak si vypýta ďalší a ty mu zase zadáš dva ( znak + enter )

Takže buď použi funkciu fflush(), alebo načítavaj dva znaky s tým, že ten jeden tam bude len na enter.
Alebo použi getchar()
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: C++ prečo 2 krát?!?

Príspevok od používateľa Mick_14 »

Ďakujem, paráda takéto vysvetlenie som potreboval ;-)

//autoeditácia príspevku (25 Máj 2012, 15:25)
tak som to zmenil na getchar ale nepomohlo to, robí to stále to isté.
ako sa používá tá funkcia fflush? píše sa to hneď za printf,scanf alebo kde? a zapisuje sa to takto? fflush(znak);

Kód: Vybrať všetko

#include<stdio.h>
main()
{
      char znak;

      while (znak!='X')
      {
            printf("Zadajte znak prosim\n");
            znak=getchar();
            if (znak=='X')
               printf("Goood!!! :D\n");
            else printf("Skus dalsi znak \n");
      }
      system("pause");
}
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ prečo 2 krát?!?

Príspevok od používateľa BX »

Aha, getchar nepomôže, moja chyba, sorry. getchar sa správa rovnako ako scanf.
Skús si spraviť tú pomocnú premennú na entery a pridaj tam jeden getchar(). Uvidíš, že už to pôjde. (Urobí to to isté, akoby si cez scanf očakával dva znaky)

Funkciu fflush v tomto prípade môžeš použiť takto: fflush(stdin); čo ti vyprázni stdin a teda štandardný vstup (standard input)


Ale ešte sa zastavím u toho mainu: Prečo nemá main žiadnu návratovú hodnotu? Main by mal mať VŽDY návratovú hodnotu a v C je to štandardne int.
A prečo nemá žiadne parametre? (nemusí ich mať, ale potom by mal mať v zátvorkách void )
Baseilos
Light Expert
Light Expert
Príspevky: 57
Registrovaný: 01 máj 2011, 2:15

Re: C++ prečo 2 krát?!?

Príspevok od používateľa Baseilos »

Ja odporucam na vyprazdneni bufferu tuto funkciu. Nakolko fflush pri suboroch ktore su otvorene na citanie (stdin) nema presne specifikovanu funkcnost vid http://www.cplusplus.com/reference/clib ... io/fflush/.

Kód: Vybrať všetko

void flushStream(FILE * stream) {
    if (stream == NULL)
        return;

    char c;
    while ((c = getc(stream)) != EOF && c != '\n')
        ;   
}
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: C++ prečo 2 krát?!?

Príspevok od používateľa Mick_14 »

Čaute, prepáčte že tak neskoro reagujem ale mal co dozvuky po maturách tak som bol preč :)
ano skúšal som tam dat aj 2x scanf alebo 2x getchar a funguje to parádne díky ;-)
fflush(stdin) funguje takisto :D takže fakt díky zase som o niečo múdrejší

BX napísal:Prečo nemá main žiadnu návratovú hodnotu? Main by mal mať VŽDY návratovú hodnotu a v C je to štandardne int.
A prečo nemá žiadne parametre? (nemusí ich mať, ale potom by mal mať v zátvorkách void )
tomuto celkom dobre nerozumiem :/

Baseilos napísal:Ja odporucam na vyprazdneni bufferu tuto funkciu.
a tej funkcii už vôbec nie.. môžeš to skusiť zakomponovat presne do toho môjho programu?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ prečo 2 krát?!?

Príspevok od používateľa BX »

Tú funkciu si skopíruješ pred main a vyvoláš ju tak, že miesto fflush(stdin) zavoláš flushStream(stdin);
A to s tým mainom, to sa dozvieš, keď si prečítaš nejakú knihu o C :)
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: C++ prečo 2 krát?!?

Príspevok od používateľa Mick_14 »

vďaka, tých kníh o programovaní je celkom dosť ak sa môžem spýtať na nejakú konkrétnejšiu, ktorú by si mi doporučil?

mohol by si mi ešte toto podrobnejšie vysvetliť?

Kód: Vybrať všetko

void flushStream(FILE * stream) {   --- prečo tam je to void? a čo znamená to FILE * stream? , aký význam tam má tá hviezdička?
    if (stream == NULL)
        return;

    char c;
    while ((c = getc(stream)) != EOF && c != '\n')
        ;   
}
prečo nefunguje napríklad toto? ak dám opak ---> znak!=NULL tak mi to funguje ale ked chcem aby to vypisovali ak zadám medzeru tak mi to nefunguje

Kód: Vybrať všetko

if (znak == NULL)
printf("Zadali ste medzeru");
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ prečo 2 krát?!?

Príspevok od používateľa BX »

P. Herout: Učebnice jazyka C
Odpovedať na tieto dotazy nebudem, takto osamote to nemá zmysel. Dozvieš sa to všetko v tej knihe, kde je to pekne polopate vysvetlené v kontexte :)
Viper
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 137
Registrovaný: 14 mar 2012, 13:19

Re: C++ prečo 2 krát?!?

Príspevok od používateľa Viper »

na pár veci ti odpoviem void je taký typ čo nič nevracia nikdy sa nadáva na koniec return napr.

Kód: Vybrať všetko

void hello()
{
    std::cout << "hello word";
}
ale keď máš napr. int

Kód: Vybrať všetko

int spocitaj(int prve, int druhe, int vysledok)
{
    vysledok = prve + druhe;
    retrun vysledok;
}

samozrejme ak tam máš napr. if tak sa pouťíva retrun; // vrátiš sa do main()
a * sa volá pointer(nie všetci to tak volajú ja hej) a pointer ukazuje na hodnotu viac tu
a ostatok normalne si prečítaj v knihe ako napísal Bx
Ak som sa neikde pomýlil opravte ma

A ešte ak nemáš židnu knihu z kade sa učíš z tutoriálov alebo len tak skúšaš kod a potom sa snažíš pochpiť?
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: C++ prečo 2 krát?!?

Príspevok od používateľa Mick_14 »

ok popozerám sa po tej knihe, to bude asi najlepšie kedže moja angličtina nie je ani zdaleka dokonalá :D
Akosi málo ľudí používa Dev-c++ ako ja ..mal by som to zmeniť? pretože všade vidím "cout <<" namiesto toho "printf"
ešte by som sa chcel spýtať, či sa dá živiť programovaním aj bez VŠ, teda na akej úrovni musím byť aby som sa s tým dokázal živiť, kedy si môžem povedať že ovládam ten jazyk? dá sa to zvládnuť samoštúdiom? :)

a učím sa z internetu ano z tutoriálov konkrétne z tohto

Kód: Vybrať všetko

http://www.smnd.sk/anino/moje/C.pdf
ale ešte som len na 23 strane ..nejaké základy mám zo školy z Pascalu :D
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ prečo 2 krát?!?

Príspevok od používateľa BX »

Za prvé: Dev-Cpp je na učenie dobré, po čase sám zistíš, že je staré a nemá to, čo potrebuješ, ale dovtedy ho určite môžeš používať.
Za druhé: cout je C++ stream, to ťa nemusí zaujímať. Ty sa učíš C, nemiešaj do toho C++.
Za tretie: To tvoje pdfko si schválne prečítam. Vyzerá, že sa snaží byť učebnicou Cčka pre deti a to sa mi nezdá. Cčko sa deti učiť nemajú. Som veľmi zvedavý, čo sa tam dočítam za hlúposti :) Ak sa chceš učiť C, tak minimálne Herout, nech je akokoľvek komplikovaný. To programovanie je.
Za štvrté: Ak sa učíš programovať kvôi vidine dobrého zárobku, mal by si skončiť skôr, než si ublížiš - a to je asi hneď teraz.

// Oprava, to pdf-ko vyzerá dosť pekne, ako ho tak listujem. Ten čo ho písal bol dosť frajer, neveril som, že existuje niečo podobné pre Cčko. A je to vraj pre nadané deti, tak prečo nie :)
Viper
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 137
Registrovaný: 14 mar 2012, 13:19

Re: C++ prečo 2 krát?!?

Príspevok od používateľa Viper »

on sa učí C? sorry to som nevedel topic je C++ tak som si myslel ze C++ :D
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ prečo 2 krát?!?

Príspevok od používateľa BX »

Aha, to som si ani neuvedomil :)
Tak to dáme ako po piate: Najprv si ujasni, čo sa učíš a ujasni si rozdiel medzi C a C++. Pdf-ko je o Cčku, tak sa ho drž.
xadman
Medium Star
Medium Star
Príspevky: 305
Registrovaný: 09 mar 2011, 17:02

Re: C++ prečo 2 krát?!?

Príspevok od používateľa xadman »

Presne podľa tejto istej knižky som sa učil aj ja. Pre začiatočníkov je to pekne vysvetlené + úlohy sú výborné.
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: C++ prečo 2 krát?!?

Príspevok od používateľa Mick_14 »

takto, hned pri začiatku je napísané toto
"1DevC++ si môžete stiahnuť z adresy http://downloads.zoznam.sk/download/devc57"
tak som si myslel že to je C++ alebo asi teda aj je ale tie moje "programy" na tých asi nič objektovo orientovaného nebude a dajú sa robiť aj v C aj C++ hento je presný odkaz na to v čom robím ja takže by to malo byť C++ nie?

a ešte jednu jeho príručku som našiel na tú sa plánujem pozrieť hneď ako skončím tú prvú ..robím to úplne presne po rade všetky programy som asi v tej polovici na 23 strane a nič som nepreskočil

Kód: Vybrať všetko

http://www.smnd.sk/anino/moje/C++.pdf
takže pokračujem v tom čo som robil len neviem čo ďalej, ked obi dve tie príručky prejdem :D neviem dobre po anglicky a na pochopenie je dôležité rozumieť všetkým slovám, preto sa radšej učím z tých slovenských/českých vecí, ale tých je v porovnaní s anglickými velmi málo .. ale asi potom kúpím tú knihu, teraz ma napadlo že či to bude mat potom ešte význam kupovať tú knihu (?) ked budem mat tieto 2 príručky celé naštudované :)
takže nakoniec si mi tú príručku schválil? :D tak to som rád ..sú tam dosť jednoduché veci, ale nejako začať musím ..mám také malé méty napr. spraviť si nejakú jednoduchú hru, samozrejme nie teraz s mojimi skúsenosťami, ale tak za rok, dva :) (piškovorky, snake a pod.)
BX napísal: Za štvrté: Ak sa učíš programovať kvôi vidine dobrého zárobku, mal by si skončiť skôr, než si ublížiš - a to je asi hneď teraz.
tak myslím že každého láka aj to, tak ako mňa ale nevidím sa v budúcnosti nejaký bill gates, skôr v nejakej malej firme, možno automobilke a tak, to neviem ešte uvidíme čo zo mna bude :) ...a samozrejme že ma to baví, ten výsledok každého odladeného programu ma poteší :) ...a som maniak do mobilných hier tak možno by som sa časom začal uberať aj týmto smerom
"mal by si skončiť skôr, než si ublížiš - a to je asi hneď teraz" --- :D tak lahko sa zas odradit nenechám, určite to skusím teraz mám prázdniny čas uvidím aký pokrok spravím a keby mi to naozaj liezlo na nervy tak potom s tým skončím

pdfko je o Cčku tak prečo tam je to Dev-c++ ?
ak máte čas pozrite sa aj na tú druhú príručku či to za niečo stojí ale písal to ten istý autor tak mala by

xadman: a učíš sa sám? z internetu? ..v čom si pokračoval ked si zvládol celú tú zbierku? :)
..a všetkým ďakujem samozrejme za rady ;-)
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ prečo 2 krát?!?

Príspevok od používateľa BX »

Citujem (vyzdvihujem) z knihy:
Dozviete  sa  iba  nevyhnutné  minimum, aby  ste  mohli   začať pracovať na  vlastných  projektoch
a vytvárať vlastné programy.
Táto   knižka   nie   je   ani  učebnicou   programovania.   Nedozviete   sa   v   nej,   ako   písať
programy tak, aby sa v nich dalo ľahko orientovať, ako navrhovať štruktúry dát ani iné veci, ktoré by
mal skúsený programátor vedieť.
Naučí  sa   ho   tak,   že   sa   bude   pokúšať  ten   jazyk   používať
a postupne   v  jeho  používaní získa  zručnosť.
Dev-C++ je vývojové prostredie. To ako sa volá nemá s jazykom nič spoločné (Teda v tomto prípade náhodou má)

Ja osobne by som ti veľmi odporučil nechať si C++ na inokedy. Prejdi si poriadne Cčko, keď skončíš túto "príručku", prečítaj si učebnicu od Herouta. Potom si urob trebárs aj nejakú hru (Že rok, dva? Určite to zvládneš už cez prázdniny ;) )
Na objekty zatiaľ zabudni. Nauč sa poriadne pracovať s funkciami, rekurziou, smerníkmi, dátovými štruktúrami atď.
Mick_14
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 458
Registrovaný: 07 aug 2008, 18:44

Re: C++ prečo 2 krát?!?

Príspevok od používateľa Mick_14 »

rok, dva som usúdil na základe toho, že v sekcií "Programátorský kútik: prejavte sa!" písal reDo že programuje 3 roky.
aký je rozdiel medzi týmito 2 knihami?!

Kód: Vybrať všetko

http://www.martinus.sk/?uItem=74741

Kód: Vybrať všetko

http://www.martinus.sk/?uItem=52686
Dobre, ďakujem, keby som ešte niečo potreboval tak sa tu spýtam :)
Napísať odpoveď