chybna vystup v c++

Programovacie jazyky, rady, poradňa...
solskier
Amateur
Amateur
Príspevky: 18
Registrovaný: 09 feb 2012, 21:59

chybna vystup v c++

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

Dobry den snazil som sa vytvorit program ktory po nesplneni podmienky zopakuje funkciu main ale namiesto toho mi dookola vypisuje main ale tak ze nemozem nic napisat nieco na sposob while. Neviete i niekto poradit co s tym moze byt ? pri skompilovani vo windowse to robi takuto chybu ale ked to spustim v Linuxxe cez wine tak to ide normalne a ked to znovu skompilujem v Linuxe aj tak to spravi tu istu chybu. Este par malych problemov ved v kode su popisane.

Kód: Vybrať všetko

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string>


void program();
void sleepp();
inline void heslo();
void hesslo();
using namespace std;

int main()
{



int odpoved;


{
cout << "\nProgram ma 3 krat zapipat.Pre vstup do programu zadajte heslo (1) alebo pockajte 10 sekund(2):";
cout << "\nHeslo je: Astorko";
cout << "\nvyberte moznost:";
}
cin >> odpoved;

switch (odpoved)
{
case 0: main();
break;
case 1: heslo();
break;
case 2: sleepp();
break;
default : main();                        // tu sa to donekonecna opakuje
break;
}
{
char prikaz[7];
cout << "\n Ak chcete program zopakovat napiste repete \nak chcete program ukoncit napiste exit\nodpoved:";
cin >> prikaz[7];


cout << "";
cin.getline (prikaz,7);
if ( !strcmp ( prikaz, "repete"))
main();                                 // tu sa funkcia ani nevyvola
else
if ( !strcmp ( prikaz, "exit"))
return 0;                              // tu sa program nechce ukoncit
}
    return 0;
}

void program()
{ {cout << " ste v programe\n\a";
  sleep (1);
  cout << "\n\a";
  sleep (1);
  cout << "\n\a";}


}

void sleepp()
{
cout << "Pockajte 10 sekund\n";
     sleep (10);
program();
}

void hesslo()
{
     char heslo[50];

cout << "";
cin.getline (heslo,50);
if ( !strcmp ( heslo, "Astorko"))
program();
else
main();                                                    // tu to funguje normalne
}

void heslo()
{
    char heslo[50];

cout << "\nzadajte heslo: ";
cin.getline (heslo,50);
if ( !strcmp ( heslo, "Astorko"))
program();
else
hesslo();
}
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: chybna vystup v c++

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

Rekurzívne volať main?! Ako ťa toto napadlo?! :cry:
solskier
Amateur
Amateur
Príspevky: 18
Registrovaný: 09 feb 2012, 21:59

Re: chybna vystup v c++

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

BX napísal:Rekurzívne volať main?! Ako ťa toto napadlo?! :cry:

mas lepsi napad ? Pouc ma. Myslel som ze sa da volat ako ktorakolvek ina funkcia.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: chybna vystup v c++

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

Tak v prvom rade by si mal kód odsadzovať, nech sa v tom vyzná aj niekto iný, ako ty (To je veľmi dôležité, keď s tým ideš na fórum po pomoc)

A za druhé: Áno dá. Ale narozdiel od "ktorejkoľvek inej funkcie", toto volanie nespravuješ ty, ale systém (príp. ovplyvňuješ argumentami programu, ale to nerieš...) A pri jej rekurzívnom volaní to vie urobiť poriadnu galibu...
Takže v prvom rade sa zbav toho volania mainu - a to tak, že tam pekne použiješ cykly a procedúry (tak ako to aj robíš, len ich sprav možno viac. A môžeš používať aj odkazy, alebo ukazatele)
Cykly poznáme tri, jeden si už vyber. Tiež poznáme magické slovká continue a break. Tie ti určite budú nápomocné.

Na prvý pohľad mi príde, že aj prúdy sú tam dosť chaoticky použité. Skús napísať o čo presne sa pokúšaš, alebo to viac okomentovať (nech to nemusím lúštiť z kódu) a nejak už to napravíme.
solskier
Amateur
Amateur
Príspevky: 18
Registrovaný: 09 feb 2012, 21:59

Re: chybna vystup v c++

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

BX napísal:Tak v prvom rade by si mal kód odsadzovať, nech sa v tom vyzná aj niekto iný, ako ty (To je veľmi dôležité, keď s tým ideš na fórum po pomoc)

A za druhé: Áno dá. Ale narozdiel od "ktorejkoľvek inej funkcie", toto volanie nespravuješ ty, ale systém (príp. ovplyvňuješ argumentami programu, ale to nerieš...) A pri jej rekurzívnom volaní to vie urobiť poriadnu galibu...
Takže v prvom rade sa zbav toho volania mainu - a to tak, že tam pekne použiješ cykly a procedúry (tak ako to aj robíš, len ich sprav možno viac. A môžeš používať aj odkazy, alebo ukazatele)
Cykly poznáme tri, jeden si už vyber. Tiež poznáme magické slovká continue a break. Tie ti určite budú nápomocné.

Na prvý pohľad mi príde, že aj prúdy sú tam dosť chaoticky použité. Skús napísať o čo presne sa pokúšaš, alebo to viac okomentovať (nech to nemusím lúštiť z kódu) a nejak už to napravíme.

Vies si predstavit ako do toho mam narvat do while pritom pouzit switch ako to je povodne na zaciatku ?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: chybna vystup v c++

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

No, keďže mám zlú náladu, pozrel som sa ti na to a dospel som k tomuto: (funkcií som sa nedotýkal)

Kód: Vybrať všetko

int main()
{
    int odpoved;

    while(true) // nekonecny cyklus
    {
        cout << "\nProgram ma 3 krat zapipat.Pre vstup do programu zadajte heslo (1) alebo pockajte 10 sekund(2):";
        cout << "\nHeslo je: Astorko";
        cout << "\nvyberte moznost:";
        cin >> odpoved;

        switch (odpoved)
        {
            case 0: continue; // choď v cykle odznovu

            case 1: heslo();
                        break;
            case 2: sleepp();
                        break;
            default : continue; // choď v cykle odznovu
        }

        char prikaz[7];
        cout << "\n Ak chcete program zopakovat napiste repete \nak chcete program ukoncit napiste exit\nodpoved:";
        cin.getline (prikaz,7);
        if ( strcmp (prikaz, "exit") == 0 ) break; // skonci cyklus
        // Tu je zbytocne testovat aj repete. Ak sa nesplni ani jedna podmienka, cyklus sa aj tak zopakuje
    }

    return 0;
}
A ešte dávam do pozornosti toto: http://www.cplusplus.com/reference/clib ... ng/strcmp/
Hlavne odstavec "Return Value"

A pozri si, čo je to rekurzia, nech vieš, akú hlúposť si robil.
solskier
Amateur
Amateur
Príspevky: 18
Registrovaný: 09 feb 2012, 21:59

Re: chybna vystup v c++

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

odkaz som si zatial nepozrel ale dosiel som ku overovaniu prikazu exit aby break spustil return 0 sa namiesto toho zopakoval cely cyklus odznova

Kód: Vybrať všetko

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string>


void program();
void sleepp();
inline void heslo();
void hesslo();
using namespace std;

int main()
{



int odpoved;                                                                                                        

while (true)
{
cout << "\nProgram ma 3 krat zapipat.Pre vstup do programu zadajte heslo (1) alebo pockajte 10 sekund(2):";
cout << "\nHeslo je: Astorko";
cout << "\nvyberte moznost:";

cin >> odpoved;

switch (odpoved)
{
case 0: continue;
break;
case 1: heslo();
break;
case 2: sleepp();
break;
default : continue;                        
break;
}
{
char prikaz[7];
cout << "\nAk chcete program ukoncit napiste exit:";
cin >> prikaz[7];


cout << "";
cin.getline (prikaz,7);
if ( !strcmp ( prikaz, "exit"))
break;                              
}
    return 0;
} a tak dalej
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: chybna vystup v c++

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

Ešte raz a poriadne si pozri môj kód a všimni si, čo som od tiaľ vyhodil.

1.) Na čo dávaš kód zbytočne do blokov? Zbytočne tým programu komplikuješ život,
2.) Na čo načítavaš "prikaz" dva krát? (Raz cez cin a potom cez getline()).

A strcmp radšej pekne porovnávaj s nulou. Takto je to zbytočne komplikované.
Nehovoriac o tom, že miešaš C a C++, ale o tom asi nemá zmysel písať.
solskier
Amateur
Amateur
Príspevky: 18
Registrovaný: 09 feb 2012, 21:59

Re: chybna vystup v c++

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

BX napísal:Ešte raz a poriadne si pozri môj kód a všimni si, čo som od tiaľ vyhodil.

1.) Na čo dávaš kód zbytočne do blokov? Zbytočne tým programu komplikuješ život,
2.) Na čo načítavaš "prikaz" dva krát? (Raz cez cin a potom cez getline()).

A strcmp radšej pekne porovnávaj s nulou. Takto je to zbytočne komplikované.
Nehovoriac o tom, že miešaš C a C++, ale o tom asi nemá zmysel písať.
Spytam sa ta jedna vec preco si myslis ze miesam c a c++ to by ma zaujimalo viem ze ti to pride smiesne ale ucim sa z knihy c++ za 21 dni pre poriadok uz 3 mesiace. A druha vec ked mi program da na vyber medzi zadanim hesla a medzi 10 sekundovou pauzou (prvy vstup do programu) tak ked zadam cokolvek ine tak sa mi donekonecna opakuje cely cyklus reaguje to podobne ako pri tom rekurzivnom volani funkcie main.
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: chybna vystup v c++

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

No a podme zistit preco miesas C a C++.

1. Tie includes, spravne by si v C++ mal mat len iostream, string, ziadne stdio.h ktore patri do C.
2. Ked uz si si includol ten C++ string, tak by si ho aj mohol pouzivat. Cize namiesto char prikaz[7] zadefinuj string prikaz
3. Ked uz pouzivame stringy tak nie cin.getline ale getline(cin, prikaz)
4. strcmp patri do C, v C++ pouzi prikaz.compare() metodu
5. Nastav si TAB na 4 spaces a pozivaj ho, inak tvoj kod ani necitam, len co som ho zbezne pozrel kde miesas C, C++ a bohvie co este
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: chybna vystup v c++

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

1.) - vysvetlené :P

2.) To, čo sa stane defaultne definuješ, celkom prekvapivo, za slovkom default v tom switchi. Teraz tam máš continue - dal som to tam, aby sa to chovalo rovnako ako tvoja divná verzia s main(). Zmeň si to tam na čokoľvek iné (napr. break, alebo return, alebo ja neviem...)

3.) Úprimne ti môžem povedať, že kniha Naučte sa C++ za 21 dní je na hovno a nikdy nikomu by som ju neodporúčal :) Skús sa radšej pozrieť po Mistrovství v C++. Ešte pred tým by si si mal ale prečítať knihu pána Herouta o jazyku C, pretože ti chýbajú aj najzákladnejšie základy.
Biohazard66
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 63
Registrovaný: 08 nov 2011, 19:16

Re: chybna vystup v c++

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

BX napísal:1.) - vysvetlené :P

2.) To, čo sa stane defaultne definuješ, celkom prekvapivo, za slovkom default v tom switchi. Teraz tam máš continue - dal som to tam, aby sa to chovalo rovnako ako tvoja divná verzia s main(). Zmeň si to tam na čokoľvek iné (napr. break, alebo return, alebo ja neviem...)

3.) Úprimne ti môžem povedať, že kniha Naučte sa C++ za 21 dní je na hovno a nikdy nikomu by som ju neodporúčal :) Skús sa radšej pozrieť po Mistrovství v C++. Ešte pred tým by si si mal ale prečítať knihu pána Herouta o jazyku C, pretože ti chýbajú aj najzákladnejšie základy.
Ja by som povedal Mistrovství by nemal čítať ako prvé. Lepšie je aj keď nedočíta to za 21 dní nemusel by chápat hned Mistrovství na Mistrovství by si mal mat aspon trochu základ. Ale inac so všetkým suhlasim ale ako ta tam preboha napadlo dat Main()
Ale uz aspoň chápem preco môže byt nevýhodou keď si predtým čítal C
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: chybna vystup v c++

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

V simol som si ako sa tu rozplivate nad rekurzivnym mainom, nehovorim ze je to zdrave v proceduralnych jazykoch, ale na druhej strane to ci to bude robit spominane blbosti zavisi od kompilatora.
Pre gcc a kompilatory od IBM je main iba obycajna funkcia a je ju z uplne cistym svedomim volat rekurzivne.
A v niektorych jazykoch je to dokonca nutnost.
Napísať odpoveď