[Powered by Google Translate] DAVID J.馬蘭所有權利。 這是CS50,這是結束2週。 如果您希望明天的這個時候周圍是餓了,知道我們要去 召開會議,明天一小群,週四,1:15 PM。 這個URL,在這裡,如果你想回覆。 空間是有限的,所以請原諒,如果表單的時候,填補了你 填寫。 雖然可能感興趣的另一個URL是這樣的。 因此,在,只是大約一個月的時間,當然是要提供 所有通過EDX,通過更廣泛的人在互聯網上 能夠跟著,從事的過程中,其實相當積極。 他們將使用CS50電器和CS50討論的,大部分的 各種軟件工具,我們已經一直在使用這個學期。 而其中一項措施,我們希望作為一個實驗,今年 我們可以看到多少內容翻譯成其他說 書面語言。 所以,如果你可能有興趣參與該項目, 我們將提供英語課程的成績單及字幕 講座和短褲,研討會及部分和 - 如果你會講一口流利的或寫流利一些其他的語言,我們會 愛,讓你在這個項目,讓你承擔一個或更多的 視頻,將其轉化為一個語言,你知道得很好。 為了讓你的界面感,還有這個基於Web的用戶界面 我們將使用,將創建基本上是這樣的一個UI。 這是我教一些萬聖節前。 和右手側有黑色旁邊這些時間戳, 你會看到不同的東西,我的嘴裡說出來的那一天。 然後在它下面,你會翻譯成一些其他的語言。 究竟是什麼之間的映射是,在這種情況下,英語 並說,西班牙。 因此,它實際上是一個非常用戶友好的工具。 您可以倒帶,快進,很容易與鍵盤快捷鍵。 所以,如果你想參加這個實驗,你的話 有可能有成千上萬的人看到和閱讀的,請不要感到 免費參加。 現在,一個字約從週一小貓,免得我們已將過於 可怕的消息。 一定要明白,,辦公時間建議和段的建議, 課程的設計是非常有學生的協作和 說一起工作,通過習題集和問題。 真正的行歸結到了,你的工作,最終 應提交的應該是你自己。 所以,坦白地說 - 在辦公時間,這是完全正常的 - 它完全可以預期的,甚至 - 有一些聊天 你旁邊的朋友。 如果他或她掙扎著一些話題,和你一樣,哦,好讓 我給你看到,我寫了一些代碼行。 這很好。 出現這種情況。 這是非常有利的,我認為,學習的過程中。 在哪裡就行了,再次被越過時,頭是有點歪了 這裡真的有太多秒或分鐘,只 無障礙給你的朋友的機會。 當然,當事情變得交換通過電子郵件和Dropbox 等,也有是行。 因此,通過各種手段,手感舒適,感到鼓舞與朋友聊天 和同學約pset和更多。 而就認識到,真的是你最終提交 你的創造,而不是別人的產品的。 因此,在同樣的可愛的動物,你可能會 知道這傢伙在這裡。 因此,從幾年前的電影,這是驚人的俗氣。 在這裡的任何人都看到“太空砲彈”? 好的。 因此,一個好的號碼。 因此,這是我們今天介紹的最後美妙的學術方式 密碼學的概念。 因此,pset的,這將前來領域特定問題 明天晚上到很晚,是潛入密碼學的世界, 信息的加密和擾碼是一門藝術。 而這最終涉及到世界的安全。 立即安全對於大多數我們的形式相當平凡的機制。 我們所有的用戶名和密碼。 我們所有的人都非常糟糕的用戶名和密碼,最有可能的。 如果您在多個網站上的密碼是相同的,這可能是不 最好的主意,我們將討論對學期結束。 如果您的密碼是寫在一個便簽 - 可不是鬧著玩的 - 你的 顯示器,這也並不一定是最好的設計,而是一個相當普遍的 的現象。 而且,如果你不使用加密技術來加密您的密碼,它們是 特別脆弱。 所以,如果你認為你是超級聰明有一個隱藏的字 在您的硬盤驅動器上有你所有的密碼,但記錄的地方 它是在一個文件夾,沒有人會看,這也不是一個很 安全機制。 還等什麼的pset將介紹這是密碼學藝術的, 擾碼信息,如密碼,這樣的事情是 更安全。 所以這個非常現實世界中的問題,以激勵與非現實世界的 的情況下,讓我給你介紹我們最喜歡的片段之一,從這個 電影,“太空砲彈”。 [視頻回放] 頭盔,你的惡魔,什麼是怎麼回事? 你在做什麼我的女兒嗎? 請允許我介紹年輕的整形外科醫生,菲利普博士 Schlotkin,最大的隆鼻的人在整個 宇宙和比佛利山莊。 殿下。 鼻的工作嗎? 我聽不懂。 她已經有鼻子工作。 這是一個甜蜜的16個目前。 不,這不是你的想法。 這是非常,非常糟糕。 如果你不給我組合的空氣盾,博士Schlotkin會 給你女兒回到她的老鼻子了。 - 不! 你從哪兒弄來的? - 所有權利。 我會告訴。 我會告訴。 不,爸爸,沒有。 你別這樣。 - 你說得對,我親愛的。 我會想念你的新鼻子。 但我不會告訴他們的組合不管是什麼。 - 好極了。 Schlotkin博士,做最壞的。 是我的榮幸。 - 不! 等等,等等。 我會告訴。 我會告訴。 我知道它的工作。 好吧,把它給我。 該組合是其中之一。 一。 一。 二。 二。 二。 - 三 三。 三。 四。 四。 四。 五 五。 五。 所以組合是一個,兩個,三個,四個,五個。 這是我所聽到過的最愚蠢的組合在我的生活中。 那是白痴才會有這樣的事情在他的行李。 謝謝你,你的高度。 你做了什麼? 我關掉了牆上。 不,你沒有。 您關閉了整部影片。 我一定按錯了按鈕。 好了,把它放回去。 把電影。 是的,先生。 是的,先生。 讓我們去,愛爾納。 來吧,格雷琴。 當然,你知道,我還是會向您。 好了,沒有工作? 門在哪裡? 它的工作,先生。 我們的組合。 - 太好了。 現在,我們可以從地球Druidia每一個呼吸新鮮的空氣。 什麼組合? 一,二,三,四,五。 一,二,三,四,五? 是的。 這是驚人的。 在我的行李,我已經得到了相同的組合。 準備空間球1立即離開。 是的,先生。 和變更的組合在我的行李。 - 噢! [END視頻播放] DAVID J.馬蘭:你現在應該看到一個驚人的電影。 因此,這裡的語境是不安全的數據來的機會 加密和爭奪它。 等,例如,是一個加密的消息的一個例子。 這實際上是說英語的東西。 但它顯然不是完全明顯。 我們將兜了一圈,今天捉弄除了這是什麼秘密 這裡的信息是。 但在現實世界中的電腦,事情並不甚至看起來會 是的英語句子。 例如,這是你可能會發現在一個標準的Linux或Mac或 Unix計算機中的文件,是很久很久以前被稱為密碼文件。 如今,它被轉移到其他地方。 但是,如果你的系統上,在正確的地方,你會看到不僅是你的 用戶名或系統上的其他人,但你會看到一個 他們的密碼的加密版本。 事實上,這個詞地下室有以下的東西是加密的。 而這一系列看似隨機的字母和字符和數字, 等等,都可以被解密僅由一般知道的一些秘密 - 一個秘密的話,一個秘密數字。 事實上,藝術的加密技術最終都歸結到信任的一些 排序和別人不知道的東西。 我們將探討這方面更詳細一點今天在pset中來。 而現在通過/失敗的一個詞。 特別是一些潛入的pset,家電,和 一個很新的世界為自己,認識到挫折和 混亂和技術困難是可以預期的。 特別是隨著第一的pset,那裡有這麼多新的,剛開 熟悉的ls和cd,所有這些神秘的命令在一個新的環境。 這是從實際材料和編程本身分開。 因此,實現,也有一定存在的辦公時間 支承結構上。 節本星期日開始。 但是,最重要的是,如果你只是感覺這是不 你的世界,實現它確實只是需要時間。 ,它不給我這個機會,幾年前對我來說,一類 通過/失敗,說實話,我永遠不會甚至踏上在教室裡。 你可以改變這件事,直到說,第五次週一的課程。 所以,如果你對現在的邊緣,而不是頭,實現了一些其他 完全水域,肯定會考慮轉變為通過/失敗。 同樣,有沒有真的這種文化在哈佛考慮的事情 通過/失敗,因為每個人都希望實現或超額完成。 但坦率地說,這是一個美妙的方式嘗試了,可能不 很熟悉的。 你會做在大多數情況下,相當精緻,也許 多給您驚喜。 更具體的,我覺得通過/失敗一般不, 尤其是當你可能經歷過的pset 0,如果你已經把 在10小時,15小時,25小時到一些pset中 - 和你只是撞 你的頭靠在牆上, 它的超級深夜, 但你在pset的方式,如90%, 你知道你只是無法弄清楚一件事 - 通過/失敗的真正的邊緣,這樣的一類,在這裡你可以排序 高興地說好了,我知道它並不是完美的。 但我的工作我的屁股上。 我很高興就結束了。 將滿足期望通過/失敗。 所以千萬記住這一點。 好的。 因此,那些你們誰一直在努力使用哈佛大學的Wi-Fi知道 該有一CS50 SSID的,通過Wi-Fi連接周圍,漂浮 可能有更好的運氣。 這是一個有點諷刺的密碼 - 如果你想嘗試一下 更好的速度和連接到該讓我們知道,如果沒有更好的 - 是一,二,三,四,五,一路攀升到8,因為8是 更安全比五。 所以,如果你需要的Wi-Fi密碼,無線連接到CS50這裡。 一,二,三,四,五,六,七,八。 CS50後上討論,如果你仍然有間歇性的連接問題, 我們將讓權力知道這個空間。 好的。 所以簡單的玩笑話,尤其是對於那些你們誰是風扇的男孩或女孩 所有蘋果。 我從幾年前挖了這個文件,ilock.c,只是為了 種更具體,更複雜一些更基本的C 我們一直都在寫程序。 於是,我打開了這個文件,ilock.c。 這是今天的講座頁。 在左側,你會看到一個長長的清單功能。 因此,研究員,這是誰寫的寫了很多的功能, 以上只是主。 在這裡,他用一大堆的庫。 如果我們開始滾動,這實際上是非常 第一,我認為,原來的iPhone破解。 當你想原來的iPhone越獄,這意味著untether 從AT&T和實際安裝特殊的軟件就可以了,做的事情 蘋果沒有人做 - 好了,有人花時間來弄清楚他們是如何利用 軟件缺陷,錯誤,錯誤,在蘋果公司的軟件。 從而誕生了ilock.c。 如果你的計算機上編譯它和它的iPhone上安裝 說,通過USB電纜連接到您的計算機,這將給你 行政或root用戶權限在您的iPhone,讓你做很多 任何你想要的。 所以這個迷人的貓捉老鼠的遊戲和蘋果之間的 特別是他們在世界各地的很多企業一樣,試圖鎖定 他們的東西,所以,你只能用它做什麼,他們打算。 但由於這樣的人,他們的低層次的認識 的細節,並在這種情況下,C編程和熟悉的結構的特定 我們已經開始玩,你能夠真正利用 硬件的方式,您認為合適的,而不一定是一些企業實體。 因此,舉例來說,我不知道這是做。 但是,GetVersion聽起來很簡單。 看起來這是一個函數,這個人寫的。 以某種整數作為參數,不返回任何東西,但 一個for循環和循環條件,如果條件下,如果 突破,並以某種方式涉及到的版本號。 如果我們向下滾動 - 儘管很多這些關鍵字將是新的,並有一個 一大堆的功能在這裡,我們從來沒有見過,可能不會看到超過 本學期的過程中 - 在一天結束的時候,它遵循相同的規則和邏輯,我們已經 玩迄今。 因此,這是破解你的iPhone 4S或3S或很快5S,這幾天太舊, 但要知道,這一切都非常來源於這個世界,我們已經看到 潛入。 因此,讓我們來看看一個更簡單一點的例子。 這其中,只是為了獲得回暖的一些語法,也有一些其他的數據 類型,我們已經談到了,但還沒有真正出現在C.因此,這是一個 文件名為positive1.c。 每在上面的評論,這只是要求用戶提供一個 正數。 所以這是一個例子,一個do-whil​​e循環,這是很好的用戶交互 程序,你需要告訴用戶做一些事情。 ,如果他們不配合,你罵他們,或拒絕他們的意見。 典型的例子,我該怎麼辦第19行到24這麼久的用戶 沒有給我一個正數。 現在,這個細節在這裡的​​第18行,為什麼我宣布這整個Ñ以上 循環結構,而不是右線22我 真正關心得到n? 是嗎? [聽不清] DAVID J.馬蘭:是啊,所以這個問題的範圍。 在外行人的術語,什麼範圍是指什麼? 是嗎? [聽不清] DAVID J.馬蘭:你能不能說大聲一點好嗎? 主講人1:在這裡你可以訪問一個特定的變量。 DAVID J.馬蘭:完美的。 在這裡你可以訪問一個特定的變量。 而且一般的經驗法則迄今為止一直認為,一些人的範圍 變量的定義是,你已經看到最近的花括號。 因此,在這種情況下,如果我犯了個錯誤n在第22行聲明, 該行會的工作。 我會得到一個int,我希望把它變成第22行中的變量n。 但是,這行代碼將不知道我說的是什麼呢? 所以,25,事實證明,24為好,因為在這種情況下,它不屬於 大括號。 因此,只要一點點的滋擾,但很容易解決,只需聲明 變量以外的函數本身。 現在,我們可以看到以後的今天,你可以走了一步。 你甚至可以得到一個有點懶惰 - ,這是不被推薦的,在一般情況 - 但你甚至可以偷懶,把一個全局變量,可以這麼說,不 內的一個函數,而不是一個循環的內部,但在文件本身,外 所有的功能,你已經寫了,因為我在這裡的第15行。 但是,這一般是不可取的。 但是,認識到這一點是有時其他問題的解決方案,我們將 最終看到的。 因此,就目前而言,我們將保持這樣的。 但是,讓我們看看我們是否能改寫這只是開始表達自己在一所房子裡 略有不同。 因此這個方案,僅僅是明確的,是陽性。 讓我繼續在這裡,在我的終端窗口陽性,回車。 編譯,沒問題。 我要去,運行positive1,按下回車鍵。 我要求你給我一個正整數。 我會說:-1。 沒有工作。 0,99,這似乎是工作。 也許不是最嚴格的測試。 但至少這是一個不錯的完整性檢查,我們正在正確的軌道上。 所以,現在讓我繼續前進,打開這兩個版本。 有什麼不同了嗎? 它實現了同樣的事情。 但是,什麼是跳出為明顯不同時間? 是啊,所以這個布爾綠色。 gedit有綠色高亮顯示該關鍵字被稱為布爾, 這是一個數據類型。 它不內置於所有版本的C.你需要包含一個 具體的庫。 在我們的例子中,我的CS50庫,使我們 有機會為bool。 但在第18行,我們似乎有一個布爾值,這裡所謂的感謝。 所以,我可以把這種現象稱之為什麼。 但我把它叫做感激只是一種傳達一些語義上的意義。 因此,最初的第18行,我顯然不是感謝,因為 布爾值,感謝在第18行初始化為false。 然後,它似乎是我在這裡做了21行〜23是我剛剛 種重寫我的邏輯。 所以沒有功能不同的。 但在第22行,我現在檢查,如果int用戶提供了大於 0,那麼我只需更改感謝真正的價值。 我為什麼這樣做呢? 因為在第25行,很顯然,我要檢查的條件。 做這個循環,同時感謝是假的。 因此,我建議這是一個版本的替代品,因為它至少一個 更直觀一點,也許吧。 這是一個有點植根於英語。 因此,請執行以下操作,而你不感謝,同時感謝是假的。 而這個時候,我顯然不關心記住用戶輸入的是什麼 因為通知中沒有任何變量n。 因此,實際上,I - 一個善意的謊言。 在功能上,該方案是一個有點不同的,一旦我們得到的底部 它,因為我不記得n是什麼。 但我想在這裡展示我們已經看到過,即使調用getInt和 正在使用的右手側的一個等號的GetString迄今,使得 我們記住它們的價值,從技術上講,這不是絕對必要的。 如果由於某種原因,你只是不小心保存的價值,你只是想 檢查該值,請注意,我們可以簡單的寫調用getInt開放 括號,關閉括號。 該函數會返回一個值,因為我們一直在說。 這將會給你一個int。 所以,如果你在精神上認為這種情況發生,當我輸入99,調用getInt 返回數字99。 因此,從理論上講,這是因為雖然我的代碼,其實這。 因此,如果99的確是大於0,然後感謝變為真。 第25行實現哦,我們正在做的,因為我現在感謝。 而在第26行,我們簡單地說,感謝為正整數,不管它 碰巧。 現在,讓我們在這裡做輕微的語法糖,可以這麼說。 讓我們來看看,如果我們可以清理這條線,這第三個和最後的25方差 在positive3。 因此,注意到現在唯一的區別是哪一行代碼? 是啊,所以25。 我們還沒有真正看到這一招只是還沒有。 但是,我們也看到週一的感嘆號,這表示什麼? 因此,沒有或否定。 因此,需要一個布爾值,,並翻轉它的價值。 真亦假。 假變為真。 所以,我建議,即使是一點點的一種方式,更直觀 編寫的代碼,因為我仍然會初始化為false感謝。 我還是做到以下幾點。 我感謝設置為true,在時機成熟時。 但現在你可以真的只是翻譯代碼口頭左到右, 同時感謝。 由於爆炸,或驚嘆號,表示不的概念,因此,雖然 不心存感激。 所以,再一次,我們沒有引入任何新的概念本身。 我們已經討論了布爾值,當我們從頭打了。 但現在認識到,我們就可以開始寫我們的代碼 許多不同的方式。 因此,特別是在pset1移動,如果你有幾分努力找出的方式來 請編寫一些程序,你很幸運,因為有將是任何 的解決方案,您可以發生在數。 舉例來說,即使是最簡單的程序,這僅僅是3。 好的。 現在記得上週一,我們留在這有返回值的注意。 因此,對於第一次,我們寫了一個程序,不只是有主, 它也有它自己的自定義函數,我寫在這裡。 因此,在31〜34行,我已經實現了一個多維數據集函數。 這並不複雜。 這只是一個次次,在這種情況下。 但重要的是它是我輸入的形式 我回輸出的形式的時候,一個次。 所以,現在我有能力,就像我用printf單獨使用,調用 多維數據集函數調用這個函數。 和多維數據集的功能需要一定的投入。 和多維數據集函數返回一些輸出。 因此,相比之下,輸出只是做了一些事情。 它沒有返回任何東西,我們關心的 - 即使作為一個 一旁,它返回一個值。 您通常會忽略它。 的printf只是做了一些事情。 它有打印到屏幕上的副作用。 反差,在這裡,我們有多維數據集的功能,這 實際上返回的東西。 因此,這是一般 - 對於那些熟悉,這是一個非常簡單的想法。 但是,對於那些不太熟悉這個想法傳遞輸入和 背面輸出,讓我們嘗試只是超級簡單的東西。 是任何人都舒服了舞台上簡單嗎? 你必須是舒適的與你的相機,以及。 是啊。 好了,你叫什麼名字? KEN:肯。 DAVID J.馬蘭:肯。 所有權利,肯。 上來吧。 所以,肯將是各種各樣的功能,在這裡。 讓我們繼續做到這一點。 讓我們一點點花哨。 認識你很高興。 歡迎來到舞台中央。 好的。 讓打這個按鈕,在這裡。 好的。 所以,在這裡你有一個現代化的黑板上。 我的主要功能是,例如。 我沒有一台iPad拿在手中。 我真的不記得怎麼樣 - 好了,其實,不能說。 我真的沒有很好的筆跡。 所以,我希望你能在屏幕上打印的東西對我來說。 所以我的主要程序。 我要你說,這寫在我的雞從頭開始, 然後將你的輸入。 因此,儘管這項工作是愚蠢的,函數的概念,並調用 功能,並返回一個函數真的歸結到這。 我主要的。 我剛才寫在屏幕上輸出(“東西”)。 我運行這個程序。 如printf被調用,它需要一個參數 - 或一個參數, 有時 - 雙引號之間。 這裡有這樣的說法。 我把它傳遞給肯。 現在,他寫了一些數年前,顯然是一個黑盒子 只有知道如何打印在屏幕上的東西。 所以,執行。 這是不壞的。 所以,很不錯。 所以,現在肯執行。 他遞給我任何東西嗎? 因此,到目前為止,我們已經看到的。 同樣,printf並返回一個數字。 但是,我們要忽略的是現在,因為我們從來沒有用過它。 所以這是它為肯。 因此,現在主要來執行 - 主要接管程序的控制,因為這行代碼, printf中進行執行。 我們去了解我們的方式執行的任何其他線路有。 好的。 現在讓我們嘗試一個稍微不同的例子。 這一次,在這裡,讓我們先來清除屏幕。 而這個時候,我們會做的魔方功能。 但是這一次,我期望的輸出值。 因此,讓我們繼續前進,並做到這一點。 所以,現在我有一個行代碼,說X =立方體(X)。 因此,實際上let's - 行的代碼,召回,看起來是這樣的。 X =立方體(X)。 所以,這是怎麼去上班? 因此,讓我們繼續前進,並給你一個白色的屏幕。 我要現在寫下來的x的值,在這一刻 時間發生,讓我們說,2,保持它的簡單。 因此,我已寫在一張紙的價值2, 這是我的x值。 我把它肯。 KEN:我只寫答案是什麼? DAVID J.馬蘭:是啊,讓我們只寫答案。 好吧。 現在他已經回到我的東西。 所以 - 完美的。 尼斯SEGUE。 所以,現在他遞給我回值8,在這種情況下。 我該怎麼辦呢? 嗯,其實,讓我們來看看。 得到這個權利。 我會用它做什麼呢? 現在,我將這個值和實際存儲在這些 在存儲器中的相同比特。 但是,請注意,我是那種掙扎在這裡。 我有點困惑,因為我在哪裡寫x的值嗎? 因為我剛剛做的是需要親自肯一張紙 的值是2,這為x。 事實上,這恰恰會發生什麼。 因此,原來,當你調用一個函數,並傳遞參數 喜歡的“Hello World”,或者你傳遞一個參數,如2,一般,你 通過在副本這樣的說法。 所以,正如我寫下的2號這裡,並把它交給肯; 意思是,我仍然有一份價值2的地方。 因為事實上,現在我已經得到了值8,我需要回去 RAM寫下我曾經有過的數字2。 所以,直觀地記住這個概念在字面上通過 值的副本。 肯做他的事,交給我的東西 - 在這種情況下, 這樣的值8。 然後,我與價值的東西,如果我 要保持它的周圍。 因此,所有這一切都將是所有太熟悉了不久。 非常感謝你在這裡演示,肯。 好的。 非常好。 因此,讓我們來看看如何,最終涉及到的一些功能 調用,我們一直在這裡做什麼。 因此,讓我繼續前進,把我們帶回了魔方的例子在這裡。 注意到,如果我們要真正開始採取進一步,我們將 必須注意的一個事實,即數x被傳遞 這裡實際上被傳遞到函數是不同的。 所以,再一次,通過複製將變得相當 鍺在短短的時刻。 所以,讓我們來看看在一些不相當的工作。 我會繼續前進,打開第三個馬車例如, 是有缺陷的性質。 它被稱為buggy3,和它實現了一個交換的功能。 所以,在這裡,我們有一個主函數,x和y的任意初始化為 分別為1和2,。 我們可以使用調用getInt,但我們只需要一個簡單的練習。 因此,它是硬編碼為1和2。 在第21行和22行,我們似乎打印出x和y,每行一個。 然後,在第23行,我要求我交換這些值,點,點,點。 顯然,我在第24行調用一個函數,稱為交換 ,它有兩個參數。 這是完全合法的,採取兩個參數的函數。 我們已經看到輸出已經做到這一點了。 所以交換顯然x和y。 正如它的名字所暗示的,我希望這是怎麼回事 交換這兩個值。 因此,我要求在第25行,交換。 我轉載的假設下,x和y 我的確被換。 但是,如果我運行這個程序 - 讓我打開一個終端窗口。 讓我做buggy3。 正如它的名字所暗示的,這是沒有好下場的。 因為當我按下Enter鍵,注意x是1。 y為2。 但在程序結束時,他們仍,其實,是一樣的。 因此,根據示範與肯,剛才到底發生了什麼? 好吧,讓我們深入到這個交換功能。 它的超級短。 這是只有幾行代碼長。 但是,什麼是最根本的問題的基礎上簡單的故事告訴 在這裡肯嗎? 交換為什麼壞了? [聽不清] 沒錯。 因此,我們要存儲的副本,而不是變量本身。 換句話說,交換顯然有兩個參數,一個int。 它的任意稱為A和B。 這裡,我已經通過在x和y,分別是1和2。 但我不是真的通過在x。 我不是真的在y傳遞。 我是通過x和y的副本的副本。 這就像幾乎就像交換的值複製和粘貼 你希望它是實際操作。 所以,如果是這樣的話,當我的程序,開始執行 線35,然後36 - 當我到37行,在這一點上的故事,是什麼值呢? 在這一點上的故事,37號線,在這一點上的價值是什麼? 因此,它應該是1。 對嗎? 因為x的第一個參數中傳遞。 而這個函數只是任意調用它的第一個參數,一個。 同樣,第二個參數為y。 它只是隨意調用的第二個參數b。 現在這種兩分法其實是相當簡單的解釋。 想想吧。 我們沒有見過的人誰寫輸出。 因此,毫無疑問,他或她不知道30年後,我們的變量將 被調用。 所以,必須有區分你調用中的變量 功能,你寫的,你在你的函數調用變量 打電話或使用。 所以,換句話說,我寫了我的變量x和y。 但是,如果別人已經寫了交換功能,他或她肯定 不知道我的變量來調用。 所以認識到,這就是為什麼你有這種二元性的名稱。 從技術上講,我可以做到這一點巧合。 但他們仍然會通過為副本。 這僅僅是一個純粹的巧合美觀,如果那個人是誰寫的 交換使用相同的名稱。 好的。 所以在這一點上故事中的第37行,一個是1。 b是2。 現在我進行交換。 首先,讓我真正做到這一點簡單得多。 我不知道這三行代碼做什麼。 讓我做到這一點。 b得到。 一個得到b。 完成。 為什麼是這個破碎的,邏輯上嗎? 這是一種直觀的東西,對不對? 因此,一個變成了B。 B變成A。 但問題是,盡快執行第37行,有什麼 a和b的值? 相同的是,1。 因為你打一頓,可以這麼說,你已經改變了b為一個。 所以,第37行執行,這是偉大的。 你現在有此功能的號碼1內部的兩個副本。 那麼,當你說在第38行,得到b,好了,你種擰緊。 因為你只是分配1比1。 你失去了你關心的價值。 因此,在原始版本,請注意,我就是這樣做的。 我不是有三分之一的代碼看起來是這樣的。 我聲明了一個臨時變量 - tmp是一個很常見的名字 一個臨時變量。 它是一個int,因為它符合我要的副本。 存儲副本的tmp目錄內的。因此,一旦線路37條的執行, a的值是 - 快速完整性檢查 - 1。 b的值是2。 TMP的價值也是1。 所以,現在我執行第38行。 因此,一旦執行第38行,一個需要的b的值。 和B是2。 因此,一個現在是2。 所以在這一點上的故事,一個是2,b為2, tmp是1。 所以,現在從邏輯上講,我們只是撲通TMP到b的值。 我們就大功告成了。 因此,我們已經解決了這個問題。 不幸的是,當我運行這個程序,在這種形式,它並不實際交換 任何值。 但要清楚,為什麼呢? 我剛才固定的邏輯問題。 但同樣,如果我運行這個程序,X和Y保持不變,年底 該計劃的執行。 [聽不清] DAVID J.馬蘭,因此,我們不返回任何東西。 所以,這是事實。 但事實證明,這裡有一個有點問題,因為到目前為止, ,我們已經能夠返回的唯一的一件事。 這是一個限制,您可以只返回一個真正的價值, 在這種情況下,我被堵到了這裡 因為我可以返回新的x值,否則我可能會返回 新y的值。 不過,我既要回來了。 於是久違這裡沒有簡單的解決方案。 但問題的根本是為什麼呢? 我們有什麼實際交換? a和b。 但是,a和b的副本的x和y,這意味著我們只是做了這一切 - 我們只花了像三分鐘談交換 功能和所有這三個變量。 這是偉大的,完全正確的,孤立的。 但是,A和B的範圍不僅是在這些行。 因此,就像一個for循環,如果你聲明一個整數i在for 環 - 同樣,如果你​​聲明a和b裡面的功能, 你寫的,他們是該函數的唯一有效的內部。 這意味著只要交換是執行,我們從線24條, 線25,x和y沒有被改變。 你只是浪費了大量的時間交換的變量的副本。 所以,事實證明,要解決這個實際上是不很明顯。 這不是很充足的返回值,因為我們可以 只返回一個值。 我真的想交換x和y都在相同的時間。 因此,我們要回到這個。 不過,現在認識到這個問題從根本上源於一個事實 a和b的副本。 他們是在自己的範圍內。 好吧,讓我們以某種方式設法解決這個。 讓我真正滾動回到這裡,開拓,讓我們說,第四個變種 此,buggy4。 又是怎麼回事嗎? 這是一個類似,但更簡單的看問題之前,我們採取一捅 解決它。 這項計劃被稱為增量。 它顯然初始化的x為1的整數,在第18行中。 然後,我x是1。 然後,我聲稱遞增,點,點,點。 然後我打電話增量。 但隨後在22日和23線,我要求它已經增加。 我要求x是現在不管它是什麼,大概是2。 但這種方案是不穩定的。 有什麼問題嗎? 是嗎? [聽不清] DAVID J.馬蘭:沒錯。 所以X顯然已宣布的第18行。 這是內主要的大括號中。 所以,簡單的答案是,在這裡,x存在。 它不存在於線32。 因此,這個程序實際上不會編譯。 編譯器,當我嘗試編譯這段代碼時,會罵我 一些未聲明的標識符或東西的效果。 事實上,讓我們嘗試。 這是使buggy4。 在那裡,它是。 使用未聲明的標識符x線32。 而實際上,讓我們更加明確,今天在這裡,這是非常有用的 辦公時間和在家裡。 請注意,這是一個有點神秘的書面。 但事實上,鏗鏘有對我們大吼大叫,說 buggy4.c:32:5,實際上是有用的。 這意味著,該錯誤是在字符位置5的線32上。 因此,一,二,三,四,五。 這是,事實上,問題出在哪裡。 同時要記住,在辦公時間,在家裡,我很幸運在這裡。 我有一個錯誤。 這將是比較容易解決的。 但是,如果你獲得壓倒性的錯誤消息,再次充滿整個畫面, 實現最底層的人可能只是對症 最頂層的。 因此,總是追逐你的錯誤,從上而下。 因為有可能只是一個菊花鏈的效果,建議你 有比你實際做的方式更多的問題。 那麼,我們怎麼能解決這個問題,如果我的目標是增加x? 那是什麼? 好吧。 因此,我們可以使X全球。 讓我們走捷徑,我警告早期。 不過,赫克說,我們只需要一個快速解決。 因此,讓我們在這裡說詮釋x。 這使得X全球。 所以,現在主要有訪問它。 而增加的訪問。 因此,讓我繼續前進,現在編譯這個。 ,輸入使buggy4。 似乎現在編譯。 讓我們來運行buggy4,它似乎實際工作。 現在,這是這些東西之一 - 聽我的話,還不如我呢,我剛剛在這裡完成。 因為整體來說,我們的計劃將變得更加有趣, 比這更長的時間。 如果您解決生活中的問題是啊,把所有的 在文件的開頭的變量,很快就做節目得到 驚人,難以管理。 它變得很難想出新的變量名。 它會更難理解變量是做什麼的。 ,因此,在一般的,這是不是一個好的解決方案。 因此,讓我們做到這一點。 我們不想在這裡使用一個全局變量。 我想增加x。 所以,我可以很明顯 - 在一天結束的時候,這是一個愚蠢的故事,因為我們只要做到這一點。 但是,如果我不知道,運營商,或我沒有被允許到 改變它在主本身,怎麼可能我實現了肯在這裡,這 時間到多維數據集,但增加? 我該如何改變這件事情嗎? 是啊。 [聽不清] DAVID J.馬蘭:好,好。 那麼,為什麼不讓我通過在x? 然後,而不是返回它,為什麼不,我只是做回X + 1? 現在,一對夫婦更多的東西必須改變。 我在正確的軌道上。 還有什麼我需要調整嗎? 別人。 是嗎? [聽不清] DAVID J.馬蘭:我需要改變的返回類型增加 因為它並非無效。 虛空意味著什麼也沒有返回。 但顯然,現在是。 因此,這需要改變int以符合任何 實際上,我回來了。 現在別的東西,是大聲喧嘩。 是嗎? [聽不清] DAVID J.馬蘭:所以我需要增加x? [聽不清] DAVID J.馬蘭:啊,所以我需要傳遞X。 所以我需要在這裡做到這一點。 因此,原型,我必須要改變這個在這裡。 因此,這成為一個int。 這成為 - 嗯。 其實,我這裡有一個錯誤。 讓我們來解決這個問題第一次。 應該是什麼內容究竟是什麼? 因此,它必須是一個int的東西。 它可以是x。 但是坦率地說,如果你開始調用所有的變量x,它會得到 越來越不清晰哪個是哪個。 因此,讓我們任意選擇一個不同的命名約定為我的 輔助函數,我寫的功能。 我們將調用它。 或者,我們可以把它稱為 - 我們姑且稱之為,它even_number更明確。 於是我返回任何數加1。 現在,我必須要改變一個其他的東西在這裡,一個 其他的東西在這裡。 我有什麼改變第21行第一次嗎? 我有把它分配給x。 這樣我就可以不叫增量x。 通過改變x的值,我需要記住的答案 左手側。 即使x是現在的左,右,這是完全正常的,因為 首先被執行的右手側,然後被撲通進入左 手的事情,x在這種情況下。 最後,這是一個簡單的辦法。 這應該匹配什麼是向下。 詮釋號。 好的。 那麼一大堆的一個非常愚蠢的功能的變化。 但代表,我們將越來越多地想要做的事情。 因此,請buggy4。 我搞砸了的地方。 哦,我的上帝。 五個錯誤一樣,一個六行的計劃。 那麼,什麼是錯的第18行,字符? 好的。 所以,我要聲明這個中斷。 好的。 所以,讓我們來看看,一大堆其他錯誤。 噢,我的上帝。 19,18,21。 再次,讓我們清除屏幕 - 控制L - 並重新運行鐺。 因此,五個方面的問題是實際上只是一個。 所以,現在讓我們來運行buggy4,回車。 哇! x已經被正確地遞增。 好的。 如何增加數字的任何問題? 是嗎? 主講人2:為什麼是它,你可以只改變x的變量數 命名,它會知道你是什麼意思? DAVID J.馬蘭:好問題。 它是如何,我可以只改變x的數量,程序將知道 立即嗎? 所以,再一次,把它作為這個抽象。 所以,如果我主要和Ken是漸進式的,坦率地說,我不關心 什麼肯稱,他的iPad。 我不在乎他所說的什麼,做他的執行 這個功能。 所以這是一個實現細節,我,主,不 有關心。 因此,簡單地改變它一貫裡面的功能,號 和數量,是需要很長時間,我重新編譯。 這是有點像,如果你認為的 - 很多人來說,你的驅動程序的 許可所驅動,或者如果你即使在汽車驅動 - 我們大多數人不知道如何汽車引擎蓋下的。 從字面上看,如果你打開引擎蓋,我們大多數人 - 包括我自己 - 不會真正了解我們正在尋找。 有點像你可能會覺得現在的東西,如這項權利。 但是,我們真的不關心汽車是如何工作的。 我們不必關心所有內部的桿和活塞和電纜 汽車實際上是在做什麼。 所以像你所說的活塞無所謂 這裡在這種情況下。 同樣的想法。 是嗎? [聽不清] DAVID J.馬蘭:如果有更多的用途的變量XA時刻前, 作為程序員,你將不得不改變他們無處不在。 或者你可以從字面上文件,菜單,然後查找/替換, 類似的東西。 但是你將不得不讓自己的這些變化。 你必須是一致的。 [聽不清] DAVID J.馬蘭特定的順序:A喜歡這裡嗎? 如果這是int的另一個電話號碼嗎? 是啊。 因此,為了重要的,當你調用該函數。 所以,如果我在這裡呼籲增加的東西逗號東西, 有一個直接的映射。 第一可變,無論它的名字,作出了第一個副本 在這裡的論點。 對不起,這不應該是一個括號。 第二個參數與第二個。 ,是的,所以,為了事宜。 好的。 對不起,我花了很長的路到那裡。 其他問題嗎? 好的。 因此,讓我們來看看,如果我們不能畫一幅畫,實際上 引擎蓋下的,可以這麼說。 因此,這是一個矩形,可能代表你的計算機的內存。 所以,即使你不知道如何記憶或RAM作品如何,至少 假設你有束的這些天。 你得到了它的兆字節。 你有GB的。 我們知道,從週零一個字節是什麼? 8位。 對,所以8 0和1。 所以,如果你的計算機有一個演出的RAM,2個演出的RAM這些日子裡,你有一個 億或2億字節的內存,或大約8億美元或16億美元 位,您的計算機內。 現在不像的小綿威利例如,它沒有磁性粒子 典型的了。 越來越多的,至少在筆記本電腦,它的固態硬盤,固態硬盤, 只是沒有移動部件。 這是所有的電子。 這是所有的電力基礎。 因此認為,雖然,這個矩形代表一個或兩個 GB的記憶體,你有。 因此,它是一個內存塊。 現在世界上的計算機科學類的分區塊 內存做不同的事情。 因此,舉例來說,如果這是您的計算機的內存 - 所建議的 矩形 - 原來,按照慣例,在您的RAM的頂部,所以 說,一般是什麼所謂的文本段。 這些都是零和的,你已經編譯。 因此,當我們已經看到引擎蓋下的a.out是什麼,所有 0和1 - 當你運行一個程序時,這些0和1,從您的硬盤裝入 到一些所謂的RAM驅動器。 在RAM中,他們把在頂部。 同時,你還有其他的事情。 初始化數據,未初始化的數據。 這兩個大片的內存是指為全局變量, 你不經常使用。 但有時如果你這樣做,他們結束了在那裡為好。 此外,還有一些其他的東西。 環境變量,我們不會花太多的時間。 但隨後的兩件重要的事情會回來整個 學期,堆棧和堆。 因此,大多數您的計算機的內存中運行的程序時保留 一些所謂的堆棧,稱為堆的東西。 我們不會談論堆,但我們會 談論的堆棧。 和堆棧是為了喚起了視覺像食堂 餐托盤Mather中樓,或任何你碰巧是,這裡的 食堂的工作人員清理他們的每一天。 它們堆疊起來,從地板上起來。 同樣在內存中,有這種想法,把一些在 疊加,將在棧上的東西,把東西在棧上。 是什麼意思呢? 好吧,讓我們放大只是這張照片的下半部分,您的電腦 RAM,提出以下建議。 原來,當你運行一個程序,如a.out格式“或”你好,什麼 該程序是你寫的, 再次,從您的硬盤驅動器加載這些0和1 - 長期儲存,在那裡停留,即使你拔掉插頭 - 加載到RAM中。 RAM的速度比硬盤驅動器。 這是小於硬盤驅動器。 但它的節目直播,當你運行它們。 所以,你雙擊一個Mac或PC上的程序 - 它裝載 到RAM中的硬盤驅動器。 只要它加載到內存中,0和1的方式上, 所謂的文本段。 但是,當你的程序啟動運行,主要 函數被調用。 為主,正如我們已經看到的那樣,經常有局部變量。 它有整型和字符串和字符之類的。 所以,如果你的程序,你寫的程序,你有 雙擊內主要使用的一些變量,他們最終在 你的內存堆棧的底部,可以這麼說。 現在更具體地說,這是什麼究竟是什麼意思? 這也就意味著,如果我們要怎樣數算自己的事情 - 如果我們要在您的計算機數量的字節RAM,請注意, 這可能是字節數為0。 這可能是字節數一,二,三,四,五,六,所有 喜歡 - 2億美元將一路攀升,在頂部。 所以,換句話說,當我們談論RAM或內存中的字節, 只是意味著有人已經決定號每 這些內存塊。 所以,當你需要32位的int,或者你需要一個字符的8位,其中 他們結束了在內存裡? 那麼從理論上講,他們剛剛結束了在底部的 東西叫堆棧。 但現在有什麼有趣的是,當主調用一個函數。 假設一個函數調用foo的,只是一個任意的名稱。 會發生什麼更主要的是在這個堆棧的底部的內存。 美孚現在被放置在頂部的主內存中。 因此,任何局部變量foo的最終排序的概念上以上 在主。 如果foo調用另一個函數調用酒吧,這些變量在這裡結束。 如果酒吧調用別的東西,在這裡,這裡,這裡。 那麼,在運行了一個程序很有意思的是,當你調用函數, 那些函數調用的函數,這些函數調用功能, 你建立了這個堆棧在內存中的功能。 而只有一個函數返回後,你開始,內存。 因此耗盡內存在計算機程序中最簡單的方法之一是 寫函數從不返回。 因此,舉例來說,讓盡可能多的展示與 故意錯誤的程序。 讓我繼續前進,不要#包括的,詮釋的主要(無效)。 我該怎麼辦(2​​> 1),這可能將永遠不會 改變我們。 讓我繼續做輸出。 事實上,這將是在視覺有趣的。 讓我們這樣做。 為Int(i = 0; I> 0)。 讓我們犯這樣的錯誤,我+ +。 讓我們在這裡不是printf。 我們的做法是我的說教。 讓我們在這裡有一個方法。 虛空的合唱,我們會說INT I。 然後我會說,輸出 - 哦,讓我們使這更有趣的。 讓實際不打印任何東西,在所有。 我們只要做到這一點。 合唱團(I)。 好的。 因此,這是越野車,因為為什麼呢? 我正在做這件事,因為我去的,因為該計劃實際上並沒有做什麼 的興趣。 但是,這不是目標。 我們的目標是編寫一個程序,做什麼,顯然,其主要功能? 調用自身。 實際上,我們並不需要循環。 讓我們甚至簡化這只是因此,不要忽視真正的 根本的問題。 主要調用合唱團唱一些合唱。 然後我做了一些愚蠢的事情,和我有合唱的呼叫合唱團,因為我假定 別人可能實現它。 現在,這是不會還來編譯。 我需要做什麼? 我需要的原型,記住了。 所以我需要在這裡有無效合唱團(int i)的。 所以,現在,如果我去這裡 - 其實,讓我們用更大的窗口。 讓我們繼續前進,並合唱。 讓我們繼續前進,並合唱。 使用身份不明申報我。 哦,那是愚蠢的。 我們並不需要的參數。 我們只要做到這一點。 希望我們能有這樣開始。 這本來是一個更簡單的程序編寫。 這樣出現了。 現在,讓我們去到我的終端窗口,再次運行鐺。 在這裡,我們走了。 這是真快。 究竟剛發生時,有關係嗎? 好了,現在我將添加打印線,這樣我們就可以看到。 因此,讓我輸出,比方說,我在這裡。 好了,沒有變量,我們會留下這樣的。 讓我重新運行。 讓我重新運行合唱團。 。 繼續下去。 順便說一句,為什麼它沒有崩潰嗎? 分割故障發生前超級快。 [聽不清] DAVID J.馬蘭:沒錯。 因此,它需要一定的時間來打印。 它只是需要更多的工作在計算機的一部分。 有。 分割故障。 因此,發現是多麼快的程序運行。 如果你沒有打印任何東西,超級快。 但是,我們仍然得到了該段故障,因為發生了什麼事? 好吧,如果你認為您的計算機的內存,這 恰好是主要的。 但在這裡 - 我們只需要調用這個合唱之中,讓我們這個合唱團。 現在,如果我做我的美學,這只是說合唱, 合唱團,合唱團,合唱團,合唱團,合唱團,合唱團,廣告nauseum。 最終,會發生什麼呢? 如果大的畫面字面意思是這樣的,這是發生在概念上嗎? 該協議棧溢出堆。 更糟糕的是,你只是溢出的一切,包括文本段,這是 0和1代表你的程序。 總之,這僅僅是超級,超級壞。 對嗎? 你的程序已失去控制。 您使用的是比你打算一切都是因為一個愚蠢的方式更多的內存 錯誤,在這種情況下。 或者,在這種情況下,故意做的函數調用自己。 現在,這並不全是壞事。 調用自己的函數實際上擁有極大的權力 當你正確地使用它。 我還沒有正確地使用它在這裡。 因此,這並不全是壞事。 但事實上,我從來沒有真正停止稱自己是一個基本的 這一方案的弱點在這裡。 那麼,我們要與所有這一切嗎? 那麼,到底發生了什麼? 當我打電話的增量功能,像我們所做的是在那些例子, 我有一個值,如1,我傳進去 我通過在副本的頭號。 因此,發生以下情況。 因此,讓進入的增量例子。 而且這傢伙就在這裡。 因此,這裡實際上發生了什麼。 當我打電話的增量,和我通過在X,形象地什麼 在這裡是這樣的 - 如果我有1的值保存在這裡,和其實我打電話增量,這 現在被稱為合唱團 - 是啊,把我關在這裡。 所以,讓我們把這個增量。 我們不知道這是什麼下一個功能將是。 那麼,什麼是實際發生的事情是這裡的某個地方,我有一個在主塊的 存儲器,存儲數字1。 當我打電話給增量,我使用其他的內存塊,但現在我 有副本1。 當我增加值,這將成為2 - 可怕的寫在 屏幕在這裡。 但後​​來,發生了什麼,盡快增加回報嗎? 內存只是被交還給操作系統,這意味著所有 你這樣做是沒有什麼用處。 實際上仍然是存在的,最初是包含在主。 所以,我們要這個嗎? 好了,事實證明,在內存中,你有這個背靠背序列 字節,你可以把東西英寸 而事實證明,我們已經看到的東西,包括把 事情背靠背背靠背。 什麼是一個字符串,第一個星期,現在在本週二的基礎上嗎? 所以它只是一個字符集合。 因此,原來,就像你可以把數字在內存中,同樣你也可以 把字符在內存中。 一旦我們開始把字符在內存中背靠背 回來,事實證明,使用最簡單的事情,比如一個for循環 while循環中,我們可以遍歷 - 從左至右在字符串中的字符 - 開始按摩到完全不同的字符。 A可能變為B。有可能成為C.所以,最終,我們可以採取一個 英語句子,其實是有道理的,每個人轉換 一次一個步行通過我們的計算機的內存離開 實際上加密的權利。 因此,讓我們在這裡,我們五分鐘的休息時間,當我們回來時,我們會 啟動這一進程的擾碼信息。 好的。 所以,在我們深入到一些加密,這些東西稱為“陣列”,讓我 暫停任何問題,因為我覺得我是那種混亂的一些 這些議題。 所以現在,如果我們可以讓我們來解決。 所以,我們剛才講的返回值。 我們談論的論點。 我們談論這個概念,我們回來在週 來,這些堆積一大堆的查看內存 托盤,可以這麼說。 從底部上起來,使得每個托盤會在棧上代表 的功能,這是目前被調用。 有什麼問題嗎? 因此,如何對 - 讓我試著問了一個問題。 我一直在破壞,但現在it's - 地一下男孩的臉。 因此,我們將回來。 因此,讓我在這裡問一個問題。 讓我簡化這回它是什麼之前,我們早期的Q&A. 而事實上,增量左括號,INT數,關閉 括號內。 整數數字代表什麼? [聽不清] DAVID J.馬蘭的說法。 好了,但什麼是參數? [聽不清] DAVID J.馬蘭:對不起,那是什麼? 主講人3:你傳進去的東西 DAVID J.馬蘭:好吧。 所以,你傳進去的東西 更一般地,它僅僅是輸入。 如果你在生活中寫一個函數,該函數的目的是做 有點不同的東西,每次你使用它,那麼唯一的辦法 要做到這一點真的會似乎是為它提供輸入,所以它 可以做不同的事情,每次輸入。 所以,你需要指定兩件事情,當一個函數需要輸入。 你需要指定你想給,輸入的名稱,純粹是為了 自己的方便,所以,你可以參考它的功能 自己寫作,我在這裡的第32行。 但是,你還需要指定它的類型,因為C是一種編程語言 只需要 如果你想要一個變量,你必須告訴計算機 數據類型是, 在很大程度上,以便它知道多少位 分配給該變量。 因為它可能是6 - 對不起,它不會是6。 它也可以是16。 它可以是8位。 它可以是32個,甚至64。 但是,計算機需要知道。 現在,在左邊的int代表著什麼,與此相反呢? [聽不清] DAVID J.馬蘭:那是什麼? [聽不清] DAVID J. MALAN:類型的函數,並更具體地,在 其輸出的類型。 右。 因此,而括號中的東西代表的輸入,如果有的話, 事情左邊表示其輸出端。 在這種情況下,增量顯然是返回一個int。 所以int是這個函數的返回類型。 要返回的是什麼意思? 從字面上看,,使用關鍵字回報。 然後,如果你返回到正確的關鍵字是 整數,那麼這確實是符合我們所承諾的。 你不能做這樣的事情 - 你好,世界 - 因為這是一個字符串。 很明顯,這不是一個整數。 因此,在短,真的是對我們的負擔,程序員,具體為 我們回國,然後返回。 一點點,然後作出更明確的背景下 - 他又出來了。 背景 - 大驚喜,在短短的時刻。 這裡的背景是,現在是您的計算機的內存中,再次, 技嘉,2千兆字節,什麼都好。 也許是更重要的。 也許它的不足。 但電腦的看法有不同的部分。 出現下降。 別的東西。 不同的東西在中間。 今天,我們就開始講這個故事。 但我們會回來到這個隨著時間的推移。 現在,唯一的一塊內存中,我們真正關心的是文本段 因為這只是代表了0和1 ,鐺輸出。 所以,當你在鍵盤上像a.out的運行命令,或者雙擊 在Mac OS或Windows點擊一個圖標,你的程序從硬盤裝入 開車到RAM中。 它的屁股在您的計算機的RAM的頂部,可以這麼說。 同時,為您的程序開始運行,並在被稱為​​主 程序,你寫的程序微軟和蘋果寫道,任何其 局部變量結束了在那裡降落的底部,您的計算機的內存中。 但是,如果主本身調用另一個函數,變量或 參數,它們最終會在它的上面。 如果該函數調用的東西,他們最終在它上面, 在它上面,在它之上。 只有一次是執行不托盤堆疊,所以 說話,開始越來越低。 這是什麼話,概括地說,解釋了為什麼當你調用立方體 - 還是你打的增量 - 你在副本的價值傳遞。 是什麼意思形象地是,你從字面上寫 號1中的存儲器的另一部分,改變一個1至2,在箱子的 增量 - 或8,在多維數據集的情況下 - 然後投擲,內存只要增加或多維數據集 函數返回。 問題。 [聽不清] DAVID J.馬蘭:凡 - 全局變量中存儲的是什麼 目前被稱為初始化的數據和未初始化的數據。 區別在於,如果你有一個全局變量,並賦予它 立即等號的值,它結束了在頂部。 如果你只是說沒有價值的詮釋x分號,它最終小幅上漲 簡單地按照慣例,在RAM。 其他的問題。 好的。 因此,這幅畫會回來的,因為我們變得更強大,我們能做些什麼 與計算機。 但現在,讓我們有一個簡短的介紹,特定類型的加密技術, 密碼學不解決世界上所有的問題,但沒有解決 其中的一些。 在這種情況下,在這裡,我們有一些所謂的密鑰加密。 密鑰加密,顧名思義,源於它的安全性 從一個秘密。 因此,舉例來說,如果你是在小學和你通過一個 小秘密情書的男孩或女孩,你破碎 - 如果你 想通過貫穿全場的,你可能不會寫 英語中的註釋,或任何你的母語,而是你 可以對它進行加密。 或者你可能只是給他們一個文本消息,這些天。 但你實際上可能會通過他們在教室。 而要做到這安全地,以這樣一種方式,您的朋友和教師 不知道你寫的東西,你可能會想出一個相當簡單的 算法 - 年輕人雖然你可能是 - 只是爭奪的話。 因此,而不是寫一個,你可能會寫B.而不是B,你可以寫 C.而不是C,你可能會寫D,等等。 或者,你能想出一個更複雜的字母翻譯 以不同的字母。 但美中不足的是男孩還是女孩,你發送此說明需要 知道的東西。 這是什麼,很明顯嗎? 一樣,你的秘密是什麼。 喜歡什麼,是AS和BS和CS和DS之間的映射? 難道僅僅是增加一個,可以這麼說,每一個字母去從 A到B,從B到C? 它是比這更複雜嗎? 所以,你和你的美眉需要有這個秘密的信息。 但有一個catch-22在這裡種。 如果這是第一次通過你這封情書 類的是男孩還是女孩,怎麼會知道這個秘密,甚至是嗎? 因此秘密密鑰加密並不能解決世界上所有的問題。 其實有關係,我們再回過頭來朝 學期結束。 同樣,我們有沒有可能發送過 - 同樣,我們大多數人不知道的人的作品,例如,在 Amazon.com。 然而,我們很多人可能買的東西在Amazon.com。 我們一直被教導要承擔這些電子商務 交易是安全的。 對嗎? HTTPS URL可能說。 有可能一個愚蠢的小掛鎖圖標的地方。 有某種形式的加密技術保護您的信用卡信息 你和亞馬遜(Amazon.com)之間。 然而,如果密碼學需要知道一些秘密,但我不 知道在亞馬遜的人,而且我肯定不會安排任何形式的 有人在亞馬遜的秘密,我的電腦或瀏覽器這樣做呢? 好了,原來有其他類型的加密技術完全解決 那樣的問題。 但是今天,我們將重點放在簡單的一個,在那裡你可以安排在 提前知道一些秘密,如加1或一些AS和BS之間的映射。 和加密過程一般涉及這一點。 你有一些簡單的文字,描繪在左。 您可以運行它通過某種算法或過程 加密。 也許這只是一個變成了B,B變成C。然後你就結束了 密文。 同時,一旦你的美眉接收到的秘密紙條,他或她有那麼 一般扭轉這種算法,從而獲得進行解密 備份純文本。 現在有物理的化身。 舉例來說,這是一個小秘密的解碼器環。 這是在這個意義上,在這裡兩個錶盤的環。 在這件事情的外週,有字母A到Z, 雖然他們以隨機順序。 在裡面,有一些數字,例如, 戒指,你可以種翻在外面,但不是內部以排隊 數字與字母。 而在剪輯你將要看到的 - 其中有些你可能已經看到24/7 從一部電影叫聖誕故事在聖誕節前後。 你會看到那個小拉爾夫是如此渴望要弄清楚什麼的小孤兒 安妮的秘密是他的消息了溝通,我認為,在 數字信息串行中形成的。 你有積累的小卡片,來到 在麥片盒。 你必須郵寄他們。 你有秘密的解碼器環,所以,你終於可以圖 字母和數字之間的映射是什麼, 或字母和字母。 所以,我給你這個短片從一個聖誕節的故事,以激勵的pset 2 我們的討論,在某一時刻的數組。 所以在這裡我們拉爾夫。 [視頻回放] 無論是向所有人拉爾夫·帕克委任一個 的小孤兒安妮秘密圈的成員,並有權 榮譽和利益發生於此。 簽名,小孤兒安妮。 會簽,皮埃爾·安德烈! 在油墨中! 榮譽和利益,已經9歲。 來吧,讓我們用它。 我並不需要所有的爵士樂關於走私和海盜。 - 聽著明天晚上的結論冒險的黑色 海盜船。 現在,是時候為你的成員安妮的秘密消息 秘密圈。 請記住,孩子,只有安妮的秘密圈的成員可以解碼 安妮的秘密消息。 請記住,安妮得靠你了。 將你的腳B2。 這裡的消息。 12,11 - 我在我的第一個秘密的會議。 -14,11,18,16 - 皮埃爾是在今晚很大的發言權。 我可以告訴大家,今晚的消息是很重要的。 -3,25。 這是一個消息,安妮自己。 記住,千萬不要告訴任何人。 -90秒後,我在一個房間裡唯一的一個九歲的孩子 可以坐在隱私和解碼。 啊哈,B.我去到下一個。 E.第一個字是。 S.它現在更容易。 U. 哦,來吧,拉爾夫。 我得走了。 - 我是正確的,媽媽。 - 嘖嘖奇才。 -T,O.一定要。 要確保的是什麼? 小孤兒安妮想說的是什麼呢? 要確保的是什麼? - 拉爾夫! 蘭迪得走了。 請你出來嗎? 好吧,馬。 我馬上就出來。 我越來越近了。 張力是可怕的。 它是什麼? 這個星球的命運懸而未決。 - 拉爾夫! 蘭迪得走了。 - 我就出來,哭出聲來。 哎呀,幾乎沒有。 我的手指飛了起來。 我的心是鋼的陷阱。 每一個毛孔振動。 這幾乎是清楚的。 是的,是的,是的,是的。 要確保喝阿華田。 阿華田? 照出的商業? 狗娘養的。 [END視頻播放] DAVID J.馬蘭:因此,我們有加密技術。 因此,如何在一台計算機,我們可以去實現,或者 代表這樣的事情嗎? 好了,我們需要一種方式表達自己一點更靈活 因此,我們的變量不允許的。 我們已經有整數。 我們已經有個字符。 我們的花車和雙打和其他幾個人。 但是,這些都是個人的內存不真的讓我們 表達的東西,如單詞和句子和短語。 事實上,我們叫這樣的事情串。 但我們所承諾的,這是真的只是一個簡化的CS50 庫,我們打算剝離回來。 讓我們開始做,在這裡。 讓我繼續前進,打開一個文件 - 所有這些文件都可以像往常一樣在網上 - 稱為array.c解決的問題無關字符串,但描繪一個 的圖片在這裡,我們怎麼可能使用的東西稱為數組。 數組是一種數據類型。 這是一個類型的變量,各種各樣的,有多個較小的數據類型 它裡面的背靠背背靠背。 因此,舉例來說,如果我們要編寫一個小程序,讓您的 測驗平均為一療程,有兩個小測驗,你可以很容易像50 編寫這個程序 - 甚至在一些上週的材料 - 通過調用getInt和一對夫婦的變量。 詮釋quiz1,詮釋quiz2,這是很簡單的。 這也許是10,20行的代碼,最大,實施程序,要求 兩個測驗的分數,然後計算它們的平均用戶通過將它們添加 在一起,除以二,然後打印結果。 我們或許可以做到這一點很容易現在, 有些分鐘數。 但問題是,假設有50有三個測驗或4。 假設你想使用相同的程序,有一類 每週測驗。 想想一個類時,每週測驗。 如果有像在一個學期16週,現在你有16個變量 - quiz1,詮釋quiz2,詮釋第quiz3,詮釋quiz4。 只要你開始看到這種冗餘,複製和粘貼 的代碼,它應該讓你希望有一個更好的辦法。 幸運的是,因為數組。 因此,讓我們做到這一點。 首先,讓我介紹一個非常簡單的事情,我們到目前為止還沒有使用, 但偶爾你會看到它的代碼。 這就是通常被稱為一個常數。 所以在這個意義上,這個值不會改變,它是一個常數。 創建一個常量時,是使用全部大寫的人的約定 字母,只是,使其真正站出來,在你的代碼。 特殊的關鍵字,您使用的C#定義。 所以,如果你說的,然後是一個空格,然後你想使用這個詞, 常量的名稱,然後該常數的值。 因此,通知,這從一個變量分配的東西是不同的。 有沒有等號。 有沒有分號。 這是通常被稱為預處理器指令,但更多的 另一個時間。 就目前而言,這將創建一個不變的值,稱為測驗的實際 的數值是2。 因此,任何地方,你看到測驗,測驗,測驗,這是整個文件 只是數字2。 現在,如果我看主要現在,讓我們來看看它是如何工作的。 起初,這看起來有點神秘。 但它是從第一個星期,所有的東西。 詢問用戶的等級。 如何才能做到這一點呢? 那麼,在第22行 - 這是真的的多汁的一部分 - 我聲明了一個浮動,但是不只是一個單一的浮動。 我聲明,而是一個浮點值數組。 這個變量將被稱為檔次,這裡暗示。 但唯一的一塊新的語法,那麼這些方括號中,其實 我已經說過了浮動等級,然後打開支架,然後一個數字。 請注意,如果這是一個常數,這是像我們這樣做。 這意味著哎電腦,給我兩個花車,讓我們共同呼籲 他們的成績。 這是更繁瑣的過程,這樣的對比。 浮法級1,浮動grade2“,等等。 因此,一個陣列,使我們能夠實現這個想法,但要少得多亂七八糟,在 這樣的方式,我們可以寫一行代碼,而不是,比方說,一個16 16 週的學期。 所以我不想硬編碼,因為,如果你認為現在 假設明年邏輯 - CS50更改為3,而不是測驗。 我有2號。 在這裡,我有2號。 在這裡,我有2號。 在這裡,我有2號。 它變得非常乏味,很容易搞砸了,不小心改變 一個值,錯過了一些其他值2。 所以我要這個距離,而不是抽象的,並使用此常量,其 顧名思義,永遠不會改變。 而現在,無論我們有不同的測驗今年或明年,我 只需要改變它在一個地方,在這裡頂部。 所以這是所有不變的是。 同時,新概念的特點是一個數組。 因此,在方括號給我這麼多的花車,讓我集體 他們成績在這裡。 所以,現在讓我們來看看我會做什麼。 在這裡,在第24行是一個for循環的開始。 這實在是沒有任何幻想。 這只是使用測驗,而不是硬編碼的數字。 但也有是沒有從上週智力有不同的。 這僅僅是printf的。 因此我們知道printf(“小考數的%d%d”的),因為我只是想打印出來給我測驗 數之一,兩個,然後兩個兩個。 因此,這純粹是一種審美的東西。 但是,現在最有趣的部分是在第27行。 為了填補的兩個佔位符的浮點 值,你再使用方括號。 在這種情況下,我使用的是我,因為for循環已開始與我等於 什麼樣的價值,顯然是嗎? 0。 因此,在這個循環的第一次迭代,這是因為雖然我 寫在代碼中。 但在這個循環中的第二次迭代,這是因為雖然我 寫在我的代碼。 但事實上,我使用一個變量是完美的,因為,正如其名 表明,它改變它的值在每次迭代。 所以我填充這個數組一個地方的時間。 陣列看看這是什麼樣的呢? 好了,我之所以得出這個超級簡單的屏幕上的矩形 之前是因為這個原因。 數組是另一塊內存的內存塊, 其次由另一個的內存塊,等等。 所以,如果我的數組大小​​為2,在這種情況下,在這裡,所有我會做的 打字在我測驗成績,喜歡上了這裡。 我就這一個。 然後,我得到了99就這一個。 該內存可能甚至沒有使用,因為我只問 電腦的數組大小​​為2。 這些廣場仍然存在。 對嗎? 你還有2 GB的RAM,即使你只 兩個浮點的要求。 因此,陣列背後的想法是,計算機只需要一個內存塊的 然後分給更小的碎片背靠背背靠背。 因此,這是所有的數組。 這是一個連續的內存塊,這裡面你可以把東西。 現在發生這種情況,然後做一些無聊的算術。 如果我向下滾動在這裡,這是我然後遍歷數組中。 我拿出所有的數組中的值的總和。 然後,我在這裡使用ROUND函數實際做的 總結除以測驗。 但是,讓我揮揮手,作為足夠的算術現在的排序。 但是,所有為我做的最終計算平均值。 所以第一次測驗加第二個測驗,再除以2,然後打印 它作為一個int。 但現在,讓我們叫字符串轉換到一個不同的例子, 它描繪了一個類似的畫面,但使用​​字符串。 讓我繼續前進,簡化這只是一個瞬間。 現在原諒縮進。 請注意,在這個例子中的第19行,我收到了來自用戶的字符串。 但是請注意,我在22日線下做。 實際上,我遍歷從我 - 這是一個新的伎倆 - strlen的字符串的長度。 這是一個與C的功能,如果你傳遞一個字符串,它告訴 你有多少個字符在該字符串中。 這就是全部。 事實上,它是strlen的字符串的長度,而不是僅僅是因為它的 更加簡潔。 30年前,人們喜歡寫東西盡量簡潔。 因此,我們已經把該公約。 我+ +只是意味著我在每次迭代中增加。 而現在注意到這一點,這是非常有趣的。 因此,在第24行,我說電腦,給我一個字符,8 位,並稱之為C。 不過這到底是上右手邊說? 在英語中,什麼代表什麼呢? [聽不清] DAVID J.馬蘭:沒錯。 給我的第一個字符數組中的。 或更一般地,給我的陣列中的第i個字符。 意識到這是重要的,現在,計算機科學家,我們實際上 從0開始計數。 你不擁有自由裁量權,現在開始這樣做。 現在,你必須按照電腦的期望和行為 從0開始計算,因為[0]將是第一 字符串中的字符。 [1]將是第二個。 [2]將是第三個,等等。 所以,如果我編譯這個程序 - 這是,再次字符串。 所以字符串。 現在,我在我的終端窗口中執行字符串。 它在等待輸入,所以我要輸入,就說,大衛。 輸入。 而現在它打印DAVID在不同線路上,因為 請注意我在做什麼。 我一次打印一個字符。 現在,我們將進入今天。 但我刪除了剛才在這裡檢查。 事實證明,如果用戶出現異常,對抗性的,或只是 混淆,實際上,你可以不給一些長度字符串。 如果你按錯鍵盤上的鍵,你可以給 沒有在所有的字符串。 或者,如果你是惡意的,你可以嘗試將其粘貼在一千兆字節的價值的 的文章,以填補這個字符串。 如果計算機運行內存,事實證明,我們將 這個特殊的值稱為空。 因此,就目前而言,只是知道有這個特殊的值稱為空 讓我們來檢查時,我們的記憶,在其他的事情。 但是,如果我現在打開字符串,請注意區別就在這裡。 看到一個與字符串的區別就在這裡。 對於字符串,這個for循環是一個有點不同。 讓我刪除空值,這樣我們就可以談論其他時間的。 但是,什麼是不同的for循環? 我可以回到前面的例子。 所以這是第二版。 這是一個版本。 一,二,一兩個。 因此,strlen的電話是在哪裡呢? 這是在for循環的第一部分。 任何想法,為什麼我這樣做? 是啊。 [聽不清] DAVID J.馬蘭:所以我們不會每一次調用該函數。 沒錯。 回想一下,他們是超級簡單的for循環,一旦你 明白,這是初始化, 條件,和更新。 的問題是,對每個條件發生 循環的迭代。 因此,在這個例子中,什麼是壞的事實 這是我的條件嗎? 你調用strlen再,再而三。 但是,一旦我輸入的國寶,該字符串的長度是5個。 它不會改變,因為在每次迭代循環 字符串仍然是D-A-V-I-D。所以這是一個暗示了這是怎麼回事成為 越來越重要思想的設計決策, - 只是不 使計算機做不必要的工作。 現在,正如pset的,PSET 2標準版先睹為快 要挑戰你真正落實一定數量的密碼,一些 數的加密算法,這樣就可以加密和解密 秘密消息,就像一個拉爾夫解碼。 在黑客版的pset 2,我們要去遠一點。 我們將交給您的文件,其中包含一個實際的計算機系統 一大堆的用戶名和加密的密碼,和面臨的挑戰 為黑客版將是破解這些密碼和數字 出了什麼加密或什麼秘密被用於實際 產生這些密碼。 我們要做到這一點,使用一個新的功能,在這裡我給的C 你只是一個演示,被稱為命令行參數。 因此,原來,你們有些人可能已經看到在部分或教科書中, 主並不總是括號中是無效的。 事實證明,主也可以這樣寫,有兩個參數, argc和argv,argc是的話,你輸入後數 在命令行程序的名稱。 而argv是實際的話。 的方括號,顯然,argv是一個數組。 這將是一個字符串後的字符串後,內存中的字符串。 所以,我們要能夠做到的,開始的pset 2, 這樣的事情。 如果我argv1,這是一個例子,我們會回來(星期一)運行 ,請注意,它似乎並沒有做任何事情。 它只是打印出自己的名字。 但是,如果我說再見類,請注意,這個方案顯然迭代 在每一個的話,在提示符下輸入。 和手段,我們將獲得用戶的話, 在提示符下輸入是通過改變為主,本週末開始,從int 主要(無效),INT主(ARGC ARGV)。 因此,將要出生的命令行參數。 而一旦你得到真正的成熟,你就可以寫 很迷幻的程序,如這一個在這裡,這超出 我們已經做了一些功能迄今為止,所有功能相當強大。 因此,我們將離開這個在屏幕上。 我們星期一見。