תכנות בשפת סי מצביעים לפונקציות.PPTX
Document Details
Uploaded by VivaciousIntelligence8925
Related
- PCSII Depression/Anxiety/Strong Emotions 2024 Document
- A Concise History of the World: A New World of Connections (1500-1800)
- Human Bio Test PDF
- University of Santo Tomas Pre-Laboratory Discussion of LA No. 1 PDF
- Vertebrate Pest Management PDF
- Lg 5 International Environmental Laws, Treaties, Protocols, and Conventions
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