[השמעת מוסיקה] ZAMYLA צ'אן: היית מעדיף לקבל 10 מיליון דולרים עכשיו או לקבל פרוטות בכל יום בחודש, שבי בכל יום שלאחר מכן, אתה מקבל להכפיל את כמות פרוטותיך קיבל ביום שלפני? בפרוטות, אנחנו הולכים להוכיח למה אתה צריך בהחלט לקחת את הפרוטות. התפקיד שלך הוא לכתוב pennies.c-- תכנית ששואלת את המשתמש ראשון איך יש ימים רבים בחודש ו ואז שואל כמה פרוטות המשתמש יקבל ביום הראשון. התכנית צריכה אז לחשב את סכום שהמשתמש יצטרך שנצבר בסוף חודש ולהציג אותו. אנחנו יכולים לשבור את התכנית הזו לכמה משימות. אנחנו נצטרך לבקש תשומות משתמשים מרובות - ימים וחודשים, ופרוטות ביום הראשון. אנחנו צריכים לעקוב אחר כמה כסף יש למשתמש ולעדכן אותו בכל יום, מכפיל את כמות פרוטות שהם מקבלים. ולבסוף, אנו להדפיסם סך סופי, בדולרים. בואו להתמודד עם קלט המשתמש ראשון. אני הולך לפתוח את apples.c, תכנית קצרה העוסקת עם כניסות ויציאות. בחלק העליון כאן, צירפתי כמה מהספריות שאני צריך - הספרייה של CS50 וסטנדרטי I / O ספרייה. אני מדפיס באמצעות הפקודה פונקצית printf מ ספריית קלט / פלט סטנדרטי. אבל הנחיה בפועל של המשתמש קורה בשורה הבאה עם זה פונקצית GetInt בספריית CS50. GetInt מקבל קלט מהמשתמש ו מבטיח שהקלט הוא מספר שלם. אז לאחסן הקלט של המשתמש למספר שלם אני, להחסיר 1 מ-i, ולאחר מכן להדפיס את הערך החדש אם אני. לאחר הקומפילציה apples.c באמצעות הפקודה "להפוך את התפוחים," יש לי תפוחי קובץ הפעלה. פועל ש, אני קלט 1. התכנית אומרת לי ש יש לי 0 תפוחים שנותרו. וכך שעבד כמצופה. אז בואו נריץ את זה שוב וקלט שלילי 1. עכשיו, שיש לו סכום שלילי של תפוחים לא ממש הגיוני, אבל התכנית מקבלת אותה, משום שלילי 1, כן, זה הוא מספר שלם. ועכשיו את התכנית או את המפלצת בתוך התכנית אוכלת שלילית תפוח, ועכשיו יש לי 2 תפוחים שליליים. הממ, אז זה שיעור אחד - למרות שהפונקציה וGetInt פונקציות נלוות, כמו GetFlow או GetString לקבל את סוג הנתונים הנכון, אתה יש לוודא כי הקלט עושה הגיוני עבור התכנית שלך. בפרוטות, זה לא יעשה בדיוק את הפקודה למספר שלם, אתה צריך לעשות בטוח שתשומות המשתמש שלם זה הגיוני בהתחשב בהקשר. חודש יכול להיות 28 בלבד, 29, 30, או 31 ימים. אנחנו רוצים לדרוש ברציפות מספר שלם חוקי. אם הם מחוץ קלט מספר שלם שלנו גבולות מקובלים, אנו ינחו אותם שוב ושוב, עד שאתה לתת לנו מספר שלם חוקי. כזכור, "חזור עד" לחסום בסריטות? אתה יכול לעשות את מבנה דומה ב-C באמצעות לולאה ", ואילו" או "עשה ואילו" לולאה. יש את מבנה הלולאה ואילו מצבו כי צריך להתקיים על גוף של לולאה לביצוע. זה אמור להיראות קצת דומה, בגלל המצב הוא בדיוק כמו לוקי התחלה עם הזוויות ונכנס לסוגריים של הלולאה ", ואילו". אז התנאי שיבדוק אם השלם הוא בתוך הגבולות מקובלים. אתה יכול להנחות את GetInt באמצעות המספר השלם ולאחר מכן לבצע "תוך" שלך לולאה, חוזר על הבקשה והדפסה הוראות, ואילו קלט אינו חוקי. דרך נוספת להבטיח קלט משתמש נכון הוא באמצעות "עשה ואילו" לולאה, אשר דומה מאוד ללולאה בזמן. "עשה ואילו" לולאה מבצעת את הקוד בתוך אלה הגוף ולאחר מכן בודק אם התנאי מתקיים או לא. זה שימושי לקבלת קלט משתמש, כי אתה יודע שאתה צריך כדי להנחות אותם לפחות פעם אחת. אם התנאי אינו מתקיים, התכנית תבצע את הקו לאחר "עשה ואילו" הלולאה. אם התנאי שהוא נפגש, הלולאה תחזור לולאה "עשה ואילו" לאימות משתמש קלט נראה משהו כזה. אני מצהיר n משתנה, GetInt, ו לאחר מכן חזור עד n הוא חוקי. והתהליך הזה, הסברתי, הייתי משתמש הסוג שלם-נתונים, אשר תוכל להשתמש לימי החודש. אבל אנחנו יודעים שמספר פרוטות יהיה להיערם במהירות, ולכן על מנת לאחסן מספרים גדולים יותר, השתמש בסוג הנתונים LongLong, אך יש לזכור אותו עיקרון האימות חל. מדהים, אז ברגע שיש לנו שניים בתוקף תשומות מהמשתמש - ימים בחודש ואת הפרוטות ביום הראשון - אנחנו יכולים להעביר על גבי הבאים חלק מהתכנית. ביום הראשון, המשתמש מתחיל עם פרוטות אולם רבות הם המפורטים והסכום של פרוטות שהם תקבל ביום שלמחרת הוא הוכפל. אז זה הגיוני כדי לעקוב אחר משני סכומים אלה - כמה כסף יש לו את המשתמש ואיך פרוטות רבות הם יהיו נתון. עכשיו, עושה משהו במשך 28 עד 31 ימים הוא חוזר על עצמו, אז בואו נשתמש "עבור" לולאה כדי לעבור על פני הימים ב חודש, עדכון כולל ואגורה תעמוד בכל פעם. "עבור" תחביר לולאה מכיל הבא - אתחול, תנאי, ועדכון. הלולאה "עבור" שלך תהיה לאתחל משתנה, כאשר הוא הראשון נכנס ללולאה. אם התנאי מתקיים, הגוף של הלולאה יבצע. לאחר מכן, יבצע את העדכון. אם התנאי עדיין מתקיים, הלולאה תבצע ולעדכן, ו לחזור כל זמן שהמצב שלך, מוערך נכון. הנה לולאה "עבור" שחלק עמ '2 על ידי שלם בסך הכל 10 פעמים. שימו לב איך אני הכריז עמ 'השלם מחוץ ללולאה "עבור" שלי, כך ש מספר שלם יכול להיות נגיש מחוץ ללולאה "עבור". אחרי החודש עבר, זה זמן כדי לספר את המשתמש כמה כסף הם קיבל. למפרט, אתה צריך לספר את המשתמש כמה דולרים, לא כמה פרוטות, יש להם. אבל עד כה, שעקבת אחר סך הכל ואת פרוטות באמצעות LongLongs, שהם מספרים שלמים. ישנם 100 פרוטות ל 1 $, אז אלא אם כן מספר פרוטות הוא מכפיל של 100, תצטרך מייצגים מקומות אחרי נקודה עשרונית. Autotype הוכפל מאפשר לך לעשות את זה. אז איך להמיר מהייצוג פרוטות לדולרים? בואו נסתכל pi.c. תכנית זו לוקחת big_pi וLongLong חלק על ידי 100,000, ומדפיס את התוצאה לחמישה מקומות אחרי נקודה עשרונית. אם אנחנו רוצים להציג ארבע עשרוניות מקומות, אז אנחנו יכולים פשוט להחליף את זה מספר כאן. אז בואו נחסוך, לקמפל PI, ו לאחר מכן רואה את התוצאה, שאנו מצפה להיות 3.1415 - חמש הספרות הראשונות של פיי. זה לא כאילו. ולמה? ובכן, כי big_pi הוא LongLong, שהוא מספר שלם, שלא לעקוב אחר שברים עשרוניים. השינוי שאני צריך לעשות הוא בליגה. אני צריך להטיל לכאן לפני כפול החלוקה, משום שזוגות לא יכולים לשמור אחר מקומות אחרי נקודה עשרונית. ואני הולך להוסיף שורה חדשה כאן לעיצוב טוב יותר. וכאן יש לנו את זה - 3.1416. ייתכן שתבחין שהוא מדפיס 3.1416 במקום 3.1415 כצפוי. זה בגלל שזה במהלך סיבובים תהליך החלוקה, בניגוד לרק מקצץ את הערך. עכשיו אתה צריך להיות מסוגל להדפיס סך סופי בצורה נכונה, שמסיים את את התכנית. מזל טוב. השם שלי הוא Zamyla. וזה היה פרוטות. [השמעת מוסיקה]