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

46
בבבב בבבב בבבבב בבבבב בבבב בבבב בבבבב בבבבב בבבבב בבבבב

Upload: vance-ball

Post on 04-Jan-2016

41 views

Category:

Documents


5 download

DESCRIPTION

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

TRANSCRIPT

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

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

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

הבית האדום

2כתובת : רחוב קוקוריקו

הבית הירוק

4כתובת : רחוב קוקוריקו

הבית הצהוב

1כתובת : רחוב קוקוריקו

הבית הורוד

3כתובת : רחוב קוקוריקו

2?”הבית האדום“מה הכתובת של

?2מי גר בבית מספר

רמי

יוסי

שמעון

אבנר

רמי

רמי?”בית האדום“מי גר ב

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

2000כתובת :

a 2000?מה הכתובת של2000מה נמצא בתא ?

a

80

3

7

5

a?5מה נמצא ב

5

b

cd

1000כתובת :

3000כתובת : 4000כתובת :

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

מצביעיםמצביעים

לכל משתנה שמוגדר בתוכנית יש כתובת לכל משתנה שמוגדר בתוכנית יש כתובת •

הכתובת שלו היא מיקומו בזכרוןהכתובת שלו היא מיקומו בזכרון•

למשללמשל

. . bytesbytes 44 אזי צורכים אזי צורכים intintכאשר משכנים מספר מסוג כאשר משכנים מספר מסוג

int a; a5000

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

מצביעיםמצביעים

int a;

int b;

a = 5;

b = 7;

a5000

b5004

5

7

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

מצביעיםמצביעים

int a, b;

int *p1;

int *p2;

a = 5;

b = 7;

p1 = &a;

p2 = &b;

a5000

b5004

5

7

p17026

p27030

5000

5004

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

מצביעיםמצביעים

int a, b;int *p1;int *p2;a = 5;b = 7;p1 = &a;p2 = &b;

a5000

b5004

5

7

p17026

p27030

5000

5004

*p1 = 2;*p2 = *p1;

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

מצביעיםמצביעים

int a, b;int *p1;int *p2;a = 5;b = 7;p1 = &a;p2 = &b;

a5000

b5004

2

2

p17026

p27030

5000

5004

*p1 = 2;*p2 = *p1;

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

תרגילתרגיל

. אתחל אותם לערכים b ו aהגדר שני משתנים כלשהם.

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

בכתובות האלו.

. p%להדפסת מצביע נשתמש בפורמט

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

#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;

}0012F60 0012F5410 2

פלט

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

מצביעיםמצביעיםעד היום הפונקציות שלנו ידעו לקבל ערכים של עד היום הפונקציות שלנו ידעו לקבל ערכים של

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

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

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

5

3

printf

3

a

2020

5

b

2034

int a=3,b=5;printf(“%d %d”,a,b)

, b ואת aאין צורך לדעת את כתובותיהם שלאלא רק את ערכיהם

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

scanfa

2020

b

2034

int a,b;scanf(“%d %d”,&a,&b)

, ולא b ו aצריך לדעת את כתובותיהם שלאת ערכיהם

35

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

int main(){ int a;

scanf(“%d”,&a);}

a5000

scanf

*pa = ערך מהמשתמש

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

void swap (int q,int p)void swap (int q,int p)

{{

int temp =p;int temp =p;

p = q; p = q;

q = temp;q = temp;

}}

int main(){ int a=10,b=2,x=3,y=5;

…swap(x, y);

…swap(a, b);

}

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

void swap (int *p,int *q)void swap (int *p,int *q)

{{

int temp = *p;int temp = *p;

*p = *q; *p = *q;

*q = temp;*q = temp;

}}

int main(){ int a=10,b=2,x=3,y=5;

…swap(&x,&y);

…swap(&a,&b);

}

x5000

y5004

3

5

p7026

q7030

5000

5004

7034 temp3

5

3

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

תרגילתרגילכתבו פונקציה שמקבלת אורך ורוחב של מלבן כתבו פונקציה שמקבלת אורך ורוחב של מלבן

ומחזירה את שטח המלבן ואת היקפו.ומחזירה את שטח המלבן ואת היקפו.

void rectangle(int a,int b,int *area, int *circuit);

int main(){

int x, y;int area,circuit;scanf("%d %d",&x,&y);rect_area(x,y, &area,&circuit);printf(“Area is %d Circuit is %d\n", area, circuit);return 0;

}

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

פתרוןפתרון

void rect_area(int a,int b,int *area,int *circuit){

*area = a * b;*circuit = 2 * (a + b);

}

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

הקשר בין מערכים למצביעיםהקשר בין מערכים למצביעיםנרצה לעמוד על הקשר בין מערך למצביענרצה לעמוד על הקשר בין מערך למצביע

מאחר ומערכים הם הכללה של משתנים הרי שברור מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו יש כתובת שלמערך ולכל אחד מאיבריו יש כתובת

a[0]

a[1]

a[2]

a[9]

5

5000

5004

5008

כדי להגיע לכתובת של תא כדי להגיע לכתובת של תא a[2]a[2]&&במערך פשוט נכתוב במערך פשוט נכתוב

של של הכתובתהכתובתאם נרצה את אם נרצה את המערך עצמו אזי זה שם המערך עצמו אזי זה שם

המערךהמערך

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

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

הפונקציה תקבל מערך )את כתובתו( ותדפיס אותו:הפונקציה תקבל מערך )את כתובתו( ותדפיס אותו:void PrintArray(int a[],int size)void PrintArray(int a[],int size){{

int i;int i;for (i=0;i<size;i++)for (i=0;i<size;i++)

printf(“%d”,a[i]);printf(“%d”,a[i]);}}

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

הקשר בין מערכים לפונקציותהקשר בין מערכים לפונקציות

הפונקציה תקלוט איברים לתוך מערךהפונקציה תקלוט איברים לתוך מערך

void GetArray(int a[],int size)void GetArray(int a[],int size){{

int i;int i;for (i=0;i<size;i++)for (i=0;i<size;i++)

scanf(“%d”,&a[i]);scanf(“%d”,&a[i]);}}

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

void PrintArray(int a[],int size);

int main(){

int a[20];GetArray(a,20);PrintArray(a,20);return 0;

}

void GetArray(int a[],int size);

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

rand()rand() ניתן לייצר מספרים פסאודו-אקראיים ניתן לייצר מספרים פסאודו-אקראיים CCבשפת בשפת •

ע"י הפונקציהע"י הפונקציה• int rand(void);int rand(void);• X = rand();X = rand();

stdlib.hstdlib.hהפונקציה נמצאת ב-הפונקציה נמצאת ב-•--00הפונקציה מחזירה מספר בטווח הפונקציה מחזירה מספר בטווח •

RAND_MAXRAND_MAX מוטב לבצע קריאה מוטב לבצע קריאה randrandאם משתמשים ב-אם משתמשים ב-•

בתחילת התוכנית בתחילת התוכניתsrandsrandאחת ל-אחת ל-• void srand(unsigned int);void srand(unsigned int);

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

srandsrand שימוש ב-שימוש ב-

השימוש יהיה כךהשימוש יהיה כך•

• srand(time(NULL));srand(time(NULL));

•timetime פונקציה שמחזירה את הזמן ונמצאת פונקציה שמחזירה את הזמן ונמצאת time.htime.hבספרייה בספרייה

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

randrand

איך נייצר ערכים אקראיים בטווח אחר מאשר איך נייצר ערכים אקראיים בטווח אחר מאשר • 00--RAND_MAXRAND_MAX??

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

randrand

איך נייצר ערכים אקראיים בטווח אחר מאשר איך נייצר ערכים אקראיים בטווח אחר מאשר •00--RAND_MAXRAND_MAX??

נשתמש בשאריתנשתמש בשארית•

• rand() % 10 rand() % 10 /*randomly in 0 – 9*//*randomly in 0 – 9*/

• rand() % 10 + 1 rand() % 10 + 1 /* randomly in 1 – /* randomly in 1 – 10*/10*/

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

תרגילתרגילכתבו את הפונקציות הבאות: כתבו את הפונקציות הבאות:

-1-1פונקציה שממלא מערך במספרים אקראיים בטווח פונקציה שממלא מערך במספרים אקראיים בטווח •100100

פונקציה שמדפיסה מערךפונקציה שמדפיסה מערך•פונקציה שהופכת את המערך (רמז: השתמשו פונקציה שהופכת את המערך (רמז: השתמשו •

) )swapswapבפונקציה בפונקציה

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

פתרוןפתרון

מילוי מערךמילוי מערך

void fill_array(int arr[], int size){

int i;srand(time(NULL));for (i = 0; i < size; i++)

arr[i] = rand() % 100 + 1;}

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

פתרוןפתרון

הדפסת מערךהדפסת מערך

void print_array(int arr[], int size){

int i;for (i = 0; i < size; i++)

printf("%d ", arr[i]);printf("\n");

}

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

פתרוןפתרון

הפיכת מערךהפיכת מערך

void reverse_array(int arr[], int size){

int i;for (i = 0; i < size/2; i++)

swap(&arr[i], &arr[size - 1 - i]);}

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

#include <stdio.h>#include <stdlib.h>#include <time.h>void fill_array(int arr[], int size);void reverse_array(int arr[], int size);void print_array(int arr[], int size);void swap(int *a, int *b);int main(){

int my_arr[15];fill_array(my_arr, 15);print_array(my_arr, 15);reverse_array(my_arr, 15);print_array(my_arr, 15);return 0;

}

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

חשבון מצביעיםחשבון מצביעים

a[0]

a[1]

a[2]

a[9]

5

5000

5004

5008

כדי להגיע לתא השלישי כדי להגיע לתא השלישי a[2]a[2]במערך נוכל לעשות במערך נוכל לעשות

או או

*(a+2)*(a+2)

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

void reverse_array(int *begin, int *end){

while (begin < end){

swap(begin, end);begin++;end--;

}}

reverse_array(my_arr, my_arr + SIZE -1);חשבון מצביעיםחשבון מצביעים

begin end

a ee ad r

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

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

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

..NULLNULL אם לא אז יוחזר אם לא אז יוחזר

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

100 11 2231 445 35 15 22 445 35

קלט

a[4]&פלט

a b

22 445 35

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

int *findSubArray (int *array, int array_size, int int *findSubArray (int *array, int array_size, int *sub_array, int sub_size)*sub_array, int sub_size)

{{int i, j;int i, j;for (i = 0; i <= array_size - sub_size; i++,array+for (i = 0; i <= array_size - sub_size; i++,array++)+){{

for (j = 0; j < sub_size; ++j)for (j = 0; j < sub_size; ++j)if ( *(array + j) != sub_array[j] )if ( *(array + j) != sub_array[j] )

break;break;if (j == sub_size)if (j == sub_size)

return array;return array;}}return NULL;return NULL;

}}

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

#include <stdio.h>#include <stdio.h>int *findSubArray (int *array, int array_size, int *sub_array, int int *findSubArray (int *array, int array_size, int *sub_array, int

sub_size);sub_size);int main()int main(){{

int array1[] = {1, 45, 67, 1001, -19, 67, 89, 1004, -867, 34, int array1[] = {1, 45, 67, 1001, -19, 67, 89, 1004, -867, 34, 3, -1900, 10029},3, -1900, 10029}, array2[] = {34, 3, -1900}, *position;array2[] = {34, 3, -1900}, *position;position = findSubArray (array1, sizeof (array1) / sizeof (int), position = findSubArray (array1, sizeof (array1) / sizeof (int),

array2, sizeof (array2) / sizeof(int));array2, sizeof (array2) / sizeof(int));printf ("array2 appears in array1 starting from place : %d.\printf ("array2 appears in array1 starting from place : %d.\n", n",

(position == NULL)? -1 : position - array1 + 1);(position == NULL)? -1 : position - array1 + 1);

return 0;return 0;}}

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

מחרוזותמחרוזותמחרוזת זה מערך של תווים אשר מחרוזת זה מערך של תווים אשר מחרוזת – מחרוזת –

. . ’’00‘\‘\מסתיים ב מסתיים ב

char a[10] = “CS4Math”;

printf(“%s”,a);

s%הדפסה באמצעות

‘C’‘S’‘4’‘M’‘a’‘t’‘h’‘\0’‘$’‘^’

5000500150025003500450055006500750085009

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]

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

מחרוזותמחרוזות מאפשר לנו להעביר מחרוזות מאפשר לנו להעביר מחרוזות ’’00‘\‘\ הסיום בהסיום ב

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

void string_func(char *s){…

while (*s != ’\0’)…{

מונע שינוי של המחרוזת

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

#include <stdio.h>#include <stdio.h>int strlen (char * str)int strlen (char * str){{

char *eos = str;char *eos = str; while( *eos++ ) ;while( *eos++ ) ; return( eos - str - 1 );return( eos - str - 1 );}}int main()int main(){{

char str[]=“LINUX";char str[]=“LINUX";printf("%d",strlen(str));printf("%d",strlen(str));return 0;return 0;

}}

? מה קורה פה

N U XIL ‘\0’

str

eos

100 101 102 103 104105 106

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

דרכים נוספות להגדיר מחרוזותדרכים נוספות להגדיר מחרוזות

h

p

e l l o \0 h e l l o \0s

char *p = “hello”; char *p = “hello”; char s[ ] = char s[ ] = “hello”;“hello”;

קלט למחרוזתקלט למחרוזת

scanf(“%s”, str); scanf(“%s”, str); עד לרווח

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

תרגילתרגיל

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

. . 11 אם כן, הפונקציה תחזיר אם כן, הפונקציה תחזיר ..00אם לא, אז יוחזר אם לא, אז יוחזר

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

#include <stdio.h>#include <stdio.h>int compare (char s1[ ],char s2[ ])int compare (char s1[ ],char s2[ ]){{

intint k;k;

for ( k=0; s1[k] != ‘\0’ || s2[k] != ‘\0’; k++ )for ( k=0; s1[k] != ‘\0’ || s2[k] != ‘\0’; k++ )if ( s1[k] != s2[k] )if ( s1[k] != s2[k] )

return 0;return 0;

return 1;return 1;}}void main()void main(){{

charchar s1[31],s2[31];s1[31],s2[31];scanf(“%s%s”,s1,s2);scanf(“%s%s”,s1,s2);printf(“%d\n”,compare(s1,s2));printf(“%d\n”,compare(s1,s2));

}}

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

string.hstring.h הספריההספריה

מכילה בין השאר את הפונקציות הבאות לטיפול מכילה בין השאר את הפונקציות הבאות לטיפול במחרוזות:במחרוזות:

•strlen(s)strlen(s) מחזירה את האורך של המחרוזת – מחזירה את האורך של המחרוזת – ss..•strcpy(s,t)strcpy(s,t) מעתיקה את המחרוזת – מעתיקה את המחרוזת – tt-ל- ל ss..•strcmp(s,t)strcmp(s,t) משווה ביו המחרוזות – משווה ביו המחרוזות – ss-ו- ו tt..•strstr(s,t)strstr(s,t) מחפשת את המחרוזת – מחפשת את המחרוזת – tt בתוך המחרוזת בתוך המחרוזת

ss..

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

תרגילתרגיל

כתבו פונקציה המקבלת כקלט מחרוזת ובודקת כתבו פונקציה המקבלת כקלט מחרוזת ובודקת האם היא פלינדרום.האם היא פלינדרום.

הערה: ניתן להניח שאורך המחרוזת לכל היותר הערה: ניתן להניח שאורך המחרוזת לכל היותר תווים. תווים. 100100

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

#include <stdio.h>#include <stdio.h>#include <string.h>#include <string.h>int main()int main(){{

charchar s[101];s[101];intint k,len;k,len;

scanf(“%s”,s);scanf(“%s”,s);len = strlen(s);len = strlen(s);for ( k=0; k<len/2; k++ )for ( k=0; k<len/2; k++ )

if ( s[k] != s[len-1-k] )if ( s[k] != s[len-1-k] ){{

printf(“The string is not a palindrome!\printf(“The string is not a palindrome!\n”);n”);

return 0;return 0;}}

printf(“The string is a palindrome!\n”);printf(“The string is a palindrome!\n”);return 0;return 0;

}}