>> 揚聲器1：所有權利。
歡迎回來。
這是第二週的CS50，我們有 迄今已使用的功能，但
很大程度上他們是理所當然的。
其中有，我們用printf 印刷的副作用
在屏幕上的東西。
我們已經用得到詮釋，獲得浮動。
>> 但是如果你要創建 你自己的功能，因為有些
你可能已經開始 做習題集，雖然
不嚴格要求？
好吧，讓我們繼續前進，並重新 只是要求用戶問題
他們的名字和印刷上的東西 屏幕上，但嘗試分解出一些
我們的共性 迄今為止，在我們的代碼中看到。
所以，我的意思是下面。
>> 我要繼續前進，並創建 一個新的程序，只需調用
它HELLO.C像往常一樣。
我要繼續前進，給自己 包括標準io.h在頂部。
我打算也給自己 先發製人CS50庫，以便
我不會在由編譯器大叫。
現在我要繼續前進 聲明I​​NT為主，無效。
>> 然後在這裡，這是我想要的地方 開始外包功能
我本人的一些其他功能 會寫，但不
目前存在。
例如，假設我想 寫一個函數，讓我
打印出來打招呼，逗號和 然後一些用戶的名稱。
而不是繼​​續做的printf 你好，％，豈不是很好，如果
只是有一個函數調用 printf的，但打印的名字嗎？
>> 所以，換句話說，我希望能夠 寫一個程序，確實有點
這樣的事情。
首先，我要去說的printf 名，從而提示用戶
他或她的名字給我，然後我 使用熟悉的字符串s
聲明一個字符串。
給我一個字符串類型的變量， 它s，存儲在該
導致調用get字符串。
但是，現在在過去的幾週，我將不得不 有些不厭其煩地做了個招呼，S / N。
>> 換句話說，我們已經看到了這 例如一堆的時候，它是一個
簡單的例子，因為只存在一個 行代碼，所以它真的不是一個
大不了再次鍵入。
但是，假如這行代碼 實際上成為一種負擔，而
它不是一個代碼行，但它的10 行代碼從現在開始的幾個星期，
你只是累 複製和粘貼或
重新輸入相同的代碼。
那豈不是很好的，而不是做 printf的招呼，％s和等等，
那豈不是很好，如果有剛 一個函數調用打印名稱
需要一個參數 -
換句話說，它需要輸入 -
然後分號。
所以這個功能，它不會 是很好，如果存在？
然後，我就不必擔心 printf是什麼，％s和所有
這些複雜 不是所有的，有趣的。
它們是有用的。
>> 因此，打印的名字，可惜，是不是 發明了40多年以前。
沒有人想到把它寫。
但是，這有一個美 編程語言，就像在
從頭開始，您可以自定義塊，所以 在C和大部分的語言，你能
定義自己的功能， 您可以定義自己的函數。
因此，即使我們得到主要由 自動免費的，我們可以聲明
我們自己的函數。
>> 所以我要在這裡做出一些房間 向上頂，我要聲明我
自己的功能，去尋找一個 有點奇怪，但我們還會回來
回此之前長。
我會說作廢，從而 說明這個函數的
的東西，會產生副作用，但是它 不回我的東西在
同樣的方式，得到int或 得到字符串本身。
我要去給這個函數 命名打印的名字，我要
這傢伙是要採取指定 一個字符串，我要那個叫
字符串名稱。
我可以打電話給我想要的任何東西，但我 希望我的代碼是自我描述。
換句話說，如果一個你 打開這個文件，讀它，你可以
由此推斷那名排序 輸入它應該扮演什麼樣的角色。
>> 低於現在，我要打開 大括號和封閉的大括號，
等注意到我一直遵循相同的 圖案上線四到七個
我一直在關注一個好星期加 現在之間，說，行九
14這主要組成。
換句話說，打印名稱 是另一種功能。
現在，編譯器是不會知道的 自動調用這個事情，
因為我真的只是發明了它， 但它仍然會知道調用main
自動，然後當然是在 13號線，我要求我自己的函數。
因為我已經聲明了函數 上四個主前行，
這是怎麼回事教編譯器 什麼報價，引文結束，“打印名稱”
意味著它應該做的。
所以我給它一個新的自定義排序 阻塞的背景下，說，劃傷。
>> 所以在這裡，我可以把這些很常見 或反复出現的模式的代碼，我把
寫在課堂上的printf ％s的招呼，S / N“ -
我希望把這裡什麼呢？
S·
所以我想在此上下文中。
因此，發現這裡有點二分法。
因為我聲明我自己的函數 我已經有點隨意地被稱為
它打印的名稱，因為我 括號中指定
函數有一個參數的類型 這是一個字符串 - 所以它是一個字
或短語或類似的東西 - 我打電話來，這樣的說法的名字，那
意味著這是唯一的變量 範圍，可以這麼說，是名。
>> S只之間存在著哪兩個 花括號，當然？
真是好啊，就像10號線通過 14，所以只是想在週一不能使用
S，但是我能做的就是傳遞 將S打印的名字。
打印的名字，只是恰巧給它 一個別名，同義詞，一個綽號，
調用它的名稱，現在 在此行中使用它。
所以，現在讓我再去救，縮小。
>> 讓我繼續前進，使打招呼。
看起來不錯。
也吐不出來任何錯誤。 /你好輸入。
我叫什麼名字？
大衛。
和打招呼大衛。
所以，不是所有的精彩， 只是覺得現在。
現在你有相同的成分 就像我們在划痕
使我們自己的函數。
>> 但有一點的疑難雜症。
假設我真的沒有想過 這，其實我沒有
真正思考它寫道： 該功能在這裡。
感覺完全合理的。
划痕有沒有概念 在腳本中的位置。
你可以把一個在這裡，一起來這裡， 一起來這裡，它可能會開始
看起來有點混亂，如果你不這樣做 整齊地躺在它，但它不
無論身在何處，身體的腳本 屏幕上。
不幸的是，在C - ，這一點不像 Java和Python等語言
和別人，你可能很熟悉 - 不幸的是在C語言中，為了不
不要緊，因為手錶是什麼 現在將要發生。
>> 默認功能是怎麼回事 執行，當然是主力。
主要是要調用print名 線八條，但遺憾的是，
編譯器甚至不知道該打印名稱 存在，直到它到達11號線，
不幸的是， 將是為時已晚。
因此，讓我們做你好。
該死的，產生的兩個錯誤。
所以，現在讓我向上滾動到非常 首先，我們應該總是做，
注意到我大喊大叫， “隱式聲明函數
打印的名字。“
>> 因此，我們已經看到了這條消息之前， 隱函數聲明。
當我們看到這樣的錯誤呢？
當我沒有包括一個圖書館。
如果我忘記的cs50.h，我會得到 大聲呵斥在字符串或詮釋。
但是，在這種情況下，該功能的打印 名字是不是在圖書館，對不對？
嚴格地講，它在這個文件中，所以 什麼是真正的問題嗎？
>> 不幸的是，在C語言中，它需要你 如此令人難以置信的字面意思，如果你
要調用的函數的名稱打印 存在，你要么必須實現
該功能在最上方， 代碼，以便降低它的訪問
功能，但坦率地說，這將成為 草率的速度非常快。
就個人而言，我喜歡把主第一 因為那是非常清楚這是什麼
乍一看程序做。
再加上，你可以進入奇怪的角落 情況下，如果x要調用
y，但y進行調用，你只是 身體不能真正把一個
在另一個的上面。
>> 但事實證明，在C語言中，我們可以 解決這個問題很簡單。
我要放一點點的空間 這裡，我只是去
先發製人，儘管有些 冗餘，要教
存在一個函數的編譯器 稱為打印名稱，它需要一個字符串，
我要打電話 它命名分號。
>> 所以現在第四行，這是我們 以前沒有見過，是一個聲明
功能打印的名稱，但它是唯一的 一個承諾，這個函數會
最終被定義，最終 得到實施。
現在我可以獨自離開，因為 現在是這樣定義，
實施，排序最後一公里 執行本
特定的功能。
所以，坦率地說，它是愚蠢的，這很煩人， 但是這是C的方式，它是
因為它需要你很誇張 並且，作為一個計算機坦率地說應，
只有不正是你告訴它 做什麼，因此，順序是很重要的。
>> 所以記住這一點，並再次啟動 通知復發圖案。
賠率是你願意，如果你還沒有 已經開始遇到消息
這樣，乍一看似乎 完全隱秘的，但如果你開始
看這些關鍵詞像 “隱式聲明”提到的
在這種情況下，功能 - 坦率地說，你 有時甚至可以得到一個小綠
胡蘿蔔符號，告訴你在哪裡 這個問題可能是 -
你就可以開始通過自己的方式工作 但看不見的錯誤消息。
任何書面問題 這樣的功能？
>> 讓我們做一些事情，這是一個 更引人注目的一點。
而不是僅僅做的東西，有 打印的副作用，讓我去
提前並保存新的文件，我們將 調用這positive.c，即使它是
要有點不同 而最後一次。
而這個時候，我想重新實現 最後一次的positive.C例如，
強制用戶給 我的一個正整數。
但我有使用INT一次。
那豈不是一直很好，如果有 一個函數叫做正整數
我可以只外包 一塊功能？
所以，這裡的區別是，我們將 實施獲得正整數，但不像
打印的名字，有一個副作用 - 沒有返回的東西對我來說，
一個數字或一個字符串 -
正整數，當然，要 ，希望返回一個正整數。
>> 因此，讓我們做到這一點。
包括cs50.h，包括標準io.h.
INT主要無效。
現在在這裡，我要繼續前進 讓我們說，整型，叫它N，等於
獲得正整數。
就像INT已經存在 因為工作人員寫的，我要去
承擔的那一刻得到 存在正整數，現在我要去
繼續前進，說的printf， ％I / N“，N感謝。
>> 所以，現在如果我編這程序， 事情發生在我的終端
在屏幕下方的窗口？
我去可能會得到， 像以前的同樣的錯誤。
因此，讓我們試試這個。
做出積極的。
再次，隱式聲明 功能，正整數。
因此，我們可以解決這個問題 一對夫婦的方式。
我要保持它的簡單，只是 在這裡把我的聲明，並得到
正整數。
我需要的是所謂的簽名。
簽名只是指 美學
程序的第一行。
所以，你應該得到積極 int返回？
>> 所以一個int。
我的意思是在理想情況下，它會返回 像正整數，但
不存在。
我們從來沒見過，在我們的數據 類型，所以我們必須要處理
事實上，我們很少有 數據類型。
但是，我們可以返回一個int和公正 我們相信，這將是積極的。
這將被稱為 獲得正整數。
>> 現在它的參數如何？
是否採取任何輸入？
是否需要任何輸入？
因此，它並不需要知道 事先什麼。
獲取字符串不，不詮釋。
printf的 - 它需要有一定的 輸入傳遞給它 - 和打印名稱
需要一些投入，但得到 沒有正整數。
所以，我要明確地 告訴編譯器無效。
虛空是沒有別的。
因此，虛空裡面意味著什麼 這些括號，分號。
>> 而現在在底部的我的文件 - 再次，我只是一種肛門
這裡將主要在頂部， 是很好的做法，因為這樣一來，
任何時候你或其他人 打開你的文件，
功能是正確的。
您可以下潛從方。
所以，現在我要重複這一點， 正整數無效，但我不
打算現在打分號。
我要打開大括號， 現在我需要借
一些想法從週一。
>> 所以當你還記得，我們​​做了一些 喜歡做以下，而
東西是真實的。
和我做了什麼？
像給我做了一件 我的一個正整數，
點點提示。
我想，我可以用任何詞語。
然後，我用什麼？
INT N等於得到詮釋， 它沒有參數。
>> 並注意到其中的差別。
當你調用一個函數，當您使用 一個函數，你不把無效。
你只有這樣做，當聲明 功能，教學的編譯器
它應該期望。
所以你不需要把 喪失自己有。
>> 現在我的條件是什麼？
中，n為不等於正， 但是這只是偽代碼。
所以，我怎麼表達這種更乾淨？
因此，小於或等於零。
如此反复，發現你可以做 小於或等於。
儘管這是兩個單獨的 符號，你可以做
您的鍵盤等。
>> 但仍然有一個缺陷， 我搞砸了最後一次了。
我必須聲明 -
究竟。
我必須聲明Ñ外 循環。
因此，我需要n放在這裡，我不 想在這裡重新申報
免得我得到了新的變數。
我只是想在這裡指定一個值。
>> 現在我不太在這裡完成。
讓我提前獲得自己 和假裝我所做的。
做出積極的，現在 有一個新的錯誤。
控制已盡 非虛空功能。
因此，新的錯誤消息，但如果你有種 梳理分開的話，
可能暗示了什麼是錯的。
>> 控制。
控制只是意味著訂單 在程序的操作。
在計算機的控制和 出事了。
因此，到達結束 非void的函數。
什麼樣的功能是它顯然 指什麼？
非void什麼樣的功能？
所以正整數，和一點點 混亂中那麼好，
它是一種無效的。
它有一個規範其無效 參數，但它的輸出要
是n型。
因此，在左邊的字是 所謂的返回類型。
這裡的內側上的字 零個或多個參數
一個函數具有。
>> 所以，我需要做什麼？
在這一點上，在我的代碼中，線21在那裡 閃爍提示現在是，我
裡面有一個正整數 的變量名為N。
我怎麼給它回到主？
從字面上看。
返回N分號。
>> 因此，正如一塊科爾頓返回 我的答案紙，下降
在小黑裙的那張紙 盒子放在桌子上，做到這一點
代碼，你從字面上只寫，返回 N，彷彿科爾頓
交給我東西物理回來。
在這種情況下，發生了什麼 正整數是要交還
什麼是大概是一個積極的 整數給誰呢？
這價值在哪裡結束？
在此變量中，結束了，正和 然後我們繼續與九號線。
>> 因此，換句話說，為了 操作，這個程序將啟動
執行和編譯器的實現， 哦，你希望庫？
讓我去裡面搶什麼。
哦，你要標準的IO庫？
讓我去裡面搶什麼。
編譯器對自己說什麼 當它擊中四線？
哦，你答應落實 函數調用得到積極的，但
我們會回來，後來， 沿著這些線路的東西。
>> 詮釋主作廢只是意味著這裡 我的程序的膽量。
7號線僅僅是一個大括號。
八線是說在左，給 我的32位整數，叫了N。
在右手側，它的 並稱獲得正整數。
現在，讓我們暫停的故事，因為現在 我不要讓我的光標向下移動。
我現在光標在這裡，因為下山 現在正整數執行。
INT N聲明。
做到以下幾點。
printf的給了我一個正整數。
>> 從用戶獲取一個int，它存儲在N， 也許這樣做一遍又一遍。
這個循環意味著，這段代碼可能 執行向上和向下再這樣
了，但最後，當用戶 合作，給了我一個積極的
INT，我打了21號線，在這一點上 號交還，哪一個
現在我應該突出？
九。
控制，可以這麼說，返回 九號線。
這行現在負責。
>> 所以，這就是已經發生的所有 引擎蓋下，但這次
當我們使用的功能，如printf 或什至得到別人的串
為你寫的，被移交控制 去別人的代碼行
通過一行一行。
這只是我們不能看到它，我們 真的無法描繪它在這
在其他一些計劃，因為它 硬盤上的文件
我們不知道。
因此，讓我們實際編譯 並運行此。
>> 做出積極的。
編譯，這就是進步。
/陽性。
給我一個正整數。
讓困難。
負1。
為零。
讓我們給它50。
感謝為50，所以控制 現在已回來了。
任何問題，那麼，是什麼？
是嗎？
>> [聽不清]。
>> 再說。
哦，好問題。
因此，您可能會注意到這裡的並行 我是那種上切割一個角落的。
在第12行，我說，正整數 返回一個int，而是由相同的
邏輯，按理說，在 六，行我說，主要的回報
int，但是我們從來沒有什麼 在我們的節目呢？
我們從來沒有提 這個關鍵字回報。
>> 因此，原來，在C，至少 我們使用的版本
在1999年，在技術上，這是 自動為您發生。
每當你執行一個程序，你 實現一個叫做main的函數，
該函數將返回零 默認情況下，如果你不說，否則，
和零僅僅是一個慣例。
世界返回零，從而 表示，一切都很好，
有效地離開我們四億元 可能的事情，可以去
錯了，所以，如果我們回到一個，那 可能意味著一個代碼，這意味著
事情出了錯。
我們可以返回兩個，這意味著 這個其他的東西出了問題。
我們可以回到四億元， 這意味著其他的事情出了錯。
>> 而如果你現在想想你自己 PC或Mac，你可能還記得，
有時你會得到神秘的錯誤信息 從你的軟件
使用，有時它也有一個人 友好的描述，但有
通常是一個代碼或數 在屏幕上？
如果這不浮現在腦海中， 只要保持眼睛。
這是典型的這是什麼意思 代碼。
他們包括在Microsoft Word和 其他程序，因此，如果你提交
與該公司的錯誤報告，你可以 告訴他們，哦，我得到了錯誤號碼45。
一些程序員在公司後面 可以看一下，在他或她
代碼和說，哦，那是因為我做了 這個錯誤，這就是為什麼用戶
得到這個消息。
>> 但坦率地說，它只是一個小 分心和有點乏味
得出這樣的結論，至少在我們的 前幾個節目，所以我們
被省略它。
但是，這一切的時候你的每一個 功能主要有偷偷
行自動為你添加 編譯器，只是按照慣例
為您節省一些時間。
>> [聽不清]。
>> 你不需要把它包括在主。
這很好。
你需要包括它，如果你是 實現這樣的功能。
否則，函數平面 出是行不通的。
但在主要的，這是沒有必要的。
在一個或兩個星期，我們會開始得到 這種習慣一旦我們要開始
標誌著錯誤。
真是個好問題。
>> 這麼快口頭休息一提的是 這個星期五​​，我們不會吃午飯
本身，而是我們將有一起吃飯 一些學生和工作人員。
如果您想加入我們，感受 自由去cs50.net/rsvp。
這個星期五​​下午6:00。
空間總是有限的，但我們會 繼續做這些近
每週的基礎上，如果空間 用完這個星期。
>> 所以峭壁吊鉤，我們離開 週一是字符串實際上
被索引到，這只是意味著你 可以得到的第一個字符，
第二個字符，第三個字符 等等，因為你可以
有效想到一個字符串，如 你好，在這種情況下，五
箱子裡面的字母。
你可以在每個人 箱子用什麼語法我們
上週一推出？
這些方括號 鍵盤上的。
只是到零的位置。
>> 我們開始計數為零，所以支架 零標誌著支架一小時，
標誌著E，等等。
等等一切的時候，我們已經 使用字符串，輸入“你好”
和“世界”和其他的東西 屏幕上，它被存儲
這樣在箱子裡。
並採取了猜測。
每個方塊代表什麼物理 您的計算機內？
>> [聽不清]。
>> 對不起？
>> 字符。
>> 因此，一個字符肯定的情況下， 的字符串和一個字符是否是剛
8位或一個字節。
所以，你可能至少有隱約 熟悉的事實，
計算機內存。
至少有兩種類型的存儲器。
一個是硬盤保存 永久的東西，那就是
通常大的，所以你可以有電影 和聽音樂等等。
>> 然後你有另一種類型的內存 被稱為RAM，R-A-M，隨機存取
記憶，這是內存類型的 您的計算機時所使用的
運行，但如果你失去動力或 電池模具，任何存儲
在RAM中消失，如果你失去權力 完全是因為它不是
執著。
您通常，這些天， 演出的演出，也許更多。
RAM的上攻是它的許多 以更快的速度比硬盤
甚至是固態硬盤，這些天， 但它通常更加昂貴，所以
你有少。
>> 因此，今天的談話真的是指 到RAM中，這些不同的存儲器
只存在而出現的電力 被送入您的計算機。
所以，當你鍵入H-E-L-L-Ø輸入 鍵盤，H是將在一個
字節的RAM，E是去 另一個字節的RAM，
字的其餘部分。
所以回想一下，我們能夠 做最後的時間是這樣的。
讓我繼續前進，打開文件 我們稱為string.c，並召回
它看起來有點兒 這樣的事情。
讓我實際上回滾和改變 它究竟是什麼樣子，
字符串s的長度。
>> 所以看這裡的程序。
我們包括CS50圖書館，所以 我們可以用得到的字符串。
我們包括標準io.h 這樣我們就可以使用printf。
我們為什麼包括string.h中？
上週一，這是新的。
所以，我們想要的字符串的長度。
STR楞。
人民決定多年前， 我們只是簡潔。
而是叫它“字符串的長度，” 讓我們把它稱為“STR楞”，讓
世界數字表示出來，所以這是 我們獲得與string.h中。
>> 這是熟悉的。
這是熟悉的。
這是一個小新。
在第22行 - 我們會回來的 這一點，但現在知道了 -
你只知道這個從有 閱讀文檔，或者如果
你知道C處已經 -
串有時會搞砸。
如果用戶是真的對抗性或 不合作，他或她只是
不輸入任何內容或鍵盤 類型這麼多在鍵盤上，
它淹沒了計算機的內存， 從理論上講，字符串可以返回
以外的東西 字符串中的字符。
它可以返回一個特殊值，稱為 在全部大寫，N-U-L-L，這是NULL
只是一個所謂的警戒值。
這是一個特殊的價值，標誌著 在這種情況下，一些不好的事情發生了。
它是一個字符串的情況下。
>> 所以我簡單的檢查，以便空， 長話短說，STR楞
等功能，配有C​​，如果 他們期望一個字符串，但它們傳遞
字符串的情況下，如果你傳遞 他們NULL，計算機或程序
只是徹底的崩潰。
它會一直掛。
它會拋出一些錯誤信息。
不好的事情會發生。
因此，儘管這仍是 不明確 -
這將使更多的意義，在一個星期或 - 第22行中，這僅僅是一個
例如，自我防禦的錯誤檢查 以防萬一時間
百萬出錯， 至少我的程序不會崩潰。
>> 所以，如果s不等於壞的東西， 我有這樣的循環，這是
在那裡我們有其他 新語法。
我有一個循環從 零s的長度。
然後，在這裡，我是一個打印輸出S 支架，但為什麼我用％C
突然而不是％s甚至 雖然s是一個字符串？
這是一個字符，對不對？
S是一個字符串，但S支架的東西， Ş支架其中i是零
或一個或兩個，這是一個個人 字符串中的字符，所以對於
printf的需要通知 它確實是一個字符期望。
>> 然後記得，這樣做什麼 程序實際上做什麼？
>> 在列打印出來。
>> 是的，沒錯。
它只是印的字，我鍵入 一列，每行的一個字符。
因此，讓我們再次看到這個。
所以字符串。
編譯OK。 。/串。
讓我輸入H-E-L-L-ø，回車， 事實上，我得到它，每行一個。
>> 因此，讓我在這裡做一個優化。
如果你仔細想想，特別是如果 你編程之前，還有
可以說是一個低效率在24行。
換句話說，它不一定 最好的設計。
簡單，至少一次 記住STR楞是什麼，但它是
潛在的做了愚蠢的事情。
可能是什麼？
>> [聽不清]。
>> 沒錯。
它檢查s的長度 每一個時間，即使
H-E-L-L-O總是會 五個字符。
每次通過這個循環， 五個不改變。
我可能會遞增，但什麼 是s的長度在每個
這個循環迭代？
五，五，五， 但我仍然要求
再次提出質疑，並一遍又一遍。
坦率地說，現在的電腦是如此該死 速度快，沒有人會注意到一個
在這種情況下的差異，但這些種 可憐的設計決策能
如果編譯器本身開始增加 並不試圖解決這個問題，
通常不會， 至少在家電。
>> 所以我要做到這一點。
我要後添加一個逗號 我的第一個變量。
我要去給自己的另一 變量，調用N，僅僅通過
約定為數字，然後我 分配n的字符串值
s的長度。
然後我要改變 我的條件是什麼？
我要改變我的病情 而i是小於n。
>> 所以，現在，我多少次 檢查s的長度？
一旦，但它是確定檢查我反對 Ñ​​一遍又一遍，因為現在那些
值實際上並沒有發生變化。
現在，現在，任何時候，你只知道 調用一個函數，有一個位
開銷，沒有足以阻止你 真正從使用過的功能，但
肯定有一行代碼 - 線將得到
更有趣過不了多久 - 有一個機會去思考，如果我
輸入這個代碼，有多少 時間會執行嗎？
你將開始看到隨著時間的推移 你的程序的性能
的確改變。
>> 事實上，這個問題我們已經設置 在過去幾年裡做涉及
實施，你可能還記得 週為零，一個拼寫檢查器，但
拼寫檢查，旨在支持 150,000加的字典
也就是說，我們給你們。
你將不得不編寫代碼加載 到RAM中，所以進的那些話
盒子，就像我們看到在屏幕上瞬間 前，然後盡可能快地
可以，你必須能夠回答 的形式問題，是這個詞
拼寫錯誤？
這是單詞拼寫錯誤？
>> 的東西，像我們什麼 在過去幾年裡做的是把它變成，
儘管上的選擇，在選擇基準， 各種各樣的競爭，據此，
使用較少的RAM和學生誰 時間，更少的CPU週期，落得
冒泡到頂部的一點點 領導板或排名，我們把
當然我們的網頁 在過去的幾年中完成。
如此反复，完全可選的，但是這 講的設計機會
處於領先地位，一旦我們開始 建築頂上一些
基本構建塊。
>> 因此，讓我回到這個圖 只是片刻，露出一點
更多的東西。
這的確是一個字符串，我們已經採取了 利用幾個庫
標準io.h -
>> printf的。
>> printf的，在其他的事情。
cs50.h，這已經得到int和得到字符串 等等，string.h中，
有STR楞。
但事實證明，那裡的又一。
坦率地說，有很多很多的頭 文件聲明函數
圖書館，但這個文件ctype.h 實際上是要有點
有利的，因為我要去 繼續前進，實現一個
這裡的其他程序。
>> 讓我去進取，不斷開拓的東西 提前叫我寫
capitalize.c，讓我們 看看這是如何工作的。
請注意，我使用，在這個版本 ，三個熟悉的文件。
請注意，我在第18行， 獲取一行文本。
注意，在第21行，我聲稱 下面的代碼是怎麼回事
把握，無論用戶輸入 ，我怎麼做？
好吧，我考慮 -
從上一次的教訓 -
我聲明我n和迭代 在字符串中的字符。
然後這是塊什麼 在24到27行的代碼
做外行的條款嗎？
>> 小寫字母。
>> 沒錯。
如果s支架 - 因此，如果第i個 為s的字符，這是一個特定的
字符串中的字符，大於 或等於小寫a -
記得雙符號 表示 -
與人品同在支架I，S， 小寫的Z小於或等於
這意味著它的一個或B或C或 點，點，點，或Z，這意味著
它是小寫。
在這種情況下，我想要做的是什麼？
好吧，我可以做這個有點 若有所思，但
讓逗除此之外。
>> 我要調用printf打印％C 因為我要轉載本
字符在屏幕上。
然後，我要採取Ş支架I， 第i個字符，那麼為什麼
我在這裡做這個小動作， 小寫a減大寫字母A？
那是什麼要給 我，一般來說？
>> [聽不清]。
>> 沒錯。
我真的不記得 -
65資本A.我真的不 記得什麼小寫一個是，
但不管。
計算機知道。
所以說，小寫a減號 大寫字母A，是它的怪異
從另一個減去一個字符，但 引擎蓋下的字符是什麼？
他們只是數字。
所以，無論這些數字， 讓電腦記住它
人類，而不是我。
>> 因此，A是小寫a減去資本 要給我一個差異。
這恰好是32，這將是 的情況小寫b和資本的乙
等等。
它保持一致，謝天謝地。
所以我基本上說， 小寫字母，減去該
標準的差異， 有效地改變小號支架I
，當然小寫，大寫， 沒有我真的有想
或請記住，什麼是那些 數字，我們談到八時
志願者來到舞台上嗎？
同時，在其他的，如果它不 確定一個小寫字母
由24行，只是把它打印出來。
我只想觸摸 字符
實際上原先小寫。
>> 所以，讓我們來看看這個。
使利用。
編譯後，“確定”。
/利用。
並讓我輸入H-E-L-L-Ø 小寫字母，回車。
並注意該轉換 轉換為大寫。
讓我這樣做再次 不同的字。
怎麼樣D-A-V-I-D與第一D 資本化，作為一個名字，通常是什麼？
回車鍵。
請注意，它仍然是正確的。
它只是輸出，第一個D不變 通過該else結構。
>> 所以記住，於是， 夫婦的東西在這裡。
一，如果你想檢查兩個 一次的情況下，你可以和他們
我們一起預測。
以這種方式可以比較字符 有效治療字符
數字，但坦率地說，這是如此該死 神秘的，我永遠會記住
如何想出這個從頭開始 而通過它的推理相當
時間一點點。
>> 那豈不是一直很好，如果有人 在那裡寫一個函數調用是
降低可以回答我真或 假的，這個人物是小寫？
令人欣慰的好，誰寫 ctype.h中確實做到了。
讓我上去這裡的ctype為c 類型，現在讓我去這裡，
重寫此行如下。
>> 因此，如果這就是所謂的低，我要求，S 支架，然後我要刪除
這兩條線完全。
所以，現在別人的，我希望，寫 一個函數調用較低，並且
原來他們做了，他們宣布 它裡面ctype.h的。
現在，我要離開27號線 孤獨，我要離開31號線
孤單，但看到我多少 收緊了我的代碼。
現在它的清潔劑。
少，難以期待通過 因為現在的功能，而且，是
如此奇妙只是把它命名為 做什麼它說。
>> 所以現在我要保存這個。
我要縮小。
就像在Scratch你可以有 布爾值，布爾值true或
假的，那到底是什麼 有效降低回報。
讓我重新編譯。
讓我重新運行。
現在讓我們再次嘗試， H-E-L-L-O，回車。
這是相當不錯的。
然後再試一次，確保我 沒有螺絲的東西。
這是資本。
>> 但是，這是不夠好，因為 其他的事情，我從來沒有去
記住，除非我真的通過它的工作 仔細，說，紙
這該死的線。
那豈不是很好，如果有 一個功能叫上？
那麼它原來有 ctype.h中。
我要繼續前進，並鍵入 -
讓我帶回到該行。
而不是在這裡，讓我繼續前進 並說，替換為％C
調用這個函數的結果 上的s的第i個字符。
現在發現它越來越 一點點的平衡。
我必須繼續跟踪有多少 括號，我打開和關閉。
>> 所以現在更清潔。
現在，這個程序是越來越好 更好的設計，可以說是，因為它是
很多，很多更具可讀性，但 它沒有讓我們糾正。
使利用。
/利用。
H-E-L-L-O。讓我們再次運行它， D-A-V-I-D。 OK，所以我們仍然在
相當良好。
>> 但是，現在上。
我建議，還有一個更 我們可以做出細化，這將是
真的很不錯，真的可以收緊 了這個代碼，而真正給我們五個
的五設計，例如。
什麼將是很好的擺脫？
好吧，看如何該死的長塊 代碼只是簡單做一下。
>> 現在，順便說一句，你可能有 過去的這個超大斷面
週末，你不嚴格需要 當你只是有一個大括號
一行代碼，儘管我們提出 保持他們，以便使其多
更清晰，像在划痕的U形 塊，裡面有什麼分支。
但不會是很好，如果上， 其輸入時，把它變成
大寫的，如果它不是，會是什麼 是美好的，在相反的情況下，如果
它已經是大寫嗎？
只需將它穿過 離開單幹。
>> 所以，或許是這樣做的。
我可以嘗試，只是希望 這不，但讓我
引進另一件事。
而不是使用內置終端 窗口在這裡，記得，
這個廣場的黑色圖標給你一個 更大的終端窗口，我可以滿
篩選，如果我想要的嗎？
因此，原來他們是那種奇怪 命名，但有這些東西叫做
手冊頁，手冊頁，男子短， 我可以訪問這些由
鍵入man -
我想輸入什麼？
人上。
>> 現在發現，如果存在 函數裡面的電腦，
這種情況下的設備，這僅僅是 Linux操作系統，它是怎麼回事
給我一個略帶神秘的組 輸出，但你會發現隨著時間的推移，
它總是相當多的格式化 相同的，所以，你開始習慣它。
注意在頂部上​​， 顯然是同一文檔
為降低。
這是誰寫切割一些 角落，並把它在一個頁面上。
這些東西的目的 生活是轉換
字母大寫或小寫。
>> 請注意，根據劇情介紹，該男子頁面 教我我有什麼樣的文件
包括用這個東西。
它給我的這些簽名 功能，其中，即使
雖然我們現在只 關心一個。
現在這裡是一個描述。
上轉換信 c到大寫，如果可能的話。
>> 還不啟發，但讓我 現在看起來下返回值，這件事
交回。
因此，返回的值是， 如果轉換的字母或c
轉換是不可能的。
什麼是C？
>> 原來的字符。
>> 原來的字符，我們知道 ，通過再次上升到
故事大綱，誰寫了這 功能決定的輸入
到上，以降低僅僅是 隨意名為c。
他們可以把它叫做什麼最 他們想要的，但他們保持了
簡單為c。
所以，我已經諮詢手冊頁。
這句話安慰我說，如果 它不是一個小寫字母，這是
只是給我C，這是 完美，這意味著我可以擺脫
我的其他條件。
>> 因此，讓我回去gedit中， 現在讓我這樣做。
我要我的printf語句複製。
我要繼續前進，右內 循環打印出來，並得到
擺脫目前整個if結構。
是不是一個壞主意，這是非常 多正確，符合
我們所鼓吹的一切， 只是沒有必要的。
只要你意識到一些庫 函數存在別人
寫道，或者你在其他地方寫的 文件，你可以使用它，真正
開始收緊代碼。
>> 而當我說的東西，如良好的作風， 一個事實，即這個人被稱為
功能上，或以前是 低奇妙的是有用的，因為
他們非常的描述。
你不會想打電話給你的職能 x和y和z，其中有
多了，少得多的意義。
該系列的任何問題 改進？
>> 所以我只想說一個 外賣店甚至是你自己的問題
- 也許問題集，但 肯定P設定兩年以後，即使
當他們不一定正確 意味著他們是完美的只是
還特別精心設計的。
這是其他軸 開始思考。
因此，這是一個字符串在你的 計算機的內存，但如果你有一個
一大堆的字符，如H-E-L-L-ø 裡面的RAM，並假設
你在你的程序中調用得到的字符串 多次這樣的，你
一次調用get字符串，那麼你 再次調用get字符串。
嗯，什麼事情 隨著時間的推移發生？
>> 換句話說，如果你有一個線 代碼，雖然脫離了上下文，像
字符串s得到 -
讓我們做到這一點。
字符串名稱等於串。
因此，假設該行代碼是 要求用戶為他或她的名字。
下一行代碼是問 用戶輸入他或她的學校，和
這下一行，依此類推。
假設我們不斷地問 另一個用戶，並
又和另一個字符串。
他們會留在內存 在同一時間。
不會撞。
學校沒有其他覆蓋。
但他們都 結束了在內存中？
>> 那麼，如果我們開始在屏幕上繪製， 我們可以用這個東西
這裡就像一個黑板上，如果這個黑色 矩形代表我的電腦
內存，我要隨意地開始 將其分割成小方塊，
其中每一個代表 一個字節的存儲器。
坦率地說，如果你有1GB內存 這些天來，你有一個億字節
在您的計算機的內存，所以 一個10億這些廣場。
所以我只想說，這 是不是真的到規模。
>> 但是，我們可以繼續繪製所有這些 顯然不按比例的平方，而這
集體代表 我的電腦的內存。
現在我們只是做點，點，點。
所以換句話說，我現在提示 用戶獲取字符串給我一個
字符串，會發生什麼？
如果用戶鍵入“你好”，結束 在H-E-L-L-O。但是，假設
然後用戶類型 -
其實，我不應該這樣做 你好，因為我們要求
他們為自己的名字。
因此，讓我們回去，如果我能做到這一點。
>> 所以，如果我為我的名D-A-V-I-D型， 但記得，第二行
代碼串再次 得到他們的學校。
這個詞在哪裡，用戶 要去旁邊的類型？
好吧，也許它打算進入 H-A-R-V-A-R-D。因此，即使我
繪製為兩行，這僅僅是 在你的一大堆字節
計算機的RAM。
現在有一個問題，因為現在如果我 這是非常合理的使用RAM
但那種幼稚的方式，你能 沒有明顯區別？
一開始和 一端，對不對？
他們有點模糊起來。
>> 因此，原來的電腦 沒有做到這一點。
居然讓我在時間上向後滾動 幾個字符，而不是哈佛
後立即用戶的名稱， 用戶實際得到的，後面
的場景，一個特殊字符 插入的
為他或她的計算機。
/ 0，否則被稱為空字符 煩人稱為N-U-L時，未
N-U-L-L，但你把它寫為/ 0。
這只是所有的零位是一個標記 之間的第一個字，用戶的
被鍵入和第二。
>> 因此，哈佛實際上現在結束了 的字符序列，因為這
1/0。
因此，換句話說，通過讓這些 定點值，8個連續的零
位，你現在可以開始區分 從另一個的一個字符。
所以這一切的時候，什麼是“你好”是 實際上是“你好”/ 0
同時，有可能很好 相當多的RAM
裡面的電腦。
>> 讓我現在做另一件事。
事實證明，所有這些廣場 我們一直在畫畫，他們是：
字符串，但更一般地， 這些東西都是陣列。
數組只是一塊內存 背靠背背靠背，
您通常使用數組方式 本方括號。
因此，我們要看到這些頗有幾分 隨著時間的推移，但讓我繼續前進，
開拓，我們姑且稱之為它的年齡。
並且注意到我們能做些什麼 這些相同的招數，一點點
多一點這裡的語法。
>> 所以這個程序的第17行 - 其實，讓我先運行程序
所以我們可以看到，這件事情做什麼。
讓我叫年齡 編譯這個程序。
/年齡。
在房間裡有多少人？
3。
時代的第一人嗎？
18，19，和20。
現在有些可笑的是，我只是 有一個程序，青睞那些
三個人。
>> 因此，有明確的機會 這裡一些有趣的算術。
值得慶幸的是，數學是正確的。
18至19日，19去 至20，等等。
但是，什麼是真正的意思是 說明這裡是我們如何存儲
這三個人的年齡。
什麼讓我放大 怎麼回事。
>> 因此，首先，這些前幾行應該 得到相當熟悉。
我只是提示用戶 房間裡的人的數量。
然後我使用int和做一會兒 再這樣做一遍又一遍。
我們已經看到了這種模式，但 第27行是新的，其實挺
有用的，將成為 越來越有用。
請注意，在第27行有什麼不同 是我聲明
INT稱為年齡，但等待。
這不只是詮釋年齡。
這些方括號， 在其內部是n。
>> ，使托​​架n在這種情況下，不 裡面的一個printf語句，在這裡，但
在這唯一的第27行，這條線是 說，給我Ñ整數，其中每個
是int類型。
因此，這是一桶水，可以這麼說，， 在這種情況下，三個整數回
背靠背，讓我有效 有三個變量。
替代方案中，是 清楚，應該是這樣的。
>> 如果我想第一個學生 年齡，我可能做到這一點。
如果我想第二個學生 年齡，我可能做到這一點。
如果我想第三個學生 年齡，我可能做到這一點。
上帝保佑我們需要大家的 年齡在這個房間裡 -
我的意思是，這是一個了不起的大量複製， 粘貼一遍又一遍。
加一次我編這程序， 如果另一名學生走在了
那扇門，現在我的電話號碼 變量不正確。
>> 所以有關陣列不錯 一旦你開始感覺自己
複製和粘貼，賠率是這 不是最好的方法。
數組是動態可能。
我不知道提前多少人 將要在房間裡，
但我知道我需要他們的n，，我會 找出n當時間一到。
現在這行代碼意味著，給我一個 像這樣的內存塊
其中在屏幕上的盒數 是完全依賴於n
用戶輸入
>> 所以，現在這個程序的其餘部分是 什麼，我們實際上是非常相似
只是做的字符。
請注意，我有一個for循環 在第30行開始。
所以，正確後，我得到的數組，我 迭代y等於0到n。
我只是有這個指導性的printf 消息說，給我的年齡
＃％我的人，所以， 數二，數三。
我為什麼這樣做呢？
坦率地說，人類更喜歡從一數 起來，而計算機科學家，
零就到了。
計算機科學家都不會 使用這種程序，所以我們
剛開始計數 在一個正常的人一樣。
>> 現在在第33行，請注意咯 不同的語法一塊。
在該類型的變量i個年齡 陣列是會得到一個int。
最後，現在，這僅僅是 這裡算術下來。
我決定在一個單獨的循環，權利要求 一些時間的推移，現在在這
單獨的循環，這些行執行。
>> 從現在起一年，我將是我 歲，但注意到這一點是不
變量i。
現在，這是我為int％。
第一個佔位符通知我 插上i加1，所以我們指望像
正常的人。
然後的價值，他們的年齡， i年的時候，我採取年齡支架
- 為什麼我這裡加一做？
他們只是年齡。
這是我愚蠢的選擇方案。
他們只是賬齡為一年。
我可以輸入任何數字 其實我是想在那裡。
>> 那麼什麼是居然全部 這裡的相關？
好吧，讓我居然向後滾動 在這裡，畫一幅畫
什麼樣的景象。
我們將與我們的未來做什麼 習題集二是涉足
密碼學的世界。
所以這是一個字符串中的字符，所以 多個字符序列，
不這樣說？
這不是在網上版本 幻燈片。
>> 因此，我要求這等於這一點， 從多年的愚蠢廣告
以前，實際上可能還記得 它的起源之一。
因此，這是一個例子，加密 或加密。
事實證明，如果你想 實際上發送信息或股份
信息與別人牢固， 像類似這樣的消息，你可以
爭奪字母。
但通常情況下，話 不炒隨機。
他們以某種方式置換或改變 在某種程度上，這樣 - 哎呀。
這是一個有趣的攪局下一次。
>> 所以，你可以映射顯然是什麼 O到B.通知行
資本明智的。
顯然，R變為E。
顯然F-H-E-R變為S-ü-R-E。所以 它原來是一個映射，並在
這種情況下，有一個非常愚蠢的 映射，如果有人已經想通了？
這是一種叫做 腐13，旋轉13。
這是最愚蠢的加密 機制，因為它真的只是
增加了13到每一個字母， 愚蠢在這個意義上，如果你只是
有一點空閒時間，在你的手中 和一支鉛筆，或者你只是覺得它
通過在你的頭上，你可以試試 所有可能的補充 - 一，二，
三，點，點，點，25只是 旋轉整個字母表，
最終，你會找出 這個消息是什麼。
所以，如果你做了這樣的事情在 小學傳遞訊息給您
最好的朋友，如果你的小學 老師簡單地通讀
消息和蠻力強行解決方案， 你可能得到
的答案。
>> 現在，當然，在現實世界中， 密碼學是更複雜的。
這是一個從文本片段 計算機系統，用戶名和
密碼，幾乎所有我們做， 這就是你的密碼可能
如果存儲在硬盤樣子 開車，但以加密的形式。
這不只是一個字母旋轉， A是B和B是C，這是
更為複雜的，但它使用 一般被稱為秘密密鑰
加密。
這幅畫告訴 故事與幾個圖標。
>> 在左側，我們有什麼 我們會打電話給純文本。
在世界上的密碼，平原 文本只是原始消息
寫在英語或法語 或因任何語言。
如果你想對它進行加密，我們將通過 它形象地通過一個掛鎖，所以
一些類型的算法，一些功能 或程序，有人寫道：
希望，打亂字母 更複雜的不僅僅是增加13
每個人。
>> 你擺脫這一進程 中間還有被稱為密文。
這麼樣一個性感的字。
它只是意味著它的加密 純文本版本。
如果你有同樣的秘密， 13或減13，你是否能夠
解密，這樣的消息。
>> 因此，在問題設置兩個之間的事情， 你會做，如果在黑客
版，你將不得不寫代碼 破解這些密碼，搞清楚
他們是什麼，他們是如何 加密的，雖然我們不給你有點
指引前進的道路。
在標準版中，我們將介紹 一對夫婦的密碼，加密
機制，一個叫凱撒，一 稱為VIGENERE，仍然
其中A成為旋轉密碼 的東西，B變成的東西，但
你必須做編程 因為確實是有一個秘密
重點涉及的是一個典型的數字 或關鍵字，只有
這些發送者和接收者 消息應該明白。
>> 現在，這實際上已經變身 在現實世界中。
舉例來說，這是小孤兒 安妮的秘密解碼環，
實際上可以實現​​這些 旋轉密碼 -
B成為A成為的東西， 東西 - 一對夫婦的車輪，
一個在外面，在裡面 例如，如果你旋轉滾輪或
戒指，你實際上可以排隊的 字母與字母不同，
得到一個秘密代碼。
所以作為扣人心弦的今天， 我想我會做什麼，是有點
倒退，如果你打開電視 12月24日，你可以看
電影廣告nauseum 24小時成一排。
但今天，我會打開它在這裡 短短兩分鐘的，給我們
與教學相關的聖誕故事 一個名為拉爾夫的小傢伙。
>> [視頻回放]
>> 是向所有人， 拉爾夫·帕克現獲委任為
成員小孤兒安妮秘密 圓和有權
榮譽和利益 發生於此。
>> 簽名，小孤兒安妮。
會簽，皮埃爾·安德烈·墨。
榮譽和利益已經 九歲。
>> [喊RADIO]
>> 來吧，讓我們得到它。
我不需要所有的爵士樂有關 走私和海盜。
>> 聽明天晚上 結論冒險的黑色
海盜船。
現在，它的時間安妮的秘密 各位成員的留言
秘密圈。
請記住，孩子。
只有安妮的秘密圈的成員 可以解碼安妮的秘密消息。
請記住，伊能靜得靠你了。
設置引腳到B2。
這裡的消息。
12，11，2 -
>> 我在我的第一次秘密會晤。
>> -25，14，11，18，16 -
>> 皮埃爾是在今晚大聲音。
我可以告訴今晚的消息 是非常重要的。
>> -3，25。
這是一個消息從安妮自己。
記住，不要告訴任何人。
>> -90秒後，我唯一的房間 在房子裡，一個九歲的孩子
可以坐在隱私和解碼。
啊哈，B.我去到下一個。
E.的第一個字是“是”。 S. 它現在更容易。
U. 25。
這就是R。
>> 來吧，拉爾夫。
我得走了。
>> - 我會被降權，馬。
哎呀。
>> -T。 O.一定要。
可以肯定的是什麼？
什麼是小孤兒 伊能靜想說的？
可以肯定的是什麼？
>> 拉爾夫，蘭迪得走了。
請你出來？
>> 所有權利，馬。
我馬上就出來。
>> 我到現在越來越近了。
張力是可怕的。
它是什麼？
地球命運 掛在平衡。
>> 拉爾夫，蘭迪得走了。
>> - 我就出來 哭出聲來。
>> 幾乎。
我的手指飛了起來。
我的心是鋼的陷阱。
每一個毛孔振動。
這幾乎是明確的。
是的，是的，是的，是的，是的。
>> - 務必喝阿華田。
阿華田？
一個照出商用？
王八蛋。
>> [END視頻播放]
>> 音箱1：這是CS50，而 將習題集兩個。
下週見。
>> 揚聲器2：在接下來的 CS50，發生這種情況。
>> 揚聲器1：一個主題，我們沒有 看著迄今
函數指針。
現在，僅僅是一個函數指針 一個公共的地址
功能，但很像 -
兒子 -