Witam! spoj mówi, że jest błąd. Co tutaj jest źle :
Właśnie z tego co sprawdzałem cin i scanf działa tak samo.
Ogólnie program wykonuje prawidłowe obliczenia, ale problem polega na tym, że za każdym razem (nie liczać pierwszego testu) gdy wypisuje wynik, wypisuje też wynik poprzedniego działania jak zresztą widac na ideone.
EDIT: Już wiem, scanf odczytuje potwierdzenie (klikniecie ENTER) jako znak \n przez co switch wyłapuje \n jako polecenie dla niego. Kod poprawilem i działa prawidlowo, ale przekracza limit czasu. Tylko jak go zoptymalizować na prostszy to już nie mam pojęcia. Chyba, że na if’ach będzie szybciej
Dzień dobry,
czy mogłabym prosić Was o pomoc w tym zadaniu. Zrobiłam już program używając switch i sędzia mi go zaakceptował, ale zastanawiam się nad użyciem własnych funkcji w programie. Oto mój kod, po wpisaniu przykładowych danych program działa poprawnie jednak sędzia mi go odrzuca, Nie daje mi spokoju to, co poszło nie tak.
[cpp]
#include
using namespace std;
int dodawanie()
{
int x, y;
cin >> x;
cin >> y;
return x + y;
}
int odejmowanie()
{
int x, y;
cin >> x;
cin >> y;
return x - y;
}
int mnozenie()
{
int x, y;
cin >> x;
cin >> y;
return x * y;
}
int dzielenie()
{
int x, y;
cin >> x;
cin >> y;
return x / y;
}
int resztaZDzielenia()
{
int x, y;
cin >> x;
cin >> y;
return x % y;
}
int main()
{
int a, b;
char znak;
int wynik;
while (cin >> znak)
{
switch(znak)
{
case '+':
wynik = dodawanie();
cout << wynik<<endl;
break;
case '-':
wynik = odejmowanie();
cout << wynik<<endl;
break;
case '*':
wynik = mnozenie();
cout << wynik<<endl;
break;
case '/':
{
if (b!=0)
wynik = dzielenie();
cout << wynik<<endl;
break;
}
case '%':
wynik = resztaZDzielenia();
cout << wynik <<endl;
break;
default:
wynik = 0;
cout << wynik<<endl;
break;
}
}
return 0;
}
[/cpp]
Będę wdzięczna za wszelkie wskazówki.
Pozdrawiam
Agnieszka Gołąb
W main posiadasz dwie niezainicjalizowane zmienne a i b. Nic do nich nie wczytujesz, a mimo to dla znaku ‘/’ sprawdzasz czy b jest różne od 0 (UB). Proponuję wyrzucić te zmienne. Staraj się nie powtarzać kodu (zasada DRY2). Wczytywanie liczb z każdej funkcji można przenieść do main. Tak samo wypisywanie można wyrzucić z każdego case:
#include <iostream>
using namespace std; // ?
int dodawanie(int x, int y)
{
return x + y;
}
int odejmowanie(int x, int y)
{
return x - y;
}
int mnozenie(int x, int y)
{
return x * y;
}
int dzielenie(int x, int y)
{
return x / y;
}
int resztaZDzielenia(int x, int y)
{
return x % y;
}
int main()
{
char znak;
int wynik;
while (cin >> znak) // lub std::cin >> znak >> x >> y
{
int x, y;
cin >> x >> y;
switch (znak)
{
case '+':
wynik = dodawanie(x, y);
break;
case '-':
wynik = odejmowanie(x, y);
break;
case '*':
wynik = mnozenie(x, y);
break;
case '/':
{
// if (y != 0) dla danych z zadania warunek będzie zawsze prawdziwy
wynik = dzielenie(x, y);
break;
}
case '%':
wynik = resztaZDzielenia(x, y);
break;
}
cout << wynik << "\n";
}
}
Mały szczegół!?
Przecież testy w zadaniu są tylko do “rozjaśnienia” problemu a nie do “regularnego” testowania. Z treści zadania jasno wynika, że liczby w testach będą dużo większe niż tylko jednocyfrowe. Jeżeli chodzi tylko o AC to ok, ale problemy na spoju służyć powinny do nauki [dobrego ] programowania i być inspiracją do własnych projektów. A prosty 4[5] działaniowy kalkulator, to trochę mało. Projekt kalkulatora to problem w wielu książkach do nauki programowania, więc można tu pokusić się o więcej operacji, pamięć, przełączana-ONP, graficzny interfejs - GUI itd. Wystarczy popatrzeć na dostępne proste i naukowe kalkulatory "ręczne i softwerowe, a potem ewentualnie przeneść-dostosować projekt na arduino lub raspberry pi.
Przerabianie kodu z innego języka - może często tak się kończyć- topornym programem. A tym bardziej, jeżeli w tym innym języku, program też był już napisany nie w optymalny sposób? Nie jestem specjalistą od Pythona, ale mi udało się napisać program w 4 linijkach - specjaliści od pytona pewnie upchali by to do 1 - 2 linijek.
Suggested Topics
Topic | Category | Replies | Views | Activity |
---|---|---|---|---|
SPOJ.com - Problem ZABAWA pl.spoj.com | Zbiór zadań | 6 | 93 | 22d |
TFRACAL - Kalkulator ułamków | Zbiór zadań | 2 | 169 | Feb 1 |
FR_20_02 - Poszukiwacze skarbów - Błąd w testach? | Zbiór zadań | 1 | 132 | Apr 2 |