Jak skończyć pętlę while

0

Witam, ostatnio sprawdzam swoje siły w programowaniu i mam problem. Chciałem napisać kalkulator z 4 funkcjami (dodawanie,odejmowanie,dzielenie,mnożenie) który by się zapętlał jeżeli użytkownik nie wybierze odpowiedniej opcji od 1-4. Niestety pętla ta się coś nie chce skończyć a nie wiem co mogę zmienić. Wydaje mi się, że problem leży w usuwaniu się wartości i, ale też nie jestem pewny. Oto kod

#include <stdio.h>
int main ()
{
	float a,b,i,c;
	
	while (i!= 1,2,3,4)
	{
		
	printf("Wybierz odpowiednia opcje aby wykonac dzialanie:\n 1.Dodawanie\n 2.Odejmowanie\n 3.Mnozenie \n 4.Dzielenie\n");
	
		scanf ("%f",&i);
	
			if (i==1)
				{
					printf("Podaj dwie liczby ktore chcesz dodac:\n");
						scanf ("%f",&a);
						scanf ("%f",&b);
							c=(a+b);
						printf ("Wynik dodawania to:\n %f",c);		
				}
			
			else if (i==2)
				{
					printf("Podaj dwie liczby ktore chcesz odjac:\n");
						scanf ("%f",&a);
						scanf ("%f",&b);
					c=a-b;
						printf ("Wynik odejmowania to:\n %f",c);	
				}
				
				
			else if (i==3)
				{
					printf("Podaj dwie liczby ktore chcesz pomnozyc:\n");
						scanf ("%f",&a);
						scanf ("%f",&b);
					c=a*b;
						printf ("Wynik mnozenia to:\n %f",c);		
				}	
			
			
			else if (i==4)
				{
					printf("Podaj dwie liczby ktore chcesz podzielic:\n");
						scanf ("%f",&a);
						scanf ("%f",&b);
					c=a/b;
						printf ("Wynik dzielenia to:\n %f",c);		
				}	
			else 
			{
				printf("Blad w programie sprobuj jeszcze raz\n\n");
			}}
	
	return 0;
} 
  • jeszcze może ktoś pomógłby mi z tym aby zrobić wczytywanie bez wciskania enteru przy wyborze funkcji od 1-4, próbowałem getchar, getche, ale coś nie działa..
3
while((i!=1)&&(i!=2)&&(i!=3)&&(i!=4))
3
i!= 1,2,3,4

to(((i!= 1),2),3),4

co przekłada się na `4`, czyli masz odpowiednik `while(4)`, czyli pętlę nieskończoną.

Zrób tak:
```c
i != 1 && i != 2 && i != 3 && i != 4 
0

Dzięki wielkie! A jeszcze jakbym mógł prosić o

  • jeszcze może ktoś pomógłby mi z tym aby zrobić wczytywanie bez wciskania enteru przy wyborze funkcji od 1-4, próbowałem getchar, getche, ale coś nie działa..
2
while (i != 1 && i != 2 && i != 3 && i != 4)

I polecam int i;

Aczkolwiek prostsze jest

else break;

Sam sobie zaprzeczasz, jesli użytkownik podał nie 1,2,3,4 to program ma się zakończyć czy próbować jeszcze raz?

0

Chodzi o to aby program robił while dopóki nie poda się od 1-4, ale już działa wszystko.

A z tym intem to chodzi po prostu żeby program był "lżejszy" czy dlaczego int zamiast float

1
int i;
...
i=getch()-'0';

ale potrzebujesz <conio.h> lub ncurses

2
Avirel napisał(a):

A z tym intem to chodzi po prostu żeby program był "lżejszy" czy dlaczego int zamiast float
Bo opcja jest liczbą całkowitą, raczej nie spodziewasz się opcji 1.52. No i przy int nie będzie problemu jak kiedyś zmienisz na ==.

0

Hmmm nie wiem co źle myślę ale wszystko działa tak jak powinno... Ma się zapętlać dopóki nie wybiorę 1-4, czyli przy 5 ma iść od nowa.. dlatego też jest spróbuj ponownie.

  • jak zrobić aby ekran się wyczyścił po powiedzmy 5-10 sekundach od wypisania "Blad w programie sprobuj jeszcze raz"

@ no nawet naturalną, ale ciekawi mnie dlaczego zmieniać, nie łatwiej po prostu zostawić w float? z ciekawości pytam, nie znam się :P

  • jakby ktoś mi mógł wytłumaczyć "i=getch()-'0';" dlaczego tam jest -'0'
1
Avirel napisał(a):

jakby ktoś mi mógł wytłumaczyć "i=getch()-'0';" dlaczego tam jest -'0'

Konwersja znaku na liczbę, '0' -> 0, '1' -> 1, '2' -> 2 itd.

Edit: Znak '0' ma wartość 48, '1' ma wartość 49 itd. Jeśli getch wczytało znak '1', to '1' - '0' daje wynik 1, czyli liczbę którą chcesz.

0

No to musisz zamiast tego: while(...)
dać: for(;;)
Do czyszczenia albo ncurses albo jeżeli działasz w jedynym słusznym systemie to system("cls"); ale nie rób takiego badziewia.
Bo w trybie konsolowym masz możliwość podejrzeć poprzednie wyniki, nie odbieraj użytkownikowi tej możliwości.

Możesz zostawić i=getch(); zaś zmienić w if'ach if(i=='1') ... if(i=='2')

0

Trudne do pojęcia jest to, szczególnie jak się mało wie. W scanf wystarcza samo wczytywanie z klawiatury + można wywołać, a tutaj jakoś inaczej. No ale może za dużo na jeden dzień :P

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