Jak powrócić do menu w funkcji case?*

0

Na wstępie, sorry, że nowy temat ale coś konto mi się skasowało i nie mogłem go edytować.
Otóż, mam problem z powróceniem do głównego menu. Próbowałem z goto ale program się sypał... więc pytam tu... Co do programu, to kod poniżej poza tym o co chodzi, chciałbym aby pierwsza i druga opcja byla wykonywana obowiązkowo, by reszta opcji zadziałała. Powiedzcie co i jak. Bo już mnie to irytuje, a nad samym menu siedzę już czwarty dzień i nic ...

#include <cstdlib>
#include <iostream>
#include <iomanip> 
#include <conio.h>
#include <stdio.h>

using namespace std;

/* przykład: transpozycja tablicy dwuwymiarowej, kwadratowej */

void transpozycja(float **tab, int n);
void wyswietl_tab(float **tab, int n);
int wybor;
int main(void)
{ 

	
	  	int n, i, j;  
  		char znak;
  	/*	cout<<"Liczba wierszy: "; cin>>n;
          float **tab = new float *[n];
  		for(i=0;i<n;i++) 
     		tab[i] = new float [n]; */
  {
  //	cout<<"Wprowadz elementy wierszy oddzielone spacja: "<< endl;
  		
  	//  		for(i=0;i<n;i++)
  	  //  	for(j=0;j<n;j++) 
  		//  cin>>tab[i][j];
 			float **tab = new float *[n];
  			for(i=0;i<n;i++) 
     		tab[i] = new float [n];
     		
     		
	 	cout <<" Wybierz opcje - wpisujac odpowiednia cyfre  \n\n";
	 	cout <<" 1 to - Liczba wierszy \n\n" ;
	 	cout <<" 2 to - Wprowadz elementy wierszy oddzielone spacja:\n\n";
	 	cout <<"pozycja 1 i 2, jest OBOWIAZKOWA!!! \n\n";
	 	cout << "3 to - Zawartosc tablicy przed transpozycja:\n\n";
	 	cout << "4 to - Zawartosc tablicy po transpozycji:\n\n";
	 	cout << "5 to - Wyjscie z programu \n\n";
     	cout << "Wybieram z menu liczbe  "; cin >> wybor;	

		
	    switch (wybor)
  		{   case 1: 
            {
                 cout<<"Liczba wierszy: "; cin>>n;
          
         }
         	break;
            case 2:
                { cout<<"Wprowadz elementy wierszy oddzielone spacja: "<< endl;
  		
  	  				for(i=0;i<n;i++)
  	    			for(j=0;j<n;j++)
       					cin>>tab[i][j];
      			}
      		break;
  			case 3: cout << "Zawartosc tablicy przed transpozycja:\n\n";
    
  			/* wyświtlamy zawartość tablicy */
  	
	    		wyswietl_tab(tab, n);     
  			break;
  			case 4: cout << "\nZawartosc tablicy po transpozycji:\n\n";
 			 /* algorytm transpozycji */ 
  				transpozycja(tab, n);
  	
  	
 			 /* wyświtlamy zawartość tablicy po transpozycji*/
  	
  				wyswietl_tab(tab, n); 
  
  				cout << "\n";
  			break;
  			case 5:
                   exit(0);
			break;
		
  			default: cout << "Nie ma takiej opcji w menu \n\n";
        
  	}	
      
  			getchar();getchar();
		    system("cls");
   	 
   	 	

  			
 		   
 		  
    
    
  
  return 0;
}
}

// funkcje

void wyswietl_tab(float **tab, int n)
{
int i, j;
  for( i = 0; i < n; i++)
      { 
        for( j = 0; j < n; j++)
            cout << "   " << setw( 3 ) << *(*(tab+i)+j); //tab[i][j];
        cout << "\n";
      } 
}

void transpozycja(float **tab, int n)
{
 float zm;
 int i, j; 
    
 for (i = 0; i < n-1; i++)
      for (j = i + 1; j < n; j++)
           {
            zm = *(*(tab+i)+j);                         //zm = tab[i][j];                            
            *(*(tab+i)+j) = *(*(tab+j)+i);              //tab[i][j] = tab[j][i];
            *(*(tab+j)+i) = zm;                         //tab[j][i] = zm;
           }
}
0

tak na szybko proponuje

// twoj switch
bool valid_first, valid_second;
valid_first = valid_second = 0;
switch(cos)
{
case 1:
// wczytujesz
valid_first = true;
break;
case 2:
//wczytujesz
valid_second = true;
break:
case 3:
// transponujesz jesli warunek spelniony
if(valid_second && valid_true)
transponuj();
else cout << "Nie wypelniles sekcji 1 lub 2\n";
break;
}
0
Proxima napisał(a):

tak na szybko proponuje

// twoj switch
bool valid_first, valid_second;
valid_first = valid_second = 0;
switch(cos)
{
case 1:
// wczytujesz
valid_first = true;
break;
case 2:
//wczytujesz
valid_second = true;
break:
case 3:
// transponujesz jesli warunek spelniony
if(valid_second && valid_true)
transponuj();
else cout << "Nie wypelniles sekcji 1 lub 2\n";
break;
}

hmm ok zaraz przebuduję, mam pytanie musi być koniecznie przy tym schemacie bool?

0

Możesz zastosować inny typ, ale bool jest właśnie do takich zastosowań (jak Ci tak szkoda cennych bajtów to użyj pól bitowych).
Tylko deklaracje, i przypisanie zera do zmiennych bool wywal poza pętle.
// edit 2, co do goto, to pare tematów niżej jest opisane dlaczego powinno sie go unikać.

0
Proxima napisał(a):

Możesz zastosować inny typ, ale bool jest właśnie do takich zastosowań (jak Ci tak szkoda cennych bajtów to użyj pól bitowych).
Tylko deklaracje, i przypisanie zera do zmiennych bool wywal poza pętle.
// edit 2, co do goto, to pare tematów niżej jest opisane dlaczego powinno sie go unikać.

ok ok,
Własnie kończę przebudowywać, i mógłbyś mi powiedzieć jak mam zadeklarować(jako co>) te nowe zmienne, które wprowadziłeś?

0

Dobra, mam wszytko już ok, ale i tak nie działa program poprawnie, gdyż nie przechodzi do kolejnego kroku po wykonaniu pierwszej obowiązkowej pozycji z menu... :/

#include <cstdlib>
#include <iostream>
#include <iomanip> 
#include <conio.h>
#include <stdio.h>

using namespace std;

/* przykład: transpozycja tablicy dwuwymiarowej, kwadratowej */

void transpozycja(float **tab, int n);
void wyswietl_tab(float **tab, int n);
int wybor;

int main(void)
{ 

	
	  	int n, i, j;  
  		char znak;
  	/*	cout<<"Liczba wierszy: "; cin>>n;
          float **tab = new float *[n];
  		for(i=0;i<n;i++) 
     		tab[i] = new float [n]; */
  {
  //	cout<<"Wprowadz elementy wierszy oddzielone spacja: "<< endl;
  		
  	//  		for(i=0;i<n;i++)
  	  //  	for(j=0;j<n;j++) 
  		//  cin>>tab[i][j];
 			float **tab = new float *[n];
  			for(i=0;i<n;i++) 
     		tab[i] = new float [n];
     		
     		
	 	cout <<" Wybierz opcje - wpisujac odpowiednia cyfre  \n\n";
	 	cout <<" 1 to - Liczba wierszy \n\n" ;
	 	cout <<" 2 to - Wprowadz elementy wierszy oddzielone spacja:\n\n";
	 	cout <<"pozycja 1 i 2, jest OBOWIAZKOWA!!! \n\n";
	 	cout << "3 to - Zawartosc tablicy przed transpozycja:\n\n";
	 	cout << "4 to - Zawartosc tablicy po transpozycji:\n\n";
	 	cout << "5 to - Wyjscie z programu \n\n";
     	cout << "Wybieram z menu liczbe  "; cin >> wybor;    
 	
bool valid_first, valid_second;
valid_first = 0;
valid_second = 0;

	    switch (wybor)
  		{   
		  	case 1: 
            {
                cout<<"Liczba wierszy: "; cin>>n;
          		valid_first = true;
          }
      		case 2:
				{
				cout <<"Wprowadz elementy wierszy oddzielone spacja: "<< endl;
  					for(i=0;i<n;i++)
  	    			for(j=0;j<n;j++)
       					cin>>tab[i][j];
       			
       					valid_second = true;
      			}
      		break;
  			case 3: 
			  {
			  cout << "Zawartosc tablicy przed transpozycja:\n\n";
    
  					/* wyświtlamy zawartość tablicy */
  		    	 
					// transponujesz jesli warunek spelniony
					if(valid_second && valid_first)
					{
					 		wyswietl_tab(tab, n);
						}	
					else cout << "Nie wypelniles sekcji 1 \n";    
			}
  			break;
  			case 4: cout << "\nZawartosc tablicy po transpozycji:\n\n";
 			 /* algorytm transpozycji */ 
  				transpozycja(tab, n);
  	
  	
 			 /* wyświtlamy zawartość tablicy po transpozycji*/
  				if(valid_second && valid_first)
  				{
				  
				  wyswietl_tab(tab, n); 
  				}	else cout << "Nie wypelniles sekcji 2 \n";   
  				cout << "\n";
  			break;
  			case 5:
                   exit(0);
			break;
		
  			default: cout << endl << "Wybrales liczbe, ktora nie jest dostepna w menu !!! \n\n Wybierz inna... \n\n";
        
  	}	
      
  			getchar();getchar();
		    system("cls");
   	 
   	 	

  			
 		   
 		  
    
    
  
  return 0;
}
}

// funkcje

void wyswietl_tab(float **tab, int n)
{
int i, j;
  for( i = 0; i < n; i++)
      { 
        for( j = 0; j < n; j++)
            cout << "   " << setw( 3 ) << *(*(tab+i)+j); //tab[i][j];
        cout << "\n";
      } 
}

void transpozycja(float **tab, int n)
{
 float zm;
 int i, j; 
    
 for (i = 0; i < n-1; i++)
      for (j = i + 1; j < n; j++)
           {
            zm = *(*(tab+i)+j);                         //zm = tab[i][j];                            
            *(*(tab+i)+j) = *(*(tab+j)+i);              //tab[i][j] = tab[j][i];
            *(*(tab+j)+i) = zm;                         //tab[j][i] = zm;
           }
}
0

Nie przechodzi, ponieważ działa to mniej więcej tak.

  1. User wypełnia case 1, nie ma tam breaka, po nim wykonuje sie case 2, break przerywa switcha, i następnie wykonują sie funkcje 2x
getchar()

oraz system("cls");

.
Wniosek.
Zapakuj switcha w pętle, tylko boole wywal POZA pętle :)
0

hmm ok ok, rozumiem. Dzięki. Zaraz popoprawiam i dam znać jaki będzie kolejny problem.

0

Więc tak, myślę, że w ogóle to ze sobą nie współpracuje, program nadal kończy się na case 1, mimo iż jest w pętli. Ponadto zastosowałem funkcję warunkową jak mówiłeś wcześniej i nadal nic...
PS kurde już mnie to totalnie irytuję 6 dni i nadal jestem w punkcie wejścia...

#include <cstdlib>
#include <iostream>
#include <iomanip> 
#include <conio.h>
#include <stdio.h>

using namespace std;

/* przykład: transpozycja tablicy dwuwymiarowej, kwadratowej */

void transpozycja(float **tab, int n);
void wyswietl_tab(float **tab, int n);
int wybor;

int main(void)
{ 

	
	  	int n, i, j;  
  		char znak;
  	/*	cout<<"Liczba wierszy: "; cin>>n;
          float **tab = new float *[n];
  		for(i=0;i<n;i++) 
     		tab[i] = new float [n]; */
  {
  //	cout<<"Wprowadz elementy wierszy oddzielone spacja: "<< endl;
  		
  	//  		for(i=0;i<n;i++)
  	  //  	for(j=0;j<n;j++) 
  		//  cin>>tab[i][j];
 			float **tab = new float *[n];
  			for(i=0;i<n;i++) 
     		tab[i] = new float [n];
     		
     		
     		for(i=0;i<n;i++)
  	    	for(j=0;j<n;j++)
	 	cout <<" Wybierz opcje - wpisujac odpowiednia cyfre  \n\n";
	 	cout <<" 1 to - Liczba wierszy \n\n" ;
	 	cout <<" 2 to - Wprowadz elementy wierszy oddzielone spacja:\n\n";
	 	cout <<"pozycja 1 i 2, jest OBOWIAZKOWA!!! \n\n";
	 	cout << "3 to - Zawartosc tablicy przed transpozycja:\n\n";
	 	cout << "4 to - Zawartosc tablicy po transpozycji:\n\n";
	 	cout << "5 to - Wyjscie z programu \n\n";
     	cout << "Wybieram z menu liczbe  "; cin >> wybor;    
 	
		bool valid_first, valid_second;
		valid_first = 0;
		valid_second = 0;
		
		for ( ; ; )
		{
	    switch (wybor)
  		{   
		  	case 1: 
		  	 cout<<"Liczba wierszy: "; cin>>n;
      			valid_first = true ;
          	break;
      		case 2:
				
				cout <<"Wprowadz elementy wierszy oddzielone spacja: "<< endl;
  				cin>>tab[i][j];
       			valid_second = true;
      			
      		break;  
      		
  			case 3: 
			  {
			  cout << "Zawartosc tablicy przed transpozycja:\n\n";
    
  					/* wyświtlamy zawartość tablicy */
  		    	 
					// transponujesz jesli warunek spelniony
					if(valid_second && valid_first)
					{
					 		wyswietl_tab(tab, n);
						}	
					else cout << "Nie wypelniles sekcji 1 \n";    
			}
  			break;
  			case 4: cout << "\nZawartosc tablicy po transpozycji:\n\n";
 			 /* algorytm transpozycji */ 
  				transpozycja(tab, n);
  	
  	
 			 /* wyświtlamy zawartość tablicy po transpozycji*/
  				if(valid_second && valid_first)
  				{
				  
				  wyswietl_tab(tab, n); 
  				}	else cout << "Nie wypelniles sekcji 2 \n";   
  				cout << "\n";
  			break;
  					
  			default: cout << endl << "Wybrales liczbe, ktora nie jest dostepna w menu !!! \n\n Wybierz inna... \n\n";
        
  	}	
      
  			getchar();   	 
   	 	
			
			}
  		return 0;
 		  
    
    
  
  
}
}

// funkcje

void wyswietl_tab(float **tab, int n)
{
int i, j;
  for( i = 0; i < n; i++)
      { 
        for( j = 0; j < n; j++)
            cout << "   " << setw( 3 ) << *(*(tab+i)+j); //tab[i][j];
        cout << "\n";
      } 
}

void transpozycja(float **tab, int n)
{
 float zm;
 int i, j; 
    
 for (i = 0; i < n-1; i++)
      for (j = i + 1; j < n; j++)
           {
            zm = *(*(tab+i)+j);                         //zm = tab[i][j];                            
            *(*(tab+i)+j) = *(*(tab+j)+i);              //tab[i][j] = tab[j][i];
            *(*(tab+j)+i) = zm;                         //tab[j][i] = zm;
           }
}
0

Nie kończy sie na case 1, tylko wczytujesz zmienną wybor tylko raz, poza pętlą, i w każdej iteracji wykonuje sie case 1.

0

No tak owszem, tuż po wpisaniu danych, program stoi. I dalej nic się nie dzieje

0

hmm ma ktoś jeszcze jakieś pomysły?

0

Gdy nic innego nie pomaga, zawsze można zwrócić się do swojego przyjaciela debuggera.

0

Masz wyżej napisane dlaczego program stoi..
Nie wczytujesz danych w pętli tylko poza nią.

0

To już wiem, ale nie potrafię tego zrobić.. bo tego nie rozumiem...

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