羅布·鮑登:你好,我是羅布·鮑登, 讓我們來談談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。