IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - 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
Tvůrce
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
16.7.2018 23:11
Avatar
Jindřich Máca
Tvůrce
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í
+2,50 Kč
Ř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
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.