Halloweenská akce! Na stránce s dobitím bodů zadej dole kód STRASIDELNYCH20 a získej porci +20% bodů zdarma!
Akce končí 31.10. o půlnoci.

Diskuze: funkce

C a C++ C a C++ funkce American English version English version

Aktivity (1)
Avatar
David Hozík
Člen
Avatar
David Hozík:16. července 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. července 22:11
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na David Hozík
Jindřich Máca:16. července 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. července 23:11
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na David Hozík
Jindřich Máca:17. července 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. července 11:37
Avatar
David Hozík
Člen
Avatar
David Hozík:17. července 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. července 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.