77 תכנות תרגולתכנות תרגול
::שבועשבוע
10.5.0610.5.06
מערכיםמערכים
עד היום התוכניות שלנו לא ידעו לשמור כמות עד היום התוכניות שלנו לא ידעו לשמור כמות •גדולה של מידע ללא הגדרת כמות גדולה של גדולה של מידע ללא הגדרת כמות גדולה של
משתנים. משתנים.
מספרים מספרים 100100אתגר: כתוב תוכנית שקולטת אתגר: כתוב תוכנית שקולטת •שלמים ומדפיסה אותם מהאחרון שנקלט שלמים ומדפיסה אותם מהאחרון שנקלט
לראשון. לראשון. 100100 9999 , ... , , ... , 55 44 33 22 11קלט: קלט: 11 22 33 44 55 , ... , , ... , 9999 100100פלט: פלט:
פתרון )בלי מערכים(פתרון )בלי מערכים(
void main()void main()
{{
int a1,a2,a3,…,a100; int a1,a2,a3,…,a100;
scanf(“%d %d %d ,…”,a1,a2,a3,…);scanf(“%d %d %d ,…”,a1,a2,a3,…);
printf(“%d %d %d ,…”,a100,a99,a98,…);printf(“%d %d %d ,…”,a100,a99,a98,…);
}}
!!! אל תנסו בבית
מערכיםמערכים
int a;int a;
a=5;a=5;
int a[10];int a[10];
a[2] = 5;a[2] = 5;
5a
a[0]
a[1]
a[2]
a[9]
5
משתנה בודד
מערך
גישה למשתנה
השלישי במערך
void main()void main()
{{
int i=0;int i=0;
int a[100];int a[100];
for (i=0;i<100;i++)for (i=0;i<100;i++)
scanf (“%d”,&a[i]);scanf (“%d”,&a[i]);
for (i=99;i>=0;i--)for (i=99;i>=0;i--)
printf (“%d”,a[i]);printf (“%d”,a[i]);
}}
קלט
פלט
תרגילתרגיל איברים איברים 1010כתוב תוכנית הקולטת כתוב תוכנית הקולטת
לתוך מערך ומדפיסה תחילה את כל האיברים לתוך מערך ומדפיסה תחילה את כל האיברים
הזוגיים ואחר כך את כל האיברים האי זוגייםהזוגיים ואחר כך את כל האיברים האי זוגייםEnter numbers12345678910Even:2 4 6 8 10Odd:1 3 5 7 9
#include <stdio.h>#include <stdio.h>#define SIZE 10#define SIZE 10
void main()void main(){{
int i,arr[SIZE];int i,arr[SIZE];printf("Enter numbers\n");printf("Enter numbers\n");for (i=0;i<SIZE;i++)for (i=0;i<SIZE;i++)
scanf("%d",&arr[i]);scanf("%d",&arr[i]);printf("Even:\n");printf("Even:\n");for (i=0;i<SIZE;i++)for (i=0;i<SIZE;i++)
if (arr[i] % 2 == 0)if (arr[i] % 2 == 0)printf("%d ",arr[i]);printf("%d ",arr[i]);
printf("\nOdd:\n");printf("\nOdd:\n");for (i=0;i<SIZE;i++)for (i=0;i<SIZE;i++)
if (arr[i] % 2 != 0)if (arr[i] % 2 != 0)printf("%d ",arr[i]);printf("%d ",arr[i]);
printf("\n");printf("\n");}}
קלט
פלט
מערכים - אתחולמערכים - אתחול
int a[10]int a[10] = {1,2,3}; = {1,2,3};
int a[10]int a[10] = {0}; = {0};
a[0]
a[1]
a[2]
a[9]
1
2
3
0
a[0]
a[1]
a[2]
a[9]
0
0
0
0
תרגילתרגיל איברים ואחד איברים ואחד 33כתוב תוכנית המגדירה שני מערכים אחד עם כתוב תוכנית המגדירה שני מערכים אחד עם
איברים וקולטת אותם מהמשתמש. התוכנית בודקת איברים וקולטת אותם מהמשתמש. התוכנית בודקת 1010עם עם האם המערך הקטן מופיע כתת מערך במערך הגדול. אם כן האם המערך הקטן מופיע כתת מערך במערך הגדול. אם כן
היא מדפיסה איפה ואם לא היא לא מדפיסה דברהיא מדפיסה איפה ואם לא היא לא מדפיסה דבר
100 11 2231 445 35 15 22 445 35
קלט
4-6פלט
a b
22 445 35 17 15
0 1 2 3 4 5 6 7 8 9 0 1 2
#define SIZE_A 10#define SIZE_A 10#define SIZE_B 3#define SIZE_B 3int main()int main(){{
int i, j;int i, j;int A[SIZE_A],B[SIZE_B];int A[SIZE_A],B[SIZE_B];for (i = 0; i <= SIZE_A – SIZE_B; i++)for (i = 0; i <= SIZE_A – SIZE_B; i++){{
for (j = 0; j < SIZE_B; ++j)for (j = 0; j < SIZE_B; ++j)if ( A[i + j] != B[j] )if ( A[i + j] != B[j] )
break;break;if (j == SIZE_B)if (j == SIZE_B)
printf(“Range %d-%d”,i ,i + SIZE_B);printf(“Range %d-%d”,i ,i + SIZE_B);}}
}}
מערכיםמערכים
פעמיים פעמיים 60006000נכתוב תוכנית שזורקת קובייה נכתוב תוכנית שזורקת קובייה
ונספור כמה פעמיים יצא כל מספר.ונספור כמה פעמיים יצא כל מספר.
#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#define SIZE 7#define SIZE 7int main()int main(){{ int num, face, roll, frequency[ SIZE ] = { 0 }; int num, face, roll, frequency[ SIZE ] = { 0 }; scanf("%d",&num);scanf("%d",&num); srand( num );srand( num ); for ( roll = 1; roll <= 6000; roll++ ) {for ( roll = 1; roll <= 6000; roll++ ) { face = rand() % 6 + 1;face = rand() % 6 + 1; ++frequency[ face ]; ++frequency[ face ]; }} printf( "%s%17s\n", "Face", "Frequency" );printf( "%s%17s\n", "Face", "Frequency" ); for ( face = 1; face <= SIZE - 1; face++ )for ( face = 1; face <= SIZE - 1; face++ ) printf( "%4d%17d\n", face, printf( "%4d%17d\n", face,
frequency[ face ] );frequency[ face ] ); return 0;return 0;}}
הבית האדום
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;
}
מצביעים ופונקציותמצביעים ופונקציותעד היום הפונקציות שלנו ידעו לקבל ערכים של עד היום הפונקציות שלנו ידעו לקבל ערכים של
הן לא ידעו לקבל משתנים הן לא ידעו לקבל משתנים משתנים ולהשתמש בהם משתנים ולהשתמש בהם ולשנות את הערכים שלהם )מלבד פונקציה אחת!(ולשנות את הערכים שלהם )מלבד פונקציה אחת!(
הפונקציות שלנו ימשיכו לקבל ערכים בלבד רק שכעתהפונקציות שלנו ימשיכו לקבל ערכים בלבד רק שכעתאנו יכולים להעביר להם בתור ערך כתובת של משתנה !אנו יכולים להעביר להם בתור ערך כתובת של משתנה !
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* 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);
}
x5000
y5004
3
5
p7026
q7030
5000
5004
7034 temp3
5
3
11תרגיל תרגיל כתבו פונקציה שמקבלת אורך ורוחב של מלבן כתבו פונקציה שמקבלת אורך ורוחב של מלבן
ומחזירה את שטח המלבן ואת היקפו.ומחזירה את שטח המלבן ואת היקפו.
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]
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[SIZE];GetArray(a,SIZE);PrintArray(a,SIZE);return 0;
}
void GetArray(int a[],int size);
22תרגיל תרגיל כתבו את הפונקציות הבאות: כתבו את הפונקציות הבאות:
פונקציה שממלא מערך במספרים אקראייםפונקציה שממלא מערך במספרים אקראיים•פונקציה שמדפיסה מערךפונקציה שמדפיסה מערך• ( (swapswapפונקציה שהופכת את המערך )רמז: השתמשו בפונקציה פונקציה שהופכת את המערך )רמז: השתמשו בפונקציה •
פתרוןפתרון
מילוי מערךמילוי מערך
void fill_array(int array[], int size){
int i;srand(time(NULL));for (i = 0; i < size; i++)
array[i] = rand()/327;}
פתרוןפתרון
הדפסת מערךהדפסת מערך
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 5void 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);print_array(my_arr, SIZE);return 0;
}