מבוא כללי למדעי המחשב תרגול
Post on 04-Jan-2016
41 Views
Preview:
DESCRIPTION
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