Nieokreślona liczba zestawów danych (while)

0

Cześć, robie sobie zadanie za spoja i w pewnym zadaniu jest takie oto zdanie "Na wejście programu podana zostanie pewna nieokreślona liczba zestawów danych. "
Link do całego zadania:](https://pl.spoj.com/problems/CALC/ms/CALC/
Mój kod:

#include <iostream>

using namespace std;

int main() {

    int a;
    int b;
    char znak;
    int wynik[50];
    int i=0;
    while(cin >> znak >> a >> b){
        switch (znak){
            case '+':
                wynik[i]=a+b;
                break;
            case '-':
                wynik[i]=a-b;
                break;
            case '*':
                wynik[i]=a*b;
                break;
            case '/':
                wynik[i]=a/b;
                break;
            case '%':
                wynik[i]=a%b;
                break;
            default:
                break;

        }
        i++;
    }
    for (int j = 0; j <i ; ++j) {
        cout << wynik[j] << endl;

    }

    return 0;
}

Spoj przyjął ten kod jako rozwiązanie, ale martwią mnie dwie rzeczy, pierwsza to taka że trochę z góry założyłem ile będzie max wyników (wynik[50), a drugi, główny powód dla którego piszę ten post to ta nieograniczona ilość zestawów danych, na pewnej stronie gdzie testowałem kod mogłem podać od razu cały input, a jak sprawdzam np. w CLionie i cały input podaję "ręcznie" to mogę podawać go w nieskończoność, chodzi mi o to czy jakoś mogę przerwać tą pętlę while i przestać podawać dane żeby mogła wykonać się pętla for

2
  1. Jak nie wiesz ile elementow bedzie w strukturze to stosujesz liste/vector(arrayliste)

  2. Jak chcesz w terminalu puscic EOF to wciskasz ^d w windowsie chyba ^c lub ^z

Edit: przeciez mozesz to robic ad hoc bez magazynowania danych
input -> instant output, input 2 -> output 2, ... dopoki sa jakies inputy

0

Do nieokreślonej ilości danych możesz użyć m.in. listy jednokierunkowej, lub klasy vector, a nawet tablicy dynamicznej, np. jeżeli zapełni Ci się określona ilość miejsca to usuwasz starą tablicę - robisz 2 razy większą (ale to fatalny pomysł w porównaniu do listy, czy do vectora).

A odpowiadając na drugie pytanie - aby przerwać tę pętlę while wystarczy podać jakąkolwiek wartość nienumeryczną dla int'a w tym przypadku, więc warunek while nie jest spełniony, wychodzisz z pętli. Np na wejściu podaje: + s a

1
knifer0 napisał(a):

A odpowiadając na drugie pytanie - aby przerwać tę pętlę while wystarczy podać jakąkolwiek wartość nienumeryczną dla int'a w tym przypadku, więc warunek while nie jest spełniony, wychodzisz z pętli. Np na wejściu podaje: + s a

Patologia. ^d sie wysyla.
I w dodatku nie zawsze taka patologie da sie zastosowac (ot wczytujesz do stringa to wtedy nawet '\n' przechodzi). Nie ucz tak ludzi

1

W tym konkretnie zadaniu i pewnie w olbrzymiej większości podobnych określenie
Na wejście programu podana zostanie pewna nieokreślona liczba zestawów danych
należy rozumieć tak:
Na wejście programu podamy więcej danych niż jesteś w stanie zapamiętać, niezależnie od tego ile masz RAM i jakich sztuczek użyjesz

W tym przypadku schemat postępowania powinien wyglądać mniej więcej tak
W pętli

  • wczytujesz jeden rekord (znak, a, b)
  • jeśli się udało - wykonujesz działanie i od razu wyświetlasz wynik
  • jeśli się nie udało wczytać (koniec pliku, błąd) - przerywasz pętlę i kończysz program
1
basted napisał(a):

Spoj przyjął ten kod jako rozwiązanie, ale martwią mnie dwie rzeczy, pierwsza to taka że trochę z góry założyłem ile będzie max wyników (wynik[50), a drugi, główny powód dla którego piszę ten post to ta nieograniczona ilość zestawów danych,

A skąd założenie, że potrzebujesz jakąkolwiek tablicę?
Po protu od razu wyświetlaj wynik po jego obliczaniu.

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