Ponowny wybór opcji, instrukcja switch

0

Na wstępie chciałbym się przywitać, więc - siemanko wszystkim ;)

Od niedawna uczę się programowania w c++ i natrafiłem na problem w moim kodzie. Program ma wyświetlać opcje wyboru, po czym po wybraniu odpowiedniej pokazać kolejne opcje, w tym opcję powrotu. Problem polega na tym, że po wybraniu opcji i powrocie nie mogę ponownie wybrać innej. Wygląda to mniej więcej tak:

Wybierz opcję:
1
2
: wybieram 2

Wybierz podopcje:
1
2
0 - powrot
: Wybieram 0

ponownie wybierz opcje:
1
2

i w tym momencie co bym nie wpisał, ciągle każe mi wybrać opcję. Powstała jakaś pętla, ale nie mogę znaleźć błędu. Dodam tylko, że ten problem występuje tylko na poziomie pierwszym. Kiedy wybiorę opcję na poziomie 2-gim i 3-cim, bez problemu wraca do poz. 2 i wchodzi w inne opcje do poziomu 3.

Mam nadzieję, że w miarę jasno to opisałem :D

oto kod:

#include <iostream>
using namespace std;

main ()
{
	int d=1, d2=1, d3=1;
	
	while (d)
	{
		cout << "Marka:" << endl << "BMW - 1" << endl << "Opel - 2" << endl << "Koniec - 0" << endl;
		cout << "Podaj numer: ";
		cin >> d;
		cout << endl << endl;
		
		switch (d)
		{
			case 1:
				while (d2)
				{
					cout << "E39 - 1" << endl << "E46 - 2" << endl << "Powrot - 0" << endl;
					cout << "Podaj numer: ";
					cin >> d2;
					cout << endl << endl;
					
					switch (d2)
					{
						case 1:
							cout << "E39 sratatata" << endl << endl;
							cout << "Powrot - 0" << endl << "Koniec - 1" << endl;
							cout << "Podaj numer: ";
							cin >> d3;
							cout << endl << endl;
							break;
							
						case 2:
							cout << "E46 sratatata" << endl << endl;
							cout << "Powrot - 0" << endl << "Koniec - 1" << endl;
							cout << "Podaj numer: ";
							cin >> d3;
							cout << endl << endl;
							break;
							
						default:
							if (d2!=0)
							{
								cout << "Brak opcji: " << d2 << endl << endl;
							}
							else
							{
								cout << endl << endl;
							}
							break;
					}
				}
				break;
				
			case 2:
				while (d2)
				{
					cout << "Astra - 1" << endl << "Omega - 2" << endl << "Powrot - 0" << endl;
					cout << "Podaj numer: ";
					cin >> d2;
					cout << endl << endl;
					
					switch (d2)
					{
						case 1:
							cout << "Astra sratatata" << endl << endl;
							cout << "Powrot - 0" << endl << "Koniec - 1" << endl;
							cout << "Podaj numer: ";
							cin >> d3;
							cout << endl << endl;
							break;
							
						case 2:
							cout << "Omega sratatata" << endl << endl;
							cout << "Powrot - 0" << endl << "Koniec - 0" << endl;
							cout << "Podaj numer: ";
							cin >> d3;
							cout << endl << endl;
							break;
							
						default:
							if (d2!=0)
							{
								cout << "Brak opcji: " << d2 << endl << endl;
							}
							else
							{
								cout << endl << endl;
							}
							break;
					}
				}
				break;
				
			default:
				if (d!=0)
				{
					cout << "Brak opcji: " << d << endl << endl;
				}
				else
				{
					cout << "Nacisnij dowolny klawisz..." << endl;
				}				
				break;
		}
	}
} 
3

Może zrób uniwersalne menu, jedno na wszystko:

#include <iostream>
using namespace std;

struct SharedData
  {
   
  };

typedef void Execute(SharedData &sd,int opt); // deklaracja funkci wykonującej menu

struct Menu
  {
   const char *text; // tekst menu
   Menu *menu; // podmenu
   Execute *exec; // funkcja wykonująca polecenie menu
   int opt; // ewentualny parametr
  };
 
void RunMenu(const char *name,Menu *menu,SharedData &sd) // funkcja obslugujaca menu
  {
   unsigned nr,w;
   int ret;
   Menu *tmp;
   for(;;)
     {

      printf("-- %s:\n",name);
      for(nr=1,tmp=menu;(tmp->menu!=NULL)||(tmp->exec!=NULL);++nr,++tmp)
        {
         printf("%d. %s\n",nr,tmp->text);
        }
      printf("0. %s\nWybierz opcje: ",tmp->text);
      ret=scanf("%u",&w);
      while(getchar()!='\n') {}
      if((ret==1)&&(w<nr))
        {
         tmp=menu+(w+nr-1)%nr;
         if(tmp->menu)
           {
            printf("\n");
            RunMenu(tmp->text,tmp->menu,sd);
           }
         else if(tmp->exec)
           {
            printf("\n");
            tmp->exec(sd,tmp->opt);
           }
         else break;         
        }
      else printf("blad: nalezy wpisac jeden z numerkow menu\n");
      printf("\n");
     }
  }

void SortExec(SharedData &,int opt)
  {
   cout<<"REALIZACJA: Sortowanie wg "<<(char)('A'+opt)<<endl<<endl;
  }

void FindExec(SharedData &,int opt)
  {
   cout<<"REALIZACJA: Szukaj wg "<<(char)('A'+opt)<<endl<<endl;
  }

void AddExec(SharedData &,int)
  {
   cout<<"REALIZACJA: Dodaj"<<endl<<endl;
  }

void ShowExec(SharedData &,int)
  {
   cout<<"REALIZACJA: Przegladaj"<<endl<<endl;
  }

void SaveExec(SharedData &,int)
  {
   cout<<"REALIZACJA: Zapisz"<<endl<<endl;
  }

void DeleteExec(SharedData &,int)
  {
   cout<<"REALIZACJA: Usun"<<endl<<endl;
  }

void LoadExec(SharedData &,int)
  {
   cout<<"REALIZACJA: Wczytaj"<<endl<<endl;
  }

Menu Sort[]=
  {
   {"Sortowanie wg A",NULL,SortExec,0},
   {"Sortowanie wg B",NULL,SortExec,1},
   {"Sortowanie wg C",NULL,SortExec,2},
   {"Powrot",NULL,NULL,0},
  };

Menu Find[]=
  {
   {"Szukaj wg A",NULL,FindExec,0},
   {"Szukaj wg B",NULL,FindExec,1},
   {"Szukaj wg C",NULL,FindExec,2},
   {"Powrot",NULL,NULL,0},
  };

Menu Main[]=
  {
   {"Dodaj",NULL,AddExec,0},
   {"Przegladaj",NULL,ShowExec,0},
   {"Zapisz",NULL,SaveExec,0},
   {"Sortuj",Sort,NULL,0},
   {"Szukaj",Find,NULL,0},
   {"Usun",NULL,DeleteExec,0},
   {"Wczytaj",NULL,LoadExec,0},
   {"Koniec",NULL,NULL,0},
  };

int main()
  {
   SharedData sd;
   RunMenu("Menu glowne",Main,sd);
   return 0;
  }
0

Dzięki, ale do etapu pisania takich kodów jeszcze nie doszedłem, więc jeszcze trochę z tego nie rozumiem :D a chciałbym się skupić na dopracowaniu i nauczeniu korzystania z tych fukncji, które już poznałem zanim pójdę dalej. Tak czy inaczej na pewno skorzystam z twojego kodu :P

Jednak pytanie nadal aktualne ;)

0

W drugiej pętli zapisujesz do zmiennej d2 wartość 0 (powrót), przez to za drugim razem, druga pętla nigdy się nie wykona "while(d2)".

0

No więc odłóż ten projekt do momentu jak poznasz for, struktury i funkcje.

0

Dzięki za pomoc, temat można zamknąć ;)

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