21 / 50
Feb 2016

include

using namespace std;

int main()
{
for(int i=1;i<100;i++)
{
int32_t a,b,x=0;
string wybor;
cin>>wybor;
cin>>a>>b;

if (wybor=="+")
{
    x=a+b;
}
if (wybor=="-")
{
    x=a-b;
}
if (wybor=="*")
{
    x=a*b;
}
if (wybor=="/")
{
    x=a/b;
}
if (wybor=="%")
{
    x=a%b;
}

cout<<x<<endl;

}

return 0;

}

Co jest nie tak w tym kodzie?

  • created

    Jan '16
  • last reply

    19d
  • 49

    replies

  • 4.3k

    views

  • 22

    users

  • 3

    likes

  • 12

    links

Frequent Posters

There are 49 replies with an estimated read time of 4 minutes.

Po pierwsze - fatalne formatowanie kodu. Ledwo co tutaj widać. Dodatkowo jak sądzę źle wklejony - include wygląda podejrzanie...

Po drugie - pierwsze zdanie specyfikacji wejścia. Ilość danych na wejściu nie jest znana a Ty zakładasz, że testów jest 99.

Pomyśl nad czymś w rodzaju while (cin>>wybor>>a>>b).

Na przyszłość: zmienna x jest niepotrzebna. Zamiast if, if, if, ..., if - lepiej używać if, else if, else if, ... else if, else. A w tym przypadku o wiele lepiej użyć switch. String można zastąpić zmienną char

Kod wkleja się w tagach dostępnych pod ctrl +k lub też linkuje do ideone bo inaczej bywa pocięty.

Niemniej jednak twój był czytelny na tyle, że zauważyłem iż ustaliłeś liczbę testów "na szytwno" na 100, co jest błędem, masz wczytywać "do końca pliku". Zamiast fora daj while (cin >> wybor), i usuń wczytywanie wyboru z wnętrza pętli. Potem usuń kod z forum bo ci to zaliczy.

ps jak byś testował wpisując działania "z palca", to koniec danych przy takim sposobie wczytywania "emulujesz" przez ctrl + d w Linuksie i chyba ctrl + z w Windows.

Zrobiłem tak jak mówiłeś i jest przekroczony limit czasu, zresztą jak w większości zadań które robię, w konsoli wszystko idzie dobrze a jak daje do sprawdzenia do przekroczenie limitu czasowego

Jesteś pewien że nie pominąłeś czegoś np usunięcia cin >> wybór z wnętrza pętli? bo ja twoim kodem po opisanej przeze mnie zmianie dostałem AC. Jak nic nie wypatrzysz, to usuń ten kod co już jest, i daj jeszcze raz aktualny.

ps na przyszłość dopisuj się do istniejących wątków.

Dobra udało się zrobiłem switchem i ogólnie wszystko zmieniłem i już działa dzięki za pomoc smiley tak btw jak się usuwa wątki bo nie mogę znaleźć ;(

Nie ma usuwania. Edytuj kod, zastępując go napisem "AC"

19 days later

Sędzie pokazuje błąd, ale ja jako początkujący go nie widzę. Może ktoś dać jakąś wskazówkę? smiley

W zadaniu masz, że zostanie podana nieokreślona liczba zestawów danych.
Użyj while(cin>>a>>b>>c)

W odpowiedzi na zestaw z zadania twój program daje 16-43021, przydało by się wyświelać odpowiedzi w osobnych liniach jak to w przykładzie jest. Jak już ci zaliczy nie zapomnij usunąć kodów, a zaliczy jak dodasz ten podział.

ps żeby uniknąć takich błędów w przyszłości, zmień sposób testowania np korzystaj z ideone.com. Tam możesz od razu wkleić całe wejście, więc taki błąd będzie od razu widoczny w wyjściu.

U mnie widzę poprawne wyniki, nie wiem dlaczego nie może tego uznać, trudno, omijam to zadanie, dzięki za próbę pomocy smiley

Zamiast while (i<100) daj while (cin >> a >> b >> c) i będzie dobrze. Swoją drogą jest tu więcej zadań w których będziesz wczytywał w taki sposób, więc nie rezygnuj łatwo. I usuń kod z forum jak już ci zaliczy.

Zrobiłem jak radzisz na samym początki i nie zaliczyło, teraz również nie zaliczyło, więc no sam nie wiem.

Wcześniejszy kod był nie do końca dobry, dla danych wejściowych, tj
Wejście:
+ 7 9
- 0 4
* 5 6
/ 8 3
% 5 2

Wyjście wyglądało tak:16-43021

Zamiast:
16
-4
30
2
1

Jak widać w tym fragmencie wczytujesz 2x, usuń 2 cin-a i ci zaliczy. Swoją drogą ta else return 0; linia jest zbędna, przy tej konstrukcji while "będzie wiedział" kiedy przestać. W przypadku gdybyś testował wczytując z palca (nie polecam) to kończysz przez ctrl + d pod Linuksem lub też ctrl + z pod Windows.

booooże frowning dziękuje bardzo bo naprawdę sprawdzałem ten kod z kilkanaście razy i nie zauważyłem tego, dopiero raczkuję

Hej, mam pytanie z innej beczki....
Chodzi mi optymalizację kodu kalkulatora (piszę w C++). Rozwiązałam zadanie w ten sposób: http://wklej.to/JPnq129 , wyniki są poprawne ale niestety spoj nie chce uznać rozwiązania, bo przekracza limit czasu.
Czy ktoś ma pomysł/radę jak mądrze zoptymalizować mój kod?

Nie wiem czy to będzie wystarczająco mądrze? wink Ja w każdym razie [w tym przypadkowym razie] zoptymalizowałbym w ten sposób, że znacznie, ale to znacznie skróciłbym czas na oczekiwanie danych, których już więcej nie ma i już nie będzie - skończył się wraz z końcem plik z danymi [eof].

Jak?

Np tak:
while (cin >> wybor) { // jeżeli udało się jeszcze coś wczytać to idę do pętli, jeżeli już nic nie ma to nie [wchodzę]

zamiast:
for ( ; ; ) // czekanie w nieskończoność w pętli, aż do tle [przekroczenia limitu czasu]

dzięki za wskazówkę! Właśnie nieskończona pętla for była tu problemem. Rozwiązanie problemu okazało się banalne....należało zawęzić pętlę for do 100 operacji.... grin

Na wejście programu podana zostanie pewna nieokreślona liczba zestawów danych.

A więc nie sto.
W twoim programie zmienłbym:
1. nazwy x, y na a, b
2. wyrzucił drukowanie wyniku poza pętlę switch
3. w case ...: wynik = a + b; itd
4 lub nawet a += b; //a -= b itd. a jest zarówno daną do obliczeń jak i wynikiem
5 wczytywać [nieokreśloną liczbę danych] można też tak: while (cin >> wybor >> a >> b){
....
PS
6. gdy zrezygnujesz z getchar() blioteka stdio jest zbędna

Dzięki za 6 wskazówek, kod jest dużo prostszy smiley
W zadaniu w specyfikacji wejścia jest jeszcze taka wypowiedź: "[...] Liczba testów nie przekracza 100, wynik zawiera się w typie int32". Z tego powodu zawęziłam for do 100 operacji. Nawet jeśli poprawnie zinterpretowałam to zdanie, no to wiem...kod nie jest uniwersalny, więc zmieniam na while(cin >> wybor >> a >> b) smiley

16 days later

Hej! Mam problem z zadaniem kalkulator...

Sędzia nie chce przyjąć mojego kodu, pomimo, że dane wyjściowe są
poprawne. Móglby ktoś powiedzieć mi co jest nie tak w tym kodzie?

https://ideone.com/g2cisC110

Twój kod nie działa dla przykładowego wejścia: https://ideone.com/qO7M4s67. Zwróć uwagę, że w zadaniu nie jest podana liczba danych wejściowych - musisz wczytać ich nieznaną ilość. Odszukaj na tym albo starym (raczej starym) forum poradnik dotyczący wczytywania nieokreślonej liczby testów a po AC usuń kod.

Masz return 0; w while a nie za nim. Jak to poprawisz masz AC wink Usuń potem link do kodu

5 months later

mam problem ze zakonczenie tego programu - by przetestowac jego dzialanie wprowadzam dane recznie ale zakonczenie na moim kompilatorze nie dziala z "ctrl + z w Windows" ani innym skrotem - natomiast spoj mi akceptuje "koncu" go

1 month later

Masz problem? - najpierw czytaj potem pytaj - tu już padała kilkakrotnie podpowiedź.

PS

A jednak. Takich nie dałeś:
https://ideone.com/D8ztq171

17 days later

https://ideone.com/LWAwjo41

cześć wszystkim, próbowałem już zmienić wszystko, co było opisane w powyższych postach, ale wciąż wyskakuje mi błąd mimo, że przeprowadzam najróżniejsze testy i wszystko działa... Ktoś pomoże?

Nie bardzo rozumiem, jaki masz problem - masz informację o błędzie kompilacji, a nie o złym wyniku

więc może po prostu przeczytaj informację o jaki błąd chodzi (kliknij na bład kompilacji), i to popraw

4 months later

Trochę odkopuje ale nie działa mi kod: według mnie wszystko oki

include

using namespace std;

int main()
{
int32_t a,b;

char znak;
int ile;
int i=0;
cin>>ile;

while(i<ile)
{
cin>>znak>>a>>b;
i++;
switch (znak)
{
case '+':
cout<<a+b<<endl;
break;
case '-':
cout<<a-b<<endl;
break;
case '*':
cout<<a*b<<endl;
break;
case '/':
cout<<a/b<<endl;
break;
case '%':
cout<<a%b<<endl;
break;

}
}
}

"Na wejście programu podana zostanie pewna nieokreślona liczba zestawów danych. "
Nie możesz deklarować ile ma być zestawów, program ma czytać zestawy dopóki uzytkownik go nie zakończy. Poczytaj trochę na temat, jak zdefiniować "nieokreśloną liczbę powtórzeń", w google wszystko jest :wink:

3 months later

Mój kod natomiast nie działa dobrze w samym zarodku - nie wykonuje poprawnie pętli, tj nie wraca z powrotem na podawanie zmiennej tylko od razu wyrzuca wynik i zakańcza jego pracę:

http://ideone.com/cVzMRU18

tekst programu należy przekazywać jako link do ideone.com6 - nie giną fragmenty kodu ani wcięcia, tam też warto przetestować program dla danych przykładowych w zadaniu i jeszcze kilku

a jeżeli pętla wykonuje się tylko raz a nie założoną liczbę razy to może wypada najpierw przyjrzeć się kodowi programu (w okolicach tej pętli) przed pisaniem na forum

warto też przeczytać wątek poświęcony zadaniu - można zaoszczędzić sporo czasu (twojego i odpowiadającego) nie zadając pytań które już były - ja zresztą nie mam zwyczaju odpowiadać na takie powtórzenia

program nie będzie działał poprawnie - w treści zadania nic nie ma o tym, że tych linii jest dokładnie 99 - w tym wątku już jest gdzieś tłumaczone, jak sobie radzić, gdy liczba danych jest nieokreślona

20 days later

Porównaj, potestuj 2 poniższe wersje i zastanów się gdzie tkwi błąd. Kodowanie wymaga [niestety] dokładności i dbałości o szczegóły i szczególiki.:

// 1 - twoja wersja
for (int i = 1; i <= 99; i++);
{
    cout << i << endl;
}

//  2 wersja
for (int i = 1; i <= 99; i++)
{
    cout << i << endl;
}

PS
Ale to jest tylko taki zarodek bez znaczenia dla uzyskania AC - w twoim kodzie są inne, poważniejsze błędy.

13 days later