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

Od Petr Zemek, 2010-08-09

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á.

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
3 + 8 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.

Libor (neověřeno)

13 years 5 months zpět

#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

Petr Zemek

13 years 5 months zpět

In reply to by Libor (neověřeno)

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()) {