השוואה גנרית
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 52 מתוך 61.
פונקציות גנריות כמו qsort ו-bsearch בספרייה הסטנדרטית של C זקוקות לדרך להשוות בין איברים בלי לדעת מהם הטיפוסים שלהם. הפתרון הוא פונקציית השוואה: פונקציה שכותבים, והאלגוריתם הגנרי קורא לה בכל פעם שהוא צריך להשוות בין שני פריטים.
החתימה הסטנדרטית של פונקציות השוואה היא:
int compare(const void* a, const void* b);שני הפרמטרים הם const void*, כי הפונקציה הגנרית לא יודעת איזה סוג נתונים את/ה ממיין/ת. ערך ההחזרה פועל לפי מוסכמה מסוימת:
| ערך החזרה | משמעות |
|---|---|
| שלילי | a מופיע לפני b |
| אפס | a שווה ל־b |
| חיובי | a מופיע אחרי b |
בתוך פונקציית ההשוואה שלך, אתה ממיר את המצביעים void* לסוג בפועל ומשווה בין הערכים. כך משווים מספרים שלמים:
int compare_ints(const void* a, const void* b) {
int val_a = *(const int*)a;
int val_b = *(const int*)b;
return val_a - val_b;
}שיטת החיסור עובדת היטב עם מספרים שלמים: אם a קטן יותר, התוצאה שלילית; אם הוא שווה, התוצאה אפס; ואם הוא גדול יותר, התוצאה חיובית. כעת אפשר להעביר את הפונקציה הזו אל qsort כדי למיין מערך של מספרים שלמים בסדר עולה.
אתגר
קלכתבו פונקציה compare_ints שמשווה בין שני מספרים שלמים לפי המוסכמה הסטנדרטית של פונקציות השוואה, שבה משתמשים אלגוריתמים גנריים כמו qsort.
על הפונקציה להשוות בין שני הערכים ולהחזיר תוצאה המציינת את סדרם היחסי.
מוסכמת ערך ההחזרה:
- החזירו ערך שלילי אם המספר השלם הראשון מופיע לפני השני (first < second)
- החזירו אפס אם שני המספרים השלמים שווים
- החזירו ערך חיובי אם המספר השלם הראשון מופיע אחרי השני (first > second)
פרמטרים:
a(int): המספר השלם הראשון להשוואהb(int): המספר השלם השני להשוואה
ערך מוחזר: מספר שלם המציין את הסדר: שלילי אם a < b, אפס אם a == b, חיובי אם a > b.
רמז: טריק החיסור מהשיעור מספק פתרון אלגנטי בשורה אחת.
נסו בעצמכם
int compare_ints(int a, int b) {
// כתבו כאן את הקוד
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין