Switch w switchu

0

Witam wszsytkich.

Mam pytanko w postaci, czy można użyć switcha w switchu, na przykład:

cout << "Lista opcji:";
cout << "1. Cwiczenia na plikach";
cout << "2. Dzialania matematyczne";
cout << "3. Sortownia";
cout << "4. Wyznaczanie max i min ze zbioru";
 
cin >> wybor;

switch(wybor)
{
(1)  case 1:
        cout << "Cwiczenia na plikach:";
        cout << "1. Utworzenie pliku";
        cout << "2. Usuniecie pliku";
        cout << "3. Wypisanie liczby znakow w pliku tekstowym";
        cout << "4. Usuniecie danego znaku z tekstu";

      cin >> wybor1;
      
      switch(wybor1)
      {
(2)          case 1:
                cout << "Jakies dzialania";

Całego kodu nie wklejałem, gdyż tu mam kłopot. Czy jest w ogóle dopuszczalne używanie switcha w switchu, czy trzeba w inny sposób sobie poradzić?
Pojawia się błąd :
(1) - error: previously used here
(2) - error: duplicate case value

Z góry dziękuję za pomoc :)

0

Pokaż cały kod, pokaż błąd kompilacji i linijki w których jest. Switch w switchu to dopuszczalna konstrukcja.

0

Oto cały kod. Jeszcze nie do końca zaplanowany, ponieważ się na problemie ze switchem zatrzymałem.

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

bool menuGlowne()
{
    int wybor;
    system("cls");
    cout << "M E N U    G L O W N E" << endl;
    cout << "----------------------" << endl;
    cout << "1. Cwiczenia na plikach." << endl;
    cout << "2. Dzialania matematyczne." << endl;
    cout << "3. Sortowania." << endl;
    cout << "4. Wyznaczanie max i min" << endl;
    cout << "5." << endl;
    cout << "6." << endl;
    cout << "7." << endl;
    cout << "8." << endl;
    cout << "9." << endl;
    cout << endl << "Wybierz opcje: ";
    cin >> wybor;
    switch(wybor)
    {
    case 1:
        cout << "Cwiczenia na plikach" << endl;
        cout << "--------------------" << endl;
        cout << "1. Utworzenie pliku." << endl;
        cout << "1. Usuniecie pliku." << endl;
        cout << "1. Wypisanie liczby znakow w pliku tekstowym." << endl;
        cout << "1. Usuniecie danego znaku z tekstu." << endl;
        cout << "1. Powrot do Menu Glownego." << endl;
        int wybor1;
        cin >> wybor1;
        switch(wybor1);
        {
        case 1:
                cout << "Tutaj chcialem odssylac do poszczegolnych funkcji odpowiedzialnych za dzialania";
        break;
        }
    break;
    case 2:
        cout << "";
    break;
    case 3:
        cout << "";
    break;
    case 4:
        cout << "";
    break;
    case 5:
        cout << "";
    break;
    case 6:
        cout << "";
    break;
    case 7:
        cout << "";
    break;
    case 8:
        cout << "";
    break;
    case 9:
        return true;
    break;
    }

}
int main()
{
    cout << "Podstawy w c++" << endl << endl;
    system("pause");
    system("cls");

    bool done;
    do
    {
    done = menuGlowne();
    } while (done != true);

    return 0;
}

Oto błędy :
C:\c++@wlasne\wlasne\main.cpp: In function 'bool menuGlowne()':
C:\c++@wlasne\wlasne\main.cpp9: error: duplicate case value
C:\c++@wlasne\wlasne\main.cpp5: error: previously used here
Process terminated with status 1 (0 minute(s), 0 second(s))
2 error(s), 0 warning(s) (0 minute(s), 0 second(s))
W poprzednim poście zaznaczyłem linijki, w których są błędy jako (1) oraz (2).

2

Proszę, nie rób...
Widzę, że znasz już funkcje.
Więc użyj ich.

Twoje ograniczenie na najbliższe pół roku: funkcja nie powinna mieć więcej jak 10 linii kodu.
Protip: jedna odpowiedzialność, jedna funkcja.

3

switch(wybor1); tu nie może być średnika.

Poza tym to co próbujesz zrobić jest złe. Podziel to chociaż na funkcje.

0

Czyli Menu Główne i podmenu śmiało podzielić na funckje? Szczerze to myślałem, że im mniej funkcji tym lepiej :) Dostosuje się do ograniczeń związanych z 10 linijkami w funkcjach.

Tylko tak z czystej ciekawości, dlaczego nie działa to co napisałem? Gdzie dokładnie jest błąd, że nie mogę switcha w switchu zrobić?

0

Masakra :( Usunąłem średnik i działa :P Ale siara :P

Dziękuję za pomoc i poradę odnośnie ograniczenia funkcji do 10 linijek. NA pewno będę się jej trzymał.

3
switch(wybor1);

krótki ten switch :) (średnika w przykładzie nie pokazałeś).

switch w switchu to dopuszczalna konstrukcja z perspektywy gramatyki języka, ale jest równie pożądana jak używanie nagiego new i delete. Jak nie musisz to tego nie rób. A nie musisz.

2

Nie możesz deklarować zmiennych bezpośrednio wewnątrz switch, naprawa:

case 1:
   {
        cout << "Cwiczenia na plikach" << endl;
        cout << "--------------------" << endl;
        cout << "1. Utworzenie pliku." << endl;
        cout << "1. Usuniecie pliku." << endl;
        cout << "1. Wypisanie liczby znakow w pliku tekstowym." << endl;
        cout << "1. Usuniecie danego znaku z tekstu." << endl;
        cout << "1. Powrot do Menu Glownego." << endl;
        int wybor1;
        cin >> wybor1;
        switch(wybor1)
        {
        case 1:
                cout << "Tutaj chcialem odssylac do poszczegolnych funkcji odpowiedzialnych za dzialania";
        break;
        }
     }
    break;

Ale lepiej zrób to tak: http://4programmers.net/Forum/1100492

2
morti napisał(a):

Tylko tak z czystej ciekawości, dlaczego nie działa to co napisałem? Gdzie dokładnie jest błąd, że nie mogę switcha w switchu zrobić?

Przecież napisałem Ci. Nie może być średnika po wewnętrznym switch, bo to jest jego koniec. Po switch(...) musi być statement. Normalnie robi się compound statement czyli { ... }, a Ty po prostu go kończysz średnikiem (null statement). Wychodzą więc dwa case 1: w zewnętrznym switch.

0

Btw, nie masz default case, napraw to szybko bo mogą dziwne rzeczy się dziać.
Edit: może nie dziwne, ale warto to dodać.
6.8.4.2: [...] If no converted case constant expression matches and there is no default label, no part of the switch body is executed.

0

Jak coś poprawię, to postaram się podesłać do analizy, czy tak może być ;)

0

Troszkę poprawiłem.

Czy takie coś już jest poprawne i dopuszczalne?

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

int menuGlowne()
{
    int wybor;
    system("cls");
    cout << "M E N U    G L O W N E" << endl;
    cout << "----------------------" << endl;
    cout << "1. Cwiczenia na plikach." << endl;
    cout << "2. Sortowania." << endl;
    cout << "3. Koniec programu." << endl;
    cout << endl << "Wybierz opcje: ";
    cin >> wybor;
    return wybor;
}


int menuCwiczeniaNaPlikach()
{
    int wybor;
    system("cls");
    cout << "C W I C Z E N I A   N A   P L I K A C H" << endl;
    cout << "---------------------------------------" << endl;
    cout << "1. Dodaj plik." << endl;
    cout << "2. Usun plik." << endl;
    cout << "3. Powrot do Menu Glownego." << endl;
    cin >> wybor;
    return wybor;
}

int sortowania()
{
    int wybor;
    system("cls");
    cout << "S O R T O W A N I A" << endl;
    cout << "-------------------" << endl;
    cout << "1. Babelkowo." << endl;
    cout << "2. Quick sort." << endl;
    cout << "3. Powrot do Menu Glownego." << endl;
    cin >> wybor;
    return wybor;
}

void dodaniePliku()
{
    string nazwaPliku;
    cout << "Podaj nazwe pliku do utworzenia";
    cin >> nazwaPliku;
    ofstream plik(nazwaPliku.c_str());
}

void usunieciePliku()
{
    string nazwaPliku;
    cout << "Podaj nazwe pliku do usuniecia";
    cin >> nazwaPliku;
    remove(nazwaPliku.c_str());
}

int main()
{
    cout << "Podstawy w c++" << endl << endl;
    system("pause");
    system("cls");

    int koniec;
    int w1,w2;
    do
    {
    koniec = menuGlowne();

        if(koniec == 1)
        w1 = menuCwiczeniaNaPlikach();
        switch(w1)
        {
        case 1:
            dodaniePliku();
        break;
        case 2:
            usunieciePliku();
        break;
        case 3:
            menuGlowne();
        break;
        default:
        break;
        }

        if(koniec == 2)
        w2 = sortowania();
    /*  W tym miejscu będzie drugi switch i analogicznie kolejne */
    } while (koniec != 3);

    return 0;
}
1

dużo lepiej.
Teraz możesz uogólnić podmenu tak, aby mieć mniej kodu.

0

Mam jeszcze jedno pytanie. Co prawda tylko czytałem o programowaniu obiektowym, ale myślę, że to byłby dobry pomysł aby poćwiczyć. Czy mógłbym zrobić coś takiego ? :

Menu główne:

  1. Operacje na plikach
  2. Sortowania
  3. ...
  4. ...
  5. ...
  6. ...

I na przykład 1. operacje na plikach dać jako obiekt, bądź klasę ( proszę o wyrozumiałość, gdyż tylko czytałem o obiektówce ) i podmenu do danych punktów wyglądałoby tak:

Operacje na plikach:

  1. Dodanie pliku.
  2. Usunięcie pliku.
  3. ...
  4. Powrót do menu głównego

dać jako metody itp ?

Przy okazji mógłbym poćwiczyć podstawy z programowania obiektowego, tylko nie wiem czy to da się tak zrobić i czy ma to sens, czy lepiej bez obiektówki to rozwiązać? Prosiłbym o poradę w tej sprawie.

Dziękuję z góry :)

0

Ba nawet podałem jak to zrobić, z tym że nie wiedzieć czemu nie czytasz: http://4programmers.net/Forum/1100492
Jest to zrobione na strukturach i funkcjach ale po przerobieniu na klasy i metody też będzie działać dobrze.

0

Czyli muszę doczytać o strukturach. Dziękuję za informację :)

0

Myślisz o programowaniu obiektowym a jeszcze struktur nie przerobiłeś?

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