Programming Pointers. נדגים היום בעזרת מצביעים העברת משתנים לפונקציה שמשנה אותם  פונקציה שמקבלת מצביעים לסמן תא בזיכרון  פונקציה שמחזירה מצביע מערך.

Slides:



Advertisements
Similar presentations
מבוא למדעי המחשב לתעשייה וניהול
Advertisements

מבוא למדעי המחשב לתעשייה וניהול דוגמאות ותרגול נוסף במערך חד ממדי הרצאה 12.
Pointers הרצאה קריטית. השאלות הפתוחות מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת.
תכנות תרגול 7 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
תכנות תרגול 9 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
תכנות תרגול 2 שבוע : שבוע שעבר כתבו תוכנית המגדירה שלושה משתנים מאתחלת אותם ל 1 2 ו 3 ומדפיסה את המכפלה שלהם את ההפרש שלהם ואת הסכום שלהם.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
11 Introduction to Programming in C תרגול
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא כללי למדעי המחשב תרגול. הבית האדום כתובת : רחוב קוקוריקו 2 הבית הירוק כתובת : רחוב קוקוריקו 4 הבית הצהוב כתובת : רחוב קוקוריקו 1 הבית הורוד כתובת.
תכנות תרגול 9 שבוע : מערכים int a; a=5; int a[10]; a[2] = 5; 5 a a[0] a[1] a[2] a[9]  5 משתנה בודד מערך גישה למשתנה השלישי במערך.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מבוא למדעי המחשב תרגול 4 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב © אריק פרידמן 1 מצביעים כמערכים דוגמה.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבוא למדעי המחשב מחרוזות, מצביעים וכתובות
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 5 שבוע : לולאות for לולאות for for (counter=1 ;counter
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
קורס תכנות – סימסטר ב ' תשס " ח שיעור שישי: מערכים
מבוא למדעי המחשב תרגול 6 - מערכים שעת קבלה : יום שני 11:00-12:00 דוא " ל :
תכנות תרגול 7 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא ידעו.
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
תכנות תרגול 4 שבוע : לולאות for לולאות for for (counter=1 ;counter
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Last time on Clang משתנה: "פתק" המשמש את המחשב לשמירת מידע. לכל משתנה יש שם וטיפוס כללים לשמות משתנים –חייבים להכיל רק אותיות, מספרים ו '_' –חייבים להתחיל.
תחשיב היחסים (הפרדיקטים)
מיון (Sorting) קלט : מערך בן n מספרים. פלט : מערך ובו המספרים אותם מאוחסנים בסדר עולה
מבוא מורחב למדעי המחשב בשפת Scheme תרגול 10. אג'נדה שאלות מבחינות חזרה על מימוש stream אפשרי 2.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
מבוא למדעי המחשב תרגול 9 – מערכים ומחרוזות, תרגילי חזרה שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב תרגול 12 – הקצאת זיכרון דינאמית שעת קבלה : יום שני 11:00-12:00 דוא " ל :
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
Sscanf example #include int main () { char sentence []="Rudolph is 12 years old"; char str [20]; int i; sscanf (sentence,"%s %*s %d",str,&i); printf ("%s.
תכנות תרגול 8 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
1 מבוא למחשב שפת C תרגילי חזרה. 2 תרגיל 1 : מחשבון קלט : תרגיל חשבוני המורכב ממספרים שלמים עם פעולות חשבוניות ביניהם. התרגיל מסתיים ב =. אפשריים רווחים.
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
קורס תכנות שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
Dynamic Allocation. Malloc - Reminder void* malloc(unsigned int nBytes); Used to dynamically allocate nBytes in memory Returns a pointer to the allocated.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
1 נתבונן בפונקציה הבאה public static int min(int[] a,int n) { int min = a[0]; for (int i = 1; (i < n ) && (i < a.length) ; i++) if (min > a[i]) min = a[i];
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
מבוא למדעי המחשב סיבוכיות.
שיעור חמישי: מערכים ומחרוזות
מצביעים קרן כליף.
תירגול 14: מבני נתונים דינאמיים
הקצאות דינאמיות קרן כליף.
מבנים קרן כליף.
שיעור שישי: מחרוזות, מצביעים
מצביעים קרן כליף.
מבוא כללי למדעי המחשב תרגול 4
תרגול 8 תחומי הכרה פונקציות
מבוא כללי למדעי המחשב תרגול 6
Programming in C תרגול Introduction to C - Fall Amir Menczel.
תרגול Introduction to C - Fall Amir Menczel.
מבוא למדעי המחשב מצביעים.
תירגול 8:מצביעים והקצאה דינאמית
שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב
Presentation transcript:

Programming Pointers

נדגים היום בעזרת מצביעים העברת משתנים לפונקציה שמשנה אותם  פונקציה שמקבלת מצביעים לסמן תא בזיכרון  פונקציה שמחזירה מצביע מערך של מערכים  למשל אוסף שמות: כל תא במערך הוא מחרוזת. לרוץ עם מצביע  אריתמטיקה של מצביעים.

תזכורת void wishful_swap(double a, double b) { double tmp; tmp=a; a=b; b=tmp; } void effective_swap (double* a, double* b) { double tmp; tmp=*a; *a=*b; *b=tmp; }

תזכורת int main() { double x,y; x = 3.14 ; y = 2.71; printf(“x = %3.2lf, y = %3.2lf\n”,x,y); wishful_swap(x,y); printf(“x = %3.2lf, y = %3.2lf\n”,x,y); effective_swap(&x,&y); printf(“x = %3.2lf, y = %3.2lf\n”,x,y); return 0; } x = 3.14, y = 2.71 x = 2.71, y = 3.14

חימום – המרת קואורדינטות void polar2rect(double r, double t, double* x, double* y) { *x = r*cos(t); *y = r*sin(t); } כתבו main (שמשתמש בפונקציה זו) והדפיסו את הקואורדינטות הקרטזיות של: א) מרחק 2 מטר מהראשית בכיוון רדיאן וחצי (מציר X החיובי). ב) מרחק 3.6 מטר מהראשית בכוון עשירית רדיאן. נ.ב. בשביל טריגונומטריה צריך #include

Solution int main() { double x,y; polar2rect(2.0,1.5,&x,&y); printf(“(%.2lf,%.2lf)\n”,x,y); polar2rect(3.6,0.1,&x,&y); printf(“(%.2lf,%.2lf)\n”,x,y); return 0; } (0.14,1.99) (3.58,0.36)

חימום כתבו פונקציה בעלת המפרט הבא: void cond_swap(int* i1, int *i2); כאשר i1 ו-i2 הם מצביעים לאיברים שלמים. הפונקציה תבדוק אם התא המוצבע ע"י i1 מכיל ערך גדול מהתא המוצבע ע"י i2. אם כן, היא תחליף בין תכני התאים.

Solution void cond_swap(int* i1, int *i2) { int tmp; if (*i1>*i2) { tmp=*i1; *i1=*i2; *i2=tmp; }

לסמן תא: האיבר הגדול במטריצה double *largest_element_in_matrix(double mat[N][N]) { int i,j; double *result = &(mat[0][0]); for ( i = 0 ; i<N ; ++i ){ for ( j = 0 ; j<N ; ++j ){ if ( *result < mat[i][j]) result = &(mat[i][j]); } return result; }

ניתן לשנות את התא המסומן int main() { double nice[N][N]; double *peak = NULL; read_matrix(nice); printf( " \n—-Original matrix--\n " ); print_matrix(nice); peak = largest_element_in_matrix(nice); *peak = ; printf( " --Modified matrix--\n " ); print_matrix(nice); printf( " \n\tpeak at # %d\n ",peak-nice); return 0; } —-Original matrix Modified matrix peak at # 5

תרגיל כיתה כתבו פונקציה בעלת המפרט הבא: int split_by_pointers(int numbers[],int* pointers[],int size) הפונקציה מקבלת מערך של שלמים, מערך של מצביעים לשלמים ואת גודל שני המערך numbers. בסיום הפונקציה מערך המצביעיםpointers צריך להכיל מצביעים לכל המספרים השליליים שבמערך השלמים numbers. הערך המחוזר הוא אורך המערך (כלומר מספר השליליים שנמצאו). שימו לב, המתמש יגש לשליליים על ידי pointers בלי להכיר כלל את numbers !

Solution int split_by_pointers(int numbers[], int* pointers[],int size) { int i,n=0; for (i=0;i<size;i++){ if (numbers[i]<0) pointers[n++]=&numbers[i]; } return n; }

Solution – equivalent int split_by_pointers(int numbers[], int* pointers[],int size) { int n=0; int *p,*last = numbers+size; for ( p=numbers ; p<last ; p++){ if (*p<0) pointers[n++]=p; } return n; }

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

Solution #include #define SIZE 10 int main() { int arr1[SIZE]; int *arr2[SIZE]; int k,n; printf("Enter numbers\n"); for (k=0;k<SIZE;k++) scanf("%d",&(arr1[k])); n=split_by_pointers(arr1,arr2,SIZE); itr=0; for (k=0;k<n;++k) (*arr2[k])*=-1; for (k=0;k<SIZE;k++) printf("%d",arr1[itr]); return 0; }

פירוק משפט למילים קלט: משפט (מחרוזת עם רווחים וסימני פיסוק). פלט: מערך של מחרוזות ללא רווחים (מילים). הרעיון: להצביע לתוך המערך המקורי.  צריך להכניס ‘\0’ בכמה מקומות. ?~, קלט: פעולה: פלט:

נשתמש ב strchr (למדנו עליה) מקבלת מחרוזת ותו.  אם התו אינו נמצא במחרוזת מחזירה NULL  אחרת מחזירה מצביע למופע הראשון. int main_strchr() } char s[10] = "abcd"; char *x; x = strchr(s,'b'); printf("strchr(\"abcd\",'b') = %p[%s] at -1 letter is [%c]\n",x,x,x[-1]); x = strchr(s,'c'); printf("strchr(\"abcd\",'c') = %p[%s] at -1 letter is [%c]\n",x,x,x[-1]); x = strchr(s,'d'); printf("strchr(\"abcd\",'d') = %p[%s] at -1 letter is [%c]\n",x,x,x[-1]); x = strchr(s,'\0'); printf("strchr(\"abcd\",'\0') = %p[%s] at -1 letter is [%c]\n",x,x,x[-1]); x = strchr(s,'a'); printf("strchr(\"abcd\",'a') = %p[%s] at -1 letter is [%c]\n",x,x,x[-1]);/*access to x[-1] is dangerous in this case*/ return 0; } strchr("abcd",'b') = 003BFEED[bcd] at -1 letter is [a] strchr("abcd",'c') = 003BFEEE[cd] at -1 letter is [b] strchr("abcd",'d') = 003BFEEF[d] at -1 letter is [c] strchr("abcd",'strchr("abcd",'a') = 003BFEEC[abcd] at -1 letter is []

הפונקציה int dicompose(char *s, char *seperators, char *words[]) } int n = 0; while (*s!='\0'){ /*First, skip all spaces before next word.*/ while(strchr(seperators,*s)) ++s; if(*s=='\0') return n; words[n++] = s; /*Not space, not null => a word starts.*/ /*So, let’s loop over the word itself, i.e. as long as neither null nor space*/ while((*s!='\0')&&(strchr(seperators,*s)==NULL)) ++s; if(*s=='\0') return n; /*sentence ends by null after a letter.*/ *s++ = '\0'; /*For sure s points the first space after word. Make it null & continue.*/ { return n; /*Rarely reach here. But it is better to cover all options. */ }

שימוש בה int main_dicompose(void) } char s[100]; char *words[20]; int n,j; printf("\nEnter a sentence: "); gets(s); printf("\n\t===>> %s\n",s); n = dicompose(s,"\t,;.",words); for ( j = 0 ; j<n ; ++j ) printf("words #%d is \"%s\" \n",j,words[j]); return 0; { Enter a sentence: ===>> Here we are, in the center; of town words #0 is "Here" words #1 is "we" words #2 is "are" words #3 is "in" words #4 is "the" words #5 is "center" words #6 is "of" words #7 is "town"

Another exercise (optional) כתבו פונקציה בעלת המפרט (prototype) הבא: int convert (int num[], int size, int *p_value); נאמר שהמערך num שגודלו size מייצג מספר אם התא הראשון בו מכיל את ספרת האחדות, התא השני את ספרת העשרות וכן הלאה. הפונקציה מחשבת את הערך המספרי שמייצג המערך num ומחזירה אותו דרך המשתנה ש- p_value מצביע אליו. על הפונקציה להחזיר 1 במקרה שהמערך מייצג מספר חיובי (למשל או ), אחרת 0 (למשל או ). יודגש כי על פי ההגדרה לעיל מערך יכול לייצג רק מספרים חיוביים.

Solution int convert (int num[],int size, int *p_value) { int power=1; int itr; if (num[size-1]<1) return 0; *p_value=0; for (itr=0;itr<size;itr++) { if (num[itr]>=0 && num[itr]<=9) (*p_value)+=num[itr]*power; else return 0; power*=10; } return 1; }

Exercise (optional) – Part B כתבו פונקציה בעלת המפרט (prototype) הבא: int calc_sum (int nums[][MAX_LEN], int digits,int n); (עבור MAX_LEN שלם חיובי כלשהו). הפונקציה מקבלת מערך של n מערכים בשם nums והיא מחשבת (ומחזירה) את סכום המספרים שמערכים אלו מייצגים, תוך התעלמות מן המערכים שאינם מייצגים מספר חיובי. כל מספר חוקי הוא בן digits ספרות בדיוק.

int calc_sum (const char nums[][MAX_LEN], int digits int n){ int i, number, valid, sum=0; for(i=0; i< n; i++){ valid = convert (nums[i],digits, &number); if(valid) sum +=number; } return sum; } Solution