21 / 37
Aug 2017

Polecam na początek umieścić kod na ideone nie zapominając o danych na wejściu. Obecna forma prezentacji kodu, delikatnie rzecz ujmując, jest odpychająca dla potencjalnych osób chcących udzielić pomocy.

P.S. umieszczenie tam kodu wraz z danymi na wejściu powinno od razu pokazać w czym jest problem.

nie chodziło o pokazanie twojego ekranu, ale o wstawienie danych na ideone i uruchomienie - zobaczysz wtedy inny wynik

i mógłbyś w końcu dokładnie przeczytać treść zadania, albo całą dyskusję w tym wątku - to dowiesz się, gdzie robisz błąd

2 months later

Siema.
Otóż wcześniej klepałem sobie kod w C++, ale poszedłem na studia i chcą abym umiał zwykłe C.

W związku z tym chcąc napisać kalkulator wyklepałem taki kod:

Z wierzchu wydaje się ok, ale jeszcze słabo znam C, więc nie mogę się doszukać błędu. Ktoś nakieruje?

instrukcje:

cin >> znak;

scanf("%c", &znak);

nie są tożsame, ich działanie w istotny sposób się różni - ponieważ ja nie zajmuję się nauczaniem C/C++, więc tę różnicę sprawdź w dokumentacji

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 :slight_smile:

1 year later

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";
	}
}

Rzeczywiście, teraz to widzę. Dziękuję bardzo za poświęcenie swojego czasu i napisanie mi co mogłabym poprawić.
Pozdrawiam

2 years later

Podepnę się pod wątek z ciekawości chciałem przerobić kod z c++ na pythona, wyszedł trochę toporny ale działa dla danych przykładowych, problem zaczyna się później bo wyrzuca błędną odpowiedź:

Nie znam się na pythonie, ale wydaje mi się że Twój program nie działa dla liczb większych od 10

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.