[Powered by Google Translate] [演練 - 習題集2] [Zamyla陳 - 哈佛大學] [這是CS50。 CS50.TV] 好的。你好,大家好,歡迎來到演練2。 首先,我要祝賀你完成的pset 1。 我知道,它可能是一個有點艱難一些, 本來是你的,你寫的第一個計算機程序, 但是要記得,在本月底,當你回首在學期結束的時候, 你將看到的pset 1,你會說:“嘿,我可以做了,在5分鐘。” 因此,了解和信任,在本月底,你一定會找到的pset 1很簡單的。 但現在,這是一個巨大的成就,得到完成表示祝賀。 現在,也是一個快速的注意之前,我們得到到肉的演練。 我只想做一個快速的注意,我有時會沒有足夠的時間 在演練通過每一個方式做問題集 ,而只是可能集中在1或2種實現, 的方式,你可以做到這一點。 但是,這並不是說,你這樣做的另一種方式是被禁止的。 經常有,作為與計算機科學,無數的做事方式, 所以肯定會覺得自由地使用不同類型的比我可能已經提出的解決方案。 [pset中2:加密 - Zamyla陳 - zamyla@cs50.net] [pset2 - 0。 A組的問題 - 1。凱撒 - 2。維瓊內爾] 好的。所以,問題設置2:加密是一個有趣的。 再有,每pset中,你會開始部分問題 要在你的小節進行分配的教學研究員。 我們不打算在演練中去,通過這些, 但他們肯定會幫你完成的pset。 因此,問題集的第一部分是凱撒。 因此,在凱撒會有人與你擦肩而過的關鍵整數, 你將加密的文本字符串,他們為您提供 並給他們一個加密的東西。 如果有人觀看聖誕故事,有一個例子,有。 問題集的第二部分是維瓊內爾, 這是一個更先進的加密技術。 所以我們要來加密的一段文字, 除,而不是只是一個單一的整數,我們實際上是要編碼 的關鍵字,用戶將提供給我們。 好了,所以今天在工具箱中的工具實際上是將要更新設備。 在討論板中,我們將看到的東西一樣,“為什麼不工作的呢?” “為什麼不提交50個工作嗎?” 通常的解決方案實際上只是以更新您的設備。 所以,如果你只是運行在一個終端窗口,在您的設備須藤的yum-Y - 這是一個標誌,是的,更新的一切 - 更新, 那麼您的設備更新,如果需要的話。 它不會傷害,如果你已經是最新版本的設備。 然後,它會說沒有新的更新可用,您可以繼續工作一起。 但是,這是很好的執行,即使你每次打開設備 因為我們仍然非常 - 有時,如果我們進入一個錯誤 - 修復它在家電。 因此,請確保您有最新版本的設備 運行該更新存在。 好的。既然我們正在處理的信件和不斷變化的,加密的東西, 我們要真的想成為最好的朋友,我們的ASCII圖。 有無數的人在網上,如果你發現。甚至自己動手做。 基本上,每一個字母,每一個數字,每一個字符 與他們有關聯的數字, 所以這是很好的實際的信一起看他們的ASCII值。 這肯定會幫助你的問題集。 真的幫了我在這個問題上設置的一件事是把它打印出來, 我所經歷的,我會繪製就可以了, 寫,“如果去那裡,然後......” 樣的畫上記號,成為最好的朋友,你的ASCII表。 然後,我們有一些其他的工具,在我們的處置。 這一次,而不是提示用戶的所有輸入 我們要做的組合。 我們要促使他們對於某些輸入, 但我們也將只使用命令行參數。 所以,當他們運行自己的程序,通常你說/你好,例如, 如果你的程序hello.c的。 但是,這一次,而不是只是說,他們可以把字,參數之後。 因此,我們要使用他們傳遞給我們的任何作為自己的輸入, 如此巨大的感染力,不僅僅是提示整數,但也使用命令行參數。 然後,我們將進入數組和字符串,我們將使用了很多。 這只是一個例子,1個mini ASCII圖。 正如我所說的,每一個字母對應一個數字, 如此熟悉。它會派上用場。 後來當我們開始做一些ASCIIMath的處理與數字 - 加,減他們 - 那麼絕對是一個好參考這個圖表。 因此,這裡是一個愷撒密碼 - 的東西,你可能已經打了一個例子。 這僅僅是一個輪。從本質上講,有一個外字母表,然後有一種內在的字母表。 所以,這裡有一個例子愷撒密碼,但一個關鍵的0。 從本質上講,A是一致的A,B與B對齊,一路到Z 但後​​來說,例如我們希望有一個關鍵的3。 然後,我們會旋轉的內輪使A與D,等等。 所以這基本上就是我們要做的。 我們沒有一個車輪,但我們要做的是使我們的程序 種轉移的字母和我們一起一定量的數字。 因此,正如我之前說的,我們將要處理命令行參數 以及得到的整數。 所以,用戶將您的凱撒程序運行/凱撒說。 然後輸入一個號碼之後。 這個數字代表的關鍵,移位, 有多少次你要旋轉的內輪您的愷撒密碼。 所以你在這裡看到的一個例子。 如果我們在我們的凱撒密碼,輸入的字母從A到L 然後輸入D O的,因為這是每一個字母轉移的3倍以上, 類似的例子,我給你的車輪。 那麼,如果你輸入的,例如,這是CS50! 那麼它也將所有的字母。 這是一個重要的事情在這兩個凱撒和維瓊內爾的 是,我們將跳過任何非字母。 因此,任何空格,字符等,數字,我們要保持相同。 在這種情況下,我們只是要轉移的字母。 因此,正如你看到的,我們只有在車輪提供給我們的信, 所以我們只需要轉移的字母和字母進行加密。 因此,要做的第一件事,你看到的用法凱撒問題集2 是運行凱撒,然後輸入一個數字,當你在終端上運行。 所以,我們需要做的是,以某種方式獲得該密鑰和訪問它。 因此,我們要以某種方式看到它的將是第二個命令行參數。 第一個是/凱撒,將是下一個關鍵的數字。 所以,我們詮釋的主要(無效),開始我們的C程序。 我們要了一層剝開一點點 實際看到的,而不是將我們的主要功能無效 我們實際上是在處理有兩個參數。 我們有一個int,名為ARGC,然後一個字符串數組被稱為argv的。 因此,argc是一個整數, 它代表了傳遞給你的程序中的參數。 然後,argv是實際傳遞的參數列表。 所有的參數都是字符串,所以argv的一個數組,列表,字符串。 讓我們來談談關於數組的一點點。 數組本質上是一種新的數據結構。 我們有整數,我們已增加一倍,我們的字符串,現在我們有陣列。 陣列的數據結構,可容納的相同類型的多個值, 所以基本上,你想要的任何類型的列表。 從本質上講,如果你想要一個整數都在1個變量列表, 然後,您將創建一個新的變量是int類型的陣列。 所以數組是從零開始的索引,這意味著該數組的第一個元素的索引為0。 如果數組的長度為4,在這個例子中,那麼你的最後一個元素將在索引3, 這是4 - 1。 因此,要創建數組,你會做這樣的事情。 假設你想要一個雙陣列。 這也適用於任何類型的數據類型,雖然。 所以說,你想有一個雙陣列。假設你想調用它的郵箱。 就像你會初始化任何其他雙, 雙,然後你會說這個名字,但是這一次我們把方括號, 然後是電話號碼會有陣列的長度。 請注意,在數組中,我們不能永遠改變的長度, 所以你總是要定義和選擇多少箱, 您的陣列將要舉辦多少個值。 因此,要在你的陣列設置不同的值,你要使用下面的語法, 正如你看到的幻燈片上。 你有郵箱索引0將被設置為1.2, 郵箱索引1設置為2.4,等 所以,現在我們已經回顧了陣列位,讓我們回到argc和argv。 我們知道,argv是一個字符串數組。 因此,當用戶通過在 - 說,他們正在運行的程序 - 他們說/你好大衛·馬蘭, 已經為您實際上是來了什麼argc和argv是什麼程序做。 所以,你不必擔心這個問題。 ARGC在這種情況下,因為它看到3個不同的字之間用空格分隔。 因此,然後在此實例中的陣列,第一個索引將/你好, 下一個,下一個大衛·馬蘭。 有沒有人看到馬上之間的關係是什麼ARGV,  數組,argc是嗎? 是啊。我們將進入一個例子,args.c. 讓我們來看看,如果我們可以利用的關係2。 在這裡,您可能會發現,在家電的默認應用程序 打開c文件有時是Emacs的。 但是,我們希望用gedit來處理,所以你可以做什麼,你可以用鼠標點擊你的C文件, 去“屬性”,“打開方式”,然後選擇gedit中,設置為默認, 現在你的程序應該打開gedit中,而不是Emacs的。 完美的。 所以在這裡我有一個程序,我想打印出每個命令行參數。 因此,無論用戶輸入,我想基本上是把它送回給他們一個新的生產線。 那麼,什麼是結構,我們可以用它來遍歷東西 - 的東西,你可能在你的pset 1? 如果你想要去的通過設置一些事情呢? >> [學生] For循環。 For循環。沒錯。因此,讓我們開始用for循環。 我們必須為int i = 0。讓我們開始一個標準的初始化變量。 我要離開的條件為一組,然後說我+ +,要做的事情。 好的。 所以,回想起ARGV,如果argv是列表中的參數傳遞給程序 argc是參數的個數在程序中, 那麼這意味著argc是本質上的argv的長度,右, 因為有將是為argc多個參數的值。 因此,如果我們要遍歷每個元素argv中, 我們會想每次訪問該變量在argv在給定的索引。 這可以表示為這,對不對? 在這種情況下,這個變量代表了特定的字符串 因為它是一個字符串數組 - 特定的字符串,給定的索引。 我們想要做的是什麼,在這種情況下,我們希望將其打印出來,讓我們說printf的。 而現在,argv是一個字符串,所以我們希望把這個佔位符。 我們希望有一個新的生產線,只是為了使它看起來好。 所以,在這裡,我們有一個for循環。我們不具備的條件。 所以,我從0開始,然後每次要打印給定的字符串 在該陣列中的特定索引。 那麼,我們什麼時候要停止打印出數組中的元素呢? 當我們已經完成了,對不對?當我們已經走到了盡頭的數組。 因此,我們不要超過過去的數組的長度, 我們已經知道我們需要積極尋找的長度和argv是什麼 ,因為它給我們,那是什麼? ARGC。沒錯。 所以,我們想要做的這個過程中的argc次數。 我不是在正確的目錄。 好的。 現在讓我們把參數。沒有錯誤,這是偉大的。 因此,讓我們運行ARGS。 這是什麼要回到我們的身邊呢?只是要打印出來。 “您輸入的ARGS到程序中,我要去給它回給你。” 因此,讓我們說我們想說的ARGS富酒吧。 那麼它打印出來寄回給我們。好嗎? 因此,有一個例子,如何使用argc和argv 知道的argc表示argv的長度。 請確保你不會超出了數組的長度與數組訪問一個 因為C肯定會喊你。 你會得到的東西稱為分割故障, 這是從來沒有的樂趣,基本上是說你試圖訪問的東西 不存在的,不屬於你的。 所以一定要確保,特別是零索引,我們不希望 - 喜歡舉例來說,如果我們有一個數組的長度為4, 該數組的索引4不存在,因為我們從0開始,在零指數。 當我們從0開始,這將成為第二個性質一樣的for循環。 因此,只要記住這一點。 你不想,曾經訪問數組的索引,你也達不到。 因此,我們現在可以看到我們如何才能哪種類型的訪問 命令行參數傳遞的。 但是,正如你看到的字符串,argv是一個字符串數組。 因此,它實際上是整數,但在凱撒我們要處理整數。 幸運的是,為我們創造的功能,實際上可以將字符串轉換為整數。 也正是在這裡,我們不處理用戶輸入我們提示 在這裡輸入的關鍵,所以我們不能實際重新提示,並說, “”哦,給我另一個整數,也就是說,如果是不正確的。“ 但是,我們仍然需要檢查是否有正確的使用方法。 在愷撒只允許他們通過1號, ,所以他們有運行。/凱撒,然後他們給你一個數字。 所以ARGC有一定數目。 這是什麼號碼,如果他們要傳遞給你。/凱撒,然後一鍵嗎? ARGC是什麼? >> [學生] 2。 >>雙。沒錯。 所以,你想,以確保argc是2。 否則,你基本上拒絕運行程序。 它主要是說,國際主要的功能, 這樣的話,我們始終在良好的實踐的一檔成功的節目結束時返回0。 因此,如果說,他們給你的命令行參數,而不是2 或給你,例如,你會做什麼是你要檢查 ,然後返回說,沒有,我不能繼續進行這項計劃。 [學生]有可以在您的文本中不能有空格。 >>請原諒我嗎? [學生]你想加密的文字不能有一個空間。 “啊! ,我們正在試圖加密的文本,這實際上是後話 當我們給該文本。 所以現在我們只是接受命令參數的實際數目, 實際位移的凱撒加密。 [學生]:為什麼你需要,而不是僅1 ARGC? 1號。 右。我們之所以需要2個為argc,而不是1 是因為當你運行一個程序並說/凱撒/個招呼, 實際計算作為命令行參數。 那麼,已經佔據了1,所以後來我們在輸入1張額外的。 所以,你輸入的命令行參數是一個字符串。 你想要做什麼,凱撒,我們要處理一個整數, 所以,你可以使用這個atoi函數。 基本上,你在一個字符串傳遞給它,然後它就會回報你回一個整數 如果可能的話,使該字符串轉換為整數。 現在還記得,當我們正在處理與printf或GetString時,這樣的事情, 包括具體到我們的庫。 因此,在一開始,我們開始與的散列標籤標準I / O,H,類似的東西。 好了,atoi的是在這些庫, 所以我們要做的是,我們必須有正確的庫,。 所以,記得演練1,我討論了手動功能。 您鍵入的人在你的終端,然後由一個函數的名稱。 因此,將其使用帶來了一個全新的名單, 但因為它會帶來哪個庫屬於。 所以我把它留給你使用的手動功能ATOI 你需要包括能夠使用atoi函數庫。 因此,我們已經拿到了鑰匙,現在它得到的純文本, 所以,實際上是向您提示用戶輸入。 我們處理調用getInt和getFloat,因此,在同樣 我們要處理的GetString。 但是,在這種情況下,我們並不需要做任何做或while循環檢查。 GetString的肯定會給我們一個字符串, 我們要進行加密的用戶給我們。 所以,你可以認為所有這些用戶輸入的字符串是正確的。 大。 那麼,一旦你已經拿到了鑰匙,一旦你得到了文本, 現在剩下的就是你來加密明文。 只是為了迅速覆蓋了行話中,明文是用戶給你, 和密文是你返回給他們。 所以字符串,能夠通過實際信信 因為我們要轉移的每一個字母, 據我們了解,字符串,如果我們剝離層, 我們看到,他們真的只是一個字符列表。 一個後。 因此,我們可以將字符串作為數組,因為他們是字符數組。 所以說,你有一個字符串命名的文本, 並在該變量的文本存儲,這是CS50。 然後在索引0的文本將是一個大寫字母T,指數1小時,等等。 然後用陣列中的argc在args.c的例子, 我們看到,我們不得不遍歷一個數組 所以我們必須從i = 0迭代,直到我是小於的長度。 因此,我們需要一些方法搞清楚什麼是我們的字符串的長度是 如果我們要遍歷它。 幸運的了,有一個功能,對於我們來說,雖然後來在CS50 你一定能夠實現自己的功能,使您的 可以計算一個字符串的長度。 但是現在我們要使用字符串的長度,所以strlen的。 你傳遞一個字符串,然後它會返回一個int值,代表你的字符串的長度。 讓我們看一個例子,我們可能能夠遍歷字符串中的每個字符 做一些。 我們想要做的是遍歷每個字符的字符串, 和我們想要做的是,我們打印每個字符1 1 但我們添加的東西在它旁邊。 因此,讓我們開始用for循環。 INT I = 0。 我們就要走了空間的條件。 我們要重複,直到我們到達字符串結尾的,對不對? 那麼,什麼樣的功能為我們提供了字符串的長度? [聽不見的學生反應] 這是命令行參數的長度。 但我們要使用的功能,讓我們的字符串的長度的字符串。 所以這是字符串的長度。 這樣的話,你有一個字符串,它通過。 它需要知道它需要計算長度的字符串。 那麼在這種情況下,我們要處理的字符串s。 大。 所以,我們想要做的是什麼,讓我們的printf。 現在,我們要處理的字符。我們要打印出每個人的個性。 當你想打印出一個浮動時,你可以使用這樣的佔位符%F。 一個int,你會使用%d。 同樣,一個字符使用%C說我要打印一個字符 是存儲在變量中。 所以,我們都這樣了,讓我們添加一個句號和一個空間給它。 我們使用哪一個角色? 我們將要使用我們的字符串的任何字符。 那麼,我們將要使用的東西,用繩子, 但我們要訪問某些字符。 因此,如果一個字符串就是一個數組,那麼怎麼辦,我們訪問數組中的元素? 我們有那些方括號,然後我們把在那裡的指數。 因此,我們必須方括號內。在這種情況下,我們的索引,我們就可以使用。沒錯。 因此,我們在這裡說,我們要打印一個字符後面跟著一個點和一個空格, 該字符將是我們的字符串s中的第i個字母。 我只是要節省。好吧。 現在,我要執行字符串的長度。 因此,我們有一個字符串名為OMG,現在它更強調。 同樣,讓我們說,我們確實希望得到來自用戶的字符串。 我們怎麼可能這樣做呢? 在此之前,我們是如何得到一個int? 我們說調用getInt,對不對?但是,這是不是int,讓我們的GetString。 讓我們把字符串的長度。在這裡,我們沒有進入一個特定的提示。 所以我不知道。 我要去把我的名字在這裡,那麼我可以做的事情之一 我給你一個單詞的每一個字母或類似的東西。酷。 所以這是字符串的長度。 所以我們又回到了愷撒。 我們有一些工具,我們如何遍歷字符串, 我們如何訪問每個元素。 所以,現在我們可以回去的程序。 正如我之前提到的,在ASCII表,你最好的朋友, 你將看到的數字,都與每一個字母。 所以在這裡說我們的明文是我暈! 然後這些字符有一個數字,它與ASCII值, 即使是單引號,即使是空間,甚至是感嘆號, 所以,你要記住這一點。 所以說,我們的主要用戶在其命令行參數包括6。 這意味著,這是我的第一個字母,這是代表了73, 你想返回到他們的任何字母所代表的ASCII值73 + 6。 在這種情況下這將是79。 現在,我們要進入到下一個字符。 所以接下來的索引1中的明文將單引號。 但是,請記住,我們只希望來加密信件。 因此,我們要確保的撇號保持不變, 我們不改變從39到45什麼是。 我們要保持它作為一個單引號。 因此,我們要記得只加密被字母 因為我們希望所有其它符號在我們的程序中保持不變。 另一件事,我們想要的是保存資本。 所以,當你有一個大寫字母,它應該保持一個大寫。 小寫字母應保持為小寫。 因此,一些有用的功能,能夠處理僅加密信件 並保持維護資本化的東西 因而isalpha,isupper,islower功能。 所以,這些函數返回一個布爾值,。 基本上,true或false。這是一個大寫的嗎?這是字母數字嗎? 這是一個字母,本質上。 因此,這裡有3個例子,你將如何使用該功能。 基本上,你可以測試是否由該函數返回的值是true或false 基於該輸入。 無論是做不加密器的東西或密碼,或確保它的大寫字母, [學生]:你能不能解釋多一點,你如何使用它們?是啊,肯定的。 因此,如果我們回頭看看,在這裡,我們有資本我,對不對? 因此,我們知道,我去O,因為我是O + 6 但我們要確保的O將是一個資本O. 因此,基本上,這是一種將改變我們的輸入。 因此,無論是大寫或不會種改變我們處理它的方式。 因此,然後在那個特定的索引,如果我們使用isupper函數, isupper(“I”),返回我們真正的,所以我們知道它的上部。 那麼此基礎上,以後我們將進入一個公式 您將要使用的轉移在凱撒的東西, 這樣的話基本上,會是一個略微不同的公式,如果是大寫 而不是小寫。有意義嗎? 是啊。無後顧之憂。 我討論了一些加入了一封信,沒有引起太大意義 除非我們了解這些字符 是一種互換整數。 我們做的是一種使用隱式轉換。 我們將進入鑄造了一下之後你在哪裡取一個值,你把它變成一個不同的類型 比原來的。 但是,這pset中,我們就可以種交替使用的字符 及其對應的整數值。 所以,如果你只是包住一個只用單引號括起來的字符, 然後你就可以用它來工作的整數,它作為一個整數處理。 因此,大寫字母C至67歲。小寫的F,涉及到102。 同樣,如果你​​想知道這些值,看看您的ASCII表。 因此,讓我們進入一些例子,你也許可以減,並把它們添加到 實際上,你可以真正的工作與這些字符,交替地使用它們。 我說,ASCIIMath是要計算一個字符的另外一個整數 然後顯示所得到的字符,以及所得的AS​​CII值。 所以在這裡我說 - 這部分我們將處理後 - 但基本上,我是說,用戶應該說運行ASCIIMath沿的一個關鍵, 我的意思是,關鍵是要數 我們要添加這個人物。 所以在這裡請注意,由於我要求的關鍵, 因為我要求他們給我的事情, 我只希望接受/ asciimath和關鍵。 因此,我將要求argc是等於2。 如果不是,那麼我將返回1,程序將退出。 所以我說,關鍵是不能將是第一個命令行參數, 這將是第二個,你在這裡看到, 我打算把它轉換成一個整數。 然後,我將設置一個字符為r。 請注意,可變的字符的類型實際上是一個整數。 我可以使用r為整數的方式,是由這些單引號包圍它。 所以回到我們的printf語句,我們有一個佔位符字符 然後一個佔位符的整數, 的字符所代表的字符,並且的整數是關鍵。 因此,我們要在結果中添加2一起。 因此,我們要新增R +什麼,關鍵是, 然後我們要打印的結果。 所以讓我們asciimath。這是最新的,所以讓我們,只是運行asciimath。 哦,不過看,它不會做任何事情,因為我們沒有給它的一個關鍵。 因此,當它剛剛回來,我們的主要功能,它只是返回給我們。 那麼,讓我們通過在一個關鍵。有人給我一個號。 >> [學生] 4。 4。好吧。 所以R增加了4將會給我們V,對應的ASCII值118。 那麼它是有道理的 - 其實,我可以問你,你怎麼想的ASCII值的r,如果r + 4 118嗎? 然後,是的,r是114。 因此,如果你在ASCII表中,然後,果然,你會看到,R是代表了114。 所以,現在我們知道,我們可以添加整數的字符,這似乎很簡單。 我們只是要遍歷一個字符串,如我們所看到的一個例子之前。 我們會檢查它是否是一個字母。 如果是的話,那麼我們將它轉移什麼,關鍵是。 很簡單,只是,當你喜歡這個, 你看,Z,代表了122,然後會給你一個不同的角色。 我們其實是想留在我們的字母表,對不對? 因此,我們需要找出一些環繞著種方式。 當你到達ZED你想要增加了一定的數量, 你不想進入超越ASCII字母部分; 你想換一路A. 但請記住,你仍然保留的情況下。 因此,知道字母不能成為符號 就像符號都不會被改變。 在過去的pset你絕對沒有必要, 但一個選擇是使用的模函數來實現你的貪婪的pset。 但現在我們將需要使用模量, 所以我們就在這個有點。 從本質上講,當你有Y,X模,讓你x除以y的其餘部分。 下面是一些例子。我們有27%15。 基本上,當你減去15的27多次可能沒有得到負 那麼你得到12左。 那麼,這有點像在數學方面,但如何才能真正使用這個呢? 這將是有用的為我們的wrapover。 對於這一點,讓我們只想說,我問你,分為3組。 有時候,你這樣做組和類似的東西。 說,我說,“好吧,我希望大家可以分為3個。” 你如何做到這一點? [聽不見的學生反應]是的,沒錯。數。好吧。 讓我們做到這一點。你要開始? [學生計數] 1,2,3,4。 但是,請記住... >> [學生]:哦,對不起。 這是一個很好的點。 你說,但我們真的希望你說的,因為我們只需要3組。 那麼,如何 - 不,這是一個很好的例子,因為這樣你可能會說,1? 4和1之間是什麼關係? 好了,4 MOD 3為1。 所以,如果你繼續,你會2。 因此,我們有1,2,3,1,2。 同樣,你實際上是在第5位。你知道如何說,而不是5? 你說5 MOD 3 2。 我想看看多少個組,每組3遺留下來的,然後為了我 這樣的話,如果我們繼續沿著整個房間, 然後我們會看到,我們一直在實際應用對自己的MOD功能 種數。 這是一個更多樣的實實在在的例子,你可能會使用模 因為我敢肯定,大多數人可能都經歷這個過程中 我們不得不計算。 上模有任何疑問? 了解的概念,這將是非常重要的, 所以我想,以確保你們明白。 [學生]如果沒有餘數,它給你的實際數目? 如果其中的第3,他們已經做到了,這給了他們,他們實際上是什麼, 或將它已經給了他們聽不見] >>這是一個很好的問題。 如果沒有剩餘的模 - 所以說,你有6個模3 - 給你回0。 我們將談論了一下後。 哦,是的,例如,第三人 - 3模3實際上是0,但她說3。 所以,這有點像一個內層的catch,例如, 像好吧,如果MOD為0,那麼我將是第三人。 但是,我們就會陷入一種我們可能會想如何處理是什麼0後。 所以,現在我們有某種正面的方式映射到正確的字母與zed。 所以,現在,我們已經討論了通過這些例子, 我們種凱撒如何可能的工作。 您看到的字母,然後你看到他們轉移。 所以,讓我們試著表達式。 這個公式實際上是在規範中給你, 但還是讓我們通過每一個變量意味著什麼?樣的期待。 我們的最終結果將是密文。 因此,這表示,在第i個字符的密文 將對應的第i個字符的明文。 這是有道理的,因為我們總是要排隊的這些東西。 因此,它是第i個字符的密文加K,這是我們的關鍵 - 這是有道理的 - 然後我們有這個mod 26。 記得當我們有ZED 我們不希望進入的字符,所以我們希望國防部 種環繞的字母。 後ZED你會去一個,B,C,D,直到你得到了正確的號碼。 因此,我們知道,ZED,+ 6,會給我們f,ZED來,因為在A,B,C,D,E,f。 因此,讓我們記住我們知道,可以肯定的是ZED +將會給我們f。 在ASCII值,z為122,,f是102。 因此,我們必須找到某種方式,使我們的凱撒公式給我們102 後在122。 因此,如果我們只是套用這個公式,('Z'+ 6)26%,這實際上給你24 因為122 + 128; 1​​28%26為您提供了24餘數。 但是,這並不真正意味著F。這絕對不是102。 這也是不是字母在字母表中的第6。 所以,很顯然,我們需要有某種方式的調整這一點點。 在常規字母,我們知道,z是26日的信,和f是第六屆。 但是,我們在計算機科學,所以我們要去指數在0。 這樣的話,而不是z為26號,我們會說這是25號 因為a是0。 現在讓我們套用這個公式。 我們有z為代表的25 +,它給你31。 31 MOD 26給你5餘數。 這是完美的,因為我們知道f是第5個字母在字母表中。 但它仍然是F,對不對?它仍然是102。 那麼這pset中,是一個挑戰將試圖找出的關係 之間的轉換之間的ASCII值,按字母順序排列的索引。 從本質上講,你會想要做什麼,你想開始的ASCII值, 但你要以某種方式翻譯成一個按字母順序排列的索引 然後計算出它應該是什麼字母 - 基本上,其按字母順序排列的索引是什麼 的密碼字符 - 翻譯,後面的ASCII值。 所以,如果你掀起你的ASCII表,然後嘗試和發現之間的關係,比方說,102和5 或122個和25個。 我們已經得到了我們的主要的命令行參數,我們得到的明文, 我們已經加密了。 現在,我們剩下要做的就是打印出來。 一對夫婦不同的方式,我們能做到這一點。 我們可以做的其實是打印的,因為我們走。 當我們遍歷字符串中的字符, 我們可以簡單地只打印正確的,那麼當我們計算它。 或者,您也可以將其存儲在數組中,有一個字符數組 和迭代結束時,整個數組,並打印出來。 所以,你的選項,有一對夫婦。 請記住,%c是將要打印字符的佔位符。 因此,我們有凱撒,現在我們轉移到維瓊內爾, 這是非常相似,凱撒只是稍微複雜一些。 所以基本上與維瓊內爾的,你要通過一個關鍵字。 因此,而不是一個數字,你將有一個字符串, 等,將作為您的關鍵字。 然後,像往常一樣,你會得到一個提示用戶的字符串 然後加密被它然後給他們的密文回。 所以我說,這是非常類似的凱撒,除了沒有移位了一定的數量, 數實際上是要改變每一個角色對角色的。 代表的實際數量轉移,它代表的字母鍵盤。 所以,如果你在一個移位,例如輸入的,那麼這將對應於0的移位。 因此,它再次返回按字母順序排列的索引。 什麼可能是有用的,如果你看到的,我們實際上是在處理與ASCII值 以及字母,以及按字母順序排列的索引, 也許找到或製作自己的ASCII表顯示按字母順序排列的索引從0到25, a到z的ASCII值,所以你可以看到種的關係 並勾畫出和嘗試,並找到了一些模式。 同樣,如果您正在發生轉變在一定的情況下,由f - 這可以是小寫或大寫的F - 那將對應5。 我們好為止嗎? 其計算公式為維瓊內爾是一個有點不同。 基本上,你看,它只是像凱撒, 除了恰為k,而不是我們有k個指標j。 請注意,我們不會使用我,因為基本上,關鍵字的長度 不一定是我們的密文的長度。 這將是一個更清楚一點,當我們看到一個例子,我有位以後。 基本上,如果你運行你的程序的關鍵字,ohai, 那麼,這意味著,每一次,,ohai是要成為你的轉變。 因此,這取決於你在什麼位置,在您的關鍵字, 你要改變你的某些密文字符由該金額。 同樣,就像愷撒,我們要確保我們保持資本化的東西 我們只加密器字母,而不是字符或空格。 所以,回頭給該撒,你可能已經使用的功能, 的方式,你決定如何轉移的東西,它應用到你的程序在這裡。 因此,讓我們的地圖了這一點。 我們有明文,我們已經得到用戶的GetString 說這句話的...是CS50! 然後我們有一個關鍵字ohai。 前4個字符是非常簡單的。 我們知道,T是將要由o偏移, 那麼h將被移位由h,i的要被移位了。 這裡你可以看到一個為0, 這樣的話實際上是相同的字母前的終值。 然後,s是由i偏移。 不過,你有這些時期在這裡。 我們不希望來加密,那麼我們不改變它的任何東西 只是打印出期間保持不變。 [學生]我不明白你怎麼知道這是移 - 你在哪裡 - “”哦,對不起。 在頂部在這裡你看到的命令行參數ohai在這裡, 那將是關鍵字。 所以基本上,你騎自行車在字符的關鍵字。 [學生]等將被轉移 - 因此,O對應字母表中到一定的數量。 [學生]。但是,你在哪裡得到了CS50部分? 哦。這是在GetString的,在那裡你會說,“給我一個字符串進行編碼。” [學生]他們打算給你這樣的說法轉移的 然後你會問你的第一個字符串。 >>呀。 所以,當他們運行的程序,他們要包含關鍵字 在其命令行參數時,運行它。 然後,一旦你已經檢查了,他們實際上已經給你,而不是更多,而不是更少, 然後你要促使他們為一個字符串,說:“給我一個字符串。” 所以,在這種情況下,他們已經給了你這...是CS50! 那麼你要使用,使用ohai和遍歷。 請注意,這裡我們跳過了加密期間, 但在ohai,下一個我們的立場,我們用O。 在這種情況下,這是一個有點難以看到,因為這是4, 讓我們繼續位。只要堅持,我在這裡。 然後,我們有i和s,然後將其由o和h分別翻譯。 然後我們有一個空間,這樣的話,我們知道,我們是不會來加密空間。 但是請注意,而不是去一個在這個地方,在這裡, 我們加密的 - 我不知道,如果你能看到 - 就在這裡。 因此,它不喜歡你實際上是預定的,說,O都在這裡,H這裡, 一個在這裡,我在這裡,H,O,A,I,O,H,A,I。你不這樣做。 你只能改變你的位置的關鍵字 當你知道你將要加密一個實際的信。 請問那種有意義嗎? 好吧。 因此,只要一些提醒。 你要確保你只在您的關鍵字前進到下一個字母 如果您的明文中的字符是字母。 所以說,我們在鄰。 我們注意到,下一個字符,i索引的明文,是一個數字,例如。 然後,我們不推進J,我們的關鍵字的索引,直到我們達到另一封信。 同樣,你也想開始的關鍵字,以確保您概括的 當你在它的結束。 如果你看到這裡,我們是在我,下一個是O。 所以,你要找到一些能夠概括的方式開始您的關鍵字 每次你到達終點。 如此反复,什麼樣的運營商迴繞在這種情況下是有用的嗎? 例如關閉計數一樣。 [學生]百分號。 “是啊,百分號,這是模。 因此,模將在這裡派上用場,當你想換您的ohai在索引中。 只是一個快速提示:嘗試認為有點像計數包裝過的關鍵字, 在那裡,如果有3組,第4人, 他們的人數,他們說的是4 MOD,這是1。 因此,嘗試,並認為這樣的說法。 正如您所看到的配方,只要您有詞,然後PI,然後KJ, 你想,一定要保持跟踪這些。 你不需要我打電話給它,你不需要把它稱為Ĵ, 但你要確保你跟踪你的位置,在您的明文 以及你的位置在您的關鍵字 因為那些不一定是相同的。 不僅關鍵字 - 它可能是一個完全不同的長度比你的明文。 此外,您的明文,有數字和字符, 所以它不會完全匹配起來。是。 [學生]有一個功能改變的情況下? 你可以改變一個大寫字母A?是啊,肯定有。 您可以檢查出 - 我相信它的TOUPPER,所有1個字。 但是當你試圖密的東西,保存的文本, 這是最好的,基本上有獨立的情況下。 如果它是一個大寫的,那麼你要轉移 因為在公式中,當你回頭看我們如何種下去 代表數字的ASCII方式之間交替 與實際按字母順序排列的索引,我們要確保 將是你要使用某種模式。 另注上的圖案,真的。 你一定要與數字打交道。 盡量不要使用幻數,這是風格的一個例子。 所以說,你想每次移動所喜歡的東西 - 好了,這樣的提示,另一個擾流板,當你將要轉移的東西 通過一定量時,盡量不要代表一個實際的數字 而是嘗試,看看你是否可以使用ASCII值,這將種更有意義。 另注:因為我們正在處理的公式, 即使你的TF知道你可能會使用什麼模式, 最好在您的寶貴意見種解釋的邏輯,如, “我使用這種模式,因為......”一種解釋模式,簡潔地在您的寶貴意見。 [這是演練2]如果沒有其他問題,然後我就留在這兒一點點。 祝你好運與您的pset 2:加密的到來,並感謝。 [學生]:謝謝你。 >>謝謝。 [媒體離線介紹]