מבוא למדעי המחשב – שפת C (234112), סמסטר אביב 2009
Transcription
מבוא למדעי המחשב – שפת C (234112), סמסטר אביב 2009
מבוא למדעי המחשב – שפת ,)211332( Cחורף 2132-2132 תרגיל בית 4 מועד אחרון להגשה :יום ה' 44/24/402/ המתרגל האחראי על תרגיל זה :צביקה לזר משרד :טאוב 703 [email protected] :E-mail חשוב לשמור את קוד אישור ההגשה שמקבלים מהמערכת כשמגישים!! שעת קבלה רגילה :יום ד' 03:70-03:70 שעות קבלה מיוחדות לשאלות על התרגיל: יום א' 0710010005ויום א' 0010010005בין השעות 17:30-18:30 הוראות הגשה: הגשה אלקטרונית בבודדים1 תרגיל שיוגש בזמן יקבל אוטומטית בונוס של 5נקודות1 תינתן הארכה אוטומטית של שלושה ימי עבודה (מלבד שישי ושבת) למאחרים ,ללא בונוס1 מלבד מילואים ,לא יתקבלו תרגילים אחרי הארכה של שלושה ימי עבודה1 כל יום מילואים = יום דחייה 1על מנת לקבל את הדחייה ,עליכם לשלוח באי-מייל למתרגל האחראי על תרגיל זה (צביקה לזר) עותק של האישור המראה שהייתם במילואים 1אם האישור יגיע אליכם בתאריך מאוחר ,אנא הודיעו על כך לצביקה לזר1 ערעורים ניתן להגיש עד לתאריך המסומן בהודעה על מתן הציונים (כשבועיים לאחר קבלת הציון)1 במידה והערעור לא יתקבל תהיה הורדה אוטומטית של הבונוס (חמש נקודות) אם התקבל כזה1 עירעורים על הדפסות שגויות בפלט שלכם לא יתקבלו 1עליך לבדוק את התוכנית שלך עם DiffMergeלפני הגשתה1 הנחיות: אנא קרא/י את השאלות בעיון לפני שתתחיל/י בפתרונן1 ניתן להניח כי הקלט תקין ,אלא אם כן נאמר אחרת1 שימו לב! הבדיקה תהיה אוטומטית ,ולכן הקפיד/י מאוד להדפיס בדיוק בפורמט שהתבקשת ולבדוק את הפלט מול הפלט של הדוגמאות שקיבלת עם .DiffMerge o וודא/י את האותיות הגדולות והקטנות לפי הדוגמאות וההסברים בתרגיל1 o הורדת שורה אחת בסוף כל שורה שהודפסה ,אפילו אם היא האחרונה בתוכנית1 o אין להדפיס רווחים בהתחלת שורה ובסופה1 יש לבדוק את אתר ה FAQ -של התרגיל לעיתים תכופות על מנת לקבל עדכונים על התרגיל1 בתרגיל זה מותר להשתמש בפונקציות מהספרייה stdio.hבלבד (בלי clrscrו1)delay- הגשה אלקטרונית בבודדים היא דרך אתר הקורס 1הגש/י קובץ zip( hw4.zipולא פורמט אחר (!) כגון 1)rarהשם של קובץ חייב להיות באנגלית ללא רווחים 1אין דרישות נוספות לשם הקובץ ,כלומר גם sharon.zipמקובל מבחינת המערכת 1הקובץ יכיל בתוכו רק את הקבצים הבאים (לא לעשות zip על התיקייה בה נמצאים הקבצים להגשה – במקרה כזה ההגשה לא תתקבל ע''י המערכת!): oקובץ students.txtעם שמך ,מספר תעודת הזהות וכתובת האימייל שלך1 oקובץ פתרון hw4q1.cעבור שאלה 10 oקובץ פתרון hw4q2.cעבור שאלה 10 השתמש ב redirection-כדי להפנות את הפלט לקובץ טקסט1 יש להקפיד להגיש את כל הקבצים בדיוק עם השמות שמופיעים לעיל 1הגשה שלא תעמוד בתנאי זה לא תתקבל ע"י המערכת! שימו לב לדף ה FAQ -של התרגיל ,אשר מכיל עדכונים ותשובות לשאלות נפוצות ,ויעודכן מפעם לפעם .חשוב להתעדכן לעיתים תכופות – יוכל לחסוך בעיות ,ונקודות שירדו בבדיקה שכשלה. בפרט ,לפני פנייה למתרגל האחראי בדקו את הכתוב ,על מנת לחסוך לעצמכם זמן המתנה לתשובה ,שבדרך כלל תהיה הפניה ל FAQ -בכל מקרה .ניתן למצוא את ה FAQ-בכתובת: http://tinyurl.com/c-intro-ex4-qa שאלה 1 נתונים שלושה מערכים :שניים באורך 00והשלישי באורך 100עליכם לקרא מהקלט נתונים שיאפשרו לכם להחליף את האיברים הראשונים בשני המערכים הראשונים ואח"כ לחשב כיצד להחליף את האיברים הראשונים במערך השלישי 1שימו לב שהאיברים שאינם מוחלפים בשלושת המערכים הם איברים שלא אותחלו ולכן תכנם אינו ידוע111 המשתמש יתבקש לציין כמה איברים יש להחליף במערך הראשון ( 00לכל היותר) ואת סדרת המספרים אותם יש לשים בתאים הראשונים במערך בהתאם 1אח"כ יתבקש המשתמש לציין כמה איברים יש להחליף במערך השני ( 00לכל היותר גם כאן…) ואת סדרת המספרים המתאימה1 התכנית תחליף את האיברים הראשונים במערך השלישי באיברי המערך הראשון והשני בהתאמה לפי הסדר הבא :מספר ראשון מהמערך הראשון ,אח"כ המספר הראשון מהמערך השני ,אח"כ המספר השני מהמערך הראשון ואחריו המספר השני מהמערך השני וכך הלאה 1אם מספר המספרים שהוחלפו במערך הראשון והשני אינו זהה ,ישולבו תחילה המספרים הקיימים בשני המערכים ובסוף יילקחו שאר המספרים מהמערך בו מספר האיברים שהוחלפו היה גדול יותר1 עליכם להדפיס לפלט בסופו של דבר רק את האיברים שהוחלפו במערך השלישי 1שימו לב שאנחנו מתעלמים מהערכים שלא הוחלפו בכל המערכים1 מהלך התכנית 10 10 17 14 15 13 תבקש מהמשתמש להכניס את מספר האברים שהוא רוצה להכניס למערך הראשון (התכנית תניח קלט חוקי בין 0ל1)00- תקלוט מספר מתאים למספר שנקלט של מספרים בקלט עבור הסדרה הראשונה תבקש מהמשתמש את מספר האברים הרצויים בסדרה השנייה (לכל היותר 00כנ"ל…) תקלוט מספר מתאים של מספרים בקלט עבור הסדרה השנייה1 תחליף את אברי המערך השלישי באברים שנקלטו עבור הסדרה הראשונה והשנייה בהתאם למתואר לעיל תדפיס את תוכן האיברים שהוחלפו במערך השלישי עם רווחים ביניהם וירידת שורה (ללא רווח) לאחר האיבר האחרון1 הודעות למשתמש על כל ההודעות למשתמש להופיע בדיוק כפי שהן מופיעות כאן ,ללא רווח מיותר ועם הורדת שורה בסופן1 כדי לקלוט את מספר האיברים בסדרה הראשונה: כדי לקלוט את האיברים של הסדרה הראשונה ( xהוא המספר שאך זה נקלט:)111 First series length: Enter x numbers for first series: כדי לקלוט את מספר האיברים בסדרה השנייה: כדי לקלוט את האיברים של הסדרה הראשונה ( yהוא המספר שאך זה נקלט:)111 Second series length: Enter y numbers for second series: דוגמא לריצה (באדום קלט לדוגמא -בכחול פלט מתאים): First series length: 5 Enter 5 numbers for first series: 1 8 9 23 -32 Second series length: 3 Enter 3 numbers for second series: 90 23 6 1 90 8 23 9 6 23 -32 שאלה 2 במערך דו-מימדי מקודדת תמונה באמצעות התווים רווח (' ') וכוכבית ('*') 1כדי לחסוך בכתיבת הקלט ,משתמשים באלגוריתם דחיסה :שורות של זוגות מספרים 1בכל זוג ,המספר הראשון מציין מספר רצוף של כוכביות והשני מספר רצוף של רווחים 1בכל שורה סדרת זוגות כאלה (הכוללת לפחות זוג אחד) מסתיימת במספר 1-0 למשל ,עבור שורת הקלט הבאה (מתאימה לשורה באורך :)00 0 3 4 3 -1 מייצגת שורה במערך שמתחילה באפס כוכביות (כלומר מתחילה ברווח/ים) ,שלושה רווחים ,ארבע כוכביות ועוד שלושה רווחים 1אנחנו מניחים שהקלט חוקי (סך כל הכוכביות והרווחים הוא בדיוק אורך השורה במערך)1 השורה במערך המתאימה לשורת הקלט לעיל תיראה כך: 9 ' ' 8 ' ' 7 ' ' 5 6 '*' 4 '*' 3 '*' '*' 2 ' ' 1 ' ' 0 ' ' Index Contents בתרגיל נעבוד עם מערך תווים דו-מימדי ריבועי (כלומר מספר שווה של עמודות ושורות) בגודל כלשהו (לכל היותר 00על )00ונבנה את תוכנו על ידי קריאת מספר שורות מתאים שמציינות את תוכן המערך1 מהלך התכנית 10 10 17 14 התכנית תבקש מהמשתמש להכניס לקלט את גודל המערך (לכל היותר )00 התכנית תקלוט מספר מתאים של שורות מקודדות (מספר השורות נקבע על פי המספר שנקלט בצעד ,)0שעל פיהן תמלא את המערך המייצג את התמונה1 התכנית תדפיס לפלט את התמונה המקודדת בתוך מסגרת 1המסגרת תורכב מהתווים הבאים: התו '( '+סימן החיבור) ישמש לפינות המסגרת ,התו '|' (כמו בערך מוחלט) ישמש לחלק האנכי מימין ומשמאל לתמונה והתו '( '-סימן החיסור) ישמש לחלק האופקי מעל ומתחת לתמונה1 בשורה האחרונה מתחת לתמונה תינתן הודעה על סך כל מספר הכוכביות המרכיבות את הציור1 הודעות למשתמש על כל ההודעות למשתמש להופיע בדיוק כפי שהן מופיעות כאן ,ללא רווח מיותר ועם הורדת שורה בסופן1 לפני קליטת מספר שורות הקלט: Enter picture size: לפני קליטת השורות המקודדות ( xהוא המספר שנקלט זה עתה:)111 Enter x encoded lines: אחרי הדפסת התמונה המתקבלת במסגרת ,תיכתב לפלט מתחת לתמונת השורה (ללא שורת רווח): This picture contains y asterisks כש y-הוא מספר סך כל הכוכביות שבהן השתמש הציור1 דוגמא לריצה (באדום קלט לדוגמא -בכחול פלט מתאים): שימו לב ששורת הפלט הראשונה היא סדרה של עשרה רווחים (נראית כשורת רווח בין הקלט לפלט…): Enter picture size: 10 Enter 10 encoded lines: 0 10 -1 10 0 -1 0 1 1 6 1 1 -1 0 2 1 4 1 2 -1 0 3 1 2 1 3 -1 0 4 2 4 -1 0 3 1 2 1 3 -1 0 2 1 4 1 2 -1 0 1 1 6 1 1 -1 10 0 -1 +----------+ | | |**********| * | | * * | | * | * * | | ** | | * * | * | | * * | | * |**********| +----------+ This picture contains 34 asterisks שאלה ( 3שאלה יבשה) הנחיות לתרגיל יבש שימו לב שאת התשובה לשאלה זו מגישים בצורה יבשה בלבד ,כלומר – יש להגיש את הפתרון המודפס לשאלה כולל תצלומי מסך מודפסים של דוגמאות ההרצה המבוקשות ,לאחד משני תאי הקורס 074000 בבניין טאוב (מדעי המחשב) קומה ,0קומה אחת מעל קומת הכניסה התחתונה (לא לתא של אף קורס אחר דומה!) 1מצורפת תמונה: בראש כל דף בהגשה המודפסת יש להוסיף שם מלא בעברית ,מספר ת"ז וכתובת דוא"ל 1חשוב מאוד שמספר ת"ז שלכם ייכתב בצורה קריאה ,אחרת תסתכנו באי קבלת ציון על השאלה! אסור להשתמש בפונקציות או במצביעים על הפתרון להיות קריא ומתועד ,כלומר -עם הערות המסבירות אותו יש להשתמש בהזחה )(indentation יש לתת שמות משמעותיים למשתנים אי הקפדה על הדרישות האלו ,תגרור הורדת נקודות1 מה מגישים? איך מגישים? 10הקוד המודפס מקודבלוקס 1כלומר ,אחרי פתרון השאלה וכתיבת הקוד בקודבלוקס, הדפיסו אותו ( 1)File-->Printאם נתקלים בקושי להדפיס מקודבלוקס ,אפשר להשתמש בכל שיטת הדפסה נוחה אחרת ,כל עוד הקוד מודפס בצורה ברורה ,מסודרת וקריאה 1אפשר להוסיף הערות לקוד בכתב יד לאחר ההדפסה (בכתב נקי וברור!) טיפ :אפשר לצלם את המסך עם הקוד שלכם בקודבלוקס1 דוגמאות ההרצה המבוקשות בשאלה :צריך להריץ את התוכנית בקודבלוקס ולהשתמש בקלט המבוקש בכל פעם ,כדי לוודא שהיא מדפיסה למסך את הנדרש 1צלמו את מסך החלון השחור והדפיסו אותו 1אין להגיש תצלום של כל המסך ,אלא של החלון השחור בלבד 1דוגמא מתאימה מופיעה בסוף השאלה 1חובה לראות בתדפיס את ההרצה עצמה ,את הקלט שניתן ,ואת הפלט המתקבל 1תורדנה נקודות על חלקים חסרים בהדפסה (קלט ו/או פלט)1 השתמשו בשלד התכנית המובא בהמשך 1עליכם להחליף את ההערות: /* TO BE COMPLETED */בקוד שלכם בהתאם1 השאלה נתון מערך דו-ממדי matשל מספרים שלמים בגודל Mשורות ( Mמוגדר ב )#define-ו M-עמודות1 הגדרה :המערך matנקרא "זוגי לסירוגין" כאשר מתקיים: סכום כל האיברים בכל שורה בעלת אינדקס זוגי הוא אי-זוגי, ולהיפך ,סכום כל האיברים בכל שורה בעלת אינדקס אי-זוגי הוא זוגי1 התכנית שלכם אמורה לקלוט מספרים שישובצו במערך דו-מימדי ריבועי שגודלו לכל היותר 10 x 00והיא תודיע האם המערך הוא "זוגי לסירוגין" או שתדפיס את אינדקס השורה הראשונה ,המפרה את ההגדרה "זוגי לסירוגין"1 הערות: האיברים במערך יכולים להיות חיוביים או שליליים או אפס1 אפס הוא מספר זוגי1 דוגמה: עבור המערך הנתון הבא ( )M=3התכנית תודיע כי הוא "זוגי לסירוגין"1 4 0 0 -0 3 -7 7 1 -5 הסבר: סכום האיברים בשורה מספר אפס (זוגי) 11+2+4=7 :הסכום אי-זוגי1 בשורה מספר ( 0אי-זוגי) 1-3+3-2=-2 :הסכום זוגי1 בשורה מספר ( 0זוגי) 1-5+1+7=3 :הסכום אי-זוגי1 מהלך התכנית .1תדפיס: Enter array size: 10תקלוט את מספר השורות ( Mשמציין גם את מספר הערכים בכל שורה) 1המספר הוא שלם בין 0ל- ( 00מותר להניח קלט תקין)1 תדפיס את השורה הבאה 1בהדפסה M ,ו i-המופיעות להלן תוחלפנה בגודל המערך ואינדקס השורה בהתאמה:1 Enter M integer numbers for the row with index i: 17תקלוט Mמספרים עבור השורה הנוכחית1 14התכנית תדפיס שורה דומה עבור השורה הבאה ותקלוט עוד Mמספרים – תחזור על כך עד שתתקבלנה Mשורות בסה"כ1 15לאחר סיום קליטת כל שורות הקלט ,תבדוק אם המערך שהוזן הוא "זוגי לסירוגין "1 13תדפיס אישור שהמערך הוא "זוגי לסירוגין" ,או שתדפיס את אינדקס השורה הראשונה ש"פוסלת" את המערך מלהיות מוגדר ככזה 1כלומר ,תדפיס את אחת ההדפסות הבאות: o הדפסה במקרה של מערך "זוגי לסירוגין": The given array is of alternating parity o הדפסה במקרה של מערך שאיננו "זוגי לסירוגין" (אינדקס השורה המתאים יודפס במקום במקום jלהלן): Array is not of alternating parity - index of the first row that doesn't observe it is j שתי דוגמאות ההרצה המבוקשות ופלט לדוגמא לכל אחת מהן: דוגמא ראשונה :המערך המופיע בדוגמא עם ההסבר לעיל ייראה כך בהרצה: דוגמא שניה :המערך הבא: -5 4 -3 0 -0 6 -5 4 -3 2 -8 6 -5 4 -3 8 -7 6 -5 4 -9 8 -7 6 -5 שלד התכנית #include <stdio.h> #define MAX_ARRAY_SIZE 10 int main() { /* variable definition */ /* TO BE COMPLETED */ /* Get array size */ printf("Enter array size:\n"); /* TO BE COMPLETED */ /* Get array elements a line by line */ for (i = 0; i < nSize; ++i) { printf("Enter %d integer numbers for the row with index %d:\n", nSize, i); for (j = 0; j < nSize; ++j) { /* TO BE COMPLETED */ } } /* Check the array's alternating parity */ for (i = 0; i < nSize; ++i) { /* TO BE COMPLETED */ } /* TO BE COMPLETED */ return 0; }