Naučit se SQL Naučit se SQL
Pouze tento týden až 80% sleva na SQL jazyky
Zamiluj si programování! Až 80 % bodů na prémiový obsah zdarma. Více informací
Avatar
David Hozík
Člen
Avatar
David Hozík:16.7.2018 22:11

Ahoj,
s C++ začínám a bojuju s funkcema. Konkrétně - mám funkci, kde proběhne náhodný výpočet a podle toho, co padne, měla by funkce vrátit určitou hodnotu. Podle hodnoty se pak program štěpí dále. To se asi daří, ale zároveň vzniká bug, kdy je věta (obsazena ve funkci), která má být napsána jednou, napsána několikrát. Kde může být prosím chyba?

Tady je část kódu:

Zkusil jsem: int nahodna_akce(int nahoda) //daná funkce
{
srand(time(NULL));
int vysledek = (rand() % 101);
if ((vysledek >= 0) && (vysledek <= 49))
{
nahoda = 0;
cout << "Veta prvni" << endl;
return 0;
}
else if ((vysledek >= 51) && (vysledek <= 60))
{
nahoda = 1;
cout << "Veta druha" << endl; // dodelat boj
return 1;
}
else if ((vysledek >= 61) && (vysledek <= 100))
{
nahoda = 2;
cout << "Veta treti" << endl;
return 2;
}

}

int main()
{
int nahoda = 1;
.
.
.
nahodna_akce(na­hoda); //vyvolání funkce
if (nahodna_akce(na­hoda) == 1)
{
cout << "Nahoda = 1" << endl;
}
else if (nahodna_akce(na­hoda) == 2)
{
cout << "Nahoda = 2" << endl;
}
else if (nahodna_akce(na­hoda) == 0)
{
cout << "Nahoda = 0" << endl;
}

}

 
Odpovědět 16.7.2018 22:11
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na David Hozík
Jindřich Máca:16.7.2018 23:11

Ahoj, v první řadě bych Tě poprosil příště použít náležité formátování kódu, protože tohle se nikomu číst nechce. Pro tentokrát to udělám za Tebe:

#include <iostream>

using namespace std;

int nahodna_akce(int nahoda) //daná funkce
{
    srand(time(NULL));
    int vysledek = (rand() % 101);
    if ((vysledek >= 0) && (vysledek <= 49)) {
        nahoda = 0;
        cout << "Veta prvni" << endl;
        return 0;
    } else if ((vysledek >= 51) && (vysledek <= 60)) {
        nahoda = 1;
        cout << "Veta druha" << endl; // dodelat boj
        return 1;
    } else if ((vysledek >= 61) && (vysledek <= 100)) {
        nahoda = 2;
        cout << "Veta treti" << endl;
        return 2;
    }
}

int main() {
    int nahoda = 1;
    nahodna_akce(nahoda); //vyvolání funkce
    if (nahodna_akce(nahoda) == 1) {
        cout << "Nahoda = 1" << endl;
    } else if (nahodna_akce(nahoda) == 2) {
        cout << "Nahoda = 2" << endl;
    } else if (nahodna_akce(nahoda) == 0) {
        cout << "Nahoda = 0" << endl;
    }
}

A teď k tomu bugu. "Problém" je v tom, že funkci nahodna_akce() voláš potenciálně uvnitř funkce main() hned několikrát. Jak jistě víš, takové volání funkce způsobí, že celý její kód, v Tvém případě včetně výpisu dané věty, se pokaždé vykoná znovu. :-`

Více o problematice funkcí v C++ si můžeš přečíst třeba v místním seriálu - https://www.itnetwork.cz/…ce-cplusplus ;)

 
Nahoru Odpovědět  +4 16.7.2018 23:11
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na David Hozík
Jindřich Máca:17.7.2018 11:37

Včera večer už se mi nechtělo, ale tady je ještě opravený kód, aby to bylo snad úplně jasné. :)

#include <iostream>
#include <cstdlib>

using namespace std;

int nahodna_akce() // Definice funkce.
{
    srand(time(NULL));
    int vysledek = (rand() % 101);
    if ((vysledek >= 0) && (vysledek <= 50)) {
        cout << "Veta prvni" << endl;
        return 0;
    } else if ((vysledek >= 51) && (vysledek <= 60)) {
        cout << "Veta druha" << endl;
        return 1;
    } else if ((vysledek >= 61) && (vysledek <= 100)) {
        cout << "Veta treti" << endl;
        return 2;
    }
}

int main() {
    int nahoda = nahodna_akce(); // Vyvolání funkce s navrácením výsledku.
    if (nahoda == 0) {
        cout << "Nahoda = 0" << endl;
    } else if (nahoda == 1) {
        cout << "Nahoda = 1" << endl;
    } else if (nahoda == 2) {
        cout << "Nahoda = 2" << endl;
    }
    return 0;
}

P.S.: Je to psané pro stařičké C++98. :D

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 17.7.2018 11:37
Avatar
David Hozík
Člen
Avatar
David Hozík:17.7.2018 22:30

Děkuju mnohokrát a příště se polepším s tím formátováním kódu.

 
Nahoru Odpovědět  +1 17.7.2018 22:30
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 4 zpráv z 4.