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

Post on 03-Jan-2016

68 Views

Category:

Documents

9 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

1

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

6תרגול מספר

2

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

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

3

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

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

int k=4;

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

printf("%d",k);

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

}

5

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

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

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

6

מערך

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

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

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

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

7

אופרטור ] [

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

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

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

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 ערכי המערך

9

חשוב מאוד!!!

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

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

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

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

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

12

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

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

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

13

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

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

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

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

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

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

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;

}

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

17

2תרגיל

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

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

234456

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

18

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

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

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

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

19

מיזוג מערכים

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

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

20

מיזוג מערכים

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

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

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

21

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

22

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1

23

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2

24

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5

25

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6

26

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7

27

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7 12

28

דוגמת הרצה

A

B

C

2 5 7 12 15 20 23 25

1 6 16 21 22

1 2 5 6 7 12 15

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

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

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

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

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

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

35

3פתרון תרגיל

על הלוח

36

4תרגיל

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

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

37

אלגוריתם

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

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

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

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

38

השיטה

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

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

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

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

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

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;

}

41

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

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

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

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

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

42

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

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

43 5 44

64 23 523

6 53 531

43 5 44 64 23 523 6 53 531

43

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

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

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

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

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;

}

45

תרגיל

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

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

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

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

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;

}

48

סיכום

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

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;

}

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

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

top related