Nieokreślona liczba zestawów danych (while)

Odpowiedz Nowy wątek
2019-08-04 17:36

Rejestracja: 1 rok temu

Ostatnio: 1 miesiąc temu

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

Rejestracja: 3 lata temu

Ostatnio: 36 minut temu

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

edytowany 4x, ostatnio: stivens, 2019-08-04 19:29

Pozostało 580 znaków

2019-08-04 19:32

Rejestracja: 1 rok temu

Ostatnio: 3 miesiące temu

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

Rejestracja: 3 lata temu

Ostatnio: 36 minut temu

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

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

Rejestracja: 1 rok temu

Ostatnio: 1 minuta temu

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

Rejestracja: 12 lat temu

Ostatnio: 1 godzina temu

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

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