1 / 43

תירגול 4: קלט/פלט (הרחבה) ומשתנים בוליאניים

תירגול 4: קלט/פלט (הרחבה) ומשתנים בוליאניים. קלט/פלט (הרחבה). התקני הקלט והפלט הסטנדרטיים. לכל תוכנה מוגדרים מראש התקן קלט והתקן פלט סטנדרטיים. הקלט הסטנדרטי ( stdin ) מגיע כברירת מחדל מהמקלדת. הפלט הסטנדרטי ( stdout ) נשלח כברירת מחדל למסך.

derron
Download Presentation

תירגול 4: קלט/פלט (הרחבה) ומשתנים בוליאניים

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. תירגול 4: קלט/פלט (הרחבה) ומשתנים בוליאניים מבוא למדעי המחשב מ' - תירגול 4

  2. קלט/פלט (הרחבה) מבוא למדעי המחשב מ' - תירגול 4

  3. התקני הקלט והפלט הסטנדרטיים • לכל תוכנה מוגדרים מראש התקן קלט והתקן פלט סטנדרטיים. • הקלט הסטנדרטי (stdin) מגיע כברירת מחדל מהמקלדת. • הפלט הסטנדרטי (stdout) נשלח כברירת מחדל למסך. • כשמריצים את התוכנית באמצעות redirection (כלומר עם הפניה מקובץ או לקובץ, כפי שראינו בתרגול הראשון), אנו בעצם משנים באופן זמני את ההתקנים הסטנדרטיים עבור אותה הרצה. התוכנית איננה יודעת בזמן הרצתה לאן מקושרים ההתקנים הסטנדרטיים. זהו תפקידה של מערכת ההפעלה. מבוא למדעי המחשב מ' - תירגול 4

  4. תזכורת - redirection

  5. חוצץ הקלט (Input Buffer) • מטרתנו כעת היא להבין כיצד עובדת קליטת קלט בעזרת scanf. לצורך כך, עלינו להכיר מושג חדש: חוצץ הקלט. • חוצץ הקלטהוא אזור זיכרון המתוחזק ע"י מערכת ההפעלה.תפקידו הוא לשמור את קלט המשתמש עד אשר הוא נקרא ע"י התוכנית(או עד שהתוכנית מסתיימת) • מערכת ההפעלה תפנה למשתמש (תחכה לקלט) רק כאשר החוצץ ריק. בתחילת התוכנית החוצץ תמיד ריק.

  6. מן הקלט אל התוכנית כאשר הנתון הבא בתור אינו מתאים לטיפוס המבוקש הקריאה נכשלת (התוכן של המשתנה נשאר כשהיה והנתון נשאר בחוצץ) החוצץ אינו ריק! אולם scanfמדלגת על רווחים לבנים (רווח, טאב, וכו'), פרט למקרים שנקלטים תווים או מחרוזות (%c או %s) ברגע שהמשתמש מקיש ENTER, התווים נכנסים לחוצץ (כולל ה-ENTER!) כאשר יש נתונים בחוצץ, קוראים ממנו את הנתונים לפי הסדר ככל שניתן, כל עוד הם מתאימים לטיפוס המבוקש היות וחוצץ הקלט ריק, מערכת ההפעלה פונה ל-stdin (במקרה הזה המקלדת) לקבלת קלט משתמש a6 10 מערכת הפעלה Input Buffer Input Buffer תוכנית scanf(“%d”,&num1); ... scanf(“%d”,&num2);  10 Input Buffer a6 מבוא למדעי המחשב מ' - תירגול 4

  7. ומה קורה אם נקליד שני מספרים? משתמש 10 9 מערכת הפעלה Input Buffer Input Buffer 9  10 תוכנית scanf(“%d”,&num1); ... scanf(“%d”,&num2); מבוא למדעי המחשב מ' - תירגול 4

  8. דוגמה מה התנהגות התוכנית הבאה? intmain(){ int a=-1,b=-1,c=-1,d=-1; scanf(“%d%d”, &a, &b); scanf(“%d%d”, &c, &d); return 0; } 10 20 30 קלט: 10 20 30 40 40 מבוא למדעי המחשב מ' - תירגול 4

  9. דוגמה מה התנהגות התוכנית הבאה? intmain(){ int a=-1,b=-1,c=-1,d=-1; scanf(“%d%d”, &a, &b); scanf(“%d%d”, &c, &d); return 0; } 5 9 80 קלט: 5 9 80  140 70 140 מבוא למדעי המחשב מ' - תירגול 4

  10. דוגמה מה התנהגות התוכנית הבאה? intmain(){ int a=-1,b=-1,c=-1,d=-1; scanf(“%d%d”, &a, &b); scanf(“%d%d”, &c, &d); return 0; } 4 3 2 קלט: 4 3 2 a 1 1- מבוא למדעי המחשב מ' - תירגול 4

  11. דוגמה מה התנהגות התוכנית הבאה? intmain(){ int a=-1,d=-1; char b=‘b’,c=‘c’; scanf(“%d%c”, &a, &b); scanf(“%c%d”, &c, &d); return 0; } 1- ‘b’ ‘p’ קלט: p3 2 a 3 מבוא למדעי המחשב מ' - תירגול 4

  12. דוגמה נתבונן בתכנית הפשוטה הבאה: intmain(){ char ch1, ch2; printf(“Enter your first char: “); scanf(“%c”,&ch1); printf(“Enter your second char: “); scanf(“%c”,&ch2); printf(“Your first char was: %c\n”, ch1); printf(“Your second char was: %c”, ch2); return0; } מבוא למדעי המחשב מ' - תירגול 4

  13. איך מתבצעת קריאה מקובץ (Redirection) • כיצד היו הדברים משתנים אם stdin היה מגיע מקובץ (באמצעות redirection) ולא מהמקלדת? • בפקודת ה-scanf הראשונה היינו ממלאים את החוצץ בתוכן הקובץ ככל שניתן (גודל החוצץ מוגבל). משם, הדברים מתנהלים בצורה דומה למה שראינו עבור המקרה שהמשתמש מקליד מס' נתונים בבת אחת. • עם הבדל אחד משמעותי... מהו? • כאשר הקלט מגיע מהמקלדת, אם החוצץ מתרוקן ניתן לפנות למשתמש בבקשה להכניס קלט נוסף. כאשר הקלט מגיע מקובץ, לעומת זאת, יכול להיות שנגיע לסוף הקובץ לפני שהסתיימה הדרישה לקלט.

  14. הקבוע EOF • לכן, ישנו קבוע מיוחד הנקרא EOF (End Of File) המסמן את סוף הקלט. סימן זה מוחזר באופן אוטומטי למערכת ההפעלה כשהקובץ נגמר. • מרגע שמערכת ההפעלה מזהה שהגענו לסוף הקובץ, בכל בקשת קלט של התוכנית תוכן המשתנים אינו משתנה ומוחזר EOF. • כאשר הקלט מגיע מהמקלדת, ניתן להכניס סימן EOF מלאכותי בקלט באמצעות לחיצה על Ctrl+Zבמקלדת (Ctrl+Dבמאכ). שימו לב! יש ללחוץ על Ctrl+Zבשורה חדשה במסך על מנת שיקלטEOF.

  15. ערך החזרה של scanf • ראינו מס' סיבות שבגללן scanf נכשלת: למשל אם היא מצפה לקרוא מספר וקוראת תו, או כשמתקבל EOF לפני שהיא קוראת את כל הדגלים. • איך נגלה אם קריאת הקלט נכשלה ומה היתה הסיבה לכך? • ע"י בדיקת ערך ההחזרה של scanf

  16. ערך החזרה של scanf • ערך ההחזרה של scanf הוא מספר שלם המייצג את מספר הדגלים (%) ש-scanf הצליחה "לאכול". • אם הקריאה של דגל כלשהו נכשלה, לא יהיה ניסיון להמשיך ולקרוא את שאר הדגלים. • אם הגיע סוף הקלט, ערך החזרה של scanf יהיה EOF (קבוע המוגדר ב-DEFINEבקובץstdio.hוערכו 1-). • דוגמאות לשימוש בערך ההחזרה של scanf: int res = scanf("%d", &x); שמירת הערך if (scanf("%d", &x)==1) השוואת הערך לקבוע 1

  17. ערך החזרה של scanf - דוגמאות • מה יהיו ערכי המשתנים בסיום התוכנית? inti, res; char c; res = scanf("%d%c", &i, &c); > 3415abcd i=3415 c='a' res=2 > 3415 abcd i=3415 c=' ' res=2 בשני המקרים הללו scanf מחזירה 2, כי היא הצליחה לאכול את 2 דגלי הבקרה.

  18. ערך החזרה של scanf - דוגמאות int x, y, res; res = scanf("%d%d", &x, &y); scanf תחזיר 1, כי היא הצליחה לאכול רק את הדגל הראשון. > 3415abcd x=3415 y=??? res=1 scanf תחזיר 0, כי היא לא הצליחה לאכול אף דגל. > abcd x=??? y=??? res=0

  19. בדיקת קלט • כאשר אתם משתמשים ב-scanf בתרגילי הבית, עליכם לוודא שהיא עבדה. ניתן לעשות זאת באמצעות בדיקת ערך ההחזרה שלה: • למשל אם היא הייתה אמורה לקלוט 2 מספרים: if(scanf("%d%d",&d,&n)!=2){ printf(“Error”); ... }

  20. הפונקציות getchar ו-putchar • שתי פונקציות שימושיות במיוחד עבור מעבר על קלט תו-תו הן getchar ו-putchar (שתיהן מוגדרות בקובץ stdio.h). intputchar(int c); intgetchar(void); • תאור: הפונקציה קוראת את התו הבא מ-stdin ומחזירה אותו. אם אין יותר תווים לקרוא, היא מחזירה את הערך EOF • פרמטרים: אין. • ערך החזרה: קוד ASCII של התו שנקרא מהקלטאו EOF. • תאור: הפונקציה כותבת תו בודד ל-stdout, ומחזירה אותו. במקרה של כישלון, הפונקציה מחזירה במקום התו את הערך EOF. • פרמטרים: c-התו שיש לכתוב (קוד ASCII) • ערך החזרה: התו שנכתב, או EOF במקרה תקלה (נדיר מאוד).

  21. תרגיל סיכום: שיכפול קלט תרגיל 1: כתבו תכנית המקבלת קלט (ממקלדת או מקובץ)ומוציאה אותו לפלט הערה: אם אתם תוהים למה תכנית כזו טובה חשבו מה תהיה התוצאה כאשר תפעילו את התוכנית עם redirection מקובץ לתוך קובץ אחר

  22. תרגיל סיכום: פתרון int main() { intch = getchar(); while (ch != EOF) { printf(“%c”,ch); ch = getchar(); } return 0; } • נשים לב לשימוש בערך החזרה של getchar • מבנה ה-while הזה מופיע בתוכניות בהן אנחנו רוצים לקרוא את כל הקלט

  23. גלו את הטעות char ch = getchar(); while (ch != EOF) { … ch= getchar(); } intch = getchar(); while (ch != EOF) { … ch= getchar(); } char ch; int res = scanf(%c,&ch); while (res != EOF) { … res = scanf(%c,&ch); } char ch; scanf(%c,&ch); while (ch != EOF) { … scanf(%c,&ch); }

  24. משתנים בוליאניים מבוא למדעי המחשב מ' - תירגול 4

  25. ערכי אמת • מבחינים בין שני ערכי אמת: true ו-false • לכל מספר שלם ניתן להתאים ערך אמת: • הערך 0 הוא בעל ערך אמת false • כל ערך אחר הוא בעל ערך אמת true מבוא למדעי המחשב מ' - תירגול 4

  26. ערכי אמת - דוגמה מבוא למדעי המחשב מ' - תירגול 4

  27. הטיפוס bool • ב-C קיים טיפוס ייעודי לייצוג ערכי אמת • כדי להשתמש בו יש לכלול את הספריהstdbool.h: • מוגדר בה הטיפוס bool • הקבוע false שמוגדר כ-0 • הקבוע true שמוגדר כ-1 • ההמרה מ-int ל-bool ולהיפך מתבצעת לפי ערכי האמת מבוא למדעי המחשב מ' - תירגול 4

  28. הטיפוס bool - דוגמה #include <stdbool.h> ... int n; scanf("%d", &n); boolnotZero = n; if (notZero) { printf("n is non-zero!"); } • לא מומלץ להשוות בין משתני intלערכי bool. מה היה קורה פה? if (n != true) { printf("n is zero"); } מבוא למדעי המחשב מ' - תירגול 4

  29. אופרטורי השוואה • אופרטורים בינאריים המחזירים 0 או 1 בהתאם לנכונות ההשוואה: מבוא למדעי המחשב מ' - תירגול 4

  30. אופרטורים לוגיים • אופרטורים המתייחסים לפרמטרים שלהם כערכי אמת ומחזירים 0 או 1 בהתאם לפירוט בטבלה: מבוא למדעי המחשב מ' - תירגול 4

  31. דוגמאות 0 !5 1 !!5 0 5 && 0 1 5 && 'A' 1 5 || (-5) 5 || 0 1 מבוא למדעי המחשב מ' - תירגול 4

  32. דוגמאות בקוד if (0 <= n && n <= 10) { printf("n is between 0 and 10"); } if (n < 0 || n > 10) { printf("n smaller than 0 or larger than 10"); } if (n % 7 == 0) { printf("n is divisible by 7"); } מבוא למדעי המחשב מ' - תירגול 4

  33. תרגיל מהעבר תרגיל 2: כתבו תכנית המקבלת כקלט מספר שלם בטווח 1-10. אם המספר הוא ראשוני התכנית תדפיס זאת ואחרת תדפיס התכנית האם המספר הינו זוגי או אי-זוגי. אם המספר אינו בטווח בין 1-10 יש להדפיס הודעת שגיאה. • בפעם הקודמת פתרנו עם switch. איך נפתור עם אופרטורי השוואה ואופרטורים בוליאניים? מבוא למדעי המחשב מ' - תירגול 4

  34. תרגיל 2- פתרון intnum; scanf(“%d”,&num); if (num < 1 || num > 10){ printf(“Error!\n”); } else if (num==2 || num==3 || num==5 || num==7){ printf(“Number is prime\n”); } else if (num % 2 == 0){ printf(“Number is even\n”); } elseprintf(“Number is odd\n”); מבוא למדעי המחשב מ' - תירגול 4

  35. מנגנון Lazy Evaluation • החישוב של ביטוי לוגי נעצר ברגע שיודעים מה יהיה ערכו. • מנגנון זה מתייחס לאופרטורים || ו-&& A && B אם A לא מתקיים - ברור שהתוצאה היא 0 ולכן החישוב יעצור. A || B אם A מתקיים - ברור שהתוצאה היא 1 ולכן החישוב יעצור. מבוא למדעי המחשב מ' - תירגול 4

  36. דוגמאות • אם speed>90, מוחזר 1 בלי לבדוק את התנאי השני • תכונת הלוגיקה המקוצרת מאפשרת לשלב כמה בדיקות בו זמנית, גם כאשר בדיקה אחת תלויה בתוצאה של בדיקה קודמת: בדוגמה הזו, אם x=0 לא נבצע את החלוקה בצד ימין int speed = 100; (speed > 90) || (speed < 55); if ((x != 0) && (1/x > 12)) מבוא למדעי המחשב מ' - תירגול 4

  37. תרגיל 3 • מה תדפיס התוכנית הבאה? #include <stdio.h> #include <stdbool.h> int main() { inti=10; bool stop=false; while(!stop && (i-- >= 0)){ stop=!(i%5); printf("%d\n",i); } printf("%d\n",i); return 0; } מבוא למדעי המחשב מ' - תירגול 4

  38. תרגיל 4 (מתוך ש.ב) מספר הוא אי זוגי בריבוע אם הוא מכיל מספר אי זוגי של ספרות אי זוגיות. לדוגמה: המספר 12345 הוא אי זוגי בריבוע, כיוון שהוא מכיל 3 ספרות אי-זוגיות (1,3,5) לעומתו המספר 1234 הוא לא אי זוגי בריבוע, כיוון שהוא מכיל 2 ספרות אי זוגיות (1,3). א. יש לכתוב תוכנית הקולטת מהמשתמש מספר חיובי הקטן (ממש) ממיליון. אם המספר הוא אי זוגי בריבוע - • יש להדפיס: The number is double odd: v • אחרת, יש להדפיס: The number is double odd: x מבוא למדעי המחשב מ' - תירגול 4

  39. תרגיל 4- פתרון intval, oddCounter= 0; scanf("%d", &val); while (val > 0){ int digit = val % 10; if (digit % 2) { oddCounter++; } val /= 10; } printf(“The number is double odd: %c”, (oddCounter % 2) ? ‘v’ : ‘x’); מבוא למדעי המחשב מ' - תירגול 4

  40. תרגיל 4 (המשך) ב. יש לכתוב שוב את אותה התכנית, רק הפעם ללא שימוש במשפטי תנאי (if, else, switch, ?:) רמז:השתמשו במשתנים בוליאניים מבוא למדעי המחשב מ' - תירגול 4

  41. תרגיל 4- פתרון intval, oddCounter= 0; scanf("%d", &val); while (val > 0){ int digit = val % 10; if (digit % 2) { oddCounter++; } val /= 10; } printf(“The number is double odd: %c”, (oddCounter % 2) ? ‘v’ : ‘x’); מבוא למדעי המחשב מ' - תירגול 4

  42. תרגיל 4- פתרון intval, oddCounter= 0; scanf("%d", &val); while (val > 0){ int digit = val % 10; boolisDigitOdd = digit % 2; oddCounter += isDigitOdd; val /= 10; } printf(“The number is double odd: %c”, (oddCounter % 2) ? ‘v’ : ‘x’); מבוא למדעי המחשב מ' - תירגול 4

  43. תרגיל 4- פתרון intval, oddCounter= 0; scanf("%d", &val); while (val > 0){ int digit = val % 10; boolisDigitOdd = digit % 2; oddCounter += isDigitOdd; val /= 10; } boolisCounterOdd = oddCounter% 2; printf(“The number is double odd: %c”, 'x'+isCounterOdd*('v'-'x')); מבוא למדעי המחשב מ' - תירגול 4

More Related