Twoje Centrum Szkoleniowe

Nauczmy się dziś czegoś nowego!

Kurs programowania - C++

C++: Instrukcja switch

Instrukcja switch w C++ jest strukturą kontrolną, która pozwala wykonywać różne bloki kodu w zależności od wartości zmiennej. Jest to alternatywa dla wielokrotnego używania instrukcji if-else, pozwalając na bardziej uporządkowane i czytelne zarządzanie wieloma ścieżkami wykonania. 

 

Składnia instrukcji switch

switch (wyrażenie) {
    case wartość1:
        // blok kodu do wykonania, gdy wyrażenie == wartość1
        break;
    case wartość2:
        // blok kodu do wykonania, gdy wyrażenie == wartość2
        break;
    ...
    default:
        // blok kodu do wykonania, gdy żaden inny przypadek nie pasuje
}

W powyższej strukturze, switch ocenia wyrażenie i porównuje jego wartość z każdym przypadkiem (case). Gdy wartość wyrażenia zgadza się z wartością określoną w case, odpowiedni blok kodu zostaje wykonany. Kluczowe słowo break na końcu każdego przypadku zapobiega tzw. "przez przypadkowości" (fall-through), czyli przejściu do kolejnego przypadku bez oceny jego warunku.

Każda instrukcja switch może zawierać również przypadek default, który jest wykonywany, gdy żaden z przypadków case nie pasuje do wartości wyrażenia. Przypadek default jest opcjonalny, ale często stosowany do obsługi nieoczekiwanych wartości wyrażenia.

 

Przykłady wykorzystana instrukcji switch
int numerDnia = 3;
switch (numerDnia) {
    case 1:
        cout << "Poniedziałek";
        break;
    case 2:
        cout << "Wtorek";
        break;
    case 3:
        cout << "Środa";
        break;
    // ...
}

Zmienna numerDnia ma wartość 3. Instrukcja switch przyjmuje jako warunek wartość tej zmiennej, następnie sprawdza, czy pasuje ona do któregoś z przypadków (case). Wartość ta jest kolejno porównywana z każdym przypadkiem. Gdy porównywane wartości będą sobie równe, wykonane zostaną instrukcje z danego case. W naszym przypadku, jako iż w warunku była wartość 3, wypisany na ekran zostanie komunikat o treści: Środa. Instrukcja break zapobiega wykonaniu kodu z kolejnego przypadku.

Kolejny przypadek związany będzie z ocenami uzyskiwanymi w Stanach Zjednoczonych.

char ocena = 'B';
switch (ocena) {
    case 'A':
        cout << "Doskonała!";
        break;
    case 'B':
    case 'C':
        cout << "Dobra!";
        break;
    case 'D':
        cout << "Zadowalająca.";
        break;
    case 'F':
        cout << "Niezaliczony.";
        break;
    default:
        cout << "Nieprawidłowa ocena.";
}

Przykład ilustruje, że przypadki (case) nie muszą koniecznie być liczbami. Tutaj, dla ocena równego 'B', wyświetlony zostanie tekst "Dobra!". Zauważ, że przypadki 'B' i 'C' mają wspólny blok kodu, co jest przykładem grupowania przypadków.

 

Default

Jeśli switch obsługuje zmienną, która teoretycznie może przyjąć wartości poza zdefiniowanymi przypadkami case, zaleca się dodanie default. Jest to opcja obsługująca nieprzewidzianą wartość. 

switch (dniTygodnia) {
    case 1: cout << "Poniedziałek"; break;
    case 2: cout << "Wtorek"; break;
    // ... inne przypadki
    default: cout << "Nieprawidłowy dzień tygodnia";
}

Zakładając, że użytkownik wprowadza wartość zmiennej dniTygodnia z powyższego przykładu, możemy przypuszczać, że wpiszę liczbę od 1 do 7. Warto jednak założyć, że celowo lub nie, może popełnić błąd. Jeżeli wpisze prawidłową liczbę, wypisany zostanie komunikat z odpowiadającym jej dniem tygodnia, w przeciwnym razie, komunikat o błędzie: Nieprawidłowy dzień tygodnia.

 

switch (kodOdpowiedziSerwera) {
    case 200: cout << "OK"; break;
    case 404: cout << "Nie znaleziono"; break;
    // ... inne kody odpowiedzi
    default: cout << "Nieznany kod odpowiedzi";
}

Kolejny przykład pokazuję obsługę uzyskanego z serwera kodu odpowiedzi. W przypadku obsługiwanych kodów, jak 200 czy 404 zostanie wypisany stosowny komunikat z opisem tego kodu. Natomiast w przypadku nieobsługiwanego kodu odpowiedzi wyświetlony zostanie domyślny komunikat, o tym, że jest on nieznany.

 

Zagnieżdżanie switch

Podobnie, jak miało to miejsce w instrukcji warunkowej if, instrukcję switch można zagnieżdżać. Zagnieżdżanie instrukcji switch pozwala na tworzenie wielopoziomowych struktur decyzyjnych, gdzie decyzje na jednym poziomie prowadzą do kolejnych zestawów decyzji.

int kategoria = 1;
int podkategoria = 2;

switch (kategoria) {
    case 1:
        switch (podkategoria) {
            case 1:
                cout << "Kategoria 1, Podkategoria 1";
                break;
            case 2:
                cout << "Kategoria 1, Podkategoria 2";
                break;
        }
        break;
    case 2:
        // Inne przypadki dla kategorii 2
        break;
}

 

Typowe błędy w użyciu instrukcji switch

  1. Brak break: Jednym z najczęstszych błędów jest pominięcie break na końcu każdego przypadku case, co prowadzi do nieoczekiwanego "przez przypadkowości" (fall-through).
  2. Niezgodność typów: Wartości w przypadkach case muszą być tego samego typu, co wyrażenie w switch. Użycie niezgodnych typów może prowadzić do błędów kompilacji.
  3. Zbyt złożone warunki: Próba użycia złożonych warunków w case jest błędem; case akceptuje tylko stałe wyrażenia.

 

Dobre praktyki w użyciu instrukcji switch

  1. Zawsze używaj break: Aby uniknąć niechcianego "przez przypadkowości", zawsze umieszczaj break na końcu każdego bloku case.
  2. Rozważ użycie default: Zawsze rozważ dodanie przypadku default do obsługi nieoczekiwanych wartości.
  3. Unikaj zagnieżdżania switch: Chociaż zagnieżdżanie jest możliwe, zbyt duża ilość zagnieżdżonych instrukcji switch może uczynić kod trudnym do zrozumienia i utrzymania.
  4. Ogranicz liczbę przypadków case: Zbyt wiele przypadków w jednej instrukcji switch może sprawić, że stanie się ona zbyt skomplikowana. W takich przypadkach rozważ refaktoryzację kodu lub użycie innych struktur decyzyjnych.
  5. Zachowaj spójność i czytelność: Formatuj i dokumentuj swój kod switch tak, aby był łatwy do zrozumienia i utrzymania.

 

Testy przypięte do lekcji
Aby uzyskać dostęp do testów i ćwiczeń interaktywnych - Zaloguj się
Aby widzieć ocenę lekcji - Zaloguj się