Kalkulator pokazuje złe wyniki (C++)

Na zadanie domowe z informatyki dostaliśmy do napisania kalkulator w C (aplikację dosową) w programie Dev-C++. Mój problem jest następujący, napisałem coś takiego

#include 

#include 


int main(int argc, char *argv[])

{

  int x,y,w;

  char znak;

  puts("PODAJ LICZBY:\n\n");

  scanf("%d,%c,%d",&x,&znak,&y);

  if(znak=='+'){

  w=x+y;

}

  if(znak=='-'){

  w=x-y;

}

  if(znak=='*'){

  w=x*y;

}

  if(znak=='/'){

  w=x/y;

}


printf("%d",w);

puts("\n\n");

  system("PAUSE");	

  return 0;

}

i nie wiem co w nim nie działa, zawsze po wpisaniu np. 5+9 wychodzi 2293640 zamiast 14. Proszę o wskazanie błędu i wyjaśnienie dokładnie co było źle.

Dziwne, mi wychodzi 2293672 :lol:

Po pierwsze tu się prac domowych nie odrabia :slight_smile:

Po drugie pomyślałeś może, żeby sprawdzić samemu co się kryje pod x, y i znakiem Twojego programu, po wpisaniu do niego danych?

Na przykład zaraz po scanfie takie coś:

printf("s: %d\n", x);

printf("znak: %c\n", znak);

printf("y: %d\n", y);

I zobacz co tam masz :slight_smile:

Nie odrabiam tu pracy domowej tylko się pytam co zrobiłem źle :slight_smile: Po wpisaniu podanej przez Ciebie komendy pokazuje mi ze y to 38… Czemu tak jest ?

Serio? Bo u mnie 32 :lol:

To rozbuduj sobie nieco kod diagnostyczny, żeby wyglądał tak:

printf("x: %d\n", x); //bo tu x miało być, nie s :)

printf("znak: %c\n", znak);

printf("y: %d\n", y);

printf("w: %d\n", w);

I wstaw go także przed swoim scanfem. Uruchom program i zobacz co Ci się zmienia po tym, jak wprowadzasz dane.

Pokazuje tak

x- dobrze

znak- nic

y- wartość zupełnie inna niż podana

w- też błąd

Jakby Ci tu powiedzieć… Twój program działa doskonale. Działa tak, jak go napisałeś i robi dokładnie to, co zaprogramowałeś :slight_smile:

Pytasz o sprawy banalne, poczytaj sobie kurs C, np. ten: http://home.agh.edu.pl/~chwastek/lectures/C/spis.html

Zwróć szczególną uwagę na to, że definiujesz cztery zmienne - jakie one mają wartości w tym momencie? (to pewno będzie w dziale “zmienne”).

Pewno zauważyłeś, że ich wartości (oprócz x) nie zmieniają się po wprowadzeniu danych. Więc pewnie źle wpisujesz dane :slight_smile:

Pojecie banalności jest pojęciem bardzo względnym i to co dla Einstaina czy Newtona byłoby banalne być może dla ciebie czy dla mnie byłoby w ogóle nie do pojęcia, chyba że też jesteśmy geniuszami. Ja w każdym bądź razie staram się nie naużywać tego określenia bo sugeruje jaki to jestem mądry, a inni są głupcami.

W takim razie jak wpisać dane żeby było dobrze?

Fajny kolor. Jest tak samo genialny jak treść Twojego posta.

Tu nie trzeba mądrości, wystarczy solidność. Mamy do czynienia z problemem niejako na siłę stworzonym przez twórcę kodu. Na dodatek problem nie polega na błędzie w programie, ale w jego używaniu. Aby go “rozwiązać” wystarczy poczytać ogólnie dostępne w necie, czy pierwszej lepszej książce do C materiały. Więc problem jest banalny. A przywoływanie Newtona czy Einsteina jest nie na miejscu. No chyba, że za przejaw geniuszu uznajesz umiejętność czytania :slight_smile:

Dane pobiera ta instrukcja:

scanf("%d,%c,%d",&x,&znak,&y);

Zatem musisz je wpisać zgodnie z ciągiem, którego sam żądasz. Czyli liczba, przecinek, znak, przecinek, liczba. Czyż nie?

I jeszcze jedno - nie uważasz, że te 4 ify w Twoim kodzie lepiej byłoby zastąpić konstrukcją switch-case-(ew. default)?

Przy okazji jak już się uporasz się z wprowadzeniem danych to dzielenie będzie zwracało dobry wynik tylko wtedy gdy x będzie wielokrotnością y. Zostawiam do przemyślenia dlaczego.

If-ów jest tyle ponieważ na razie nas tak uczą (pierwszy rok programowania) i nie potrafię inaczej. Dzięki za pomoc.

Pierwszy rok programowania gdzie?

Zamiast:

if(znak=='+'){

  w=x+y;

}

  if(znak=='-'){

  w=x-y;

}

  if(znak=='*'){

  w=x*y;

}

  if(znak=='/'){

  w=x/y;

}

pisze się tak:

switch (znak)

{

case '+':

 w=x+y;

 break;

case '-':

 w=x-y;

 break;

case '*':

 w=x*y;

 break;

case '/':

 w=x/y;

 break;

default:

 printf("Błędny znak!");

 break;

}

Ładniej wygląda i ponoć jest wydajniejsze. Do tego będzie lepsze przy większych ilościach danych. I masz defaulta, który daje Ci prawie obsługę błędów :slight_smile:

Uczę się w Zespole Szkół Elektrycznych im. Tadeusza Kościuszki na profilu technik informatyk. Dzięki za krótszą wersję kodu.