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