[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]