Programming in C תרגול 8

Similar documents
Introduction to Programming in C תרגול 8

Computer Programming A תרגול 9

מבוא לתכנות בשפת C. Tzachi (Isaac) Rosen

קורס תכנות כתובות בזיכרון כתובות בזכרון מצביעים וכתובות מצביעים וכתובות שיעור שביעי: מבנים, הקצאת זיכרון דינאמית האופרטור &

מערכים שעור מס. 4 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 1

קורס תכנות שיעור שישי: מחרוזות, מצביעים

קורס תכנות בשיעור הקודם למדנו על רקורסיה שיעור שישי: מערכים פונקציה רקורסיבית שאלה חישוב נוסחאות רקורסיביות בשפת C

מבוא לתכנות תוכנית שעור מס. 1 1 דר' דרור טובי, המרכז האוניברסיטאי אריאל בשומרון.

מבוא למדעי המחשב תרגול 13: עצים בינאריים

תרגול 4 פונקציות. מבנה של פונקציה: public static <return value type> <function name> (<arg1 type> <arg1>, <arg2 type> <arg2>, ) { <function body> }

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

תרגול 3 מערכים ופונקציות

Engineering Programming A

מצליחה. 1. int fork-bomb() 2. { 3. fork(); 4. fork() && fork() fork(); 5. fork(); printf("bla\n"); 8. return 0; 9. }

מבוא לתכנות ב- JAVA תרגול 7

תרגול מספר 3: מערכים

שאלה 1 מהו הפלט של התוכנית הבאה:

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

רזח יליגרתו םי יראני ב ם

תכנות מתקדם בשפת C משתנים

משתנים שעור מס. 2 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 1

מבוא לתכנות ב- JAVA תרגול 6

מבוא לתכנות ב- JAVA מעבדה 4

<exp> ::= <define> <cexp> <define> ::= ( define <var-decl> <cexp> ) / DefExp(var:VarDecl, val:cexp)

עמוד 1 (תאריך ( âùéä ער äìàù בכל השאלות ניתן להניח שהקלט תקין. 100 íåëñ חורף :

$ gcc check.c. $ a.out. $ gcc check.c -o check. $ check. $ gcc -Wall check.c -o check. #include <stdio.h>

הנכות 1 םוכיס לוגרת 14 1

תרגילים ופתרונות בשפת - C הסתעפויות

Tutorial 10. Introduction to C++ שימו

הנכות 1 םוכיס לוגרת 13 1

מבוא למדעי המחשב תירגול 2: מבוא למדעי המחשב מ' - תירגול 2

Algorithms. Intro2CS week 5

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

פתרון מוצע לבחינת מה"ט ב_שפת c מועד אביב תשע"ח, פברואר 8102 מחבר: מר שייקה בילו, מכללת אורט רחובות

תוכנה 1 סמסטר א' תשע"א

מבוא למדעי המחשב תירגול 3:

הקלחמ ה תמרב ת ונ וכ ת (static members ) יליזרב דהוא Java תפשב ם דקת מ תונכת ביבא ל ת תטיסרבינוא

תרגול 3 מערכים ופונקציות

סכום (סדרת ערכים) אחרת - דוגמא: סכום-ספרות (num) אם < 10 num החזר 1 או אם = 0 = num החזר 0 public static int numofdigits (int num)

מבוא לתכנות ב- JAVA תרגול 5. Ipc161- practical session 5

Smart Pointers Nir Adar

מבוא למדעי המחשב תרגול 8 רשימה משורשרת כללית, Comparator

תוכנה 1 בשפת Java נושאים שונים בהורשה רובי בוים ומתי שמרת בית הספר למדעי המחשב אוניברסיטת תל אביב

הנכות 1 םוכיס לוגרת 13 1

תוכנה 1 תרגול מספר 13

תוכנה 1 תרגול מספר 13

קורס תכנות שיעור שני: שימוש במשתנים,

הנכות 1 תואיגש םע תודדומתהו תואלול,םי : כרעמ 2 לוגרת

הנכות 1 תואיגש םע תודדומתהו תואלול,םיכרעמ : לו 2 גרת

מדעי המחשב 2 יחידות לימוד פתרון בחינת הבגרות פרק א. I x > a. פתרון 2: משפט switch

תוכנה 1. תרגול מס' 3 עבודה עם מחרוזות )Strings( מתודות )Methods( העברת פרמטרים

Practical Session No. 14 Topological sort,amortized Analysis

תוכנה 1 תרגול 2: מערכים ומבני בקרה

תוכנה 1. תרגול מספר 11: Static vs. Dynamic Binding מחלקות מקוננות Nested Classes

פתרון מוצע לבחינה בשפת C של מה"ט מועד אביב תשע"ז, פברואר 2017 מחבר: מר עסאקלה שאדי, מכללת אורט בראודה

מבוא לתכנות ב- JAVA מעבדה 2

במידה ולסעיף ניתנה תשובה ובנוסף נרשם לגבי הסעיף לא יודע/ת אזי הניקוד שיינתן

פרק 15 טיפוס חדש: מבנים שימוש במבנים שימוש במבנים שימוש במבנים

ב ה צ ל ח ה! אוניברסיטת בן גוריון בנגב מספר נבחן : תאריך המבחן: כ"ה תשרי תשע"ח 15/10/17 שמות המורים: ציון סיקסיק מיועד לתלמידי : א'

תוכנה 1 טיפוסי השפה טיפוסים לא פרימיטיביים הטיפוסים הפרימיטיביים מחרוזות המרה למספרים תרגול 2: טיפוסי שפה, מחרוזות, מערכים ושגיאות

תוכנה 1 תרגול 2: מערכים, מבני בקרה ושגיאות

ת ונכת סרוק תורשוקמ תומישר :יעישת רועיש 1

ספרית התבניות הסטנדרטית (STL) כתיבת אלגוריתמים גנריים מצביעים חכמים. .vector. list iterator נכיר תחילה את האוסף הפשוט ביותר בספריה

Chapter 11.2 Linked lists ( )

הנכות 1 םוכיס לוגרת 13 1

תכנות מונחה עצמים משחקים תשע"ו

Amortized Analysis, Union-Find,

APS105. Malloc and 2D Arrays. Textbook Chapters 6.4, Datatype Size

Programming for Engineers in Python

Programming for Engineers in Python

Practical Session - Heap

ASP.Net Web API.

כתבו קוד ב- 3 קבצי ה hpp (כתבו כהערה את שם הקובץ מעל) כך שהקוד יהיה תקין ובסגנון טוב. אין חובה

מבוא לתכנות ב- JAVA מעבדה 3. Ipc161-lab3

Communication Networks ( ) / Spring 2011 The Blavatnik School of Computer Science, Tel-Aviv University. Allon Wagner

תרגול 6 רקורסיה ותכנות מונחה עצמים

Procedural programming with C

תוכנה 1. תרגול 1: סביבת העבודה ומבוא ל- Java

דף הדרכה ליצירת שרת/ לקוח עם GUI

תרגול 12. Standard Template Library כתיבת אלגוריתמים גנריים מצביעים חכמים

תוכנה 1 * לא בהכרח בסדר הזה

הפלט אחרי הביצוע של ההוראה :what3(root)

שאלה 1, סעיף ב )11 נק'(

חוברת תרגילים לתרגול יסודות התכנות

תזכורת: עץבינארי מבוא למדעי המחשב הרצאה 24: עצי חיפוש בינאריים

מבוא לתכנות מערכות מבחן מועד א' סמסטר חורף

Exams questions examples

C for Java Programmers 1. Last Week. Overview of the differences between C and Java. The C language (keywords, types, functies, etc.

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

C Pointers. Abdelghani Bellaachia, CSCI 1121 Page: 1

These problems are provided to you as a guide for practice. The questions cover important concepts covered in class.

קורס תכנות רשימה מקושרת דוגמה: חיפוש מעבר על רשימה דוגמא: שחרור רשימה מקושרת דוגמא: הוספת אברים שלא בהתחלה

מחרוזות ב Java ותכנות מונחה בדיקות )Test Driven Development(

שים לב! אין לכתוב בשוליים. השוליים יחתכו לצורך סריקת המבחן.

עקרונות שפות תכנות 2016 תרגול 8 Type Inference System. Substitution Interpreter.

מבוא למדעי המחשב תרגול 5: לולאות ומערכים

תוכנה 1 מערכים. Array Creation and Initialization. Array Declaration. Array Creation and Initialization. Loop through Arrays

תוכנה 1 3 תרגול מס' מערכים ומבני בקרה


Graph Database, think different!

Transcription:

Programming in C תרגול 8 1 1

נושאים מצביעים רקע אופרטורים על מצביעים מצביעים כפרמטרים לפונקציה הקצאת זיכרון דינאמית Malloc free

מצביעים תאור הזיכרון של המחשב: ניתן לחשוב על זיכרון המחשב כעל רצף של תאים, כל אחד בגודל בית )byte( כאשר כל בית בגודל של 8 סיביות.)bits( כל תא בזיכרון מזוהה ע"י ערך מספרי המתאר את מיקומו המדוייק. ערך זה הינו הכתובת של התא בזיכרון address(.)memory למשל, אם נגדיר את המשתנים הבאים: char var1; // storage for type char is 1 byte. double var2; // storage for type char is 8 byte. int var3; // storage for type char is 4 byte. var1 var2 var3 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 כתובת של משתנה הינה הכתובת של הבית הראשון ברצף הבתים שמשתנה זה תופס בזיכרון. ברגע שנצהיר על משתנים כמצביעים, נוכל להציב לתוכם כתובות של משתנים. לדוגמא: int x = 200 ; int p; /*Declaration of a pointer p that is of type int *.*/ p=&x; /*Assign the address of x to be the value of p.*/.x בשלב זה המשתנה p מכיל את הכתובת של המשתנה

אופרטורים מצביעים x& היא כתובת הזיכרון של x, כלומר האופרטור & מציין האופרטור & אם x הוא משתנה אזי "כתובתו של ". מצביעים :(pointers) מצביע הינו משתנה שהערך שלו הוא כתובת של משתנה כלשהו. במילים אחרות, מצביע הינו משתנה שמצביע למשתנה אחר. אם נרצה להגדיר את p כמצביע למשתנה כלשהו מטיפוס, int שורת ההצהרה תיראה כך: ;p* int באופן כללי, תבנית הצהרה על מצביעים הינה: <variable-type> *<variable name>; האופרטור האופרטור הינו אופרטור שפועל על מצביעים. למשל עבור הדוגמה הקודמת p* שקול ל- x. כלומר p* הוא התוכן של תא הזיכרון ש- p מצביע עליו.

דוגמאות int x = 200 ; int p; /*Declaration of a pointer p that is of type int *.*/ p=&x; /*Assign the address of x to be the value of p.*/ p=500; // < שקול= => x=500;. int *pi; *pi = 100; /*wrong!!!!*/ זהירות בעת שימוש במצביעים: כשמצהירים על מצביע p אין הוא בהכרח מצביע על ערך חוקי! טעות זו ידועה בשם segmentation fault,זוהי אינה שגיאת קומפילציה, אלא, שגיאה בזמן ריצה.

העברת מצביעים כפרמטרים לפונקציה מכיוון שמצביעים הם משתנים לכל דבר, ניתן להעביר את ערכיהם בתור פרמטרים לפונקציות. מנגנון זה מאפשר לפונקציה נקראת לשנות את ערכיהם של משתנים בסביבה הקוראת. לדוגמא,נכתוב פונקציה אשר מחליפה בין ערכיהם של זוג משתנים מטיפוס :int void swap(int a, int b){ int tmp = a; a = *b; *b = tmp; כתובת של מערך שמו של מערך דומה למצביע המייצג את הכתובת של האיבר הראשון בתוך המערך. על אף הדמיון, חשוב לזכור ששם של מערך אינו מצביע שכן הוא מייצג כתובת קבועה, לא ניתן לשנותה במהלך התוכנית.

דוגמא נוספת #include <stdio.h> void main(){ int x, *px; int y, *py ; /*Define a variable of type int named "x" and a variable of type pointer to int named "px".*/ px=&x; /*Assign the address of "x" to be the value of "px".*/ py=&y; scanf("%d%d",px,py); /*Read two integers values from the input and assign them to "x" and "y". Make sure that you understand why!!! */ printf("x=%d, y=%d\n",*px,*py); /*Print the values of the x and y which are the variables pointed to by px and py. */

תרגיל 1 int a, *b, c[4]; :C שאלה 1: נתונה השורה הבאה של תכנית בשפת סמנו את כל ההוראות שאינן יכולות להופיע באופן חוקי בהמשך התכנית. הוראה חוקית היא הוראה נכונה מבחינה תחבירית שעוברת קומפילציה. (א 8; = *(c+3) (ב *b); a = *(c + (ג 12; = *(c++) (ד b; c = (ה c; b = (ו (*c)++; a = (ז (*c)++; *(b+1) = (ח *c; a = *b - (ט *(b++); *c = (י *(&a); *(b++)= (יא *b==2=a; (יב 2; == *b c[3] = int x=2, y=5; unsigned int addr; addr = (unsigned int) &x; y = *((int *)addr); y=2

int a, *b, c[4]; תרגיל 1 שאלה 1: נתונה השורה הבאה של תכנית בשפת C: סמנו את כל ההוראות שאינן יכולות להופיע באופן חוקי בהמשך התכנית. הוראה חוקית היא הוראה נכונה מבחינה תחבירית שעוברת קומפילציה. (א *(c+3) = 8; c[2]=8; // (ב *b); a = *(c + (ג l-value*/ *(c++) = 12; /*Compilation Error: error C2105: '++' needs (ד l-value*/ c = b; /*Compilation Error: error C2106: '=' : left operand must be (ה c; b = (ו (*c)++; a = (ז (*c)++; *(b+1) = (ח *c; a = *b - (ט *(b++); *c = (י *(&a); *(b++)= (יא l-value*/ *b==2=a; /*Compilation Error: error C2106: '=' : left operand must be (יב 2; == *b c[3] =

char * func1 () { char A [5]= "1234"; return A; { char * func2 () { char A [5]= "abcd"; return A; void main () { char * Arr1, * Arr2; מה תדפיס התוכנית הבאה? { Arr1=func1(); Arr2=func2(); printf("arr1 is %s, Arr2 is %s\n", Arr1, Arr2); ו Arr2 Arr1 is 1234, Arr2 is abcd Arr1 is abcd, Arr2 is abcd התוכנית תרוץ אך תדפיס ערכים לא צפויים עבור Arr1 נקבל הודעת שגיאה בקומפילציה נקבל הודעת שגיאה בזמן ריצה.1.2.3.4.5

#include <stdio.h> #define MAX_LENGTH 80 תרגיל 2 תוכנית לחישוב אורך המחרוזת עם שימוש במצביעים: int my_strlen (char *s){ char *p = s; while (*p) p++; return p - s; void main(){ char str[max_length]; int len; printf("enter a string:"); gets(str); len = my_strlen(str); printf("the lenght of the string %s is %d \n",str,len);

#include <stdio.h> #include <string.h> #define MAX_LENGTH 81 תרגיל 3 תוכנית לחיבור 2 מחרוזות הממחישה שימוש במצביעים: /*Option #1*/ void stringcat(char *s1, char *s2){ while (*s1 ) ++s1; /*We could equivalently have written: s1++; */ do *s1 = *s2; s1++; s2++; while(*s2); *s1 = '\0'; /*Option #2*/ void stringcat(char *s1, char *s2){ while (*s1 ) ++s1; while(*(s1++) = *(s2++)); {

/*Option #3*/ המשך תרגיל 3 void stringcat(char *s1, char *s2){ strcpy(s1+strlen(s1),s2); void main(){ char str1[max_length], str2[max_length]; printf("enter a string #1 with maximum %d characters:",(max_length-1)/2); gets(str1); printf("enter a string #2 with maximum %d characters:",(max_length-1)/2); gets(str2); stringcat(str1,str2); /*We can use any (but not more than one) of the options above! */ printf("the final string is \"%s\" \n",str1);

תרגיל 4 כתוב פונקציה *st2) char * strstr(char *st1, char שמקבלת כארגומנט שתי מחרוזות. במידה שהמחרוזת st2 מוכללת במחרוזת,st1 הפונקציה מחזירה מצביע לתו של st1 שממנו מתחילה המחרוזת הזאת, אחרת הפוקציה מחזירה.NULL #include <stdio.h> #include <stdlib.h> char * iterstrstr(char *st1, char *st2){ char *p1,*p2; int len2 = strlen(st2); int len1 = strlen(st1); while (len1>=len2){ for(p1=st1,p2=st2;*p2 && *p1==*p2;p1++,p2++); if(!*p2) return st1; st1++; len1--; return NULL;

המשך תרגיל 4 void main(){ char st1[]="bnbnbacdhghg",st2[]="acd"; char *c; if(c= strstr(st1,st2)) printf ("The first character in both st2 and st1 is %c\n ",*c); else printf ("Sorry, st2 isn't contained in st1!!!\n"); {

זיכרון דינמי ישנן שתי שיטות לביצוע הקצאת זיכרון: הקצאת זיכרון סטטית והקצאת זיכרון דינאמית. הקצאת זיכרון סטטית - המהדר קובע את דרישות האחסון על פי הצהרת המשתנים, בזמן הקומפילציה )כך הקצאנו זיכרון עד כה!(. בעיה שלעיטים צצה היא שאין אנו יכולים לנחש מראש את כמות הזיכרון שהתוכנית שלנו עלולה לצרוך. הקצאת זיכרון דינאמית - הקצאת מקום נעשה בזמן בריצה על יד קריאה לפונקציה malloc() )קיצור ל- allocation.)memory פונקציה זו מקבלת כפרמטר את מס' הבתים שברצונינו להקצות ומחזירה את הכתובת של הבית הראשון ברצף הבתים שהקצאתה. אם הפונקציה נכשלת מוחזר הערך.NULL שחרור זיכרון דינאמית - מכיוון שהקצאת הזיכרון נעשתה בזמן ביצוע התוכנית, יש לדאוג לשחרר את הזיכרון לאחר שנסיים להשתמש בו. שיחרור של זיכרון דינאמי נעשה ע"י קריאה לפונקציה.free() הפונקציה מקבלת מצביע לכתובת תחילת קטע הזיכרון שרוצים לשחרר.

אופרטורים האופרטור sizeof האופרטור sizeof מחזיר את גודלו של הטיפוס בבתים. sizeof (name_of_charecter) תבנית: לדוגמא: (float) sizeof מחזיר 4. אילו הינו כותבים: float f; sizeof(f) היה מחזיר את אותו דבר )4(. שימוש בפונקציה :malloc variable_pointer = (pointer_type) malloc (size_of_memory); דוגמא: int size, *p_list; printf("enter the number of elements:"); scanf("%d", &size); p_list = (int*)malloc (size * sizeof(int)); if (l_list == NULL){ printf ("Failed to allocate memory, quiting "); return; free(l_list);

תרגיל 5 תוכנית להדגמה של מערך דו-מימדי דינאמי: כשרוצים להגדיר מערך דו מימדי בעל גודל משתנה, עלינו ליצור מערך של מצביעים למערכים. גודל המערך לא ידוע בתחילת התכנית ולכן נגדיר את המערך באמצעות פונקצית.malloc() בתחילה נאתחל מערך של מצביעים, ולאחר מכן נאתחל כל מצביע להיות מערך של ה- type הרצוי. למשל, יצירת מערך של int -ים בגודל המוגדר ע"י המשתמש שבכל איבר בו יש את הערך של מכפלת האינדקסים שלו: #include <stdio.h> #include <stdlib.h> void main(){ int i,j,rows,cols,t; int **array; printf("enter num of rows: "); scanf("%d",&rows); printf("enter num of columns: "); scanf("%d",&cols); if (!(array=(int **)malloc(rows*sizeof(int *)))){ printf("memory allocation failed, quiting "); return;...

for (i=0;i<rows;i++) המשך תרגיל 5 /*Fill in the different rows:*/ if (!(array[i]=(int *)malloc(cols*sizeof(int)))) for (t=0;t<i;t++) /*Free all priory allocated memory:*/ free(array[t]); free(array); printf("memory allocation failed, quiting "); return; /*Terminate the program!*/ for (j=0;j<cols;j++) /*Fill in the different columns:*/ array[i][j]=i*j; for (i=0;i<rows;i++){ /*Print the different rows:*/ for (j=0;j<cols;j++) printf("%d ",array[i][j]); printf("\n");

המשך תרגיל 5 /*Free allocated memory:*/ for(i=0;i<rows;i++) free(array[i]); free(array);

תרגיל 6 עיין בקטע הבא וסמן את כל התשובות הנכונות: #include <stdio.h> #include <stdlib.h> #define MAX 10 void main(){ int *ptr, *arr[max]; int i, j; for (i=max-1 ; i>=0; i--) if (arr[i] = (int *) malloc(i * sizeof(int))) for (j=0; j<i; j++) *(*(arr+i)+j) = j*i; ptr = *(arr+max-1); while (*ptr) printf ("%d ", *ptr--); התכנית לא מדפיסה כלום. יש שגיאה בזמן ריצה error).(run time התכנית תדפיס:.72 63 54 45 36 27 18 9 התכנית תדפיס אינסוף אפסים. התכנית תדפיס 0. התכנית תדפיס ערכים לא ידועים. אף לא אחת מהתשובות לעיל..1.2.3.4.5.6.7

פתרון תרגיל 6