[Powered by Google Translate] 第習題集2:黑客版 羅布·波頓,美國哈佛大學 這是CS50。 CS50.TV 所以,我搶。我是一個高級的柯克蘭。這是我第三年TFing CS50。 這是第一次,我們正在從傳統的講座式的部分, 我們只是在課堂上發生了什麼事,然後你們問的問題,這種審查 現在到了很多問題為基礎的,在這裡我們使用空間,以及 - 哦,這樣的想法是鏈接,我送你去,那麼你就在我的空間。 任何人都擁有一台筆記本電腦呢?好吧。 因此,我們將使用這個,我們將做的問題,住在節 和討論,搞清楚什麼是錯的 ,我可能會拉你的代碼,和我討論您的想法。 所以,有沒有人有困難嗎? 您可以就在旁邊聊天,我不知道我們是否還能有原因的。 現在,像以前supersection,如果你在這個類,你知道這是什麼。 在所有的P組有將這些部分。 因此,P-集合,規格,我想你已經看到了1組P-。 但我們可以看看我們今天要為2組P-。 你會看到一條條的問題。 因此,這將是在所有的P-集合,將是一個部分的問題。 到目前為止,我們已經表示,“考慮到這是一個練習的機會。” 你不會被要求提交這一計劃。 我們的想法是,這些都是應該種幫助您開始使用的問題集。 我想對黑客版,很多人都應該是新的,有趣的東西需要學習。 他們可能不是直接適用問題集。 而現在,我們沒有您提交的,但在理論上, 後面的習題集,您可以提交他們,這樣的話你可以第 或觀看一節得到的答案,或者你可以讓他們在自己的 如果你感覺不一樣,享受著我的存在。 所以 - 我想這是第一個。 哦。此外,根據這些條文的問題,我們也有提問的短褲。 所以我想,從理論上講,你應該看這些,才第, 但它的罰款,如果你不這樣做,反正我們就去了他們。 因此,我們可以開始與這些“如何做一個while循環不同,從do-whil​​e循環? 如果是後者尤其有用嗎?“ 因此,任何人有任何 - ? [學生]:do-whil​​e循環將永遠都至少執行一次。 是。所以這是其中的差別。 while循環 - 我會在這裡只是做 - while循環中,我們具備的條件 就在這裡,而一個做一段時間,你不會有一個條件,直到我們得到了這裡。 所以,當你的程序執行,並得到while循環, 立即檢查,如果條件為真。 如果這個條件是不正確的,它會跳過整個循環。 -whil​​e循環中,程序執行時,它得到的“。” 在這一點上沒有任何反應,只是繼續執行。 然後,當它擊中“的同時,”如果條件為真時,它會循環備份並再次這樣做 和一次又一次,直到條件是不正確的,然後正好落在通過。 因此,所不同的是,這從一開始就可以跳過。 這必然執行一次,然後可以執行更多的時間,如果條件仍然是正確的。 因此while循環只會做一次,或者 - 在while循環 - 我們可能不會在所有需要做的是, 因為一旦我們得到它,如果條件為假,我們就跳過它。 而做while循環中,我們將執行一次,一定。 然後,當我們的條件,我們檢查它是否是真還是假。 如果這是真的,我們會再次做它,如果它是假的,我們就繼續。 因此,當後者尤其有用嗎? 所以,我可以說,在整個的4年,3年,無論 我一直在編程,我使用了這一點,如,根據10倍。 也可能5年,他們在CS50當我們要介紹的do-whil​​e循環。 因此,當你使用do-whil​​e循環? 當是 - 是嗎? [學生]:當你試圖獲取用戶輸入的,或者是你要檢查 - 是啊。因此,do-whil​​e循環,用戶輸入的是大的。 這就是為什麼習題集上的第一對夫婦,當你要問的用戶,喜歡, “給我一個字符串,”你不能繼續下去,直到你得到的字符串。 所以你一定要問的字符串至少一次。 但如果他們回答什麼壞事,那麼你需要循環回來再問。 但以外的其他用戶輸入,這是非常罕見的,我遇到的情況 在這裡我要循環“至少一次”,但可能更多。 問題或 - ?有沒有人用一個do-whil​​e循環在其他地方嗎? 好吧。因此,下一個是,“這是什麼未聲明的標識符 通常輸出鐺?“ 那麼,什麼樣的代碼,我可以寫'未聲明的標識符?“ [學生]:X = 2? 因此,我們可以嘗試在這裡,X = 2。 我們將執行這個 - 哦,我沒有點擊它。所以,在這裡我們得到 - 所有權利。 “使用未聲明的標識符x”。 所以這是未聲明的標識符,變量。 它會頻繁調用的變量標識符。 因此,它可能不知道它實際上是一個變量,它不知道它是什麼。 所以這是一個標識符。 那麼,為什麼它未申報的嗎?是啊。 所以要明確的術語,聲明一個變量 當你說“詮釋x”或“串y,”不管。 該變量的初始化或賦值的變量, 無論何時說“X = 2”。 因此,我們可以在不同的步驟,X,X = 2,直到 - 在這裡,我們可以有一大堆的東西 - 但直到這一行發生,X仍然是未初始化的,但它已被宣布。 因此,我們可以明顯地做1號線,現在我們的聲明和初始化。 有問題嗎? 最後,“為什麼是愷撒密碼不是很安全嗎?” 因此,首先,沒有人想說的愷撒密碼是什麼? [學生]:愷撒密碼是你映射,你改變每一個字母, 一定數量的字母走了過來,和移動過去,和它不是很安全,因為 只有26個可能的選項,你只需要嘗試的人,直到你得到各1。 哦。所以,我要重複? 愷撒密碼,it's - 我的意思是,你會與它打交道的問題,你 - 我想問題集,這不是對黑客版的標準版。 因此,在標準版的問題集,你得到這樣的消息:“你好,世界” 你也有這樣的數字6,你把該消息,和每個人的性格, 你轉動它在字母表中的6個位置。 因此,'h'的在hello會成為H-I-j的-的k-升米 - 正。 因此,第一個字母為N。我們做同樣的事情,以e。 如果我們有一個喜歡的,z或什麼的,然後我們轉回到左右至“A”。 但每個字符得到循環後6個字符的字母,這是不是很安全 因為有可能性有多少種方法,你可以換一個單一的字母只有26個。 所以,你可以嘗試26,據推測,足夠長的消息, 這些可能的26件事將是清晰的, 和清晰的將是原始郵件。 因此,它不是什麼都加密的一個很好的方式。 那些短褲無關,“是什麼功能?” 那麼,什麼是函數?是。 [學生]:這就像一個單獨的一段代碼,你可以打電話去,然後得到返回值的任何。 是啊。所以我會回答也回答下 - 或重複,也只是回答下一個。 您可以使用功能,而不是只是複製和粘貼代碼,並且再次。 只要採取的代碼,把它變成一個機能的,然後你就可以調用該函數 只要你已拷貝和粘貼。 因此,功能是有用的。 所以,現在我們要做的實際問題。 第一個。的第一個這樣的想法是,你把它傳遞一個字符串,也不管 - 它說所有的小寫?這並不是說所有的小寫字母。 因此,該消息可以是任何東西, - 哦,不。它的作用。 “為了簡單起見,你可以假設用戶將只能輸入小寫字母和空格。” 所以我們把它傳遞消息只有小寫字母,然後我們輪流 - 我們改變資本和小寫之間的字符串大小寫,交流。 所以,我們給你第二次,甚至潛入的問題, 我們需要做的第一件事是什麼? 哦,我只要按一下呢?哦,我只是在這裡點擊一封電子郵件。 因此,我們需要做的第一件事情 - 我在錯誤的嗎? 這是這其中的一部分嗎? 不,這是仍然在那裡,雖然。 好了,還在這裡。 現在,我們可以不承擔 - ?是。在這裡,我們不能想當然地認為這只是小寫字母和空格。 所以,現在,我們要處理的事實,字母可以是任何我們希望他們。 因此,我們想要做的第一件事情是剛剛得到的消息。 我們只需要得到一個字符串,字符串s = GetString的,沒問題。 現在這個問題,有一對夫婦的方法做這件事。 但是,我們將要在這裡使用按位運算符。 有沒有人無論是在supersection, 什麼的,不知道按位運算符是什麼? 或者它們如何與ASCII以任何方式? [學生]:我是不在supersection,但我知道什麼是位運算符。 好吧。於是我也沒有去他們的基礎知識,但我會解釋 我們將要在這裡使用。 所以'A':大寫字母A的二進制表示,這個數字是65。 我只是去看看 - 41將是01000001。 所以,這應該是十進制的65,所以這是二進制表示的字符大寫的A 現在,在二進制表示的字符小寫'a'的 是怎麼回事,幾乎是同樣的事情。 - 6,是的。這是正確的。 所以二進制大寫的A,二進制小寫的“。 所以注意到之間的差異和'A',這是單位。 而這恰好是32位,該位代表32號。 這是有道理的,因為A是65,“A”是97。 它們之間的差值是32。 所以,現在我們知道,我們可以轉換,採取了從A到'A' 按位“或”, - ,看起來像一個1。 這是一個按位OR,和00100000,這會給我們的。“ 而且,我們可以從'a'到一個AND運算 11,0,11111在那個地方。 因此,這將給予我們什麼'一',但取消了單獨的位, 所以我們不得不01000001,我不知道我算。 但這種技術的按位“或”資本為小寫, AND運算以小寫的資本是不排斥為A。 所有的字母,K,Z與Ž,與k 所有的人都只是要本單位不同。 所以你可以用它來從任意小寫字母的任何大寫字母,反之亦然。 好吧。所以,一個簡單的方法得到 - 而不必 寫出任何1011111是 - 表示此數的一個簡單的方法,這是不是一個 ,我去在supersection的,但符號(〜)是另一種按位運算符。 〜做的是,它看起來位表示。 讓我們任意數量。 這僅僅是一些二進制數,和什麼〜是翻轉的所有位。 所以這是一個1,現在是0,這是一個0,現在為1,010100。 所以,這一切〜。所以32的要數 - 擺脫了這一點 - 所以32的要數00100000,等〜這將是 這個數字,在這裡,我相與'一'。 是否每個人都看到了嗎?這是很常見的,比如當你想弄清楚 後來的事,我們可能會看到,當我們想看看 - 我們想要的一切,每一個位組除1 〜你會做的,我們不想設置位。 因此,我們不希望32位集,所以我們〜32。 好吧。因此,我們可以使用所有這些在這裡。 好,那麼它的罰款,如果你不這樣做,我們將慢慢地走一起, 或步行,所以 - 通過這個。穿過。 因此,我們有,我們希望我們的字符串,該字符串中的每個字符循環和做東西給它。 那麼,我們如何循環一個字符串?我們應該用什麼呢? 我不打算在這裡做。是啊。 所以,我有我的迭代器,他說,但我怎麼知道有多少個字符的字符串? STRLEN(S),然後我+ +。 所以我在這裡所做的是不是最好的方式做事情。 有誰知道為什麼嗎? 因為你要檢查的字符串每一次的語言。 因此,我們將要移動的strlen,我可以說,在這裡,長度= strlen的(), ,然後我<長度,和的情況下,你沒有看到它之前, 我還可以做INT I = 0,長度= strlen的()。 因此,這是比較可取的,因為現在我已經限制的範圍 的可變長度只是這個'for'循環,而不是聲明之前 ,它總是存在的情況下,你沒趕上為什麼這是很糟糕的, 為什麼原來的是壞,it's的 - 在for循環的開始。 我檢查了條件。 I > 1位。 它可以是1位以上,只要該位置以下的所有的比特是相同的。 因此,我們需要至少26個字符 - 或者,有26個字符。 因此,我們需要至少26個數字代表的不同 - A和'a'的是至少26,之間的差異 否則我們將不會代表所有的資本。 這意味著,如果我們從1開始,它要使用所有這些位, 所有的這些前5位,代表一切到Z 這就是為什麼下位,或該位,下位的選擇區分A'和'一個是一個。“ 這也是為什麼,在ASCII表中,有5個大寫字母,小寫字母符號分離。 由於這些符號,額外帶來32是它們之間的區別。 [學生]:因此,我們可以這樣做,因為ASCII是這樣設計的。 是。但是,ASCII - 差異也可能是這兩位。 一樣,如果A是10000001,和'a'11100001 - 我忘了,什麼都好。 但是,如果它是,那麼我們仍然可以使用'A' - A. 這是剛才和'a'是這2位之間的差異。 我認為這是寫48。它是32 + 64?我認為它是什麼? 它仍然是2位,每一個字符一樣,Z和Z,K和k, 他們仍然有完全相同的位設置除了這2位。 因此,只要這是真實的,不管,如果我們使用的是ASCII或其他一些系統, 只要有唯一的一組不同的每個字符的比特數, 然後,工作正常。 這只是32成立,因為它是第一個,我們可能使用。 >>酷。 我傾向於選擇,如果你還沒有看到,如果塊是只有一行, 你可以擺脫的花括號,所以我傾向於選擇這樣做。 另外,你知道我們可以做這樣的事情則s [i] + = 1? 你也可以做的[I]位= 32。 和按位OR = 32。 此外,數模2 == 0。 因此請記住 - 我不會寫 - 任何非零的值是真實的,0是錯誤的。 因此,“如果數模2 == 0”是一樣說:“如果沒有數模2。 我可能會正好相反的線條和說,“如果數模2, OR 1,還有什麼“與”1“,所以,我沒有需要”不。“ 但是,這一樣好。 而且,我還能做什麼呢? 你可以將它們組合,如果你想與三元,但後來那只是使事情變得混亂, 可能更難以閱讀,因此,我們將無法做到這一點。 任何人有任何其他建議嗎? 是要求所有的問題?哦,是的。 因此,擺脫這些空行,現在我們要打印F,%s的一個字符串, 我們將打印的F,S。 現在,讓我們來運行它。我做了什麼事? 這是一個\“,我想一個n。 好吧。現在我們來運行它。它可能會罵我。 STRLEN是在string.h。 因此,這是鐺是美好的事情,它告訴你它在, 而不是GCC,只是說,“嘿,你忘了的東西,我不知道那是什麼。” 但是,這會告訴我,“你的意思是包括string.h中。” 所以我也沒有提示任何東西,所以它什麼也不說。 不過,我們會做他們的榜樣,“感謝4”添加“。 這看起來是對的。萬歲。 所以回到你的主,我幾乎從來沒有做到這一點。 它是可選的。主要是它的唯一功能是可選的。 如果你不返回任何東西,從主,假設你的意思是返回0。 有問題嗎? 好吧。所以,現在的第二個問題。 “回想一下從第2週的第二場演講,交換2個變量的值傳遞 這2個變量的功能(即使稱為交換)不完全相同的工作,至少在沒有“指針”。“ 而忽略直到我們得到的指針。 我們要交換兩個變量,我們不使用一個函數來做到這一點。 我們仍然要做到這一點,主像它說。 但是,使用這2個變量,我們不希望使用一個臨時變量。 有2種方法來做到這一點。 使用傳統的二元運算符,你可以這樣做。 因此,沒有人知道一個快速和骯髒的方式做到這一點? 實際上,這可能需要一分鐘的思考。如果我有 - 我將設置問題,如他們的要求。所以,如果我有2個變量,A,這是僅僅是一個整數 他們給了我,和變量B,這是我的另一個整數。 所以,如果我有這2個變量,現在我要來交換他們。 傳統的,使用常規的二元運算符,我的意思是,如+, - ,÷。 不按位運算符作用於二進制。 因此,使用 - ,+,÷,和所有那些。 我們可以做這樣的事情交換A = A + B,和B = A - B,A = A - B。 因此,合理性檢查,然後我們將看到為什麼這樣的作品。 比方說,= 7,b = 3的,則a + b時,將是10。 因此,我們現在設置= 10,然後我們做B = A - B。 因此,我們正在做的B = A - B,這將是7,和b = - B再次 或a = A - B。這是會是10 - 7,它為3。 正確,所以,現在,'a'的為7,b是3,現在b是7和'a'是3。 因此,那種是有道理的,'a'是2號的組合。 在這一點上,“A”的組合,然後我們減去原來的b, 然後我們減去了什麼是原來的“一”。 但是,這並不適用於所有的數字。 要看到這一點,讓我們考慮一個系統,所以我們通常認為的32位整數。 讓我們攜手的東西,只有4位。 我希望拿出一個很好的例子,現在。 所以,我知道,這將是容易的。 比方說,我們的2號為1111和1111,所以我們現在是在二進制。 在實際的小數,如果你要覺得這樣的說法,A = 15,B = 15。 因此,我們預期,我們交換後,他們 - 他們甚至必須是相同的數字, 但我做了這樣的看法。 讓我們使它們不相同的數字。讓我們做1111和0001。 因此,一個= 15和b = 1。 我們交換之後,我們希望'一',是1和B為15。 因此,我們的第一步是A = A + B。 我們的人數只有4位,所以“一”,這是1111 +,這是0001, 即將結束為10000,但我們只有4位。 所以,現在為a = 0。 現在,我們要設置B = A - B - 實際上,這仍然工作完美。 A = A - B - 讓我們來看看,如果這個工程很完美。 因此,然後b = 0 - 1,這將仍然是15,並且然後= - B,這將是1。 也許這樣做的工作。 我覺得有一個原因,它不使用常規的工作。 好了,這樣的假設,這是行不通的,與普通的二進制運算, 我會看 - 我將谷歌,看看是否是真實的。 因此,我們要做到這一點使用按位運算符,和這裡的線索是XOR。 因此,引入XOR(^),如果你沒有看到它。 再次,這是位運算符,所以它的作用有點位,it's - 如果您有位0和位1,那麼這將是1。 如果你有位1和0,這將是1,你的位0和0這將是0, ,如果你有1位和第1,這將是0。 因此,它是或。如果任一的位都為真時,它是1,但不像OR,它不能是兩個位都為真。 或將是1,XOR將是0。 因此,我們會想使用XOR這裡的。 一分鐘想想吧,我去谷歌。 那麼,你可以不讀了,我目前的XOR交換算法。 希望這將解釋為什麼我不能做到的 - 這也正是我們只是做了該算法。 我還是不明白為什麼 - 我一定只是選擇了一個壞榜樣, 但這種情況下,'a'的發生成為0後,得到5位,所以現在“a”為0, 這就是被稱為“整數溢出”。 根據維基百科,“不同的是XOR交換,這種變化需要,它採用的一些方法 保證是x + y不會導致整數溢出。“ 因此,這確實有問題,這是整數溢出,但我做錯了什麼。 我不太肯定。我會盡量拿出另一個。 [學生]:那麼,是不是整數溢出,當你試圖把一些在那裡 大於您已經分配的比特量? 是啊。我們有4位。 That's - 我們有4位,然後我們嘗試把它加1,所以我們結束了5位。 但在第五位只是被切斷,是的。 它實際上可能 - [學生]:那你扔一個錯誤,或者做什麼才能 - 會拋出一個錯誤嗎? 號,所以有沒有錯誤。當你得到的裝配水平,一個特殊的位 地方是說,有一個溢出,但在C你種不處理。 實際上,你可以不處理它,除非你使用特殊的彙編指令C. 讓我們想想XOR交換。 我認為維基百科的文章可能也一直在說 - 因此,它也帶來了模運算,所以我想我是,從理論上講,這樣做的模塊化算術 當我說,0 - 1再次是15。 所以,實際上可能 - 定期的處理器,它0 - 1 = 15。 因為我們結束了,我們在0減1,所以它只是繞回大約為1111。 因此,該算法實際工作中,在A + B,A - B,B - A,這可能是罰款。 但還有一些處理器,不這樣做,所以它不會在這些特定的罰款。 XOR交換將處理器的限制。好吧。 我們的想法是,它應該是一樣的,雖然。 如果我們使用XOR以某種方式獲得的信息都為1的變量, 然後拉出單個變量的信息。 因此,任何人有想法/答案嗎? [學生回答,不知所云] 因此,這應該工作,而且,XOR是可交換的。 無論2號的順序發生在這裡, 這樣的結果將是相同的。 因此,一個^ b是B ^一。 你可能也看到了這個寫成^ = B,B ^ =,^ = B再次。 因此,這是正確的,為什麼這個工程,認為位。 使用一個很小的數字,比方說,11001,01100。 因此,這是'a',這是B。 因此,一個^ = B。 我們要在'A'=的XOR這些東西的。 因此,1 ^ 0 1; 1 ^ 1是0; 0 ^ 1是1,0 ^ 0是0; 1 ^ 0是1。 所以,“一”,如果你看的十進制數,它會是 - 你不會看到之間的關係,原有的“a”和新的“一”, 但看著位,'A'是現在像一個網狀的信息 原''和原來的b。 因此,如果我們採取B ^,我們看到,我們最終會在原有的“一”。 如果我們把原來的“一個”新的“,”我們看到,我們在原來的B。 所以(^)^ B =原來的“一”。 (^)^ =原來的b。 - 這是什麼XOR本身的另一種方式是始終為0。 所以1101 ^ 1101,所有的位都將是相同的。 因此,永遠不會是一個的情況下,其中1為0且另一方為1。 因此,這是0000。 與此相同的。 (^)^ b是一樣^(B ^)。 (^ B)為0; ^ 0的只是將“一”,因為所有的位都為0。 因此,唯一的,都將是其中'A'原本是1 - 的。 同樣的想法在這裡,我敢肯定,這也是交換。 是啊。我是說在此之前,它是交換的。 ^','和它的關聯,所以現在(B ^)^。 我們可以做B ^(^)。 因此,我們再次與原來的b。 因此,“a”為現在的'a'和b的組合在一起。 使用我們的新組合“”我們說B =組合'A'^原來的b,我們原來的'。“ =組合'A'^新的B,這是原來的 - 這是現在什麼是'A'或B。 這種情況下,這是在這裡。這是老B = B,。 所以,現在一切都恢復的交換順序。 如果我們確實看著位,B = ^ B,XOR這些, 的答案是這樣的,那麼A = A ^ b是異或這2個的答案是這樣的。 有問題嗎?好吧。因此,最後一個是有點明顯更加困難。 [學生]:我覺得他有一個關於它的問題。哦,對不起。 [學生]:實際上更快?如果您使用此XOR,或者是如果你聲明一個新的變量? 那麼,什麼是實際上是更快,聲明一個新的變量或使用XOR交換? 答案是,在所有的可能性,一個臨時變量。 這是因為一旦它的編譯 - 所以在裝配水平, 有沒有這樣的東西作為局部變量或臨時變量或任何東西。 他們只是想 - 有記憶,有寄存器。 寄存器裡的東西都在積極發生。 您在內存中不添加兩件事情,你添加在寄存器中的兩件事情。 你帶的東西從內存到寄存器中,然後將它們添加, 然後你可能把它們放回內存,但所有的動作都發生在寄存器中。 因此,當你使用臨時變量的方法,通常會發生什麼 這些數字已經在寄存器中。 然後,從這個角度上,在你交換他們, 它會剛開始使用其他寄存器。 任何地方,你一直在使用B,它會使用的寄存器,它已經存儲的一個。“ 因此,它並不需要做任何事情,其實做掉。是嗎? [學生]:但是,這也需要更多的內存,對不對? 如果需要存儲,臨時變量,它只會佔用更多的內存。 就像如果你以後再次使用該臨時變量的地方, - 或你指定的東西,臨時變量。 因此,如果在任何點在時間','b在溫度有不同的值或東西, 那麼它會在內存中有不同的位置,但它是真實的, 還有很多地方將只存在於寄存器變量。 在這種情況下,它從來沒有裝入內存,所以你永遠不會浪費內存。 好吧。最後一個問題是多一點。 所以在這裡,在這CS50設備,是字典。 這樣做的原因是因為[B66是一個拼寫檢查器,你會寫? 使用哈希表或者嘗試一些數據結構。 你要編寫一個拼寫檢查器,你將要使用這本詞典要做到這一點。 但對於這個問題,我們只是去看看看,如果一個字在字典中。 因此,一些數據結構中,而不是存儲整個字典 在整個文件中,然後再尋找是否有任何的拼寫錯誤, 我們只是想找到1個字。因此,我們可以掃描整個字典 如果我們永遠也找不到這個詞在整個字典,那麼它是不是在那裡。 如果我們掃描整個字典,就看見了這個詞的話,我們是很好的,我們發現了它。 它說,在這裡,我們要開始尋找C的文件處理功能, 因為我們想讀的字典, 但我會給出提示,在這裡,你就應該想到的功能。 我把它們寫空間上。 因此,主要的,你想看看是F打開,然後,不可避免地,F封閉, 這會在你的程序的結束,和f掃描f。 你也可以使用F讀,但你可能不希望 因為那 - 你不結束需要,。 F掃描f是什麼,你要使用掃描整個字典。 所以,你需要編寫的解決方案,只是嘗試和喜歡偽代碼的方式 一個解決方案,然後我們將討論這個問題。 而實際上,因為我已​​經給你的這些,如果你去到任何終端或設備的外殼, 我想 - 我通常是 - 如果你還沒有看到,我不知道,如果你沒有在課堂上, 但是,在幾乎所有功能的人,所以該名男子的網頁,是非常有用的。 所以,我能做的,喜歡的,曼F,掃描f。 這是現在的的掃描F系列的功能的信息有關。 我也可以做男人F,打開,那將讓我的細節。 因此,如果你知道你是什麼功能,或者你正在閱讀的代碼 和你看到一些功能,你會說,“這是什麼做的?” 正直的人,函數的名稱。 奇怪的例子,你可能會說有一對夫婦 等等。男子2,函數名,或人為3,函數名, 但你只有做到這一點,人類如果函數名不會發生在工作的第一次。 [學生]:所以我閱讀的手冊頁開放,但我仍然困惑於如何使用它的程序。 好吧。很多的手冊頁不到有幫助的。 如果你已經知道他們做了什麼,他們更多的幫助 然後你只需要記住的參數或東西的順序。 或者,他們可以給你的一般概述,但他們中的一些是非常熱烈。 如F掃描f。它為您提供了所有這些功能的信息, 和1號線在這裡發生說,“F掃描f讀取的字符串或流。” 但是,F打開。那麼,我們將如何使用f? 這個想法的一個程序,它需要做的文件I / O, 你首先需要打開該文件,你想要做的事情,不可避免的是, 從該文件中讀的東西,他們做的東西。 F打開是我們用什麼來打開該文件。 我們得到的東西回來,所以我們要打開的文件,它為我們提供了 - 在這裡“/用戶/共享/ dict / words中說。” 這是我們要打開的文件,我們想打開它 - 我們必須明確地指定我們是否要打開它來讀取或如果我們想打開它來寫。 有一對夫婦的組合之類的東西,但我們要打開閱讀。 我們希望從文件中讀取。 所以,這是什麼回報呢?它返回一個文件星號(*), 我就顯示所有的變量f,所以*, 再次,它是一個指針,但我們不希望處理指針。 你可以認為F,F是現在要使用你的變量來表示該文件。 所以,如果你想從文件中讀取的,你看,從f。 如果你想關閉文件,關閉F。 因此,在程序結束時,我們不可避免地要關閉的文件,我們應該怎麼辦? 我們要關閉F。 所以,現在的最後一個文件,我們將要使用的功能是掃描F,F掃描f。 是什麼做的是,它會掃描過的文件尋找一個模式來匹配。 在這裡的手冊頁,我們看到的詮釋f掃描f,忽略現在的返回值。 第一個參數是文件*流,因此,我們將要通過的第一個參數為f。 我們在F掃描。 第二個參數是一個格式字符串。 我會給你一個格式字符串現在。 我認為我們碰巧說,127S \ n這是不必要的,很多。 格式字符串是什麼,這個想法是你能想到的掃描相反的打印f f。 所以,印刷F,印刷f的也可以使用這種類型的格式參數, 但在印刷f我們正在做的是 - 讓我們來看看在同等。 所以打印樓,其實也有f打印f,其中第一個參數為f。 當您打印F,我們可以這樣說,“打印127S \ n”,那麼,如果我們把它傳遞了一些字符串, 這將打印字符串,然後一個新的生產線。 127個手段,我敢肯定,但我從來沒有限制自己, 你甚至不需要說'127'在打印F, 但它的意思是打印前127個字符。 因此,我敢肯定是這樣的話。你可以谷歌。 但我幾乎可以肯定,這意味著在未來的一。 因此,這是前1​​27個字符,打印一個新行。 F掃描F現在,而不是在看一個變量,並打印出來, 它會看一些字符串,並將其存儲到變量的模式。 讓實際使用掃描f在一個不同的實施例。 因此,讓我們說我們有一些int x = 4時, 我們要創建一個字符串 - 要創建的字符串 這是喜歡,這會更晚, 的東西就像4.JPG。 所以這可能是一個程序,你將不得不和計數器, 總結對付我,你要保存的一組圖像。 所以,你要保存i.jpg,我是你的循環迭代。 那麼,如何才能使此字符串,JPEG? 如果你想打印4.JPG,我們可以說,印刷F,%D.JPG, 然後它會打印,J​​PEG。 但是,如果我們要保存的字符串4.JPG,我們使用掃描f。 所以字符串s - 其實我們不能做到 - 字符,char類型,讓我們去100。 所以,我只是聲明了一些陣列100個字符, 而這正是我們不可避免地將要存儲的JPEG中。 因此,我們要使用掃描f,格式,我們怎麼會說%D.JPG 為了打印4.JPG,這樣的格式是怎麼回事是%D.JPG。 因此,格式的是的%D.JPG,我們要替換%d是x, 現在我們需要將該字符串存儲的地方。 我們要去的地方來存儲這些字符串數組s。 所以在這行代碼,S,如果我們打印F,%s的變量s, 它要打印4.JPG。 所以f的掃描掃描f,f是相同的,但現在它在這個文件 什麼存儲在s。 這將是最後一個參數。 我們要存儲 - 根據格式,嘗試下面的“掃描功能掃描的F系列。 如果有任何存儲的位置點,您可能會返回 - “ 不,我們可能是件好事。讓我想到的第二個。 所以掃描 - f不的功能做,到底是什麼呢? 因此,掃描f是不會採取一個整數,做點jpg文件。 它是怎麼回事為[曼波斯]。 保存字符串int int變量C. 這是什麼變量,這是什麼功能叫什麼名字? 是。 That's - 是的。所以我定義你之前的印刷f, - 更有道理,所以我說,這是更像打印f。 掃描f是種像打印f,但f是的打印掃描到它 和替換變量並存儲在一個字符串中。 而不是打印的,它存儲在一個字符串。 所以,完全忽略。您仍然可以認為像印刷f格式說明符。 所以,現在,如果我們想要做的4.JPG的事情,我們會做的印刷f,x的這個。 所以掃描f是做什麼 - 什麼是你的問題又如何呢? [學生]:我們試圖在這裡做什麼,我只是困惑 與JPEG。你能解釋更多的時間嗎? 因此,這是 - 這是減少到f掃描F現在希望,將比分扳成在某種方式的相應和。 但我最初打算顯示的是 - 這其實是直接相關的這些[? F5] 你將要使用的印刷f,在那裡,說我們有100個圖像, 和你想讀的圖像1.JPG 2.JPG,3.JPG。 因此,為了做到這一點,你需要f開,然後你要傳遞的字符串,你要打開。 因此,我們想打開的1.JPG;為了創建的字符串是1.JPG 我們做的印刷f的%D.JPG,我們沒有為int i = 0。 我40歲時,我+ +。 所以的印刷的F%D.JPG的我。 因此,此行後,變量或數組s要1.JPG。 或者,0.JPG,1.JPG 2.JPG。因此,我們可以打開,閱讀,每幅圖像。 所以這是的打印f做。你看什麼的打印f是現在做的嗎? [學生]:好了,所以它 - 它創建了一個字符串,something.jpg,然後將它保存下來。 是。它創造 - 這是另一種格式的字符串,就像掃描f和印刷f, 將所有的變量的第二個參數,可能是s,而不是我。 也許 - 我的意思是,那樣的話。但是,無論是參數的順序。 這將插入到的格式字符串中的所有變量 然後將其存儲到我們的緩衝區,我們稱之為是一個緩衝區,它就是我們要存儲的字符串。 所以,我們將存儲在s的正確格式的字符串,%d的有4個被替換。 [學生]:所以,如果我們這樣做,是要被重新分配的變量f? 是。因此,在這樣做之前,我們應該關閉原來的F。 但是 - 再還,如果有一個F打開這裡,那麼我們就需要說 - 是啊。但是,它會打開一個100個不同的文件。 [學生]:但是,我們將不能夠訪問或 - 好吧。 好吧。因此,掃描掃描樓F,F是一種同樣的想法, 而是,而不是將其存儲到一個字符串,它更像是你現在 超過刺痛,針對該字符串模式匹配的結果存儲到變量。 您可以使用掃描的f來解析過類似4.JPG,和存儲的整數總和詮釋x 4成。 這就是我們可以使用掃描的f。 F掃描f是在命令行中要做到這一點。 實際上,我敢肯定,這是什麼CS50庫。 所以,當你說“詮釋,”它的掃描F-OVER - 掃描f是您獲取用戶輸入的方式。 F掃描f是打算做同樣的事情,但使用掃描過的文件。 所以在這裡,我們對這個文件進行掃描。 我們要匹配的模式是一些字符串的長度為127個字符 其次是一個新行 所以,我敢肯定,我們甚至可以說:“匹配小號”,因為在字典中 我們正好有沒有字,我們保證的是,長期, 也F掃描f,我認為,在新的生產線停止,無論什麼。 但在比賽中,我們將包括新的生產線,並 - [學生]:如果我們不包括新的生產線,將它找到一個詞的部分嗎? - 每個 - 在字典 - 因此,在字典中,這些都是我們的話。 每個人在新的一行。 掃描f是要拿起這個詞。 如果我們不包括新的生產線,那麼它有可能是在下一次掃描的f將只讀取新的線。 但是,包括新的生產線,然後會忽略新的生產線。 但我們永遠不會得到一個字的一部分,因為我們一直在閱讀了一個新的行,不管是什麼。 [學生]:但是,如果你搜索的單詞“CISSA,”像CISSA。 它會發現,並說這是一場比賽嗎? 所以,我們在這裡 - 它會讀出 - 這其實是一個很好的點。 我們從來沒有使用電流 - 這個詞,我們要尋找的是第一個命令行參數。 因此,單詞的字符串,= ARGV 1。 因此,我們正在尋找的字符串是:ARGV 1。 我們是不是在找一個字都在我們的掃描f。 我們在做什麼用掃描f在字典中的每一個字, 然後,一旦我們有這個詞,我們要使用strcmp來比較他們。 我們要比較的話,我們剛剛讀入 因此不可避免地,我們要結束了做了一堆掃描FS 直到它碰巧的是,掃描f將返回 - 它會返回一個,只要它匹配了一個新詞, 將盡快返回別的東西,因為它並沒有相匹配的單詞。 我們正在閱讀在整個字典中,一行一行的每一個字存儲到變量s。 然後,我們比較單詞與s,並且如果比較== 0, strcmp的發生,使0,如果一個匹配。 所以,如果是0,那麼我們可以打印樓匹配, 或字的字典,或任何你想要打印f。 然後 - 我們不想,F關閉一遍又一遍。 這是我們想要做什麼樣的事情,我們不只是尋找在字典中的字。 因此,我們可以做到這一點,如果我們想看看他們的模式,CISSA,像你說的之前, 如果我們想看看該模式,然後它會失敗的情況下 因為實際上,這不是一個字,但發生在字典中的一個的話,在。 因此,這將匹配這個詞,但這個子集的字是不是這個詞本身。 但是,這不是我們如何使用它,我們正在閱讀的每個字 然後比較這個詞,我們有這個詞。 因此,我們總是比較完整的單詞。 我可以給的最終解決方案。 這是一種接近正確的答案,我想。 [學生意見,不知所云] 哦,我擺脫了這一點嗎?字符,我想我們說的127 - 我忘了什麼最大的是。 我們就做128,現在s是足夠長的時間。 我們並不需要打印出任何東西。 我們也將要關閉的文件,而且應該是正確的答案。 CS50.TV