Jste zde

Zajímavé úlohy pro programátory v C a C++ #11

Tentokrát bude úloha/hádanka buď značně triviální, nebo obtížná, a to v závislosti na tom, zda prokouknete trik, který bude třeba využít ;).

Zadání

Definujte funkci/šablonu funkce f podle C++98, které když se předá argument typu int, tak jej vytiskne na standardní výstup, a když se zavolá bez argumentů, tak vytiskne pseudo-náhodné číslo pomocí standardní funkce rand(). Můžete použít libovolné funkce/šablony/makra ze standardní knihovny. Kromě příslušných #include a definice funkce/šablony funkce f nic nedefinujte. Definice musí být přenositelná a nesmí se spoléhat na nespecifikované či nedefinované chování.

Ukázka:

#include <iostream>
#include <cstdlib>
 
// Definice f
// ...
 
int main() {
    // Zde může být případné volání srand(), ale není to nutné
    // ...
 
    f();     // Vytiskne pseudo-náhodné číslo
    f(15);   // Vytiskne 15
    f();     // Vytiskne pseudo-náhodné číslo
    f(-456); // Vytiskne -456
}

"Vítězí" nejjednodušší řešení ;).

Řešení

Řešení je jednoduché:

void f(int n = std::rand()) {
    std::cout << n << std::endl;
}

Bylo třeba si uvědomit, že implicitní hodnota parametru může být i výsledek volání funkce (psal jsem o tom zde). Ondrova odpověď byla správná.

Komentáře

#include <iostream>
#include <cstdlib>
 
// Definice f
// ...
void f() {
	std::cout << rand() << std::endl;
}
 
void f(int param) {
	std::cout << param << std::endl;
}
 
int main() {
    // Zde může být případné volání srand(), ale není to nutné
    // ...
 
    f();     // Vytiskne pseudo-náhodné číslo
    f(15);   // Vytiskne 15
    f();     // Vytiskne pseudo-náhodné číslo
    f(-456); // Vytiskne -456
}

Ale asi jsem nepochopil zadání ...

$ g++ reseni.cc 
$ ./a.out 
1804289383
15
846930886
-456

Díky za odpověď. Cílem je to všechno nacpat do jediné funkce/šablony f (takhle to jsou dvě různé funkce f). Takže až tak jednoduché to nebude ;).

posilam diff k Liborovu reseni:

4,10c4
< // Definice f
< // ...
< void f() {
< 	std::cout << rand() << std::endl;
< }
<  
< void f(int param) {
---
> void f(int param = rand()) {

Díky za odpověď. Takto je to správně ;).

Přidat komentář