Problem w pętli switch przekakujący na while i odwrotnie.

0

//Amerykańska skala podatkowa z roku 1988 była jedną z najprostszych w ostatnich czasach. Składała się ona z czterech kategorii, z których każda zawierała dwie stawki. Oto jej podsumowanie:
stan wolny: 15% dochodu do 17850$ plus 28* reszty;
głowa rodziny:15% dochodu do 23900$ plus 28* reszty;
małżeństwo, rozliczenie wspólne: 15% dochodu do 29750$ plus 28* reszty;
małżeństwo, rozliczanie osobne: 15% dochodu do 14875$ plus 28* reszty;

Na przykład, osoba stanu wolnego, która osiągnęła dochód w wysokości 20000 dolarów, jest winna państwu 0.1517850$+0.28(20000$-17850$). Napisz program, który pobiera kategorię(małżeństwo etc.) i dochód podlegający opodatkowaniu, a następnie oblicza wartość podatku. Użyj pętli tak, aby użytkownik mógł obliczyć podatek dla kilku różnych przypadków w czasie jednej sesji z programem.//

#include <stdio.h>
oblicz_podatek(int stawka,int aa);

double main(double podatek)
{
	int kaska,aa,ch;

	
	ZAROBEK:printf("\nPodaj swoj zarobek roczny w dolarach(od 10000tys w zwyz).\n"
				"q aby zakonczyc\n\n");
	scanf("%d",&aa);

	printf("\nWybierz jedna z kategorii opodatkowania:\n"
		  "1)stan wolny\t2)glowa rodziny\n"
		  "3)malzenstwo,rozliczna wspolnie\t4)malzenstwo, rozliczane osobno\n");
	scanf("%d",&ch);	
	while(ch!='q')
	{
		switch(ch)
		{
			case 1:
			{
				podatek=oblicz_podatek(17850,aa);
				break;
			}
			case 2:
			{
				podatek=oblicz_podatek(23900,aa);
				break;
			}
			case 3:
			{
				podatek=oblicz_podatek(29750,aa);
				break;
			}
			case 4:
			{
				podatek=oblicz_podatek(14875,aa);
				break;
			}
			default: 
			{
				printf("\nNie ma takiej opcji.\n");
				goto ZAROBEK;
			}
			
		}
		printf("\n\nTwoj podatek wynosi %.2f\n",(double)podatek);

		goto ZAROBEK;
	}	
	
	

	getchar();
	getchar();
	return 0;
}

int oblicz_podatek(int stawka,int aa)
{
	double podatek;
	if(aa<=stawka)
		podatek=(0.15*aa);
	if(aa>stawka)
		podatek=(0.15*(double)stawka)+(0.28*((double)aa-(double)stawka));

	return podatek;
}

**Napisałem ten program jw. Program działa normalnie, pyta, z czytuje dane, funkcja poprawnie działa etc..
Problem pojawia się gdy chcę nacisnąć 'q' i zakończyć program. Program się zapętla, wyświetla mi super szybko w infinity ostatnie 6-7+ wersów. Raczej nie popełniłem błędu syntaktycznego lub coś w tym rodzaju bo program działa tylko problemy są przy wyjściu z niego. Może po prostu gdzieś coś źle zrobiłem, albo powinienem skorygować swój pomysł na ten program?
Za wszelkie poprawki, porady i opinie będę wdzięczy.

Z góry dzięki :)**

0

Z tego co testowałem to musiałbyś pobierać do char-a a nie do int-a bo wyskakuje duża liczba . Ustaw sobie zero jako koniec albo liczbę 134515065 .

A to wrzuć do while bo gdy chcesz wyjść to ci się wyświetla to niepotrzebnie.

Tyle z mojej strony może ktoś inny zna lepsze rozwiązanie.

Testowane na ideone ;p

0

Próbowałem napisać od nowa ten program.
Poprawiłem parę rzeczy.

Normalnie mi program wychodzi (znaczy w końcu reaguje na q), lecz teraz mam problem z funkcją switch... jak odtwarzam program to jakby nie zwracał uwagi na case'y tylko je olewa ;OO wchodzi do pętli switch "omija" każdy case i wyświetla default i idzie dalej.

#include<stdio.h>

int main()
{
	long int zarobek;
	char ch;
	double podatek=0;
	

	printf("Podaj swoj zarobek z zeszlego roku.\n");
	scanf_s("%d",&zarobek);

	printf("\nWybierz jedna z kategorii opodatkowania:\n"
		  "1)stan wolny\t2)glowa rodziny\n"
		  "3)malzenstwo,rozliczna wspolnie\t4)malzenstwo, rozliczane osobno\n"
		  "nacisnij q aby zakonczyc program.\n\n");
	//scanf_s("%c",&ch);
	ch=getchar();
	A:while(ch!='q')
	{
		switch(ch)
		{
			case '1':
				{
					if(zarobek<=17850)
						podatek=(0.15*zarobek);
					if(zarobek>17850)
						podatek=((0.15*17850)+(0.28*(zarobek-17850)));
					break;
				}
			case '2':
				{
					if(zarobek<=23900)
						podatek=(0.15*zarobek);
					if(zarobek>23900)
						podatek=((0.15*23900)+(0.28*(zarobek-23900)));
					break;
				}
			case '3':
				{
					if(zarobek<=29750)
						podatek=(0.15*zarobek);
					if(zarobek>17850)
						podatek=((0.15*29750)+(0.28*(zarobek-29750)));
					break;
				}
			case '4':
				{
					if(zarobek<=14875)
						podatek=(0.15*zarobek);
					if(zarobek>17850)
						podatek=((0.15*14875)+(0.28*(zarobek-14875)));
					break;
				}
			default:
				{
				printf("\nNie tedy droga!\n");
				break;
				}
		}
		printf("Twoj podatek wynosi: .2%f\n\n",podatek);
		printf("\nWybierz jedna z kategorii opodatkowania:\n"
		  "1)stan wolny\t2)glowa rodziny\n"
		  "3)malzenstwo,rozliczna wspolnie\t4)malzenstwo, rozliczane osobno\n"
		  "nacisnij q aby zakonczyc program.\n\n");
		scanf_s("%c",&ch);
		goto A;
	
	}


getchar();
getchar();
return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1