Ponowny wybór opcji, instrukcja switch

Odpowiedz Nowy wątek
2015-01-10 15:18
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;
        }
    }
} 

Pozostało 580 znaków

2015-01-10 15:47
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;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Mam Twoją zgodę na wykorzystywanie tego kodu, modyfikowanie itp? - stryku 2015-01-13 23:34
To nie jest kod tylko fragment demonstrujący użycie struktur. Wg mnie cokolwiek znajdziesz na forum publicznym możesz używać jak tylko zechcesz nie pytając nikogo o zgodę. - _13th_Dragon 2015-01-13 23:39
Przyjąłem. Bez odbioru - stryku 2015-01-14 00:09

Pozostało 580 znaków

2015-01-10 17:04
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 ;)

Pozostało 580 znaków

2015-01-10 17:48
Elga
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)".

Pozostało 580 znaków

2015-01-10 20:53
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-10 22:03
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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