המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

תרגול 5: לולאות ומערכים.

מצגות קשורות


מצגת בנושא: "תרגול 5: לולאות ומערכים."— תמליל מצגת:

1 תרגול 5: לולאות ומערכים

2 מבוא למדעי המחשב מ' - תירגול 3
תוכנייה לולאת while, do while, for מערכים מערכים דו ממדיים מבוא למדעי המחשב מ' - תירגול 3

3 מבוא למדעי המחשב מ' - תירגול 3
לולאות מבוא למדעי המחשב מ' - תירגול 3

4 תזכורת: לולאת while גוף הלולאה מתבצע שוב ושוב כל עוד התנאי מתקיים
int number; scanf(“%d”, &number); while(number>0) { printf(“%d\n”,number); } תנאי גוף הלולאה

5 לולאת do-while בפעם הראשונה גוף הלולאה מתבצע בוודאות.
לאחר מכן, גוף הלולאה מתבצע שוב ושוב כל עוד התנאי מתקיים int x; do { scanf("%d",&x); printf("%d\n",x*x); }while(x>0); גוף הלולאה יש להזכיר שבניגוד ללולאת while, בלולאת do-while האיטרציה הראשונה תתבצע תמיד. תנאי

6 לולאת for int factorial = 1; int n, i; printf(“Enter n: “); scanf(“%d”, &n); for (i=2 ;i<=n ;i++) { factorial *= i; } printf(“%d!=%d\n", n, factorial); בדיקת התנאי אתחול קידום גוף הלולאה יש להסביר איך לולאת for עובדת. קודם מתבצע האתחול, לאחר מכן מתבצעת בדיקה האם התנאי מתקיים ובסוף כל איטרציה מתבצע הקידום.

7 מבוא למדעי המחשב מ' - תירגול 3
שקילות לולאות האם ניתן להחליף את לולאת ה-for הזו בלולאת while? ומה לגבי do-while? (הניחו כי n הוגדר ואותחל בנקודה קודמת בתוכנית) for (int i=0; i<n; i++){ printf(“%d”,i); } מבוא למדעי המחשב מ' - תירגול 3

8 מבוא למדעי המחשב מ' - תירגול 3
שקילות לולאות מה יותר ברור? for (int i=0; i<n; i++){ printf(“%d”,i); } האם זה תמיד שקול? int i=0; while (i<n){ printf(“%d”,i); i++; } int i=0; do { printf(“%d”,i); i++; } while (i<n) בלולאת do-while ההדפסה הראשונה תמיד תתבצע, לכן זה לא יהיה שקול אם n<1 . ניתן להקיץ את הלולאה ב- if(n>=1) כדי לקבל שקילות. חשוב להדגיש שלמרות השקילות, נראה כי לולאת for הכי "טבעית" לביצוע המשימה. מבוא למדעי המחשב מ' - תירגול 3

9 שקילות לולאות מה יותר ברור? while (x < 0) { scanf(“%d”,&x); }
for ( ; x < 0 ; ){ scanf(“%d”,&x); } ניתן להשאיר את גוף הלולאה ריק ניתן להשאיר חלקים ריקים בכותרת נניח ש x הוגדר ואותחל לפני. for ( ; x < 0 ; scanf(“%d”,&x) ){ } מבוא למדעי המחשב מ' - תירגול 3

10 לולאות תרגיל 1: כתבו תכנית הקולטת מספר אי-שלילי ומדפיסה את סכום הספרות. למשל, אם המספר הנקלט הוא , הפלט יהיה 15. אין צורך לוודא כי הקלט אי-שלילי. באיזו סוג לולאה כדאי להשתמש? במקרה בו אנו לא יודעים מהו מספר האיטרציות שהלולאה תתבצע, עדיף להשתמש בלולאת while. מבוא למדעי המחשב מ' - תירגול 5

11 מבוא למדעי המחשב מ' - תירגול 3
לולאות int n, sum = 0; printf("Please enter a non-negative number: "); if( scanf("%d", &n) < 1) return 1; /* each iteration we add the last digit of the number, and reducing it from the number. */ while (n > 0) { sum += n%10; n /= 10; } printf("sum of digits is %d\n", sum); מבוא למדעי המחשב מ' - תירגול 3

12 לולאות תרגיל 2: כתבו תכנית הקולטת 10 מספרים, מחשבת ומדפיסה את סכומם.
באיזו סוג לולאה כדאי להשתמש הפעם? מבוא למדעי המחשב מ' - תירגול 5

13 מבוא למדעי המחשב מ' - תירגול 3
לולאות #define N 10 int main() { int i; double x, sum = 0; printf("Please enter %d numbers: ", N); /* Gets N numbers from the user and sum them */ for (i = 1; i <= N; i++) if (scanf("%lf", &x) < 1) return 1; sum += x; } printf("sum = %f", sum); return 0; מבוא למדעי המחשב מ' - תירגול 3

14 continue ממשיך לאיטרציה הבאה
לולאות תרגיל 3: כתבו תכנית המחשבת את ממוצע המספרים החיוביים בקלט. sum = 0; count = 0; while (scanf("%d", &num)==1) { if (num <= 0) continue; sum += num; count++; } average = sum / count; continue ממשיך לאיטרציה הבאה יש להסביר כי continue גורם לסיום האיטרציה הנוכחית ומעבר לאיטרציה הבאה (כמובן, רק אם התנאי מתקיים). מבוא למדעי המחשב מ' - תירגול 5

15 מבוא למדעי המחשב מ' - תירגול 3
לולאות תרגיל 4: כתבו תכנית המקבלת שני מספרים, טווח התחלה וטווח סיום, ומדפיסה את המספר הראשון בטווח שסכום ספרותיו הוא 8, אחרת תדפיס 1-. ניתן להניח כי המספר הראשון שהתקבל קטן מהמספר השני. מבוא למדעי המחשב מ' - תירגול 3

16 break מסיים את הלולאה/switch הכי פנימיים
לולאות int low,high,tmp, res = -1; scanf("%d %d", &low,&high); for(int num=low; num<=high; ++num){ /*check if the digit sum is exactly 8*/ tmp = num; int sum=0; while(tmp > 0){ sum += tmp%10; tmp/=10; } if(sum == 8){ res = num; break; printf("%d" , res); break מסיים את הלולאה/switch הכי פנימיים יש להסביר כי break גורם ליציאה מהלולאה/switch הפנימיים ביותר. מבוא למדעי המחשב מ' - תירגול 3

17 מבוא למדעי המחשב מ' - תירגול 3
מי הג'יני הרע? for (i = 0; i<3; ++i) { printf("make a wish: "); scanf("%s", the_wish); if (toohard(the_wish)) continue; dowish(the_wish); } i = 0; while (i<3) { printf("make a wish: "); scanf("%s", the_wish); if (toohard(the_wish)) continue; dowish(the_wish); i++; } הג'יני הרע הוא העליון, מכיוון שגם כאשר הוא לא מבצע את המשימה ה-counter מתקדם. (בלולאת for). מבוא למדעי המחשב מ' - תירגול 3

18 מבוא למדעי המחשב מ' - תירגול 3
מערכים מבוא למדעי המחשב מ' - תירגול 3

19 מבוא למדעי המחשב מ' - תירגול 3
מערכים מערך הוא סדרה של משתנים מאותו טיפוס. את המערך מגדירים באופן הבא: int grades[5]; טיפוס משתני המערך גודל המערך שם המערך מבוא למדעי המחשב מ' - תירגול 3

20 מבוא למדעי המחשב מ' - תירגול 3
מערכים אפשר לאתחל מערכים במספר דרכים: רשימת אתחול: אתחול המערך לאפסים: אתחול המערך בתחילה בערכים, ובסופו אפסים. int grades[] = { 95, 45, 62, 80, 76 }; int grades[5] = { 0 }; יש להזכיר כי כאשר מאתחלים מערך ברשימת אתחול לא חייבים לציין את גודלו, בכל מקרה אחר כן. בנוסף יש להסביר כי כמו אתחול משתנה, לא חייבים לאתחל מערך, אך אסור להשתמש בו לפני שניתנו לו ערכים. int grades[5] = { 95, 45 }; מבוא למדעי המחשב מ' - תירגול 3

21 מבוא למדעי המחשב מ' - תירגול 3
מערכים איברי המערך ממוספרים מ-0 (ולא מ-1!) וניתן לגשת אליהם באמצעות אופרטור הסוגריים המרובעים: שימו לב: חריגה מגבולות המערך אינה מהווה שגיאת קומפילציה ובמקרים מסוימים אף לא תגרום לשגיאת זמן ריצה (את הסיבה לכך נבין כשנלמד על מצביעים). grades[0] grades[1] grades[2] grades[3] grades[4] int grades[5] ; מבוא למדעי המחשב מ' - תירגול 3

22 מבוא למדעי המחשב מ' - תירגול 3
מערכים תרגיל 5: כתבו תכנית המקבלת כקלט 10 משכורות (מספרים שלמים חיוביים), ומחזירה את הממוצע שלהן ואת המשכורת המקסימלית. הערה: אנו נציג פתרון המשתמש במערכים, אולם ניתן היה לפתור את התרגיל גם ללא מערכים (נסו בעצמכם). מבוא למדעי המחשב מ' - תירגול 3

23 מערכים #define NUM_SALARIES 10
int main() { int salaries[NUM_SALARIES]; int sum = 0, max_sal, i; // Initialize the array. for(i=0; i<NUM_SALARIES; i++) if (scanf("%d", &salaries[i]) < 1) return 1; } נהוג להשתמש ב-define כדי להגדיר גודל מערך יש להזכיר כי טווח משתני המערך הוא בין 0 ל NUM_SALARIES-1. הקומפיילר לא בהכרח יתריע על חריגת זיכרון, לכן חשוב מאוד להקפיד על זה. גישה לאיבר במערך. אסור לחרוג מגבולות המערך! מבוא למדעי המחשב מ' - תירגול 3

24 מערכים max_sal = salaries[0];
// Sum the salaries, and finds max salary. for (sum=0, i=0; i<NUM_SALARIES; ++i) { sum += salaries[i]; if (salaries[i] > max_sal) max_sal = salaries[i]; } printf("Max salary is %d, Average salary is %f",max_sal, (double)sum / NUM_SALARIES); איך התכנית תשתנה אם נרצה לקבל משכורות עם ערכים עשרוניים? איך התכנית תשתנה אם נרצה לסכום 50 משכורות? יש להזכיר כי בשלב האתחול ניתן לאתחל מספר משתנים, ולהפריד ביניהם בעזרת פסיק. בצורה דומה אפשר לקדם מספר משתנים בשלב הקידום. מבוא למדעי המחשב מ' - תירגול 3

25 מבוא למדעי המחשב מ' - תירגול 3
מערכים- תרגיל סיכום תרגיל 6: כתבו תכנית הקולטת מהמשתמש מספרים שלמים (עד סוף הקלט) ולבסוף מדפיסה את חמשת המספרים האחרונים שנקלטו (לפי סדר קליטתם). אם נקלטו עד סוף הקלט פחות מחמישה מספרים, יש להדפיס את כל המספרים שנקלטו. ניתן להניח כי הקלט תקין (כלומר מוכנסים רק מספרים שלמים) מבוא למדעי המחשב מ' - תירגול 3

26 מבוא למדעי המחשב מ' - תירגול 3
#define N 5 int counter = 0, num; int memory[N]; while (scanf(“%d”,&num)!=EOF){ if (counter==N){ for (int i=0; i<N ; i++){ memory[i] = memory[i+1]; } memory[N-1] = num; memory[counter++] = num; printf(“%d ”,memory[i]); מצאו את הבעיות מומלץ להריץ בקודבלוקס להמחשת הבעיות. בהרצה בקודבלוקס צריך להכניס ידנית EOF ע"י לחיצה על ctrl+Z בשורה חדשה (או ctrl+D במאכ) מבוא למדעי המחשב מ' - תירגול 3

27 מבוא למדעי המחשב מ' - תירגול 3
#define N 5 int counter = 0, num; int memory[N]; while (scanf(“%d”,&num)!=EOF){ if (counter==N){ for (int i=0; i<N ; i++){ memory[i] = memory[i+1]; } memory[N-1] = num; memory[counter++] = num; for (int i=0; i<counter ; i++){ printf(“%d ”,memory[i]); בשביל המקרה שבו הוכנסו פחות מ-5 איברים מבוא למדעי המחשב מ' - תירגול 3

28 מבוא למדעי המחשב מ' - תירגול 3
#define N 5 int counter = 0, num; int memory[N]; while (scanf(“%d”,&num)!=EOF){ if (counter==N){ for (int i=0; i<N ; i++){ memory[i] = memory[i+1]; } memory[N-1] = num; continue; memory[counter++] = num; for (int i=0; i<counter ; i++){ printf(“%d ”,memory[i]); אחרת היינו מבצעים גם memory[counter++] = num שזה גם גישה לא חוקית וגם גורם לכך שcounter ימשיך להתקדם וישפיע על ההדפסה. מבוא למדעי המחשב מ' - תירגול 3

29 מבוא למדעי המחשב מ' - תירגול 3
#define N 5 int counter = 0, num; int memory[N]; while (scanf(“%d”,&num)!=EOF){ if (counter==N){ for (int i=0; i<N-1 ; i++){ memory[i] = memory[i+1]; } memory[N-1] = num; continue; memory[counter++] = num; for (int i=0; i<counter ; i++){ printf(“%d ”,memory[i]); כדי שבאיטרציה האחרונה נישאר בגבולות המערך. יש להדגיש כי את השגיאה הזו, בניגוד לשגיאות הקודמות, קשה היה לתפוס באמצעות הרצת טסטים, שכן לרוב החריגה מהגבולות לא תביא לשגיאת זמן ריצה. אבל בהחלט יכול להיות שהחריגה דווקא כן תביא לשגיאה בהרצה על הבודק האוטומטי.... מבוא למדעי המחשב מ' - תירגול 3

30 לולאות ומערכים - תרגיל סיכום
תרגיל 7: כתבו תכנית הקולטת רצף אותיות אנגליות גדולות, ובודקת האם כל האותיות ב ABC הופיעו מבוא למדעי המחשב מ' - תירגול 3

31 מבוא למדעי המחשב מ' - תירגול 3
לולאות ומערכים #define LETTERS (‘Z’-’A’+1) char c=0; bool appeared[LETTERS]={false}; //all elements are 0==false while(scanf(“ %c”, &c)==1){ appeared[c-’A’]=true; } int i; for(i=0; i<LETTERS; ++i) { if(appeared[i]==false) { break; if(i==LETTERS) { printf(“All letters appeared\n”); else { printf(“Letter %c didn’t appear\n”, i+’A’); מבוא למדעי המחשב מ' - תירגול 3

32 מבוא למדעי המחשב מ' - תירגול 3
לולאות ומערכים #define LETTERS (‘Z’-’A’+1) char c=0; bool appeared[LETTERS]={false}; //all elements are 0==false while(scanf(“ %c”, &c)==1){ if(c>=‘A’ && c<=‘Z’) appeared[c-’A’]=true; } int i; for(i=0; i<LETTERS; ++i) { if(appeared[i]==false) { break; if(i==LETTERS) { printf(“All letters appeared\n”); else { printf(“Letter %c didn’t appear\n”, i+’A’); מבוא למדעי המחשב מ' - תירגול 3

33 מבוא למדעי המחשב מ' - תירגול 3
מערכים דו ממדיים מבוא למדעי המחשב מ' - תירגול 3

34 מבוא למדעי המחשב מ' - תירגול 3
מערכים דו ממדיים את המערך הדו-ממדי מגדירים כך: נוח לחשוב על מערך זה כמטריצה דו-ממדית עם N שורות ו-M עמודות, ולשרטט את אברי המערך הדו-ממדי כך: double matrix[N][M]; M N matrix[0][0] matrix[0][1] matrix[0][M-1] matrix[N-1][0] matrix[N-1][1] matrix[N-1][M-1] מבוא למדעי המחשב מ' - תירגול 3

35 תמיד יש לציין את אורך השורה.
מערכים דו ממדיים אתחול מערך דו-ממדי: בעזרת רשימה: או כך: רשימה חלקית: int matrix[2][3] = { {5, 3, 8} , {1, 0, 3} }; int matrix[][3] = { {5, 3, 8} , {1, 0, 3} }; תמיד יש לציין את אורך השורה. int matrix[2][3] = { {5, 3}, {1} }; מבוא למדעי המחשב מ' - תירגול 3

36 מבוא למדעי המחשב מ' - תירגול 3
מערכים דו-ממדיים תרגיל 8: כתבו תכנית המקבלת מהמשתמש 10 נקודות במרחב ומחשבת את מרכז המסה שלהן. (מרכז המסה של הנקודות היא הנקודה שערכה בכל קורדינטה הוא הממוצע של ערכי כל הנקודות באותה קורדינטה) כדאי להסביר שמרכז מסה פירושו הממוצע של הנקודות בכל אחד מהצירים. מבוא למדעי המחשב מ' - תירגול 3

37 מבוא למדעי המחשב מ' - תירגול 3
תרגיל 8 - פתרון #define N 10 double points[N][3]; double centerOfMass[3]; int i, j; centerOfMass[0] = centerOfMass[1] = centerOfMass[2] = 0.0; for (i = 0; i < N; i++) { printf("Please enter the next point: "); //Get a dot and adds it to the average of every axis. for (j = 0; j < 3; j++) { scanf("%lf", &points[i][j]); centerOfMass[j] += points[i][j]/N; } printf("c.m. = (%f, %f, %f).\n", centerOfMass[0], centerOfMass[1], centerOfMass[2]); מבוא למדעי המחשב מ' - תירגול 3

38 מבוא למדעי המחשב מ' - תירגול 3
תרגילי סכום תרגיל 9: כתבו תכנית המקבלת כקלט מספר k ורשימה של 10 מספרים נוספים ומדפיסה שני מספרים שונים מהרשימה שסכומם הוא k במידה וקיימים, אחרת מדפיסה כי לא קיימים מספרים כאלה. למשל: עבור k=6 והרשימה: 1,2,3,4,5,6,7,8,9,10 2 ו-4 מהווה פתרון חוקי אך 3 ו-3 לא (כי 3 מופיע פעם אחת) עבור k=6 והרשימה: 1,2,3,4,3,6,7,8,9,10 3 ו-3 מהווה פתרון חוקי (כי 3 מופיע פעמיים) אם אין זמן, עדיף לוותר. מבוא למדעי המחשב מ' - תירגול 3

39 מבוא למדעי המחשב מ' - תירגול 3
#define N 10 int i, j, k; int a[N]; printf(“Enter k's value: "); if (scanf("%d", &k) != 1) return 1; printf("Please enter %d numbers: ", N); for (i = 0; i < N; i++) { if (scanf("%d", &a[i]) != 1) return 1; } for (i = 0; i < N; i++) { for (j = i + 1; j < N; j++) { if (a[i] + a[j] == k) { printf("Found %d and %d.\n", a[i], a[j]); return 0; printf("Not found.\n"); תרגיל 9 - פתרון מבוא למדעי המחשב מ' - תירגול 3

40 מבוא למדעי המחשב מ' - תירגול 3
תרגילי סכום תרגיל 10: כתבו תכנית המקבלת מערך דו-ממדי של מספרים שלמים בגודל 5X5 (המספרים מתקבלים שורה שורה, משמאל לימין), ומדפיסה את המספר הגדול ביותר של איברים סמוכים באותה עמודה שהם ממוינים בסדר לא יורד. למשל, עבור המערך הבא יוחזר 4: אם אין זמן, עדיף לוותר. מבוא למדעי המחשב מ' - תירגול 3

41 מבוא למדעי המחשב מ' - תירגול 3
תרגיל 10- פתרון אתחול המערך: #define N 5 int mat[N][N]; for (int i = 0; i < N; i++) { for(int j=0; j < N; j++){ if(scanf("%d", &mat[i][j])<1) return 1; } מבוא למדעי המחשב מ' - תירגול 3

42 מבוא למדעי המחשב מ' - תירגול 3
תרגיל 10- פתרון int max_len = 0, r, c, len; for (c = 0; c < N; c++) { len = 1; for (r = 1; r < N; r++) { //The sequence ended at r-1 //if current item is smaller if (mat[r][c] < mat[r-1][c]) { if (len > max_len) max_len = len; } else len++; } printf(“Max length is %d”, max_len); מבוא למדעי המחשב מ' - תירגול 3


הורד את "ppt "תרגול 5: לולאות ומערכים.

מצגות קשורות


מודעות Google