מבוא למדעי המחשב

51
1 בבבב בבבבב בבבבב בבבבב בבבב6

Upload: desirae-rodriquez

Post on 03-Jan-2016

68 views

Category:

Documents


9 download

DESCRIPTION

מבוא למדעי המחשב. תרגול מספר 6. חזרה על נושאים שנלמדו. כיצד ניתן לכתוב לולאה המדפיסה מספרים מ 1 עד 10 ע"י לולאת While Do-While For. חזרה על נושאים שנלמדו. מה יהיה הפלט של התוכנית הבאה : int k=4; while (k-- > 0) printf("%d",k); printf("%d",k);. חזרה על נושאים שנלמדו. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: מבוא למדעי המחשב

1

מבוא למדעי המחשב

6תרגול מספר

Page 2: מבוא למדעי המחשב

2

חזרה על נושאים שנלמדו

כיצד ניתן לכתוב לולאה המדפיסה מספרים ע"י לולאת10 עד 1מ WhileDo-WhileFor

Page 3: מבוא למדעי המחשב

3

חזרה על נושאים שנלמדו

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

int k=4;

while (k-- > 0) printf("%d",k);

printf("%d",k);

Page 4: מבוא למדעי המחשב

4

חזרה על נושאים שנלמדו

מה עושה פקודתbreak? מה עושה פקודתcontinue? ? מה הפלט של התוכנית הבאה

# include <stdio.h>

int main(void)

{

int i,j;

for (i=1; i < 10; i++) {

for (j=1; j <10; j++) {

if (j > i) break;

putchar('*');

}

putvhar('\n');

}

return(0);

}

Page 5: מבוא למדעי המחשב

5

הנושאים להיום

מערכים חד ממדייםהצהרה על מערכיםייצוג מערך בזיכרון] [ אופרטור(ע"י לולאה / אתחול סטטי) אתחול מערךשליחת מערך לפונקציהדוגמאות

מערכים דו ממדיים

Page 6: מבוא למדעי המחשב

6

מערך

?מהו מערך טיפוס לשמירה של מספר

נתונים מאותו סוגתחביר

type name]size[;לדוגמא

int Array]4[;char Operations]10000[;

Page 7: מבוא למדעי המחשב

7

אופרטור ] [

על מנת לגשת לאיבר מסוים במערך, משתמשים] [באופרטור

האיברים במערך בגודלX עד 0 ממוספרים מ X-1A]i[ הוא האיבר שהאינדקס שלו הוא i במערך A

מסקנה - ניתן להתייחס אלA]5[ כמו אל משתנה רגיל

Page 8: מבוא למדעי המחשב

8

ייצוג בזיכרון?כיצד המערך נשמר בזיכרון המחשב נזכר כי כל טיפוס בשפתC תופס מספר

) בזיכרון.bytesמסוים של תאים ( ראינו כי ניתן לברר כמה זיכרון כל טיפוס תופס

sizeofע"י שימוש באופרטור המערך מיוצג בזיכרון כרצף של איבריו

200 201 202 203 204 205 206 207 208 209 210 211 כתובות בזיכרון

0 1 2 3 4 5 אינדקס במערך412 4 4263 15524 53 533 ערכי המערך

Page 9: מבוא למדעי המחשב

9

חשוב מאוד!!!

לא ניתן להגדיר מערך שגודלו הוא משתנה ביצירת משתנה חדש מטיפוס מערך, גודלו

לקבועתמיד ידוע ושווה

(לא יתקמפל) לצורך המחשה int x = 5;int array]x[;

Page 10: מבוא למדעי המחשב

10

אתחול דינאמי של מערך

#define N 100

int main(void){

int A[N], i;

for (i=0; i<N; i++) A[i] = i;

return 0;}

#define N 100

int main(void){

int A[N], i;

for (i=0; i<N; i++)

scanf("%d",&A[i]);

return 0;}

Page 11: מבוא למדעי המחשב

11

אתחול סטטי של מערךדוגמאות

double b][ = {1.5, 3.0, 6.7};char c][ = {'y', 'm', 'c', 'a'};

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

המסולסלים

int array]10[ = {1, 5, 6};-6 ו-5, 1שלושת האיברים הראשונים מאותחלים ל ,

0ושאר האיברים מאותחלים ל-int array2]10[ = {0};

Page 12: מבוא למדעי המחשב

12

יצירת טיפוסים חדשים

מאחד זוכרים שניתן היה ליצור טיפוס חדש)?typedefקיים) ע"י הפקודה

למי שלא זוכר - typedef double weight;weightהוא טיפוס חדש שנוצר מאחד קיים השימוש בטיפוס החדש? בהגדרות משתניםweight BeforeDiet, AfterDiet;

Page 13: מבוא למדעי המחשב

13

יצירת טיפוסים חדשים-שימוש בtypedefעם מערכים

typedef double vector]10[; נוצר טיפוס חדש בשםvector כעת נוכל ליצור ,

, לדוגמאvectorמשתנים חדשים מטיפוס vector grades; וכעתgrades הוא משתנה מטיפוס vector ,

double של 10כלומר מערך בגודל grades]0[ = 4.6;

למה זה שימושי? הקוד ברור יותר, ויותר קללתחזק אותו

Page 14: מבוא למדעי המחשב

14

שליחת מערך לפונקציה

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

.ניתן באותו האופן, לשלוח לפונקציה מערך# include <stdio.h>#define N 4

int ArraySum(int Array[N]);

int main() { int Ar[N] = {1,4,2,6}; int Sum = ArraySum(Ar); return(1);}

Page 15: מבוא למדעי המחשב

15

1תרגיל

ציונים ומדפיסה את 200כתוב תוכנית שמקבלת הציון המכסימלי, הציון הממוצע, וכמה סטודנטים

<include <stdio.h #קבלו מעל הממוצע# define N 200int main(void) {

int g[N], i, sum=0, average, counter=0, max;

for (i=0 ; i < N ; i++) /* read the grades into array */

if (scanf("%d", &g[i]) < 1) {printf("Input error\n");return 1;

}

Page 16: מבוא למדעי המחשב

16

1תרגיל for (i=0 ; i < N ; i++) /* sum */

sum += g[i];average = sum/N; /* average */for (i=0 ; i < N ; i++)

if(g[i] > average)++counter; /* above average */

for (i=0,max=g[0] ; i < N ; i++)max = (max < g[i]) ? g[i] : max; /* maximum grade */

printf("The maximum grade is %d\n", max);printf("The average grade is %d\n", average);printf("%d students are above the average\n", counter);

return 0;}

Page 17: מבוא למדעי המחשב

17

2תרגיל

כתוב תוכנית שקולטת מספר חיובי שלםומדפיסה מספר חדש המורכב מספרותיו

של אותו המספר, מסודרות בסדר עולה יודפס 456342לדוגמא, עבור הקלט

234456

פתרון ? על הלוח

Page 18: מבוא למדעי המחשב

18

- מיזוג מערכים3תרגיל

נתונים שני מערכיםA בגודל nB בגודל m

שני המערכים מכילים מספרים מטיפוס שלםכל מערך ממוין מהקטן לגדול ,יש ליצור מערך נוסףC בגודל ,n+m כך שיכיל ,

בצורה ממוינתB ו-Aאת אברי

Page 19: מבוא למדעי המחשב

19

מיזוג מערכים

דוגמאA = 1,4,5,5,7,8B = 2,3,6,8

C = 1,2,3,4,5,5,6,7,8,8

Page 20: מבוא למדעי המחשב

20

מיזוג מערכים

:האלגוריתם3 אינדקסים רצים: עבור A עבור ,B ועבור C-העתקת האיבר הקטן מבין האיברים בA

, וקידום האינדקס במערך C לתוך Bוב-המתאים

סיום ע"י השלמה של הערכים שנותרו

Page 21: מבוא למדעי המחשב

21

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

Page 22: מבוא למדעי המחשב

22

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1

Page 23: מבוא למדעי המחשב

23

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2

Page 24: מבוא למדעי המחשב

24

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5

Page 25: מבוא למדעי המחשב

25

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6

Page 26: מבוא למדעי המחשב

26

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7

Page 27: מבוא למדעי המחשב

27

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7 12

Page 28: מבוא למדעי המחשב

28

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7 12 15

Page 29: מבוא למדעי המחשב

29

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7 12 15 16

Page 30: מבוא למדעי המחשב

30

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7 12 15 16 20

Page 31: מבוא למדעי המחשב

31

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7 12 15 16 20 21

Page 32: מבוא למדעי המחשב

32

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7 12 15 16 20 21 22

Page 33: מבוא למדעי המחשב

33

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7 12 15 16 20 21 22 23

Page 34: מבוא למדעי המחשב

34

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7 12 15 16 20 21 22 23 25

Page 35: מבוא למדעי המחשב

35

3פתרון תרגיל

על הלוח

Page 36: מבוא למדעי המחשב

36

4תרגיל

תרגיל מנורות3באולמן יש כיתה עם ) 0) או מכובה (1כל מנורה יכולה להיות דלוקה(?המטרהלהדפיס את כל מצבי התאורה האפשריים000,001,010,011,100,101,110,111

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

Page 37: מבוא למדעי המחשב

37

אלגוריתם

?רעיונות הפתרון טמון בלמצוא שיטה לעבור ממספר

בינארי אחד לאחר נמצא שיטה שניתן להפעיל אותה שוב ושוב, וכל

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

אם השיטה תוכל לעבור על כל האופציות מבלילחזור על אותו מספר פעמיים, דיינו!

Page 38: מבוא למדעי המחשב

38

השיטה

: כל עוד לא הדפסנו את כל האפשרויות בצענדפיס את הקונפיגורציה (מספר בינארי) הנוכחית1.

נעבור עליה משמאל לימין2. 1אם ניתקל בספרה אפס - נשנה אותה לאחת ונחזור לשלב אם ניתקל בספרה אחת - נשנה אותה לאפס, ונמשיך

)2לספרה הבאה (חזור לשלב

000>-100>-010>-110>-001>-101>-011>-111

Page 39: מבוא למדעי המחשב

39

4פתרון תרגיל

#include <stdio.h>

#define N 4

int main(void){

int S[N] = {0};int end=0, i;

while(!end){

for(i = 0; i < N-1; i++) /* print current string */printf("%d", S[i]);

putchar('\n');

Page 40: מבוא למדעי המחשב

40

4פתרון תרגיל

for(i = N-1; i >= 0; i--) /* Generate next sequence */if(S[i] == 0){

S[i] = 1;break;

}else

S[i] = 0;if(i < 0) end = 1; /* check if we printed all the

sequences */}return 0;

}

Page 41: מבוא למדעי המחשב

41

מערכים דו ממדיים

(רשימה של מספרים) הרחבה של מערך/וקטורלטבלה/מטריצה

כל האיברים יהיו עדיין מאותו טיפוסתחביר

type name]#rows[]#cols[; לדוגמאint matrix]22[]33[ יגדיר מערך דו מימדי

עמודות33 שורות ו 22עם

Page 42: מבוא למדעי המחשב

42

מערכים דו ממדיים

? כיצד מיוצג מערך דו ממדי בזיכרון

43 5 44

64 23 523

6 53 531

43 5 44 64 23 523 6 53 531

Page 43: מבוא למדעי המחשב

43

מערכים דו ממדיים

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

לגשת לשורה, ואח"כ לעמודה.לדוגמא

int matrix]4[]5[;matrix]0[]0[ = 1;matrix]3[]4[ = 23;

Page 44: מבוא למדעי המחשב

44

דוגמא

?מה עושה התוכנית הבאה#include <stdio.h>int main(void){

int a[3][5], j, k, sum=0;for (j=0; j<3; j++)

for (k=0; k<5; k++)scanf("%d",&a[j][k]);

for (j=0; j<3; j++)for (k=0; k<5; k++)

sum += a[j][k];printf("The sum is: %d\n",sum);return 0;

}

Page 45: מבוא למדעי המחשב

45

תרגיל

מטריצה דו מימדיתNXN מטריצת תיקרא שווה לסכום i אם סכום השורה ה-קסם

i>N<=0, לכל iהעמודה ה- כתוב תוכנית הבודקת אם מערך דו מימדי

הוא מטריצת קסם

Page 46: מבוא למדעי המחשב

46

פתרון

#include <stdio.h>#define N 10int main(void){

int Matrix[N][N];int i, j, SumRow, SumCol;

/* Read values into matrix */ for (i=0; i<N; i++)

for (j=0; j<N; j++)scanf("%d",&a[i][j]);

Page 47: מבוא למדעי המחשב

47

פתרוןfor(i=0 ; i<N ; i++) {

SumRow = 0; /* Calculate the sum of row i */for(j=0 ; j<N ; j++)

SumRow += Matrix[i][j];SumCol = 0; /* Calculate the sum of column i */for(j=0 ; j<N ; j++)

SumCol += Matrix[j][i];if(SumRow != SumCol) {

printf("Not A Magic Matrix\n");return 0;

}}printf("Magic Matrix Indeed!\n");return 0;

}

Page 48: מבוא למדעי המחשב

48

סיכום

מערכיםמערכים חד ממדייםייצוג מערך בזיכרון] [ אופרטור(ע"י לולאה / אתחול סטטי) אתחול מערךמערכים דו ממדיים

Page 49: מבוא למדעי המחשב

49

2פתרון תרגיל # include <stdio.h>

int main(void)

{

long int x;

int i, A[10]={0};

scanf("%ld", &x);

while (x != 0){

A[x%10]++;

x /= 10;

}

for (i = 0; i < 10; i++)

while(A[i]--)

printf("%d", i);

return 0;

}

Page 50: מבוא למדעי המחשב

50

3פתרון תרגיל

/* Merge A[] of size SizeA and B[] of size SizeB into C[] */#include <stdio.h>

#define SizeA 5#define SizeB 3

int main(void){

int A[SizeA], B[SizeB], C[SizeA+SizeB];int i=0 , j=0 , k=0 ;. . ./* read input into A[] and B[] … and assume that A and B are sorted */. . .

Page 51: מבוא למדעי המחשב

51

3פתרון תרגיל

while ( i < SizeA && j < SizeB)if(A[i] < B[j])

C[k++] = A[i++] ;else

C[k++] = B[j++] ;

while( i < SizeA) /* pick up any remainder */C[k++] = A[i++] ;

while( j < SizeB)C[k++] = B[j++] ;

return 0;}