Nieznana liczba testów

0

Już było to poruszane, wiem, ale nigdzie nie znalazłam odpowiedzi, która pozwoliłaby mi wysłać zadanie na spoja i mieć spokój ..
Nie wiem jak wpisywać zmienne kolejno w wierszach, a potem na nich działać w przypadku, gdy nie wiem ile ma być tych wierszy(/zmiennych).
Np.:

  • 8 5
    / 5 8
  • 2 7
    ect.
    W zależności od pierwszego znaku kolejne dwie liczby po nim mnożę, dzielę, czy dodaję.
    Jedyną opcją jest pętla
    while (cin>>znak>>liczba1>>liczba2)
    ale nie wiem jak to ma dokłądnie działać ..kończy się jak nie wpisuje, no ale coś muszę zrobić, aby kompilator wiedział ze juz nic nie wpiszę ..
    Mój program:
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    int tab[100];
    char znak;
    int liczba1,liczba2;
    int i=0;
    while (cin>>znak>>liczba1>>liczba2)
    {
        cin>>znak;
        cin>>liczba1;
        cin>>liczba2;
        int wynik=0;
        if(znak=='+')
        {
           wynik=liczba1+liczba2;
        }
        else if(znak=='-')
        {
            wynik=liczba1-liczba2;
        }
        else if(znak=='*')
        {
            wynik=liczba1*liczba2;
        }
        else if(znak=='/')
        {
            wynik=liczba1/liczba2;
        }
        else
        {
            wynik=liczba1%liczba2;
        }
        tab[i]=wynik;
        i++;
    }

    for(int i=0;i<100;i++)
    {
        cout<<tab[i];
    }
    getchar();
    return 0;
}
1

Wystarczy, że nic nie wypiszesz, wtedy kompilator będzie wiedział, że nic już nie wypiszesz.

Nie do końca rozumiem Twój problem - wypisuj dokładnie tyle razy ile otrzymałeś linii na wejściu. I nie wiem dlaczego zapisujesz wyniki do tablicy zamiast od razu wypisywać.

4
  1. kod piszemy po angielsku
  2. co jeżeli ktoś wprowadzi znak inny niż spodziewany przez ciebie, powinieneś obsłużyć taki przypadek a nie jak teraz wykonywać działanie %
  3. wynik jest typu int, a masz operację dzielenia, masz świadomość, że zwrócisz zaokrąglony wynik do liczby całkowitej?
  4. for(int i=0;i<100;i++) - zakładasz że będziesz miał tablicę 100 elementów, ca wyżej piszesz, że nie wiesz ile będziesz miał wierszy

A co do twojego problemu, to nie kończ programu, niech będzie w gotowości, ze użytkownik doda kolejną linię z działaniem a jak ma dość, to niech zamknie krzyżykiem i tyle. Ten warunek w while masz bez sensu. Zrób while (true) i program będzie działał do konca świata i o jeden dzień dłużej. Tylko wypisywanie wrzuć w pętlę i wywal tablicę.

0

@szarotka SPOJ ma to do siebie, że program ma wykonać swoje działanie (jak najszybciej) i zakończyć działanie bez żadnych dodatkowych interakcji z użytkownikiem, który w tym przypadku jest skryptem testującym

1

@kq Dobrze mówi. Tablica niepotrzebna, pamiętaj o tym, że piszesz w C++, staraj się używać std::vector, na SPOJu raczej nie powinien generować jakiegoś specjalnego obciążenia, natomiast przyda ci się na SPOJu funkcja sync_with_stdio, output z nią jest nieco szybszy.

0
#include <iostream>
#include <cstdio>
 
using namespace std;

int calculate(char ch, int a, int b)
{
     … … …
}

int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL); // optymalizacje IO

    char ch;
    int a, b;
    while (cin >> ch >> a >> b)
    {
        cout << calculate(ch, a, b) << '\n';
    }
    cout << flush;

    return 0;
}
0

Jak wpisujesz "z palca" (duży błąd moim zdaniem, bo przy bardziej skomplikowanym wejściu nie wiesz czy źle wpisałeś czy też program źle liczy) to informujesz program że już skończyłeś przez CTRL + Z pod Windowsem, lub CTRL + D jak masz Linuksa. Aczkolwiek osobiście wpisał bym to co ma wczytać do pliku, i potem uruchamiał program przez "tak jak teraz uruchamiasz" << nazwa_pliku_z_wejściem. Wtedy sygnał że już koniec sam się wyśle, a ty będziesz miał pełną powtarzalność danych wejściowych.

1

Wyjaśnienie.
konsola jest skojarzona ze standardowym wejściem wyjście jest dla systemy strumieniem danych - plikiem.
Konsola ma to do siebie, że jest interakcją z użytkownikiem i większość użytkowników nie wie, że można wpisać znak końca strumienia danych w konsoli.
Zależnie od systemu kombinacja klawiszy na to: Ctrl-D lub Ctrl-Z.
Zostało to tak zaprojektowane, by można było podłączać inne strumienie danych do standardowego wejścia/wyjścia.
Dlatego w linii poleceń działają operatory strumieniowe: >, >>, <, | i można je łączyć z plikami z innymi programami itp.

Na SPOJ standardowe wejście jest skojarzone z jakimś plikiem, a standardowe wyjście z plikiem lub ze standardowym wejściem innego programu sprawdzającym poprawność wyniku.

Dlatego też trzeba pamiętać, że próby swobodnego rysowania na ekranie tekstowym za pomocą standardowego wej/wyj, są nieco bezsensu i w takich przypadkach lepiej pomijając te pliki (strumienie) i znaleźć jakąś bibliotekę zapewniającą bezpośredni dostęp do konsoli (np ncurses, conio).

Offtopic: Kompilator nie ma tu nic do gadania.

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