羅布·鮑登：你好，我是羅布·鮑登， 讓我們來談談quiz0。
>> 所以，第一個問題。
這就是問題所在 你需要的代碼數量
127在二進制燈泡。
如果你願意，你可以 做常規轉換
從bi--或者，從十進制到二進制的。
但是這可能會 採取了大量的時間。
我的意思是，你可以弄清楚的是， OK，1是在那裡，2是在那裡，
4在那裡，8是在那裡。
更簡單的方法，127是128減1。
即最左邊的燈泡是128位。
所以127是真的只是所有 其他燈泡，
因為這是最左邊 燈泡減1。
這是它的問題。
>> 問題之一。
因此，與3位即可 表示8個不同的值。
那麼，為什麼是7最大的非負 十進制整數，你可以代表什麼呢？
那麼，如果我們只能 代表8個不同的值，
那麼我們將是 表示為0到7。
0佔用的值之一。
>> 問題二。
用n位，多少個不同的 值你能代表什麼呢？
所以，用n位，你有2個 可能的值的每個比特。
因此，我們有2個可能的值 第一個比特，2個可能的值
對於第二，2- 可能的三分之一。
所以這是2倍2倍2，和 最終的答案是2到n。
>> 問題三。
什麼是二進制為0x50？
所以請記住，十六進制有一個非常 簡單的轉換為二進制。
所以在這裡，我們只需要看看 在5和0獨立。
那麼，什麼是5二進制？
0101，這是1位和4位。
什麼是0的二進制？
不靠譜。
0000。
因此，只要把它們放在一起，並 這是二進制的完整號碼。
01010000。
如果你想你能 起飛的最左邊為零。
這是無關緊要的。
>> 所以後來另外， 什麼是為0x50十進制？
如果你想，你could--如果你 更舒適的二進制文件，
你可以採取二進制的答案 並且將其轉換成十進制。
或者，我們可以只記得 這十六進制。
使0是在第0位，並 該圖5是在16到第一位置。
所以在這裡，我們有5次16到 首先，加0次16至零，
80。
如果你看了 所有權的問題，
這是CS 80，這是一種 提示要回答這個問題。
>> 問題五。
我們有這樣的划痕腳本，它是 重複4次花生醬果凍。
所以，我們現在怎麼辦的代碼，在C？
好了，我們有這裡 - 部分以粗體 就是你必須實現的唯一部分。
因此，我們有一個4循環的循環4 次，printf的，荷蘭國際集團花生醬果凍，
新線的問題詢問。
>> 問題六，另一個划痕的問題。
我們看到，我們正處在一個永遠循環。
我們說的變量i 再遞增i增加1。
現在，我們想要做的是在C有 多種方法，我們可以這樣做。
在這裡，我們碰巧的代碼 永遠循環的，而（真）。
因此，我們聲明變量i，只是 像我們有變量i的划痕。
聲明變量i，並永遠 而（真），我們說的變量i。
所以printf的％我 - 或者你可以用過％D。
我們說的變量， 然後增加它，我++。
>> 問題七。
現在，我們想要做的事情非常相似 馬里奧C點的設置問題之一。
我們希望打印這些井號標籤， 我們要打印一個五
由三個矩形這些散列。
那麼我們如何做到這一點？
好了，我們給你一個整體 一串代碼，你只需
必須填寫打印網格功能。
>> 那麼，是什麼PrintGrid樣子？
以及你過去的 寬度和高度。
因此，我們有一個外4 循環，這就是循環
在所有的這行的 我們要打印出來的網格。
然後我們有跨嵌套4環， 這是印在每一列。
因此，對於每一行，我們打印了 每列中，一個單一的哈希值。
然後在該行的末尾，我們打印 單新走行到下一行。
這就是它整個電網。
>> 問題八。
像PrintGrid一個函數被認為是 有一個副作用，而不是返回
值。
解釋的區別。
因此，這依賴於你記住 一個副作用是什麼。
好了，回歸value-- 我們知道PrintGrid不
有返回值，因為 在這裡它說無效。
因此，返回void什麼 並沒有真正返回任何東西。
那麼什麼是副作用？
那麼，一個副作用是 什麼樣的是堅持
該函數結束後 這不是剛剛回國，
而且它不只是從投入。
>> 因此，舉例來說，我們可能 改變一個全局變量。
這將是一個副作用。
在這個特殊的情況下， 非常重要的副作用
被打印到屏幕上。
所以這是一種副作用 這PrintGrid了。
我們打印這些東西到屏幕上。
你能想到的 這作為副作用，
因為這件事情， 堅持這個函數結束後。
這範圍之外的東西 這個功能的最終
被改變，則 屏幕的內容。
>> 問題9。
考慮下面的程序， 哪個行號
已經被添加為 就事論事。
因此，這個程序我們只是 打電話的GetString，將其存儲
在此變量s，然後 打印該變量s。
行。
因此，解釋為什麼行一個存在。
＃包括CS50點小時。
為什麼我們需要＃包括CS50點H +
嗯，我們正在調用 GetString的功能，
和GetString的定義 在CS50庫。
所以，如果我們沒有 ＃包括CS50點H，
我們將得到的隱式聲明 中的GetString函數錯誤
從編譯器。
因此，我們需要包括library-- 我們需要包含頭文件，
否則，編譯器不會 認識到GetString的存在。
>> 解釋為什麼兩個線路是否存在。
因此，標準的IO點小時。
它是完全一樣的 如前面的問題，
除了沒有處理 GetString的，我們談論的printf。
因此，如果我們不說，我們需要 包括標準的IO點H，
那麼我們就不能 使用printf函數，
因為編譯器 不知道這件事。
>> Why--有何意義 無效的四線？
所以在這裡我們有INT主要（無效）。
這只是說，我們 沒有得到任何命令行
參數為主。
請記住，我們可以說INT 主要整型的argc字符串argv的括號內。
所以在這裡我們只說空說，我們 被忽略的命令行參數。
>> 說明，相對於存儲器，恰 什麼樣的GetString的直列六缸回報。
GetString的是返回的塊 存儲器，字符數組。
這真是一個返回 指針的第一個字符。
請記住，一個字符串是一個char明星。
所以s是一個指向第一個 字符的任何字符串
該用戶輸入的鍵盤。
而且內存恰好是malloced， 使內存堆中。
>> 問題13。
考慮下面的程序。
所以，這一切的計劃是做 是的printf-荷蘭國際集團1除以10。
所以，在編譯時和 執行該程序
產出0.0，即使 1除以10是0.1。
那麼，為什麼它是0.0？
那麼，這是因為 的整數除法。
所以圖1是一個整數，10是一個整數。
因此，1除以10，一切 被視為整數，
而在C中，當我們做整數除法， 我們截取小數點。
因此，1除以10 0，然後我們試圖
打印，作為浮點數，所以 零印作為浮點數0.0。
這就是為什麼我們得到0.0。
>> 考慮下面的程序。
現在，我們正在打印0.1。
因此，沒有整數除法， 我們只是打印0.1，
但我們在打印 28位小數。
我們得到這個0.1000，一大堆 零，5 5 5，等等等等。
因此，這裡的問題是，為什麼它 打印，而不是正好是0.1，？
>> 因此，這裡的原因是現在 浮點不精確。
請記住，一個浮動的只有32位。
因此，我們只能代表數量有限 浮點值與32
位。
那麼有最終無限 許多浮點值，
並有無限多的浮動 在0和1之間點值
我們很明顯的能 代表比甚至更多的價值。
因此，我們必須做出犧牲 能夠代表最值。
>> 因此，像0.1的值，顯然 我們不能代表完全一樣。
而不是代表0.1，所以我們做的 最好的，我們可以代表這個0.100000 5
5。
那是相當接近，但 對於很多應用程序
你不必擔心 浮點不精確，
因為我們只是不能代表 所有浮動點完全吻合。
>> 問題15。
考慮下面的代碼。
我們只是打印1加1。
所以這裡沒有竅門。
1加1的計算結果為2，且 那麼我們打印了。
這只是打印2。
>> 問題16。
現在，我們要打印的字符 1加1的字符。
那麼，為什麼這個不 打印同樣的事情？
以及人物1加字符 1，字符1的ASCII值為49。
所以這真的是說49加49，和 最終這將打印98。
因此，這不打印2。
>> 問題17。
完成實施 在這樣一種方式之下奇
該函數返回true，如果 n為奇數和假當n為偶數。
這是一個偉大的目的 對於mod運算符。
因此，我們把我們的參數n， 如果n MOD 2等於1，以及
這意味著n除 由2有剩餘。
如果n除以2有一個餘數，即 也就是說n為奇數，所以我們返回true。
否則我們返回false。
你也可以做N模等於2 零，則返回false，否則返回true。
>> 考慮遞歸函數如下。
因此，如果n小於或 等於1，則返回1，
否則返回n次F N減1。
所以，這是什麼功能？
好吧，這只是 階乘函數。
這是很好的代表 隨著n的階乘。
>> 所以，問題19，現在，我們要 藉此遞歸函數。
我們想讓它反复。
那麼，如何才能做到這一點？
以及為員工 溶液中，並且再次有
你可以做多種方式 這一點，我們先從這個INT產品
等於1。
和本 for循環中，我們將
最終要乘以產品 結束與全因子。
所以，對於int i等於2，我是 小於或等於n，我+ +。
>> 你也許會奇怪，為什麼我等於2。
好了，記住，下面我們就來 確保我們的基本情形是正確的。
因此，如果n小於或等於 1，我們只是返回1。
所以在這裡，我們開始在i等於2。
那麼，如果我是1，那麼the--或 如果n為1，則對環
會不會執行的。
因此，我們將只 返回的產品，這是1。
類似地，如果n是 任何小於1--
如果它是0，負1，whatever-- 我們還是要回到1，
這正是 遞歸版本做。
>> 現在，如果n是大於 大於1，那麼我們就要
這樣做至少有一個 迭代這個循環。
所以我們可以說，n是5，那麼我們就 要做到產品的時間等於2。
所以，現在的產品是2。
現在，我們要做的 產品的時候等於3。
現在是6。
產品多次等於4，現在是24。
產品倍等於5，現在是120元。
這樣的話，最終，我們返回 120，這是正確的5階乘。
>> 問題20。
這是一個你必須填寫 在該表中的任何給定的算法，
任何事情，我們已經看到，這 符合這些算法的運行
這些時代漸近運行時間。
那麼，什麼是一個算法， 歐米茄是1，但為n的大O？
所以有可能是無限 很多答案在這裡。
我們已經看到了可能是最一 經常只是線性搜索。
>> 因此，在最佳情況 情況下，我們的項目
尋找的是在 開始列表的
所以在1步歐米茄， 我們檢查的第一件事，
我們只是立即返回 我們發現該項目。
在最壞的情況下， 該項目是在末端，
或產品不在列表中的。
因此，我們必須尋找 整個列表，所有的n
元素，這就是為什麼它是0：N的。
>> 所以，現在它的東西，既是 歐米茄的n log n的和正數為n的大O。
以及最相關的事情 我們在這裡看到的是歸併排序。
所以，歸併排序，請記住， 最終THETA
的n log n，其中THETA定義的 如果兩個歐米茄和大O是相同的。
以上所說的n日誌N。
>> 有什麼東西是歐米茄 的n和n阿方？
好吧，再有 多種可能的答案。
在這裡，我們碰巧說冒泡排序。
插入排序也將在這裡工作。
請記住，冒泡排序 具有優化的地方，
如果你能得到 整個列表
而不需要做 任何掉期，然後，嗯，
我們可以立即返回 列表進行排序開始。
所以，在最好的情況下， 它只是歐米茄的n。
如果它不只是一個很好的 排序的列表，首先，
那麼，我們有n個阿方互換。
最後，我們選擇排序 對於n的平方，兩個歐米茄和大O.
>> 問題21。
什麼是整數溢出？
好了，類似於早期， 我們只有有限個位
來表示的整數， 所以也許32位。
比方說，我們有一個有符號整數。
那麼，最終的最高 正數，我們可以代表
為2至31減去1。
那麼，如果我們試圖發生 然後增加該整數？
好了，我們將在2要到31 減1，一直到負2路
到31。
所以這個整數溢出 當你不斷遞增，
最終你不能 得到任何提高，它只是
包裝所有的方式回到 周圍為負值。
>> 那麼緩衝區溢出？
所以緩衝overflow-- 記得一個緩衝區。
它的內存只是一大塊。
類似數組是一個緩衝區。
因此，緩衝區溢出是當 您嘗試訪問的內存
超出該陣列的端部。
所以，如果你有一個 5號和您的陣列
嘗試訪問陣列支架 5或6架或支架7，
或超越什麼 端，或甚至任何
below--陣列支架負面1-- 所有這些都是緩衝區溢出。
你觸碰內存在惡劣的方式。
>> 問題23。
所以在這一塊你需要 實現strlen的。
我們告訴你，你可以 假設的意志不能為空，
所以你不必 做任何檢查空。
並有多種方式 你可以這樣做了。
在這裡，我們只取簡單。
我們先從一個計數器，N。 n為 計算有多少個字符有。
因此，我們從0開始，然後我們 遍歷整個鍊錶。
>> 為s托架0等於 空值終止符？
請記住，我們正在尋找 空終止符
以確定多長時間我們的字符串是。
這是要終止 任何相關的字符串。
所以是S支架等於0 以空終止？
如果不是，那麼我們要 看看在s支架1，S 2架。
我們繼續下去，直到我們 找到空終止。
一旦我們發現了它，那麼n包含 字符串的總長度，
我們可以只返回。
>> 問題24。
因此，這是一個，你 必須做出權衡。
所以，有一件事是在一個很好的 的方式，但以何種方式是壞？
所以在這裡，歸併排序趨於 比冒泡排序快。
儘管如此that--很好，有 多個答案在這裡。
但最主要的是，冒泡排序 是歐米茄的n的有序表。
>> 還記得我們剛才前面看到的那個表。
所以，泡各種各樣的歐米加 N，在最好的情況下
是它能夠只走了過來 列表中一次，確定
嘿，這個東西已經是 分類和回歸。
歸併排序，不管是什麼 你這樣做，是正數為n的歐米茄。
因此，對於排序的列表，泡沫 排序將是更快的。
>> 現在來談談鍊錶？
這樣一個鍊錶可以增大和縮小 根據需要以適合盡可能多的元素。
話雖如此that-- 通常的直接比較
將是一個鏈接 列出與陣列。
因此，即使陣列可 輕鬆地擴展和收縮
以適應盡可能多的元素 根據需要，一個鍊錶
相比於一個array--一個 數組隨機訪問。
我們可以索引到任何 所述陣列的特定元素。
>> 因此，對於一個鍊錶，我們不能 只要到了第五元素，
我們必須從一開始遍歷 直到我們得到的第五元素。
而這會阻止我們 做類似二進制搜索。
說起二進制搜索，二進制搜索 往往比線性搜索更快。
儘管如此that-- 因此，一種可能的事
是你不能做的二進制 搜索鍊錶，
你只能做的陣列。
但或許更重要的是 你不能做二進制搜索
在未排序的數組。
前期可能需要進行排序 數組，然後才可以
你做二進制搜索。
所以，如果你的東西是不是 排序，首先，
然後線性搜索可能會更快。
>> 問題27。
因此，考慮下面的程序， 這將在下一幻燈片。
這是一個在那裡我們 會想明確說明
的值不同的變數。
因此，讓我們看一下。
>> 因此，行一個。
我們有整數x等於1。
這就是發生的事情，唯一的事。
因此，在一行中，我們看到我們的 表中，Y，A，b和tmp中都
昏了過去。
那麼，什麼是X？
嗯，我們只是將它設置為1。
然後兩線，好吧， 我們看到的是y被設置為2，
而且該表是已 填補了我們。
所以x是1，y是2。
>> 現在，三線，我們現在是 裡面的交換功能。
沒有我們通過什麼來交換？
我們通過符號X的 一，和符號Y表示B。
問題出在哪裡更早 表示x的地址
是0x10的，和y的地址為0×14。
所以a和b都等於 為0x10和0x14的分別。
>> 現在，在3線，什麼是x和y？
好了，一切都沒有改變 關於x和y在這一點上。
即使他們是 主堆棧幀裡面，
他們仍然有同樣的 價值觀，他們以前那樣。
我們沒有修改任何內存。
因此x為1，y為2。
行。
所以現在我們說INT TMP等於一個明星。
因此，在四號線，一切 是除TMP一樣。
我們沒有改變任何值 任何東西，除了TMP。
我們正在設置TMP等於一個明星。
什麼是明星？
好了，點X，所以一個明星 將會等於x，它是1。
所以，一切都被複製 下來，而tmp中被設置為1。
>> 現在的下一行。
明星等於星級的住宿。
因此，通過線five--好了，一切都 除非是無論明星是一樣的。
什麼是明星？
好了，我們剛才說的明星為x。
所以，我們正在改變x等於明星B。
什麼是明星B？年。 B點為y。
所以，明星B為y。
因此，我們設定X等於Y， 和其他一切是一樣的。
因此，我們的下一行中看到，x是現在 2，剩下的只是抄了下來。
>> 現在，在下一行，星B等於tmp目錄。
好了，我們剛才說的星b為Y， 所以我們則設置y等於tmp目錄。
其他的都是一樣的， 所以一切都被複製下來。
我們則設置y等於tmp中，這是 一個，其他都是一樣的。
>> 現在，終於，七號線。
我們又回到在主函數。
我們交換完成後。
我們已經失去的a，b，和 TMP，但最終我們
不更改任何值 在這一點上任何東西，
我們只要複製x和y下來。
而且我們看到，x和y是 現在2和1，而不是1和2。
交換成功執行。
>> 問題28。
假設你遇到 該錯誤消息
辦公時間如下 明年的CA或TF。
提醒如何修復這些錯誤。
所以未定義的引用給GetString。
為什麼你可能會看到這個？
好吧，如果學生使用 GetString的在他們的代碼，
他們正確地散列包括CS50 點h至包括CS50庫。
>> 那麼，他們是怎麼 要解決這個錯誤？
他們需要做一個破折號lcs50在 當他們編譯的命令行。
因此，如果他們不通過 鐺破折號lcs50，他們是
不會有實際 實現GetString的代碼。
>> 問題29。
隱式聲明 庫函數strlen的。
嗯，這現在，他們都沒有 做正確的散列包括。
在這種特定情況下，在頭文件 他們需要包含的字符串點H，
而包括串點H，現在 現在student--編譯器
有權訪問 strlen的聲明，
它知道你的代碼 正確使用strlen的。
>> 問題30。
更為％的轉化率 比數據參數。
那麼這是什麼？
清楚地記得，這些百分比 signs--他們是如何相關的printf。
因此，在我們的printf可能percent-- 我們可以打印的東西
像我百分之反斜杠ñ。
或者我們可以像打印百分之一， 空間，百分之一，空間，百分比我。
因此，對於每一個這些 百分號，我們需要
傳遞變量在printf的末尾。
>> 所以，如果我們說的printf括號％的 我反斜杠N分別閉合的括號，
好了，我們說我們是 將要打印的整數，
但我們不通過的printf 一個整數，以實際打印。
所以在這裡更多的百分 轉換不是數據的參數？
這是說，我們有 一大堆的百分數，
我們沒有足夠的變量 實際上填寫的百分比。
>> 然後肯定，對於問題31， 在一個塊肯定瘦了40個字節。
所以這是一個Valgrind的錯誤。
這是說， 在某個地方你的代碼，
你有一個分配是40 字節大的，所以你malloced 40個字節，
你永遠不會釋放它。
最有可能你只需要 找一些內存洩漏，
找到你需要 釋放內存此塊。
>> 和問題32， 無效的寫入大小4。
再次，這是一個Valgrind的錯誤。
此不必做 現在有內存洩漏。
這是最likely--我的意思是，這是 某種無效的內存權利。
而最有可能的，這是一些 排序緩衝區溢出。
在那裡你有一個數組，也許 一個整型數組，讓我們
說這是大小5，你 嘗試觸摸陣列支架5。
所以，如果你試圖寫入該 值，這不是一塊內存
你實際上可以訪問，並 所以你會得到這個錯誤，
說大小4無效寫。
Valgrind的是要認識到你 試圖不恰當地觸碰到內存。
>> 就是這樣的quiz0。
我羅布鮑登，這是CS50。