המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

Computer Programming Fall 2012 תרגול 6 פונקציות

מצגות קשורות


מצגת בנושא: "Computer Programming Fall 2012 תרגול 6 פונקציות"— תמליל מצגת:

1 Computer Programming Fall 2012 תרגול 6 פונקציות
Introduction to C - Fall Amir Menczel

2 פונקציות פונקציות מאפשרות שימוש בקטעי קוד כקופסה שחורה ללא צורך לדעת את פרטי המימוש (מספיק לדעת מה עושה הפונקציה ולא איך). למשל: הפונקציה strlen מהתירגול הקודם. כתיבת פונקציות מונעת חזרה של אותם קטעי קוד, ומאפשרת חלוקה ברורה של התכנית לתתי משימות לשם פיתרון הבעיה הכוללת. בצורה כזו האלגוריתם קריא יותר מאשר האפשרות של פיתוח פונקציה ראשית (main) ארוכה המבצעת הרבה תתי משימות שונות. תהליך תיקון השגיאות (debugging) קל יותר בקוד הבנוי מפונקציות מכיוון שלכל פונקציה תפקיד משלה, ומשתנים השייכים רק לה.

3 הכרזה והגדרה של פונקציות
הכרזה (אבטיפוס של הפונקציה = function prototype): ; (return-type function-name(arguments declaration הגדרה: return-type function-name(arguments) { function body… }       לפני השימוש בפונקציה חייבים להכריז או להגדיר את הפונקציה! ערך מוחזר: יכול להיות כל טיפוס שקיים ב-C (int, float, וכו'). או void (פונקציה המוגדרת עם טיפוס החזרה void לא מחזירה ערך).

4 פונקציות - דוגמה כתוב פונקציה המחשבת ומחזירה את המספר הגדול ביותר בין שלושת המספרים השלמים המועברים לפונקציה כפרמטרים: #include<stdio.h> int max3(int,int,int); //function prototype void main() { int a,b,c; //input variables printf("enter 3 integers : "); scanf("%d%d%d",&a,&b,&c); printf("maximum integer is : %d\n",max3(a,b,c)); } int max3(int x,int y,int z) //function definition int max; //help variable max=x; if(y>max) max=y; if(z>max) max=z; return max;

5 פונקציות - דוגמה #include<stdio.h>
כתוב תוכנית הקולטת 30 מספרים שלמים, מחשבת ומדפיסה את המספר הגדול ביותר בין כל המספרים הנקלטים. נשתמש בפונקציה max3 . #include<stdio.h> int max3(int,int,int); //function prototype void main() { int a, b, c, i, max; scanf("%d%d%d",&a,&b,&c); max= max3(a,b,c); for (i=1;i<10;i++) { if (max3(a,b,c)>max) } printf ("max= %d\n",max); /*Here we will place the implementation of max3*/

6 העברת ארגומנטים הערכים המועברים אל הפונקציה כפרמטרים מועתקים. לכן, כל שינוי שהפונקציה תבצע בארגומנטים לא ישתקף מחוץ לפונקציה עצמה. פלט: a=1 b=2

7 העברת ארגומנטים (המשך)
לעומת זאת, אם מעבירים לפונקציה מערך, כל שינוי בתוך המערך עצמו יישמר גם לאחר סיום ריצת הפונקציה. פלט: a[0]=2 a[1]=1

8 דוגמאות למימוש הפונקציות לטיפול במחרוזות:
/****************************************************************** Parameters: s - array of chars, must contain ‘\0’. Returns: length of string that s holds *******************************************************************/ unsigned int strlen(char s[]) { unsigned int len = 0; while (s[len] != ’\0’) len++; return len; } /******************************************************************* Compares two strings lexicographically Parameters: s, t - string to be compared Returns: lexicographical difference between s and t int strcmp(char s[], char t[]) int i; for (i = 0; s[i] == t[i]; i++) if (s[i] == '\0') return 0; e return s[i] - t[i];

9 תרגיל 1 כתוב תוכנית הקולטת ציונים שקיבלו 100 סטודנטים בקורס תכנות בשפת סי. התוכנית ומדפיסה את המספר הסידורי של הסטודנטים שקיבלו ציון גבוה מהציון הממוצע. #include<stdio.h> #define NUM_STUD 100 /******** Function prototypes *********/ void inputGrades(int [],int); float avg(int [], int); void bestStud(int [],float,int); void main() { int grades[NUM_STUD];//data array float av_mark;//average mark inputGrades(grades,NUM_STUD); av_mark=avg(grades,NUM_STUD); bestStud(grades,av_mark,NUM_STUD); }

10 תרגיל 1 (המשך פתרון) /******* Function definitions *********/
תרגיל 1 (המשך פתרון) /******* Function definitions *********/ void inputGrade(int arr[],int size) { int i; //loop variable for(i=0;i<size;i++) printf("Enter %d student mark -> ", i+1); scanf("%d", &arr[i]); } float avg(int arr[], int size) int sum=0; // sum of grades int i;//loop variable for (i=0;i<size;i++) sum=sum+arr[i]; return sum/(float)size; void bestStud(int arr[],float av, int size) for(i=0; i<size; i++) if (arr[i]>av) printf("The best student number is %d\n",i+1);

11 תרגיל 1 (המשך) לדעת המרצה, אם יש יותר מידי מספרים עוקבים שקיבלו ציון מעל הממוצע אז יש חשד להעתקה. במקרה כזה, המרצה רוצה אפשרות לראות כמה סטודנטים מתוך החשודים, עברו את קורס הקדם בציון 90. שנו את הפונקציה הראשית כדי שתתמוך בפעולות הללו. void main() { int grades[NUM_STUD], int SuspeciousGrades[NUM_STUD] = {0}, suspecious=0; float av_mark; inputGrades(grades,NUM_STUD); av_mark=avg(grades,NUM_STUD); bestStud(grades,av_mark,NUM_STUD); printf(“how many students are suspicious?”); scanf(“%d”, suspicious); if(suspicious) inputGrades(SuspeciousGrades, suspicious); bestStud(SuspeciousGrades,90, suspicious); }

12 תרגיל 2 - סודוקו כתבו תכנית אשר קולטת לוח סודוקו מלא בגודל 9x9 , ובודקת האם הלוח הינו לוח סודוקו חוקי. ניתן להניח שהמשתמש מזין ערכים חוקיים. כלומר מספרים שלמים בין 1 ל-9. לאיזה תתי משימות (פונקציות) נחלק את התכנית?

13 תרגיל 2 - פיתרון

14 תרגיל 2 - פיתרון

15 תרגיל 2 - פיתרון

16 תרגיל 3 #include <stdio.h> #define MAX 100
כתוב תוכנית הקולטת מספרים שלמים לתוך שני מערכים. אפשר להניח שהמשתמש מכניס מספרים כך שכל מערך ממוין. התוכנית מבצעת מיזוג של שני מערכים לתוך מערך שלישי, כך שהוא יכיל את איברי שני המערכים וגם יהיה ממוין. #include <stdio.h> #define MAX 100 /*This function merges two sorted arrays into a third array.*/ void merge(int arr1[], int n1, int arr2[], int n2, int res[]) { int i, j, k; for (i=0,j=0,k=0; i < n1 && j < n2; k++) if (arr1[i] < arr2[j]) res[k] = arr1[i]; i++; } else res[k] = arr2[j]; j++; /* only one of the two is true */ while(i < n1) res[k++] = arr1[i++]; while(j < n2) res[k++] = arr2[j++]; } //void merge

17 תרגיל 3 (המשך) int GetValues(int arr[],int arrNum) {
תרגיל 3 (המשך) int GetValues(int arr[],int arrNum) { int numOfValues,i; printf(“Enter values for array number %d”,arrNum); scanf(“%d”,&numOfValues); for(i=0; i < numOfValues; i++) printf(“Enter value number %d”,i+1); scanf(“%d”,&arr[i]) } return numOfValues; void main() int n1, n2, i; int a1[MAX], a2[MAX], a3[MAX * 2]; n1 = GetValues(a1,1); n2 = GetValues(a2,2); merge(a1, n1, a2, n2, a3); for (i = 0; i < n1 + n2; ++i) printf("%d ", a3[i]); printf("\n");

18 תרגיל 4 מערך דו מימדי כפרמטר
תרגיל 4 מערך דו מימדי כפרמטר 3 2 1 4 8 11 -2 9 7 נגדיר "פרח" המערך דו מימדי כך: 3X3- האיברים מתוך תת מערך בגודל - האיבר המרכזי במערך הוא "לב הפרח". - ארבעת האיברים הצמודים לו בפינותיו הם "עלי הפרח". - הערך של "לב הפרח" שווה לסכום ערכי "עלי הפרח". מספרים שלמים15X18כתוב תוכנית הקולטת למערך בגודל המערך נקרא "פרחוני", אם יש בו לפחות 5 "פרחים". התוכנית תבדוק אם המערך הוא "פרחוני", ותציג כפלט הודעה מתאימה.

19 תרגיל 4 - פתרון #include<stdio.h> #define TRUE 1 #define FALSE 0
#define ROW 15 #define COL 18 /*********************** Function prototypes **********************/ void in_arr(int [][COL],int,int); int is_flower(int[][COL],int,int); /***************************************************************/ void main() { int arr[ROW][COL];//input array int count=0;//number of flowers int i,j;//loop counters in_arr(arr,ROW,COL); for(i=0;i<ROW;i++) for(j=0;j<COL;j++) count=count+is_flower(arr,i,j); if(count>=5) printf("Yes\n"); else printf("No\n"); }

20 תרגיל 4 – פתרון (המשך) /********************* Function definitions **************************/ void in_arr(int a[][COL],int n,int m) { int i,j;//loop counters for(i=0;i<n;i++) for(j=0;j<m;j++) printf("Enter %d row %d col element -> ",i+1,j+1); scanf("%d",&a[i][j]); } int is_flower(int b[][COL],int k,int l) int sum;//sum of flower's elements if(k==0||k==ROW-1||l==0|l==COL-1) return FALSE; sum=b[k-1][l-1]+b[k-1][l+1]+b[k+1][l-1]+b[k+1][l+1]; if(b[k][l]==sum) return TRUE; else

21 פרח בריבוע הוא פרח שכל אחד מ4 קצוותיו הוא גם מרכז פרח.
תרגיל 4 (המשך) מערך דו מימדי מוגדר כמערך פרחוני בריבוע אם הוא פרחוני והוא מכיל לפחות פרח בריבוע אחד. פרח בריבוע הוא פרח שכל אחד מ4 קצוותיו הוא גם מרכז פרח. .שנו את התכנית כך שתבדוק גם אם המערך הוא פרחוני בריבוע int is_flowerSquare(int b[][COL],int k,int l) { int sum;//sum of flower's elements if(k==0||k==ROW-1||l==0|l==COL-1) return FALSE; sum=is_flower(b,k-1,l-1)+is_flower(b,k-1,l+1)+is_flower(b,k+1,l-1)+is_flower(b,k+1,l+1); if(sum==4) return TRUE; else }

22 נבצע שינוי קטן בפונקציה הראשית:
תרגיל 4 (המשך) נבצע שינוי קטן בפונקציה הראשית: void main() { int arr[ROW][COL];//input array int count=0,countSquareFlower = 0;//number of flowers int i,j;//loop counters in_arr(arr,ROW,COL); for(i=0;i<ROW;i++) for(j=0;j<COL;j++) if(is_flower(arr,i,j)) count=count++; countSquareFlower += is_flowerSquare(arr,i,j) } if(count>=5) printf(“Yes\n"); if(countSquareFlower) printf(“Square\n"); else printf("No\n"); איך התשובה הייתה נראית אם לא היינו משתמשים בפונקציות?

23 תרגיל 5 פיתוח הבינום של ניוטון מוגדר באופן הבא: n
משולש פסקל הוא סידור של מקדמי הבינום, המסומנים ב , בצורה של משולש שווה שוקיים, כאשר הוא למעשה מספר השורה של המקדם במשולש ו-kהוא מיקומו בשורה זו (מספור השורות והמיקומים בכל שורה מתחיל מ-0). הקודקוד העליון של משולש זה מכיל

24 תרגיל 5 (המשך) פתרון: #include <stdio.h> #define ARR_SIZE 20
/*Pascal Triangle -prints a pascal triangle Parameters: nLines - bottom line level */ void pascalTri(int nLines) { int arr[ARR_SIZE+1] = {0}; int i, level; /*Check if level is in array bounds:*/ if (nLines >= ARR_SIZE) return; for (level = 0; level <= nLines; level++) /*Set the last number in level to 1:*/ arr[level] = 1;

25 תרגיל 5(המשך)

26 תרגיל 5 (המשך)


הורד את "ppt "Computer Programming Fall 2012 תרגול 6 פונקציות

מצגות קשורות


מודעות Google