Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Studies

משפט 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");
    }
}

נפרק:

  1. המשפט מתחיל ב-switch(x), כאשר x הוא המשתנה שנרצה לבדוק שוויון שלו לערכים אחרים.
  2. לאחר מכן מגיעה רשימה של מקרים שונים עם מילת המפתח case בתחילתן, נקודתיים ואז בלוק קוד.
  3. בסוף כל בלוק קוד מופיעה מילת המפתח break שמסמנת את סוף הבלוק.
  4. ניתן לספק קטע קוד דיפלוטיבי 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;
}