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

Post on 04-Jan-2016

41 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

הבית האדום

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

הבית הירוק

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

הבית הצהוב

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

הבית הורוד

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

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

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

רמי

יוסי

שמעון

אבנר

רמי

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

2000כתובת :

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

a

80

3

7

5

a?5מה נמצא ב

5

b

cd

1000כתובת :

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

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

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

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

למשללמשל

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

int a; a5000

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

int a;

int b;

a = 5;

b = 7;

a5000

b5004

5

7

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

int a, b;

int *p1;

int *p2;

a = 5;

b = 7;

p1 = &a;

p2 = &b;

a5000

b5004

5

7

p17026

p27030

5000

5004

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

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;

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

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;

תרגילתרגיל

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

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

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

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

}0012F60 0012F5410 2

פלט

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

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

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

5

3

printf

3

a

2020

5

b

2034

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

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

scanfa

2020

b

2034

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

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

35

int main(){ int a;

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

a5000

scanf

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

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

}

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

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

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

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;

}

פתרוןפתרון

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

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

}

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

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

a[0]

a[1]

a[2]

a[9]

5

5000

5004

5008

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

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

המערךהמערך

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

הפונקציה תקבל מערך )את כתובתו( ותדפיס אותו:הפונקציה תקבל מערך )את כתובתו( ותדפיס אותו: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]);}}

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

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

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]);}}

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

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

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

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

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

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

randrand

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

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*/

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

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

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

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

פתרוןפתרון

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

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

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

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

פתרוןפתרון

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

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

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

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

}

פתרוןפתרון

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

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

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

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

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

}

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

a[0]

a[1]

a[2]

a[9]

5

5000

5004

5008

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

או או

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

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

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

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

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

100 11 2231 445 35 15 22 445 35

קלט

a[4]&פלט

a b

22 445 35

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;

}}

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

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

. . ’’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]

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

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

void string_func(char *s){…

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

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

#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

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

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); עד לרווח

תרגילתרגיל

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

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

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

}}

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..

תרגילתרגיל

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

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

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

}}

top related