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

Od Petr Zemek, 2009-10-31

Konec října a začátek listopadu je sice obdobím polosemestrálních zkoušek, ale i přesto zkusím hodit do placu další hádanku. Za poslední tři hádanky byl průměr odpovědí čístá nula, takže i když se ani teď nikdo neozve, tak průměr neklesne. Je třeba myslet pozitivně :). Dneska se bude řešit korektní načítání čísel ze vstupu pomocí C++ proudů (streams).

Zadání

Vašim úkolem je zjistit, který z následujících způsobů je použitelným způsobem pro všech načítání čísel typu int oddělených bílými znaky ze standardního vstupu do seznamu. Neuvažujte přetečení. Použitelný znamená, že neobsahuje chybu, neskončí v nekonečném cyklu, přečte všechna čísla atd. U každého ze způsobů uveďte, zda je či není použitelný, a pokud není, tak důvod.

a)

list<int> l;
while (!cin.eof()) {
    int x;
    cin >> x;
    if (!cin.eof())
        l.push_back(x);
}

b)

list<int> l;
while (!cin.fail()) {
    int x;
    cin >> x;
    if (!cin.fail())
      l.push_back(x);
}

c)

list<int> l;
while (cin.good()) {
    int x;
    cin >> x;
    if (cin.good())
        l.push_back(x);
}

d)

list<int> l;
while (cin) {
    int x;
    cin >> x;
    if (cin)
        l.push_back(x);
}

e)

list<int> l;
int x;
while (cin >> x) {
        l.push_back(x);
}

f)

list<int> l;
copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(l));

Výše uvedené příklady jsou zapsány podle normy ISO C++98. U všech příkladů předpokládejte, že je dáno následující:

#include <iostream>
#include <iterator>
#include <algorithm>
#include <list>
using namespace std;

Řešení

Možnosti b, d, e a f jsou v pořádku. U možnosti a nastane problém v případě, kdy se na vstupu objeví něco jiného než číslo - dojde k zacyklení (testuje se pouze konec souboru). U možnosti c je problém, že se může stát, že se nenačte poslední číslo před koncem souboru (cin.good() vrací true pouze pokud jsou všechny stavové bity nulové, ale pokud se narazí na konec souboru, tak se nastaví eof bit).

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 + 2 =
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í.