Wątek przeniesiony 2019-01-02 11:56 z Newbie przez Adam Boduch.

Budowanie menu? Switch w switchu?

0

Witam, dopiero od dwóch miesięcy programuję, buduję takie proste menu i mam problem czy switch może występować w switchu a jeśli tak to dlaczego mi nie działa? no i jako trzecią opcję chciałabym wrócić do menu głównego, ale nie mam pojęcia jak to zrobić, wszystko ma być w C, a nie C++

printf("MENU GLOWNE\n");
printf("Wpisz cyfre od 1 do 3\n");
printf("Liczby odpowiednio oznaczaja\n 1-obliczenia latwe \n 2-obliczenia trdniejsze \n 3-wyjscie\n\n");

opcja=getchar();

switch(opcja)
{
	case '1': printf("Wpisz dwie liczby x, y \na nastepnie wybierz odpowiednia opcje\n\n"); 
	printf("Wpisz x:"); 
	scanf("%f",&x); 
	printf("Wpisz y:"); 
	scanf("%f",&y); 
	printf(" x: %f, y: %f\n\n",x,y);
	printf("Wpisz cyfre od 1 do 3\n");
	printf("liczby odpowiednio oznaczaja: \n1-dodawanie x+y\n2-odejmowanie x-y\n3-powrot do menu glownego\n\n");
	opcja_1=getchar();
	switch(opcja_1)
	{
		case '1':
		float suma;
		suma=x+y;
		printf("x+y=%f",suma);
		
                    case '2':
		float roznica;
		roznica=x-y;
		printf("x-y=%f",roznica);
                  
                    case '3':
	}
																																	
	
}



getch();
return 0;

}

0

oczywiscie, ze mozesz miec switch w switchu.

Najpierw przerob sobie progrma tak by kazdy warunek w switchu (a raczej to co ma sie wykonac) niech bedzie funkcja

switch(wybor)
{
case 1:
  funkcja1();
  break;
case 2:
  funkcja2()
  break;
case 3:
 ...
default:
 ...
}

ponazywaj funkcje tak by oddawaly to co robia

teraz jezeli chcesz by to menu zawsze sie wyswietlalo. To zrob w okol tego petle while(1). Jezeli bedziesz chciala wrocic do glownego menu. Po prostu zakonczysz dzialanie jakies funkcji i wyswietli sie automatycznie menu. Jezeli chcesz wyjsc z petli, to niech funkcja zwraca czy kontynuowac prace czy nie. wtedy zamiast while(1) bedziesz miec while(inProgress)

tutaj troszke szerzej o tym co napisalem wyzej
http://fasadin.4programmers.net/2016/03/5-usprawnianie-programow-cz-1.html

0

nie wiem czy robię to poprawnie ale nadal program zamyka się kiedy chcę wybierać kolejne opcje

float wpisywanie(float x,float y)
{
	char opcja_1;
	printf("Wpisz dwie liczby x, y \na nastepnie wybierz odpowiednia opcje\n\n"); 
	printf("Wpisz x:"); 
	scanf("%f",&x); 
	printf("Wpisz y:"); 
	scanf("%f",&y); 
	printf(" x: %f, y: %f\n\n",x,y);
	printf("Wpisz cyfre od 1 do 3\n");
	printf("liczby odpowiednio oznaczaja: \n1-dodawanie x+y\n2-odejmowanie x-y\n3-powrot do menu glownego\n\n");
	opcja_1=getchar();
}


float f1(float x,float y)
	{
	float suma;
	suma=x+y;
	printf("x+y=%f",suma);
	}	


float f2(float x,float y)
		{
		float roznica;
		roznica=x-y;
		printf("x-y=%f",roznica);
		}

int main ()

{
char opcja;
char opcja_1;
int opcja_2;
float a,b,x,y;

printf("MENU GLOWNE\n");
printf("Wpisz cyfre od 1 do 3\n");
printf("Liczby odpowiednio oznaczaja\n 1-obliczenia latwe \n 2-obliczenia trdniejsze \n 3-wyjscie\n\n");





opcja=getchar();

switch(opcja)
{
	case '1': wpisywanie(a,b);
	switch(opcja_1)
	{
		case '1': f1(a,b);
		
		case '2': f2(a,b);
	}
																																	
	
}



getch();
return 0;

}

screenshot-20181231141803.png

0

a gdzie return w tych funkcjach?

0
Aniula23 napisał(a):

float f1(float x,float y)
{
float suma;
suma=x+y;
printf("x+y=%f",suma);
}

zmienna suma, do której coś przypisujesz, ale po zakończeniu funkcji to coś jest niedostępne
a funkcje deklarujesz jako zwracającą wartość float
poczytaj najpierw o funkcjach zanim zaczniesz je pisać

0

A to on ci się skompilował w ogóle? xD
w końcu w funkcjach nie ma return :x... lel

Twój program robi:

  1. Odpala się
  2. Prosi o parę rzeczy ( wiem jak działa getch ale co dokładnie robi scanf to nie do końca xD )
  3. wypier*** wszystko w kosmos co pobrał od użytkownika
  4. wykonuje switcha w switchu - i ignoruje go bo poprzedni switch który odpalił "wpisywanie(a,b);" nic nie zwraca... lel
  5. czeka na podanie guziora
  6. zamyka sie...
struct Data{
	double x,y;
	
	int opcja;
}MyData;



bool wpisywanie(Data &in)
{
	printf("Podaj dwie liczby (x,y): ");
	 printf("Wpisz x: ");
	 scanf("%f",&in.x);
	
	printf("Wpisz y: ");
	 scanf("%f",&in.y);

	printf("Podaj nr. akcji!");
	 printf("1 - dodawanie");
	 printf("2 - odejmowanie");
	 printf("3 - mnozenie");
	 printf("4 - dzielenie");
    in.opcja=getchar();
	
	return true;	// Jeśli udało się wykonać funkcje
}



bool f1(Data &in){
	if( printf(in.x + in.y) )return true;
		else return false;}

		
		
bool f2(Data &in){
	if( printf(in.x - in.y) )return true;
		else return false;}

		
		
bool f3(Data &in){
	if( printf(in.x * in.y) )return true;
		else return false;}

		
		
bool f4(Data &in){
	if( printf(in.x / in.y) )return true;
		else return false;}

		
		
int main ()
{
printf("MENU GLOWNE\n");
printf("Wpisz cyfre od 1 do 3\n");
printf("Liczby odpowiednio oznaczaja\n 1-obliczenia latwe \n 2-obliczenia trdniejsze \n 3-wyjscie\n\n");

MyData.opcja=getchar();

switch(MyData.opcja)
{
    case '1': wpisywanie(MyData);
    switch(MyData.opcja)
    {
        case '1': f1(MyData); break;
        case '2': f2(MyData); break;
        case '3': f3(MyData); break;
        case '4': f4(MyData); break;
    }

}
	getch();
return 0;
}

Masz... nie wiem czy zadziała ale przetestuj i jak zadziała to po-analizuj sobie :D

btw. mój kot ma na imię Nicole xD

//Edit:
pewnie zostawiłem kilka błędów jeszcze to ktoś może ci poprawi albo może sam znajdziesz błędy z kompilatorem :)...

//Edit2:
w ogóle takie coś to sie da bez tego switcha zrobić :P
można po prostu dać tablice funkcji xD jakoś tak sie to robiło:
bool (*Fc)(<argumenty>) = { f1, f2, f3, f4 };

a potem np.

printf( Fcgetch() );
lel xD

egh specjalnie dla cb odpale sobie CB i potestuje z C++ xD
//Edit3:
ni uja :c nawet z cin-em miałem jakieś 5 minutowe problemy xD
nie używam już tych publicznych chyba ze JS albo CSS więc się pozapominało z C++ :(
std::cin(Int);
std::cin -> Int;
std::Int = cin; // nie wiem co sobie tu myślałem xD lol

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