Program z pętlą do-while i funkcją getchar

0

Witam. Dopiero co zacząłem przygodę z językiem C. Napisałem prosty program do liczenia pola wybranych wcześniej figur z menu. Chciałem zrobić pętle, aby po wciśnięciu obojętnie jakiego przycisku po obliczeniu pola, program wracał do menu, z wyjątkiem "s", który to powodował wyście z programu. Jednak mam problem, bo po obliczeniu pola, program automatycznie odnawia menu. Proszę o pomoc.

#include <stdio.h>
#include <conio.h>
#include <math.h>


int main()
{
	float a,b,c,x,prostokat,kwadrat,kolo,trapez,trojkat,rownoleglobok,romb,P,r,h,d1,d2,e,f;
	char m;
	

	
	printf("Program liczy pola wybranych figur geometrycznych\n\n");
	printf("Wpisz nazwe wybranej figury\n");
	printf("Mozesz wybierac sposrod (wpisz cyferke): \n");
	
	do{
		printf("1. prostokat\n");
		printf("2. kwadrat\n");
		printf("3. kolo\n");
		printf("4. trapez\n");
		printf("5. trojkat\n");
		printf("6. rownoleglobok\n");
		printf("7. romb\n");
		printf("8. deltoid\n");
	
		scanf("%f",&x);
		
		if(x == 1)
		{
			printf("Wybrales prostokat, wpisz dlugosci a i b\n");
			scanf("%f%f",&a,&b);
		
			if(a>0 && b>0)
				{
					P= a*b;
			
					printf("Pole prostokata wynosi:\n");
					printf("P=%.4f\n",P);
					printf("Aby wrocic do menu, kliknij dowolny przycisk. Jesli chcesz wyjsc, wpisz 's'\n");
				}
			else {
				printf("a i b musza byc wieksze od zera!\n");
				printf("Od nowa - kliknij dowolny przycisk. Jesli nie chcesz, kliknij 's'\n");
				}
			 
	 	}
		if(x == 2)
		{
			printf("Wybrales kwadrat, wpisz dlugosc boku a\n");
			scanf("%f",&a);
		
			if(a>0)
				{
					P= a*a;
			
					printf("Pole kwadratu wynosi:\n");
					printf("P=%.4f\n",P);
					printf("Kliknij dowolny klawisz, aby zakonczyc");
					printf("Aby wrocic do menu, kliknij dowolny przycisk. Jesli chcesz wyjsc, wpisz 's'\n");
				}
			else {
				printf("a musi byc wieksze od zera!\n");
				printf("Od nowa - kliknij dowolny Jesli nie chcesz, kliknij 's'\n");
				}
		}
		
		if(x == 3)
		{
			printf("Wybrales kolo, wpisz dlugosc promienia r\n");
			scanf("%f",&r);
		
			if(r>0)
			{
				P= 3.14*r*r;
			
				printf("Pole kola wynosi:\n");
				printf("P=%.4f\n",P);
				printf("Kliknij dowolny klawisz, aby zakonczyc");
				printf("Aby wrocic do menu, kliknij dowolny przycisk. Jesli chcesz wyjsc, wpisz 's'\n");
			}
			else {
				printf("r musi byc wieksze od zera!\n");
				printf("Od nowa - kliknij dowolny Jesli nie chcesz, kliknij 's'\n");
				}
		}
		if(x == 4)
		{
			printf("Wybrales trapez, wpisz dlugosc podstaw a i b, oraz wysokosc h\n");
			scanf("%f%f%f",&a,&b,&h);
		
			if(a>0 && b>0 && h>0)
			{
				P= ((a+b)*h/2);
			
				printf("Pole trapezu wynosi:\n");
				printf("P=%.4f\n",P);
				printf("Kliknij dowolny klawisz, aby zakonczyc");
				printf("Aby wrocic do menu, kliknij dowolny przycisk. Jesli chcesz wyjsc, wpisz 's'\n");
			}
			else {
				printf("a, b i h musza byc wieksze od zera!\n");
				printf("Od nowa - kliknij dowolny Jesli nie chcesz, kliknij 's'\n");
				}
		}
		if(x == 5)
		{
			printf("Wybrales trojkat, wpisz dlugosc podstawy a i wysokosc h\n");
			scanf("%f%f",&a,&h);
		
			if(a>0 && h>0)
			{
				P= ((a*h)/2);
			
				printf("Pole trojkata wynosi:\n");
				printf("P=%.4f\n",P);
				printf("Aby wrocic do menu, kliknij dowolny przycisk. Jesli chcesz wyjsc, wpisz 's'\n");
			}
			else {
				printf("a i h musza byc wieksze od zera!\n");
				printf("Od nowa - kliknij dowolny Jesli nie chcesz, kliknij 's'\n");
				}
		}
		if(x == 6)
		{
			printf("Wybrales rownoleglobok, wpisz dlugosc podstawy a i wysokosc h\n");
			scanf("%f%f",&a,&h);
		
			if(a>0 && h>0)
			{
				P= a*h;
			
				printf("Pole rownolegloboku wynosi:\n");
				printf("P=%.4f\n",P);
				printf("Aby wrocic do menu, kliknij dowolny przycisk. Jesli chcesz wyjsc, wpisz 's'\n");
			}
			else {
				printf("a i h musza byc wieksze od zera!\n");
				printf("Od nowa - kliknij dowolny Jesli nie chcesz, kliknij 's'\n");
				}
		}
		if(x == 7)
		{
			printf("Wybrales romb, wpisz dlugosc przekatnej d1 i przekatnej d2\n");
			scanf("%f%f",&d1,&d2);
		
			if(d1>0 && d2>0)
			{
				P= 0.5*d1*d2;
			
				printf("Pole rombu wynosi:\n");
				printf("P=%.4f\n",P);
				printf("Aby wrocic do menu, kliknij dowolny przycisk. Jesli chcesz wyjsc, wpisz 's'\n");
			}
			else {
				printf("d1 i d2 musza byc wieksze od zera!\n");
				printf("Od nowa - kliknij dowolny Jesli nie chcesz, kliknij 's'\n");
				}
		}
		if(x == 8)
		{
			printf("Wybrales deltoid, wpisz dlugosc przekatnych e i f\n");
			scanf("%f%f",&e,&f);
		
			if(e>0 && f>0)
			{
				P= 0.5*e*f;
			
				printf("Pole deltoidu wynosi:\n");
				printf("P=%.4f\n",P);
				printf("Aby wrocic do menu, kliknij dowolny przycisk. Jesli chcesz wyjsc, wpisz 's'\n");
			}
			else {
				printf("e i f musza byc wieksze od zera!\n");
				printf("Od nowa - kliknij dowolny przycisk. Jesli nie chcesz, kliknij 's'\n");
				}
		}
		
	m=getchar();
	

	
	}while(m!='s');
	return 0;
} 
0

No to wynieś drukowanie menu poza pętlę.
W czym problem?
Albo ja nie łapie o co pytasz albo jedynym sensownym wytłumaczeniem jest:
to nie jest program twojego autorstwa
oraz
nie rozumiesz ani wiersza z tego co podałeś

0

Opiszę jeszcze raz, trochę dokładniej. Program działa tak, że wybieram sobie cyferkę z menu odpowiadającą za figurę, np. 1 - czyli prostokąt. Podaję długości boków i otrzymuję w wyniku pole. I teraz jest tak, że gdy wyświetli już ten wynik, to od razu odnawia menu z figurami do wyboru, a ja chcę, żeby było to zrobione na przycisk - ścislej mówiąc na każdy przycisk, oprócz 's' - który to powinien powodować wyjście z programu. Program pisałem samemu od podstaw, dzisiaj go chciałem rozbudować jedynie o ten powrót do menu, dlatego zastosowałem funkcję do-while z getcharem, aby to zrobić - miałem dzisiaj to na wykładzie na uczelni, tylko jakoś mi to nie wychodzi.

1
while(getchar()!='\n') {}
m=getchar();
if(m!='\n') while(getchar()!='\n') {}
0

Hmm. Nie bardzo rozumiem, jakbyś mógł bardziej szczegółowo objaśnić, co mam źle, to byłbym wdzięczny.

0

zamień wiersz:
m=getchar();
na to co podałem wyżej.

0

Ok, działa dzięki, za pomoc, aczkolwiek chciałbym się zapytać dlaczego musiałeś dodać takie funkcje, skoro na wykładzie gościu mówił, że wystarczy tylko to co zrobiłem?

0

Po wczytaniu liczby w buforze klawiatury zostaje co najmniej <ENTER> w C/C++ zapisywany jako '\n'.
twój m=getchar(); łapał tego entera.

0

Ok, dzięki, już rozumiem :p

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