תכנות בשפת סי מצביעים לפונקציות.PPTX

Full Transcript

‫מצביעים לפונקציות‬ ‫תמר באש‬ ‫‪1‬‬ ‫מצביעים לפונקציות‬ ‫ עד כה יצרנו מצביעים לכתובות של משתנים‪.‬‬ ‫ בזיכרון המחשב מאוחסנים משתני התכנית אך‬ ‫גם הקוד שלה‪ ,‬ולכן לקטע בתכנית יש כתובת‬ ‫המייצגת אותו‪.‬‬ ‫ לפי זה‪ ,‬נוכל להגדיר מצב...

‫מצביעים לפונקציות‬ ‫תמר באש‬ ‫‪1‬‬ ‫מצביעים לפונקציות‬ ‫ עד כה יצרנו מצביעים לכתובות של משתנים‪.‬‬ ‫ בזיכרון המחשב מאוחסנים משתני התכנית אך‬ ‫גם הקוד שלה‪ ,‬ולכן לקטע בתכנית יש כתובת‬ ‫המייצגת אותו‪.‬‬ ‫ לפי זה‪ ,‬נוכל להגדיר מצביע השומר כתובת‬ ‫של פונקציה‪.‬‬ ‫‪2‬‬ ‫מצביעים לפונקציות‬ ‫ כמו במצביעים שראינו עד היום‪ ,‬כך גם מצביע‬ ‫לפונקציה לא יוכל להצביע לכל פונקציה‬ ‫אלא רק לפונקציה מטיפוס המתאים להגדרה‬ ‫שלו‪.‬‬ ‫ נבחר למצביע שם ונגדיר מה מקבלת ומה‬ ‫מחזירה הפונקציה שהוא מצביע עליה‪.‬‬ ‫‪3‬‬ ‫הגדרת מצביע לפונקציה‬ :‫ לדוגמה‬ int (*func_ptr)(int, int) ; int (*fp)(double, char*) ; 4 ‫ הפעלת פונקציה בעזרת‬- ‫דוגמה‬ ‫המצביע‬ void func(int a) { printf("Value of a is %d\n", a); } int main() { void (*func_ptr)(int) = func; // can add & func_ptr(7); // can add * return 0; } 5 ‫מערך של מצביעים לפונקציות‬ ‫ כפי שניתן להגדיר מערך של מצביעים רגילים‪,‬‬ ‫ניתן להגדיר מערך של מצביעים לפונקציות‪.‬‬ ‫ כל הפונקציות במערך חייבות להיות מאותו‬ ‫טיפוס‪.‬‬ ‫ לדוגמה‪:‬‬ ‫;} ‪void (*fun_ptr_arr[])(double, char) = { f1, f2, f3‬‬ ‫‪6‬‬ ‫דוגמה‬ #include void add(int a, int b) { printf("Addition is %d\n", a + b); } void subtract(int a, int b) { printf("Subtraction is %d\n", a - b); } void multiply(int a, int b) { printf("Multiplication is %d\n", a * b); } 7 ‫דוגמה‬ int main() { // fun_ptr_arr is an array of function pointers void (*fun_ptr_arr[])(int, int) = { add, subtract, multiply }; unsigned int ch, a = 15, b = 10; printf("Enter Choice: 0 for add, 1 for subtract and 2 for multiply\ n"); scanf("%d", &ch); if (ch > 2) return 0; (*fun_ptr_arr[ch])(a, b); return 0; } 8 ‫מטרת השימוש במצביעים‬ ‫לפונקציות‬ ‫ בדר"כ נשתמש במצביעים לפונקציות כדי‬ ‫לכתוב קוד כללי יותר‪ ,‬המאפשר הרחבה של‬ ‫התכנית בלי צורך לשנות את הקוד הקיים‪.‬‬ ‫ נניח שנרצה לכתוב פונקציה המדפיסה מערך‬ ‫בדרכים שונות‪ ,‬על פי בחירת המשתמש‪.‬‬ ‫ נוכל לממש זאת כך‪:‬‬ ‫‪9‬‬ ‫דוגמה – הדפסת מערך‬ #include #define SIZE 5 ‫נגדיר פורמטים שונים של‬ void printSpace(int num) { :‫הדפסה‬ printf("%d ", num); } void printNewLine(int num) { printf("%d\n", num); } void printHyphen(int num) { printf("-%d-", num); } 10 ‫דוגמה – הדפסת מערך‬ ‫נגדיר פונקציה המדפיסה לפי‬ :‫פורמט‬ void printArray(int* array, int size, void (*PrintFormat)(int)) { for (int i = 0; i < size; i++) PrintFormat(array[i]); printf("\n"); } 11 ‫דוגמה – הדפסת מערך‬ ‫נזמן את הדפסת המערך באופן‬ int main() { :‫שנבחר‬ int myArray[SIZE] = { 10, 20, 30, 40, 50 }; printf("Array printed with spaces:\n"); printArray(myArray, SIZE, printSpace); printf("Array printed with new lines:\n"); printArray(myArray, SIZE, printNewLine); printf("Array printed with hyphens:\n"); printArray(myArray, SIZE, printHyphen); return 0; } 12 ‫דוגמה – הדפסת מערך‬ ‫ בדוגמה שראינו‪ ,‬אם נרצה להוסיף פורמט‬ ‫חדש של הדפסה‪ ,‬נצטרך להוסיף פונקציית‬ ‫הדפסת איבר המתאימה לפורמט החדש‪.‬‬ ‫הפונקציה המדפיסה את המערך כולו תישאר‬ ‫ללא שינוי‪.‬‬ ‫‪13‬‬ ‫תרגיל – מיון מערך‬ ‫נניח שהגדרנו מבנה המייצג סטודנט‬ typedef struct { char name; int id; float gradeAverage; } student; ‫ומערך של סטודנטים‬ student arr[] = { {"John Doe", 3, 89.5}, {"Jane Smith", 1, 93.2}, {"Alice Jones", 2, 91.8} }; 14 ‫תרגיל – מיון מערך‬ ‫ נרצה לכתוב פונקציה הממיינת את המערך‬ ‫בדרכים שונות‪ :‬על פי שם הסטודנט‪ ,‬על פי‬ ‫ממוצע הציונים‪ ,‬מספרו הסידורי‪.‬‬ ‫‪15‬‬ ‫תרגיל – מיון מערך‬ void bubbleSort(student* arr, int n) ‫מה הבעיה‬ { int i, j; ?‫בפונקציה‬ for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // Swap arr[j] and arr[j+1] student temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ‫נרצה להגדיר מצביע לפונקציה שתדע להשוות תכונה‬ ‫ספציפית‬ 16 ‫תרגיל – מיון מערך‬ :‫פונקציית המיון‬ void bubbleSort(student* arr, int n, int (*compFunc)(student, student)) { int i, j; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (compFunc(arr[j], arr[j + 1]) > 0) { // Swap arr[j] and arr[j+1] student temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } 17 ‫תרגיל – מיון מערך‬ :‫פונקציות העזר למיון ספציפי‬ int compareByName(student a, student b) { return strcmp(a.name, b.name); } int compareById(student a, student b) { return a.id-b.id; } int compareByGrade(student a, student b) { if (a.gradeAverage < b.gradeAverage) return -1; else if (a.gradeAverage > b.gradeAverage) return 1; else return 0; } 18 ‫תרגיל – מיון מערך‬ :‫כעת נוכל לכתוב תכנית הממיינת את המערך בדרכים שונות‬ int main() { student arr[] = { {"John Doe", 3, 89.5}, {"Jane Smith", 1, 93.2}, {"Alice Jones", 2, 91.8} }; // Sort by name bubbleSort(arr, SIZE, compareByName); printf("Sorted by name: \n"); printArray(arr, SIZE); // Sort by ID bubbleSort(arr, SIZE, compareById); printf("Sorted by ID: \n"); printArray(arr, SIZE); // Sort by grade average bubbleSort(arr, SIZE, compareByGrade); printf("Sorted by grade average: \n"); printArray(arr, SIZE); return 0; } 19

Use Quizgecko on...
Browser
Browser