揚聲器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:一個主題,我們沒有 看著迄今 函數指針。 現在,僅僅是一個函數指針 一個公共的地址 功能,但很像 - 兒子 -