>> [音樂播放]
戴維·J·馬蘭：好吧。
這是CS50，這 是2週的開始。
所以，讓我們開始今天的錯誤。
當然是一個錯誤，是一個 錯誤的程序，
你會得到很 熟悉這個概念
如果你從來沒有編 前。 pset0現在PSET1。
但是，讓我們考慮的東西 一點簡單的在第一。
這個程序在這裡，我 扔一塊兒了，
我說這應該打印 10星用printf在屏幕上，
但它顯然Buggy在某種方式。
>> 由於規範 它應該打印10分，
但它並不明顯，什麼 你會宣稱是錯誤嗎？
是嗎？
所以，這是一個關閉一個錯誤， 和你是什麼意思？
行。
優秀的。
因此，我們已經指定了 開始的零值，因為我，
我們已經指定了10的n值， 但我們使用小於或等於。
其原因，這是二 字符，並且不只是一個符號
就像在數學書， 是你沒有
表達的一種方式 一個字符等效的。
>> 因此，這意味著小於，但 如果你從零開始計數，
但你算一路 透過和等於10，
你當然要去的 算上11事總。
所以你要打印11星。
那麼，什麼可能是這個修復？
是嗎？
>> 因此，只要調整比較少 或等於剛小於，
這裡面的，我要求，或許 另一種解決方案，也。
什麼可能，否則你做什麼？
是嗎？
>> 所以啟動它等於1，且 離開大於或等於以下。
坦率地說，我會要求 ，對於一個典型的人，
這可能是更直接的。
從1開始計數， 經過10計數。
從本質上講做你的意思。
>> 但實際情況是在 編程，正如我們所看到的，
計算機科學家和程序員 一般都從零開始計數。
因此，這是一次精品 你要去適應它。
你的情況一般會 是這樣的不足。
所以，一個簡單的邏輯 的錯誤，我們現在可以
修復並最終重新編譯 這一點，得到的只是10。
>> 以及怎麼樣在這裡這個bug？
在這裡，再一次，我要求我有 打印10 stars--的目標
每行這段時間的，但事實並非如此。
之前我們提出什麼 該修復程序，這是什麼
打印的視覺，如果我是編譯 並運行這個程序，你覺得呢？
是嗎？
>> 星。
因此，所有的星星 同一條線路是我聽到的，
，然後換行字符。
所以讓我們嘗試。
因此，讓越野車-1，輸入， 我看到了鏗鏘的命令
我們談到了最後一次。
./buggy-1，而事實上我看到的所有10位明星 上，即使我要求在同一行
在我的標準只是一個註釋之上 我打算做一元的代碼
線。
但是，這看起來是對的。
>> 現在，第15行它看起來像我 打印一個明星，然後行16
它看起來像我打印 新行字符，
和他們倆都是這麼縮進 我是清楚的循環裡面。
所以我不應該做的明星，新的 行，明星，新的生產線，明星，新的生產線？
是嗎？
>> 是啊，不像語言類 Python的，如果你是熟悉，
壓痕不 不管到計算機。
它只關係到人類。
所以，在這裡，而我發明線 15 16--，看起來很美，
但計算機不關心。
計算機在乎 實際上有大括號
圍繞這些代碼行。
>> 因此，它的clear--就像在 Scratch--那些兩行代碼
應該被執行。
像那些黃色的划痕難題1 件再，再而三。
>> 所以，現在如果我重新運行該 program-- ./buggy-2--嗯。
我現在有一個錯誤。
什麼我忘了怎麼辦？
是啊，所以我沒有編譯它。
因此，讓越野車-2。
因為我沒有沒有這樣的文件 實際編譯的第二個版本。
所以，現在有趣 未聲明的變量 - 不是2。
我們正在做的1。
讓越野車，1-- ./buggy-1--現在 其中的每一種在同一行上。
>> 現在有一個例外 我的這個假設索賠
你需要這些大括號。
當實際上是OK--如果你 注意到，在部分或textbooks--
省略大括號？
是嗎？
>> 沒錯。
當只有一個 行代碼，你
要與相關的 環路中的第一實施例。
這是完全合法的 省略花括號
就像那種方便的 從編譯器給你。
是嗎？
這個問題問得好。
這是否算是一種風格的錯誤？
我們會promote--在CS50 風格指南，網址為這
在pset1--總是 使用花括號。
當然，如果你是新來編程。
現實情況是我們不 要禁止你
在做這些的便利。
但如果你剛開 事物的搖擺，
絕對只是一直用花 牙套，直到你得到它的竅門。
這個問題問得好。
>> 好吧。
使當時的錯誤。
至少在一些相當簡單的。
然而，你可能會認為這 是相當簡陋的，對不對？
這是排序第一週 看著語言
像，看到你的錯誤在其中。
但現實是這些 實際上代表
一些很可怕的問題 可能出現在真實世界中。
>> 所以，有些人可能還記得 如果你遵循科技新聞，
或者甚至抓 這個二月的風
過去這一年，蘋果已經對 在內部監督辦公室做了一點錯誤，
在操作系統上 他們的電話，並且還
的Mac OS，操作系統 在他們的台式機和筆記本電腦。
而你看到這樣的頭條新聞，因為這。
此後，蘋果 答應來修復這個bug，
並很快做了修復它在iOS中， 但最終固定在它的Mac OS
為好。
>> 現在，所有這些頭條實在孤獨 揭示了什麼潛在的問題是，
但這個錯誤最終被減少到 在SSL中的一個bug，安全套接字層。
而且長話短說， 這是軟件
我們的瀏覽器和其他 用軟件做什麼？
>> 如果我說，SSL是 參與，只要你
參觀以https開頭的URL， 那麼什麼樣的SSL可能涉及到？
加密。
因此，我們將討論 這在未來的日子裡。
加密的藝術 擾碼信息。
>> 不過長話短說，蘋果 前一段時間做了一個錯誤
在實施SSL，則對 軟件，最終實現
如HTTPS或最大的網址 連接也有。
其結果是，你的 連接可能潛在地
被截獲。
和你的聯繫十分 不一定加密
如果你有一些壞傢伙之間 你和目標網站誰
知道如何利用這一點。
>> 現在，蘋果最終發布 一種用於此修復最後，
和描述 他們修復了這一點。
安全可靠的運輸無法驗證 連接的可靠性。
這個問題是由處理 恢復丟失的驗證步驟。
>> 所以這是一個很有一手波浪的解釋 對於簡單的說，我們搞砸了。
從字面上有1 那是bug的代碼行
在他們的SSL實現，並 如果你去網上搜索這個
你其實可以找到 原來的源代碼。
舉例來說，這是一個屏幕截圖 只是一個相當大的文件的一部分，
但是這是一個很明顯的功能稱為 SSL驗證簽名的服務器密鑰交換。
它採用了一堆 參數和輸入。
而且我們不會把重點 太多的細節在那裡，
但如果你專注於裡面的代碼 在最上面的函數 - 讓我們的
放大了。
你可能已經懷疑 什麼樣的錯誤可能
甚至，如果你不知道 最終你要找什麼樣的。
有一種異常的 在這裡，這是什麼？
>> 是的，我真的不喜歡 兩轉到了一下失敗。
坦白說，我真的不知道該怎麼轉到 失敗的方法，但有兩個人
背靠背。
那種只是蹭到了我 理智上走錯了路，
而事實上，如果我們放大 只是那些線條，這是C。
>> 所以很多蘋果的代碼 本身是用C寫的，
這顯然是 真是equivalent--
不是那個漂亮的壓痕 版本，但如果你承認這個事實
那有沒有花括號，是什麼 蘋果真的寫的是看起來代碼
像這樣。
所以我已經縮小了，我只是 固定在這個意義上的壓痕
如果沒有大括號，即 第二頁轉到失敗那是在黃
將要執行的無論什麼。
它沒有關聯 如果條件上面。
>> 因此，即使再次，如果你不是很 明白這可能可能
是幹什麼的，知道每種 條件 - 每個行
是一個非常重要的步驟 在檢查的過程
如果您的數據實際上是加密的。
所以跳過這些中的一個 步驟，不是最好的主意。
>> 但是因為我們有這個 黃第二的goto失敗，
因為一旦我們 那種美感
它移動到左邊的地方 在邏輯上是目前，是什麼
這是否意味著該行 以下是第二頁轉到代碼
失敗，你會想到什麼？
它總是會被跳過。
所以goto方法是在一般不贊成 對於原因，我們也不會真的去成，
而其實在CS50，我們往往不 教這一說法跳轉，
但你能想到的後藤 失敗的意思去跳
在代碼的其它部分。
>> 換句話說跳過 最後一行共，
所以這個愚蠢的結果 簡單的錯誤，只是
大概有人的結果 複製並粘貼1太
多次的是，在整個 的iOS和Mac OS的安全性
是很容易被截獲 壞傢伙相當長的一段時間。
直到蘋果最終解決了這個問題。
>> 現在，如果你們中的一些實際上是 運行舊版本的iOS或Mac OS中，
你可以去gotofail.com這 是一個網站，有人成立
基本上確定 編程
如果你的電腦仍然是脆弱的。
坦率地說，如果是這樣， 它可能是一個好主意
更新您的手機或 您的Mac在這一點上。
但是，只要證明是多麼的 這些較低層次的欣賞
細節及公平 簡單的想法真的可以
轉化為決策 和問題
affected--在這個case-- 數以百萬計的人。
>> 現在的政府的話。
部分將於本星期日。
你會被收到一封電子郵件， 週末約部分，在這一點
切除過程 將開始，如果你已經
意識到你現在有 一些新的矛盾。
所以，這種情況每年都有，而我們 將在未來的日子容納前來。
>> 辦公室hours--做一個守 眼睛在這裡時間表。
本週改變一點點， 特別是在開始時間
和位置，所以諮詢 在前往上班時間前
任何在未來四年夜。
現在就評估一個字， 特別是當你潛入問題
設置一個和超越。
>> 所以每說明書中， 這些通常是
軸沿 我們評估你的工作。
範圍指的是什麼 程度的代碼實現
所需的功能 我們的規範。
換句話說，有多少 一塊一套做你咬掉。
你做了它的三分之一， 半吧，它100％。
即使是不正確的， 你有多少嘗試？
以便捕獲水平 的努力和量
為您咬下了 問題集中的問題。
>> Correctness--這其中，以 什麼程度，是你的代碼
與我們一致 規格和免費的錯誤。
所以它正常工作？
如果我們給它一些投入，做它 給我們，我們期待的輸出？
設計 - 現在，這是第 特別是在定性的人，
或者需要人為判斷的人。
事實上，這就是為什麼我們有一個工作人員 這麼多的教學研究員，當然
助理。
到什麼程度是你的 代碼寫得好？
>> 而這同樣是一個非常 定性評估
這將與您合作 雙向的幾週裡。
所以，當你得到不 只有數字得分，但也
書面的分數，或鍵入反饋， 或書面反饋的英語單詞。
這就是我們將用它來驅動你 對實際編寫更好的代碼。
並在演講和節中，我們將嘗試 來點out--因為我們can--經常
是什麼讓一個程序，不僅 正確的和功能良好，
同時也精心設計。
最有效的可能是，或 即使是最美麗也可以是。
>> 這使我們的風格。
風格最終是 審美判斷。
你選擇好 名稱的變量？
你有沒有適當的縮進你的代碼？
它是否好看，因此， 是很容易讓另一個人
看你們各自的 它的正確性。
>> 現在一般按教學大綱，我們得分 這些東西對一個五點量表。
讓我費盡心思點 這三個確實是不錯的。
很快做伙計 開始做算術。
當他們得到四分之三的 五張正確性一些PSET
他們認為該死的，我要60％ 它本質上是一個D或大腸
>> 這是沒有辦法的辦法，我們 認為這些數字。
一個三確實不錯，而我們 普遍預期在開始
這個詞的是，如果你要 一堆three's--的，也許一對夫婦
展覽會，一對夫婦的fours--或 一對夫婦的兩歲，一對夫婦fours--的
這是一個良好的開端。
所以，只要我們看到 向上的軌跡隨著時間的推移，
你在一個特別好的地方。
>> 我們使用公式 重的東西基本上是
這每教學大綱， 這只是意味著我們
給予更多的權重正確性。
因為它往往正確性 這需要的時間最多。
現在相信我。
你會find--至少 在一個pset--你
花90％的時間 處理問題的10％。
>> 和一切形式的作品 除了一個或兩個錯誤，
而這些都是錯誤的 遲到讓你徹夜難眠。
這些是那些 那種逃避你。
不過，睡在它之後， 或參加工作時間
或問問題網上，被 當你到了100％的目標，
這就是為什麼我們重 正確之最。
設計有點少，和 款式比少一點。
但請mind--風格 也許是最簡單的
這些咬掉 按風格指南。
>> 而現在，一個更嚴重 注意，學術誠信。
CS50擁有的不幸區別 是AD板的最大生產國
案件幾乎每年都有歷史。
這並不是因為學生作弊 CS50任遠遠超過其他類，
但因為由工作性質， 事實上，它是電子，
事實上，我們尋找它， 其實我們是計算機科學家，
我可以說，我們是不幸的 在檢測是非常好的。
>> 那麼這意味著什麼實質？
所以，按照教學大綱， 課程的理念
確實歸結為是合理的。
之間有此線 做一個人的工作，在自己的
並獲得一點點 從朋友合理的幫助下，
和徹底的做這件工作你 朋友，或者送他（她）你的代碼
因此，他或她可以簡單地 採取或借用它的權利。
和橫交線 我們在課堂上畫。
>> 你看，教學大綱 最終的行
我們畫的是合理的 不合理的行為，
但它確實熬 下到實質
你的工作需要，以 是你到底自己。
現在，隨著中說， 有一種啟發式。
因為你可能imagine-- 從辦公時間和視覺效果
和影片，我們已經 由此顯示far-- CS50
的確意味著是作為協作 並為合作和社會
越好。
由於協作，因為它是嚴格的。
>> 但是，與此說，啟發式， 您將在教學大綱看，
是，你有一些問題的時候。
你必須在你的代碼中的一些錯誤，你 解決不了，這是合理的你
展現你的代碼給別人。
有朋友甚至在課堂上，一個朋友 坐在辦公室時間在你旁邊，
或工作人員中的一員。
但他們可能不是他們的代碼給你看。
>> 換句話說，一個 回答你的question--
我需要幫助 - 是不是哦，這是我的代碼。
看看這個和 從中推斷出你的意願。
當然，現在，有 辦法明確，以遊戲
這個制度，我會告訴你 我有一個問題，之前的代碼。
您能告訴我，我的代碼 之前，有一個問題。
但再次看到教學大綱為 的這條線是精細度。
>> 只是現在畫的圖片， 分享盡可能透明
在這裡我們是在近年來 這是AD板的個案數目
該CS50擁有超過 在過去的七年。
有14個情況下，這最新的秋季。
在所涉及的學生而言， 這是一些20多名學生
過去的這個秋天。
有33峰 學生在幾年前。
其中許多人是不幸的 這裡不再在校園裡。
>> 由於所涉及的百分比學生 類歷史上從0％不等
到5.3％，這是唯一的說 每年，這是一個挑戰。
而為了實現這一目標，有什麼 我們想要做的是傳達1
我們dd--只是FYI--在比較 公平性，以誰的學生
在下面的相應行。
我們做的比較全電流 提交對所有過去的任務
從過去的許多年。
>> 我們也知道如何圍繞谷歌 並找到代碼庫
在網上，論壇 在線招聘網站在線。
如果一個學生能找到它，就一定能夠 發現它就像我們遺憾地做。
所以，你會在看大綱 雖然這是遺憾的條款。
我可以肯定的 明白了，我們都有
工作人員已經做了類似課程 這一點，或者這個本身隨著時間的推移，
當然知道是什麼感覺時， 生活變得在當你有辦法
一些深夜deadline-- 不僅在這個類中，
但another--你的時候 完全喪失，壓力太大了，
擁有過多數量 其他的事情要做。
你會在某個時刻 生活中肯定是不好的，也許遲
晚上的決定。
>> 所以每教學大綱， 有這一條款，
這樣，如果在72小時內作出的 一些貧窮的決定，你自己到它
並伸出手給我， 的過程中的一個頭
我們會好好聊聊。
我們會處理事情 在內部的希望
它變得更加的 教學時刻或生命的教訓，
而不是用 特別厲害的後果
你可能對這些圖表在這裡看到。
>> 所以這是一個非常嚴肅的口氣。
讓我們停下來只有幾 秒打破了緊張局勢。
>> [音樂播放]
>> 戴維·J·馬蘭：好吧， 因此，如何是一個SEGUE？
今天的主要話題。
其中第一個是抽象。
另外，其中將要成為 數據，其中坦白的表示
是說如何在真幹，才能 去解決問題和思考
對解決問題？
所以，你看到的划痕，而且你已經 用C見過也許已經在PSET1
你不僅可以使用 函數，如printf，
其他人在 過去幾年裡為你寫的。
您也可以編寫自己的函數。
>> 而且即使你可能沒有 C語言中PSET1做到了這一點，並坦言
你並不真的需要寫你 自己的功能，因為problem--
而或許是艱鉅的 第一glance--你會看到
可最終被解決 不是所有的多行代碼。
但隨著中說，在條件 編寫自己的功能，
意識到ç確實給 你這種能力。
>> 我要進去了今天的源代碼， 它可已在網上，
而我要繼續前進，開 一個調用的函數0.C程序，
和在功能零 我們會看到一些東西。
在通過第18行 23是我的主要功能。
而現在，我們正在開始閱讀 我們不是寫在飛行中的代碼，
而是我已經寫了提前 或者你在一個問題集
可能會收到有 被預先寫入。
一個很好的方式開始 閱讀別人的代碼
為尋找主要功能。
找出其中的條目 點是要運行的程序，
然後從那裡跟隨它在邏輯上。
>> 所以，這個方案顯然版畫 你的名字後面加上冒號。
然後，我們使用的GetString 從CS50庫
得到一個字符串，或一個單詞或詞組 從設置在鍵盤的用戶。
再有就是這個 事情這裡 - PrintName。
>> 現在PrintName不是 功能自帶的三
這不是標準的io.h.
這不是在CS50.h.
這是相當在同一個文件。
請注意，如果我向下滾動 àbit--線25 27--
它的評論只是一個漂亮的方式 用星星和斜線你的代碼。
這是一個多行 評價，而這僅僅是
我的藍色說明 這個函數的作用是什麼。
>> 由於線28到31， 我寫了一個超級簡單的功能
他的名字是PrintName。
這需要多少 論證會說什麼？
因此，人們argument--，因為有一 參數括號內上市。
它的類型為String。
這是說PrintName 是這樣的黑盒子
或函數，它接受 輸入一個字符串。
>> 而該字符串的名稱 方便地將名稱。
不是S，而不是N，但名稱。
那麼什麼是PrintName辦？
這是不錯的簡單。
正如一行代碼 中的printf，但顯然它
打印出“你好，”某某。
凡某某 來自說法。
>> 現在，這是不是在這裡一個巨大的創新。
說真的，我已經採取了一個程序，可以 已被寫入同一個代碼行
通過把這個在這裡， 並改變了它的東西
這涉及到一些六，七左右 代碼行一路下來這裡。
>> 但它的執業 原則被稱為抽象。
一種封裝的新內 函數，有一個名字，更好地
但這個名字從字面上 稱它做什麼。
我的意思是printf--這不是 尤其是描述性的。
如果我想創建一個 拼圖，或者如果我
要創建一個函數 在打印一個人的名字，
這樣的美 是，我實際上可以
給該函數的名稱 這說明它的作用。
>> 現在只需要在輸入該 我隨便叫的名字，
但同樣是精彩的描述 而不是被多一點
一般像S。和 無效，現在，只表示
這個函數不 把我帶回點什麼。
它不喜歡的GetString的 從字面上遞給我回一個字符串
就像我們用紙片做 上週你的同學，
而是它只是有一個副作用。
它打印的東西在屏幕上。
>> 所以在一天結束時，如果我 不要讓功能-0，./function-0，
我們會看到，它要求我的名字。
I型大衛，這類型的我的名字。
如果我再這樣做了羅布， 它會說“你好，羅布。”
因此，一個簡單的想法，但也許 從這個推斷精神
隨著你的計劃得到 稍微複雜一點，
你想寫一大塊 代碼和調用代碼 - 調用
該代碼 - 一些描述 名稱如PrintName，
C那樣被提供給我們這種能力。
>> 這裡還有一個簡單的例子。
舉例來說，如果我打開了一個 從今天呼籲return.c文件，
請注意我在這裡所做的。
大部分的主要功能是printf的。
我第一次隨意初始化 變量名為x為數字2。
然後，我打印出來的“X現在 ％I“傳遞x的值。
所以，我只是說那是什麼。
>> 現在，我只是大膽 自稱與printf的。
我魔方的值x，我 通過調用一個函數這樣做
所謂的魔方傳球 在x作為參數，
然後將輸出保存 在變量X本身來說。
所以我重挫x的值。
我重寫 X帶的什麼價值
調用的結果 這個立方體功能。
然後，我只是打印出一些 毛絨絨的東西在這裡說，我所做的。
>> 那麼，什麼話是立方體？
注意什麼是根本 這裡不同。
我已經給了函數 一個名字和以前一樣。
我指定一個名稱的參數。
這一次，這就是所謂的n，而不是名稱， 但我可以把它叫做什麼是我想要的。
但是，這是不同的。
這個東西在左邊。
以前是什麼樣的關鍵字？
男生。
現在，這顯然INT。
>> 那麼，什麼是可能的帶走？
之類的，而無效表示 虛無，這是事實。
PrintName返回任何內容。
它做了什麼，但 它沒有把我背
東西，我可以把上 等號的左邊
就像我在這裡的第22行完成。
>> 所以，如果我說成線30， 那是什麼可能暗示
什麼魔方確實給我嗎？
是嗎？
它返回一個整數。
因此，遞給我回來了，為 例如，一張紙
在其撰寫的答案。
2立方，或3立方，或4個 cubed--不管我傳遞，
而我怎麼實現呢？
那麼，就n次n次Ñ 就是我怎麼可能多維數據集中的值。
如此反复，超級簡單 的想法，但示範
現在我們怎麼能寫功能 實際上我們有背
這可能是感興趣的值。
>> 讓我們來看看最後一個例子 這裡所謂的功能之一。
在這個例子中，它啟動 以獲得更引人注目。
因此，在功能之一，這 program--最終通知
調用一個名為GetPositiveInt功能。
GetPositiveInt不是 在CS50庫函數，
但我們決定我們 希望它存在。
>> 因此，如果我們在後面的文件中向下滾動， 請注意我是如何去落實有關
得到正整數，而我 說這是更引人注目
因為這是一個體面的 代碼的行數。
這不只是一個愚蠢的 小玩具程序。
它實際上有一些錯誤檢查 並做一些更有用。
>> 所以，如果你從來沒見過的演練 影片我們已經嵌入在PSET1，
知道，這是一種類型的 循環在C中，在精神上類似於
對各種事情划痕可以做。
做說做到這一點。
打印出來。
然後繼續前進，讓N-- 得到一個整數，並將其存儲在N，
並保持一而再，再而這樣做 再次，只要n是小於1。
>> 因此n是將要小於一 只有在人的不配合。
如果他或她打字 在0或-1或-50，
這個環是要保持 執行一遍又一遍。
最終發現，我 簡單的返回值。
所以，現在我們有一個函數 這會一直很好
如果CS50將實施 CS50.h和CS50.c你，
但在這裡，我們現在可以 實現這個自己。
>> 但在一些關鍵的細節兩點意見。
埃德蒙頓為什麼我宣布INT N，你認為，第29行
而不是僅僅做 這這裡，這是
用更一致 我們上週做？
是嗎？
一個好的想法。
所以，如果我們把它 在這裡，就好像我們
繼續一次又一次地宣布它。
這本身是 沒有問題的，本身
因為我們只需要 的值一次，然後
我們將得到一個新的反正。
但一個好的想法。
是嗎？
>> 關閉。
所以，因為我已​​經聲明氮對 第29行的循環外，
這是整個訪問 這整個功能。
沒有其他的功能，因為 n是仍然這些捲曲的內
牙套這裡。
So--肯定。
>> 沒錯。
因此，這更是給了點。
如果我們不是聲明 n右此間線32條，
這是有問題的，因為猜測 還有什麼地方我需要訪問它？
上線34和 拇指簡單的規則就是
你只能使用一個變量 最近的大括號內
在你宣稱它。
>> 不幸的是，34行 是一條線為時已晚，
因為我已經關閉 第33行的大括號
對應於該 大括號上線30。
所以這是一個跟你說 這個變量int的作用範圍，
可以這麼說，只有內 這些大括號。
它只是沒有人以外的存在。
>> 所以，事實上，如果我這樣做 錯了，讓我保存代碼
因為它is--正確書寫。
讓我繼續前進，不要讓 函數-1，和notice--錯誤。
使用未聲明的標識符的n 在第35行，也就是在這裡。
如果我們向上滾動 進一步，另一個。
使用未申報 標識符氮對線34。
>> 所以編譯器，鏘， 已經注意到，它只是
即使不存在 顯然它的存在視覺。
因此，一個簡單的解決方法是宣布它在那裡。
>> 現在讓我來滾動 該文件的頂部。
什麼跳出你的 是有一點不同
從東西，我們看了上週？
不僅我的名字，不僅做到 我有一些尖銳，包括向上頂，
我有一些我 調用的原型。
現在，這看起來非常像什麼 我們只是看到了剛才的第27行。
>> 因此，讓我們從不同的推斷 錯誤信息，為什麼我這樣做。
讓我繼續前進， 刪除這些行那裡。
因此，我們一無所知的原型。
重拍此文件。
使功能之一。
而現在，該死的，四個錯誤。
讓我們向上滾動到第一個。
>> 函數隱式聲明 得到肯定int是在C99無效。
C99僅僅意味著1999年 版本的語言的
C，這就是我們的確使用。
所以，這是什麼意思？
以及C--更具體ç compilers--是非常愚蠢的計劃。
他們只知道你做了什麼 告訴他們，這是
實際上專題較上週。
>> 問題是，如果我去 有關實施的名字在這裡，
而我所說的被調用的函數 GetPositiveInt這裡線20條，
該功能在技術上不 存在，直到編譯器看到27行。
不幸的是，編譯器是 做事前，下，左，右，
所以，因為它沒有看到 實施GetPositiveInt的，
但是看到你嘗試 在這裡使用它，
它只是要bail--罵 你有一個錯誤message--也許
隱蔽，並且實際上不 編譯文件。
>> 因此，所謂的原型了 這是無可否認的是多餘的。
從字面上看，我去了這裡，我抄 貼這個，我把它在這裡。
虛空會比較合適，所以我們 從字面上複製，這一次粘貼。
我簡直複製和粘貼它。
真的只是因為像麵包屑。
>> 有一點線索編譯器。
我不知道這是什麼呢 然而，但我看好你
它會存在也說不定。
這就是為什麼這個line--中 行16--以分號結束。
它是多餘的設計。
是嗎？
>> 如果沒有你的鏈接庫 到the--哦，好問題。
夏普包含頭文件包含。
需要be--應該差不多 總是在最高層
對於similar--的文件 正是由於同樣的原因，是的。
因為在標準 IO.H是名副其實的行
像這樣，但用的字的printf和 其參數和返回類型。
所以做犀利包括了 在這裡，你是什麼字面上做
是複製和粘貼的內容 別人的東西寫了上面。
從而cluing代碼到 事實上，這些功能確實存在。
是嗎？
>> 當然可以。
所以有一個非常聰明和正確的 解決辦法是，你知道嗎？
我不知道什麼是 原型是的，但我知道
如果我知道，C是剛 啞和反思從上到下。
好了，讓我們給它想要的東西。
讓我們來削減該代碼，粘貼起來 頂了，現在主要推樓下。
這也將解決這個問題。
>> 但是你可以很容易地拿出 一個場景，其中A需要調用B，
也許B調用回答：這 一些所謂的遞歸，
我們會回來的。
它可能是也可能不是一個好 的事情，但你絕對可以
打破這種溶液。
>> 而且，我會 聲稱曲風，
尤其是當你的程序 成為這個漫長而漫長，
它只是超方便 把主要的頂部
因為它的東西最 程序員要關心。
因此，這是一個有點清潔， 可以說，這樣做的方式
我本來就 與原型甚至
雖然它看起來有點 多餘的第一眼。
是嗎？
對不起，你可以說它更響亮？
>> 如果開關的位置 實施和原型？
所以這是一個很好的問題。
如果重新申報下來 在這裡，讓我們看看會發生什麼。
所以，如果我把這個降 在這裡，你說的。
哦，對不起。
再大一點？
更響。
哦，好問題。
難道失效的功能？
你知道，畢竟這些年來，我 從來沒有把原型之後。
因此，讓我們做製作功能 - 1 以後這樣做。
>> [嘀咕]
戴維·J·馬蘭：哦，等等。
我們還是得把一切都往上頂。
因此，讓我們做到這一點在這裡，如果我 正確理解你的問題。
我把一切，包括 上述主要原型，
但我把原型 下面的執行。
>> 所以，如果我做一個，我越來越 回一個error--未使用的變量n。
哦，還有。
謝謝。
讓我們來看看，我們擺脫了這一點。
這是一個不同的錯誤， 所以讓我們忽略了這一點。
讓我們真的很快重拍這個。
>> 好了，數據的說法不 使用格式字符串
N--哦，那是因為 我改變了這些在這裡。
好吧，我們知道答案是什麼 會to--沒事，我們開始吧。
嗯，謝謝你的肯定。
好吧，我會解決這個問題的代碼 after--忽視這個特殊的bug
因為這was--它的工作原理就是答案。
>> 因此，它不會覆蓋 你剛剛完成的。
我懷疑編譯器 被寫入以這樣的方式
它無視你的原型 因為身體，可以這麼說，
的功能有已 已經實施了較高。
我會以實際諮詢 編譯器的手冊
以了解是否有任何其他 言下之意，但乍一看
只是嘗試和實驗， 似乎有任何影響。
這個問題問得好。
>> 現在讓我們銳意進取，動 遠離副作用
是函數，這樣做 視覺上的printf在屏幕上，
但不返回值。
和功能有回報 像我們價值觀剛才看到幾個。
我們已經看到的範圍這個概念， 我們會一次又一次地看到這一點。
但是現在，再次， 用經驗法則
一個變量只能用於 的最近打開裡面
與封閉的大括號，因為我們 在那個特殊的例子中看到。
>> 正如你所指出的， 有一個ability--
你能解決其中的一些問題 通過將全局變量
在文件的最上方。
但在幾乎所有情況下 我們看不慣的是，
而事實上，即使不走 到了現在的解決方案。
因此，現在的外賣是， 變量的作用域這個概念。
>> 但是，現在讓我們來看看另一個 實際上是在尋找幹地
在一些非常有趣的 實施細則。
我們怎麼可能代表的信息。
我們已經看了這 在類的第一個星期。
縱觀二進制文件，並 提醒小數的自己。
>> 但是從上週還記得C有 不同的數據類型和多束，
但最有用的 現在可能是這些。
一個CHAR或字符，這恰好 是一個字節或8位總。
這就是說，尺寸 一個char的僅僅是一個字節。
一個字節是8比特，所以這意味著 我們可以代表多少個字符。
多少個字母或 鍵盤上的符號
如果我們有一個字節或8位。
回想零一周。
如果你有8位， 多少總價值
可以代表與 零和一的模式？
埃德蒙頓不止於此。
所以，如果你總256 從零開始計數。
所以，如果你有八個bits--所以如果我們 再有我們的二進制泡在這裡，
我們可以把這些燈泡上 和關閉在任何256個獨特的圖案。
>> 現在，這是有點問題的。
沒有那麼多的英語， 浪漫的語言，但可以肯定
當你介紹，為 例如，亞洲語言，這
比喜歡更符號 26個英文字母。
實際上，我們可能需要 大於一個字節以上。
幸好在 近年來社會
使用採用了其它標準 每次充電多於一個字節。
>> 不過，現在在C中，默認 僅僅是一個字節或8位。
一個整數，同時，在4 字節，否則稱為32位。
這意味著什麼是最大的可能 數，我們可以用一個int代表
顯然？
有十億。
所以它的四大十億給予或採取。
2至第32的功率，如果我們 不承擔任何負數
而只使用一切積極 號，這四個十億
給予或採取可能性。
浮點型，同時，在不同類型的 數據類型C.它仍然是一個數目，
但它是一個實數。
東西帶小數點。
而事實證明， C也可以用四個字節
來表示浮點值。
>> 不幸的是有多少浮動 點值是存在的世界？
多少個實數有哪些？
有一個無限 號，並為這一問題
有一個整數無限次數。
所以我們種已 在這裡自己挖一個洞。
由此顯然computers--在 用C寫的關於他們 - 至少計劃
只能算作高 four十億而奮鬥，
和浮點值 只能明顯
有一定的精度有限的。
只有這麼多位數後 他們的小數點。
>> 因為，當然，如果 你只有32位，
我不知道我們要如何去 代表真正的numbers--可能
與不同類型的圖案。
但是有一定的有限 這樣的圖案的數目，
所以在這裡也一樣，這是有問題的。
>> 現在我們可以稍微避免此問題。
如果您不使用浮動， 你可以使用一個雙
在C中，它給你八個字節，這 是零的方式更可能的模式
及的。
但它仍然是有限的，這是怎麼回事 如果你寫的軟件有問題
圖形或花哨 數學公式。
所以，你可能真的想 以計數大於。
長long--愚蠢named-- 也是8個​​字節或64位，
這是兩次只要一個int， 它是一個長整型值。
>> 玩轉fact--如果一個int是4個字節， 多久是一個長期在C中一般？
另外四個字節，但 長長的8個字節，
這是由於歷史原因。
>> 但現在的外賣 就是這樣的數據有
在computer--這是可以代表 與電物理設備，
它一般駕駛 這些零和ones--
同的精度有限的量。
那麼，有什麼問題呢？
>> 那麼有一個問題 的整數溢出。
不只是在C，但在 電腦一般。
例如，如果此 是一個字節值得一bit--
因此，如果這是8 bit--所有 這些都是一等一的。
什麼號碼是這 較，如果我們假設
它是二進制的所有正面的價值觀？
>> 255，這不是256，因為 零是最小的數字。
所以255是最高的 之一，但問題
是假設，我想 增加此變量
，以8位總 如果我要增加它。
>> 好吧，只要我添加 一到所有的這些的，
你或許可以想像visually--剛 就像拿著一個用decimals--
有什麼地方要流向左側。
事實上，如果我加號 一到這一點，什麼在二進制情況
是，它溢出回零。
>> 所以，如果你只use--不是一個整數， 但一個字節數的整數
在程序中，只要default-- 你到了250，251，252，253，254，
255-- 0 255來後， 這可能不是什麼
用戶會期望。
>> 現在同時在浮點運算的世界， 你也有類似的問題。
沒有那麼多的大number-- 雖然這仍然是一個問題。
但隨著精度的量 你可以代表。
因此，讓我們來看看這個例子 這裡也從今天的源代碼 -
浮法0.c。
>> 並注意到這是一個超級 簡單的程序，
顯然應該打印出什麼樣的價值？
那你打賭這是怎麼回事打印 即使有一點新的語法
在這裡嗎？
所以希望0.1。
這樣的十分之一，相當於 因為我在做1除以10。
我存儲的答案 在一個變量稱為F。
該變量是float類型，哪 就是我剛才提出了一個關鍵字存在。
>> 我們還沒有看到過，但 這是一種簡潔的方式在printf中
指定多少個數字，你 希望以後小數點看到的。
所以，這個符號的意思只是 這裡是一個佔位符。
這是一個浮點 值了，呵呵，順便說一下，
小數點與表現出來 小數點後一個數字。
所以這是數 的顯著數字，
可以這麼說，你可能想要的。
>> 因此，讓我繼續做 使浮球-0，./float-0，
顯然1除以10是0.0。
現在，這是為什麼？
>> 好了，電腦正在 我從字面上看，我已經寫了1
我寫的10，並以此來猜測什麼 對於這兩個假定的數據類型
值？
一個int，它在技術上 東西有點不同。
這通常是一個漫長的，但它 最終的積分值。
不是一個浮點值。
>> 這是說，如果這 是一個int，這是一個int，
的問題是，計算機 不具有的能力
即使存儲小數點。
所以當你做1分 10使用整數
對於這兩種分子和 分母，答案應該是0.1。
但computer--因為 這些都是integers--
不知道做什麼用的0.1。
>> 那麼，什麼是很清楚在做什麼？
它只是把它扔了， 而我所看到的最終
0.0只是因為我堅持 printf的告訴我小數點後一位數。
但問題是，如果 由一個整數除以一個整數，
你會被定義get-- 的C--的整數。
而且它不會做 東西不錯，方便
像圓起來的 最近的一個向上或向下。
這將截斷 小數點後的一切。
>> 所以只是憑直覺， 什麼可能是一個修復？
什麼是這裡的簡單的解決辦法？
是嗎？
沒錯。
為什麼我們不把這些作為 有效浮點值
把他們變成浮筒或雙打。
現在，如果我這樣做讓花車-0， 或者，如果我編譯的花車-1，
這是相同的 什麼只是建議。
現在我做花車-0，現在我得到我的0.1。
>> 現在，這是驚人的。
但現在我該怎麼辦 東西有點不同。
我很好奇，想看看什麼是真正 正在進行的引擎蓋下面，
我要去把它打印出來 出到28位小數。
我想真正看到 0.1000--的infinite--
在0.1之後[聽不清] 27零。
>> 那麼讓我們來看看這是 我確實得到。
請彩車-0相同的文件。
./floats-0。
讓我們放大了戲劇性的答案。
這一切的時候，你一直在思考 1除以10為10％，或0.1。
它不是。
至少到目前為止為 電腦的關注。
>> 現在why--確定，這是完整的 謊言1除以10是0.1。
但why--即不 外賣今天。
那麼，為什麼在電腦認為， 不像我們大家在房間裡，
即1除以10是 實際上是瘋狂的價值？
什麼是電腦做顯然是？
那是什麼？
>> 它不會溢出，本身。
溢出通常是當 您環繞的值。
這是這個問題的不精確 在浮點值
在你只有32 或者甚至64位。
但是，如果有一個無限 實numbers--數
帶小數點的數字 和數字thereafter--肯定
你不能代表所有的人。
所以電腦給 我們最接近的匹配
到的值可以表示使用該 很多位，其實我想要的值，
這是0.1。
>> 不幸的是，如果 開始做數學，或者你
開始涉及這些類型的浮動 在重要的programs--點值
財務軟件， 軍用軟件 - 什麼
其中知覺 可能是非常重要的。
而你開始添加 這樣的數字，並且開始
運行軟件 與真正的大投入
或大量的時間和地段 年天或大量的，
這些小小的失誤 一定可以積少成多隨著時間的推移。
>> 現在，順便說一句，如果你曾經 看過超人3或辦公空間
你可能還記得 如何將這些傢伙偷了
大量的資金從他們的計算機 使用浮點值
並加入了少許 餘，希望那部電影
現在更有意義。
這是他們 暗指在那部電影。
事實上，最 公司不會看
在一定次數後， 小數位，
但這些都是仙分數。
所以，你開始增加起來， 你開始賺了很多錢
在您的銀行帳戶。
這就是辦公空間解釋。
>> 現在，不幸的是超越 辦公空間，有
有一些令人不安的合法 和顯著影響
這些種的 基本的設計決策，
的原因，事實上1 我們使用C語言在使用過程中
是這樣，你真的有這個理由 最多的電腦如何工作的了解，
軟件是如何工作的，並沒有 拿任何東西是理所當然的。
>> 事實上不幸的是，即使有 這個基本的了解，
我們人類犯錯誤。
而我想我會分享的是 這八年分​​鐘的視頻在這裡拍攝
從現代奇蹟的插曲，這是 教育展上是如何工作的
該畫兩張圖片 當不當使用
和諒解 浮點值
導致一些顯著 不幸的結果。
讓我們一起來看看。
[視頻回放]
- 我們現在回到“工程 在現代奇蹟災害“。
電腦。
我們都來接受 往往令人沮喪的問題，
得到了他們 - 臭蟲，病毒和 小型軟件價格glitches--
支付的便利性。
但在高科技和高速 軍事和航天計劃的應用，
可以最小的問題 被放大成災難。
>> 1996年6月4日，科學家準備 發動無人機阿麗亞娜5型火箭。
它攜帶的科學 衛星設計
建立精確的如何 地球磁場的相互作用
與太陽風。
火箭是專為 歐洲航天局，
和從它的設施升空 在法屬圭亞那的海岸。
>> -at約37秒進入 飛行中，他們首先
發現了一些打算錯了。
該噴嘴被旋轉 在某種程度上，他們真的不應該。
大約40秒後進入飛行 明確車輛遇到了麻煩，
而當他們做的 決定摧毀它。
範圍內安全官員，與 巨大的膽量，按下按鈕
並炸毀了火箭，才能夠 成為危害公眾安全。
>> - 這是少女 阿麗亞娜5號的航程，
其破壞了 地方，因為這個安全漏洞
嵌入火箭的軟件。
在-The問題 阿麗亞娜是，有
是一個數字，需要 64位來表示，
他們想轉換 它以一個16位的數字。
他們假定數 永遠不會很大。
大多數的這些數字中 64位數字是零。
他們錯了。
>> 一-The無力 軟件程序來接受
所產生的那種數 另一種是在失敗的根源。
軟件開發已經成為一個 的新技術非常昂貴的部分。
阿麗亞娜火箭4有 是非常成功的。
這麼多的創造了軟件 它也被用在阿麗亞娜5。
>> -The基本問題 這是阿麗亞娜5。
是faster--加速更快， 該軟件並沒有占到一點。
>> 火箭-The破壞 是一個巨大的金融災難。
所有因分軟件錯誤。
但是，這不是第一次 實時數據轉換問題
困擾了現代火箭技術。
>> - 在1991年的開始 第一次海灣戰爭中，
愛國者導彈 經歷了相似類型
一些轉換問題。
其結果是28 people-- 28 美國soldiers--被打死，
約百人受傷。
當愛國者，這本來是 防止進入的飛毛腿導彈，
沒有發射導彈。
>> - 當伊拉克入侵科威特，美國和 在1991年年初推出沙漠風暴，
愛國者導彈部署 保護沙特阿拉伯和以色列
來自伊拉克的飛毛腿導彈襲擊。
愛國者是美國中程 表面 - 空氣系統
由雷神公司製造。
>> 愛國者的-The大小 攔截itself--
它是關於大約20英尺長， 而它的重量約2000磅。
它承載著約彈頭， 我認為這是大約150磅。
而彈頭本身 高爆發力，這
有他周圍的碎片。
因此，彈頭的外殼是 設計為像一個大型鉛彈。
>> -The導彈進行 4每個集裝箱，
並通過一輛半掛車運送。
>> -The愛國者反導系統 回到現在，至少20年。
它最初的設計 作為防空導彈
擊落敵方飛機。
在第一次海灣戰爭 當戰爭來了，
陸軍希望用它來 擊落飛毛腿導彈，不是飛機。
伊拉克空軍 沒有那麼多的問題，
但陸軍擔心飛毛腿導彈。
因此，他們試圖 升級愛國者。
>> -Intercepting敵人 導彈在5馬赫旅行
將要被足夠的挑戰性。
但是，當愛國者 被送往投入服務，
軍隊並不知道 伊拉克修飾
使他們的飛毛腿近 不可能的。
>> - 什麼事是飛毛腿的 要來的是不穩定的。
他們搖搖晃晃。
這樣做的原因是Iraqis-- 為了得到600公里出
300公里的範圍內missile--的 把重量從前面的彈頭，
並提出了彈頭更輕。
所以，現在愛國者的苦思 在飛毛腿，而大部分的時間 - 的
絕大多數的 時間 - 它只是由飛毛腿飛。
>> - 一旦愛國者系統運營商 實現了愛國者錯過了目標，
他們引爆了愛國者的戰鬥部 為避免可能出現的人員傷亡，如果它
被允許倒在地上。
>> - 即是大多數人所看到的 在天空的大火球，
和誤解成 飛毛腿彈頭的攔截。
>> - 雖然在夜晚的天空，愛國者 似乎是成功地破壞
飛毛腿，在達蘭可以有 不要誤會，它的性能。
有愛國者的雷達系統 軌道傳入飛毛腿的損失
從不因推出 一個軟件缺陷。
>> 是誰最先發現的以色列人 該系統不再是上，
更大的時間差異成為。
由於嵌入式時鐘 在系統的計算機。
>> - 關於前兩週 悲劇發生在宰赫蘭，
以色列人報 國防部
該系統是浪費時間。
經過大約八個小時 磨合，他們發現
該系統的變 明顯地較不準確。
國防部回應 告訴所有的愛國者電池
不要離開系統 在很長一段時間。
他們從來不說什麼了很長時間了。
8個小時，10個小時，上千小時。
沒有人知道。
>> -The愛國者電池 駐紮在軍營
在宰赫蘭及內部缺陷 時鐘已經對超過100小時
2月25日的夜晚。
>> - 它跟踪的時間精度 的約十分之一秒。
第二，現在的十分之一 是一個有趣的數字
因為它不能表示 二進制確切地說，這
意味著它不能準確地表達 在任何現代數字計算機。
很難相信，但 用這個作為一個例子。
>> 讓我們數的三分之一。
三分之一不能 正是以十進制表示。
三分之一是0.333 持續了無窮大。
有沒有辦法做到這一點與 絕對精度的小數。
這正是這類問題 發生在愛國者。
該系統運行更長的 更糟糕的一次錯誤成為。
>> -after運行100小時後， 在錯誤的時間只有大約三分之一
第二。
但在靶向方面 導彈在5馬赫旅行，
這導致跟踪 的600多米的錯誤。
這將是一個致命的錯誤 對於戰士在宰赫蘭。
>> - 什麼事是飛毛腿發射是 通過預警衛星探測，
他們知道飛毛腿來了 在他們的大方向。
他們不知道有人來了。
這是現在到雷達 愛國者系統的組成部分
衛冕達蘭定位和保持 跟踪來襲的敵方導彈。
>> -The雷達是非常聰明的。
它實際上跟踪 飛毛腿的位置
然後預測的地方 它很可能是
在下一次 雷達發出的脈衝輸出。
這就是所謂的距離門。
>> - 那麼一旦愛國者 決定有足夠的時間具有
傳遞回去檢查下 位置，該檢測對象
它可以追溯到。
因此，當它回到了錯 地方，然後看見沒有對象。
並且它決定，沒有任何對象。
這有一個錯誤的檢測 它的下降軌道。
>> -The傳入飛毛腿消失 從雷達屏幕上，
幾秒鐘後，它 撞上了軍營。
飛毛腿打死28。
這是最後一個發射 在第一次海灣戰爭。
可悲的是，更新後的軟件 抵達黎明翌日。
該軟件有漏洞 是固定的，封閉
在陷入困境的一章 愛國者導彈的歷史。
>> [完視頻回放]
>> 戴維·J·馬蘭：這就是它的CS50。
我們會看到你在星期三。
>> [音樂播放]