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

Slides:



Advertisements
מצגות קשורות
תכנות בשפת C תרגול 11 - קבצים.
Advertisements

הרצאה 02 סוגי משתנים קרן כליף.
ייצוגים שונים של פונקציה
הרצאה 12: מיזוג, מיון ושימושים לפעולות על קבוצות - המשך
מבוא לתכנות ב-JAVA מעבדה 1
תוכנה 1 תרגול 13 – סיכום.
Trends in Periodic Table Properties
תרגול 11: רקורסיה ופיתוח טלסקופי
תרגול 1: סביבת העבודה ומבוא ל-Java
לולאות Department of Computer Science-BGU 19 יולי 19.
נערך ע"י אריק הוד, הגימנסיה העברית הרצליה
תרגול 5: לולאות ומערכים.
תוכנה 1 תרגול 12 – סיכום.
תרגול מס' 8 משתנים מיוחסים מבוא ל-C++ קלט/פלט ב-C++
מבוא למדעי המחשב מ' - תירגול 9
תירגול 10: מבנים (structs) וקבצים
Marina Kogan Sadetsky –
Jump tables, review questions
הרצאה 3: משפטים, תנאים ולולאות
מבוא למדעי המחשב הרצאה מספר 12: רקורסיה
תכנות בשפת C תרגול 11 רשימות מקושרות מבנים
תרגול Introduction to C - Fall Amir Menczel.
פעולות אריתמטיות קרן כליף.
Computer Programming תרגול 1 Summer 2016
תירגול 11: מיונים וחיפוש בינארי
Entity Relationship Diagram – ERD
תירגול 3: לולאות, קלט, וטיפוסים
תכנות בשפת C תרגול 8 רקורסיה
מבני נתונים תרגול 3 ליאור שפירא.
Engineering Programming A
תירגול 8:מצביעים והקצאה דינאמית
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מבוא למדעי המחשב הרצאה 9: רקורסיה
תרגול 6: פונקציות, סוגי משתנים, top-down design
תירגול 2: מבוא לתיכנות ב-C
פתרון של מערכת משוואות לינארית
כל הזכויות שמורות לגבריאל אנקרי © 2017
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מבוא לתכנות מונחה עצמים Object Oriented Programming
הרצאה 10: אלגוריתמי מיון רקורסיביים Merge sort ו-Quick sort
מבוא לתכנות למערכות מידע
Computer Architecture and System Programming Laboratory
אלגוריתמי מיון רקורסיביים
המשך תכנות מונחה עצמים תרגול מס' 9.
כל הזכויות שמורות לגבריאל אנקרי © 2017
Branch Prediction בעריכת אורן קצנגולד Updated by Franck Sala.
תרגול 13 : חזרה נכתב על-ידי לימור ליבוביץ נערך ע"י ישראל גוטר
Marina Kogan Sadetsky –
מת"מ מעבדה 7-8 רשימות.
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
תוכנה 1 תשס"ח סמסטר ב' אוהד ברזילי ליאור שפירא
What is Chemistry? מהי כימיה? Chemistry is the study of matter and its
שימוש בעצם ממחלקה אחרת כמאפיין במחלקה הנוכחית
מבוא לתכנות ב- JAVA מעבדה 4
מבוא לתכנות בWINDOWS ד"ר אבי רוזנפלד.
מבוא למדעי המחשב סמסטר ב' – 2008 מרצה: יעל סיגל מתרגל: ענבל בודובסקי.
Introduction to Programming in C
תרגול 12: backtracking.
מצביעים Pointers – המשך...
תרגול מס' 7: Memoization Quicksort תרגילים מתקדמים ברקורסיה
עקרונות תכנות מונחה עצמים תרגול 9:C++ - תרגילים
והתאמתה למאפייני הסטודנטים
Java Programming רשימות מקושרות - המשך
Engineering Programming A
רשימות מקושרות עבודה עם קבצים דוגמה
תמליל מצגת:

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

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

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

פונקציות - דוגמה כתוב פונקציה המחשבת ומחזירה את המספר הגדול ביותר בין שלושת המספרים השלמים המועברים לפונקציה כפרמטרים: #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;

פונקציות - דוגמה #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*/

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

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

דוגמאות למימוש הפונקציות לטיפול במחרוזות: /****************************************************************** 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];

תרגיל 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); }

תרגיל 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);

תרגיל 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); }

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

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

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

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

תרגיל 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

תרגיל 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");

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

תרגיל 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"); }

תרגיל 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

פרח בריבוע הוא פרח שכל אחד מ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 }

נבצע שינוי קטן בפונקציה הראשית: תרגיל 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"); איך התשובה הייתה נראית אם לא היינו משתמשים בפונקציות?

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

תרגיל 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;

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

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