[音樂播放] 戴維·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。 我們會看到你在星期三。 

[音樂播放]