פרופסור: אז סדר היום ל השבוע, לא כל כך הרבה דברים. אבל אני מקווה מאוד, מאוד מועיל ורלוונטי בשבילכם זה שבוע. אבל אנחנו הולכים לבלות אולי 15, 20 דקות רק מדברים במהירות על קישור רשימה. רשימות קישור הולכים להיות מכוסה על החידון. אז אולי זה יהיה מאוד מועיל כדי ללמוד קצת על מה זה. אנחנו הולכים לבלות את הרוב רוב הסעיף של היום הולך על חידון אפס בעיות בפועל. ואז אולי לחסוך 20, 30 דקות בסוף לכל שאלות משתהות למישהו יש. ולאחר מכן, עבר חמש דקות, אני הולך לתת נאום משאבה לחידון. אתם כל רוצים להיות כאן בשביל זה. כי זה הולך להיות זמן טוב. בסדר, אז כמה מהותי על קישור רשימה. איך הם בנויים בדרך כלל הוא יש לך מה שנקרא צומת, נכון? יש לך את הדברים האלה בשם צמתים, שהם structs. אני אלך על איך ליצור צומת בשקופית הבאה. אבל בעצם כולם קשור רשימות היא הוא נתונים ש כבר מתוח יחד באמצעות מצביעים. וכך היתרון שיש לנו של שימוש ברשימה מקושרת מעל, אולי, כמו מערך, הוא העובדה שבמערך אתה צריך גוש רציף אחד זיכרון כל באותו המקום, אחד אחר, כדי להיות מסוגל לקבל את זה. ואילו רשימה מקושרת, אתה יכול יש חתיכות קטנות אקראיות של זיכרון בכל רחבי המחשב מתוח יחד על ידי מצביעים. ובדרך זו אתה יכול לגשת למידע שמגיע אחד אחרי אחר, בזה אחר זה ללא צורך רק נתח עצום של זיכרון במחשב שלך במקום כלשהו. וכך זה הוא אחד הגדול סיבות לכך שאנו משתמשים בקישור רשימה. שנית, זה קל מאוד לדינמי לשנות את גודל רשימת הקישור כי במערך, כאשר אתה מצהיר מערך, יש לך ערך מסוים שנקבע. נניח שאני רוצה ליצור מערך של 10 מספרים שלמים. אני יוצר מערך של 10 מספרים שלמים, וזהו. זה 10. אני לא יודע מה לעשות אחרי ש. אם אני רוצה לעשות את זה 11, לא יכול לעשות את זה. אם אני רוצה לעשות את זה 9, לא יכול לעשות את זה. ואילו ברשימת קשר, אתה יכול להוסיף ו למחוק ולהוסיף בכל מקום שאתה רוצה. דינמי אתה יכול לשנות את הגודל שלך מבנה כאן, מבנה הנתונים שלך. וזה נותן לנו הרבה גמישות הוסיפה עוד שאנחנו עושים בדרך כלל לא יש לי עם מערכים. כל אחד מבולבל בבסיסי מבנה של איך רשימת קישור היא או למה אנחנו צריכים להשתמש באחד על מערך? כן, אנחנו מתכוונים לעבור על בפירוט כיצד ליצור למעשה אחד. אבל זה פשוט סוג של התחושה הכללית עכשיו. לְהִתְקַרֵר. וכך מערכים שזורים יחד דברים הקטנים היפים אלה בלוטות נקראות. כל צומת היא סוג של struct. זכור, struct הוא אם אתה רוצה כדי ליצור סוג מסוים של משתנה בC שלא עושה כבר קיים, אתה, כמתכנת, למעשה יכול ליצור בעצמך. ואז זה סוג של נתונים מבנה נקרא צומת, למעשה נוצר על ידינו, ש לא קיימת בתוך C בכוחות עצמו. והאופן שבו אתה ליצור אחד הוא שיש לך הכותרת של struct typedef, שאומר למהדר אני על מנת ליצור struct. אנחנו הולכים שם "צומת". זה ובתוך אנחנו הולכים להכריז משתנה ב, שהוא הולך לאחסון ערך. ואז אנחנו גם הולכים יש מצביע בשם "הבא" שמצביע על הבא צומת ברשימת הקשר. ואז אתה מסיים את זה רק על ידי חזרה על צומת שוב כל כך מהדר יודע, בסדר זה הסוף של struct. וכך, בדרך זו, אנחנו סוג יצירת מערך קטן וחמוד סוג של דבר עם ערך ועם מצביע. ואתה יכול לקשר אותם כל יחד עם מצביעים אלה. כך שהם יכולים להיות כל סוג מתוח יחד בשרשרת. לְהִתְקַרֵר. האם אתה יכול לשמוע את זה קצת יותר טוב? קהל: כן. פרופסור: בסדר. לכן הדרך ש, כפי שאתה יכול לראות בחורים, רשימת קישור טיפוסית בנויה הוא שיש לך בראש. יש לך את ערך הראש שאינו שהצביע על ידי כל מצביע אחר. אבל זה הולך להצביע ב, או התייחסות, צומת אחר. הצומת אחרי הולכת הפניה צומת לאחר ש, וכן הלאה וכן הלאה עד שסופו של הדבר פגע סוף רשימת הקישור שלך. ופשוט אין לך מצביע שם. וכך, חושב כמו, בשרשרת, או אפילו אם מישהו מכם הבחורים עשו, אני לא יודע, כמו עם לולאות פירות כאשר היית קטנים. שהיית להם מחרוזת יחד וללבוש אותם סביב צווארך. חושב שזה בדיוק אותו הדבר. יש לך דברים הקטנים האלה שאתה יכול מחרוזת יחד נקודה שלאחד אחרי זה, לאחד לאחר זה, וכן הלאה וכן הלאה עד שיש לך שרשרת של מבנה הנתונים שאתה יכול להשתמש בכל צורה שתרצה. לכן הדרך שזה הייתי בדרך כלל להוסיף או למחוק צומת כלשהו מקישור הרשימה שונה מאוד תלוי איפה צומת שהיא. כך, למשל, כי מצביעים תמיד מצביע על ערך מסוים, כאשר אתה מוחק או הכנס צומת, אתה רוצה לוודא שהמצביע הוא מצביע על כל הדברים הנכונים. אז אם אתה רוצה שעלול להכניס צומת חדשה עם הערך של אחד בתוך קישור ממוין רשימה, שכולנו יודעים כאן מהתמונה שהולכת ללכת בראש ובין שתיים, נכון? בגלל אחת מתאים לשם. אבל הדרך שבה אנחנו היינו עושים את זה הוא על ידי ביטול הפניה למבנה המצביע הראשון מהראש ושולח את זה לאחד. אבל אנחנו באים לשל בעיה כאן. כל אחד יכול לראות מה הבעיה הוא אם היינו dereference הראשון המצביע מהראש לאחד? מה בעיה אולי אנו נתקלים אם ננסה כדי להוסיף את זה לחלק הקדמי של המערך שלנו? קהל: [לא ברור] פרופסור: בדיוק. אז הנה יש לנו מצביע שהיה מצביע פעם אחת מהראש לשתיים. אבל אם אתה להיפטר שמ מצביע, אתה מכוון אותו לאחד, עכשיו אין לנו מושג לאן ללכת כדי למצוא שתי. כי כמו שאמרתי קודם, יש לך נתח ענק של זיכרון במחשב שלך. כל צמתים האלה יכולים להיות ביניהם באופן אקראי בכל מקום במחשב שלך. ואתה לא יודע איך ללכת על מציאת ש. ואז אתה צריך שתהיה לי מצביעים מצביע על כל צמתים בסוף. או אחר אם אתה בטעות dereference אחד מבלי להקצות ראשון ערך הראשון, אתה רק הולך להפסיד כל מה שלאחר מכן. אז מה אנחנו הולכים לעשות הוא, ראשון שהיית עושה רוצה ליצור מצביע על הצומת שרצונך להוסיף. לכוון אותו למקום שבך רוצה להכניס אותו ל, ואחר כך לך יכול להצביע ראש חזרה לאחד. האם זה הגיוני שכולם כאן? גדול. תחשוב על זה כבדיוק כמו שרשרת. אם תוסיף שרשרת, זה סוג של אינטואיטיבי איך אתה הייתי הולך על ההכנסה ש. אוקיי, אז זה בעצם הרבה קצר יותר ממה שחשבתי שזה יהיה, נאום של חמש דקות על קישור רשימות. רק אז יש לך חבר ' רעיון בסיסי של מה זה. כאן יש לנו את סדר היום לחידון אפס. אל תתנו לזה להפחיד אותך. אני יודע שזה הרבה מידע. זה נראה מאוד מפחיד. זה גם הרבה, אני חושב, סוג של מונחי CSC. דברים כמו מחרוזות הקסדצימליים, מצביעים, הקצאת זיכרון דינמי הם מונחים נשמע מאוד מפחידים. אבל אנחנו הולכים לשבור אותם למטה, לעשות קצת בעיות בפועל כך שאתם כל מוכנים לבדיקה זו. כמה מכם יש לי כבר התחיל ללמוד? אישור, אתם בטח רוצים כדי להתחיל התחלת העבודה על זה, כי החידון הוא מחר. או ביום חמישי לחלק מכם. כן, אז אנחנו הולכים ללכת על כמה בעיות בפועל. אם אתם רוצים לקחת את כל מתוך גיליון נייר, עיפרון. אנחנו הולכים רק כדי לבלות רוב מכריע של הסעיף של היום הולך על כמה שאז יש לך חבר ' רעיון של למה לצפות בחידון. אוקיי. כמה לוגיסטי פרטים, כמו גם, לאף אחד שלא היה לקישור שיש, אם אתה הולך לcs50.yale.edu, בחזית דף זה יש קשר שאומר "אודות חידון אפס." הקישור לוקח אותך לשם. אם לא קראת אותו, בבקשה לקרוא אותו. כי זה אומר לך באמת חשוב מידע על החידון. אני הולך למשוך את זה מ זה רק בגלל ש, פיזי, אם אתם לא יודעים איפה ללכת, תהיה לנו בעיות. ולכן אם אחרון במונחים עם לN, ללכת לאולם בית הספר למשפטים. ואם מתחיל האחרון שלך עם P 'עד ת', ללכת לדייויס אודיטוריום. וזה חל רק ל אנשים בסעיף יום רביעי. אם אתה לוקח את החידון ב יום חמישי, אתה הולך לSSS 114 שם ההרצאה שלך בדרך כלל היא. קהל: [לא ברור] פרופסור: O 'עד ת', אתה הולך ללכת לאולם דייויס. אני הולך לשנות את זה, נכון? אה, כן, אתה פשוט לא מצליח באופן אוטומטי. אה, כן, זה אתה כריסטה. כן, שלי רע. כן, O 'עד ת', אתה הולך ללכת לדייויס Auditorim. אני הולך לתקן את זה ברגע שאני מעלה. כֵּן. ואז גם משהו חשוב לזכור הוא שיום רביעי, אם אתה באופן רשמי נרשם בסעיף יום רביעי, אתה חייב לקחת החידון שלך ביום רביעי. ואם אתה לומד ביום חמישי, אתה חייב לקחת החידון שלך ביום חמישי. וזה בזמן שיעור. איפה, אני חושב שזה כמו 1:00 עד 02:15 בימי רביעי ו2:30-03:45 בימי חמישי. אם יש לך סכסוכים בלתי מתפשרים, התירוצים של דין הם הדבר היחיד, למרבה הצער, אנחנו יכולים לקחת. בגלל שהיינו לנו רוב מכריע של בקשות כדי לעבור מיום רביעי עד יום חמישי. שאנחנו לא יכולים לכבד, אלא אם כן יש לנו בקשתו של דיקן. אוקיי. אז לפני שנתחיל ב כמה בעיות בפועל, אני רק הולך לעבור על העצות מועילות של אנדי להצלחה. אתם, כשאתה לומד, אתה באמת רוצה לתרגל כתיבת קוד ביד. בפעם הראשונה שאי פעם לקחתי חידון CS, לא היה לי כתיבת קוד בפועל ביד לפני וזה היה מאוד מזעזע בכמה קשה זה היה. כאשר אתם לא להיכנס הרגל של הקלדה את כל מה ש, מדובר להיות מאוד באופן טבעי נוכל לי השלמה אוטומטית סוגריים ופסיק שם. כשאתה כותב את זה ביד, לפעמים זה מאוד, קל מאוד לשכוח פסיק, או תשכח לסגור הסוגר, או תשכח לסגור מעי גס, או משהו כזה. לכן, כאשר אתה כותב קוד ביד, זה תחושה שונה מאוד. אז אתם, כשאתה עובד באמצעות חלק מהבעיות בפועל, זה יהיה טוב באמת להתאמן היום. או מחר, אני מניח, אם אתה לוקח את החידון ביום חמישי. שנית, יש לנו האחרון, כמו, עיסוק בשווי של השנה ושמונה חידונים מקוונים. חידון השנה יהיה כנראה מאוד, מאוד דומה לכולם. הם כולם דומים מאוד. אתה סוג של להיכנס ל סגנון של הסוג של שאלות שאנו מבקשים, הסוג של פונקציות שנכתוב את זה ב, וכולי, וכולי. אז לקחת את החידונים בפועל, במיוחד תחת אילוצי זמן. 75 דקות לעשות את החידון הוא לא הרבה כמות הזמן. זה מאוד, מאוד ארוך. וכך אתם באמת רוצים כדי לוודא שאתם נמצאים ברגל של כתיבה קוד ביד במהירות. מכיוון שאתה לא רוצה ראשון זמן כדי לראות חידון של אורך ש להיות בחידון שלך. אתם באמת רוצים לוודא שאתה נוהג מראש. רביעית, אתה רוצה לבדוק את שקופיות הרצאה וחתך. אתה לא צריך לשנן דברים. למעשה, כולם מותר גיליון הערות נייר לבן אחד, קדמי ואחורי. אתם יכולים להקליד או לכתוב. אם אתה מוצא את עצמך צורך לשנן שום דבר, הניח אותה על גיליון ש. אני מבטיח לך, שאתה לא רוצה להיות תקוע באמצע החידון ש להיות כמו, אה, כן, מה ש זמן ריצה מסוג לעומת סוג שזה. פשוט לשים אותו ולהעתיק אותו היישר מגיליון הפתק שלך. אז למעשה אתה יכול פשוט להשתמש שלך המוח לחשוב על הבעיות ולא שיש לזכור עובדות. וכך באמת לנצל פרטי נישה כל כי אתה חושב שאתה צריך לשנן, פלופ אותה על גיליון הסקירה. אישור, כל שאלות לוגיסטית לגבי החידון לפני שאנחנו מתחילים קצת בעיות חידון להתאמן? כֵּן? קהל: לא היה לי סיכוי להסתכל על החידון [לא ברור] אבל זה הולך להיות יישום בעיקר, או שיש גם הולך להיות, כמו, שאלות ידע? פרופסור: זה הרבה. אז, בדרך שאני היית תאר את החידון הוא-- אני להרכיב כמה בעיות בפועל שמשכתי מכל החידונים. אבל תראה שיש שני עיקרי סוגים של שאלות שנשאל אותך. אחד מהם הוא רמת פירוט נמוך מאוד של חומר. אנחנו ניתן לכם נתח קטן של קוד ואומר, יש שגיאה כאן? מה יהיה להדפיס את כאן? מה קוד זה יהיה לייצר, וכולי. פרטי מידע כך רמה נמוכה מאוד. ועל הצד השני של המטבע, שנצטרך מאוד רמה גבוהה שאלות מבוססות ידע. אתה יכול להסביר מה הבדל בין חיפוש בינארי וחיפוש ליניארי הוא? למה שנרצה ל להשתמש באחד על פני האחר? אולי, מה הוא GDB? למה אנחנו רוצים להשתמש GDB? רמה גבוהה יותר, יסודי יותר שאלות הבנה. אז תראה תערובת של שתיים מהם בחידון שלך. כל דבר אחר לפני ש ראש ישר לתוך זה? אוקיי. קהל: אחת יותר. פרופסור: אה, אחד יותר. מצטער. קהל: כן, זה בסדר. אז אתה אומר 75 דקות הוא קצר מדי, כמו זה סביר שנסיים? או, כמו, 75 דקות זה בדיוק כמה שיותר זמן כפי שהיינו צריך אם היינו הכין כראוי? פרופסור: אוקיי, אז החידון הוא מאתגר. זה בהחלט מאתגר. אתה תמצא את עצמך קצר בזמן. אתה בטח הולך להכות, כמו 10, 15 דקות לסיום, ולהיות כמו, חרא. שנשארתי לי כל כך הרבה מה לעשות. וזה לגמרי בסדר. כולם עומד מרגישים אותו הדבר. רק להיות מודע מאוד ל כמה זמן יש לך. ואז בגלל זה אני אומר לך בחורים לעשות חידונים בפועל. כי זה באמת נותן תחושה נהדרת של מה החידון הולך להיות כמו. אז אם אתה מוצא את עצמך תוכל סיים את האימון חידונים בכמות טובה של זמן, אתה יכול לצעוד את עצמך היטב, אז לא יהיה לך בעיה ביום רביעי או חמישי. לְהִתְקַרֵר. אז אם כולם אני חושב wants-- רוב האנשים גיליונות נייר את כבר. אני הולך בעצם רק אתן לך שאלות לדוגמא, לתת לכם, כמו, כמה דקות כדי לעשות אותם. ונלך על כתובענה מה התשובות להם. אז זה מאוד אופייני השאלה הראשונה שנציע ב לשאול אותך, רק המרה מספרים בין בסיסים שונים. בינארי, כמו שאתם יכולים כזכור, הוא בסיס שני. העשרוני הוא בסיס 10, או מה שאנו כמו בני אדם בדרך כלל לפרש. הקסדצימלי הוא בסיס 16, שהוא אפס דרך תשע, כמו גם דרך פ אז יש ארבעה מספרים אני שואל אתכם להמיר כאן. אני אתן לך אוהב, שלושה ל ארבע דקות לחשוב על איך היינו הולכים על פתרון זה. קהל: האם מותר מחשבונים? פרופסור: אתה לא יהיה צריכים מחשבונים, כן. אני חושב שבנוסף בסיסי, אני חושב, הוא כל מה שאתם תתבקשו לעשות. ורק אז אני סוג של יש לי תחושה כאשר כולם עשו, מסתכל למעלה, גל, אני לא יודע, לחייך, נראה מאושר אם תסיים. כֵּן. יותר אולי כמה דקות. אישור, בואו נביא אותו ב. אני בכוונה הולך לתת לכם פחות זמן ממה שאתה כנראה צריך לעשות קצת בעיות אלה, פשוט כי אני רוצה לוודא ש אנחנו מקבלים דרך חבורה של בעיות. אז אל דאגה, אם לא יש סיכוי לסיים. לגמרי בסדר כל עוד יש לך רעיון של איך ללכת על זה. אז בואו נלך קדימה ולעשות את הראשון. אז קודם כל, האם מישהו רוצה לספר לי בינארי, מה לעשות כל אחד מאלה ספרות מייצג במונחים של הערכים שלהם? כֵּן? קהל: שני ל כוח אפס, שתיים לאחד. פרופסור: בדיוק. כָּך. נכון, כל כך בדרך כלל כאשר אנחנו נמצאים בבסיס 10 כל אלה מייצגים הם, כמו, 10 לבסיס אפס, נכון? זה המקום שלך אחד. כל המקום שלך הוא 10 10 לכוחו של אחד. שלך 100 מקום 10 לכח של שתיים. לא משנה מה בסיס שאתה הולך ב לעשות עם בדיוק את אותו הדבר, רק עם בסיס שונה. אז בינארי, כל מה שהוא בסיס שני. אתה הולך להמיר את כל ספרות לשני לכל כוח של ספרה ש. וכך, במובן זה, אנחנו יכול להיות דרך קלה יותר להיות מסוגל להוסיף או לסכם את כל המספרים כדי להמיר לבסיס 10. אז האם מישהו רוצה לספר לי מה תשובה לראשונה היא בבסיס עשר? קהל: שני, [לא ברור] פרופסור: כן. קהל: 42. פרופסור: 42, יש לך ללכת. אז יש לנו דרך תשובה זו הייתה על ידי עושה שתי הראשונים, שהוא שני. בתוספת שתי השלישי, שהוא שמונה. בתוספת שתי לחמישית, ש הוא כל מה שנשאר. אתה מסכם אותם וזה 42. האם מישהו מבולבל על איך הגיע לזה? בנוסף כל כך בסיסי, כמו אמרתי, אתה צריך להיות בסדר. אם לא, טוב, אנחנו יכולים לתרגל את זה גם. אבל זה בסדר. לְהִתְקַרֵר. האם מישהו רוצה לתת לי לענות לשנייה אחת, כמו גם? 50? טוֹב. כל אחד מבולבל על איך יש לנו כי גם? מגניב, יהיו לי תשובות בשקופית הבאה. אז אל דאגה, אם אתה צריך להעתיק אותו. אוקיי, אז הקסדצימלי הוא קצת יותר מסובך. אבל אני הולך להראות לכם קיצור עבור איך לעשות את זה. אז הקסדצימלי, כפי שאתה זוכר, את כל זה הוא להיות 16. ומכיוון שאנחנו כבני אדם לא ממש יש 16 מספרים לייצג ש, אנחנו הולכים מאפס לתשע, ש הראשונים 10 ערכים, ואז אנחנו עושים דרך F, שהם שישה הערכים הבאים. ולכן הדרך הקלה ביותר לצאת מ כל מספר בינארי הקסדצימלי הוא לשבור אותם לחצאים. וכך כל מספר בינארי שינתנו לי כנראה יהיה לך שמונה ספרות. אתה פשוט יכול לשבור אותם באמצע. אז הראשון one-- אחד אחד, אחד אחד, אחד, אחד, אחד אחד. סוג של לחשוב על זה, אתה יודע, לצייר קו נטוי או פסיק ביניהם. ואתה יכול פשוט להמיר ישירות מה זה הוא ראשון מספר הקסדצימלי, ומה כאן הוא השני של הקסדצימלי. אז זוכר מסימון נפוץ, מה ערכים הקסדצימליים מתחילים עם? קהל: אפס. פרופסור: 0x. אז אנחנו יודעים שכל פעם שאנחנו שואלים אותך להמיר כל מספר להקסדצימלי, או כל פעם שאתה רואה כל מספר שמתחיל עם 0x, אתה יודע שזה ערך הקסדצימלי. ואז אתה הולך לתתבקש לקבוע מה הן שתי ספרות אלה. והדרך בה אתה עושה את זה, הספירה עד שמחצית וספירה עד שמחצית. אז בדוגמא זו, מה ש היה אחד, אחד, אחד, אחד להיות? מה ערך שלא יהיה? זה יהיה F, נכון? זה יהיה 15. אז זה יהיה פ אחת, אחד, אחד, אחד כאן הוא גם פ אז אחד, אחד, אחד, אחד, אחד, אחד, אחד, אחד בהקסדצימלי, כל זה הוא 0XFF. בגלל המחצית מיוצגת F, הערך של 15, והמחצית מיוצגת F, הערך 15. כי תזכרו, אנחנו ספירה מאפס עד תשע. זה כמו 10, B הוא כמו 11, F הוא 15. האם זה הגיוני לכולם איך יש לנו מינארי הקסדצימלי? קהל: ואז איך אנחנו מקבלים 15 מאחד, אחד, אחד, אחד? פרופסור: כן, זה הוא בינארי, נכון? תארו לעצמכם שזה רק מספר בינארי. אז יש לך שני ל אפס, שהוא אחד. קהל: אה, בסדר. אז אתה פשוט תסתכם את זה. פרופסור: כן, ולאחר מכן אתה פשוט תסתכם ש. זה כל מה שזה. קהל: אישור. פרופסור: אישור. קהל: אז אתה הולך מינארי עשרוני הקסדצימלי ל? פרופסור: זה הדרך הקלה ביותר לעשות זאת, כן. אתה לא הולך לעשרוני כי עשרוני יש רק אפס לתשע. אנחנו רק סוג של פיצול זה עד לשתיים. קהל: [לא ברור] באמצעות עשרוני למצוא מה שהוא תואם בהקסדצימלי. פרופסור: אני מתכוון, אתה הספירה עד שימוש במתמטיקה בסיסית. קהל: כן. פרופסור: כן, פחות או יותר. זה קצת מבלבל. אבל פשוט יודע שאתה יכול לחלק את כל מה ש ערך זה הוא לרק חצאים. תראה, מה זה בינארי? מה מספר זה? זה הולך להיות משהו מאפס לפ כאן הוא גם הולך להיות משהו מאפס לפ ואז אתה יכול פשוט לשים אלה שני ממש שם. קהל: אישור. פרופסור: כן. אוקיי. אז אתם רוצים תנסה הבא לאחר מכן? אפס, אחד, אפס אחד, אחד, אפס, אחד אפס. אני אתן לך בחורים כמו 30 שניות, מאז שאתה כנראה לא יודע הטריק איך לעשות את זה קודם לכן. אישור, מישהו רוצה לקבל את זה ירה? 0X5A. פרופסור: 0X5A. 5a. טוֹב. אז זה כאן היה להיות-- אתה רוצה לספר לנו איך אתה הבנת את זה? ראשית, איך אתה מקבל את חמש? קהל: בגלל אפס, אחד, אפס, אחד הוא חמש. פרופסור: האם כולם מבינים מדוע אפס, אחד, אפס, אחד הוא חמש? יש לך כאן. יש לך שום דבר בשני לראשון. בשני לשני, אתה יש אחד, שהוא ארבעה. אז אתה מוסיף עוד ארבעה אחד, יש לך חמש. כולם טובים? אוקיי. ואז מה זה היה ולמה? מה מספר אינו מתאים ל? קהל: 10. פרופסור: ומה זה בבסיס שני? קהל: [לא ברור] פרופסור: בדיוק. אז ערך שני זה כאן יהיה 0X5A. כולם טוב על איך להמיר? זה הרבה יותר פשוט ממה שאתה חושב שזה. אני רק רוצה לוודא אתה יודע עצות מועילות וטריקים לאיך לעשות את זה. קהל: למה אתה יכול רק לפצל זה באמצע כזה? רק להיות כמו, אישור, אני רק הולך ל אכפת [לא ברור] ראשון אלה? פרופסור: כי זה בעצם דרך ערכים הקסדצימליים מיוצגים. 0x, שפירושו למעשה שום דבר אחר מאשר אומר לך שזה מספר הקסדצימלי. וזה תמיד מייצג ארבע הספרות הראשונות. וזה תמיד מייצג ארבע הספרות האחרונה. וכך שתי ספרות אלה רק מתאים לביטים שונים. קהל: אז אנו תמיד-- פרופסור: אתה תמיד הולך לקבל שמונה סיביות ערך. קהל: האם זה בדיוק כמו דבר כאן או שדבר בכל רחבי? פרופסור: זה פשוט דבר במחשבים, כן. קהל: אישור. מדהים. פרופסור: כן, כך בדוגמא זו אנחנו יומרו בינארי עשרוני, ומינארי הקסדצימלי. אתם רוצים לוודא שאתה גם לתרגל הולך להיפך. אז אם נתתי לך 0XFF, אתה יכול לצייר את זה בינארי, נכון? אתה להמיר F לינארי, שהוא אחד, אחד, אחד, אחד, להמיר F לינארי, ש הוא אחד, אחד, אחד, אחד. אז אנו עשויים לבקש ממך לעשות להיפך. אז עשרוני בינארי, או הקסדצימלי לינארי. אז אתה רוצה לעשות בטוח שאתה יודע לשני כיוונים. אנחנו בטח שואלים אותך שילוב של שתיים. כן, יש לך שאלה? אני יכול see-- אתה טוב? קהל: כן. פרופסור: אישור. האם אני טוב למחוק זה? גדול. בסדר, אז תשובות נמצאות כאן אם מישהו הוא סקרן מאוחר יותר ומתבלבל. אוקיי. קהל: האם זה משנה אם אנחנו שמים המכתבים שלנו בבירה או באותיות קטנות? פרופסור: הוא עושה, כי בהקסדצימלי, על ידי אמנה, כל הדמויות הן באותיות רישיות. אז דרך F הם הולך להיות באותיות גדולות. אם אתה שם את אותיות קטנות, אני לא יודע אם היינו בהכרח מסמן את זה לא נכון. אבל באופן תיאורטי, זה לא מבחינה טכנית איך אתה אמור לקבל את זה. אז כל מה שהם צריכים להיות באותיות גדולות. כן, שאלה טובה. אוקיי. שאלה שנייה. לשקול תכנית יפה זה כאן. אני אשאל את השאלה, אני אחזור זה. אז, קודם כל, מה שבפנים לסטנדרטים של io.h זה עניין לתכנית? שנית, מה שעושה חלל לסמן בקו שלוש? ושלישית, מה חוזר אפס מ עיקרי, כקו שש, בדרך כלל מסמן? אם אתם רוצים לכתוב אותם למטה, מאז שיש לי לחזור לשקופית רק כדי שתוכל לראות את הקוד. זוהי דוגמא של, כמו, אולי שאלה ברמה גבוהה יותר שבו אנו מבקשים מכם מה משמעות דברים בתכנית. כולם טובים בשבילי לחזור לשקופית? בסדר מגניב. אז אני אתן לך בחורים כמו אולי שלוש דקות להסתכל מהיר אמיתי זה אחד. אוקיי, אז זה כמו אחד של קל למדי, מבחינה רעיונית. האם מישהו רוצה לספר לי מה ראשון בתוך ידי חשיש כולל קובץ ספריית io.h הסטנדרטי? למה אנחנו צריכים ספרייה ש כלול בתכנית זו? מה כאן אנחנו צריכים את זה? כֵּן? קהל: האם שכאשר אתה שם את printf ש? פרופסור: בדיוק. אז printf, בכל עת ש לקחת קלט מהמשתמש ומשהו הדפסה למסך, זה הקלט הסטנדרטי, ספריית פלט. תחשוב על זה שway-- קלט, פלט. האם יש לי פלט? כן אני כן. אז אני יודע שאני תמיד הולך ל צריך ספריית i.o תקנן. אז printf היא הפונקציה על ידי שאנחנו צריכים לגשת ל וhashtag כולל ספריית i.o סטנדרטית. אוקיי. שנית, זה מה החלל מסמן? יש לנו int הראשי (void), מה עושה לבטל כאן אומר כאן על קו שלוש? כן, בחלק האחורי. קהל: [לא ברור] פרופסור: בדיוק. אז לזכור, שלמדנו מתחיל עם pset כי למעשה אתה יכול לציין שורת הפקודה טיעונים שהתכנית שלך, כי אתה פונקציה העיקרית, כפי שאתה לוקח, למשתמש, קורא לזה. אם יש לנו חלל, זה אומר שאתה יכול פשוט להפעיל את התכנית באופן ישיר ללא כל טיעוני שורת הפקודה. כולם ברור שב? אוקיי. ולבסוף למה אנחנו עושים את דבר זה תשואת אפס כאן? למה יש לנו אפילו עיקרי int? למה לא יכול פשוט יש לנו חלל מרכזי חלל? כֵּן? קהל: רק כך שאנו יכולים להיות בטוח שהתכנית היא יציאה בהצלחה, כפי ש בניגוד לאם זה היה ממוספר. והיינו יודעים שזה סוג אחר של שגיאה. פרופסור: כן, בדיוק. זה רק מאוד דבר קונבנציונלי שאנחנו עושים, הוא שרק בסוף התכנית שלך, רק כדי לוודא ש שתפקידו העיקרי שלך פועל בצורה נכונה, אנחנו תמיד רוצים לעשות תשואה אפס. למרות שדווקא אנחנו רשאי לא רואה את זה בכל מקום מודפס. כי כמו מתכנתים, אתה יודע, אם יש לך קווים רבים ושונים של קוד ואתה לא יודע איפה אלה הולכים בסדר, ואם שגיאה קורה אתה רוצה לוודא שאתה מקבל שגיאה ש. וכך בדרך כלל אם משהו בסדר תהיה לנו תשואה של אחד פשוט כדי לוודא שאנחנו יודעים שזה. אז אם אתה רואה תמורה אפס, כי בדרך כלל, משמעות התכנית שלך היא להורג בהצלחה. טוֹב? לְהִתְקַרֵר. אישור, תכנית שנייה כאן. תחשוב על זה. ואם אתם רואים לצוף, אתם כנראה יכולים יש לי רעיון טוב של מה ש אני עומד לשאול אותך. לכן, כאשר תכנית זו מבצע, כמו שאתה יכול לראות, אני מכריז על מצוף בתוך הפונקציה העיקרית שלי. אני שיום זה "ענה," ואני הגדרה ששווה לאחד חלקי 10. אני מדפיס את, לאחד מקום עשרוני, לצוף ש. ואז אני חוזר לאפס. לכן, כאשר ביצוע התכנית, חושב לחזור לחמדנים עכשיו, תכנית זו מדפיסה 0.0. כפי שכולנו יודעים, אני מקווה שכולנו יודע, אחד מחולק 10 הוא לא 0.00, זה 0.1. אבל להסביר מדוע תכנית זו חושבת כי 1 מחולק 10 הדפסים 0.1 אחרים מ -0.1? אני אתן לכם אולי כמו 30 שניות לחשוב רק על מהירות ש ואני אחזור לתכנית. אוקיי. כל אחד רוצה לתת לזה סיכוי? בשלושה משפטים או פחות, כי בדרך כלל אנחנו הולך להגביל את כל התשובות לשלושה משפטים או פחות כך שאתה לא רק להקיא דברים אקראיים על החידון שלך. כן, לקחת זריקה. קהל: אז אני חושב שיש את זה דבר שנקרא, כמו, [לא ברור] אז אולי יש, למשל, ייתכן שיש, כמו, 0.09, שבו אתה מדפיס ראשון ספרה, זה יהיה ל 0.0? פרופסור: לסגור, לא ממש. Christabell? קהל: אתה החלוקה אחד ו 10, ושניהם מספרים שלמים. ולכן הדרך שזה הולך לאחסן אותו הוא כמספר שלם. וכך השלם הקרוב יהיו 0.0. ואז זה 0.1. פרופסור: כן, זה ממש טוב. זו התשובה הנכונה. אז זה מאוד מבלבל מושג להרבה ילדים. ואני באמת רוצה לוודא ש זה חיזק בראש של כולם. אז מה שאנו מכנים צפים חוסר דיוק נקודה, שבו הסיבה מדוע הרבה התוכניות שלך בחמדנים לא עבדו בהתחלה היה כי שכחת להטיל משתנה. אז מה Christabell אמר היה נכון לחלוטין. לצוף הוא מטבעו לא מדויק. כי במחשב, נכון, יש לנו כמות סופית של ביטים של זיכרון אנחנו יכולים להשתמש בו כדי לייצג מספרים. כך, למשל, מזהה CS50 זה הוא-- אני חושב שזה מחשב של 64 סיביות. לצוף יכול להיות מיוצג רק על ידי כמות סופית של ביטים אלה. וכך 0.1 עם אפסים אינסופיים, שהיה של 0.1 הוא, נכון? אבל אנחנו לא ממש יכולים לאחסן מספר שבמחשב שלנו. פשוט אין לנו מספיק זיכרון כדי לעשות זאת. וכך הקירוב הקרוב ביותר מה ששמור בזיכרון הוא למעשה משהו כמו 0.000 משהו, משהו, משהו, משהו. אשר, ברגע שאתה לחתוך זה, סיבובים עד 0.0. וכך דוגמא זו היא רק אחד שמדגים המון בעיות יש לנו בכל פעם שאנחנו מנסה לעשות מתמטיקה באופן שגוי ללא ליהוק כמספר שלם שונה. אז רק להיזהר שזה יקרה. על חידונים, אם אנחנו נותנים לך בלוק של קוד וזה כמו, מה מדפיס בסוף? ואם זה כמה ערך האקראי אתם צריכים לדעת למה שקורה. כֵּן? קהל: לחתוך הוא להיפטר מ כל מה שאחרי נקודה מסוימת? [לא ברור] פרופסור: כן, אז בעצם זו דוגמא ממש רעה, משום מה דווקא 0.100 היה לחתוך עד 0.1. אבל אם היית לרוץ it-- אני לא זוכר, כי בשנה שעברה הם ניהל אותו בתכנית אחרת. הם ניהלו אותו במשהו שנקראים CS50 Appliance, ש הוא שונה מזיהוי. זה היה מערכת של 32 סיביות, אני חושב. וכך היו מספרים שונים. אבל בעצם, רק יודע ש כל הרעיון של חיתוך ואיך זה בדיוק חותך את דברים. ואז אם זה rounds-- קהל: ללא עיגול. פרופסור: בדיוק. כֵּן. לְהִתְקַרֵר. היי, בחלק האחורי. אנחנו רק הולכים על כמה שאלות סקירת חידון. בסדר. אז לשקול תכנית אחרת כאן. אני הולך לתת לכם כמה דקות כדי לקרוא על זה. זה משהו שהיה למאוד לאחרונה שאני חושב שפוצצתי הרבה מוחם של הבחורים. אבל אנחנו הולכים לדבר באמצעות זה שוב רק כדי לוודא שאתה מבין את זה לחלוטין. אוקיי. אוקיי. כל אחד זקוק ליותר זמן כדי לקרוא את הקוד הזה? אוקיי. לכן נראה לי ש בתכנית זו אני יצירת שתי מחרוזות באמצעות GetString. אחד של בשם ואחד נקרא T. ואם הם שווים שווה זה לזה, זה צריך להדפיס "אתה הקלד את אותו הדבר. " אבל elsewise, זה יהיה להדפיס, "אתה הקליד דברים שונים ", נכון? נראה מאוד, מאוד פשוט. אבל, עם זאת, אם אני באמת מנסה לכתוב תכנית זו, נראה כי גם כאשר אני הקלט המדויק אותו מחרוזות, זה עדיין מדפיס, "אתה הקליד דברים שונים! " האם מישהו רוצה לקחת ירה לעבר מדוע תכנית זו תמיד מגיב כי התשומות שונים, אפילו כאשר המילים עצמן הן אותו הדבר? אז אם הייתי input-- אהבת דוד להשתמש דוגמא כמו אמא, נכון? האותיות הקטנות M-O-M עבור S, T שווה M-O-M קטנה. אם רצתי זה דרך קוד ש, למה שזה להדפיס את "שהקלדת דברים שונים?" האם מישהו צריך יותר זמן לחשוב על זה? בסדר, אני חושב שאנחנו טובים. כֵּן? קהל: בסדר, אז זה משהו על שבו הוא מאוחסן בזיכרון, נכון? פרופסור: כן. קהל: איפה זה כמו, אם זה מחרוזת של מאוחסן בזיכרון spot-- אני ממציא זה-- הוא אפס. פרופסור: בטח. קהל: ולא מחרוזת מאוחסן במקום זיכרון, כמו, 167, ולאחר מכן אפס לא שווה 167. פרופסור: בדיוק. אוקיי, אז זוכר את זה מדהים התגלות שהסברנו לך חבר ' בשבוע שעבר, ש מחרוזות לא באמת קיימות? כאשר אנו יוצרים משהו שנקרא מחרוזת אנחנו, במציאות, יצירת משהו שנקרא כוכב char. שכל זה הוא הוא מצביע ל מחרוזת או למערך של תווים. וכך, בדוגמא זו, אם אני היו לקלט M-O-M הדרך כי המחשב שלי היה לאחסן אותו הוא בתוך קו נטוי זיכרון אפס, נכון? אלה ארבעה דמויות, תווים, יהיה מאוחסן במקום כלשהו. ואז אלה ארבעה דמויות, קו נטוי אפס, מאוחסנים במקום אחר, נכון? אין לי מושג איפה את הכתובות הם, שהם אי שם במחשב שלי. אבל אני לא יודע בדיוק היכן הם נמצאים. כאשר אני יוצר מחרוזת ים, כל מה שבאמת הוא מצביע ל להתחיל של מחרוזת זו. וכאשר אני יוצר ערך לא זה, כל מה שהוא מצביע לכאן. וכך, כאשר אתה מנסה להשוות ולבדוק כדי לראות אם זה הוא שווים שווה לt, המחשב הוא באמת רק חוזר ל שלך את הכתובת של מטר זה ואת הכתובת של מטר ש. ובגלל שהם שני פיסות מידע נפרדות המאוחסנים בשני שונה כתובות במחשב שלך, המחשב מעולם לא הולך מזהה אותם כזהה. האם מישהו רוצה לתת זריקה במה שאנחנו היית צריך לעשות אם אנחנו רוצים לתקן זה ויש לי תכנית ריצה נכונה במקום? תחשוב על זה לכמה שניות. מה אנחנו צריכים לשנות ל לקבל תפקוד תכנית זו כפי שאנחנו רוצים אותו לתפקד? כן, רוצה לקחת דקירה על זה? קהל: האם אנחנו יכולים לנסות dereference מצביע ולבדוק באמצעות המערך? פרופסור: זאת דרך אחת לעשות את זה. אז, מה השם שלך שוב? אני מצטער, מזכיר לי. זי: זי. פרופסור: כן, אז מה זי הציע היה בהחלט לעבוד. יָמִינָה? אנחנו יכולים dereference המצביע ובעצם ללכת וגישה נתונים הפיזיים בתוך כאן. ואנחנו יכולים רק להשוות כל המסך. אנחנו יכולים לומר, בסדר, מצביע, תן לי את מה שבפנים כאן. זה יחזור מ '. והייתי אומר, מצביע, תן לי את מה שבפנים כאן. חזור מ '. האם המשחק האלה? כֵּן. אז אנחנו עוברים. אנחנו ממשיכים לבדוק את כל שני מחרוזות כל הדרך עד הסוף ולראות אם אלה הם שווים, אם כל הערכים שווים. ואם כל הערכים שווים, אז אנחנו יודעים בחוטים נכונים. בהחלט, זה איך היינו עושה את זה? האם מישהו מבולבל על כל זה? מושג איך מחרוזות השלמה הם באמת רק מצביעים, ואיך הם לא באמת קיימים? ולמה אנחנו מקבלים שגיאות כמו הדרך בה אנו מבינים את זה? כי אני מבטיח לכם, מצביעים והקצאת מחרוזת וזיכרון הולכים לבוא. כֵּן? קהל: [לא ברור] dereference זה, אתה פשוט לשים כוכב [לא ברור] פרופסור: מימין. אז לderererence אמצעי מצביע ללכת לכתובת זו של המצביע ולקבל את הנתונים, הערך שם. והדרך לעשות זאת היא מצביע כוכב. אל תבלבל את זה. קהל: [לא ברור]. פרופסור: כן. קהל: אז אתה יכול פשוט לכתוב אם לא הכוכב השווה שווה של הכוכב. פרופסור: ובכן, לא. לֹא. קהל: זה לא מספיק טוב, נכון? פרופסור: זה לא, כי אתה רק בדיקת המכתב הראשון. אתה כנראה הולך ל צריך סוג של לולאה ש סובב בין כל דמות בשתי המחרוזות. כֵּן. אז אם אתה רוצה רק כדי לבדוק אם הם התחילו עם אותו הדבר, אתה יכול לעשות אם, כוכב ים הוא שווה לא כוכב. אז אתה יודע שלפחות הם התחיל עם אותה הדמות. כֵּן? קהל: אז הדרך היית שיהיה כמו משובץ ללולאה או מצביע? פרופסור: כן. פחות או יותר רק ללולאה. זכור, דוד בכיתה ציינו הסוכר התחבירי בחינם? והיה לו את זה מאוד דבר מבלבל של T הכוכב ועוד אחד, שבו היה לשלב דרך וזה להזיז את המצביע? הדרך קלה יותר לעשות זה רק לא שלי. אז זה רק מערך. הדרך שהיית צריך ל לולאה שרצה מאפס עד, שבו הוא אני האורך של מחרוזת, אתה יכול פשוט לכתוב שבמקום לעשות מצביע שלם, דבר התייחסות. אז הדברים האלה הם בדיוק מקביל במחשב שלך. אתם יהיו כנראה לא צריך לדעת ש, אבל זה טוב רק סוג של יש בגב את דעתך. רק יודע שהמחשב מכיר בלוקים שונים של קוד כאותו דבר. בגלל זה הוא פשוט הרבה יותר למשתמש ידידותי לנו להציג את זה כמו שזה מערך. זה פשוט קל יותר. קהל: אז להשתמש strlen לאהוב, get-- פרופסור: כן. קהל: אישור. פרופסור: אתה יכול להשתמש strlen או, אם אתה לא היה לי strlen אתה יכול פשוט לעשות את עד שתגיע קו נטוי אפס עבור שניהם. כך או יעבדו. כֵּן. קהל: אז זה לכל dereference תו בודד אם היינו למעשה כתיבת קוד זה, אנחנו רק יכול לעשות סוגריים t i אוהב עם הכוכבים מולו? פרופסור: כן, שווה השווה של הסוגר אני, ולאחר מכן להמשיך לנוע אני מטה עד שתגיע לסוף. כן, זה מה שהיית עושה. ואני באמת אצטרך הבא דוגמא כאשר אנו למעשה לכתוב strlen כך אתם יהיו סוג של מקבל לשחק עם זה קצת. אז כולם ברור רק על זיכרון, מחרוזות, מצביעים, כתובות איכות? כמה מושגים ברמה גבוהים יותר, כי אתה רצון לצורך בטוח לדעת על החידון מָחָר. בסדר. טוֹב. כֵּן. אוקיי, אז דבר אחד שאנחנו גם שואלים אתה, כפי שאנו עושים בכל שנה בחידון, הוא, נניח שאתה שכחת (ש נראים שאנחנו שוכחים לעשות בשנה) בי strlen קובץ הכותרת מוצהר. ולכן אנחנו צריכים לשכתב אותו בעצמנו. הנה רשימה של הנחיות שאנחנו יכולים להציג בפניכם בחורים בו אתה מקבל להניח ש שעות המחרוזת לא תהיה ריקה. אתה יכול להניח שזה יהיה הופסק עם קו נטוי אפס. אז אתה יודע שזה מה ש זה הולך להסתיים ב. ו, למשל, ש אורכו של שלום יהיה חמש. אז אתה יכול להניח ששלום יהיה חמש, H-E-L-L-O. אתה לא צריך להניח ש ישבנה אפס חשבונות לאורך. דבר זה אחרון כאן, לא לדאוג גלישת מספר שלם. האם מישהו זוכר הצפה מה היא מספר שלם? קהל: מעבר ל אורכו של [לא ברור]. פרופסור: כן, אתה יכול להסביר קצת, מה זה אומר? קהל: אז, אני מניח שזה חוזר לדוגמא המקצץ קודם לכן. אבל אם יש לך רק מספרים כל כך הרבה כי מעבר למספר הביטים כי אתה באמת יכול להקצות אותו שזה יהיה פשוט סוג של מנותק. פרופסור: כן, כן הלאה טיפוסי מחשב, כמה ביטים יש לנו? קהל: 32? פרופסור: כן, 32, תקין. ואז זה, מה, ארבעה מיליארדים, שני מיליארדים? ארבעה מיליארדים, עד ארבעה מיליארדים מספרים שלמים וחיוביים, נכון? שני מיליארדים שלילי, שני מיליארדים חיובי, תלוי איך אתה רוצה לעשות את זה. ואז בעצם אנחנו יכולים להיות מספיק מספרים שלמים שיכול לעלות לשתיים עד 31 מינוס 1, נכון? כי ברגע שפגענו שני לה -32, אנחנו לא יש כל כך הרבה זיכרון במחשב שלנו. וכך, באופן תיאורטי, אני יכול לבוא עם מספר כלומר, כמו, שתי לה -46. זה מספר עצום-התחת, אבל תיאורטית אתה יכול. והצפה כך שלם היא אם אתה מנסה ליצור מספר שלם שהולך מעבר למה ש המחשב שלך הוא מסוגל לאחסן. וכך אתם ל דוגמא זו אין לי לדאוג לנו לתת לך ענק מחרוזת שהיא שני לתווי ה -32 אָרוֹך. זה יהיה באמת מתכוון. בסדר, אז אני פשוט הולך לתת לי אתם מבנה הבסיס של זה. אתה הולך ליצור פונקציה שנקראת int strlen בי לעבור ב, כוכב char, או מחרוזת, מצביע למחרוזת בשם של. בסדר, כולם להעתיק את זה. לְהִתְקַרֵר. Oops-- דרך אחרת. אז זה כמו סוג של חתיכה קשה של בעיה, כך אני אתן לכם אולי חמישה ל שש דקות לסוג של סיעור מוחות ולכתוב את הפונקציה הזאת. קהל: אנחנו לא חשבון ל[ לא ברור], אנחנו לא צריכים להשתמש במספר שלם? פרופסור: לא, אתה לא. אני אתן לכם רמז. לולאה בזמן עשויה להיות שימושית מאוד כאן. כֵּן. הנה סוּכַּרִיוֹת. סוכריות תהיה זמינות גם לחידון, אני חושב. אז אתם יהיו כל מסוכרים עד מחר. יכול אני- לך את זה. קהל: אישור. פרופסור: כן. אולי 30 שניות או יותר כך. בסדר, אם אתה לא עשה, אין דאגות. אנחנו נעבור את זה ביחד דרך. אוקיי. אז אני הולך רק הפריסה מבנה בסיסי לפונקציה זו כאן. Int strlen. ראשית, האם מישהו רוצה לספר לי שלי מה מסמל int ש? אנחנו צריכים בפונקציה זו. קהל: strlen [לא ברור]. פרופסור: בדיוק. אז כל מה שקורה כאן, אנחנו צריכים לחזור שלמים. וכפי שצוין ב מפרט, אנחנו רוצים return-- לכו על זה, חבר'ה, רק להמשיך. הכל טוב. לאכול אותו כל כך שאין לי לקחת אותו בחזרה, בעצם. Int פשוט מסמן שאתה הולך להיות חוזר שלם. מה הוא כוכב של char זה? מה הכוונה? קהל: כמו, מה שקלט ב. פרופסור: בדיוק. ומה הוא כמעט אותו דבר כמו כוכב char? קהל: מחרוזת? פרופסור: בדיוק. אז כל מה שאנחנו עושים הוא נותנים זה מצביע למחרוזת. אוקיי. לְהִתְקַרֵר. כמו כן, אל תשכחו, אם אנו שוכחים כדי לתת לך סוגריים אלה, אל תשכחו לכתוב אותם בעצמך. בגלל אופן תיאורטי, את הקוד שלך הוא שגוי אם אתה שוכח לכתוב אותם. פשוט תמיד לשים לב. כמו, דברים קטנים שאתה לא שם לב כאשר אתה מתכנת במחשב הנייד שלך, כי המחשב הנייד שלך עושה את זה בשבילך? אל תשכחו כש אתה כותב ביד. כֵּן? קהל: אבל איך שגוי? כמו, אנחנו מקבלים את כל הבעיה הלא נכונה? פרופסור: לא, לא. אל תדאג. זה בעצם אפשרי תיאורטית כדי שתוכל לקבל את מלוא נקודות על שאלה גם אם הקוד שלך לא לרוץ בחיים אמיתיים. אני מציע שלא אנסה כדי שזה יקרה. לדוגמא, כמו אם הכל זה כאן נכון, אבל אתה שוכח מעי גס או הסוגר, הקוד שלך לא יפעל למעשה. אבל אנחנו יכולים להיות רחומים. כֵּן? קהל: האם יש לך להגיב על כתב היד שלנו? פרופסור: לא, לא, לא דאגות על זה. לא להעיר. סגנון צריך להיות טוב. כמו, לא ללכלך הכל בשורה אחת. אנחנו לא תהיינה מאושרים איתך אם אתה עושה את זה. האם מישהו רוצה תן לי את השורה הראשונה? רמז, זה קל מאוד. כֵּן? קהל: Int, n שווה אפס. רק להגדיר את דלפק. פרופסור: אז אנחנו רוצים קצת סוג של דלפק, נכון? אני רק הולך לשם זה "לספור" למען נוחות הקריאה. מה אנחנו רוצים להגדיר את זה שווה ל? קהל: אפס. פרופסור: כן. נְקוּדָה וּפְסִיק. זה גם נקודה-פסיק ציור מאוד מוזר. רק לתרגל עושה את זה. אז אנחנו רוצים ראשון יש לי דלפק של int הסוג. מכיוון שאנחנו רוצים לספור עד כמה תווים או מכתבים רבים במחרוזת זו, נכון? צעד ראשון מאוד קל. אישור, מורכב אולי קצת יותר עכשיו, איך אנחנו הולכים לעשות זאת? האם מישהו רוצה תן לי את שורת קוד שייתכן שתוכל לעזור לולאה דרך מה זה? כן, נשמה אמיצה בגב? קהל: אוקיי, אז בזמן שנקודה כוכביות, כן, הכוכב של ים, אינו שווה לאפס, ואז לעשות משהו? פרופסור: זה באמת, באמת קרוב. ממש קרוב. אז אני הולך לטפל ב שני דברים עם זה. קודם כל, זה לא בדיוק אפס. מה זה? זה שליחות קטלנית null, שהוא קו נטוי אפס. אז הם שונים ב מבחינת איך הם מאוחסנים. אז אתה ממש קרוב. ושנית, אנחנו לא רוצים רק כדי להזיז את המצביע. אנחנו רוצים בעצם לגשת לערכים, נכון? ואז איך אנחנו עושים את זה? קל מאוד. אל תחשבו על מצביעים, לא חושב על זכרונות. לחזור לשבוע של קורס זה שני. קהל: [לא ברור]. פרופסור: נכון, זוכר? מה הן מחרוזות? איך הם מאוחסנים בזיכרון? קהל: הם העלו. פרופסור: הם העלו. אז איך אנחנו לגשת כל תו בפנים? קהל: [לא ברור]. פרופסור: בדיוק. אז while-- מה הולך בפנים כאן? S של - קהל: I. פרופסור: הו, אני לא קיים, עושה את זה? קהל: הו, נחשב? פרופסור: אנחנו רק יכולים להשתמש ספירה, אנחנו לא יכול? קהל: מצטער, אני קראתי לזה אני. פרופסור: כן, זה הכל טוב. יש לנו משתנים כאן זה כבר הוכרז כדלפק שלנו. אז למה אנחנו לא רק להשתמש בזה כדי לעבור תוך הלולאה? האם זה הגיוני? אז בזמן של של count-- מישהו רוצה לתת לי את מה שקורה אחרי כאן? קהל: זה לא שווה. פרופסור: האם לא שווה, נכון? זה המפץ שווה, סימן קריאה שווה, כל מה שאתם רוצים קורא לזה לא equal-- קהל: [לא ברור]. פרופסור: כן. זכור ציטוט אחד הוא עבור char, מרכאות כפולות הן למחרוזת. היזהר בעת השימוש בהם. לכן, כאשר אנחנו מחפשים דרך המערך, התו האחרון, אנחנו יודעים שאנחנו לא רוצים שזה יהיה קו נטוי אפס. אז בזמן. אנחנו לא בסוף של המחרוזת. מה שאנחנו רוצים לעשות בפנים? קהל: אנחנו רוצים להוסיף ל דלפק אז זה נחשב בתוספת בתוספת? פרופסור: בדיוק. אז הנה אנחנו הולכים לעשות לספור, לספור בתוספת בתוספת. חסר שורה אחת יותר. אנחנו כמעט שם. מה שאנו שוכחים לעשות? קהל: חוזר אפס? פרופסור: אתה רוצה לחזור אפס? קהל: לא, חוזר לstrlen. לַחֲכוֹת. פרופסור: אשר מאוחסן ב? קהל: ספירה. לִסְפּוֹר. פרופסור: בדיוק. אז הנה אנחנו הולכים לחזור ספירה. כי מה שאנחנו עושה כאן ultimately-- יש לנו משתנים נגד זה הולך להגדיל באמצעות המחרוזת שלנו. אנחנו הולכים להמשיך, לשמור הולך, סביב סביב בלולאה זה. ואם אנחנו כבר לא בסוף מחרוזת, המהווה את שליחות קטלנית null. ובכל פעם שאנחנו עוברים זה, אנחנו מוסיפים לדלפק שלנו. ואנחנו הולכים נוספים לאורך במערך זה. ובסופו של הדבר, ברגע שאנחנו פגע בשליחות קטלנית null, אנחנו יודעים, הו, אנחנו יכולים לשבור, להחזיר את הספירה. יש לנו strlen שלנו. האם כולם מקבלים כמה זו יושמה? בעוד loops-- אני יודע שיש לנו לא עשה יותר מדי איתם, אבל הם בדרך כלל מאוד, מאוד שימושי אם אתה לא יודע מה שאתה עוצר מצב בהכרח צריך להיות. שְׁאֵלָה? קהל: האם אנחנו יכולים לכתוב null על המצב בזמן? פרופסור: בעוד? כן, כל כך בבעיה זו שהייתה לי אותך בחורים להניח שזה לא יהיה ריק. כי תזכור, באופן תיאורטי, אם נתתי לך מצביע שהיה גדול מדי של זיכרון, זה ייתן לך את null, נכון? זה מה שההפעלה המערכת תעשה. אז אם לא אמרתי לכם להניח ים יהיה ריק, אתה צריך לבדוק. אז עד כאן, היית עושה, אם זה שווה שווה null, לחזור אחד. משהו כזה. קהל: [לא ברור] אפס. פרופסור: בסדר, אני אגיד לי לך למה אנחנו לא יכולים לעשות את זה. כי יזכור בזיכרון, נכון, כאן. אנחנו נלך כאן. יש לך בלוקים ענקיים זיכרון כל עם רשתות שערכים שונים החנות, נכון? וכך כל מחרוזת הוא-- ל למשל, אם אנחנו רוצים קלט שלום, זה יהיה H-E-L-L-O קו נטוי אפס, נכון? ואז מי יודע, כמו אקראי דברים שהם בכאן אחריו. אנחנו לא באמת יודעים מה יש שם. ולכן אם היה לך לעשות במקום קו נטוי אפס, null, זה לא יכול להיות null. כי זה אולי רק אומר כמה דברים אחרים אקראיים שאינו שייך במחרוזת שלך. ולכן הדרך שאנחנו תמיד יודעים ש מחרוזת מסתיימת היא עם קו נטוי אפס. ואז זה תמיד איך ש בדוק קצה חוט. Null, בכל האמצעים שהם אם יש לך מצביע אינו קיים, קודם כל, או אם הזיכרון שלך הוא פשוט כל כך גדול ש אתה לא יכול להחזיר אותו, אז שזה יהיה ריק. אז להיות זהיר מאוד בעת ההבחנה ההבדל בין null והקו הנטוי אפס. כֵּן. כולם בסדר עם זה? אוקיי. אז היה לי אתם לכתוב את strlen. יתכן אנחנו גם יכולים לשאול אותך לכתוב מתוך לי, זכור כי "Atwoa" או מה שאתם רוצים לקרוא לזה? פונקציה שב Vigenere וקיסר, ש ממיר ערך ASCII למספר שלם? כי יש גם לבוא בחידונים האחרונים פונקציות שכבר ביקשו ממך לכתוב. פחות או יותר כל תפקיד כי אתה כבר בשימוש, והוא קל מאוד לכתוב לעצמך, חיישנים רוצים הוא נמוך, הוא עליון, להוריד, לעליון. פונקציות שתמרנה מחרוזת מאותיות קטנה לאותיות גדולות. כולנו יודעים איך לעשות את זה, נכון? זה די קל. רק רוצה לוודא שאתה can-- זה אותו תהליך המחשבה. אתה פשוט לחזר דרך ואתה פונה דברים. אתה גם לספור או כאשר אתה פונה דברים בצורה שונה. הייתי suggest-- אני לא יודע אם אנחנו הולכים לשאול אותך לשנן מה הון או Z הון, או אותיות קטנות או אותיות קטנות z נמצא בASCII, אבל אני הייתי מציע אולי כותב את זה במקרה אנחנו עושים. רק כך יש לכם התייחסות. כמו אותיות גדולות הוא, מה, 197? ולאחר מכן באותיות קטנות היא כמו 50 משהו. 65, כן, יש לך ללכת. אז פשוט פחות או יותר יודע הבדל ביניהם הוא 32. זה די חשוב. כֵּן. אני טוב בזה? אוקיי. קהל: אנחנו יכולים תיאורטית לכתוב כמה אלה למטה, כמו גם על little-- פרופסור: אתה באופן תיאורטי יכול פשוט להעתיק את הפונקציה למטה. זה נכון. קהל: לא [לא ברור]. יש לך חבר 'גיליון: פרופסור. יש לכם גיליון פתק. אתה יכול להקליד אותה. אתה יכול לכתוב את זה. אתה יכול לעשות מה שאתה רוצה עם זה. כֵּן. אז באופן תיאורטי, אם אתה רוצה, ללכת ל. קהל: [לא ברור] אבל אנחנו לא באמת בהכרח צריך לזכור הערך, אנחנו רק יכולים להשתמש לעליון או ל פונקציה נמוכה יותר, נכון? פרופסור: כן. אבל אם אנחנו נתנו לך שאלה שאומר לכתוב לעליון, אז היית צריך לכתוב את זה. אז אתם יכולים להניח שאתה יש בחורים גישה לכל הפונקציות, אבל אם אתה רוצה להשתמש בו כדי עליון או ל נמוך, מה אתה גם צריך לעשות? קהל: [לא ברור] להשתמש CS50 [לא ברור] פרופסור: האם זה CS50.h? היזהר שם. אז לעליון, להוריד, הוא עליון, הוא נמוך יותר, פונקציות שכרוכות מניפולציה מחרוזת היא כל זאת במסגרת שני Ascii או בספריית המתמטיקה או בספריית המחרוזת. אז אם אתם משתמשים באלה פונקציות, להיות זהירות כדי לזכור לכלול כותרת ש. אז אולי גם משהו שאתה רוצה לכלול בגיליון שלך, מה הן הכותרת? מה הן הספריות אתה כבר משתמש? מה פונקציות בתוך ספריות אלה? זה חשוב. כֵּן? קהל: היה לנו רק שוטר ולעשות hashtag באמצעות לחלוטין כל אות יש לנו אי פעם ראה כמו על כל השאלות? פרופסור: אתה יכול. אני לא יודע כמה מאושר אנחנו הולכים להיות לכיתה חידון שכאשר כל פיסת הקוד הוא פעמיים כל עוד זה צריך להיות. אני לא יודע, אנחנו עלולים להמריא נקודה לסגנון. אבל באופן תיאורטי שלך קוד יהיה תקין. אתם יכולים לצאת שוטר ו רק כולל הכל. זה בסדר גם כן. קהל: [לא ברור]. פרופסור: כן. הייתי מציע לא עושה את זה בכל זאת. כֵּן. קהל: מגניב. פרופסור: שאלה טובה. קהל: אז, במקרה הגרוע ביותר. פרופסור: במקרה הגרוע ביותר. אם אתה לגמרי לשכוח, אתה יכול לעשות את זה. כֵּן. כן, קוד הוא ממש שם. אני משמש n במקום לספור אבל, אתה יודע, מה שצף בסירה שלך. קהל: המתן, כדי ש לא אצטרך hashtag כולל בגלל שאנחנו החל מ int? פרופסור: כן, אני פשוט הנחתי ש התבקשנו לכתוב הפונקציה. אם אתה רוצה להיות בטוח, אתה כנראה יכול לשים אותו שם. אבל אני פשוט לא טרחתי, כן. אני אפילו לא יודע אם אתה צריך ספרייה כל לזה. כי אתה לא באמת מדפיס שום דבר או שום דבר, נכון? כן, אני לא יודע אם אתה צריך ספרייה. אוקיי. זה גם קצת יותר לאורך הקווים של מניפולציה זיכרון. סוג זה של קצת מסובך. תחשוב על זה. יש לך פונקציה שנקראת func. אני יכול בשם זה מה ש, אבל אני בוחר שם את זה func. יש לי אותו מעליי עיקרי. זכור, אתה רוצה להיות פונקציה העיקרית שלך לאחר, אתה רוצה לוודא שאתה כולל אב הטיפוס של הראש. אבל במקרה הזה זה היה כל כך קצר כי הרגשתי שאני רק יכול לכלול אותו על גבי העיקרי. אני לא צריך את האב-טיפוס, כי זה כבר כתב לעיל. אז כל מה שאני עושה בפונקציה העיקרית שלי יוצר x המספר השלם שווה 10. אני מתקשר פונקצית func, ואז להדפיס משהו. ואז זה בעצם מה func עושה. אתם רוצים לחשוב על זה. כי זה קצת מסובך. זה מאוד, מאוד מסובך, למעשה. חושב דרך מה זה תכנית תהיה פלט. אני אתן לכם שתי דקות. דיונים טובים? קהל: כן. פרופסור: כן. בסדר, אז זה מסובך לסיבה. וזו הסיבה שרציתי להביא זה לתשומת לבם של כולם. האם מישהו רוצה לתת לי הצעה, ניסיון? מה היית זה להדפיס? לגמרי בסדר אם אתה טועה. כֵּן? קהל: אני חושב שזה 100 ו אז 10 בשתי שורות נפרדות. פרופסור: ו- 10? האם מישהו יש לי ניחושים אחרים? כֵּן? קהל: אולי רק 10 כי func לא חוזר שום דבר? פרופסור: אוקיי, אז אנחנו יש מספר ניחוש אחד הוא שמספר הניחוש שני הוא רק הולך להדפיס 10 החוצה. האם מישהו יש לי ניחושים אחרים? אוקיי. אז בואו לטייל בזה, נכון? בכל פעם שאתה מקבל פיסת הקוד, לא רק להסתכל על זה ולהיות כמו, אה, זה כל כך הרבה דברים! אני כל כך מבולבל! כמו, להרגיע את עצמך. רק יודע שאתה יכול פשוט להסתכל דרך קו קוד על ידי קו. זה כל מה שזה. זה כמו לקרוא ספר. אז עם כל פונקציה, אנחנו תמיד מתחילים ב ראשיים. אז אנחנו הולכים ל תתחיל בחלל המרכזי int, אפילו התכנית של כבר לרוץ למטה, נכון? התחל בחלל מרכזי. Int x שווה 10. אז אני הולך למחוק זה. אני הולך לצייר את הזיכרון רק כדי ש בחורים סוג של יכולים לראות מה קורה. זכור כאן יש לנו הערימה שלנו? עד כאן יש לנו שלנו ערימה איפשהו כאן. הערימה גדלה, נכון? ובתוך הערימה, יש לך החשמל לתפקד כמו גם כל המשתנים המקומיים החשמל. אז הנה, int x שווה 10. בתוך הפונקציה העיקרית שלנו שאנחנו יצירת משתנה בשם x. אנחנו קביעת ששווה 10. כאן יש לך כמה X, ואתה הגדרה ששווה 10, תקין, בתוך עיקרי. כולם טובים? פוּנקצִיָה. אז עכשיו, בתוך העיקרי שלנו פונקציה, אנחנו קוראים הפונקציה שכתבנו לעיל. אז אנחנו עכשיו להיכנס לפונקציה השנייה. אנחנו הולכים ליצור עוד int משתנה x שווה 100. מה שקורה כאן בערימה? מה קורה כאשר אתה קורא פונקציה שיוצרת משתנים חדשים? מה קורה כאן בערימה? קהל: [לא ברור] ערימות על גבי? פרופסור: כן. אז זה בעצם יוצר עותק. וזה סוג של ערימות על גבי. תחשוב על stack-- ערימה ספרים, ערימה של כלום. ערימות על גבי, ראשונה שבעברה החוצה, תימשך ב, ראשון החוצה. אז זה הולך ליצור x כאן. זה הולך להיות כל משתני funcs. גדול. אז עכשיו יש לנו שני X של שונה ש מייצג שני דברים שונים מאוד. אז אנחנו הולכים להדפיס את המספר השלם של x. אז בואו להדפיס 100, נכון? כי כאן זה 100. אז זה הדבר הראשון שזה הולך להדפיס. כדבר חוזר בפונקציה זו, עכשיו פונקציה ש, קו שבעיקרי נעשה. כולם טובים איתי עד כה? אז אנחנו עכשיו בשתיים מתוך שלושה קווים של הפונקציה העיקרית שלנו. עכשיו אנחנו הולכים לשורה השלישית. אנחנו הולכים printf. מהו x זה בתוך עיקרי? מה זה מייצג? איזה ערך הוא x עכשיו? קהל: 100. פרופסור: זה 100? קהל: עדיין 10. פרופסור: ובכל זאת 10. כֵּן. כי תזכור, ב func, x שווה 100. אבל אם אנחנו חוזרים בחזרה לפונקציה העיקרית שלנו, משתנה שמאוחסן ב מקום אחר על הערימה שלנו. אז עכשיו אנחנו צריכים לחזור ל ערימה העיקרית, רשת חשמל משתנים מקומיים. וכאן x שווה ל 10. וכך אנחנו הולכים להדפיס 10 החוצה. אז היא הייתה תקין לחלוטין. אנחנו הולכים לי תפוקה של 100 ו -10. כֵּן? קהל: כאשר אתה malloc, זה ערימה או המחסנית שהיא [לא ברור]? פרופסור: כאשר אתה malloc, אתה לוקח זיכרון מהערימה והקצאתו. כך שאין לך להתעסק עם כל זה. אז אני מניח שממסעדה הגדולה כאן הוא משהו שנקרא היקף. לאלו מכם שהיו ב פגישת הסקירה אתמול בלילה, דיברנו בקצרה על זה. היקף מגדיר כיצד ו כאשר המשתנים שלך קיימים. או בתוך מה מסגרות לעשות המשתנים שלך קיימים. פחות או יותר את הכלל בדרך כלל אצבע הוא, variables-- שלך אם אתה יוצר אותם בתוך braces-- המתולתל הם קיימים רק בתוך סוגריים מסולסלים אלה. כך למשל בפונקציה שלנו func, אתה רואה שתי פלטות אלה. אם אתה יוצר שום דבר בתוכו, רוב הסיכויים שכל מה שאתה עושה הוא יצירת ערימה ואחסון שיש. אותו דבר בעיקרי. זה רק מאוחסן בתוך עיקרי. גם אתה רוצה להיות מאוד, מאוד זהיר. בגלל היקף גם משאיל עצמו לדוגמאות שונות. אז לדוגמה ל לולאה, לint i שווה 0. אני הוא פחות מ, אני לא יודע, 10. אני פלוס פלוס. ויש לך את קוד הפנימי שלו, נכון? איפה עושה משתנים זה, אני, למעשה קיים רק? רק בתוכך ללולאה. אז אני בטוח שרבים מכם הבחורים יש לי כנראה נתקל שגיאה בעת זו אתה עושה תוכניות בpsets. כמה מכם ניסו להשתמש i מחוץ ללולאה והייתה שגיאה? כמו מספרים שלמים unreferenced או משהו כזה? הסיבה שזה קורה הוא כי כאן אתה יצירת משהו שרק קיים בתוכך ללולאה. ואם אתה מנסה להשתמש בו, אני לא למעשה קיימות מחוצה לו. אז בעצם מחשב אומר, אני לא יודע על מה אתה מדבר. כל מה שאני יודע הוא שאני היה כאן, אבל עכשיו כבר לא. אז אם אני היה ליצור ללולאה בתוך, נכון? ואני הולך ליצור עוד, כמו j int, ויש לו לעשות מה ש. ויש לך את קוד פנימי של לולאה ש, j קיים רק כאן. אבל זה קיים גם בתוכי. וכך j קיים רק בתוך זה ללולאה, ואילו אני קיים בכל הדבר. כולם ברורים? אותו דבר עם הצהרות מותנות אם אתה רוצה ליצור משהו. אותו דבר עם לולאות בעוד שאם אתה רוצה ליצור משהו. זה משהו שיש מאוד, מאוד זהיר לגבי. אז זה היה בעיה ממש טובה ב לחוש שהפגין שני דברים. זה הודגם לראשונה, היקף. וזה הוכיח גם הקצאת זיכרון. מכיוון שאתם צריכים לדעת ש פונקציות לגדול כלפי מעלה בערימה. וכי כאשר אתה קורא פונקציות, אתה יוצר בעצם ערימה חדשה של זיכרון. זה שונה מאוד מ מה הוא זיכרון החשמל שלך. כֵּן. וואו! כולם אישור על זה? זה היה מבלבל. נושאים טובים מאוד לעבור על, בגלל שאתה כנראה הולך לקבל קצת מסובך דברים כאלה על החידון. כֵּן. לְהִתְקַרֵר. אני אשים לך לקבל 100 על אחד קו ולאחר מכן 10 בצד השני. כן, טוב מאוד. אוקיי, עכשיו אתם תקבלו ההזדמנות להיות TAS. אתה מקבל לענות על כל יפה מיילים שאני מקבל לפעמים. אז, אנדי היקר, אני רואה אני חושב שמשהו לא השתבש עם מהדר שלי. אני בטוח שהקוד שלי הוא נכון, אבל אני כל הזמן מקבל שגיאת סגמנטציה בכל פעם שאני מפעיל. מה הולך? אנא עזור, המון אהבה. אם אתם קיבלו משהו כמו כי איך היית מגיב? אלה הם למעשה נפוצים מאוד שאלות שנשאל אותך. האם אם, אנו נספק לך תרחיש, ניתן לנו הניחוש הטוב ביותר שלך על מה שקורה. למישהו יש דקירה במה קורה? כֵּן? קהל: dereferenced אולי null, משהו כמו המצביע הוא מצביע על משהו null. פרופסור: כן, זה יהיה דוגמא כאשר שיקרה. אבל מה התמונה הגדולה יותר ממה שקורה כאן? קהל: האם זה שאתה מנסה לגשת לזיכרון שאתה לא אמורה להם גישה ל? פרופסור: בדיוק. אז לחשוב על אשמת SEG, את גבולות, שטח מוגבל בזיכרון כי אתה לא צריך להיות נוגע ללב. אז די הרבה כאשר אתה מנסה לindex-- כמו למשל, שהכרזת מערך מאפס עד תשע. אבל אתה מנסה לגעת -10 ש ערך, אין לך גישה לזה. מכיוון שאתה לא הכריז עליה. וכך המחשב שלך הולך להסתכל על זה כמו להיות, אה אה, אתה מנסה ללכת מחוץ לגבולות מדד. אני הולך לתת לך אשמת פילוח. תחשוב על כמגזר, נכון? קטע נוסף, האשמה היא כאשר אתה מנסה לפרוץ משהו ואתה לא צריך להיות שם. אשמה היא בכל עת פילוח אתה מנסה לגעת בדברים כי אתה לא צריך להיות נוגע ללב. דוגמאות נפוצות כל כך הן מדד. כמובן, אם אתה מנסה לגעת שהיה ריק, שגם יעבוד גם כן. אם המצביע שלך מנסה לגעת בדברים שלא צריך לגעת, שגם יכול לעבוד גם כן. רוב בדרך כלל תמצאו רואה את זה במערך. כולם טובים? קהל: אז אם אתה רוצה כדי לגשת לנקודת ה -10 ויש רק גבול של תשע או משהו. פרופסור: כן, בדיוק. פחות או יותר. לְהִתְקַרֵר. אנדי היקר. אז יש לנו נפלא אלה דברים בשם מיני. אם מיזוג sort-- כפי ש ראה בדוגמא כאשר דוד עשה את כל דבר בclass-- מדוע, אם זה כל כך הרבה יותר מהר מאשר כל אחד מהמינים האחרים, למה אנחנו אפילו טרחתי לדעת כל אחד מהסוגים האחרים? מה היא שאלה זו באמת שואלת אותך? מה word-- שלוש קהל: מה trade-off? פרופסור: בדיוק. זה מה ששואל את השאלה. מה התחלופה בין מיזוג סוג פסוקים כל מיני אחרים? קהל: לוקח זיכרון, נכון? פרופסור: האם אתה להסביר שקצת יותר? ראשית בואו להסביר חנות מיזוג. איך מיזוג הסוג עובד? קהל: אז זה עובד על ידי חלוקת הכל למחצית ואז לשים אותו ביחד והקצאה מחדש זה כדי, כמו בכל פעם שלמזג את הסטים. פרופסור: די הרבה. אז אני יכול לצייר את זה, אבל זה היית לקחת לי חמש דקות כדי למשוך אותו החוצה. מסתכל אחורה על שקופיות הסעיף שבו אנחנו מכוסים סוג מיזוג. בְּדִיוּק. לכן דרך מיזוג יצירות מסוג זה מחלק דברים במחצית, ואז זה פשוט נראה ב ערכים הראשונים של כולם וממיין רק ש. ברציפות יוצר מערכים חדשים ו מכניס. דברים יותר ויותר על מנת וכך בעוד שבאמת, באמת מהר כי הוא-- אתה יודע, חיפוש בינארי הוא יומן n של n. אתה יוצר כל כך הרבה מערכים שונים שאתה באמצעות כמות עצומה של זיכרון. וכך בזמן שהוא, המסחר מחוץ מהר יותר כאן הוא שאתה משתמש יותר בזיכרון. וכך, רמז, מיני וחיפושים היו מכוסים הרבה יותר השנה ממה שהם היו בשנים קודמות. אתם צריכים לראות את זה בא לידי ביטוי בהתאם על החידון. הייתי בהחלט הולכים לבלות את הזמן על מה כל מיני השונים הם, איך חיפוש בינארי, איך יניארי עבודת חיפוש. איך אולי פסאודו קוד קוד אותם החוצה. מה הם זמני הריצה? משהו כמו פעמים ריצה הוא מאוד קל להעתיק למטה על גיליון פתק, יָמִינָה? זה ממש קשה כשאתה באמצע המבחן ואתה צריך להבין את זה. העתק אותו. אני מבטיח לך שאתה הולך צריך לדעת את זה. מה הן הפשרות? במקרה הגרוע ביותר, תרחישי מקרה הטובים ביותר לכולם, מאוד להכיר. כֵּן? קהל: האם אנחנו צריכים יודע איך קוד מיון מיזוג? כמו, אנחנו צריכים זוכר את רקורסיבית? פרופסור: אני מאוד בספק, פשוט כי זה כמו מסובך למדי. אבל זה לא יכול להיות infeasible אם אבקש ממך להשתמש בפסאודו קוד אותו. כֵּן. כן, בסדר, עוד אחד. זה אולי לבוא ב החתיכה האחרונה שאתה בקצת. כֵּן? האם כולם שמעו את זה? אוקיי, אז די הרבה ראשון של כל מה הסוג, של תכנית יהיה נותנת לך פלט כמו זה? זוכר ששאלנו אותך ללמוד על זה סוג חדש של באגים כלי? מה היה שמו של אותו? Valgrind, תקין זו הייתה תכנית שבי אתה יכול לקרוא לזה יכול לעקוב אחר כל הזיכרון שאתה באמצעות בתכנית שלך וקורה. אז אם יש לך משהו, כמו, בהחלט איבד, 40 בתים בבלוק אחד. כנראה שאתה לא לזכור כדי לשחרר אותו. כי אם אתה משתמש בבתים של זיכרון, זה אומר שאתה כבר נצפה שזיכרון, אבל לא היית מסוגל לשחרר. אז אתה רוצה לעשות בטוח שאתה גם באמצעות free-- זה function-- לשחרר את כל של הזיכרון מוקם מחדש על ידי malloc. לְהִתְקַרֵר. אז שקופית זו, תהיה לי את זה. זה בכל מקום בהרבה הרצאות, בהרבה שקופיות סעיף. אתה באמת רוצה לוודא אתה פשוט יודע את כל זה. או בגיליון הפתק שלך או אם אתה רוצה לזכור אותה, אל תהסס. זה באמת, באמת, באמת חשוב. גם טוב מאוד שאלה שאפשר לשאול. למה הוא מבט sort-- הבחירה ב בחירת sort-- כל זמני הריצה הם n בריבוע. לא משנה כמה הרשימה מגיעה ל אתה כ, אז למה הוא sort-- בחירה אני אתן לכם 30 שני לחשוב על זה. כי זה סוג של מבלבל. זה כרוך קצת מחשבה רעיונית. למה לרוץ הפעמים להיות זהות ב שני תרחישי המקרה הגרועים ביותר והטובים ביותר? כֵּן? קהל: בגלל בחירת סוג כל עמדה או חלל במערך הקטן הזה דבר או משהו כזה. אז גם במקרה הטוב, גם אם הוא מסודרים בצורה מושלמת, זה עדיין היה צריך להיות כמו, אישור, אחד. במקום הראשון שלי יש לי אחד. ולעבור את כולם. אישור, אחד הוא הקטן ביותר. ואז זה הולך שוב וכמו, אישור, שני הוא הקטן ביותר של כל הדברים. אבל זה עדיין יש ל לבדוק כל אחד ואחד. פרופסור: כן. כך למשל, בואו נגיד יש לנו רשימה, כבר מסודרים, מערך אחד לחמש. הדרך שמיני בחירה הוא ש הוא עובר, הוא בודק את שני אלה. אז הוא בודק את שני אלה. ואז הוא בודק, והוא בודק. זה ממשיך לבדוק את כולם, ללא קשר לשאלה אם זה מסודרים למעשה. כי זה פשוט הדרך מהסוג עובד. וכך שאלה זו היא כמו סוג של שאלה רעיונית נבקש. איפה ראשון, לך יודע מה סוג הבחירה הוא, נכון, כדי להיות מסוגל כדי לענות על השאלה. אתה צריך להיות מסוגל להבין מושגית מה קורה. ואז אתה יכול ליישם את זה וחושב, על אישור בואו רק לדמיין תרחיש מקרה הגרוע ביותר. הם כולם בסדר יורד. איך זה ישפיע עליו? מה אם זה עולה כדי? אם זה כבר מסודרים? איך זה ישפיע על זמני הריצה? ולאחר מכן בחירת סוג, תוכל להבחין כי זה לא משנה בעצם. בגלל שאתה בודק את כל ערכים בלי קשר למה שקורה. וכך דברים טובים לזכור. מדוע חלק מהמינים שונים מהאחרים ואיך הכי טוב ותרחישי מקרה הגרועים ביותר היה משפיע על כולם. אני הולך באמת לפגוע במינים משום שיהיה בחידון. כֵּן. אוקיי. יש שש דקות לסיום. אני יכול לקחת את שלוש דקות של שאלות. אני יכול גם להסתובב ל כמו 20 דקות אחרי הסעיף אם אתה רוצה לשאול שאלות גם כן. האם מישהו רק צריך באמת קצר שאלות או בעיות רעיוניות הם לא ברורים עכשיו? כֵּן? קהל: האם אתה יכול לדבר קצת קצת על מפעילים סיביים האופרטור? פרופסור: כן. מפעילים אז סיביים האופרטור הם משהו שאתה כנראה אולי פשוט רוצה לשים על גיליון שלך. אז quickly-- אני לא רוצה ללכת יותר מדי לעומק משום הרווארד, בסקירה שלהם פגישה, כיסתה אותו די טובה. מפעיל סיבי האופרטור, יש חמש מהם, נכון? יש הזה, שהוא x או פונקציה, יש אמפרסנד, אשר הוא ו. צינור, שהוא או. ואז יש לך שני סוגים שונים של משמרות. אם אני נותן לך שני ערכים, אם אני נותן לך, כמו, אחד ואחד. מה זה להעריך ל? אם אני נותן לך נכון ואמיתי, נכון? מה לגבי אמת או שקר? עדיין נכון, נכון? כי יש או. אנחנו ככל הנראה אתן לך מספרים. אז לזכור, אחד שווה נכון, אפס שווה שווא. ואנחנו יכולים לתת לך את הדברים האלה ומבקש מכם לספר לנו מה קורה. הרווארד מכסה אותו בראשון 10 דקות של פגישת המחקר שלהם באמת, ממש טוב. אז אתם רוצים לעשות בטוח שאתה מסתכל אחורה על זה. קהל: האם pisa5 הולך להיות בחידון? פרופסור: מס ' אפילו לא מסתכל על pisa5 עכשיו. זה קשה. רק אפילו לא טורח להסתכל על pisa5. עם זאת, כפי שכמה רמזים והצעות, אני הייתי מציע לך להתחיל pisa5 ברגע שהחידון הוא מעל. זה יהיה הכי קשה שבוע, אבל אז אתם יועבר אותו על הגבעות של גלגול ירוק וגורים, וזה בסדר גמור. מחלקה זו מקבלת משמעותית קל יותר לאחר pset החמישי. שעתי עבודה: קהל הוא יום ראשון, יום שני? פרופסור: כן, אז שעתי עבודה תהיה ביום ראשון ליום השני לpset. שעתי עבודת ערב במהות פשוט יהיה סקירה לחידון. אם מישהו רוצה לבוא ולשאול TAS שאלה, אנחנו נהיה שם. אני אקח את שאלה אולי אחד יותר אם למישהו יש שאלה? כֵּן? קהל: כאשר אתה בלוטות הגדרה, [לא ברור] אם אתה אומר כוכב צומת ולאחר מכן הבא, עושה במחשב באופן אוטומטי מבין שאתה בהתייחסו למצביע אחר? פרופסור: מס ' קהל: יש לך ל לקשר מחדש [לא ברור] זה? פרופסור: אז בעצם struct של צומת, לזכור, זה כמו שאתה יוצר את הצומת ו אז יש לך מצביע בשם הבא. כל מה שאתה עושה הוא שיש המבנה שם. אתה צריך להקצות שהמצביע במקום כלשהו. אז המחשבים לא יודע מה הוא עושה עדיין. אתה צריך בעצם להקצות אותו כש אתה יוצר רשימה המקושרת שלך. וזה מה שבעיקר pset 5 יהיה ב. אז אינו דואג כל זה עכשיו. קהל: אז אנחנו לא צריכים להתמקד יותר מדי על קישור רשימה, רק התפיסה הכללית? פרופסור: רק די הרבה ערימות, תורים, רשימות קישור, עצים, שולחנות חשיש. רק להיות מסוגל לדעת מה הם. אנחנו לא הולכים לשאול אתה רוצה משהו ספציפי כי אנחנו לא באמת עשינו pset שמכסה את כל זה עדיין. אז בשתי דקות האחרונות שלפני אני מגדיר אותך חופשי להרוג את הבוחן הזה. פחות או יותר, כמו, חושב על איך הרבה אתם הגעתם בכיתה זו. אני זוכר ששבוע שני ממעמד זה, חלק מכם לבלות שלוש שעות בכתיבת מים. כמה זמן זה ייקח לך בחורים לכתוב מים עכשיו? 30 שניות, אולי? תחשוב על כמה אתם למדו. CS הוא נושא ממש, ממש קשה. אין ספק בזה. זה קשה, זה למה אף אחד לא חוקר אותו. זה פשוט קשה. וזה לגמרי בסדר. ואני באמת גאה ש כולם עשה את זה רחוק זה. Psets לא קל. הם לוקחים הרבה זמן. אתם, אני לעולם לא אבקש ממך לכתוב המשחק של 15 או Vigenere על pset. אין צורך רק כדי להתחרפן על זה. כל מה שאנחנו בודקים כאן הוא להעריך הידע הרעיוני שלך, כמו גם כחלק מהמיומנויות הבסיסיות שלך של קידוד. הבדיקה נועדה ל להיות ממש מאתגר. כמו, הוא נועד לך לא לקבל 100. זה גם נועד לך כנראה לא תוכל לסיים בדקת ה -75. וזה לגמרי בסדר. אני סטודנט בעצמי. אני יודע, אני שונא את זה כשאני הולך מתוך חידון להיות כמו, חרא. זה היה ממש קשה. כנראה מה שקורה ל happen-- וזה בסדר לגמרי, אני אומר לכם עכשיו. האמצעים על הדברים האלה אינם גבוהים כלל וכלל. ולאלה מכם ש כבר מקבל, כמו, שלשות בסטי הבעיה שלך, זה לא אומר שאתה הולך לקבל 60 אחוזים בכיתה זו. אם אתה מקבל 60% על חידון, שלא אומר שאתה הולך תקבל D בכיתה זו. אנו רואים, במיוחד אני, ל אלו מכם בסעיף שלי, אני רואה כמה קשה לכם כל עובד. ואני לעקוב אחר ש. אתם יהיו בסדר. אין זיכרון מוסדי של אושר בסוף הסמסטר. כי כל ילדי הרווארד אומרים לי החברים שלהם, אה, אתה תהיה בסדר. אף אחד לא אומר לכם את זה כאן. אז אני חייב לומר לכם שכאן. אתם יהיו בסדר. אני כל כך גאה בכולכם. המבחן יהיה קשה. ללמוד על זה, ולאחר מכן רק לזרוק אותו. תתכונן ללמוד דברים חדשים. ולאכול ממתקים. יש לנו יש לי המון ממתקים. לישון טוב בלילה. לא לא לישון, כי זה יהיה ממש רע. CS הוא הרבה היגיון. אם אתה לא ישן, אתה לא יכול לתפקד, והמוח שלך לא יכול לתפקד. ואני אהיה כאן לצד 20 דקות אם מישהו רוצה להסתובב. אתם הולכים להרוג אותו. בהצלחה.