[מוסיקה מתנגנת] דוד י מלאן: בסדר. זהו CS50 וזה הוא תחילת השבוע 2. ואתה זוכר שבמשך בני הזוג של השבועות האחרונים, הצגנו מחשב מדע, בתורו, תכנות. והתחלנו את הסיפור בדרך של Scratch, ששפה גרפית מ מעבדת המדיה של MIT. ואז ולאחרונה, בשבוע שעבר, עשה לנו להציג א א higher-- שפה ברמה נמוכה ידועה כמו C, משהו שהוא גרידא טקסטואלי. ואכן, הפעם האחרונה שאנחנו בחן בתוך ההקשר מספר מושגים. כזכור, זה, היה מאוד התוכנית הראשונה הסתכלנו. תוכנית זו, בפשטות, מדפיס, "שלום, עולם". אבל יש כל כך הרבה קסם לכאורה קורה. יש זה #include עם סוגריים משולשים אלה. יש int. יש (void). יש סוגריים, סוגריים מסולסלים, חצי נקודות, ולכן הרבה יותר. וכך, לזכור כי הצגנו Scratch כדי שנוכל, באופן אידיאלי, לראות מעבר תחביר זה, הדברים האלה באמת לא כל מה אינטלקטואלי מעניין אבל בשלב מוקדם הוא, בהחלט, קצת מסובך כדי לעטוף את דעתך. ואכן, אחד הנפוץ ביותר דברים מוקדם בכיתת תכנות, במיוחד עבור אלה פחות נוח, היא מתוסכלת והכשיל ידי תחבירי מסוים שגיאות, שלא לדבר על שגיאות לוגיות. וכך בין מטרותינו היום, למעשה, יהיה להיות לצייד אותך עם כמה טכניקות לפתרון בעיות עבור כמה עדיף לפתור בעיות בעצמם בצורה של באגים. ואתה זוכר, מדי, כי הסביבה הצגנו בפעם האחרונה נקראה CS50 IDE. זוהי תוכנה מבוססת אינטרנט מאפשר לך לתכנת בענן, כביכול, תוך שמירה על כל שלך קבצים יחד, כפי שאנו שוב יהיו היום. ולהיזכר שאנחנו ובקר נושאים אלה כאן, ביניהם פונקציות, ולולאות, ו משתנים, ביטויים בוליאני, ותנאים. ובעצם עוד כמה שאנחנו תורגם מהעולם של Scratch לעולם של ג אבל הבניין הבסיסי בלוקים, כביכול, באמת עדיין היו באותו השבוע שעבר. למעשה, אנחנו באמת פשוט היו חתיכת פאזל שונה, אם תרצה. במקום כי סגול להציל לחסום, אנחנו במקום היה printf, שהוא פונקציה זו ב- C כי מאפשר לך להדפיס משהו ולאתחל אותו על המסך. הצגנו את CS50 ספרייה, שבו אתה יש כיום get_char לרשותך, ו get_int, ו get_string, וכמה פונקציות נוספות כמו טוב, באמצעות שבו אתה יכול לקבל קלט מהמקלדת של המשתמש עצמו. וגם לקחנו מבט הדברים כמו these- bool, ו char, פעמיים, לצוף, int, מחרוזת long_long. ויש גם סוגי נתונים אחרים ב C. במילים אחרות, כאשר אתה מצהיר משתנה לאחסן ערך כלשהו, או כאשר אתה מיישם פונקציה המחזירה ערך כלשהו, אתה יכול לציין מה סוג של ערך זה. האם מקבלת מחרוזת, כמו רצף של תווים? האם מדובר במספר, כמו מספר שלם? האם זה נקודה צפה ערך, או משהו דומה? אז ב- C, בניגוד Scratch, אנחנו בעצם החל לציין איזה סוג של נתונים היינו חוזרים או משתמש. אבל, כמובן, אנחנו גם התנגשנו כמה גבולות יסוד של מחשוב. ובפרט, זה בשפת C, כזכור שלקחנו מבט גלישה נומרית, המציאות שאם יש לך רק כמות הזיכרון סופית או, במיוחד, מספר סופי ביטים, אתם יכולים לסמוך כל כך גבוהים רק. וכך הסתכלנו בדוגמה זו כאן לפיה מונה במטוס,, למעשה, אם פועל די זמן יכול היה על גדותיהם לגרום תוכנה שגיאת פוטנציאל פיזית ממשית. גם הסתכלנו צף חוסר דיוק נקודה, המציאות כי עם רק מספר סופי ביטים, אם זה 32 או 64, ניתן לציין כל כך הרבה מספרים בלבד אחרי נקודה עשרונית, ואחרי זה אתה מתחיל לקבל מדויק. כך למשל, שליש ב עולם כאן, בעולמנו האנושי, מה שאנחנו יודעים הוא רק מספר אינסופי של 3s לאחר הנקודה העשרונית. אבל מחשב לא יכול בהכרח מייצג מספר אינסופי של מספרים אם אתה רק לאפשר לו כמה כמות המידע סופית. אז לא רק אנחנו לצייד אותך עם כוח גדול במונחים איך אתה יכול לבטא את עצמך מקלדת מבחינת תכנות, אנחנו גם מוגבלים מה אתה יכול לעשות בפועל. ואכן, באגים וטעויות יכולים לנבוע מיני סוגיות אלה. ואכן, בין הנושאים היום הולכים להיות נושאים כמו באגים ולמעשה מחפש משהו מתחת למכסה המנוע כיצד הוכנסו דברים בשבוע שעבר הם למעשה מיושמים כך שאתה טוב יותר להבין הן את היכולות של ו המגבלות של שפה כמו ג ואכן, נצטרך לקלף את השכבות המבנה הפשוט של נתונים, משהו שנקרא מערך, אשר Scratch קורית מכנה "רשימה." זה קצת שונה בהקשר זה. ואז אנחנו גם נכיר אחד הראשון של בעיות ספציפיתלתחום שלנו ב CS50, העולם קריפטוגרפיה, אמנות ערבול או הצפנת מידע כה כי אתה יכול לשלוח מסרים סודיים ולפענח מסרים סודיים בין שני אנשים, A ו- B. אז לפני המעבר אנחנו לעולם החדש, בואו ננסה לצייד אותך עם כמה טכניקות שבה ניתן לחסל או להפחית לפחות חלק של תסכולים כי אתה כנראה נתקלת במהלך השבוע האחרון בלבד. למעשה, לפני שאתה such-- חלק הבעיות הראשונות שלך ב C. ואת רוב הסיכויים הם, אם אתה אוהב אותי, בפעם הראשונה אתה מנסה להקליד את תכנית, גם אם אתה חושב בצורה הגיונית התוכנית היא פשוטה למדי, ייתכן מאוד גם פגע בקיר, ו המהדר לא הולך לשתף פעולה. הפוך או קלאנג לא הולך למעשה כדי לעשות את ההצעה שלך. ולמה זה יכול להיות? ובכן, בואו נסתכל, אולי, תכנית פשוטה. אני הולך קדימה, לשמור את זה ב קובץ בשם בכוונה buggy0.c, כי אני יודע את זה להיפגם מראש. אבל אני לא יכול להבין שאם זה היא התכנית הראשונה או שנייה או שלישית כי אני בעצם עושה את עצמי. אז אני הולך קדימה, להקליד, int main (void). ואז בתוך הסוגריים המסולסלים שלי, מאוד מוכר ( "שלום, בעולם-- מהלך סרק, n ") - וא-פסיק. שמרתי את הקובץ. עכשיו אני הולך לרדת כדי חלון המסוף שלי וסוג לעשות buggy0, כי, שוב, השם של הקובץ היום הוא buggy0.c. אז אני מקליד לעשות buggy0, Enter. ואה, אלוהים, זוכר מהפעם הקודמת שאף הודעות שגיאה הוא דבר טוב. אז לא פלט הוא דבר טוב. אבל כאן יש לי בבירור כמה מספר טעויות. אז השורה של הפלט הראשון לאחר הקלדת לעשות buggy0, כזכור, הוא פלט מפורט למדי של קלאנג. מתחת למכסה המנוע, IDE CS50 מוגדר להשתמש חבורה שלמה של אפשרויות עם מהדר זה כך שאתה לא צריך לחשוב עליהם. וזה כל מה השורה הראשונה אמצעי שמתחיל עם קלאנג. אבל אחרי זה, הבעיות מתחיל להפוך את המראה שלהם. Buggy0.c על קו 3, אופי 5, יש טעות גדולה, אדומה. מה זה? במשתמע להכריז פונקצית ספרייה printf עם int סוג (char * const, ...) [-Werror]. זאת אומרת, זה מהר מאוד אהיה מאוד מסתורי. ובוודאי, בהתחלה מבט, לא היינו מצפה ממך להבין את מכלול ההודעה. וכך אחד הלקחים היום הוא הולך להיות כדי לנסות להבחין דפוסים, או דברים דומים, לטעויות שאולי יש לך נתקלו בעבר. אז בואו ננסה להפריד רק את המילים האלה כי נראו מוכרות. The Big, השגיאה האדומה ברורה סמלי של משהו לטעות. במשתמע להכריז printf פונקציה הספרייה. אז גם אם אני לא ממש מבין מה במשתמע להכריז פונקצית ספרייה אמצעי, הבעיה ללא ספק מתייחס printf איכשהו. ואת מקור הבעיה קשור להצהיר על כך. הכרזה על פונקציה היא להזכיר את זה בפעם הראשונה. ונהגנו המינוח בשבוע שעבר של הכרזה על אב הטיפוס של פונקציה, גם עם קו אחד בראש שלך קובץ לבד או קובץ כותרת שנקרא. ובאיזה קובץ עשה אנו אומרים printf בשבוע שעבר כי הוא ציטוט, סוף ציטוט, הכריז? באיזה קובץ הוא אב הטיפוס שלו? אז אם אתה זוכר, הדבר הראשון שאני מוקלד, כמעט כל תוכנית הבאה-- האחרון ובטעות רגע לפני נכתב הקלדת myself-- היה כאן-- אחד זה hash-- #include