1 / 37
Oct 2009

Zadanie: pl.spoj.pl/problems/CALC/104
--
Otóż mam problem z zadaniem calc(łatwe).
Sprawa wygląda następująco wszystko ładnie ale , gdy wpisze najpierw + 7 9 lub - 0 4 itd, to wyskakują mi kosmiczne wyniki!
Wie ktoś czym to jest spowodowane? Prosiłbym o szybka pomoc, z góry dzięki.

-- kod usunięty --

  • created

    Oct '09
  • last reply

    May '21
  • 36

    replies

  • 3.9k

    views

  • 18

    users

  • 3

    likes

  • 7

    links

No więc najpierw masz zdeklarowany "warunek" jako char, czyli znak, a potem używasz %s, czyli jako stringa.
Zamień %s na %c.
No i jeszcze masz wczytywać testy do końca plików, a nie tylko 5 testów.

tak tylko jak użyję %c zamiast %s to program się wysypuje przy wpisaniu /..
a te wyniki to sprecyzuje po wpisaniu no + 7 9 to mi wyskakuje zero ... i cokolwiek tam dam to to samo wychodzi ...

Do końca plików ? Dobra, ale potem jak wypisać wyniki ?? bo tego zupełnie nie wiem smiley

EDIT:
Tzn jakby wyniki można było wypisywać zaraz po wyliczeniu to ok, ale tak nie można ?
Jak ja mam te wyniki wypisać ?(wiem jak napisać eof te 5 to do testów ... )

No więc najpierw wyjaśnię testy:
jeśli nie ma podanej na początku inputu liczby testów oraz w przykładzie nie jest osobno jeden test, to trzeba wczytywać liczby, znaki czy coś innego do końca pliku, czyli do EOF (End Of File). Oto program, który wczytuje stringi do końca pliku i je wypisuje:

<stdio.h>
int main(void)
{
char tab[1000];
while(scanf("%s",&tab)!=EOF)
{
printf("%s\n",tab);
}
return 0;
}

A poza tym:
cin i cout (C++) - biblioteka iostream
scanf i printf (C/C++) - biblioteka stdlib.h / cstdlib
Nie możesz w C++ używać scanf i printf, jeśli nie masz biblioteki cstdio.

Aha - dane wczytujesz pojedynczo, a po każdym "przykładzie" wypisujesz odpowiedź (więc tablica nie jest konieczna). To nie jest tak, że:
wczytujesz, wczytujesz ... wczytujesz EOF wypisujesz
wczytujesz wypisujesz, wczytujesz wypisujesz ... wczytujesz wypisujesz EOF

No i nie wiem, co to jest

return EXIT_SUCCESS;

, bo nie jestem zaawansowany w programowaniu, ale chyba mogę z czystym sumieniem powiedzieć, że to niepotrzebne w C++, a w Ansi C wystarczy

return 0;

Po co sobie wydłużać pisanie kodu?

5 years later

Przeczytaj ten wątek187,a potem popraw program. Nie zapomnij usunąć kodu z forum bo jak zaczniesz poprawnie wczytywać nieokreśloną ilość danych będzie AC. A na przyszłość proponuję dopisywać się do istniejących wątków.

4 months later

Może mi ktoś powiedzieć dlaczego wyrzuca błędną odpowiedź?
Może czegoś nie doczytałem...

CODE DELETED

Nie mam pojęcia, ale podejrzewam, że tak, niedoczytałeś. Było to już tyle razy poruszane ....
o
1. Fatalne formatowanie wklejonego kodu </> - ctrl-k
2. Nie wszyscy są fanami c# więc warto napisać, że to c#, java, albo jeszcze coś inneg.
3. Gdyby zadanie polegało np na wypisaniu największego i najmniejszego wyniku lub coś podobnego to owszem. Tutaj można od razu wypisywać wyniki, zamiast je tablicować.
4. Dla "grzecznych" danych twój program jest ok wink

--
grzeczne:
dane [eof]

niegrzeczne:
dane
[eof]

bardzo niegrzeczne:
[empty line]
dane
[empty line]
dane
[empty line]
[eof]

Przetestuj chociaż dla umiarkowanie "niegrzecznych" danych wink

Przy pisaniu kodu, unikaj jak ognia metody copy/paste. Gdybyś musiał wszystko pisać z klawiatury, może natychmiast poprawiłbyś/napisał kod,w poniższy sposób:

l1 = Convert.ToInt32(liczby[1]);
l2 = Convert.ToInt32(liczby[2]);
if (znak==...)
  wynik = l1 /[+-*%] l2;
  ...
lub
swich (znak){
   case '+' : wynik = l1 + l2; 
              break;
  ....

itd

znak = liczby[0];
Nazwa tablicy jest źle dobrana, nie uważasz?
Czy nie lepiej np tak:
operator = dane[0];
lub
op = linia[0]; //bufor[0];

Nie, jest bardzo dobry, ale na przykład dodaj na początku [w] pętli:
if (liczby.Length < minimum) continue; //minimum = znak + spacja+ l1 + spacja + l2 ~= 5
ale wystarczy pewnie minimum = 1;

Dobra jest AC. Już rozumiem o co chodzi. Dzięki jeszcze raz za wyjaśnienie.

12 days later

W tym zadaniu nie ma podanej liczby zestawów, jak wczytywać w takim przypadku poczytaj tutaj108 A kod umieszczaj w znacznikach dostępnych pod ctrl +k, będzie sformatowany

2 months later

Witam, już nie wiem gdzie może leżeć błąd, na pierwszy rzut oka wszystko wygląda ok...
rozwiązanie w C:
//tu był kod

Oprócz rzucania okiem warto też testować, np chociażby na ideone wkleić test: https://ideone.com/LyDEsM56 i już na drugi rzut oka widać, że wygląda ok, ale tak nie jest [na wyjściu brak -4].

Powodem jest brak jednego małego [dwóch] znaczków: \n
Warunek mógłby wyglądać np tak:
while (scanf ("%c %d %d\n", &wybor, &a, &b) != EOF)

10 months later

Może ktoś powiedzieć gdzie mam błąd:

include

include

using namespace std;

int main()
{
char znak;
int a=0, b=0, i=1;
while(i)
{
cin >> znak;
cin >> a;
cin >> b;
switch(znak)
{
case '+':
cout << a+b;
break;

    case '-':
         cout << a-b;
    break;

    case '*':
        cout << a*+b;
    break;

    case '/':
        cout << a/b;
    break;
    case '%':
        cout << a%b;
    break;
    default: exit(0);
}
cout << endl;
}

return 0;

}

15 days later

Witam wszystkich, to mój pierwszy post na forum, poprawcie mnie jak piszę w złym miejscu
Otóż mimo, że mój kod zdaje się działać poprawnie, SPOJ wyrzuca mi błąd o przekroczeniu limitu czasu. Jestem bardzo początkujący i nie mam pomysłu na optymalizację. Czy ktoś byłby w stanie mi pokazać, co mógłbym zrobić lepiej?Kod pod spodem, ponieważ nie wiem gdzie powinno się go wkleić :slight_smile:

include

using namespace std;
int a,b;
char znak;
int main()
{
while(true)
{
cin>>znak>>a>>b;
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;

    }
}
return 0;

}

Okej, problem rozwiązany :slight_smile: wystarczyło zmienić warunek pętli, dziękuję