DAVID J.馬蘭:這是CS50和 這是4週的開始。 而且,男孩,是大眾汽車 都是因為軟件的麻煩。 讓我們一起來看看。 [視頻回放] -Cars,最聰明的人物 在速度與激情的電影。 本週,德國汽車製造商 大眾發現自己 在醜聞的中間 潛在犯罪的比例。 -Volkswagen是支撐數十億 罰款,可能的刑事指控 它的高管,如 該公司道歉 為索具1100多萬輛汽車,以 幫助它戰勝排放測試。 - 某些柴油車型分別為 設計與先進的軟件 即使用信息,包括 轉向和車輛的位置 速度來確定賽車 進行排放檢測。 該種情況下,發動機 會減少有毒物質的排放。 但車被人做了手腳旁路 當它被驅動。 排放量增加10至40 次以上可以接受的EPA水平。 [結束播放] DAVID J.馬蘭:所以,讓我們 看看這個 看看這是怎樣 可能實施 以及如何這可能會影響 這麼多車這樣。 所以在我的手裡這裡的新聞 釋放由EPA--發行 環境 保護機構這 是美國的監管機構, 處理環境問題, 然後將實際 這是法律聲明 短短數天前發送給大眾。 因此,EPA寫道,現在公開 公開,一個成熟的軟件 算法的某些 大眾汽車檢測 當汽車發生 官方的排放測試 和原來完全排放 只在測試過程中控制上。 的有效性 這些車輛污染 排放控制設備是很大的 在所有正常行駛減少 的情況。 這導致符合汽車 在實驗室或測試標準 站,但在正常操作期間 排出的氮oxides--或NOx-- 在高達40倍的標準。 由大眾汽車公司生產的軟件 是報價引文結束,落敗的設備, 由清潔的定義 美國空氣法案。 他們接著說, EPA和其他機構 發現的失利裝置 後獨立分析軟件 研究人員在西 弗吉尼亞大學。 氮氧化物污染有利於 二氧化氮,地面臭氧, 和細小顆粒物質。 暴露於這些 污染物已被鏈接 具有廣泛的 嚴重的健康影響, 包括增加哮喘 攻擊等呼吸道 疾病,可以足夠嚴重 派人到醫院就診。 暴露於臭氧和 顆粒物質還具有 過早被相關 死亡是由於呼吸相關 或心血管相關的影響。 兒童,老人,殘疾人 預先存在的呼吸系統疾病 尤其在風險 這些污染物對健康的影響。 我只想是說,這是相當嚴重的。 讓我們繼續閱讀 只是多一個節選 然後我們將看看 潛在影響 這在汽車的情況下。 具體而言,大眾汽車 製造和安裝 軟件在所謂的 電子控制 module--或ECM-- 這些車輛感測 當車輛正在測試為 符合EPA排放標準。 基於各種輸入,包括 方向盤的位置時,車輛 速,發動機的持續時間 操作,並且大氣壓力, 這些輸入準確 跟踪參數 用於聯邦測試程序的 對於EPA認證排放測試 的目的。 在美國環保局的排放測試, 車輛ECM軟件 然其生產的軟件 標準的排放結果。 在其他時候, 車輛ECM軟件 跑了獨立的道路 校準從而減少 的有效性 整體排放控制系統, 具體地,選擇性催化 降低貧NO x的trap-- 我們將看到在某一時刻。 NO x的結果,排放 增加10至40倍的因子 上面的EPA標準的水平 根據驅動週期的類型。 那麼這到底是什麼意思,和 源代碼的軟件的運行 在大眾汽車的還沒有 尚未公開披露, 是,有效地,這 相當於是冥冥之中有內 大眾的代碼。 如果正在測試,和如果車 檢測某些環境因素 像方向盤 位置或運動 或缺乏的車或 任何數量的其它因素 當前假設 是這個配方的一部分, 他們只需打開 全排放控制。 換言之,便開始 排放減少污染物。 否則,在每一個其它情況 當它不被檢測為 在實驗室裡,他們只是不。 所以你可以簡化成多 具體的偽代碼的東西 這樣的。 如果車輪轉動,但 方向盤不是,暗示 這輛車是一些 一種轉筒 但在某種 倉庫正在測試中, 然後表現為 EPA想你。 否則不。 因此,讓我們一起來看看 在短視頻的 考慮看看哪些影響 是這實際上機械。 [視頻回放] -Last週五美國環保署宣布部分 2009年之間進行大眾奧迪汽車 而今年用 所謂敗設備 要解決排放法規 旨在保持空氣清潔。 但是,這是什麼意思是什麼呢? 那麼,現代汽車有幾十個 裡面他們的計算機。 而其中的一些計算機 幫助協調功能 發動機為最佳的 同時確保性能 有沒有太垃圾了 走出排氣管。 他們實際上已經工作 這種方式對於現在幾十年。 基本上,每一個部分 現代汽車的發動機 具有傳感器或控制器 就可以了,而這些計算機 正在閱讀數據數千 每秒進行調整時間 像燃料與空氣的比率 那將會進入汽缸。 這些欺騙大眾 和奧迪車型都是柴油車, 和柴油多了一個 真正重要的計算機 控制參數,這是 未燃燃料的去量 到排氣。 現在,聽起來很糟糕。 聽起來並不像你想 未燃燒的燃料在進入排氣。 但在一個的情況下 柴油,你有什麼 所謂的NOx捕集器是一種裝置,其 吸收和陷阱的氮氧化物 這是污染物會 否則進入大氣中。 這NOx捕集效果 是加強與未燃燒的燃料。 所以一場失利設備是一個特殊的程序 裡面的這些計算機,可以使 看起來像汽車達到排放 標準,即使它沒有。 大眾汽車有一個問題就煩。 它的柴油發動機被稱為 獲取巨大的燃油經濟性, 但NOx捕集僅工作良好 當更多的燃料正被使用。 所以車子就發現, 使用這種設備的失利, 當它得到了一個排放 測試中,它會使用更多的燃料, 使NOx捕集工作做好, 排放量將被罰款。 但你得到的道路上,該裝置 關閉時,你燃燒更少的燃料 但是你把高達40倍 更多的污染物進入大氣。 但到底如何做 轎廂知道是 被測試的排放標準? 環保局說,這是一個複雜的 系統檢查的事 像方向盤的位置, 速度快,發動機有多長時, 甚至大氣壓。 換句話說,有 沒辦法,這是意外 因為軟件是 設計得非常仔細地檢測 正式排放測試。 這是一些相當嚴重 欺騙,這就是 為什麼大眾在 如此嚴重的麻煩。 事實上,他們的CEO,馬丁 文德恩,剛剛卸任。 那麼接下來會發生什麼? 好吧,如果你的一半萬分之一 柴油捷達,甲殼蟲,的高爾夫,帕薩特, 或者奧迪A3S影響, 好在是 你的車仍然是安全駕駛。 你不必把它扔掉 直到大眾汽車發布召回。 但在某些時候,他們是 可能將不得不 更新你的車裡面的軟件。 當發生這種情況你可能 得到每罐少英里。 律師們早已摩拳擦掌 彌補集體訴訟 因此,業主可以得到補償 在未來的某個時候。 但是,這不會 發生任何時間很快。 [結束播放] DAVID J.馬蘭:所以這實際上提高了 一個有趣的大局觀問題 作為信任。 對嗎? 我們每個人都有的iPhone或機器人或 東西在我們的口袋裡最有可能 這些天來,或筆記本電腦 在我們圈是 發運行的軟件 蘋果和微軟 其他公司和束。 但是我們怎麼知道什麼 這些軟件產品都在做 實際上是什麼,這些 公司表示,他們正在做什麼? 舉例來說,誰的 說,你每次 打個電話在您的iPhone 或Android手機或類似, ,這一電話號碼也不是 被上傳到一些公司的服務器 因為有些節目你已經 寫的,無論是操作 系統本身喜歡的iOS或Android, 還是因為你已經下載 一些第三方應用程序 不知怎的被監聽 一切你打字或 一切你實際上說。 你怎麼知道的是,當 你們正在運行鏘 或者讓編譯您 在CS50,怎麼自己的軟件 你認為CS50自己的員工, 由CS50庫的方式, 一直沒有記錄每 你收到的字符串 還是地地道道你收到? 那麼,你當然可以看 在東西的源代碼 像CS50庫, 可以看看源代碼 對於Linux操作系統 在CS50 IDE中運行。 但是,一個驚人的表現 給予早在1984年 在收到的圖靈獎由 已知的非常著名的計算機科學家 as--叫肯·湯普森誰 獲得了圖靈獎哪些 是有點計算機科學的 諾貝爾文學獎,如果你願意, 他在一個工作 操作系統被稱為 Unix的,這是在非常相似 精神,我們使用的是Linux操作系統。 他問的問題,他的 獲獎感言,基本上 放下了框架 年復一年的討論 關於信任和安全,是這樣的。 應在多大程度上一個信任一個 聲明一program--一塊 的software--是免費的木馬? 也許是信任更重要 誰寫的軟件的人。 而事實上,我們已經鏈接 該傳言稱,他 在接受這一獎項時,給了 在CS50網站上的80年代 在今天的講座頁。 因為你會看到什麼 是,他居然給 怎麼連一個​​相當簡單的例子 編譯器像鏘或什麼 編譯器他人已經使用在過去, 如果嵌入了編譯器,我們什麼 自己使用是一個幾乎沒有 條件,基本上說, 如果您發現該代碼使用 在GetString函數或調用getInt 功能,繼續前進,插入 後門或木馬 這樣該程序 現在有一些零 和那些做一些惡意的。 記錄你的所有 按鍵,上傳數據 一些服務器,還是真的什麼。 什麼肯·湯普森 繼續做他的談話 是要證明,即使 您可以訪問源 編譯器的代碼 惡意可能會做這個, 這並不重要,因為 有這種雞與蛋 過去的許多現實 年即編譯器 用於編譯自己。 換句話說,一個人回來的路上時, 只好寫了第一個編譯器。 此後,任何時候他們已經更新 一個編譯器,通過改變它的源代碼, 增加功能並重新編譯 對於我們這樣的人使用,那麼, 他們使用舊的 版本的編譯器 編譯新 版本的編譯器。 如果你看看 在他給了談話, 你會看到,由於 那個圓的, 你其實可以有錯誤或 木馬嵌入軟件 我們使用。 而且,即使你看 源代碼的程序, 它甚至可能不是顯而易見 因為掛羊頭賣狗肉實際上是 在一個有些舊版本 編譯器,從此便 注入威脅到我們的軟件。 這僅僅是說,我們 真的不能也不應該 在我們的筆記本電腦信任的軟件運行 或電話或任何數量的位。 而事實上,後來在這個學期的時候 我們開始談論網絡編程 而真正開始建設 Web應用程序自己, 我們將談論這些 威脅和其他。 現在,你可能想知道,發現 ,有一個小小的達斯 維達的剪輯 邊緣是顯示有 關於大眾。是否 你從來沒有見過,我 認為我們應該減輕 心情,因為這是所有 很鬱悶的和可怕的。 我要回頭看 在超級杯2011 當一個商業用 Volkswagen--這 幾乎讓他們可愛的again-- 播出,第一次在電視上。 這是60秒的剪輯 我想你會喜歡。 [視頻回放] [MUSIC - 題材從“星球大戰”] [狗叫] [汽車啟動] [結束播放] DAVID J.馬蘭:是的。 我只是檢查。 這車是違規的名單上。 好的。 所以我們看一些 前偽片刻。 這裡是一個更大的 的偽代碼段 我們已經見過幾次迄今。 而讓我們使用這是一個機會 現在來介紹一種新的編程 我們做技術 見算法 上週,當我們看著歸併排序。 但是,讓我們正式確定一下,看看如何 我們可以使用它在實際的代碼, 然後我們將使用這個 技術的道路最 可能解決某些其他問題。 所以這是第一個項目之一,我們 曾經寫道,儘管在偽代碼。 而這是什麼程序 讓我們做課程 是要找到麥克·史密斯在電話簿。 同時注意在特定行8 和11有這樣轉到聲明。 而事實上,某些 語言,C其中, 實際上確實有 聲明字面上 去,讓你 跳轉到指定的行。 一旦因為它是一般不贊成 它可以很容易被濫用 你就可以開始你的跳躍 項目所有的地方,而不是 使用的那種 邏輯和控制流 我們已經使用迄今只 循環和條件等。 但是,我們可以簡化這個算法 在偽代碼如下。 相反,這種反复的 或循環的方法 我們一直走去, 回來,回到線三條, 正中下懷我們為什麼不踢多 一般說,在七號線和10, 只需更換這兩個 對用線, 否則,如果史密斯早 在本書中,我們將 搜索麥克在 書的左半邊。 否則,如果史密斯後來在 書,在右邊的搜索麥克 一半的書。 同時注意已圓。 對嗎? 我在尋找邁克 電話簿,然後 我最終也許打 七號線或者10號線 和我的指令對自己的搜索 麥克一半的電話簿。 好了,我怎麼尋找邁克? 我在中間 搜索麥克,為什麼 樣的,你給我轉了一圈? 但是,這是因為什麼是確定 情況發生的問題的大小, 寫在管線7和10? 我們不只是說搜索 麥克,搜索麥克。 我們具體說了什麼? 在左半邊尋找他 右半邊是有效 該問題的一半大小。 所以沒關係,我們是那種 搞這個循環, 這種循環論證, 因為至少我們 使問題越來越小。 而最終我們將到達 即所謂的基的情況下 我們只有一個頁面left-- 上週我們的志願者 did--我們有一個頁面 離開,然後我們不 要不斷尋找麥克·史密斯 因為他無論是在該網頁上 或者他是不是。 那麼我們怎樣才能實現這個想法,這個 排序圓在實際的代碼嗎? 好了,我們可以利用技術 該真實一般被稱為遞歸。 我們已經看到了這個在 偽代碼歸併排序最後一周。 回想一下,這是 偽代碼歸併排序。 這可以說是比更簡單 泡沫或選擇或插入排序 只是在簡單計 使用它可以表達出來。 但是,這是因為 我們是那種圓 他說,搜索的東西 通過再次尋找它。 但是,我們正在尋找無論是在 左半或右半 然後最終我們 合併在此情況下。 但在這裡,也與 這兩種類型的線條, 沒有我們再次有這樣的 想法遞歸。 而具體是什麼意思, 在一個算法的上下文中, 是一個算法是遞歸 如果使用或調用本身。 或用C方面,一個功能是 recursive--一個調用的函數 foo是遞歸的,如果FOO, 某處它的源代碼, 調用函數foo本身。 而這一切的話永遠富不壞 是一次次給自己。 這是確定的,如果FOO最終停止,一樣 歸併排序,說,等一下, 如果這個問題是超 小,例如, 或者我發現他的人,我 尋找,只是返回。 不要遞歸,不 週期性再次調用自己。 因此,讓我們一起來看看 這是如何實際工作。 所以,我要繼續前進,開 在這裡兩個源代碼示例。 其中之一稱為西格瑪0。 這是不是在所有 遞歸,但讓我們 一起來看看這是什麼程序做。 我已經去除了所有 從中但所有評論 對CS50的源代碼 網站上有,如果你的意見 希望通過它來讀取一次。 而讓我們做一對夫婦 神智檢查這裡。 因此,在這段代碼的頂部, 我們有包括CS50.h. 這是什麼呢? 這裡為什麼是它? 在合理通俗地說。 它有什麼作用? 是啊。 聽眾:所以調用getInt功能工作。 DAVID J.馬蘭:所以這 調用getInt功能工作。 因為這裡面 文件CS50.h,這 不久的我們會看到 它的源代碼方面, 有一堆的功能 declared--調用getInt,GetString的, 和一幫others--的除非 我們實際上有包括線路, 編譯鏘不 要知道它的存在。 而且同樣適用於線 2其中int定義 printf的,這是一個功能 我們繼續使用相當多。 現在,四線似乎有點時髦 因為它只是一個單行。 它有一個分號,沒有捲曲 牙套,它裡面沒有任何代碼。 但是,我們才稱之為 這件事情在過去的幾個星期? 是啊。 因此,一個原型。 為什麼我們有一個 原型,這似乎 是有點多餘 通常是因為我們平時 再次查看功能 後來在該文件中,對不對? 那麼,為什麼我們have--你只是 抓你的頭,但我會接受它。 是啊。 聽眾:[聽不清] 主後功能。 DAVID J.馬蘭:沒錯。 這樣編譯器知道你 最終確定或實施 之後,主要的功能,大概是。 所以鏘最 編譯器是一種愚蠢的 他們會只知道 你告訴他們。 如果你想使用 一個名為西格瑪功能, 你最好教的編譯器 它存在於提前。 現在,主本身,甚至 雖然這是一幫行, 是現在非常熟悉的希望。 它有一個do while循環 在生活中,其目的 這裡顯然是獲得一個 從用戶正整數。 而只是一味地纏著他 或她,直到他們合作。 隨後在第16行我有 一個有趣的電話。 IntAnswer。 這在左手 邊給了我一個Int 它可以store--稱為Answer-- 這是要以存儲,顯然, 西格瑪的返回值。 所以適馬只是一個 任意但有意義的名稱 我已經給一個函數 在生活中,其目的 是需要一個argument-- 我們把它叫做N的這個case-- 和剛採取這一數目的總和 再加上每一個正數的 比它小。 所以,如果我通過了2號線到 西格瑪,我要加2加1 加上0--不0--這樣給我3。 如果我通過在3個西格瑪,我想 有3加2加1,這給了我6。 等等。 因此,它只是增加了所有的 數小於或等於它。 現在,到這裡我只是去 打印出來的答案。 因此,作為一個快速的完整性檢查,讓我們 使六西格瑪0--點斜線西格瑪0-- 並讓我在2型。 而我確實拿到3。 讓我輸入3。 我確實得到6。 如果任何人都可以快速地做數學題, 如果我做50我該怎麼弄? 聽眾:[聽不清]。 DAVID J.馬蘭:哦,不。 但是1275這是非常密切的。 因此,這是在做50的結果 加49加48加47加46 一路下跌至1。 所以這是所有六西格瑪一樣。 但是,讓我們看看怎麼樣了 現在已經實現了。 所以到這裡是函數本身。 而這似乎並不有 任何與遞歸呢。 事實上,我們正​​在使用 老派技術。 我初始化的變量稱為總和 到零,然後我有一個foreloop在這裡, 而我所謂的聲明一個Int 我,將其設置等於1-- 雖然我可以將其設置為 零,但由於我在做加法, 誰在乎,如果是0或1。 這將沒有任何效果。 所以我迭代,​​只要我是 小於或等於m,其中 是傳入的參數。 然後,我只是不停 一,增量和Insight 循環的所有我做的是做總和 加等於一,這就是故意的。 我並不想這樣做,在這 情況下,像總和加上加。 我想實際添加 I的電流值 這使越來越大 做大到正在運行的理貨。 然後我返回總和。 所以回答得的價值總和。 然後,我把它打印出來。 因此,有一個機會,在這裡, 雖然,那種簡化 這段代碼概念 而那種打擊一個人的 介意條款 簡單,即使它 需要一段時間來排序 中明白為什麼這 就是在這些小例子強大。 這裡是西格瑪埃德蒙頓所以 第二個版本的代碼。 一切都往上頂是相同的,從而 同樣的故事,適用於前。 但是,現在讓我們來看看 實施六西格瑪的哪些 我已經削減到只有這 lines--四行代碼,真的, 再加上一些大括號和空白。 但是我在做什麼? 如果m小於或等於 零,我需要那種處理 該超級簡單的情況。 如果你把我零或任何東西 負這只是奇怪, 我只是隨意 但始終返回零。 我不希望這件事 進入一些奇怪的無限 因為負值循環。 所以,我只是說,如果你給我 小於或等於0,我回零。 但是,這是好事,因為這是 電話簿中的單頁 剩下的。 我咬過一個很具體的問題, 並沒有要求什麼遞歸。 但在第31行,什麼 我似乎是在做什麼? 括號只是保持 事情,希望更清晰一點。 但是,所有我做的是我 返回M--什麼 你的手我 - 加 M--遺憾的價值, 加為m減1西格瑪的價值。 所以,這是什麼意思? 如果你給我3號作為輸入, 答案我想獲得最終 6,因為3加2加1給了我6。 但我怎麼想 如何代碼運行? 我第一次打電話西格瑪 我傳遞值3, 這等於是說了一塊 紙,這裡的值3 我一直在傳遞這是西格瑪。 顯然3不小於0,所以 IF條件不適用。 的人這樣做。 所以,我該怎麼辦? 我想回到米,這是 3,加西格瑪為m減1。 因此,讓我跟踪了這一點。 我打算把這個 一張紙了。 而什麼樣的價值,是 清晰的,我是要通過 進入適馬在這一點上的故事? 什麼號碼? 2,對不對? 3減1,2。 所以,我只是需要一點點 紙片在這裡。 所以,現在西格瑪是越來越再次調用。 我也故意放 下來,因為它是 有點像暫停 該版本的故事 因為現在我專注 對m的減1的信號。 因此,M的3,M減1,2。 因此,這裡是2,我已經通過了。 2顯然是不小於 0,這樣的情況下不適用。 否則我回到米,這是這個 的事情,再加上西格瑪還有什麼價值呢? 因此,如果1--的西格瑪因為m是 現在2 SO 2減1為1。 所以,現在我只值1。 我只是路過的數量 1到函數sigma-- 還是我自己這裡 - 所以1顯然是不 小於零,仍然不適用。 否則返回1加什麼西格瑪? 0。 因此,讓我只記得。 我會回來以後。 現在我要繼續前進,並記 向下數0,因為這是 我的論點或參數。 我順利通過了數0 最後這個過程 只是重複自己的廣告 nauseum不會停止,因為什麼 我馬上做一次,我看到這個0? 我回零。 所以,現在你必須倒回的故事。 如果我現在往回走的時候, 什麼是最近的事 我做了,如果你是從字面上 倒帶視頻? 我要拿起最新的 1這給了我1加0就是1。 如果我繼續倒帶 故事,那將會給我 2加上該運行值,這是1。 所以這是3。 然後,我會繼續後退。 當我第一次放下數量 3--所以3 + 3給了我6。 而現在,如果你倒帶 視頻,直到這一點, 這是很 第一個問題我問。 當傳遞3,什麼是3西格瑪? 它們也確實6的總和 所有這些紙片。 因此,如果這需要一點時間來 包裝你的頭腦圍繞,這很好。 但認為這是一個little--它 是非常謹慎的,我疊 在彼此的頂部,這些數字。 這有點像有一個 memory--創紀錄的時間, 像在視頻洗滌器, 我的確可以倒帶研究。 而且我們要回來 隱喻的只是一點點。 但首先,事實證明,有 很多愛好者和有趣的人, 我想,在谷歌。 會有人誰是非常 擅長谷歌搜索的頭腦 上來就一會兒和 幫我尋找的東西? 非常,非常低調。 有人誰是從來沒有 來之前,也許吧。 確定。 是嗎? 來吧。 下來吧。 你叫什麼名字? SAM:山姆。 DAVID J.馬蘭:薩姆,下來吧。 這是相同的。 認識你很高興。 嘿。 你過來吧。 所以,我需要你做,如果 你可以,山姆,這裡是谷歌。 您可以搜索術語遞歸? 不要糟蹋。 現在let's--是的。 單擊OK了。 更好單擊。 啊,明白這一點。 沒有? 確定。 因此,讓我們做一對夫婦的人。 與其說相關 學術在這裡,但你 曾經搜查谷歌的字謎? SAM:第 DAVID J.馬蘭:OK。 搜索字謎,而不是遞歸。 怎麼樣歪斜。 你有沒有搜索歪? 現在,這個有點困難 見但希望everything's--確定。 這只是你和我享受這個。 確定。 那麼最後,這個one's-- 這是一個有點歪。 現在做一個桶滾。 太好了。 好的。 非常感謝薩姆。 在這裡你去。 謝謝。 那麼是什麼在所有事情 這些愚蠢的例子嗎? 因此,其實,引擎蓋下 谷歌的數百萬行代碼 顯然是一些愚蠢的IF 這本質上是條件 檢查用戶是否具有 鍵入這句話, 做一些事情,大概花了 時間的非平凡量 實施只是為了 有趣的是這種方式。 但是,這一切都沸騰 向下至罩下方。 但是,當然,遞歸 更的更老派 例如在那些特殊的技巧。 而且肯定有其他人在那裡 同時,我們也許甚至還沒有 發現只是還沒有。 因此,採取一看,還是考慮 現在下面的程序, 當然抓住任何 這些對你的出路。 我要繼續前進, 打開一個程序,是 要嘗試交換兩個值。 但在此之前,我們去那裡,讓我們做到這一點。 我們可以多一個獲得 志願者,我覺得呢? 你願意做志願者? 沒有? 上來吧。 上來吧。 好的。 所以,你的名字是什麼? LAUREN:勞倫。 DAVID J.馬蘭:勞倫。 上來吧,勞倫。 所以勞倫正在 這裡的挑戰如下。 認識你很高興。 因此,勞倫在這裡有在前面 她的兩個空杯子。 而且我們有一些橙色 果汁和一些牛奶 我們打算去 進取,做到以下幾點。 我們只是要填補這個。 在這裡幾盎司的牛奶,讓我們 補一點橙汁在這裡。 而在所有的前 這些觀眾, 交換這些杯的兩個值。 把橙汁中的奶杯 而牛奶中的橙汁杯。 你會怎樣做,如果你在 家庭和能夠獲得其他用品? LAUREN:把它放在另一個杯中。 DAVID J.馬蘭:OK。 因此,讓我們有一個臨時的 可變的,如果我們的意願。 現在繼續前進,實現 同樣的交換過程。 所以,好。 我們已經把OJ到臨時 變量,牛奶倒入OJ變量, 現在的臨時變量 到牛奶變量。 確定。 所以非常好,到目前為止完成的。 因此,原來out--認為, 想了一會兒就好了。 在這裡,只是怪胎它了一下,這 將相應的C代碼 我們只是執行。 我們有兩個輸入,a和b,這兩個 我們只想說的簡單是 廉政局。 並注意在這裡,如果我想交換 兩個變量,a和b的值, 我們的確需要一個中間人,一 臨時變量,暫時杯, 到其中的傾的一個值 因此,我們有一個佔位符吧。 但隨後的代碼正好是 作為勞倫這裡實現。 現在,只是為了獲得一個 有點瘋狂,原來 你可以做到這一點沒有 一個臨時變量。 要做到這一點正確的,但是,我們要 有騙一些化學反應。 我們這裡有一些額外的杯子。 所以最接近看起來 像牛奶和水perhaps-- 或牛奶和OJ--是我們有一些 水,所以我們要填補這一個 有幾盎司的清水。 這可能是太多了。 是啊。 這是肯定吃不消。 保持在一秒鐘。 而現在我們有油,我記得 初中化學課, 但願它不會與水混合。 但是,它像是一種 看起來像牛奶和OJ。 所以,現在,無需使用 一個臨時變量, 你可以交換這兩個值? 因此,油進入水杯, 水進入油杯。 LAUREN:沒有其他的杯子? DAVID J.馬蘭:沒有其他的杯子。 而且我已經不實際 今年前測試這 所以我不知道這是否會 實際工作化學。 這是不應該發生的。 難道它的工作? 好的。 因此,分離? 好。 現在,我們得到得到 水倒入另一個杯子。 智慧的化學濃縮可能 可能做到這一點比我強。 LAUREN:水的底部。 DAVID J.馬蘭:這是該water-- 什麼是關鍵的最後一次,我們這樣做。 你必須做正確的順序。 是啊。 That's--確定。 所以,現在我們有油兩杯。 確定。 這是確定的。 但是,化學,如果這工作不是我 - LAUREN:這是水。 DAVID J.馬蘭:這主要是水。 好的。 但是,這仍然是相同的杯子和以前一樣。 所以倒它 - 嘗試在那邊。 確定。 這是一個很好用的上課時間今天。 確定。 所以,現在we--不錯。 排序的。 好的。 所以非常好。 謝謝勞倫。 非常出色地完成。 所以為了使你的頭腦, 這也許是東西 有,如果你喜歡CS50 ID玩, 你可以,事實上,交換兩個變量 不使用臨時整數。 這是相應的C代碼。 如果你從過去的回憶 週三,我們介紹了,如果簡單地說, 一些新的運營商℃,不 有人回憶一下那個小胡蘿蔔 符號是,那個小三角 從鍵盤符號表示? 什麼位運算符? 聽眾:EXOR。 DAVID J.馬蘭:EXOR。 異或。 所以,如果你想,只是為了好玩。 回家,給a和b兩個任意 像任何eight--和I值 會選擇八位值。 如果你有32位做到這一點, 你會很快感到厭倦。 但是,只要給一個八位 值是什麼,一,二, 並給B A類似的價值。 然後使用定義 XOR從上週三, 應用該的點點滴滴,每 那些八位在每個a和b, 然後根據此代碼,這樣做完全。 而且這不是什麼不正確 你在這裡看到的屏幕上。 它確實可以歸結 三XOR運算 不知何故神奇地一和 b目錄都會交換職位 而不丟失任何信息。 因此,油和水的技巧是 最接近真實世界的化身 我能想到的模仿。 但它肯定更容易 使用一個臨時變量, 在這裡這種情況下。 而這也是一個機會說, 太,這種微優化, 作為一名計算機科學家 可以說,雖然一種樂趣 吹噓你如何做到這一點沒有 像一個額外的變量交換, 這還不是所有的說服力。 由於保存32位,如 在實際的整型的情況下, 是不是所有的吸引力 一個系統,其中上 你可能會使用幾十兆 甚至更多的內存等這幾天。 而事實上,當我們得到 到後來問題集 而要實現咒語 檢查你會 被質疑這樣做有 這是小的RAM和盡可能少 時間盡可能的 還是computer--您 有一個星期來實現 它 - 你會have--你會 面臨的挑戰是減少這些資源。 而這真的是唯一的 時報到本學期 在那裡你會被鼓勵刮鬍子 關閉即使是最優秀的性能 成本並非如此。 那麼what--怎樣才能 看到這樣的實際代碼? 現在讓我繼續前進 並開闢一個例子 故意叫 沒有交換,因為它不 其實交換變量 因為你實際上可能期望。 因此,讓我們一起來看看。 這裡有一個程序,沒有CS50 庫回事,只是標準的I / O。 現在我們有一個原型 用於交換往上頂剛剛 意味著它一定是在後面定義。 而這裡的主力。 我任意分配x和y, 分別值之一和兩個 只是因為他們是小 易去想。 然後,我只是有一堆用printfs的 在那裡我有一個全面的檢查。 x是1 y是2大概是 什麼樣的printfs輸出會說。 因此,沒有魔法迄今。 然後,我要索賠 打印清晰度,交換點點點。 我會打電話給交換 功能,通過在x和y。 而且,我們現在假設 掉期完全實現 因為這是一個時刻前 用臨時變量。 所以我要求大膽,調換。 x是現在這個y是現在。 但該文件,當然, 被稱為沒有交換。 因此,讓我們其實看看會發生什麼。 如果我編譯沒有交換,然後 做./noswap,x是1,y是2。 交換交換。 x是1,y是2。 因此,它實際上似乎是,即使有缺陷 雖然swap--讓我們向下滾動now-- 是按照完全實現 代碼我剛才提出的。 所以我們不會獲得幻想 與XOR的東西現在。 這也正常吧 像牛奶和OJ, 但它似乎並不奏效。 因此,讓我們再次做到這一點。 也許我只是不運行它的權利。 因此,讓我們再次運行沒有交換。 或許我 - 沒有。 所以它只是不工作。 因此,讓我們做一個小的完整性檢查。 讓我在這裡交換繼續 並且只需添加,等待一分鐘, 一個是%I / N,讓我們 插件的一個的值。 因為我真的想 看看發生了什麼事情。 事實上,這是 調試技術 你可能會使用 辦公時間或在家已經, 類似於第一丹的一半 Armendariz環的視頻在PSET3 其中,我們介紹了打印清晰度為 推薦的技術中,至少 對於簡單的情況。 讓我繼續前進,運行make 再沒有交換,./noswap。 有趣的。 所以,注意什麼似乎是正確的。 x 為1,y是2,但a為2時b為1。 因此,這兩個不知何故交換 但x和y是沒有得到交換。 所以要清楚,發生了什麼 是,在這裡我有X和Y 而這些都是局部變量,在 主要適用範圍,我傳遞的x和y 交換。 現在,掉期,作為一個單獨的功能, 可以自由地調用它的參數 或者它的參數什麼就是了。 富或酒吧或x或y或a或b。 只是為了清楚,他們是 不相同的x和y本身 我已經說過了a和b。 但是,我們可以打電話給他們任何我們想要的。 所以它看起來像 交換被傳遞 x-- AKA A--和它的 傳遞y-- AKA灣 不知怎的,這三條線都 正是這些交換價值 作為勞倫就與牛奶和OJ。 但是,當我們打印出 的值,a和b 的確交換,但X和 y的不改變它們。 回想一下,x和y是在這裡。 因此,我們可以通過看這 另一種技術為好。 而這也是一個技術 嵌入在問題設定了三個。 讓我們繼續前進,並為此在 CS50 ID,如果你還沒有。 在右側我們 有這樣的調試器選項卡。 如果你打開這個了, 有一些神秘的信息 多數民眾贊成在投擲您最初。 但是,讓我們取笑這除了真正的快。 所以一個,你看到的局部變量。 原來,打造成為CS50 IDE和 很多編程環境的更多 一般是一個調試器。 一種工具,可以讓你直觀地看到 什麼是你的節目裡面發生 而不必訴諸於添加 printfs輸出和編譯並運行 和添加的printf的,編制和 運行時,它已經在辦公時間 或家庭,大概是 越來越漂亮乏味。 所以在這裡,在短短的時刻,我們 要看到的實時 我們的局部變量的值。 我們也將能夠設置 所謂的斷點這 有機會在我的計劃暫停 執行在特定的代碼行 我很好奇。 對嗎? 這些方案在瞬間運行。 它是一種很好的為我們人類更慢 要能夠暫停,花一點時間,看看 什麼是圍繞回事 一定行的代碼 沒有程序耕翻 通過它,完成全部。 因此,一個斷點將允許我們 打破和暫停在某一點。 調用堆棧是一個奇特的方式 說功能是什麼目前 被調用的時刻。 主總是首先調用。 但是,如果主調用 函數稱為交換, 我們真的要看到這 塔的功能,已 所謂逆時間順序。 因此,讓我們看到這一點。 我要縮小。 我要回到我的代碼。 而只是因為我想 這裡是迂腐, 我要繼續前進,然後點擊 只是五號線的左側。 這創建了一個紅點。 並注意在右手側 調試器知道,哎, 我剛才說了一個斷點 noswap.c五號線,特別是 在這行代碼。 因此,調試器知道我 有請下一次 我跑我的程序就暫停 在此執行,而不是僅僅 運行整個事情的超級快。 所以,現在我要點擊調試 在IDE的頂部按鈕 而這要做到以下幾點。 這將打開一個最初有點 可怕看第二終端window-- 從遠程調試 舉辦這樣和such-- 我們會回來的是什麼 所有這意味著不久。 但是,什麼是重要的,現在 是那個紅點被擊中, 調試器具有故意 暫停execution-- 不是本身該行,但是,從第一 線的在該函數中的實際代碼。 這就是為什麼七號線是 現在,以黃色突出顯示。 現在,讓我們來看看 在右手側。 它看起來像,在默認情況下, 好聽的是,x具有什麼價值? 0。 和Y有什麼價值? 零。 這是可以預料的意義 x和y--的黃色line--有 還沒有執行。 的SO x不應該具有值1。 它可能具有任何其他值, 所謂的垃圾值。 我們很幸運,因為它是 在這一點上為零,基本上是。 所以,現在這裡只有少數 按鈕,我們需要照顧 關於這種方式調試時。 請注意,在這裡,我們有一個播放按鈕。 如果我們發揮,或打 恢復,這只是 經過運行 該程序的其餘部分 或者直到遇到另一個斷點。 但我沒有設置任何其他 斷點所以它只是 經過運行結束。 那種連敗的 閒逛的目的。 所以,相反,我很在乎 這些圖標右側。 如果我將鼠標懸停在 他們,你也應該這麼做, 你會看到小tips--工具提示。 這一個是步過。 現在,這並不意味著跳躍 下面的一行代碼。 這只是意味著執行它, 移動到下一個,移動到下一個, 移動到下一個。 換句話說,通過 那個按鈕,我可以走 通過我的代碼,一步一個腳印的時間。 逐行逐字地。 現在,到右側 這,還有另外一個 我們會看到在短短的時刻。 這就是所謂的 步入圖標的 要允許我潛水 成另一種功能。 但是,讓我們來看看在短短的時刻。 所以,我要點擊跳過。 而現在發現,我點擊 這個按鈕在右上角, 保持你的眼睛大致在本地 變量和看看會發生到x什麼。 x是現在的1,因為 黃線目前已執行 我們已經轉移到8號線。 而在短短的一瞬間ÿ 應該有希望成為2。 現在,沒有什麼有趣 發生了一點。 這一切是printf的。 同時注意,在我的副終端 窗口,我看到打印高清輸出。 而現在我必須做出一個 決定程序員。 我能跨過這條線的 代碼執行,但不 越來越好奇裡面有什麼。 或者,我可以真正踏進去 去交換本身的內部。 因此,讓我們做後者。 讓我繼續前進,點擊 不踩過去,但步入。 請注意,突然 窗口變化 以突出所述第一 線的交換代碼。 這是第21行。 而現在,有什麼樣的時髦的是, 如果你看過來,符合市場預期, 逗號b為1和2。 為什麼是臨時32,767? 回顧溫度,很像 空杯剛才, 這裡宣布第21行。 為什麼32,000-我的意思是,這是為什麼 它只是一些奇怪的值? 是嗎? 聽眾:這不是初始化。 DAVID J.馬蘭:這是 未被初始化。 因此,我們的電腦總是 有物理內存。 它總是有物理RAM。 而總有為零的 和一個人在那裡,對不對? 因為我們使用我們的 計算機整天, 您使用的是CS50 IDE 或服務器整天。 這樣RAM或者有一些零或 有些人的或者一些零和一。 不管是否 不是你使用它們。 你不能只是有空白 空間,您要位。 他們要么零和一。 所以,事實證明,臨時的,因為 我們沒有初始化它, 我們這些32位,但他們還沒有 被初始化到任何已知的值。 所以,無論他們是最 最近使用for--的32 bits-- 我們只是看到一些文物 以前使用這些特定的32 位。 當我點擊步過,雖然, 唷,溫度將會獲得價值1。 如果我再這樣做,一個是 將要給出的值2 然後b為要 被賦予值1。 還等什麼高興現在 這點在故事 是調試器是 給我看,超級慢 在我自己的節奏,有什麼 交換的狀態。 但是請注意,在這裡的頂部,通知 該調用堆棧實際上 有兩層到它。 現在,這突出顯示為一 交換,如果我在主營點擊相反, 注意局部變量如何變化 因為開發人員可以只跳 各地去到任何不同的範圍。 因此,即使我們正在做這一切 工作,並正確地交換a和b, 如果我去來回交換之間 其中a是2,b是1和主, 一直主要受到影響呢? 第 那麼,有什麼外賣嗎? 嗯,事實證明,任何時候 你調用一個函數像交換, 你通過它的參數,是什麼 你傳遞的交換功能 在這種情況下是一個拷貝 這些論點。 因此,如果x和y分別是每個 32位,什麼交換也越來越 是兩個新的地方 變量或參數, 稱為一個和b--但這些都是任意的 names--但是零點的圖案 和1的內部a和b是 排隊是相同的x和y 但它們不是 同樣的事情,x和y。 就好像主在其片 紙張的數量1和2為x和y, 然後當它手中那 一張紙來交換, 交換非常快變 自己的筆,記 圖1和2自身的紙片 手回原來的XY主 然後做自己的 與a和b的事情。 這是因為現在的超級重要 這有平凡的意義 對於實際編寫正確的代碼 因為它似乎我們不能互換 兩個變量。 我寫了一個正確的交換功能。 我們與勞倫實現了它作為 正確的交換功能,在現實中, 但顯然沒有了 如果事情你不能真正 交換兩個值永久。 因此,我們需要另一種方式 真正得到這個, 我們需要能夠 實際上解決這個問題。 而事實證明out--,我們會來 回到這個特定圖片 long--之前,這是一種方式 你可以畫出你的計算機的內存。 這只是一個矩形。 你可以任意繪製 的方式,但它的數量 先畫出它作為 矩形的理由如下。 我們要開始今天及以後 談到所謂的棧。 且堆棧只是一大塊 的RAM-- memory--的一大塊 該功能可訪問 當他們是所謂的。 所以,事實證明,在 這個堆棧的底部 是所有主要的局部變量 和org C和有機V和所有的東西 是要去默認。如果主 調用其他一些功能像掉期, 同時,交換是會得到另一個 層的上面記憶起來。 所以只給你一個快速粗略 這個畫面,如果我去了這裡 - 讓我這反映在 開銷well--真正讓我有, 如果我們只關心 這幅畫的底部,現在, 是,當我運行一個程序 而主要被調用, 主要被給予一個組塊 內存在我的電腦是 在此所謂的堆疊的底部。 而且我要畫它 特意為正方形。 因此,這就像32位或4個字節。 如果這主要功能有一個 變量名為x為1的值 並且它有一個稱為可變 y隨的2的值,這是 喜歡採取這種條子的內存 主已經通過操作定 系統並瓜分,使 第一本地變量超出這裡, 第二個放在這裡,這就是它。 當主呼叫交換,交換 都有自己的內存片 我們將得出這樣的 從操作系統, 而這將有其 根據自己的局部變量 我們實施早期 與局部變量 和b,最初 得到的值1和2。 不過,只要 在交換代碼執行, 和勞倫實際交換的 辛普森和牛奶,發生了什麼? 那麼,這2成為1,本 1正在成為2,和,順便說一下, 有一個臨時變量,正在被 使用的整個過程中,最終 消失。 但它並不重要 多少工作你做 在這條線在此內存空間of--, x和y是完全不變。 因此,我們需要給予一些方法 交換和功能,例如它 秘密訪問,如果你願意,給 功能li​​ke--到存儲器像x和y。 因此,讓我們一起來看看 一個例子,可為 我們來看看到底是什麼一直 怎麼回事這整個時間。 我要繼續前進 開拓比較為零。 而且我要關閉 我們的調試器,我要去 關閉這個面目可憎消息 剛說,等一下, 你在中間的調試。 我要在這裡隱藏此選項卡 剛回到簡單。 如果GDB被殺害所以不要擔心。 這只是意味著,該方案具有 已經辭職,故意在這種情況下, 由我。 而現在比較零做到這一點。 我使用的是CS50 庫中的標準I / O。 我有一個主要功能第一 說,說些什麼,並得到一個字符串。 然後再和說 得到另一個字符串。 並注意這兩個字符串 被稱為s和t分別。 而現在這個方案,比較 零,它在生命的目的, 它應該告訴我, 我才鍵入同樣的事情? 所以我要回一個星期。 我用我等於等於運算符 這是質量運算符。 不是賦值運算符, 等號運算符。 我只是比較s和t。 因此,讓我們真正去前進,做到這一點。 而且我要繼續前進 並進行比較為零。 我該怎麼辦./comparezero。 我要去 前進,說些什麼 喜歡,讓我們做媽媽的小寫 怎麼樣的媽媽大寫。 當然我型不同的東西。 好的。 這是可以預料的。 讓我們再次運行它。 這兩次做小寫字母,小寫字母。 這看起來超一樣對我。 輸入。 確定。 也許這只是奇怪,因為 它不喜歡我的語法。 因此,讓我們做一個大寫媽媽, 資本媽媽,是相同的。 不同的事情。 那麼,為什麼會這樣? 那麼,什麼是實際去 在這裡引擎蓋下? 因此,讓我們回去了 這裡只是一個時刻 並且考慮什麼的GetString 其實這樣做。 當你打電話的GetString, 這是一個函數,我們 自己寫的,它以某種方式得到了 序列來自用戶的字符。 而且,我們認為第一 一次我打電話的GetString,這給了我 一個內存塊,看起來像這樣。 如果我輸入全部小寫 M-O-M--和之後發生的事情? 只是一個快速的完整性檢查。 反斜杠零。 我們知道這一點。 而記得我們打了 與Zamila名左右 和一堆其他的名字 當羅布在這裡尋找 在什麼內存裡面發生。 所以,這個故事是完全一樣的。 這是什麼的GetString 將返回給我。 現在,我的代碼剛才存儲 GetString的返回值 在一個變量被稱為第 然後我第二次把它稱為, 它存儲在一個變量稱為T。 所以,如果我在這裡走了過來,我需要 作出這樣的本地變量 - 而我一般會 畫一個字符串作為just--我們 稱之為S--這裡作為一個小廣場。 而現在,somehow--怎麼做媽媽 去這個變量s裡面? 好了,我們要回去 這裡首要原則。 什麼是的GetString實際上返回? 所以,事實證明,M-O-M 反斜杠零,和任何數目的 在內存像其他字符串 Zamila和Rob或安迪或任何其他人, 當然在我們的 計算機的RAM或存儲器。 而你的內存有like--你有 RAM的演出,內存2演出, 或十億或兩個十億字節, 或者甚至更多,這些天。 因此,讓我們假設,對於今天的目的, 這不要緊,我們如何編號 他們,但我們可以號每 這十億兩十億的 三四十億字節。 而我們只是武斷地說, 這是第一個咬,咬第二口, 第三,第四。 我故意不使用零 今天,但我們會回來的。 因此,換句話說,如果是這樣的 第一次我正在使用的程序, 我剛開始運氣和第一 咬是位置的一個那麼雙 那三四十。 如果我不停地畫,箱號 的兩個十億會的方式在這裡。 所以,你怎麼想的話, 的GetString實際上返回? 它沒有返回M-O-M反斜杠 零本身,因為這明顯 我已經開箱子不會格格不入。 那麼還有什麼可以真正的GetString 將返回所有這幾個星期? 答案是上 董事會這裡的某個地方。 你可以不適合M-O-M反斜杠零, 那麼,什麼可能是有意義的呢? 如果你必須是超級聰明,把 上的所謂的工程帽, 什麼你能回來嗎? 什麼是最少量的信息 你仍然可以返回會 讓你找到M-O-M的內存? 是嗎? 聽眾:一。 DAVID J.馬蘭:一。 為什麼呢? 聽眾:因為它會告訴 你去哪裡[聽不清]。 DAVID J.馬蘭:沒錯。 我只是要返回地址 我所得到的字符串。 在這個地址 此案的位置之一。 所以,真正被存儲在S-- 和每一個字符串變量從而far-- 剛剛被 該字符串的地址。 同時,如果我叫 GetString的第二次,我 請在字面上相同件事 - M-O-M與lowercase-- M-O-M 而另一個反斜杠零, 現在也許我的程序 已經運行了一段時間,所以也許這 是10,這是位置11,這是12, 這是13。 使用一些其他的計算機 內存無論出於何種原因。 怎麼現在去我的第二個 在我的節目T變量? 10。 沒錯。 所以,當我們在看 這個程序源代碼 在這裡我只是想 比較這兩個值, 是S等於等於T,什麼是 明顯的人的答案是什麼? 只是沒有因為1不等於10。 所以,這裡存在一個 對我們的機會真的 剛回去,再一次,第一次 原則想想,算了, 這是怎麼回事引擎蓋下? 我們一直在談論 位和字節和存儲器, 但實際上它是有用的了解 因為當你打電話的GetString, 即使我們認為它是 返回M-O-M或字符串的媽媽 或者安迪或Zamila或 等,在技術上 它只是返回的地址 的內存塊。 但是,這是確定的。 因為我怎麼知道 其中字符串結束? 如果我只給的開始? 那麼,反斜線零,對不對? 就在線性時間我可以 與印刷清晰度M-O-M打印出來。 而當我看到反斜線 零,我不在乎,我開始, 我已經知道含蓄 在這裡我需要結束。 所以,今天標誌著beginning--和 讓我做這將大大因為我們 經歷了很多的麻煩, 這些在這裡訓練wheels--得到 所以今天的訓練輪開始 脫落,我們揭示了在least-- [掌聲] 這是值得一遊 瞄準這一早上,是嗎? 所以now--有,原來 出,沒有這樣的事情串。 字符串不存在。 這是我們已經有代名詞 裡面的CS50庫。 今後,我們將開始打電話 s和t不是字符串,但字符明星。 與焦炭星,我們將 梳理出前長。 但是這並不是說, 即使我們繼續 使用的GetString現在, 技術上我應該 可以說,炭星和焦炭的明星。 而事實證明那是什麼星 是要表示的東西 所謂的指針或地址。 而事實上,一個傳情 面對未來 是這20秒的剪輯我們 朋友尼克Parlante在斯坦福 誰,前一段時間,花 一段荒謬的數額, 作為最好的,我可以告訴他 廚房或他的地下室, 製作粘土動畫 引進世界 指定的字符 賓基與我們將 下一次被介紹給指針。 因此,這裡是一個什麼樣的來預覽。 [視頻回放] - 嘿,賓基。 醒來。 現在是時候為指針樂趣。 - 什麼事? 了解指針? 哦,好極了。 [結束播放] DAVID J.馬蘭:而關於這一點, 我們會看到你在週三。 好的。 誰是跳舞? 來吧。 誰是跳舞? 你想讓我得到它開始了嗎? 我會得到它開始。 Woooo! LAUREN:甜花哨的摩西。