משפט switch
שרשורי else if
נניח שיש לנו בתוכנית משתנה כלשהו שערכו הוא בחירה כלשהי מתוך קבוצה סופית. למשל - משתנה char grade, שערכו יכול להיות כל אות מ-A ועד F ומייצג ציון במבחן. נניח שנרצה להדפיס הודעה כלשהי בהתאם לציון המתקבל. יתכן ונכתוב תוכנית שנראת כך:
#include <stdio.h>
int main() {
char grade;
scanf("%c", &grade);
if (grade == 'A') {
printf("Excellent!\n");
} else if (grade == 'B') {
printf("Good job\n");
} else if (grade == 'C') {
printf("Fair\n");
} else if (grade == 'D') {
printf("Needs improvement\n");
} else if (grade == 'F') {
printf("Failed\n");
} else {
printf("Invalid grade\n");
}
}
שרשורי else if ארוכים מסוג זה הם קשים לקריאה, קשים לכתיבה וקל לעשות בהם טעויות. כאשר נרצה לבדוק האם משתנה כלשהו שווה לאחד מבין מספר ערכים שונים, נשתמש בו.
דוגמת הציונים תכתב כך בשימוש במשפט switch:
#include <stdio.h>
int main() {
char grade;
scanf("%c", &grade);
switch (grade) {
case 'A':
printf("Excellent!\n");
break;
case 'B':
printf("Good job\n");
break;
case 'C':
printf("Fair\n");
break;
case 'D':
printf("Needs improvement\n");
break;
case 'F':
printf("Failed\n");
break;
default:
printf("Invalid grade\n");
}
}
נפרק:
- המשפט מתחיל ב-
switch(x), כאשרxהוא המשתנה שנרצה לבדוק שוויון שלו לערכים אחרים. - לאחר מכן מגיעה רשימה של מקרים שונים עם מילת המפתח
caseבתחילתן, נקודתיים ואז בלוק קוד. - בסוף כל בלוק קוד מופיעה מילת המפתח
breakשמסמנת את סוף הבלוק. - ניתן לספק קטע קוד דיפלוטיבי
defaultהמתבצע במידה ואף אחד מה-cases לא התאמת על המשתנה מעליו ביצענוswitch.
לסיכום, הסינטקס עבור משפט switch נראה כך:
switch (value) {
case case1:
// Body if case1
break;
case case2:
// Body if case2
break;
// Add more cases if needed
case default:
// Body if no other case
}
לפעמים לא מזיחים את קטעי הקוד על מנת לקצר, וזה נראה כך:
switch (day) {
case 1: printf("Monday\n"); break;
case 2: printf("Tuesday\n"); break;
case 3: printf("Wednesday\n"); break;
case 4: printf("Thursday\n"); break;
case 5: printf("Friday\n"); break;
case 6: printf("Saturday\n"); break;
case 7: printf("Sunday\n"); break;
default: printf("Invalid day\n");
}
כרגיל, הקומפיילר מתעלם מרווחים ושורות, ולכן אין חובה לרדת שורה לאחר ה-case או לפני ה-break, כך שניתן לייצר משפטים קצרים ופשוטים. ניתן גם להקיף כל case ב-{} במידה ורוצים להיות יותר ברורים.
כדוגמא נוספת, נשכתב את המחשבון שלנו לשימוש ב-switch:
#include <stdio.h>
int main() {
char op;
double a, b;
printf("Enter an operator (+, -, *, /, %%, ^): ");
scanf(" %c", &op);
printf("Enter two numbers: ");
scanf("%lf %lf", &a, &b);
switch (op) {
case '+':
printf("Result = %.2f\n", a + b);
break;
case '-':
printf("Result = %.2f\n", a - b);
break;
case '*':
printf("Result = %.2f\n", a * b);
break;
case '/':
if (b != 0) {
printf("Result = %.2f\n", a / b);
} else {
printf("Error: division by zero\n");
}
break;
default:
printf("Unknown operator\n");
}
}
Note
על מנת לוודא שכל
caseמתבצע רק פעם אחת, חובה לכתובbreakבסוף כל בלוק. במידה ולא נעשה זאת, התוכנית תמשיך לביצוע ה-caseהבא אחריו, שזו בדרך כלל לא ההתנהגות הרצויה. עם זאת, זו תכונה שיכולה להיות שימושית - למשל כאשר נרצה להגדיר כמה בלוקים שיבצעו את אותה הפעולה, כמו בדוגמא הבאה:
#include <stdio.h>
int main() {
int month;
printf("Enter month (1–12): ");
scanf("%d", &month);
switch (month) {
case 2:
printf("28 or 29 days\n");
break;
case 4:
case 6:
case 9:
case 11:
printf("30 days\n");
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("31 days\n");
break;
default:
printf("Invalid month\n");
}
return 0;
}