[C++] Wczytywanie w. z rozpoznaniem czy wpisano 2 czy 3 licz

0

Jak napisać funkcje w C++ robiącą co innego, gdy w wierszu wpisano 2 liczby, a co innego, gdy wpisano 3 liczby? Chciałby, aby po wpisaniu na standardowe wejście np.

0.2 0.1
1.2 0.2
1 0 12.3

funkcja przeciążająca operator >> 2 pierwsze linijki zinterpretowała jako dodanie wierzchołków, a trzecią jako dodanie krawędzi.

Funkcja:

istream& operator>>(istream& i, Graph& rv)
{
    double d;
    do
    {
        double a, b, c;
        i >> a >> b >> c;
        if (c != 0 || c == 0)
        { puts("KRAWĘDŹ");
            rv.AddEdge(static_cast<unsigned int>(a), static_cast<unsigned int>(b), c);
        }
        else
        {puts("WIERZCHOŁEK");
            rv.AddVertex(a, b);
        }
        d = a;
    }
    while (d != 0 || d == 0);
}

nie działa prawidło, po wpisaniu 2 cyfr, wciśnieciu ENTER i wpisaniu 2 kolejnych cyfr próbuje dodać krawędź (wyświetla "KRAWĘDŹ"). Jak zrobić, aby funkcja po wpisaniu w wierszu 2 cyfr wykonywała rv.AddVertex(a, b), a po wpisaniu trzech rv.AddEdge(static_cast<unsigned int="int">(a), static_cast<unsigned int="int">(b), c)? Jeśli można tego zrobić w funkcji przeciążenia operatora >>, proszę o podanie sposobu w jaki to się robi.

0

Nie wiem jakie są na standardowe sposoby na rozwiązanie tego problemu ale mi do głowy przychodzi wykorzystanie funkcji składowej peek i manipulatora ws.

Bo gdy piszesz tak:

cin >> a >> b >> c;

to program będzie czekał aż wprowadzisz 3 wartość nawet gdy chcesz podać tylko 2. Więc lepiej chyba Od razu wczytać 2 wartości a potem zaglądać do strumienia i sprawdzać czy jest coś sensownego czy też nie. W zależności od tego czy znajdziemy podejmujemy akcje dla 2 bądź trzech zmiennych (oczywiście jeśli znajdujemy jakiś nie biały znak w strumieniu to go przed działaniem wczytujemy).

0

standardowo, to gdy chcesz miec dane grupowane per linia, to czytasz per linia i je pobierasz z odczytanej linii, obserwujac czy nie zaszly bledy, czy linia sie nie skonczyla itede - a nie ciagniesz na chama ciurkiem jak jeden nierozroznialny strumien takich samych liczb..

void pobierz_trojke(double & raz, double & dwa, double & trzy)
{
    string bufor;
    getline(cin, bufor);
    istringstream tmp(bufor);
    tmp >> raz >> dwa >> trzy;
    if(tmp.fail())
        throw runtime_error("Za malo danych, lub nieprawidlowy format liczb");
}

zamykanie tego wszystkiego w petli (tak jak autor watku probuje) tylko dlatego, ze i tu i tam sa 2 liczby w linijce do odczytania jest bezsensem i to jest sedno problemu. przeciazanie operatora>> nie ma tutaj nic do rzeczy. od wykorzystywania juz-napisanych kawalkow kodu sa funkcje i klasy, a nie petle plus tona dziwacznych warunkow przelaczajacych zachowanie.

w przypadku gdy masz 2 lub 3 liczby, mozesz sprawdzac linie np tak

string bufor;
getline(cin, bufor);
istringstream tmp(bufor);

double a, b;
tmp >> a >> b;
if(tmp.fail()) throw runtime_error("mialy byc przynajmniej 2 liczby");

double c;
tmp >> c;
if(tmp.fail())
    ; // oops, nie udalo sie, tylko A i B sa wczytane - zrob costam
else
    ; // super, byly 3 liczby, A i B i C sa wczytane - zrob cos innego

1 użytkowników online, w tym zalogowanych: 0, gości: 1