מבוא כללי למדעי המחשב תרגול 6

Slides:



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

מבוא למדעי המחשב לתעשייה וניהול דוגמאות ותרגול נוסף במערך חד ממדי הרצאה 12.
קורס תכנות שיעור שנים-עשר: ניהול זיכרון 1. הקצאת זיכרון דינאמית עד עכשיו עשינו "הקצאה סטטית" הגדרנו את משתני התוכנית כבר כשכתבנו אותה הקומפיילר הקצה עבורם.
Pointers הרצאה קריטית. השאלות הפתוחות מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת.
1 מבוא למדעי המחשב הקצאה דינאמית. 2 הקצאת זיכרון דינאמית  כאשר אנו משתמשים במערכים, אנו מקצים אוטומטית את הזיכרון המקסימלי שנצטרך.  בפועל, אנו משתמשים.
מבוא למדעי המחשב תרגול 2 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
תכנות תרגול 11 שבוע : מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
תכנות תרגול 7 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
תכנות תרגול 9 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
תכנות תרגול 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 תרגול
מבוא למדעי המחשב © אריק פרידמן 1 מצביעים כמערכים דוגמה.
תכנות תרגול 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 תרגול
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
תכנות – שיעור 7. חזרה -מערכים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים זהים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים.
תכנות תרגול 14 שבוע:
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 14 שבוע : רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה.
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
קורס תכנות – סימסטר ב ' תשס " ח שיעור שישי: מערכים
תכנות תרגול 12 שבוע : הקצאת זיכרון דינאמית הזיכרון המקסימאלי ששימש את התוכנית שלנו עד היום היה קבוע מראש. לפני הרצת התוכנית, לאחר שהתוכנית עברה.
תכנות תרגול 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
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא כללי למדעי המחשב הקצאת זיכרון דינאמית
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
מבוא למדעי המחשב תרגול 9 – מערכים ומחרוזות, תרגילי חזרה שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא כללי למדעי המחשב תרגול 7. מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
מבוא למדעי המחשב תרגול 12 – הקצאת זיכרון דינאמית שעת קבלה : יום שני 11:00-12:00 דוא " ל :
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 8 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
Structure. מה לומדים היום ? דרך לבנות מבנה נתונים בסיסי – Structure מייצר " טיפוס " חדש מתאים כאשר רוצים לאגד כמה משתנים יחד דוגמאות : עובד : שם, טלפון,
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
קורס תכנות שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
מערכים ומצביעים הקצאה דינאמית של מערכים דו-מימדיים
מיונים וחיפושים קרן כליף.
מחרוזות קרן כליף.
שיעור חמישי: מערכים ומחרוזות
מצביעים קרן כליף.
הקצאות דינאמיות קרן כליף.
Introduction to Programming in C
מצביעים קרן כליף.
הקצאת זיכרון דינאמית מבוא כללי למדעי המחשב
מבוא כללי למדעי המחשב תרגול 4
תרגול 8 תחומי הכרה פונקציות
מחרוזות קרן כליף.
מערכים של מצביעים הקצאה דינאמית
Programming in C תרגול Introduction to C - Fall Amir Menczel.
מבוא למדעי המחשב מצביעים.
תירגול 8:מצביעים והקצאה דינאמית
שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב
Presentation transcript:

מבוא כללי למדעי המחשב תרגול 6

מה הכתובת של “הבית האדום?” הבית הצהוב הבית האדום שמעון רמי כתובת : רחוב קוקוריקו 1 כתובת : רחוב קוקוריקו 2 הבית הורוד הבית הירוק אבנר יוסי כתובת : רחוב קוקוריקו 3 כתובת : רחוב קוקוריקו 4 2 מה הכתובת של “הבית האדום?” רמי מי גר בבית מספר 2? רמי מי גר ב“בית האדום?”

2000 b a 5 3 כתובת : 1000 כתובת : 2000 c d 7 80 כתובת : 3000 כתובת : 4000 2000 מה הכתובת של?a 5 מה נמצא בתא 2000? 5 מה נמצא ב a?

מצביעים לכל משתנה שמוגדר בתוכנית יש כתובת הכתובת שלו היא מיקומו בזכרון למשל כאשר משכנים מספר מסוג int אזי צורכים 4 bytes. int a; a 5000

מצביעים a 5000 5 int a; int b; a = 5; b = 7; b 5004 7

מצביעים int a, b; int *p1; int *p2; a = 5; b = 7; p1 = &a; p2 = &b; a 5000 5 int a, b; int *p1; int *p2; a = 5; b = 7; p1 = &a; p2 = &b; b 5004 7 p1 7026 5000 p2 7030 5004

מצביעים *p1 = 2; *p2 = *p1; int a, b; int *p1; int *p2; a = 5; b = 7; 5000 5 int a, b; int *p1; int *p2; a = 5; b = 7; p1 = &a; p2 = &b; 5004 7 b p1 7026 5000 5004 p2 7030 *p1 = 2; *p2 = *p1;

מצביעים *p1 = 2; *p2 = *p1; int a, b; int *p1; int *p2; a = 5; b = 7; 5000 2 int a, b; int *p1; int *p2; a = 5; b = 7; p1 = &a; p2 = &b; 5004 2 b p1 7026 5000 5004 p2 7030 *p1 = 2; *p2 = *p1;

תרגיל הגדר שני משתנים a ו b. אתחל אותם לערכים כלשהם. לאחר מכן הגדר שני משתנים להחזקת הכתובות שלהם הדפס את הכתובות שלהם ואת הערכים שנמצאים בכתובות האלו. להדפסת מצביע נשתמש בפורמט %p.

#include <stdio.h> int main() { int a=10,b=2; int *p1,*p2; p1 = &a; p2 = &b; printf(“%p %p \n”,p1,p2); printf(“%d %d \n”,*p1,*p2); return 0; }

מצביעים עד היום הפונקציות שלנו ידעו לקבל ערכים של משתנים ולהשתמש בהם. הן לא ידעו לקבל משתנים ולשנות את הערכים שלהם (מלבד פונקציה אחת!) הפונקציות שלנו ימשיכו לקבל ערכים בלבד, רק שכעת אנו יכולים להעביר להם בתור ערך כתובת של משתנה !

אין צורך לדעת את כתובותיהם שלa ואת b, אלא רק את ערכיהם int a=3,b=5; printf(“%d %d”,a,b) printf a 3 3 2020 b 5 5 2034 אין צורך לדעת את כתובותיהם שלa ואת b, אלא רק את ערכיהם

צריך לדעת את כתובותיהם שלa ו b, ולא את ערכיהם int a,b; scanf(“%d %d”,&a,&b) scanf a 2020 3 5 b 2034 צריך לדעת את כתובותיהם שלa ו b, ולא את ערכיהם

int main() { int a; scanf(“%d”,&a); } a 5000 scanf *pa = ערך מהמשתמש

int main() { int a=10,b=2,x=3,y=5; … swap(x, y); swap(a, b); } void swap (int q,int p) { int temp =p; p = q; q = temp; }

void swap (int *p,int *q) { int temp = *p; *p = *q; *q = temp; } int main() { int a=10,b=2,x=3,y=5; … swap(&x,&y); swap(&a,&b); } 5 x 5000 3 y 5004 3 5 void swap (int *p,int *q) { int temp = *p; *p = *q; *q = temp; } p 7026 5000 7030 5004 q 7034 3 temp

void rectangle(int a,int b,int *area,int *circuit); תרגיל כתבו פונקציה שמקבלת אורך ורוחב של מלבן ומחזירה את שטח המלבן ואת היקפו. void rectangle(int a,int b,int *area,int *circuit); int main() { int x, y; int area,circuit; scanf("%d %d",&x,&y); rectangle(x,y, &area,&circuit); printf(“Area is %d Circuit is %d\n",area,circuit); return 0; }

פתרון void rectangle(int a,int b,int *area,int *circuit) { *area = a * b; *circuit = 2 * (a + b); }

הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו יש כתובת a[0] 5000 כדי להגיע לכתובת של תא במערך פשוט נכתוב &a[2] אם נרצה את הכתובת של המערך עצמו אזי זה שם המערך a[1] 5004 a[2] 5 5008  a[9]

הקשר בין מערכים לפונקציות כיצד נכתוב פונקציה אשר תקבל כפרמטר מערך ? הפונקציה תקבל מערך (את כתובתו) ותדפיס אותו: void PrintArray(int a[],int size) { int i; for (i=0;i<size;i++) printf(“%d”,a[i]); }

הקשר בין מערכים לפונקציות הפונקציה תקלוט איברים לתוך מערך void GetArray(int a[],int size) { int i; for (i=0;i<size;i++) scanf(“%d”,&a[i]); }

void GetArray(int a[],int size); void PrintArray(int a[],int size); int main() { int a[SIZE]; GetArray(a,SIZE); PrintArray(a,SIZE); return 0; }

תרגיל 2 כתבו את הפונקציות הבאות: פונקציה שממלא מערך במספרים אקראיים פונקציה שמדפיסה מערך פונקציה שהופכת את המערך (רמז: השתמשו בפונקציה swap )

פתרון מילוי מערך void fill_array(int array[], int size) { int i; srand(time(NULL)); for (i = 0; i < size; i++) array[i] = rand(); }

פתרון הדפסת מערך void print_array(int array[], int size) { int i; for (i = 0; i < size; i++) printf("%d ", array[i]); printf("\n"); }

פתרון הפיכת מערך void reverse_array(int array[], int size) { int i; for (i = 0; i < size/2; i++) swap(&array[i], &array[size - 1 - i]); }

#include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 5 void fill_array(int array[], int size); void reverse_array(int array[], int size); void print_array(int array[], int size); void swap(int *a, int *b); int main() { int my_arr[SIZE]; fill_array(my_arr, SIZE); print_array(my_arr, SIZE); reverse_array(my_arr, SIZE); return 0; }

 חשבון מצביעים כדי להגיע לתא השלישי במערך נוכל לעשות a[2] או *(a+2) כדי להגיע לתא השלישי במערך נוכל לעשות a[2] או *(a+2) a[0] 5000 a[1] 5004 a[2] 5 5008  a[9]

חשבון מצביעים reverse_array(my_arr, my_arr + SIZE -1); void reverse_array(int *begin, int *end) { while (begin < end) swap(begin, end); begin++; end--; } a e d r a e begin end

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

a b קלט 1 3 100 11 22 22 445 445 35 35 15 22 445 35 &a[4] פלט

int. findSubArray (int. array, int array_size, int int *findSubArray (int *array, int array_size, int *sub_array, int sub_size) { int i, j; for (i = 0; i <= array_size - sub_size; i++,array++) for (j = 0; j < sub_size; ++j) if ( *(array + j) != sub_array[j] ) break; if (j == sub_size) return array; } return NULL;

#include <stdio.h> int *findSubArray (int *array, int array_size, int *sub_array, int sub_size); int main() { int array1[] = {1, 45, 67, 1001, -19, 67, 89, 1004, -867, 34, 3, -1900, 10029}, array2[] = {34, 3, -1900}, *position; position = findSubArray (array1, sizeof (array1) / sizeof (int), array2, sizeof (array2) / sizeof(int)); printf ("array2 appears in array1 starting from place : %d.\n", (position == NULL)? -1 : position - array1 + 1); return 0; }

מחרוזות מחרוזת – מחרוזת זה מערך של תווים אשר מסתיים ב ‘\0’. ‘S’ a[0] 5000 char a[6] = “Shai”; printf(“%s”,a); a[1] ‘h’ 5001 a[2] ‘a’ 5002 5003 a[3] ‘i’ a[4] ‘\0’ 5004 a[5] 5005 הדפסה באמצעות %s

מחרוזות הסיום ב ‘\0’ מאפשר לנו להעביר מחרוזות לפונקציות מבלי לציין את גודלם!!! פונקציה טיפוסית של מחרוזות תראה כך: void string_func(const char *s) { … while (*s != ’\0’) מונע שינוי של המחרוזת

#include <stdio.h> int strlen (const char * str) { const char *eos = str; while( *eos++ ) ; return( eos - str - 1 ); } int main() char str[]="Shai"; printf("%d",strlen(str)); return 0; מה קורה פה ? 100 101 102 103 104 105 106 L I N U X ‘\0’ eos str

דרכים נוספות להגדיר מחרוזות char *p = “hello”; char s[ ] = “hello”; p s h e l l o \0 h e l l o \0 קלט למחרוזת scanf(“%s”, str); עד לרווח

תרגיל כתבו פונקציה המקבלת שתי מחרוזות ובודקת האם הן זהות. אם כן, הפונקציה תחזיר 1. אם לא, אז יוחזר 0.

#include <stdio.h> int compare (char s1[ ],char s2[ ]) { int k; for ( k=0; s1[k] != ‘\0’ || s2[k] != ‘\0’; k++ ) if ( s1[k] != s2[k] ) return 0; return 1; } void main() char s1[31],s2[31]; scanf(“%s%s”,s1,s2); printf(“%d\n”,compare(s1,s2));

string.h הספריה מכילה בין השאר את הפונקציות הבאות לטיפול במחרוזות: strlen(s) – מחזירה את האורך של המחרוזת s. strcpy(s,t) – מעתיקה את המחרוזת t ל-s. strcmp(s,t) – משווה ביו המחרוזות s ו-t. strstr(s,t) – מחפשת את המחרוזת t בתוך המחרוזת s.

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

#include <stdio.h> #include <string.h> int main() { char s[101]; int k,len; scanf(“%s”,s); len = strlen(s); for ( k=0; k<len/2; k++ ) if ( s[k] != s[len-1-k] ) printf(“The string is not a palindrome!\n”); return 0; } printf(“The string is a palindrome!\n”);

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

הקצאת זיכרון דינאמית C מאפשרת לנו להקצות זיכרון תוך כדי ריצת התוכנית וכך להגדיר מערכים ומבנים אחרים בצורה דינאמית int main() { int a[10]; a[6] = 7; } 10 ints 6024 int main() { int *a; a = (int*) malloc(sizeof(int) * 10); a[6] = 7; } a 6024 10 ints

שחרור זיכרון שהוקצה דינאמית כל שטח זיכרון שהוקצה ע"י המתכנת צריך להיות משוחרר בסיום השימוש בו. לכן חייבים תמיד להחזיק את כתובת האזור שהוקצה על מנת שנוכל לשחרר אותו בסיום השימוש. int main() { int *a; a = (int*) malloc(sizeof(int) * 10); a[6] = 7; free(a); } 6024 a 6024

הקצאת זיכרון דינאמית במערך אם נרצה להוסיף איבר חדש נוסף נצטרך להעתיק את כל האיברים הישנים למערך גדול יותר אשר הקצנו נקצה מערך חדש ונעתיק אליו את המערך הישן 10 ints 1 ints

הקצאת זיכרון דינאמית #define SIZE 10 int main() { int *a,*b,i; a = (int*) malloc(sizeof(int) * SIZE); for (i=0;i<SIZE;i++) a[i] = i; b = (int*) malloc(sizeof(int) *( SIZE + 1)) b[i] = a[i]; b[i] = i; free(a); free(b); }

הפונקציות נמצאות ב- stdlib.h void *malloc(size_t size); Allocate size bytes. Successful call return base address; otherwise NULL is returned. void free(void *ptr) Deallocate the memory pointed by ptr which must be a base address of previously allocated memory

דוגמא – הקצאת זיכרון דינאמית void FillArray(int arr[ ], int n) { int i; for(i = 0; i < n; i++) arr[i] = rand()%100 + 1; } void PrintArray(int arr[ ], int n) for(i = 1; i <= n; i++) printf("%3d ", arr[i - 1]); if (i % 10 == 0) printf("\n"); #include <stdio.h> #include <stdlib.h> void FillArray(int arr[ ], int n); void PrintArray(int arr[ ], int n); int main() { int *a, n; scanf("%d", &n); a = (int *)malloc(n * sizeof(int)); FillArray(a, n); PrintArray(a, n); free(a); return 0; }