>> JASON HIRSCHHORN：歡迎 三個星期，大家好。
我們有一個忙碌的，但令人興奮的 擺在我們面前的一節。
因此，首先，因為我們已經做了一些 進展的過程，但我們仍然
有一個很大的學問剩下要做的，我 要告訴你們一些資源
這應該被證明是令人難以置信 有用你不僅接近你
習題集，而且還消化所有的 我們給你們的材料
講座和短褲和一節。
>> 然後，我們將先花20 節會超過25分鐘
GDB，您可能會或可能不會有 用在這點上，但它是一個
令人難以置信的有用工具，將 幫助你調試你的程序。
很多您在可能使用的printf 你的程序的中間圖
哪些變量望其項背。
GDB甚至比printf的更好， 不搞砸了你的代碼，因為你
對可執行文件運行它。
所以我們就去了10個最有幫助 命令你需要GDB，我們很
要繼續練習在一起， 在問題設定了三個超越，你
可以用GDB來幫助調試 您的程序。
最後，我們將介紹一些 排序和查找算法
您在演講看見了，我們是 將實際的代碼，而不只是
偽代碼，但代碼的二進制搜索， 冒泡排序和選擇排序。
>> 因此，首先，我想去 以上的資源。
這是一個廣泛的名單，它的 較小的字體，因為我有很多東西要
適合在這裡。
但這些不僅會幫助你， 再次，與習題集和
你學到了消化信息，但 肯定，來測驗時間，這些都會
說非常有用。
因此，首先，演講筆記。
如果你去cs50.net/lectures和 滾動到特定的星期和日，
你會看到，有註釋為每個 講課，這不是一個簡單的
成績單，而是一個編輯的版本 什麼是覆蓋在講座與代碼
片段和其他有用的花絮。
我強烈建議你對這些。
然後還有，還有源代碼 可從每個講座。
再次，這些幻燈片也將是 可在網上cs50.net/sections
今天晚上。
>> 因此，每個星期第二是短褲的 封面專題，一般為5〜15
分的長度。
而那些希望會給你一個 偉大的底漆上不同的主題。
第三 -
這是全新的這 年 - 是study.cs50.net。
如果你還沒有檢查出來，我 強烈建議您這樣做。
你來挑一個話題。
我們對有幾十個主題。
因此，例如，你選擇的功能。
它給你一些幻燈片 並注意到功能。
這些都是實際的幻燈片，轉錄因子 鼓勵在使用我們的
演示一節。
還有處理的技巧和竅門 與功能，並有
實踐中的問題，幫助 您使用的功能。
我們也給你鏈接到的短 函數和時間，其功能
已經提出了在課堂上。
所以study.cs50.net，全新的這種 今年，一個奇妙的資源。
>> 接下來，我有男人，也就是手動 命令，你可以在運行
命令行。
所以，如果您對任何問題 命令，例如，蘭特，這是我們
部分在上週遭遇 而你在已可能遇到
通過去當你的設置的問題 生成的代碼，但如果你輸入man
蘭特，你會得到的頁面 告訴你所有關於蘭特。
它給你什麼需要時， 它需要的參數，以及返回
類型和簡要說明 那功能。
>> 因此，請檢查蘭特。
它可以是一個有點羅嗦和混亂， 所以有時我覺得
簡單的谷歌搜索什麼我想知道的是 找到答案的最佳途徑。
因此，與谷歌的做法。
獲得良好的谷歌。
它會成為你最好的朋友。
>> 以及谷歌，如果你不能找到它 在谷歌，cs50.net/discuss，它的
討論論壇。
機會是，如果你有一個問題，一是 你的700 +的同齡人也有
問題可能問 它已經在討論
論壇上，並讓它回答。
所以，如果你有一個共同的問題或 您有想一個問題
也許其他人可能碰上， 退房cs50.net/discuss。
>> 最後，最後兩個，如果你想要 跟一個真正的人，辦公室
時間週一至週五。
還有網上辦公時間 延期的學生。
最後但並非最不重要的， 我的驚嘆號。
你們都有我的聯繫方式。
如果你需要什麼，請千萬不要 隨時與我聯繫。
總覺得自由地這樣做。
只有極少數的你加了我的Gchat， 讓一直令人失望，
但我希望那會改變之間 這一點，下一節。
到目前為止，對資源的任何問題嗎？
大。
>> 最後，另一個插頭 反饋，sayat.me/cs50。
你可以給我匿名反饋 關於我是如何做。
那是真正有用的最後一周。
我有一對夫婦的評論從你們 右後部分，再加上從
誰看了其他學生 在一周內，並且它
是難以置信的幫助。
我要嘗試限制我使用 單詞“甜”，但我會告訴我的
熱情和興奮 在其他方面。
但也有其他附加 實質性的反饋，
雙方的長處和三角洲。
所以，請我給你們反饋 關於您的問題集。
隨時給我反饋 在我的教學。
我在這裡給你們。
>> 大。
這就是我對 首節。
沒有任何人有任何 問題這麼遠嗎？
和我有記 控制中心。
擴展學生短信給我 說他們沒有得到任何音訊，
但是這是我的力量來解決的。
所以希望，即得到 短期內得到解決。
如果你正在看在線，喜， 但你聽不到我的聲音。
>> 因此，首先，我們要 要經過GDB。
GDB，因為我暗示較早， 是一個調試工具
比printf的要好得多。
因此開始使用GDB，你們這些傢伙，如果 你要打開你的設備
走，我通過電子郵件發送給您的文件 前面 - 這個文件也將是
可在網上在一個位 -
和運行GDB /文件的名稱。
首先，當然，你必須編譯 文件因為GDB只適用於
可執行文件。
>> 但是，如果你想開始 GDB，你要做的第一件事，
你運行GDB /凱撒。
所以這是我們的程序的名稱 去，現在用它去。
所以我打算寫使凱撒，這 會給我一個可執行文件
在這裡綠色突出。
然後我要去運行GDB /塞薩爾。
>> 和你去。
你看我們有一些文字告訴我 關於廣發行的版本，給我
一些保修信息，然後我們 有國內生產總值提示，這看起來有點
像我們的命令行提示符下， 但是你看它的開放
括號，GDB，密切括號。
在我們繼續之前和調試這個文件 那我給你的一切，讓我們來看看
一些有用的命令，所以我們有一種感覺， 什麼我們要覆蓋。
>> 這些命令列在這裡的 順序我一般使用它們。
所以我通過運行啟動我的程序 該方案的GBD。/名稱，
在這種情況下，愷撒。
然後我首先要做99.9％ 的時間類型休息的意思。
，在主設置一個斷點。
從本質上講，你在做什麼有 是該程序將停止在
主這樣你就可以開始研究它線 按行，而不是運行的所有
一路走過。
可以在不同的點在破 你的代碼，但主要是一個普遍
良好的開端。
>> 下一個命令我跑是跑。
啟動該程序運行，並 如果你需要輸入的命令行
的論點，你運行它的命令。
與參數運行。
這樣以來，我們去那邊的一個版本 C，這是該計劃你們的
寫了PSET 2 -
這其中，當然，有一些錯誤 在它那希望我們會發現 -
我們將用一些命令來運行運行 行參數，因為愷撒，
按問題你們知道 設置規範，需要一些
命令行參數。
>> 在接下來的幾個命令，下一個 一個是實際調用下一個。
那一個你需要一行一行 通過你們的節目。
所以打n，則輸入帶你 行到下一行，執行
上一行。
步驟不僅需要你 下一行，但它
你需要在函數內部。
所以，如果你寫一個函數 你的代碼或者如果您想探索
以我為例，你可以打s和 而不是去的下一行
你正在經歷右邊的文件 現在，你將真正步入
這個函數然後看看它的代碼。
>> 列表顯示，在非常人性化 格式，10行左右左右
您當前所在的代碼 所以實際上你可以看到文件
而不必交換背部和 來回之間不同的看法。
打印是如printf， 顧名思義。
這表明你是什麼一個變量等於。
>> 信息本地人是真正有用的。
這是印刷的特殊版本。
信息當地人告訴你所有的地方的 變量，它們打印全力為您
目前可用。
所以我一般，而不必 打印出來的四個變量，我很
好奇，如果我在一個for循環中，為 舉例來說，我只是寫信息本地人，
它會告訴我什麼我的計數器i 等於，以及我是陣列
工作平等。
>> 最後，繼續。
鍵入中斷停止你 在破發點。
你可以通過走線 旁邊和步線。
繼續運行程序到下一個 突破點，或直至完成，如果
有沒有更多的破發點。
禁用刪除斷點，如果你 決定在主要的突破是
不當之處，你要 設置在別的地方。
最後Q，退出，得到了廣發行。
>> 所以這個程序，/撒，我們將 仔細看看，現在，我們
要使用GDB找 臭蟲此計劃。
我跑這個程序與前面 檢查50，我得到了一個皺眉。
一切它的存在，它編譯的，它 通過大量的試驗，但對於
由於某些原因，它沒有通過第五 測試中，轉向BARFOO，全部大寫，成
E-D-U-R-R，全部大寫， 使用3作為密鑰。
我得到了八九不離十。
我由一個字母下車。
因此，有一些小的失誤在這裡。
我已經通過我的代碼看起來。
我無法弄清楚。
希望你們能幫助我 找出這個bug是。
>> 所以這是我們的錯誤 尋找。
讓我們繼續前進到GDB。
再次，我已經運行GDB /凱撒， 所以現在我們在廣發行。
什麼是第一 我應該做的事情嗎？
我剛剛進入GDB。
有人給我一個很好的 命令進入。
>> 學生：休息為主。
>> JASON HIRSCHHORN：休息為主。
太棒了。
讓我們鍵入英寸
你們可以在這裡觀看或跟隨 沿著你的電腦上。
打破主，你會看到一個 斷點設定在 -
它給了我一些奇怪的內存地址， 而這也給我的行號。
如果我回頭看這個文件， 我想知道，主
發生在第21行。
我應該怎麼跑下一個？
是我的程序運行？
號
所以，我應該怎麼跑下一個？
>> 學生：運行。
>> JASON HIRSCHHORN：運行。
如果我只是跑跑步，還是應該 我在添加一些其他的東西？
>> 學生：使用參數運行。
>> JASON HIRSCHHORN：與運行 命令參數。
而且因為我調試一個非常具體的 情況下，我應該輸入
命令行參數。
所以我會做運行三個，這是，再次， 我從50檢查了輸出。
啟動程序。
我們通過幾行。
現在你會看到，我們是在第21行。
我怎麼知道，我們是在第21行？
因為如果你向左邊看 我的終端窗口中，有
它說21行。
這給了我，其實， 代碼是在第21行。
所以我剛才講錯。
主要是不實際在第21行。
主要是上述21幾行。
但在第21行，這是 我們正在打破。
這行代碼有 尚未執行。
這一點很重要。
你看行不有 尚未執行。
這就是下一行代碼 你即將執行。
>> 所以下一行，因為你們是 可能熟悉，這是
狀態檢查，看看我是否有 輸入的命令行參數。
和A至I，什麼是第二 這樣做的一部分？
什麼是對我？
>> 學生：它更改為一個整數。
>> JASON HIRSCHHORN：對不起？
>> 學生：它改變了 參數的整數。
>> JASON HIRSCHHORN：所以一到我的變化ARG 卷從一個字符串為整數。
然後它是什麼檢查？
>> 學生：如果有一個第二 命令行參數，除了
運行該程序。
>> JASON HIRSCHHORN：什麼是 在此第二半
布爾表達式檢查？
這部分在這裡，一來我？
>> 學生：如果是負數。
>> JASON HIRSCHHORN：確保什麼？
>> 學生：確保它 是，實際上正。
>> JASON HIRSCHHORN：沒錯。
這被檢查，看它是否 負的，而如果它是負的，我
有一種感覺，下一行可能 被我罵的用戶。
因此，讓我們打結束時執行這條線。
我們沒有看到該行的你們 也許期望看到大喊大叫的
用戶再回來，因為 這一行沒有執行。
我進入3。
所以，我沒有，事實上，輸入兩個命令 行參數，和3
大於零。
所以，我們看到那行，我們執行， 但我們沒踩
裡面的if條件。
>> 所以，現在，未來，我看到我設置 整型鍵等於給我精氨酸卷。
所以這是我創建一個可變密鑰。
所以，如果我打印出來的關鍵，現在，因為 這可以讓你看到的
值裡面的變量， 關鍵等於47。
這是奇怪的，但當然， 那是因為我沒有
執行該行呢。
所以，現在如果我打了N，執行該行， 並做打印鍵，鍵將等於3，
這是我們期望它等於。
>> 如此反复，在廣發行，行啦 看你有沒有執行。
你必須打N或S或數字 其他命令來實際的
執行該行。
打印鍵。
關鍵的第3。
到目前為止，一切都很好。
String是純文本。
讓我們來執行該行。
我是從用戶得到的字符串。
>> 讓我們在我入住50看，我 進入BARFOO全部大寫，所以
這就是我進入。
如果我現在打印純文本。
你會看到它等於一個字符串。
它給了我一些其他怪異的十六進制 數，但它在
其實說我的字符串是BARFOO。
如果我想看看什麼鍵相當於在 這點，我怎麼可以檢查關鍵？
>> 學生：打印鍵。
>> JASON HIRSCHHORN：Print鍵，沒錯。
而實際上，有一個快捷方式。
如果你厭倦了打字印刷的， 你可以只輸入p。
所以，p鍵做同樣的事情。
又一次，我看到它等於3。
>> 如果我想找出什麼兩大關鍵 和BARFOO相當於在同一時間
但我累了打字每 一出單獨，我
可以輸入信息本地人。
這給了我鑰匙等於3。
純文本等於BARFOO。
這也給了我這兩個奇怪的事情 在頂部，該變量i和
這個變量n。
>> 這些都是實際存在的 在我的主程序。
我們還沒有遇到過他們呢， 但作為預覽，那些
存在於我的for循環。
所以現在，他們平等有些怪異 數字，因為他們沒有被
初始化還沒有，但它們仍然存在 在內存中，所以他們只是設置
一些垃圾值。
但是我們看到在關鍵平原 文字在那裡。
>> 所以，我要執行這條線， 第34行，for循環。
我們要跳進 for循環擊中ñ。
而且我們內部的for循環。
我們是在我們的第一次檢查。
再次，這些都應該有點期待 你熟悉的，因為這是一個
寫凱撒程序，但 再次，有一些類型的錯誤。
>> 現在如果我做信息本地人，因為我 裡面的那個for循環，你會看到
我等於零，正如我們期望的那樣。
這就是我們將其設置為和初始化 它在for循環。
n等於6。
這也有道理，因為我們設置 它以純文本的strlen的。
所以我喜歡做信息本地人或打印 到變量經常以確保
一切總是什麼 我希望它等於。
在這種情況下，一切都 我希望它等於。
>> 因此，讓我們開始通過移動 這個for循環。
我上線是36行，如果純 文字i大於一個樸素
文本i小於或等於z。
我知道我的問題是不是與我的第一次 信中，它與第二個字母。
如果我們回頭看檢查 50，B進入到E的罰款。
我要帶A和把它當作 一個A，而不是將其更改為D。所以，
什麼是錯的 第二個字母。
所以，我要動 在第二那裡。
>> 但是，如果我沒有想檢查什麼純 文字我等於在這個特殊的
情況下，我覺得應該是什麼？
我應該明文等於我在這 通過第一輪的循環？
>> 學生：零？
>> JASON HIRSCHHORN：我純文本？
所以它應該是資本B的我，當然， 為零，但純文本
支架零閉合支架等於乙 因為字符串，如我們上週看到的，
是數組，所以我們得到的 第一個字符從。
所以，再一次，如果我打印出來的純文本 我，我，其實得到的字符
B.這就是整齊的，對不對？
我實際上並沒有明文一 這不是我設置的變量之一
或初始化，但你可以打印 出了事情一大堆
如果你想。
>> 但是，讓我們移動。
如果純文本我是和大於 明文I小於或等於
Z，這顯然是正確的，因為我們有 資本B.我要去跑
它的一些命令。
我們看到，數學最後一周，所以我們將 想當然，它的工作原理
根據權利檢查50。
>> 這些大括號，第一個 結果顯示，我是退出，如果
條件，第二個顯示 那我退出for循環。
所以現在當我打接下來，我們將看到 我們回來在for循環一次。
我們正在經歷的 再次循環。
讓我們真正步入第二 迭代的for循環和類型
信息本地人。
>> 所以我們在第二次迭代 我們的for循環。
我等於1，這是我們期望的。
N等於6，而我們預期。
關鍵等於3，這是我們期望的。
和純文本，你會看到，等於 EARFOO現在，沒有BARFOO了，因為
在我們先前的迭代中，B為 改為大寫E。所以我們即將
遇到的問題，所以這 在這裡我們要
潛入調試。
但是，沒有任何人有任何問題 關於我們到目前為止已經做了什麼？
太棒了。
>> 所以我們一下，如果執行此 條件下，純文本支架我關閉
比A和支架更大的純文本我 小於或等於Z。但在此之前
我進入了，因為這是 我知道我的錯誤，我想點
出一的純文本，以便 讓我們把打印出來。
它等於字符A，使 似乎到目前為止，一切都很好，不錯。
>> 所以我希望我的每邏輯這條線， 這條線應該是真實的。
這是一個大寫字母。
但如果我打了N，我們要明白，這個 行，其實並沒有執行。
我跳進來的東西，如果。
為什麼會這樣？
>> 學生：因為你有你的條件 純文本的大
比A，不等於或大於。
>> JASON HIRSCHHORN：所以我有我的純文本 我大於A，不大於
小於或等於。
所以很明顯，資本A沒有 如果條件觸發這一點，我們做
沒有踏進去，和我們做 沒有做必要的轉變。
所以這是它，其實。
我想通了，我的錯誤。
我可以回去在我的源文件， 改變它，更新它，
運行再次檢查50。
>> 但我們會看到，只是為了教學的 的緣故，如果我堅持去做。
本否則，如果不執行下去，但 什麼，而不是等於就是命令
不改變。
所以它沒有改變，如果我 這裡打印純文本，我們會看到去
通過for循環沒有，事實上， 改變第二個字符的。
它仍然是一個大寫字母A。
>> 所以，再一次，我們調試我們的錯誤。
我們意識到有 一些邏輯缺失。
和我們之前調試它的時間提前 實際執行這條線，
但你會注意到有我們只是 點擊Next，並跳轉到否則，如果，
這意味著，如果條件 是不正確的。
我們沒有，事實上，獲得 結果我們的預期。
這樣的話，我們可能已經提示，有 我們沒有這麼精明，看
如果條件和檢查的話，其實， 我們的條件應計算為
真正在目前情況下。
>> 這是所有用於調試這個程序。
沒有任何人有任何問題嗎？
我可以打什麼命令退出GDB？
問：然後我就被提示， 退出呢？
是或否。
我會打，是的，我會相繼退出GDB。
>> 所以這是一個快速入門到GDB。
實際上，在實際情況下， 我這樣做是在辦公時間。
我GDBed在這個確切的程序 辦公時間與學生。
如果我們回去，我們看到的命令 之前，我們使用了破發主力，第一
的事情，我們做到了。
我們使用命令行參數運行， 第二件事情，我們做到了。
接下來，我們用了很多移動 我們通過線。
再次，短版 旁為n。
這是在括號 在灰色的幻燈片。
>> 我們沒有使用的步驟，但是我們並沒有 一定需要這種情況。
但是，我們可能會在稍後使用它 今天，如果我們正在調試，為
例如，二進制搜索二進制時 搜索被稱為在一個單獨的
的功能，但有 與它的一些錯誤。
我們將要步入 調用二進制搜索和
實際調試它。
列表中，我們沒有使用或者是因為我們有 我們的代碼感好，但如果我
沒有想要得到的是什麼代碼，我感 在旁邊，我可以只使用列表中。
>> 打印我們使用，我們使用信息的當地人。
繼續我們並不需要在此使用 情況下，我們也沒有需要使用
禁用的，但我們確實使用了退出。
同樣，這些10的命令， 實踐它們。
如果你了解這10個命令， 你應該調試任何設置
發用GDB。
>> 所以我們馬上就要去上，再次向 部分的癥結今天，去了
這些排序和搜索 算法。
在這樣做之前，再次，有任何疑問， 意見，關注的廣發行？
所以大家是要使用 GDB而不是printf的？
所以每個人都為永久的緣故， 大家都點頭他們的頭向右
現在，我會看到你在辦公時間 和所有的轉錄因子會看到你和
他們會說，告訴我怎麼用 GDB，你就可以
向他們展示，對不對？
樣的？
也許有希望。
涼爽。
>> 所以，我們要進入 排序和搜索。
你會看到我已經排序的列表 對我們來說，但不會
是這種情況總是如此。
所以在問題設置規範 問題設定了三個，你有短褲
你可以看，它實際上 請你看看那些短褲。
此外，在演講最後一周，我們走過去 很多這樣的算法，所以我
不會花時間在課堂上會 一遍這些算法或圖紙
圖片，如何將這些 算法工作。
同樣，這些信息您可以重新手錶 講座中，或者該信息
被捕獲出色的短褲 對於這些搜索所有的，
這可在cs50.net。
>> 所以，我們要去什麼 要做的就是編寫這些程序。
我們有一個感覺，一個心智模式如何， 他們的工作，還等什麼，我們要去
要做的就是對它們進行編碼真實的。
我們打算把這一心智模式， 那張照片，如果你願意，進
實際代碼。
如果你是一個有點困惑或 朦朧的心智模式，我完全
明白了。
>> 我們不會實際去 跳轉到代碼通俗易懂。
因此，儘管這個提示在這張幻燈片問 你的代碼的二進制搜索，並
實際上，一個迭代版本 二進制搜索，第一件事我
真的希望你做的是 寫一些偽代碼。
所以，你有這個心理模型 如何二進制搜索作品。
拿出一張紙，如果你有 1一應俱全，或者打開一個
文本編輯器，我想 大家都來寫。
連拿4分寫 偽代碼二進制​​搜索。
>> 再次，想想心理模型。
我會回來的，如果你有任何問題 我們可以得出的圖片出來。
但首先，我們開始編程之前， 我想要寫
偽代碼的二進制搜索，所以當我們 潛水，我們有一些方向
的地方，我們應該前往。
>> 學生：我們是否可以假設數組 我們得到的值已經排序？
>> JASON HIRSCHHORN：所以對於二進制搜索 工作 - 優秀的問題 - 你
必須採取以排序 數組值。
所以，假設它會奏效。
我們將回到這個幻燈片。
紫色的功能，你會看到 聲明布爾整型binary_search的
值，int值，詮釋n。
這應該看起來很熟悉，如果你已經 已經接近或得到你
手臟與習題集。
>> 但是，這是你的函數聲明。
再次，應該不需要擔心 這麼多在這一刻。
我真的希望你做的是採取 四分鐘的偽代碼的二進制
搜索，然後我們就去 以上，作為一個組。
我會來到我身邊。
如果您有任何疑問，請隨時 自由地舉起你的手。
>> 你為什麼不走兩分鐘 完成了偽碼？
我知道這可能看起來荒謬的， 我們花那麼多時間
東西甚至不是真正的 C，但尤其是對於這些更
具有挑戰性的算法和問題 集，我們要搞清楚，
開始在偽不擔心 有關語法，只是擔心
邏輯，是難以置信的幫助。
而這樣一來，你不求解兩個 令人難以置信的困難問題一次。
你只是專注於邏輯， 然後你進入的語法。
>> 確定。
讓我們開始經歷 偽代碼。
我已經寫在這裡，二進制 搜索偽代碼。
我們會寫這篇文章的上 登上在一起。
或者我會寫它，你會得到 我我需要的提示。
所以，有誰能夠給我的第一個 偽代碼的行，你
寫了二進制搜索？
是的，安妮？
>> 學生：雖然的長度 列表是大於零。
>> JASON HIRSCHHORN：雖然長度 的商大於零。
又一次，我們看到一些C的前瞻性 在這裡語法的東西。
但大部分是英文的。
有沒有人有他們提出的任何行 在此之前他們的偽代碼？
>> 學生：獲得一個數組 的分類數字。
>> JASON HIRSCHHORN：你寫了“得到一個 數組排序的數字。“每
函數的聲明，我們將通過 排序的數字的陣列。
>> 學生：[聽不清]。
>> JASON HIRSCHHORN：所以 我們將具有。
但是，是的，如果我們沒有，我們 就需要我們對數組進行排序
數字，因為二進制搜索 僅適用於排序數組。
因此，儘管列表的長度為零，我 打算把一些大括號
使它看起來更有點像 C.但同時，似乎映射到
while循環，所以這裡面，而 循環什麼，我們需要
做二進制搜索？
>> 別人誰沒有給我一個 但回答卻是誰寫的呢？
>> 學生：到列表的中間。
>> JASON HIRSCHHORN：湯姆。
轉到列表的中間。
和後續的問題，什麼 我們做一次，我們在
列表中的中間？
>> 學生：做一個檢查這是否是 你要找的數量。
>> JASON HIRSCHHORN：優秀。
走在列表的中間，並檢查 如果我們的價值在那裡 -
太棒了。
沒有任何人有任何東西 這是比這有什麼不同？
這是完全正確的。
>> 我們在做二進制搜索的第一件事 被轉到列表的中間，
檢查，看看是否我們的價值是存在的。
所以我想，如果我們的價值 在那裡，我們該怎麼做？
>> 學生：我們回到零[聽不清]。
>> JASON HIRSCHHORN：是啊，如果我們的 價值是存在的，我們發現它。
因此，我們可以不過告訴某種程度上，這 函數的定義，我們告訴用戶
我們發現它。
如果它不存在，雖然，這是 這哪裡得到棘手。
所以，如果它不存在，別人誰 正在對二進制搜索或
有一個想法，現在，我們該怎麼做？
>> 學生：問題。
>> JASON HIRSCHHORN：怎麼了？
>> 學生：是的數組已經排序？
>> JASON HIRSCHHORN：是的，我們假設 該數組已經排序。
>> 學生：所以，你必須檢查 你看到的值大於
你想要的值，你可以移動 到另一半的中間。
>> JASON HIRSCHHORN：所以，如果中間 清單大於我們在做什麼
尋找，然後我們做什麼？
我們謹在哪裡？
>> 學生：你想要移動到 列表中的與半
數字低於。
>> JASON HIRSCHHORN：所以我們會 調用的左側。
因此，如果中間是更大的，我們可以搜索 列表的左邊一半。
然後通過搜索什麼 我的意思是搜索？
>> 學生：[聽不清]。
>> JASON HIRSCHHORN：我們去中間。
事實上，我們重複這件事情。
我們回去通過我們的while循環。
我給你最後一個 -
否則，如果中間是少了什麼 我們做什麼，我們該怎麼做嗎？
>> 學生：你可以向右邊。
>> JASON HIRSCHHORN：搜索的權利。
這看起來不錯，但沒有任何人有 任何事情，我們可能會丟失或
別的，你把 在你的偽代碼？
所以，這就是我們有這麼遠。
而該列表的長度大 大於零，我們打算去
到列表中的中間和 檢查我們的價值是存在的。
>> 如果中間大，我們要 搜索離開，否則，如果中間是
少，我們要搜索的權利。
所以，我們都不得不與一些熟悉 我們在計算機科學使用條款
和工具，我們有。
但你已經注意到我們 講英文，但我們發現了一個
很多事情，似乎在映射到 我們已經在我們的編碼工具包工具。
於是馬上蝙蝠，我們不是 將實際的代碼呢。
>> 我們看到了什麼英文在這裡，圖 上的東西，我們可以用C寫的？
>> 學生：雖然。
>> JASON HIRSCHHORN：雖然。
因此，這同時就在這裡 地圖上的是什麼？
>> 學生：一個while循環。
>> JASON HIRSCHHORN：一個while循環？
或可能更一般地，一個循環。
我們想要做的事情一遍又一遍。
所以我們要編寫一個循環。
而我們已經知道了，因為我們已經做了 這幾次我們
有大量的例子擺在那裡， 其實怎麼寫
該指數為一個循環。
所以這應該是相當容易的。
我們應該能夠得到 啟動很快。
>> 還有什麼我們在這裡看到了什麼？
還有什麼其他的結構語法，事情 我們熟悉C語言，我們做
已經有一個基於感 關閉我們所用的字眼？
是的，安娜？
[聽不清]
只是在開玩笑。
安娜，勇往直前。
>> 學生：如果和其他人。
>> JASON HIRSCHHORN：如果和 否則 - 就在這裡。
那麼，做那些樣子？
>> 學生：一個if else語句。
>> JASON HIRSCHHORN：是啊， 條件，對不對？
因此，我們可能會需要 寫一些條件。
再次，雖然也許在混亂 首先，我們一般有一種感覺，現在
如何寫條件和 語法條件。
如果我們不這樣做，我們只是查查 語法條件下，剪切和粘貼
如此，因為我們知道我們 在這裡需要一個條件。
我們看到，地圖上的任何其他事情 事情，我們可能需要做C語言？
是啊，Aleha？
>> 學生：這可能是顯而易見的， 通過只檢查，如果一個
值等於什麼。
>> JASON HIRSCHHORN：那麼我們該如何檢查 和 - 所以去到列表的中間
並檢查我們的價值在那裡？
我們怎麼做，在C？
什麼是語法是什麼？
>> 學生：等於，等於。
>> JASON HIRSCHHORN：等於，等於。
所以，這個檢查很可能會 是一種平等的，平等的。
所以我們知道我們需要在某個地方。
而實際上，只是在寫它， 我們看到其他的事情。
我們將不得不做一些 比較操作符在那裡 -
太棒了。
因此，它實際上看起來像，並通過 大，我們還沒有寫一個
C代碼字呢。
但我們得到的心智模式下來 通過講座和那些短褲。
>> 我們寫的偽代碼為一組。
而且，我們已經有80％，如果不 90％的是我們需要做的。
現在，我們只需要編寫 它，這又是一個
非平凡的問題要解決。
但至少我們堅持的邏輯。
至少現在，當我們去到上班時間， 我可以說，我知道我需要什麼
這樣做，但你可以提醒 語法我嗎？
或者即使上班時間都擠，你 可以為谷歌的語法，而
不是被卡住的邏輯。
>> 再次，而不是試圖解決 邏輯和語法問題都
一次，它往往是要好得多 破解這兩個難題扎進
2更易於管理的和做的 偽代碼在C中，然後再代碼
因此，讓我們看看我做的 偽代碼的時間提前。
>> 而該列表的長度大 大於零，看中間
的列表。
如果發現號返回true，否則 如果數值越高，搜索左。
否則，如果數量少，搜索 右，返回false。
這樣，看起來幾乎一模一樣，如果不 幾乎相同，我們寫了。
事實上，湯姆，你先說什麼， 斷，如果在列表中，中間
發現成兩個語句數 其實是我做了什麼。
>> 我結合他們那裡。
我應該聽 你的第一次。
所以這是偽代碼，我們有。
如果你想現在，對不起，請 回到我們最初的問題。
讓我們的代碼binary.c。
因此，實現一個迭代版本的 使用下面的二進制搜索
函數聲明。
>> 而且你也不需要複製 下來，只是還沒有。
實際上，我要去開 右上這裡binary.c。
因此，有函數聲明 在屏幕的中間。
你會看到我拿著偽代碼 從我的兩側，但幾乎是相同的
什麼，我們寫的， 把在為你。
所以，現在，讓我們花五分鐘 編寫這個函數。
>> 再次，如果您有任何疑問， 舉起你的手，讓我知道，我會
來到我身邊。
>> 學生：[聽不清]。
>> JASON HIRSCHHORN：所以我把二進制 在定義搜索
頂，上線12。
這就是我為我的幻燈片。
然後這一切的偽代碼，我只是 複製並從滑動粘貼
偽代碼的幻燈片。
我仍然不聽[聽不清]。
>> 所以，如果你已經完成了你的 實現，我要檢查它。
我發郵件給你的helpers.h文件 在前面這個類。
這將是在網上以及 下載的人看
本節的時間延遲。
而我只是用一般的分佈 從pset3代碼。
所以我把find.C，用我的helpers.h文件 而非helpers.h文件
這是由於在分配碼。
>> 我不得不做出一個其他變動 find.C而不是調用只是簡單地
搜索，調用binary_search的。
所以，如果你想測試你的代碼， 知道這是如何做到這一點。
事實上，當我們將執行這個代碼 現在，我只是做副本
我pset3目錄，再次換出 傭工文件，然後作出
在find.C改變binary_search的調用 而不是簡單的搜索。
>> JASON HIRSCHHORN：是的。
你有問題嗎？
>> 學生：沒關係。
>> JASON HIRSCHHORN：不用擔心。
好吧，讓我們開始吧。
我們將編寫此為一組。
另外一個說明。
再次，這是，可以很容易地進行交換 在對習題集三。
我有我的helpers.h文件，該文件，而 比helpers.h我們給出，
聲明二進制搜索，泡 排序和選擇排序。
而在find.c你會發現就行， 那是什麼，第68行，我們稱之為二進制
搜索，而不是搜索。
所以，再一次，這是可用的代碼 在網上，或者您是代碼
創建現在可以很容易地交換 在對p設置3進行檢查。
>> 但首先，讓我們來編碼二進制搜索。
我們的函數聲明， 我們返回一個布爾值。
我們採取所謂的整數。
我們以一個整數數組稱為 價值觀，我們取n是
該數組的大小。
在第10行，就在這裡，我有 犀利包括stdbool.h。
有誰知道為什麼會在那裡？
那麼，這行代碼呢？
>> 學生：它可以讓你 使用一個bool返回類型。
>> JASON HIRSCHHORN：沒錯。
>> 學生：或者它是一個庫，它允許 使用一個bool返回類型。
>> JASON HIRSCHHORN：那麼尖銳包括 stdbool.h行給了我一些
定義和聲明的東西 那我可以使用
這個庫。
因此，在那些被說有 這種類型被稱為布爾，並且它可以是
真的還是假的。
所以，這就是該行做。
如果我沒有那行，我會 惹上麻煩寫這
字就在這裡，布爾，在那裡。
完全正確。
所以我需要在這個代碼。
確定。
所以這再一次是一個迭代 版本，而不是遞歸1。
因此，讓我們開始吧。
>> 讓我們開始這第一 線的偽代碼。
並希望，我們會 - 或沒有希望。
我們要繞過去了房間。
我們會去一行一行的，我會幫助 你弄清楚，我們需要的行
先寫。
因此，儘管名單的長度 大於零。
讓我們開始在前面。
我應該寫什麼線 在這裡，在代碼中？
>> 學生：雖然括號 n為大於0。
>> JASON HIRSCHHORN：雖然 n是偉大大於0。
因此n是一個列表的大小， 我們正在檢查，如果 -
>> [插VOICES]
>> JASON HIRSCHHORN： - 對不起？
>> 學生：我們如何知道 n是列表的大小？
>> JASON HIRSCHHORN：對不起。
每pset的規範，搜索 和排序功能，你需要寫，
n是該列表的大小。
我忘了解釋這一點。
但肯定的。 n為的大小 的列表中，在這種情況下。
所以，當n大於0。
確定。
這可能證明是有點問題 不過，如果事情繼續下去。
因為我們將繼續了解 列表的大小在整個
功能，但說我們開始 與由5個整數的數組。
我們通過和我們已經 現在把範圍縮小到
2個整數的數組。
這2個整數是什麼？
大小為2，現在我們要 看，但2是什麼？
這是否有意義，這問題嗎？
>> 確定。
我會再問吧。
因此，我們用5這個​​數組開始 整數，n等於5，對不對？
我們將通過這裡運行。
我們可能會改變大小， 權利，繼續發展下去。
這就是我們說我們想做的事情。
我們不希望搜索 完整的東西了。
所以說，我們將其更改為2。
我們把一半的任務列表，奇怪。
所以，隨便挑2。
所以，現在n等於2。
我為窮人道歉 幹擦標記。
對不對？
我們正在尋找通過列表 再次用大小為2的列表。
那麼，我們的數組的大小是5還是。
我們說，我們只是想 搜索2點在裡面。
因此，這2點是那些？
>> 這是否有道理？
他們是左2點？
他們是正確的2點？
是他們中間的2點？
我們已經分手了問題了，我們卻 居然不知道其中的一部分
我們仍然在尋找這個問題， 只是通過讓這些2變量。
因此，我們需要多一點的話， 而n為大於0。
我們需要知道在哪裡 n是在我們實際的數組。
>> 所以，沒有任何人有一個 改變這條直線？
大多數這條線是 完全正確的。
難道還有其他的另外？
我們可以交換的東西出來n到 使這條線好一點？
嗯？
>> 學生：你能初始化變量 像長度為n的會被用來
在後面的功能？
>> JASON HIRSCHHORN：所以初始化 可變長度為n，
我們使用以後呢？
但是，我們剛剛更新的長度和我們 仍然會碰到這個問題，我們
減少我們的問題的長度， 但我們永遠不知道，其實，
該長度映射到。
>> 學生：是不是要發生 以後當你說，搜索左，
搜索吧？
你會去一個不同的 您的區域 -
>> JASON HIRSCHHORN：我們打算去 一個地區，但我們怎麼知道
這是去？
如果我們只有數組，這 N，我們怎麼知道在哪裡
到陣列中。
在後面，是嗎？
>> 學生：你有一樣，較低的 界和上界變量或
類似的東西？
>> JASON HIRSCHHORN：確定。
所以這是另一種思路。
而不是僅僅跟踪的 大小，我們保持了較低的軌道，
上界變量。
那麼，我們如何計算從大小 下限和上限？
>> [插VOICES]
>> JASON HIRSCHHORN：減法。
並且還保持跟踪的下 綁定和上界，讓我們知道，
我們正在尋找這兩個？
難道我們尋找這兩個在這裡？
我們正在尋找中間的兩個？
也許不是中間的兩個，因為 這一點，其實是二進制搜索。
但是，現在我們就可以得到大小， 而且該陣列的界限。
從本質上講，如果我們有我們的巨人 電話簿，我們撕成兩半。
我們現在知道，較小的 電話簿。
但我們實際上並不翻錄 電話簿的一半。
我們還需要知道在哪裡 我們的問題的新範圍是。
沒有任何人有任何疑問， 有關？
是嗎？
>> 學生：它會通過創建工作 變量i，你然後就轉移
我相對於它的位置 當前位置，並且長度中，n？
>> JASON HIRSCHHORN：什麼是我？
>> 學生：就像我是喜歡那種 -
就像你會初始化我是 陣列的中間位置。
然後，如果在位置i的值在 在陣列的發現中間
低於您所需要的價值，我現在 成為該陣列的長度，加上
i的值除以2。
像，看，你轉向我 -
>> JASON HIRSCHHORN：對。
>> 學生： - 到 -
>> JASON HIRSCHHORN：所以我幾乎 正面，將工作。
但問題是，你需要兩個 件的信息在這裡。
您可以用開頭和結尾做， 或者你可以用大小做，然後
一些標記。
但你需要兩件 此處的信息。
你不能用只有一個。
這是否有道理？
>> 所以，我們要通過，並 我們要做的[聽不清]
並創建一些標記。
所以，你在你的代碼寫的什麼了？
>> 學生：我剛才說的整型界 1等於0。
>> JASON HIRSCHHORN：讓我們把 這個int，開始。
>> 學生：確定。
>> JASON HIRSCHHORN：這使得 更有意義對我來說。
和？
>> 學生：我說，我猜，廉政結束。
>> JASON HIRSCHHORN：INT結束。
>> 學生：我猜，N減1， 或者類似的東西。
像，最後一個元素。
>> JASON HIRSCHHORN：所以你寫，詮釋 開始等於0，分號和INT
結局等於n，減去1，分號。
所以基本上，我們在做什麼 這裡，0的第一個位置。
正如我們所知道的陣列，他們不走 最多n，它們上升到n減去1。
因此，我們有我們的數組的一些界限。
而這些初始範圍恰好是 我們的問題的初始邊界。
確定。
所以這聽起來不錯。
然後，如果我們再回到這一行，而 列表的長度是大於0，
什麼，而不是n，應 我們擺在這裡？
>> 學生：寫結束減去開始。
>> JASON HIRSCHHORN：雖然結束負 開始是大於0？
確定。
我們可以，如果我們想 做一個更好一點，有什麼
我們還能做什麼？
如果我們想要清理 這段代碼了一點？
我們怎樣才能擺脫0？
這僅僅是一個風格問題。
這是正確的現在。
>> 學生：期末不 等於開始？
>> JASON HIRSCHHORN：我們可以做什麼呢？
>> [插VOICES]
>> 學生：期末更大？
>> JASON HIRSCHHORN：是啊。
我們可以在剛剛結束的做 大於開始。
右。
我們增加了開始的另一邊 那，我們擺脫了0。
因此，這只是看起來 點點清潔劑。
確定。
因此，儘管名單的長度為0，我們寫 ，雖然結局是更大
比開始。
我們打算把我們的需要 大括號，然後第一件事
我們想要做的是看 他們在一個小列表。
你呢？
你可以給我 -
>> 學生：如果括號 價值括號 -
>> JASON HIRSCHHORN：如果括號 值的方括號。
>> 學生：結束除以2。
>> JASON HIRSCHHORN：結束？
>> 學生：我看到你的一個問題 -
>> JASON HIRSCHHORN：確定。
好吧，看在中間。
我們怎麼知道中間是什麼？
是啊。
因此，讓我刪除那些代碼。
我們怎麼知道中間是什麼？
在任何事情，當你有初 而最終，你怎麼找到
中間？
>> 學生：你平均。
>> 學生：你將它們添加 在一起，然後 -
>> JASON HIRSCHHORN：加入他們 在一起，然後？
>> 學生：你平均。
除以2。
>> JASON HIRSCHHORN：加入他們 在一起，除以2。
所以整型中間等於？
湯姆，你可以把它送給我嗎？
>> 學生：期初加期末 -
>> JASON HIRSCHHORN：開始 加上結束。
>> 學生：全部，支架，除以2。
>> JASON HIRSCHHORN：所有在括號， 除以2。
所以，讓我中間 任何事物，正確嗎？
>> 學生：你還需要它向上舍入。
>> JASON HIRSCHHORN：你這是什麼 意思是，我需要它向上舍入？
>> [插VOICES]
>> 學生：因為，如果這是一個奇怪的 號碼，然後它就像 -
>> JASON HIRSCHHORN：嗯，好吧。
這樣我就可以把它向上舍。
但如果它是奇數，5，我可以 服用1遠離中間。
或者，如果它是偶數，相反， 這是一個更好的情況。
如果是4，我們只有4，我可以帶 第一個“中間”，報價，引文或
第二個“中間”之一。
要么將工作二進制搜索， 所以我實際上並不需要圓形的。
但有一件事我 需要看看這條線。
我們可能沒有意識到這一點， 但我們會回來的。
因為這條線實際上仍然 需要一件事。
>> 但到目前為止，我們已經寫了 四行代碼。
我們已經得到了我們的開始 和結束標記。
我們有我們的while循環，它映射 對直接向我們的偽代碼。
我們正在尋找一個映射中間 直接到我們的偽代碼。
我會說這正好到中間 名單，這行代碼。
然後，一旦我們去的中間 在列表中，我們需要做的下一件事
被檢查，如果我們的價值如何， 偽代碼，我們之前寫的。
>> 那麼我們該如何檢查，如果我們的價值 在列表的中間？
您。
你為什麼不這樣做呢？
>> 學生：如果我們的價值的是 在中間是等於
無論我們設定 -
我的意思是等於等於 -
>> JASON HIRSCHHORN：它 -
確定。
>> 學生：我不知道是什麼 變量，我們正在尋找
因為雖然，是因為 -
>> [插VOICES]
>> 學生：[聽不清]。
>> JASON HIRSCHHORN：沒錯。
每個函數的聲明， 我們正在尋找一個值。
所以，我們正在尋找一個值 在值的數組。
所以你完全正確。
你會做，如果開放的括號值支架 中間閉合支架等號
等於價值，裡面有 什麼我們需要做什麼？
如果我們的價值的存在，是什麼 我們需要做什麼？
>> [插VOICES]
>> 學生：返回零。
>> JASON HIRSCHHORN：返回true。
>> 學生：返回true。
>> JASON HIRSCHHORN：邁克爾， 這是什麼線路呢？
>> 學生：[聽不清]程序已經運行 它的路線，那就是結束了，
你已經什麼你需要做什麼？
>> JASON HIRSCHHORN：程序還是什麼？
在這種情況下？
>> 學生：該功能。
>> JASON HIRSCHHORN：該功能。
因此，要返回到任何所謂的 它並給它的價值，真正的。
完全正確。
主。
什麼是返回類型 主，邁克爾？
>> 學生：整型，整型？
>> JASON HIRSCHHORN：整型，沒錯。
一個整數。
這僅僅是一個問題，以確保 你們已經在它的上面。
這是什麼通常會返回，如果 所有的東西都運作良好？
>> 學生：零。
>> JASON HIRSCHHORN：零。
完全正確。
>> 學生：如果這只是返回true， 沒有信息報錯
關於什麼的 -
呵呵，這只是說了 值的數組裡面。
>> JASON HIRSCHHORN：沒錯。
這個程序沒有提供資料 的確切位置值。
它只是說，是的，我們發現 它，或者沒有，我們沒有發現它。
所以，如果發現號，返回true。
嗯，其實我們只是做了真正 迅速與一行代碼。
因此，我將動議該行偽代碼的。
>> 學生：不，我們需要 改變數組？
它應該是值，而不是價值，對不對？
>> JASON HIRSCHHORN：對不起。
謝謝。
>> 學生：是啊。
>> JASON HIRSCHHORN：此行 應該是價值觀。
完全正確。
確定。
因此，我們已經看了看中間列表。
如果發現號返回true。
我們的偽代碼繼續，如果 中間是更大的，搜索就走了。
所以，我在這裡，如果數 更高，搜索就走了。
康斯坦丁，你可以給 我這行代碼？
>> 學生：如果中間值 -
>> JASON HIRSCHHORN：所以，如果值 -
如果開括號值支架 中間靠近支架 -
>> 學生：是不是值小？
>> JASON HIRSCHHORN：是小於。
>> 學生：比價值減。
>> JASON HIRSCHHORN：值。
嗯，其實，你要 檢查數量 -
抱歉。
這是一個有點混亂。
但如果其他的數 名單的中間是更大的。
>> 學生：哦，好吧。
>> JASON HIRSCHHORN：我會改變這種狀況。
否則，如果中間是較高的，我們 要搜索左，好不好？
而我們該怎麼做內部 這一點，如果條件？
>> 學生：我可以做一個小改動 的情況下，如果將其更改為別的嗎？
>> JASON HIRSCHHORN：否則，如果？
確定。
所以這段代碼將執行 大致相同。
但是如果左右，其他使用好處 如果，否則，如果還是如果，否則，如果，否則
也就是說，只有其中的一個是要 進行檢查，而不是他們三個，
可能。
這使得它一點點 電腦這是上更好
運行你的程序。
>> 所以，[？康斯坦丁？]
我們這一行裡面，否則，如果值， 支架中間右方括號
大於價值。
什麼是我們需要做什麼？
我們需要搜索的左側。
我們該怎麼做呢？
我想給你一個開始。
>> 我們有這兩樣東西叫 開始和結束。
因此，需要做些什麼 要開始？
如果您要搜索的左邊 列表中，我們得到我們當前開始的。
我們需要什麼做的呢？
>> 學生：我們設置開始 到中間加1。
>> JASON HIRSCHHORN：所以，如果我們 尋找左側？
>> 學生：對不起，中間減去 -
這樣的結局會是中間 減1和開始 -
>> JASON HIRSCHHORN：什麼 碰巧的開始？
>> 學生：它保持不變。
>> JASON HIRSCHHORN：所以 含義保持不變。
如果我們在搜索的左邊，我們 使用相同的開頭 -
完全正確。
而故事的結局？
對不起，什麼是 再次結束平等的嗎？
>> 學生：中減去1。
>> JASON HIRSCHHORN：中減去1。
現在，為什麼減1，不只是中間？
>> 學生：中間是出 圖片已經，因為我們有
檢查它的呢？
>> JASON HIRSCHHORN：這是 完全正確。
中間是出來的圖片。
我們已經檢查了中間。
所以，我們不希望“中間，”報價 引文結束後，繼續在該
數組，我們正在尋找。
因此，這是夢幻般的。
>> 否則，如果值支架中間是更大 比值等於結束
中間減1。
傑夫，你看這個最後一行？
>> 學生：否則。
中間值小於值？
>> JASON HIRSCHHORN：我們會 你給我的東西。
所以，如果你不給我 -
>> 學生：所以後來開始 將中間加1。
>> JASON HIRSCHHORN：平等開始 中間加1，再一次，對於相同的
原因是君士坦丁 給了我們前面。
並在最後，誰沒有給 我的代碼行了嗎？
返回false，Aleha什麼 我們寫在這裡？
>> 學生：返回false。
>> JASON HIRSCHHORN：返回false。
而我們需要做的，因為如果我們 並不覺得，我們需要說我們
沒有發現它。
和我們說我們要返回一個 布爾，所以我們肯定是要返回
一個bool地方。
>> 因此，讓我們運行此代碼。
實際上，我要 -
所以我們在終端。
我們將清除我們的窗口。
讓我們把所有的。
我們發現有一個錯誤。
還有第15行錯誤，預期 分號的結束
聲明。
所以，我怎麼忘了？
>> 學生：分號。
>> JASON HIRSCHHORN：分號 直到這裡。
我認為這是湯姆的代碼。
因此，湯姆，[聽不清]。
只是在開玩笑。
讓我們做所有的再製作。
>> 學生：什麼Dropbox的目錄 我們應該在這？
>> JASON HIRSCHHORN：所以，你可以 只是看這一點。
但同樣，如果你​​想提出這個 代碼到您的pset3目錄試試
出來，這就是我所做的。
如果你會發現在這裡 - 對不起，很好的問題。
>> [？ LS，？]
我在這裡find.c代碼 從本週的發行版的代碼。
我有helpers.h。
我有一個Make文件我實際上是 編輯了一下，包括這些新
我們正在編寫的文件。
所有這些代碼將是可用的，不 分配的代碼，但新
製作文件，新helpers.h文件將 是下載在網上提供。
同樣地，所以這些都是在 額外的代碼，我們有。
>> 因此，請所有，每本線，使得查找， 二，泡選擇 - 品牌
他們三個都和編譯成 這個可執行文件代碼中找到。
所以一般情況下，我們不希望 直到check50。
我們要對我們自己運行一些測試。
但是，僅僅如此可加快我們這一點， check50 2013 pset3.find將通過
在helpers.c- - 我的壞。
>> 我沒有說現在。
因此，我們實際上是要 運行實際的代碼。
Usage.find /，你知道這意味著什麼？
>> 學生：你需要第二個 在它的命令行。
>> JASON HIRSCHHORN：我需要 第二個命令行。
並根據規範要求，我需要 進入我們正在尋找的東西。
因此，讓我們來看看42。
我們將保持它在排序的，因為我們 沒有寫一個排序功能，但 -
42，43，44。
>> 和控制D沒找到 大海撈針。
這是不好的。
這是肯定有的。
讓我們試試別的。
也許這是因為我把 但在開頭。
>> 讓我們做41，42，43。
我們走吧。
它發現了它。
讓我們把它在結束現在，只 所以我們可以徹底的 -
40，41，42。
沒有找到針頭。
所以我提到這點。
不幸的是，我知道這 將要發生。
>> 但用於教學目的， 這是很好的探索它。
這是行不通的。
出於某種原因，它無法找到它。
我們知道什麼是在那裡，但 我們目前還沒有找到它。
所以，有一件事我們可以做的是通過 GDB找到它，但確實有人，
無需通過GDB，有 在哪裡，我們搞砸了有意義嗎？
[？摩杜？ ？]
>> 學生：我想可能是結束的時候 等於開頭，它的
只是一個元素的列表。
然後，它只是忽略它，而不是 實際檢查它。
>> JASON HIRSCHHORN：這是 完全正確。
當結束等於開始，我們做 還有在我們的列表中的元素？
>> 學生：是的。
>> JASON HIRSCHHORN：是的，事實上，我們 有一個且僅有一個元件。
而這將極有可能發生時， 每次我們測試過的代碼，我們在
幹草堆或櫃檯 幹草堆的結束。
這就是開始和 結局是要等於
之一，二分查找。
因此，在這兩個情況下，沒有工作， 因為結束等於開始。
>> 但是，如果結束等於開始， 這是否while循環執行？
它沒有。
而且我們也可以檢查 這再通過GDB。
那麼，如何才能解決這個問題的代碼，因為 當結束時等於
開始，我們也希望這 while循環運行。
>> 因此，我們可以做什麼修復到第18行？
>> 學生：[聽不清]大 小於或等於。
>> JASON HIRSCHHORN：完全正確。
雖然結局是大於 或等於開始。
所以，現在，我們一定要得到那 角落的情況在年底。
讓我們來看看。
讓我們運行此一次。
>> 讓我們所有。
同樣，你必須只 跟著在這裡。
找到41這個時間。
只要保持一致。
>> 找到42。
讓我們把它在開始 -
42，43，44。
我們發現了它。
所以這的確是變化 我們需要做。
>> 這是一個很大的編碼，我們的 只是做了，二進制搜索。
沒有任何人有之前的任何問題 我謹對為我們寫了線
二進制搜索或者我們怎麼想通 什麼我們沒有搞清楚？
在我們繼續之前，我也想點 指出，總的來說，我們映射
我們的偽代碼之一 1到我們的代碼。
>> 我們確實有一個棘手的事情 找出與
開始和結束。
但你有沒有計算過了，你 會寫相當多的
相同的代碼，保存為 那些最上面兩行。
然後你會意識到，當 您在檢查和案件有否規定
你需要別的東西。
所以，即使你曾跟隨我們 偽代碼行來行，你就已經
得到了所有，但兩行 你需要編寫代碼。
>> 而我願意打賭，你們 本來都想通了這一點
很快，你需要把 某種標誌物在有圖
出你在哪裡。
這又是幹什麼的力量 偽代碼的時間提前。
所以我們可以做的邏輯，然後再 大家可以放心使用的語法。
>> 如果我們一直感到困惑的邏輯 而試圖寫這段代碼在C中，
我們會得到全亂了。
然後我們就可以問的問題 邏輯和語法和網格
它們放在一起。
我們會得到丟失 在哪可以迅速成為一個
非常棘手的問題。
現在讓我們繼續前進 要選擇排序。
>> 我們還剩下20分鐘。
所以，我有，我們將不能夠感覺 通過所有選擇排序的獲得
和冒泡排序。
但是，讓我們至少嘗試 完成選擇排序。
因此，實現選擇排序使用 下面的函數聲明。
>> 再次，這是從 問題設置規範。
int值是括號，是 整數數組。
和int.n是該數組的大小。
選擇排序是怎麼回事 這個數組進行排序。
>> 因此，根據我們的心智選擇的模型 排序，我們拉 -
首先，我們通過列表中的第一 時間，找到最小的數字，
把它放在開頭，找到第二 最小的數字，把它放在
如果我們要第二位置 排序按升序排序。
我不會強迫你寫 偽代碼現在。
>> 但在此之前我們做的代碼作為一個階級的 五分鐘，我們將寫
偽代碼，所以我們有一些感 的我們要去的地方。
因此，嘗試寫偽代碼 在你自己的。
然後再嘗試打開該 偽代碼轉換成代碼。
我們將做到這一點作為一個群體 在五分鐘內。
>> 當然，讓我知道，如果 您有任何問題。
>> 學生：那呢？
>> JASON HIRSCHHORN：看看有多少你 可以在兩分鐘搞定。
我知道你不會 能夠完成。
但我們將在此為一組。
>> 你所有的編碼等等[聽不清]，所以我 對不起暫停自己在做什麼。
但是，讓我們通過這作為一個群體。
再次，二分查找，大家給 我一個，如果沒有更多行的代碼。
謝謝你的。
我們打算做同樣的事情 這裡，作為一組一起碼。
>> 所以，選擇排序 - 讓我們寫 一些快速的偽代碼。
每心智模式，可以有人給我 第一線的偽代碼，好嗎？
我想要什麼做的？
>> 學生：雖然名單 出了毛病。
>> JASON HIRSCHHORN：OK，而 該列表是不合乎規程。
和你是什麼意思“壞了？”
>> 學生：在[聽不清]
沒有被排序。
>> JASON HIRSCHHORN：雖然名單 出了毛病，我們該怎麼辦？
給我的第二行， 請，馬庫斯。
>> 學生：所以找到下一個 最小的數字。
這將縮進。
>> JASON HIRSCHHORN：所以找到 下一個最小的數。
然後別人？
一旦我們找到下一個最小的 數，我們該怎麼做？
我要說找 的最小數量。
這就是我們想要做的。
>> 因此，找到最小的數字。
那麼我們該怎麼做？
>> 學生：[聽不清]為開端。
>> JASON HIRSCHHORN：對不起？
>> 學生：在將其放置 開始列表。
>> JASON HIRSCHHORN：所以把它放在 在列表的開頭。
而我們做的事情是什麼 這是在開始
列表中的，對不對？
我們覆蓋的東西。
那麼，我們把那？
是啊，安娜？
>> 學生：其中最小 數字是？
>> JASON赫希洪：所以把開始 列表中的其中
最小的數字了。
因此，儘管名單已經出來的順序，找到 最小的數字，將其放置在
該列表的開頭，把 開始列表的其中
最小的數字了。
馬庫斯，你可以整理這條線 而名單已經出來了的秩序？
>> 學生：雖然數字 未分類的？
>> JASON赫希洪：OK，所以為了 知道這些數字都沒有
排序的，什麼是我們需要做什麼？
有多少，我們需要 通過這個名單？
>> 學生：所以我想一個for循環，或 同時，在檢查數量較少
比列表的長度是多少？
>> JASON赫希洪：好，這是很好的。
我想我misphrased 我的問題知之甚少。
我只是試圖讓在 我們將不得不去
在整個列表。
因此，儘管名單已經出來的順序， 對我來說，是很難地圖。
但基本上，這就是如何 我想這個問題。
通過整個列表中，找到 最小數，將其放置在
開始 - 其實，你說得對。
讓我們把他們兩個。
>> 因此，儘管名單已經出來了的訂單，我們 需要經過整個列表
一次，找到最小的數字，地點 它在列表的開頭，把
在列表的開頭，其中 最小數目是，然後，如果
列表仍然失靈，我們已經 得去通過這個
進程再次，對不對？
這就是為什麼選擇排序，大O運行 選擇排序的，任何人嗎？
>> 學生：無平方。
>> JASON赫希洪：無平方。
因為像馬庫斯，我才意識到 在這裡，我們將不得不
通過列表名單 的次數。
所以，經歷的事 長度為n的n次號
其實是在Ñ平方。
>> 所以這是我們的偽代碼。
這看起來很不錯。
沒有任何人有任何疑問， 關於偽？
因為實際上選擇排序應該 大概要一對一，代碼
偽代碼。
因此，任何有關問題 偽代碼的邏輯是什麼？
現在請提問。
>> 選擇排序 - 而名單已經出來了 的順序，我們將通過它
並找出最小的每次 並把它放在前面。
因此，儘管名單已經出來了，可以順序 有人給我說行代碼誰
還沒有給我行 然而，代碼好嗎？
這聽起來像一個什麼？
>> 學生：這是一個for循環。
>> JASON赫希洪：聽起來 喜歡一個for循環。
OK，你可以給我的for循環？
對於 -
>> 學生：我等於0。
>> JASON赫希洪：我還是 -
什麼是我們缺少什麼？
善有善報就在這裡？
>> 學生：詮釋。
>> JASON赫希洪：沒錯。
（INT I = 0; -
>> 學生：我<N; i + +）。
>> JASON赫希洪：釘它，傑夫。
我們正在經歷的列表中，右鍵？
我們以前見過的代碼。
完美的。
所以，讓我們把我們的大括號在這裡。
我打算把一些 大括號在這裡。
>> 因此，儘管它是0，我們需要去 整個列表。
所以每次我們去通過列表， 什麼我們想跟踪的？
>> 學生：如果有任何掉期進行。
>> JASON赫希洪：查找 的最小數量。
因此，我們或許應該跟踪 最小的數字各一次。
所以，行，我可以做些什麼來保持跟踪 最小是多少？
Aleha，我怎麼能保持 軌道的東西？
>> 學生：開始一個新的變量。
>> JASON赫希洪：開始一個新的變量。
因此，讓我們創建一個變量。
什麼類型的？
>> 學生：詮釋。
>> JASON赫希洪：詮釋。
讓我們把它稱為最小的。
以及它等於什麼時候 我們剛剛起步的？
我們並沒有在列表中消失了呢。
我們在的第一部分 通過列出我們的第一次。
什麼是平等的， 最小的數字？
>> 學生：我的值。
>> JASON赫希洪：值I。
這聽起來完全正確的，對不對？
最小數目的開頭 就是我們在哪裡。
所以現在我們有我們最小的，我們需要 要經過整個列表和
比較這最小的 到一切。
那麼，我們通過清單了嗎？
邁克爾？
>> 學生：你需要做 另一個循環。
>> JASON赫希洪：另一個for循環。
讓我們開始吧。
給我一些代碼。
>> 學生：For循環 -
為最小 -
只是詮釋J，你可以說？
= 0;使得 -
>> JASON赫希洪：嗯，如果我們想 要經過整個列表 -
>> 學生：百靈<N，J + +）。
>> JASON赫希洪：神奇。
我們將通過 for循環一次。
我們如何找到 最小的數字？
湯姆？
我們目前最小的數字， 那麼如何才能找到新的最小？
>> 學生：我們可以檢查最小 我們也數大於
重視支架Ĵ。
>> JASON赫希洪：所以，如果最小的是 比數值支架Ĵ更大。
因此，如果我們目前最小的 大於 -
我要在這兩個線 對於第二個在那裡的代碼。
因為之前我們做任何交換，我們 需要經過整個列表。
所以這個偽代碼實際上應該 在外面的內循環。
這樣下去整個列表。
如果最小的大於 值Ĵ然後呢？
>> 學生：那最小的 等於值Ĵ。
>> JASON赫希洪：神奇。
一個簡單的問題 -
我們第一次去通過這個循環， 我是怎麼回事等於0，J是怎麼回事
等於0，一旦我們在這裡得到的。
所以，我們要進行比較 一個數字本身。
是有效的？
不，這不是真的有效。
因此，沒有我們的Ĵ需要去 從0到n每次？
我們總是需要檢查 整個列表？
[聽不清]？
>> 學生：開始我代替。
>> JASON赫希洪：j的 先從什麼？
>> 學生：我。
>> JASON赫希洪：j的與我開始。
所以，現在我們開始比較 有一個我們的。
但即便如此，是因為 盡可能高效？
>> 學生：我+ 1。
>> JASON赫希洪：I + 1似乎是 最有效的，因為我們
已經有我。
我們指出，由於 最小的線15。
我們將開始與 自動下單。
所以，我們通過for循環。
我們將通過各一次。
我們將通過數次。
現在，我們通過已經得到了 這種內在的for循環。
我們有最小的值保存。
我們需要將其放置在 開始列表。
所以，我怎麼把它放置在 開始清單？
這是指該變量 到列表的開始？
我們在此為外循環， 還等什麼指
開始清單？
>> 學生：我的值。
>> JASON赫希洪：完全正確。
值i是的開始 -
或不好意思，不是開始。
這是令人困惑的。
這也正是我們在年初 列表中的未排序的部分。
因此，重視我。
而這是什麼平等？
>> 學生：最小。
>> JASON赫希洪：值i等於什麼？
>> 學生：最小。
>> JASON赫希洪：最小。
完全正確。
所以我們將它放在開頭 名單的，現在我們需要把
該列表的開始的地方 最小的數字了。
所以，我怎麼寫的地方 最小的數是？
什麼價值觀？
>> 學生：0。
>> JASON赫希洪：小 數字是0？
>> 學生：是啊。
>> JASON赫希洪：那如果最小 人數在年底
這個無序列表？
>> 學生：對不起，究竟是什麼問題？
>> JASON赫希洪：哪裡是 最小的數字？
我們採取了最小，並把它在 開始，這條線就在這裡。
>> 學生：它應該有 被存儲在某種 -
>> 學生：值Ĵ。
>> JASON赫希洪：嗯，這是 不一定值Ĵ。
它甚至沒有在這一點上存在。
>> 學生：你要申報 一個變量更早，
然後將其分配到 -
當你發現的最小的數字， 該號碼的索引分配給
一些變量或類似的東西。
>> JASON赫希洪：所以可以 你再說一遍嗎？
>> 學生：那麼，您聲明整型 最小的，你也應該申報詮釋
最小的index = i或 類似的東西。
>> JASON赫希洪：那麼，我INT 最小的，我不應該只跟踪
的價值，但位置。
整型smallest_location =在這 情況下，我們就做我。
我們需要知道它在哪裡。
我們到了代碼的末尾，我們 意識到我們根本不知道在哪裡。
於是再次，我們的映射 這在一一對應的。
你們在自己的意志編碼這種 可能得到了同樣的問題。
如何赫克我找到它？
然後你意識到，等待，我 需要跟踪的那個。
>> 所以，如果最小的是更大 比的值Ĵ。
我們設定最小等於值Ĵ。
我們需要改變什麼？
康斯坦丁，還有什麼 我們需要改變？
>> 學生：位置。
>> JASON赫希洪：沒錯。
所以給我的代碼行。
>> 學生：smallest_location = j的。
>> JASON赫希洪：沒錯。
然後降底，如果我們想 放在列表的開頭，其中
最小的數字是，如何 我們指該
最小的數是？
馬庫斯？
>> 學生：最小數為 位於最小位置。
>> JASON赫希洪：所以在價值觀 smallest_location。
而我們放什麼呢？
的初 列表中，那是什麼？
>> 學生：嗯，我們真的不知道 了，因為我們改寫。
所以這是一個交換位置 在這兩行？
如果你周圍的切換這兩行。
>> JASON赫希洪：好了，我們不 了，因為我們已經復位線
前值i到最小。
所以我們失去了初始值。
所以你說的交換這兩行。
所以現在把列表的開頭 其中最小的數是。
所以smallest_location等於值I。
這是移動今年年初 的列表中的未排序的部分
最小的位置。
然後進入我的值我們正在 即最小數。
>> 這是否有意義，為什麼我們 不得不作出這樣的交換？
我們會覆蓋該值 - 另一件事，你可能會有
想通了，並在國內生產總值中找到。
因此，我們已經照顧 所有的偽代碼。
還有什麼我們 需要在這裡寫？
有誰能夠想到什麼？
>> 學生：你怎麼知道 當你做了什麼？
>> JASON赫希洪：我們如何 知道什麼時候我們做了什麼？
大的問題。
那麼，我們如何知道什麼時候，我們就大功告成了。
>> 學生：創建一個變量來計數 如果有做了一個交換與否
並辦理了一通。
>> JASON赫希洪：確定。
將工作在冒泡排序。
但對於選擇排序，如果我們不這樣做 做一個交換，那可能只是
因為最小的值是 在它正確的位置。
我們可能有一個列表1，2，4，3。
通過我們的第二次 不會讓任何掉期。
我們將在2號，但我們會 仍然需要繼續下去。
那麼，我們需要跟踪的時候 我們就大功告成了，還是我們只是想去
直到完成？
>> 學生：我們可以去 直到它完成。
>> JASON赫希洪：我們可以只 去，直到這個完成。
在冒泡排序，你是完全正確的， 傑夫和Aleha，與您的解決方案 -
它是偉大的跟踪有多少 掉期你做，因為在泡沫
排序，如果你實際上做不作任何掉期， 大功告成，你也許可以減少你
問題倒有幾分。
但對於選擇排序，你真的 有要經過的結束
列出在每個時間。
>> 因此，這是一點。
我們有兩分鐘時間。
讓我們所有。
讓我開在這裡找到，讓 相信我，其實調出 -
我不是叫冒泡排序。
讓我們改變這個來選擇排序。
使所有/找到。
讓我們來看看42。
這一次，我們要傳遞一個 未排序的列表中，因為它應該排序
首先，每找到代碼 - 要排序 第一次使用我們的排序函數，然後
尋找的東西。
手指交叉大家。
>> 哦，我的天啊。
哇，我的心臟跳動。
所以這是正確的。
事實上，如果我們跑這更 大量的代碼，盡我所能
說，是完全正確的。
還有一些建議 我會為你。
例如，15和16似乎 有點多餘。
好像你不一定 需要保存這兩個。
如果您有最小的位置，你 可以很容易地找到最小值
只是打字的i值。
>> 所以，如果我是被分級代碼， 我其實會，我會
大概起飛點，如果你 包括這兩種，因為你
不需要這兩個。
如果你有位置，可以 很容易獲得的價值。
這似乎有點不可思議 來存儲它們。
也許不拿一個點，而是 當然評論說，這也許是
不是一個風格上的選擇 你需要做。
當然，該代碼仍然 運轉很好。
>> 所以很遺憾，我們沒 得到冒泡排序。
我很抱歉這一點。
我們確實完成選擇排序。
沒有任何人有任何問題，最終 關於選擇排序？
>> 好了，我們才探出頭來，我要你 打開你的Chrome瀏覽器。
對不起，這僅僅是一個赤裸裸的插頭 一種類型的互聯網瀏覽器。
你可以打開任何類型的瀏覽器， 但它很可能是Chrome瀏覽器。
和去這個網站之後 -
sayat.me/cs50。
如果你不鍵入您的電腦 現在，你是清楚的
不這樣做，湯姆。
>> 並且請做任何權利 現在還是在接下來的一個小時 -
給我一些反饋。
這只是部分中的兩個。
我們有更多的共同擁有的，所以我 有很多的提升空間。
我希望也做了一些事情做好。
所以，你可以讓我覺得全是壞事，但如果 你也想​​給我一個笑臉
臉，我將不勝感激這一點。
填補英寸
>> 並與留一分鐘， 這是三週。
我就站在外面了一下 如果您有任何疑問。
我會看到你們 講課的明天。