[C++] Prosty kalkulator z funkcją switch, problem z getchar


(J Damian) #1

Cześć.

Program działa poprawnie do momentu, gdy należy wpisać cyfrę odwołującą do linijki 'case'; po wpisaniu którejś z cyfr program w tym momencie przeskakuje do końca instrukcji switch wyświetlając komunikat z default. 

 

Getchar dobrze szczytuję liczbę (sprawdzone scanf). 

#include <stdio.h>


int main(){
	int x; //liczba calkowita I
	int y; //liczba calkowita II
	char z;				

	printf("KALKULATOR OBSLUGUJE DZIALANIA: DODAWANIE, ODEJMOWANIE, MNOZENIE, DZIELENIE; \n\tNASTEPNIE PODAJE WYNIK ");

	//wczytywanie danych

	printf("\n\nPodaj x (liczbe calkowita w systemie dziesietnym): ");  
	if (scanf("%d",&x)!=1 || getchar()!='\n'){    
		printf("Bledne dane.\n");
		printf("\nKoniec programu.\n");
		return 0;     
	}

	printf("Podaj y (liczbe calkowita w systemie dziesietnym): ");  
	if (scanf("%d",&y)!=1 || getchar()!='\n'){    
		printf("Bledne dane.\n");
		printf("\nKoniec programu.\n");
		return 0;     
	}

	//wyswietlenie danych
	printf("\nOto Twoje dane:");
	printf("\nPodales x = %d\n",x);
	printf("Podales y = %d\n",y);

	//menu wyboru dzialan
	printf("\nProgram prosi o wybranie dzialania z menu wciskajac dla:\n");
	printf("Dodawania (1), odejmowania (2), mnozenia (3), dzieleni (4)\t");
	z=getchar();
	printf("\n\n%c\n\n",z);
	switch(z)
	{
	case 1:
		{
			printf("\nWybrales dodawanie, oto wynik:%d",x+y);
			break;
		}
	case 2:
		{
			printf("\nWybrales odejmowanie, oto wynik:%d",x-y);
			break;
		}
	case 3: 
		{
			printf("\nWybrales mnozenie, oto wynik:%d",x*y);
			break;
		}
	case 4: 
		{
			printf("\nWybrales dzielenie, oto wynik:%d",x/y);
			break;
		}
	default : 
		{
			printf("Nie znam takiego dzialania");
			break;
		}
	}

	printf("\n\nKoniec programu.\n");
	printf("Autor programu: Damian\n\n");
	return 0;   
}

(Kamatori) #2

Dlaczego w instrukcji switch dałeś: 


(J Damian) #3

No fakt. Próbowałem i bez cudzysłowów. Nie dopatrzyłem i wkleiłem tutaj ‘z’, powinno być bez. 


(Krzychu_93) #4

nie jestem ekspertem od programowania ale zauważyłem, że instrukcja switch działa tak jakby w kodzie ASCII zrób coś takiego to zobaczysz o co mi chodzi zmień “case 1:” na “case 49:” jedynka w kodzie ASCII to 49, pewnie da się jakoś obejść ale Ja proponuję takie rozwiązanie: zmień typ zmiennej z na integer i będzie działać (oczywiście getchar() w 37 linii wtedy zastąp scanf() ), jeżeli to Cię nie satysfakcjonuje to jestem pewny, że ktoś mądrzejszy Ci pomoże :wink:


(ktoś tam) #5

Nie pamiętam dokładnie, więc wybaczcie.

 

Spróbuj:

case ‘1’:

 

Jeżeli zdefiniowałeś z jako char, to instrukcja switch chce zmiennej char, a ty podajesz int.