[השמעת מוסיקה] DAVID מלאן: שלום לכולם. זה supersection של CS50. סעיפים שהוקצו לא יהיו להתחיל עוד שבוע. וכך היום, אני כאן with-- מריה: מריה. DAVID מלאן: --יש למעשה תסתכל על בעיה להגדיר אחד, כמובן של שבועות הראשונים של חומר, להביא לך בכיוון עם IDE CS50, קצת של לינוקס, מערכת ההפעלה זה פועל על IDE, כמו גם תסתכל על כמה מהמעבר מאפס למוביל C עד הבעיה להגדיר אחד. אז בלי עיכובים נוספים, בבעיה להגדיר אחד, אתה הולך להיות הצגתי לCS50 IDE, ש הוא תכנות מבוסס אינטרנט זה סביבה שאנו משתמשים כדי לכתוב תוכניות. זה תוכנן כדי להיראות מאוד מזכיר מחשב טיפוסי מערכת פועלת הפעלה מערכת נקראת לינוקס. אבל זה בענן שנקרא, מה שאומר שכולם בכיתה למעשה יכול להיות שלו או שלה חשבון שלו ולהשתמש בו, גם כן. אז רובכם כנראה מעולם לא השתמשתי סביבת לינוקס לפני או אולי אפילו סביבת שורת הפקודה. וקו הפקודה הסביבה היא שונה. זה כל טקסטואלי. זה כל פקודות המקלדת. וזה לא הדברת עכברים, אין סמלים, אין חלונות דיאלוג, אין תפריטים. זה אך ורק טקסט. אז בהתחלה, זה סוג של מרגיש כמו צעד אחורה במונחים של תחכום. אבל זה בסופו להיות הרבה חזק יותר, בהחלט, למדען מחשב, סופו של דבר. אז בואו נסתכל. הנה אני בCS50.io, שדרכו אתה יכול להיכנס לIDE CS50. וממש כמו בגרד, יש שלושה תחומים עיקריים למסך הזה. אז בצד שמאל בצד היד, יש לנו מה יהיה דפדפן הקבצים. ויש תיקייה זו ב עליון, שהוא עכשיו ריק מאז שנפטרתי מכל שלי קבצים לפני supersection. וזה המקום אליו לשמור קבצי C שאנו כותבים. בפינה הימנית העליונה, יש לנו מקום שבו כל הקוד שלנו הולך לקבל בכתב. ואכן, אם אני לוחץ בתוספת זו, זה הוא הולך לתת לי לבחור קובץ חדש. וכאן אני יכול להתחיל לכתוב קוד C או, באמת, כל מספר של שפות אחרות. ואז בתחתית שבו אומר jharvard @ ide50-- ושלך יהיו לומר משהו קטן different-- מה זה נקרא? חלון מסוף. כֵּן. אז חלון המסוף הוא בשורת הפקודה שנקרא ממשק שדרכו אתה יכול לתקשר עם מערכת ההפעלה הבסיסית. ועכשיו, אנחנו הולכים לעשות שימוש מעט מאוד של זה-- רק כדי ללקט, להסתכל הודעות שגיאה שאנו רואים, ולהפעיל התוכניות שלנו. אבל סופו של דבר, אנחנו הולכים לעשות כל כך הרבה יותר, כמו גם. ואתה יכול גם להתקין את התוכנה ולנהל את סביבת העבודה שלך בתוך CS50 IDE, כמו גם. אבל עוד על כך בפעם אחרת. אז בואו נלך קדימה ולכתוב תכנית פשוטה מאוד פשוט לעבור חימום של hello.c, שהוא אולי התכנית הפשוטה אנו יכולים לכתוב. אני כבר פתחתי כרטיסייה חדשה. אני הולך קדימה ו אומר כולל io.h. הסטנדרטי אז int הראשי (void). ולאחר מכן printf ("שלום, עולם" n לוכסן, קרובה הצעה, סוגריים קרובים, ופסיק. בסדר. אז עכשיו שם לב לחלון שלי הוא ללא כותרת. אז אני הולך מהר מאוד לעלות לקובץ, שמור. וזה חשוב ש אני קורא לזה לא "שלום". אז טעות נפוצה מאוד, במיוחד בבעיה להגדיר אחד, הוא בטעות רק כדי להתקשר תכנית "מים" או או "מריו" "חמדנים" או "אשראי" או משהו דומה. אבל אתה באמת רוצה לעשות בטוח שיש לך את סיומת הקובץ כי זו הדרך היחידה ש מהדר וגם עורך הקוד יודע שאתה למעשה כתיבת קוד C. אז תן לי ללכת קדימה ולחצו על שמור. וגם עכשיו, מה CS50 IDE עשה לנו הוא שזה גם תחביר הדגיש את הכל. אז זה עשה הכל מאוד צבעוני. וכל המטרה של שאינו פונקציונלי. זה פשוט לצייר העיניים שלי ל חלקים שונים מבחינה קונספטואלית של תכנית זו. אז בואו נלך קדימה ולקמפל זה. ואני יכול לקמפל זה בכמה דרכים. ובשבוע אחד, האסכולה ישנה דרך שעשינו זה היה ממש ב "Hello.c הצלצול." Line-- הפקודה ואז אני מכה על Enter. ושום דבר לא נראה לקרות בחלון המסוף. אבל מה עשה שינוי בIDE? איפה, שוב, IDE רק אומר סביבת פיתוח משולבת. זוהי דרך מפוארת של אומר פיתוח משולב זה סביבה לפיתוח תוכנה. אז מה לשנות בממשק המשתמש? מה שמת לב זה שונה, מריה? מריה: שמתי לב למשהו תחת תיקיית IDE50 עד כאן. DAVID מלאן: כן. אז עד כאן, לא רק האם יש לנו "hello.c." יש לנו גם "a.out," אשר הוא סוג של שם מטומטם לתכנית. אבל אכן, זה שם ברירת המחדל ל תכנית כאשר אתה רק לקמפל הקוד שלך ואל תגיד לי מהדר מה קובץ פלט. אז אם אני רוצה להפעיל את זה, אני צריך להגיד compiler-- או לייתר דיוק, אני צריך לספר סביבת העבודה שאני רוצה להפעיל את התכנית בשם "a.out." לְהַכנִיס. ויש "שלום, העולם. "עכשיו" ./ ". חשוב בעצם. למרות שבדרך כלל אנו רק לכתוב את השמות של פקודות, כאשר מדוברים בתכנית שיש לך נכתב, אתה רוצה להגיד "./" משום שבמפורש אומר לינוקס שברצונך להפעיל תכנית בשם "A.out" זה בזה, שבו נקודה פירוש בספרייה זו שאני כרגע ב, אשר קורה להיות נקרא סביבת עבודה, "a.out. כי אם אני רק אמרתי "a.out," הזן, אני הולך לקבל "a.out הפקודה לא מצא "כי computer-- כי אני המצאתי "a.out;" זה לא בא עם computer-- לא יודע איפה לחפש אותו, למרות שזה נכון מתחת לאף שלי, אם אפשר לומר כך. אוקיי. אז אנחנו יכולים לשנות את זה ל להיות "צלצול -o שלום hello.c." ומה תכנית אם אני Enter, זה הולך פלט עבורי? מה השם של הקובץ? כן, בגב. זה נכון. "שלום." אז "שלום" הולך להיות שם התכנית כי אנחנו כבר בשימוש שנקרא קו טיעון הפקודה, שהוא רק דרך לשנות את ההתנהגות של למהדר למעשה פלט שם קובץ ספציפי. ואכן, אם אני זום החוצה ולחפש כאן, עכשיו יש לי לא רק "a.out" ו "Hello.c", אלא גם "שלום," גם כן. אז עכשיו אני יכול לעשות "./hello," Enter. ויש "שלום, עולם". אבל lastly-- וזה עכשיו יהיה הכנס אנו משתמשים בכל סמסטר, typically-- הוא שאתה גם יכול פשוט לומר "לעשות שלום". ואכן, זה אומר שזה עד עד היום, כי זה כבר קיים. תן לי ללכת קדימה ולהסיר, עם פקודת rm, שני "a.out" - ואומר "להסיר a.out קובץ רגיל?" זה רק אומר, אתה בטוח שאתה רוצה למחוק אותו? אני הולך להגיד כן. ואז אני הולך להסיר "שלום", אך לא "hello.c." אני הולך לומר "כן" מפורש, אבל "y" הוא מספיק, גם כן. ועכשיו שמו לב אם אני הקלד ls-- ש, כזכור, פירוש list-- זה מפרט את כל של הקבצים בתיקייה שלי. ואכן, אם אני זום החוצה ומסתכלים על פינה השמאלית עליונה, היא מאשרת כי מה בתיקייה זו, אפילו למרות שזה שכותרתו IDE50 כאן ולא סביבת עבודה, זה פשוט "hello.c." אז עכשיו כאן למטה, אם אני אין "לעשות שלום", הזן, עכשיו אני רואה את הפקודה הרבה יותר אבל הפקודה מתוחכמת יותר שקורה כדי להיות שימושי בשבועות קרובים. ועכשיו אני יכול לומר "./hello." אז בואו לקחת סיור מהיר כמה Linux אחר פקודות. אז למה שלא תיקח את צעד בחזרה ובעצם מסתכל C יותר בדרך כלל, מעבר מסריטות ל- C, ולאחר מכן להסיק במבט בבעיה הראשונה נקבע בג בסדר. אז אני הולך קדימה ורק נקי את סביבת העבודה שלי עם הבקרה-L רק כדי לשמור על המסך נקי. אבל שאין לו פונקציונלי להשפיע בדרך אחרת. נזכיר כי שראינו כמה פקודות עכשיו. אז ראינו צלצול, אשר בדרך כלל אתה לא יצטרך לבצע באופן ידני יותר. אנחנו במקום נשתמש איפור. אבל אנחנו גם ראינו LS, אשר מראה רשימה של הקבצים בספרייה שלי. ועכשיו למה היא יניהם-- יש שני קבצים עכשיו, "שלום" ו- "hello.c." מדוע יש כוכב או כוכבית אחרי "שלום"? מה זה מסמל, מבוסס על מה שראינו בשבוע אחד? מה אתה חושב? מה הכוכב אין משמעות? מריה: For-- התכנית "שלום"? DAVID מלאן: "הלו *". כֵּן. או כן? אה, הפעלה. זה נכון. אז זה אומר ש "שלום" הוא הפעלה. אז אכן, זה למה אני יכול לעשות "./hello." בסדר. אז מה עוד אני יכול לעשות כאן? ובכן, מתברר שאני יכול גם ליצור ספריות. אז תן לי להמשיך וליצור, למשל, ספרייה "pset1". ומפרט הבעיה להגדיר יהיה לך לעשות בדיוק את זה, אז אתה לא צריך לזכור היום. אבל נראה "pset1 mkdir" שאין לו השפעה. אבל שוב, אין הודעת שגיאה הוא בדרך כלל דבר טוב. אז אם אני מקליד "ls" now-- אה, עכשיו יש לי קובץ הפעלה בשם "שלום," קובץ C שנקרא "hello.c." ואז הקו הנטוי, כך ל לדבר, אומר כי מדובר בספרייה. אז אכן, עכשיו אני רוצה לפתוח אותו. ואני לא ללחוץ פעמים על זה כמו בGUI, סביבה גרפית. אני במקום לומר "pset1 CD." לְהַכנִיס. שום דבר לא נראה מעניין יש לי קרה מלבד הפקודה הקטנה שלי כאן-- זו הדרך של לינוקס להזכיר לי איפה אני, אז מה תיקייה פתוחה. זה פשוט אומר לי באופן מפורש בניגוד לצורה גרפית. ואם אני מקליד "ls," למה שאני רואה עוד תבקש מייד, אתה חושב, כשהרשימה של תוכן pset1? מריה: אתה כנראה לא לשם כלום. DAVID מלאן: כן. אז יש לנו לא ברור נוצר משהו שם כי אני פשוט יצרתי את הספרייה. עכשיו, אם אני רוצה ליצור file-- ל למשל, אני יכול ליצור קובץ חדש. ואז אני יכול ללכת ל לשמור ולשמור אותו כ, כמו, "mario.c" אם אתה עושה המהדורה סטנדרטית של pset אחד. ואז, כמו בכל מק או PC, רק לבחור pset1 התיקייה ", שמור. ועכשיו את הקובץ ריק. אבל בואו להתקרב שוב לרגע. בואו לעשות LS כאן. עכשיו אנחנו רואים "mario.c". אז יש כמה פקודות אחרות ש שווים לזכור מעל time-- ברור, או בקרה-L הוא מה יש לי היה להכות; mkdir שראינו; rm שראינו, כמו גם, שהוא להסרה או למחיקת קובץ. היזהר אתה יכול גם-- ואם אתה מסתכל בהדרכות מקוונות, אתה rm -rf היא דרך נפוצה מאוד לומר למחוק תיקייה שיש דברים בזה. רק להיות סופר, סופר זהיר. -rf אומר באופן רקורסיבי למחוק מה שזה לא אתה מנסה למחוק וכוח למחוק אותו. אז רקורסיבית אמצעי אם זה תיקייה עם תיקייה עם תיקייה עם תיקייה, למחוק את כולם. וכוח פירושו לעשות אפילו לא שואל אותי כן או לא, אני בטוח? אז זה דרך של סופר מסוכן מחיקה המון דברים במהירות. אבל גם beware-- לעתים קרובות עושה חת סטודנט בטעות למחוק, למשל, pset אחד, למשל. מריה: ואם הם רק לעשות -r, הם הולכים לשאול אותם על כל קובץ. DAVID מלאן: איזו הוא מעצבן בינוני. מריה: כן. DAVID מלאן: אז זאת הסיבה רבים מאיתנו, עצמי כלול, אני נוהג להשתמש ב-rf. אבל זה מסוכן. אז היזהר קונה. ולאחר מכן MV הוא סוג של שם מעניין. אז זה פקודת המהלך, שמרגיש קצת מוזר כי אתה אכן יכול להשתמש בו כדי להעביר קבצים ממקום אחד למשנהו. לדוגמה, נניח שאני פישלתי. נניח שאני יצרתי קובץ חדש לpset. ואני הצלתי אותו בתור "greedy.c." אבל נניח שאני בטעות לשמור אותו בIDE50-- כך בסביבת העבודה שלי עצמו ולא בpset1. אתה יכול לראות כמה שיותר בפינה השמאלית עליונה. יש "greedy.c." ויש כמה פתרונות. אז אחד, אני יכול להשתמש ב דרך ידידותית למשתמש סופר רק גרירה ושחרורו. וזה בעצם היית לתקן את הבעיה. אבל היום, אנחנו מנסים להסתכל על דרכים יותר מסתוריות אך רבות עוצמה לעשות את זה. אז תן לי לקחת "ls" בpset1. ואני רואה רק "mario.c." תן לי ללכת קדימה ולעשות "cd ..". אז שוב CD הוא שינוי ספרייה. ".." אומר מה, אף? בפעם האחרונה שאמרתי cd " pset1 "להיכנס לpset1. לכן, כאשר אני אומר "cd ..", מה אני עושה? אֲחוֹרָה. כֵּן. אז זה הולך להורה שנקרא. עבור רמה אחת למעלה, כמו יציאה מתיקייה. אז Enter. ואכן, תראה מה הוא עשה. זה רגש אותי רק לסביבת עבודה במקום של לpset1, שהוא בסביבת עבודה. ועכשיו, אם אני מקליד "ls", יש חבורה של דברים כולה. שם הוא "greedy.c". אז עכשיו תן לי להשתמש MV לפשוטו כמשמעו לעבור "greedy.c" לpset1. וכל כך הרבה פקודות לינוקס עובד בדיוק כמו זה. הם לוקחים שום טענות או שהם לוקחים אחד טיעון או שהם לוקחים קו שתי פקודה טיעונים וכן הלאה. ובמקרה הזה, זה פשוטו כמשמעו לעשות את מה ש זה אומר, אם כי succinctly-- להעביר greedy.c לpset1. לְהַכנִיס. שום דבר לא נראה לקרות. אבל אם אני עושה ls שוב, חמדן הוא נעלם. ואם אני עושה "pset1 CD", הזן, ולאחר מכן LS שוב, עכשיו זה במקום הנכון. במאמר מוסגר, אם ל כמה reason-- במיוחד אם יש לך לסירוגין קישוריות לרשת או שאתה מסתובב קמפוס עם מכסה המחשב הנייד שלך סגור ולאחר מכן לפתוח אותו שוב וסביבת העבודה שלך נראה מעט לא מסונכרן, לא ביג דיל. רק לטעון מחדש את הדפדפן שלך חלון, ושהוא צריך resync כך ששמאלי דפדפן קובץ נראה בדיוק כמו חלון המסוף. לא לדאוג. במקרה של ספק, לטעון מחדש את הדף, כל כך כל עוד אתה כבר שמרת את הקבצים. אוקיי. אז MV יכול לשמש גם כדי לשנות שמות קבצים. ובואו נסתכל הפקודה סופית זה כאן. אז suppose-- וזה סופר נפוץ, גם בשלב מוקדם. חלק מהתלמידים מדי פעם ליצור קובץ בשם, בואו say-- מה עוד אחד? כמו "WATER.C." אז אני רק לצעוק, ל אין סיבה, בכל כמוסות. אבל זה לא שם נכון עבור הקובץ לו רק משום הבעיה שלנו להגדיר מפרט לא ספר לך כדי לשמור את הקובץ ככל הכובעים "WATER.C." במקום זאת, אנו מצפים "Water.c" באותיות קטנות. ואכן, זה הוא בעייתי כי check50, תכנית שאתה הולך כדי לענות על בעיה ב להגדיר אחד באופן אוטומטי בדיקות את נכונות הקוד שלך הוא הולך לצעוק עליך אם זה לא יכול למצוא "water.c" בכל האותיות הקטנות. אז אני צריך לתקן את זה. כך הרבה דרכים שונות ל לעשות את זה, הראשון שבם יהיה קש Control או לחץ לחיצה ימנית את שם הקובץ ופשוט לשנות שם. לגמרי בסדר לעשות את זה. אבל שוב, היום, בואו לעשות את זה קצת יותר מסובך. בואו להשתמש MV לשנות "WATER.C" ל "water.c." אז אתה יכול גם להשתמש בטיעון הראשון כדי לשנות את שמו לטענה השנייה אם הטענה השנייה היא לא, ב למעשה, תיקייה או שם ספרייה. בסדר. ולבסוף, קצת trick-- אז אני ב ספריית סביבת העבודה שלי באותו הרגע. אם אני רוצה להיכנס לpset אחד, אני בהחלט יכול להקליד "pset1 CD." אבל זה כל כך משעמם להקליד "pset1" או עוד שמות קבצים או שמות ספרייה עוֹד. אז לעתים קרובות מאוד בלינוקס, מה ש אתה יכול לעשות הוא להתחיל להקליד "PSE" ורק משתעמם, פגע Tab, ולתת לי דמות המחשב זה בשבילך. סופר מועיל להיכנס להרגל ש. המלכוד היחיד הוא אם יש לך מספר קבצים או תיקיות מתחילים באות "P" או "נ.ב.," אולי יש לך להקליד עוד כמה לפני מחשב לא יודע מה לעשות. מריה: אנחנו אוהבים קיצורי דרך. DAVID מלאן: רצון זה אחסוך לכם כל כך הרבה זמן. וגם, כפי שאמרנו בהרצאה, ש ניתן לגלול מעלה בהיסטוריה, למעלה ולמטה, למצוא להורג לאחרונה פקודות, גם כן. בסדר. אז עכשיו, בואו נפנה את תשומת הלב שלנו בחזרה לתכנית פשוטה, שלום עולם. אז צרפנו בדיוק זה. ועכשיו למה שלא ניקח תסתכל על סוגי נתונים ולאחר מכן לעבור מחלק מתאים לוקי Scratch לג מריה: מדהימה. אז עכשיו שאתה כבר החל בכתיבת תוכניות ב- C, אנחנו הולכים להתחיל לדבר על סוגי הנתונים ומשתנים. אז כמה סוגי נתונים ש היה רוצה לדעת מתחילה עכשיו הם אלה ש מודגש בכחול. אז יש לנו int הראשון, אשר מייצג מספר שלם. ושמחזיק מספרים שלמים, כמו שאתה אולי יש לי guessed-- כך 1, 2, 3, וכל מספרים שלמים אחרים שאתה יכול לחשוב על. DAVID מלאן: וגם שלילי. מריה: וגם שלילי, כן. ו0. אז יש לנו צף, ש הם מספרי נקודה צפו. אז זה כל מספרים האמיתיים שיש לי נקודות עשרוניות. אז 5.0, 5.2, ואפילו יותר ספרות אחרי הנקודה העשרונית, כמו גם, וגם שלילי. אז יש לנו char שהוא דמות. אז אני חושב שדברנו על בהרצאה היום זה. אבל יש לנו מכתבים, לexample--, B, C-- שניתן לאחסן כchar. אבל אז יש לנו הרבה יותר סימנים ניתן לאחסן כchar. ואלה מאוחסנים כASCII. ואז יש לנו בול, אשר Booleans. ואלה להעריך לנכון או כוזב או 1 ו -0, בהתאמה. DAVID מלאן: ולהיזכר ש בול מגיע מספריית CS50. אז זה לא בנוי ל C, אבל זה סופר שימושי יש את הרעיון של אמת ושקר. ולמרות שאתה אולי חושב-- עובדה כיף. בול מבחינה טכנית צריך כמה חתיכות, באמת, לייצג נכון מול שקר? כמה חתיכות אתה חושב ש היית צריך, באופן מקסימאלי? כן, רק אחד. אז מתברר שC לא יכול לתת לך רק אחד קצת. היחידה הקטנה ביותר של מדד אתה יכול לקבל הוא שמונה. אז זה קצת בזבזני הם אתה באמצעות בתים שלמים, או שמונה סיביות, לייצג אמת או שקר. אבל זה בדיוק כמו שזה מיושם ב- C בספריית CS50. מריה: ואז אלה שאנחנו לא הולך לדבר על כהרחבה נכון now-- כפול, זה לצף גדול יותר. ארוך ארוך וקצר גם למספרים שלמים. DAVID מלאן: אכן. במהדורה של האקר pset אחד, אנחנו בעצם להשתמש ארוכים ארוכים. אבל למהדורה סטנדרטית, זה לא אמור להיות נחוץ. מריה: מגניב. אוקיי. אז operators-- אתה צריך להיות כנראה מכיר את רוב אלה. בנוסף, +; חִסוּר, -. לכפל, יש לנו *. אז לא X שאנחנו בדרך כלל להשתמש. חטיבה, יש לנו הקו הנטוי. ומודולו הוא המפעיל האחרון שלנו ש אנחנו הולכים לדבר על עכשיו. זה מפעיל המאפשר לנו לקחת את שארית החלוקה. אז אם יש לנו 4% 2, 4 מחולקים על ידי 2 הוא 2 עם שארית 0. אז 4% 2 הוא 0. 4% 3 הוא 1. 4% 5 הוא 4, כפי שאתה יכול לנחש. ולזכור בעת שימוש כל אלה מפעילים להשתמש כללי PEMDAS. DAVID מלאן: אז צריך להיות ברור, אם אתה לעשות 4% 2, למה זה 0, בדיוק? מריה: כי 4 מחולק ב 2 הוא 2 עם שארית 0. אז מודולו נותן לנו שארית שכ בניגוד לתוצאה של החלוקה. DAVID מלאן: ואכן, מה שאנחנו תמצאו את זה מועיל להוא כי בכמה בעיות זה לא בהכרח אחד, אם אתה רוצה להיות השפעה של הגבלה עצמך לטווח של מספרים כמו 0 במשהו, אתה יכול להשתמש במודולו כדי לעטוף מוקדם יותר כמו 2 מיליארדים או את הערך 4 מליארד ש שדיברנו על בהרצאה. מריה: כן. ואפילו ב" חמדנים "אנחנו עשויים. DAVID מלאן: כן, ב כמו גם בעיה להגדיר אחד,. מריה: כן, נחמד. DAVID מלאן: רמז טוב. מריה: מצטער. בוליאנית expressions-- כך למפעילים בוליאנית, אנחנו הולכים לדבר על כל של אלה שאתם רואים כאן. אז עכשיו, יש לנו שני סימנים שווים רשומים לשווים. אז אלה הם להשוואה. עד כה, ראינו רק אחד שווה סימן. זה היה רגע שאנו מקצים ערך למשתנה. אז אם ראינו int n = 5, ולאחר מכן אנחנו כבר הוקצו 5 לn משתנה. אבל אם אנחנו רוצים להשתמש == ל לשם השוואה, אנחנו יכולים לבדוק אם == n 5. ואם == n 5, אז זה נכון. מפעילים אז בוליאנית מאפשר לנו, בעצם, כדי להעריך בוליאנית ביטויים לאמת או שקר. אז לא equals-- יש לנו סימן קריאה ושווים. אז גם אנחנו יכולים לבדוק אם n לא שווה 5-- כך n! = 5. פחות מ, פחות או שווה ל, גדול מ, גדול או שווה ל, ואז יש לנו הגיוני ולוגי או. ואלה מאפשרים לנו להעריך ביטויים בוליאנית מרובים יחד בעצם לבוא יחד כ ביטוי אחד שלם בוליאנית. אז אם אנחנו רוצים למצוא מספר, אומר, שהוא גדול מ -5 אבל פחות מ -15 באותו הזמן, היינו להשתמש ב הגיוני ומפעיל כדי לראות אם n הוא יותר מ -5 && n פחות מ -15. DAVID מלאן: והנה, מדי, זה ממש קל בשלב מוקדם בטעות להשתמש רק אמפרסנד יחיד או אנכי יחידה. ואני מקווה שמהדר צועק עליך בגלל שהם באמת יש משמעות שונה מאוד. לאלה סקרנים, הם ששמש לפעילות סיבית האופרטור, פועל על ביטים בודדים. אבל אתה רוצה זוגם כאן. וסופר חשוב הוא ש ראשון, סימן השוויון, שהינה מפעילת השוויון כ בניגוד למפעיל המשימה. מריה: והאנכי הוא ממוקם בין מחק וחזור. DAVID מלאן: כן. על מקלדת אמריקנית טיפוסית. מריה: כן. אז בואו נקפוץ ישר ל הצהרות מותנות. בגרד, יש לך ראה כבר, כנראה, אם דוחות שיאפשר לך לבדוק אם משהו הוא אמיתי, אז לעשות משהו אחר. אז ייתכן שרצית כדי לבדוק אם ספרייט שלך הוא לגעת כמה ספרייט אחר או הגבול של המסך. ואז אתה אולי רוצה בסופו של המשחק או לעשות משהו אחר. אז התחביר של הוא "אם (מצב)." אז אם ספרייט נוגע במשהו, אז אל הוא בתוך הסוגריים המסולסלים. אז יש לנו הצהרות אם-אחר. אחר מאפשר לנו לעשות משהו אם המצב ש לבדוק בהתחלה הוא לא נכון. אז אם ספרייט נוגע ב גבול לעשות את זה, אחר לעשות משהו אחר. אז אחרת לעשות משהו אחר. אז יש לנו דוגמא קצרה לזה. אז אם (military_time <12), ש רוצה printf "בוקר טוב!" אחר אנחנו הולכים printf "ערב טוב!" דוגמא בסיסית. DAVID מלאן: טוב. מריה: מגניב. אז עכשיו יש לנו הצהרות מתג. לעבור הצהרות בפח כללי מאפשר לנו לעשות הרבה את אותו הדבר שאנחנו פשוט דיברנו על עם אם הצהרות. לדוגמא, עכשיו יש לנו את צורה כללית של הצהרת המתג שמאפשר לנו לקחת n משתנה בשם ולהשוות אותו להרבה ערכים שונים, שאנחנו כאן קרא constant1, constant2. ייתכן שיש לנו הרבה יותר. ואלה נקראים מקרים. אז אם יש לנו מתג statement-- וזה עובד רק לintegers-- יש לנו משתנה במקרה זה זה n. אם n משתנה הוא שווה לconstant1, אנחנו יבצע כמה קטע קוד או משהו שאנחנו רוצים לעשות. ואז היינו לשבור. אז ההפסקה אומרת ש הצהרת המתג יפסיק ביצוע אם n שווה לconstant1, ואז התכנית שלך תמשיך. זה יהיה לצאת מ לעבור הצהרה וזה ימצא תמשיך לעשות משהו אחר. אם, לעומת זאת, n לא שווה constant1, אז מקרה לconstant2 ייבדק. אז אם n שווה constant2, שאחר קטע קוד יבוצע. ואז זה ישבור אם זה שווה לה. ואז יכול להיות לנו גם-- לא בהכרח, though-- מקרה ברירת מחדל, שיקרה אם n לא שווה כל אחד מהמקרים שיש לך ברשימה. ובמקרה ברירת המחדל, אנחנו גם לא צריך הפסקה בהכרח כי הצהרת המתג תדע שזה צריך להסתיים אחרי ברירת המחדל מקרה אם זה המקרה. DAVID מלאן: אבל סגנונית, אנחנו תמיד לשים אותו שם. מריה: כן. DAVID מלאן: כן. אז במיוחד כאשר החל לצאת, במיוחד אם בין אלה פחות נוח, אני באופן אישי היית רק ממליץ להישאר עם IFS וIFS-elses ואם-אחר-אם-elses וכן הלאה, אם רק בגלל שהם קטנים יותר פשוט. זהו אופטימיזציה נחמדה, או לפעמים אפילו מבחינה אסתטית זה הופך את הקוד לקריא יותר. ואכן, כנראה אמצע סמסטר-אנחנו רואים בעיה נקבע בו זה פשוט נראה טוב יותר וקל יותר לקריאה לבני האדם באמצעות הצהרה בורר. אבל אל תדאגו נצמד לזה מוקדם מדי. מריה: כן. אם יש לך הרבה אם הצהרות, זה יכול להיות פשוט לא קריא מאוד. זה לא יכול להיות מהיר מאוד כדי שתוכל לעבור את זה. אז לעבור הצהרות יכולות להיות מאוד שימושי, כמו גם. וגם, לא עושה remember-- לא תשכח לשים הפסקות לשם. DAVID מלאן: לא זוכר את זה. מריה: כי אז אתה עלול ליפול דרך ממקרה אחד למשנהו. אז בואו נגיד שמקרה constant1 לא היה לי הצהרת הפסקה בזה. ואז אנחנו עלולים ליפול דרך מקרה constant2 בפנים. ואנחנו לא רוצים לעשות את זה אם אנחנו כבר הגענו מקרה constant1 וזה שווה לn. כך, למשל, אם יש לנו משתנים n המכיל מספר כיתה, ואנחנו רוצים לראות מה ש כיתה הוא-- אם n שווה 50, אנחנו הולכים להדפיס "CS50 הוא מבוא למדעי המחשב א " אז אנחנו הולכים לשבור. וזה הכל. אם, לעומת זאת, n הוא שווה 51, אנחנו הולכים להדפיס "CS51 הוא מבוא למדעי המחשב השני. " ואז, שוב, אנחנו הולכים לשבור. עם זאת, אם אז אנחנו שמים 124, 61, כל מספר אחר שאולי אתה חושב על, או תכנית לא הולכת להכיר בכך ש. אז זה הולך לומר, "סליחה, אני לא מכיר את המעמד הזה ". וזה הולך לשבור. DAVID מלאן: אז אתה באמת יכול לראות אם, אחר אם, רעיון אחר כאן. זה תחביר שונה רק ל להביע בדיוק את אותו הרעיון. מריה: בדיוק. עכשיו יש לנו המפעילים המשולש שלנו. יש מפעילים אז משולש שלוש parts-- מצב, משהו לעשות אם מצב זה נכון, ואז משהו לעשות אם מצב זה שקר. אז אתה רואה, בעצם, התחביר של זה כאן. יש לנו סימן השאלה, ו אז כל-- מה אנחנו קוראים לזה? DAVID מלאן: המעי הגס. מריה: קולון. תודה. מצטער. אז בואו נסתכל על הדוגמא שלנו ל לראות אם אנחנו יכולים להבין את זה-- == Class_num 50. אז הנה אנו רואים מפעיל וליאנית == שמשווה את class_num משתנה 50. חנויות אז class_num שלם. ואם מספר שלם ש שווה 50, אז אנחנו הולך לחנות "דוד מלאן" בתוך פרופסור המחרוזת. אם מספר הכיתה לא שווה 50, "לא דוד מלאן" הולך להיות הפרופסור. DAVID מלאן: תודה לך. וכך זה נראה שווה ערך ל מה, היית אומר, במבט ראשון? מריה: לי זה נראה כמו אם-אחר הצהרות. DAVID מלאן: כן. ולמעשה, זה סוג של אניה אחת יפה, כביכול, ליישום ההיגיון בדיוק של אם-אחר אבל עושה הכל בצעד אחד. מריה: בדיוק. כֵּן. הצהרות אז אם-אחרת אולי תופס הרבה מקום. הם יכולים להיות יותר מדי זמן ל משהו פשוט כמו זה. אז זה יכול להיות מאוד תמציתי ונחמד מאוד. אז עכשיו אנחנו הולכים למסתכלים על ביצוע משהו שוב ושוב, כך בודק להתנות מספר פעמים ולאחר מכן ממשיך לעשות משהו בעוד מצב זה נכון. אז זה מביא אותנו יפה לתוך לולאות זמן. משמאל, יש לנו תוך הלולאה הראשונה שלנו. אז בזמן שמשהו הוא אמיתי, לעשות משהו שוב ושוב. כדי לוודא לב ש מצב כאן הוא תוקף בחלק העליון. ואילו עם loop-- השני שלנו אנחנו קוראים שעשה תוך loop-- אנחנו עושים משהו, אז אנחנו בודקים למצב. ואם מצב ש ממשיך להיות אמיתי, אנחנו חוזרים ועושים את הדבר שוב. אז ההבדל העיקרי הוא שבו המצב מסומן ל. והקוד לא יכול להיות יבוצע אם המצב הוא לא אמיתי עם הלולאה בזמן. ואילו עם מטלות-בזמן לולאה, יש לנו את הקוד שתמיד מבוצע לפחות פעם אחת. ואז בזמן שהמצב ממשיך להיות אמיתי, אנחנו יכולים לחזור ולחזר שוב פנימה. אז למה אתה חושב שאנחנו היו להשתמש עשה תוך לולאה על לולאה בזמן? יָמִינָה. אז אם אנחנו רוצים להנחות משתמש עבור סוג מסוים של קלט, אם אנחנו רוצים לשאול אותם כדי להזין את שמם, אנחנו רוצים לפחות לשאול אותם פעם אחת. ואם הם נכנסים השם הזה, אנחנו לא הולך לשאול אותם שוב כי אנחנו כבר יודעים את זה. אבל אם הם לא נכנסים שמם, או אם הם להיכנס משהו ש ברור שלא שם, אנחנו עדיין רוצים להמשיך שואל עליהם לשם שלהם. DAVID מלאן: ובהרצאה שהיו לנו אחד כמו זה עם int החיובי מקבל דוגמא, שבו אין שום דבר ל לבדוק בהתחלה, כי יש לך אפילו לא קיבל int. אז אנחנו רוצים לעשות זה-- לקבל int מuser-- אז לבדוק את זה, אולי, שוב ושוב ושוב. מריה: בדיוק. לאישור loops--. ללולאות יכולות לאפשר לנו לעשות כמעט בדיוק את אותו הדבר, כמו גם. זה בעצם בדיוק את אותו הדבר. אז אין שום דבר ש אתה יכול לעשות עם לולאות כי אתה לא יהיה מסוגל לעשות עם לולאות בזמן. אבל ללולאות אולי נראה קצת קצת יותר מסובך מבחינה תחבירית כי יש להם שלושה חלקים בתוך מה היה לפני רק מצב עם לולאות בזמן. אז החלק הראשון שאתה ים, השמאל ביותר, יש לנו "int גמדים = 0." אז זה מקום שבו אנחנו לאתחל משתנה. אז יש לנו נקודה-פסיק ו" גמדים <7. " אז זה מקום שבו החוצה מצב הוא למעשה. אז זה מה שהיה לנו לשים רק בזמן שloop-- "בעוד גמדים <7." כאן, שהולך ב אמצע שלנו ללולאה. אז "dwaves <7." ואז החלק האחרון שלנו הוא "גמדים ++," המקום שבו אנו מעדכנים משתנים. אז הדבר החשוב להבין הוא שזה הוא הולך לעבור את זה ללולאה שבע פעמים ולבצע שבע פעמים. אז יש לנו שבע גמדים, והם כולם הולך להגיד, "אני כאן כדי לעזור לך, שלגיה " כי הם מוכנים כדי לעזור שלגים. עם אילו לולאות, היינו עושים האתחול והעדכון לא בתוך המצב, שוב, אבל לפני או בתוך בעוד הלולאה לוודא כי we-- כי אנחנו תמיד צריכים חלקים אלה. אז לוודא שיש לנו שלהם, היינו לי עדיין הוספתי אותם ב, פשוט לא בתוך הסוגריים. DAVID מלאן: וכך זה נראה like-- בהרצאה, למשל, אני תמיד כמעט להשתמש, כמו, אני ו n ומשתנים די משעממים. זה נראה כמו שאתה יכול להשתמש יותר בשם בחוכמה משתנים, מדי. מריה: כן, זה באמת מאוד נחמד להשתמש משתני תיאורים קצת יותר כי במיוחד אם מישהו אחר הוא קריאת code-- אולי אתה תלמיד כיתה או אם אתה משתף פעולה עם somebody-- אתה רוצה לוודא שהם להבין מה אתה עושה. אוקיי. אז זה משהו שמאוד funky-- ללולאה בתוך לולאה for. אני לא יודע אם ראינו את זה בעבר. כנראה שלא. אבל אנחנו באמת יכולים להיות זה-- כך לולאות במקום לולאות. אז האם מישהו רוצה אולי ללכת שלי דרך מה שקורה כאן? DAVID מלאן: אני אקח את דקירה. מריה: מגניב. DAVID מלאן: אישור. אז, spoiler-- אנחנו רוצים להדפיס את הדברים זה בפינה הימנית התחתונה שם. מריה: נכון. כן כן. DAVID מלאן: אז יש לנו רק לשים את זה פלט מדגם שם. אז אני יכול להסיק מ לולאה העליונה שאתה iterating מעל השורות לולאה חיצונית, כביכול. ואתה iterating על עמודות עם הלולאה הפנימית ביותר. ובאופן אינטואיטיבי, זה צריך לקוות הגיוני כי מטבע של כל תכנית שראינו לפני, printf, המהווה את פונקציה אנו משתמשים, סופו של דבר, יש את היכולת להדפיס דברים את בעצם שורה אחרת שורה. כמו, לאחר שתשודר קו חדש, שיש אין הכפלה בחזרה והדפסת משהו גבוה יותר במסך, לפחות לא באמצעות printf כמו זה. וכך בעניין זה, זה גורם לי תחושה שהלולאה החיצונית יש המתייחס לשורות כי לכל אחד ניתנה שורה, אתה הולך רוצה להדפיס את XXXXX, ולאחר מכן לעבור לשורה הבאה, XXXXX. אז השורות ראשונות. ואז בתוך כל שורה, אתה מדפיס עמודות. אם ניסית לעשות את זה ההפך, זה כנראה לא יצאתי כמו שאתה מתכוון. מריה: כן. אנחנו פשוט לא יכולים לחזור ל השורה הקודמת עם printf. DAVID מלאן: ומה שמעניין לשל היום צ'אט על היקף, למעשה, הוא שהשורה היא int זה הכריז בלולאה העליונה. אבל שם לב שזה עדיין בתוך, כביכול, הסוגריים המסולסלים ש מייד אחריו, למרות שזה לא מבחינה טכנית בתוך סוגריים המסולסלים אלה. אז שורה היא בהיקף של שלמות של קטע קוד, שני בתוך חיצוני ללולאה ובתוך לולאה הפנימית ל. אבל לעומת זאת, שבו הוא טור בהיקף? הטור משתנה? כן, רק בלולאה בתוך. וזה בסדר כי אנחנו לא לגשת זה מחוץ לסוגריים המסולסלים שלה. כל מה שאנחנו עושים זה להדפיס חדש קו בסוף מאוד שם. כך שלמעשה הוא על אישור. אז זה יש ההשפעה, זה נראה כמו, לעשות שלוש שורות וארבעה עמודים. מריה: נכון. אז קודם כל אנחנו עוברים השורה הראשונה שלנו. ורק בשורה הראשונה שלנו, שאנחנו עושים ארבעה עמודים בתוך השורה הראשונה. אז אנחנו להדפיס את ארבעה X של. ואז אנחנו יכולים לצאת ללולאה, מאז כבר יש לנו הדפסנו ארבעה X של. ואנחנו להדפיס קו חדש. ואז אנחנו עוברים אותו תהליך לשתי שורות נוספות כדי להפוך את הסכום כולל של שלוש. DAVID מלאן: וזה ראוי לציין שזה רק חפץ של הגופן, העובדה שהפלט המדגם נראה כל כך הרבה יותר גבוה, כאילו יש עוד שורות מעמודות. אבל זה רק בגלל שX הוא גבוה יותר מזה הוא רחב. זה כל מה שקורה שם, בתוספת הרווח הלבן בין השורות. מריה: נכון. מגניב. DAVID מלאן: בסדר. אז מבט מהיר על הבעיה להגדיר אחד, לקחת את כל שאלות, ואז לדחות? בסדר. אז בבעיה להגדיר אחד, יש שלושה אתגרים עיקריים, בסופו. אבל קודם, אתה תמצא שנקבעה הבעיה מפרט, כמו רבים psets הסתיו, הוא הולך ללוות אותך באמצעות כמה תרגילי חימום, להצביע לך כמה משאבים שאתה יכול או לא ראה כבר. לדוגמא, CS50 יש חבילה של מכנסיים קצרים, שהם קטעי וידאו קצרים, שלא כמו זה, אבל ש הם specific-- מאוד נושא אולי חמש דקות, 10 דקות באורך בלולאות או בתנאים או באלגוריתמים או במאוחר על יותר נושאים מתקדמים, כמו גם. ואנחנו בדרך כלל להטביע אלה לבעיה סטים כך שתלמידים יש משאב שבי לעיין בחומר שאולי יש לי כבר לבוא בהרצאה או בסעיף. אבל זה דרך זה יותר ממוקד ועוד בקצות אצבעותיהם. אנחנו גם נוטים להטביע בבעיה קובע דברים בשם ערוצים. אז כל דוגמאות שאני עושה כמעט בהרצאה, על במה כאן, אנחנו גם ירה על מצלמה ב לקדם יותר איטי, הדרכה אינטימית יותר על ידי ב המחשב הנייד שלי מקוד ש, שורה האחרת השורה כך שבכיתה, לעתים קרובות אנו תמצאו לרחף באמצעות משהו או מישהו יהיה להתערב ב תשובה לשאלה. אבל זה לא בהכרח לשקוע לכולם בקהל. אז אתה תמצא ערוצים קוד עבור רוב דוגמאות שאנחנו עושים כאן בהרצאה, כך שאתה יכול לעבור את זה בקצב שלך ואחורה או קדימה או מהיר לדלג לגמרי, אם תרצה. יש לעתים קרובות כמה שאלות חימום ש שואל אותך כדי למיין של לחזק את החומר הזה ולוודא שאתה נוח לפני שתמשיך עם שאר pset. ואז, כמובן, יש pset עצמו. ואחד הדברים אנחנו מאוד במכוון לעשות בCS50 הוא כמעט בכל לא מעניין או אינטלקטואלי מעניין צעד מכאני ש אולי יש לך לעשות מתועד כמעט תמיד טוב מאוד. במהלך הטווח, אנחנו תתחיל לשאול שאלות רטוריות יותר כמו זוכר איך לעשות את זה או את זה? אבל בדרך כלל, אתה תמצא שסטי הבעיה להביא לך באמצעות המכניקה של משהו כל כך ש האתגרים המעניינים, אינטלקטואליים הם סופו של דבר עזב לך התלמיד. עם זאת אמרה, Zamyla, למי ש כל הזמן מתייחס היום בהרצאה, הוא אחד מצוות הוותיק שלנו חבר שמחזיק גם בערוצים על בעיות ספציפיות כמו מריו pset וחמדן, אם כי לא להשקות השנה. וזה באותם ערוצים שהיא לעתים קרובות מציע כמה טיפים וטריקים ל איך להמשיך, לא אומר לך בדיוק מה לעשות, אבל rather-- כמו מצב, אם אתה will-- נותן לך לפחות כמה רעיונות כדי שזה תלוי בך, סופו של דבר, כדי להחליט איך להתקרב אליהם. מריה: כמו סוג של ברמה גבוהה הבנה של ההיגיון של מה ש אנו מבקשים ממך לעשות. DAVID מלאן: בדיוק. ואכן, Zamyla של ערוצים נועדו לענות לעתים קרובות שאלה שנשאלת היכן לעשות התחלתי, במיוחד כאשר מפרטים הארוכים אלה קצת מרתיע נתן את כל הטקסט ודימויים שיש להם באותם. אז water.c, אתה תמצא לאחר שסיימת אותה, הוא למעשה פשוט יחסית. בהחלט הן חבורה שלך הולך לדפוק הראשים בקיר מנסים כדי להבין למה זה לא קומפילציה או למה זה לא פועל כראוי. אבל ברגע שתסיים עם זה ופעם אחת יש לך בילה קצת זמן נאבק בכל של באגים שאולי יש לך, אתה תמצא שזה תכנית קצרה מאוד. זה יכול להיעשות בכמה פשוט שורות קוד, שרובם שראינו כאן בהרצאה כבר, אם אתה להרכיב את אבני הבניין הנכון. וכפי שאנו מציעים כאן, זה הולך לשאול לך לציין כמה דקות מישהו מתקלח בקמפוס. אנו מציינים בבעיה להגדיר את קצב זרימה של מים ב, כמו, זרימה נמוכה מקלחת ראש, כמו קליפ סיינפלד ראינו אתמול או ההפך ממנו. ואז אתה פשוט צריך לעשות קצת מתמטיקה, אמת-- חשבון באמצעות C לספר שלנו כמה, בערך, בקבוקי מים שווה שלאם אנחנו לוקח מקלחת n-דקות. עכשיו, בmario.c, זה הולך להיות תכנית מעט יותר. זה עדיין לא הולך להיות כל כך הרבה זמן. רק כמה שורות יותר מwater.c. אבל זה הולך להיות הזדמנות כדי לשחזר את בית הספר הישן מריו פירמידה מסופר מריו אחים או מעקב על. זה לא הולך להסתכל כיפה או צבעוני כמו שיש אחד. אנחנו רק הולכים להשתמש hashtags הקטן כמו שיש לנו כאן על המסך באמצעות טקסט ASCII. אבל זה יהיה קרוב את אותו הרעיון. וזה הולך להיות לממש שבמבט הראשון נראה די פשוט פשוט-- להדפיס פירמידה פשוטה. אבל יש כמה מאפיינים כאן, כי הם מעניינים. שים לב שהקצה הימני ביותר של הפירמידה יש ​​למעשה שני רוחב. אז יש שתי שווים עמודות גובה, ש עושה את זה דורש קצת קצת מחשבה לעשות בטוח שאתה מקבל את זה בדיוק נכון, כ בניגוד לרק בזווית מושלמת קַו. אז זה קצת מקרה פינה אבל תואם את המשחק בפועל. וזה גם לא ברור בהתחלה מבט כיצד להדפיס השטח הלבן. לכן, כאשר אני מסתכל על מדגם כאן-- פלט וזה גם זה בspec-- זה נראה כמו סוג של מלבן, אבל אלכסוני של המלבן כבר כרת את, וזה רק חללים לבנים, כביכול. וכך נפוצות שאלה כאן היא תמיד, גם, כיצד אוכל לזוז hashtags מעל לימין? או איך אוכל להדפיס את החללים הריקים? וזה בעצם יותר קל ממה שחושבים רוב התלמידים. יָמִינָה? אתה יכול המשוער חזותי על ידי פשוט להכות על מקש הרווח פעם או פעמיים או שלוש פעמים. וכך למרות שעם printf כמעט תמיד להדפיס את מחרוזת או int או מילה כמו "שלום, סדרת עולם "או של מילים, אתה גם יכול פשוט להדפיס ציטוט, חלל, סוף ציטוט. וזה בעצם לתת לי אתה חלל לבן שם. אז לשמור את זה בחשבון ו לא overthink זה. אתה באמת צריך להחליט, שורה אחרת שורה אחרת שורה, שלא כמו הדוגמא שלך רגע לפני, כמה מאותם טורים צריכים להיות חללים לבנים ו כמה מהם צריך להיות hashtags. זה ייקח קצת זמן, אבל זה סופו של דבר חידת היגיון של מיני. מריה: כן. אבל ההיגיון של הולך, שורה אחרת שורה הולך להיות מאוד שימושי כאן. DAVID מלאן: כן. אני חושב שהקוד לדוגמא שאתה gave-- אפילו למרות שזה לא היה בתכנית מלאה. אתה עדיין צריך int ועיקרי וstdio.h החלל ו#include, הרבה דברים מהרצאה. אבל את אבני הבניין נראה שיהיה שם. ואז לבסוף הוא משהו קצת יותר אלגוריתמי. אז מתברר שכל פעם שאתה להיכנס לCVS או כל חנות נוחות ומישהו מושיט לך ב חשבונות קופאית או מטבעות שינוי, מתברר שהם, בני אדם, או אם הם לא יודעים את זה או לא, כנראה באמצעות מה נקרא אלגוריתם חמדן, לפיה אם אתה חייב, אומר, 21 $ בשינוי, כי מסיבה כלשהי קנית משהו מאוד זול עם הצעת חוק גדולה מאוד בCVS, זה יהיה ממש מעצבן אם קופאית נתנה לך 21 רווקים או, יותר גרועים עדיין, הרבה מטבעות. במקום זאת, מה הוא אדם סביר כנראה הולכים לעשות הוא שהם הולכים לתפוס 20 $ ולאחר מכן $ 1-הצעת חוק, ו למסור לך רק שתי הצעות חוק במקרה זה. מריה: אז הם מבקשים למזער השינוי שהם נותנים בחזרה אליך. DAVID מלאן: בדיוק. ואותה עסקה עם מטבעות, כמו גם. אם אתה חייב, אומר, 0.50 $, אני מקווה שאתה לא רוצה 50 פרוטות. אתה רוצה במקום שני רבעים, למשל. עכשיו, זה עושה מניח שיש לו את הקופאית מספיק של כל המלים ש הוא או היא עשויה רוצה לתת לך. אבל אנחנו מאפשרים לך להניח כמה שיותר בבעיה. והמטרה, בסופו, היא ליישם בקוד C אלגוריתם חמדן. אז המשתמש רשאי להקליד כמה לשנות הוא או היא חייבת בדולרים וסנאט, איזה נקודה צפה ערך כנראה. ואז אתה צריך לעשות את המתמטיקה ו להבין אלגוריתמי, גם, כמה מטבעות אני יכול לתת לי אתה מינימאלי כדי לתת לך הסכום שבדיוק של שינוי. אבל יש הולך להיות כמה חלקים מסובכים כאן, נכון? כמו שיש את כל נושא חוסר דיוק. מריה: בדיוק. נקודה כל כך צפות יש ערכים חוסר דיוק. האם אנחנו מדברים על זה בהרצאה היום? DAVID מלאן: עשינו הפעם האחרונה בהרצאה. דברנו על חוסר דיוק. ואתה לא רוצה לרמות המשתמש של כמה שינוי שהוא או היא חייבת. וכך בהדרכה, ב מפרט הבעיה להגדיר, לתת קצת מחשבה, סופו של דבר, כל איך אתה יכול למתן אלה חוסר דיוק טעויות, שעלול להיות. זה מיותר, בוודאי, ל התשומות שאנחנו מדברים על. ואכן, pennies-- אולי אנחנו לדחות לZamyla, אני חושב, לטריקים לשם. אז בסופו, תמצא את התקדמות של בעיות השבוע, הראשון שבם הוא די קטן, אז בינוני, אז קצת יותר גדול. אבל כולם להשתמש בבניין בלוקים מהשבוע האחרון, מsupersection זה, מפרט להגדיר בעיה מעמיד אותך במשאבים אין ספור. אבל עדיין, אם בכלל נאבק, במיוחד בקרב אלו פחות נוחים ללא רקע קודם, לבוא לשעתי עבודה ביום שני ושלישי ו יום רביעי וחמישי. עבור לCS50 דיון באמצעות אתר האינטרנט של הקורס, באמצעות שבו אתה יכול לשוחח עם צוות וחבריו לכיתה. אבל סופו של דבר, אני חושב ש העצה הטובה ביותר היא פשוט להתחיל מוקדם. זה לא הסוג של כיתה ש צריך להתחיל psets ביום רביעי הלילה, או יום חמישי בלילה גרוע. מריה: העצה הטובה ביותר שלי היא שנכתב על ידי ביום שני. DAVID מלאן: יום שני. אז אם אתה לא התחיל already-- לא. אבל גם אם לא ביום שני, אז ביום שלישי. מוקדם יותר טוב יותר. וזו הסיבה יש כמובן כל כך הרבה ימים מאוחר כדי לתת לך קצת לחץ פסיכולוגי להתחיל מוקדם יותר, אבל עדיין לתת דברים להחליק כאשר הדברים לוקחים זמן רב יותר ממה שאתה מצפה. מריה: ואתה רוצה לעשות שימוש ב שעתי עבודה ככל שאתה יכול, גם. DAVID מלאן: כל שאלות? בסדר. ובכן, למה אנחנו לא לדחות כאן?