תרגיל מס - WordPress.com

‫מכללת אורט כפר‪-‬סבא‬
‫תכנות מערכות בשפת ‪C‬‬
‫תרגיל מס' ‪8‬‬
‫פתרו את השאלות הבאות‪ .‬יש לסיים את התרגיל עד יום א' )‪.(9.11‬‬
‫שאלה ‪1‬‬
‫בשיעור הכרנו את הפונקציות התקניות ‪ strncpy‬ו‪) strstr-‬המוגדרות שתיהן ביחידת הספרייה‬
‫‪ (string.h‬אך לא כתבנו עבורן מימוש‪ ,‬אלא רק השתמשנו בהן‪ .‬בנוסף‪ ,‬הכרנו את הפונקציה‬
‫התקנית ‪) stricmp‬המוגדרת אף היא ב‪ ,(string.h-‬וכתבנו עבורה מימוש "בזבזני"‪ ,‬המשתמש‬
‫בהקצאת זיכרון דינאמית עבור מחרוזות‪-‬עזר‪.‬‬
‫א‪ .‬כתבו מימוש ל‪ .strstr-‬בדקו את המימוש שלכם בעזרת ‪ main‬שעושה שימוש בפונקציה‪.‬‬
‫בדקו גם מקרי קצה בהם יש לטפל )כדוגמת מקרה שבו אחת או יותר משתי המחרוזות‬
‫היא מחרוזת ריקה‪ ,‬וכו'(‪.‬‬
‫ב‪ .‬כתבו מימוש ל‪ .strncpy-‬בדקו את המימוש שלכם בעזרת ‪ main‬שעושה שימוש בפונקציה‪.‬‬
‫בדקו גם מקרי קצה בהם יש לטפל )כדוגמת מקרה שבו המחרוזת המועתקת אורכה קטן‬
‫מ‪ n-‬תווים‪ ,‬וכו'(‪.‬‬
‫ג‪ .‬כתבו מימוש ל‪ ,stricmp-‬שאינו עושה שימוש בהקצאת זיכרון דינאמית‪ .‬בדקו את‬
‫המימוש שלכם בעזרת ‪ main‬שעושה שימוש בפונקציה‪.‬‬
‫שאלה ‪2‬‬
‫בשיעור הכרנו את הפונקציה התקנית ‪ .strchr‬פונקציה תקנית נוספת )המוגדרת גם היא ב‪-‬‬
‫‪ ,(string.h‬הדומה לה מאוד‪ ,‬היא הפונקציה ‪ ,strrchr‬שכותרתה‪:‬‬
‫)‪char *strrchr (const char *s, const char c‬‬
‫הפונקציה ‪ strrchr‬מקבלת מחרוזת ‪ s‬ותו ‪ ,c‬ומחזירה מצביע למופע האחרון של התו ‪ c‬ב‪ .s-‬אם‬
‫התו ‪ c‬לא מופיע כלל ב‪ ,s-‬הפונקציה מחזירה ‪ .NULL‬לדוגמא‪ :‬אם "‪ ,s = "what about‬אז‬
‫)'‪ strrchr(s,'a‬יחזיר מצביע לאות הראשונה של המילה ‪ .about‬לעומת זאת‪ ,‬הזימון )'‪strrchr(s,'d‬‬
‫יחזיר ‪ .NULL‬ממשו את הפונקציה ‪.strrchr‬‬
‫‪1‬‬
‫שאלה ‪3‬‬
‫כתבו תכנית הקולטת מהמשתמש מחרוזת שמכילה מילים )כל מילה מורכבת מאותיות קטנות או‬
‫גדולות מהאלפבית הלועזי‪ ,‬ואורכה לפחות אות אחת(‪ ,‬שביניהן יש רווח בודד‪ .‬התכנית תציג כפלט‬
‫את המילה הכי ארוכה במחרוזת‪.‬‬
‫לדוגמא‪ ,‬עבור הקלט "‪ "End of passion play crumbling away‬יוצג הפלט "‪."crumbling‬‬
‫שאלה ‪4‬‬
‫כתבו פונקציה שכותרתה‪:‬‬
‫)‪int foobar (const char *s, const char *sub‬‬
‫הפונקציה מקבלת שתי מחרוזות‪ s ,‬ו‪ .sub-‬אם המחרוזת ‪ s‬מכילה את המחרוזת ‪ sub‬וגם את‬
‫היפוכה של ‪ ,sub‬אז הפונקציה תחזיר ‪ ,1‬ואחרת ‪ -‬תחזיר ‪ .0‬שימו לב כי זו אינה פונקציה תקנית!‬
‫לדוגמא‪ ,‬עבור הזימון )"‪ foobar("asstheasehtagreen","the‬יוחזר ‪ ,1‬שכן גם הפרמטר השני‬
‫"‪ "the‬וגם היפוכו "‪ ,"eth‬שתיהן תת‪-‬מחרוזות של הפרמטר הראשון‪ .‬לעומת זאת‪ ,‬עבור הזימון‬
‫)"‪ foobar("qwertyupanddown","upa‬יוחזר ‪ ,0‬שכן אומנם "‪ "upa‬היא תת‪-‬מחרוזת של‬
‫הפרמטר הראשון‪ ,‬אבל היפוכה ‪ "apu" -‬לא מופיעה בפרמטר הראשון כלל‪.‬‬
‫‪2‬‬
‫שאלה ‪5‬‬
‫בשפות התכנות ‪ Java‬ו‪ C#-‬ניתן לגלות את אורכו של אובייקט מסוג מערך על‪-‬ידי שימוש בתכונה‬
‫‪ .Length‬שפת ‪ C‬אינה מונחית עצמים‪ ,‬ומערכים אינם אובייקטים )ולכן – גם אין להם תכונה‬
‫בשם ‪.(Length‬‬
‫א‪ .‬כיצד ניתן לגלות את גודלו של מערך חד‪-‬מימדי )את כמות האיברים בו(? הריצו את‬
‫התכנית הבאה‪:‬‬
‫>‪#include <stdio.h‬‬
‫)(‪int main‬‬
‫{‬
‫‪ */‬מגדירים מערך של חמישה מספרים שלמים *‪/‬‬
‫;}‪int arr[5] = {1,2,3,4,5‬‬
‫;))‪\n", sizeof(int‬גודלו של משתנה מטיפוס שלם הוא ‪ %d‬בתים"(‪printf‬‬
‫;))]‪\n", sizeof(arr[0‬כלומר‪ ,‬גודלו של איבר במערך הוא ‪ %d‬בתים"(‪printf‬‬
‫;))‪\n", sizeof(arr‬גודלו של המערך כולו הוא ‪ %d‬בתים"(‪printf‬‬
‫;))]‪ ", sizeof(arr)/sizeof(arr[0‬לכן‪ ,‬במערך יש ‪ %d‬איברים"(‪printf‬‬
‫;‪return 0‬‬
‫}‬
‫ב‪ .‬מעוניינים לנהוג בצורה דומה גם כדי לערוך חישובים לגבי מערך דו‪-‬מימדי‪ .‬השלימו את‬
‫הביטויים החסרים בתכנית הבאה‪:‬‬
‫>‪#include <stdio.h‬‬
‫)(‪int main‬‬
‫{‬
‫;]‪int matrix[5][3‬‬
‫;)‬
‫)‪(1‬‬
‫‪\n",‬גודלו של איבר במטריצה הוא ‪ %d‬בתים"(‪printf‬‬
‫;)‬
‫)‪(2‬‬
‫‪\n",‬גודלה של שורה במטריצה הוא ‪ %d‬בתים"(‪printf‬‬
‫;)‬
‫)‪(3‬‬
‫‪\n",‬גודלה של המטריצה כולה הוא ‪ %d‬בתים"(‪printf‬‬
‫;)‬
‫;)‬
‫;)‬
‫)‪(4‬‬
‫)‪(5‬‬
‫)‪(6‬‬
‫‪\n",‬מספר העמודות במטריצה הוא ‪printf("%d‬‬
‫‪\n",‬מספר השורות במטריצה הוא ‪printf("%d‬‬
‫‪\n",‬מספר האיברים במטריצה הוא ‪printf("%d‬‬
‫;‪return 0‬‬
‫}‬
‫ג‪) .‬רשות( נסו למצוא דרך נוספת לחשב את הביטוי החסר )‪.(6‬‬
‫‪3‬‬