O instrucțiune switch este un mecanism puternic de control al fluxului în programarea C, care vă permite să executați diferite blocuri de cod pe baza valorii unei singure expresii. Oferă o alternativă mai elegantă și mai eficientă la lanțurile lungi de instrucțiuni if-else atunci când trebuie să comparați o variabilă cu mai multe valori posibile.
switch (expression) { case constant1: // code block 1 break; case constant2: // code block 2 break; default: // default code block break; }
Execuția unei instrucțiuni switch urmează un model specific:
- Expresia dintre paranteze este evaluată o dată
- Valoarea este comparată cu fiecare constantă de caz
- Dacă se găsește o potrivire, se execută blocul de cod corespunzător
- Instrucțiunea break iese din structura switch
- Dacă nu se găsește nicio potrivire, se execută cazul implicit (dacă este prezent)
- Lizibilitate îmbunătățită în comparație cu mai multe declarații if-else
- Performanță mai bună pentru mai multe condiții
- Structură de cod mai curată
- Întreținere mai ușoară
- Compilare mai eficientă în majoritatea cazurilor
Declarațiile Switch sunt deosebit de utile în mai multe scenarii:
- Programe bazate pe meniu
- Mașini de stat
- Procesarea comenzilor
- Validarea intrărilor
- Dezvoltarea jocului (stări de caractere, niveluri de joc)
Să ne uităm la un exemplu practic de program bazat pe meniu:
#includeint main() { int choice; printf("Select an option:n"); printf("1. View balancen"); printf("2. Deposit moneyn"); printf("3. Withdraw moneyn"); printf("4. Exitn"); scanf("%d", &choice); switch(choice) { case 1: printf("Your balance is $1000n"); break; case 2: printf("Enter amount to depositn"); break; case 3: printf("Enter amount to withdrawn"); break; case 4: printf("Thank you for using our servicen"); break; default: printf("Invalid optionn"); } return 0; }
- Expresia de comutare trebuie să fie evaluată la un tip integral (int, char, short, long)
- Etichetele cazului trebuie să fie constante de timp de compilare
- Etichetele de caz trebuie să fie unice
- Cazul implicit este opțional
- Sunt permise mai multe declarații per caz
- Includeți întotdeauna un caz implicit
- Folosiți în mod consecvent declarațiile de pauză
- Grupați cazurile conexe
- Păstrați carcasele scurte și concentrate
- Folosiți constante sau enumerări semnificative pentru etichetele de caz
- Uitând declarațiile de pauză
- Folosind etichete de caz neconstante
- Încercarea de a utiliza numere în virgulă mobilă
- Valori de caz duplicate
- Expresii complexe în declarațiile case
Exemplu de bază
#includeint main() { char grade="B"; switch(grade) { case 'A': printf("Excellent!n"); break; case 'B': printf("Good job!n"); break; case 'C': printf("Fair resultn"); break; case 'F': printf("Try againn"); break; default: printf("Invalid graden"); } return 0; }
Exemplu de cazuri multiple
#includeint main() { int day = 2; switch(day) { case 1: case 2: case 3: case 4: case 5: printf("Weekdayn"); break; case 6: case 7: printf("Weekendn"); break; default: printf("Invalid dayn"); } return 0; }
Încercați să rezolvați această problemă:
Creați o instrucțiune switch care convertește un număr (1-12) în numele lunii corespunzătoare.
Faceți clic pentru a vedea soluția
Iată soluția:
#includeint main() { int month = 3; switch(month) { case 1: printf("Januaryn"); break; case 2: printf("Februaryn"); break; case 3: printf("Marchn"); break; case 4: printf("Apriln"); break; case 5: printf("Mayn"); break; case 6: printf("Junen"); break; case 7: printf("Julyn"); break; case 8: printf("Augustn"); break; case 9: printf("Septembern"); break; case 10: printf("Octobern"); break; case 11: printf("Novembern"); break; case 12: printf("Decembern"); break; default: printf("Invalid monthn"); } return 0; }
- Declarațiile Switch oferă o modalitate curată de a gestiona mai multe condiții
- Folosiți întotdeauna instrucțiunile break, cu excepția cazului în care se intenționează căderea
- Cazurile trebuie să utilizeze expresii constante
- Includeți un caz implicit pentru tratarea erorilor
- Gruparea cazurilor conexe pentru o mai bună organizare
-
Î: Pot folosi șiruri în instrucțiunile switch? R: Nu, instrucțiunile C switch funcționează numai cu tipuri integrale.
-
Î: Ce se întâmplă dacă uit o declarație de pauză? R: Codul va „cădea” în cazul următor, executând toate cazurile ulterioare până când se întâlnește o întrerupere.
-
Î: Pot folosi variabile ca etichete de caz? R: Nu, etichetele cazului trebuie să fie constante de timp de compilare.
-
Î: Este comutarea mai rapidă decât dacă-altfel? R: În general, da, mai ales când se confruntă cu mai multe condiții.
-
Î: Pot folosi mai multe cazuri implicite? R: Nu, este permis un singur caz implicit pentru fiecare instrucțiune switch.