Nieokreślona liczba zestawów danych (while)

Odpowiedz Nowy wątek
2019-08-04 17:36
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:](http://)https://pl.spoj.com/problems/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

edytowany 2x, ostatnio: basted, 2019-08-04 17:37

Pozostało 580 znaków

2019-08-04 19:22
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


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110
edytowany 4x, ostatnio: stivens, 2019-08-04 19:29

Pozostało 580 znaków

2019-08-04 19:32
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

edytowany 1x, ostatnio: knifer0, 2019-08-04 19:33

Pozostało 580 znaków

2019-08-04 19:46
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


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110
edytowany 2x, ostatnio: stivens, 2019-08-04 19:48
Da się, wystarczy dobrze posprzątać wcześniej bufor wejściowy. Ale skoro ^d się powinno wysyłać zapamiętam i sam zacznę stosować ;) - knifer0 2019-08-04 19:53
Da sie? Ale przeciez "\n" to pelnoprawny string? - stivens 2019-08-04 19:58
PS tak jak mowilem jesli korzystasz z windowsa to w miejscu D pojawia sie C lub Z (nie pamietam) - stivens 2019-08-04 19:58
Zrozumiałem, że chodzi o wczytanie stringa po incie i czyszczeniu bufora przed. Wczytując tylko do stringa wiadomo, że bez EOF, lub odpowiedniego warunku z takiej pętli nie wyjdziemy. Ctrl+Z na Windowsie, przynajmniej tak zawsze stosowałem - knifer0 2019-08-04 20:23

Pozostało 580 znaków

2019-08-07 17:55
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

Pozostało 580 znaków

2019-08-07 18:32
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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