[Powered by Google Translate] [第4條] [舒適] 內特 - 哈迪森] [哈佛大學] 這是CS50。[CS50.TV] 好了,歡迎回款。 在本週的部分中,我們要做的幾件事情。 我們將首先回顧一下習題集2, 這是在的凱撒和維瓊內爾問題集。 然後,我們將潛入測驗0個評論 並花一點點的時間,扼要我們所談論的 的講座中,到目前為止,我們還會做的幾個問題 從上一年度的測驗。 這樣,你們有一個很好的方式準備。 首先,我已經啟動了一對夫婦的良好的解決方案, 對於前一個問題集,習題集2,進入這個空間。 如果你們打這個環節, 如果你點擊我的名字,然後單擊“我的第一次修訂 ,你會看到caesar.c的,而這正是我在尋找。 讓我們來談談這真的很快。 這僅僅是一個樣品溶液。 這不一定是最完美的解決方案。 有許多不同的方法來寫這個, 但也有幾件事情,我想強調 我看到了,因為我是分級的,常見的錯誤,我認為 這個解決方案做了很好的處理工作。 第一的是,在頂部具有某種頭註釋。 在第1行至第7,你看到的細節, 究竟是什麼程序在做什麼。 當你寫C代碼的一個很好的標準做法 不管你的程序是包含在一個單一的文件或 無論是拆分到多個文件中是有某種 定向開頭處的註釋。 這也為走出去寫代碼​​,在現實世界中的人。 這是他們會把版權信息。 下面是#包括。 第16行有這樣的定義,我們會回來的,在短短位。 ,然後再次啟動的功能,一旦主開始, 因為這個程序已經都包含在一個單一的功能 第一件事發生這種情況,這是很慣用的,典型的C程序 ,它的命令行參數的是,它會立即檢查 計數參數是argc。 在這裡,我們看到,這個程序需要2個參數完全相同。 記得有,第一個參數的特殊 這是永遠的正在運行的程序的名稱, 的可執行文件的名稱。 因此,這是什麼做的是,它可以防止用戶運行該程序 更多或更少的參數。 究其原因是因為我們要檢查這項權利了 我們實際上無法訪問此argv數組,這裡可靠 直到我們檢查,看它有多大。 我看到了常見的錯誤之一是,人們馬上會去 和抓斗的argv [1]。 他們會抓住關鍵參數的數組,並做一個我檢查它, 然後,他們會做的測試為argc以及接下來的測試, 不是第一個參數是否確實是在相同的時間的整數, 不工作,因為的情況下,沒有提供參數 你會被抓住的參數是不存在,或試圖抓住一個不存在的。 其他大的事情,你應該注意到的是, 你總是希望打印出某種有用的錯誤信息 定位他們的用戶。 我敢肯定,你的所有運行程序,所有的突然崩潰, 你這是荒謬的小對話框彈出,並說 一些可怕的神秘,也許給你一個錯誤的代碼,或類似的東西 那是沒有意義的。 這是你真正想要提供一些有益 並針對用戶,這樣當他們運行它,他們“哦,”面對手掌。 “我知道該怎麼做,我知道如何解決這個問題。” 如果你不打印一條消息,那麼你最終實際 讓用戶去檢查你的源代碼 出了什麼錯。 也有一些時候,你會使用不同的錯誤代碼。 在這裡,我們只是說有一個錯誤, 有一個錯誤,出現了錯誤。 更大的程序,通常被稱為由其他程序的程序, 在不同的情況下,將返回某種特殊的錯誤代碼 以編程方式溝通,​​否則你會 只使用一個好聽的英文消息。 酷。 當我們的工作,你可以看到我們拉的關鍵了。 我們測試一下,看看如果鑰匙和。 我們從用戶得到一個消息。 我們之所以這樣做,在這個do while循環,這是什麼,我們將覆蓋 一點點,但事實證明,如果你輸入控制D 當你在終端上的提示,GetString的 實際上做的是,它發送一個特殊字符 到該程序。 這就是所謂的ELF文件結束符。 在這種情況下,我們的消息字符串,是空的, 所以這不是我們檢查中的問題,為自己的東西。 但是,當我們去,現在我們已經開始談論指針 和動態內存分配在堆上, 檢查是否為空,只要你有一個功能,可能 返回null值是在做的習慣,你會希望得到的東西。 這是在這裡主要是為例證。 但是,當你看到的GetString在未來, 所以從習題集4上,你要記住這一點。 再次,這是不是一個問題,問題3,因為我們沒有遮蓋。 最後,我們得到的這部分,我們得到的主要加密循環, 有一對夫婦的事情在這裡。 首先,我們遍歷整個消息字符串本身。 在這裡,我們已經把strlen的要求的條件, 一些你所指出的,是不是一個偉大的方式去。 事實證明,在這種情況下,它也沒有很大的, 部分原因是因為我們要修改的消息本身的內容 在fo​​r循環中,所以,如果我們有10個字符長的消息, 我們第一次啟動,strlen的循環,將返回什麼呢? 10。 但是,如果我們再修改的消息,說我們修改它的第5個字符, 我們扔在一個\ 0字符在第5位, 在隨後的迭代中的strlen(消息)將不會返回它的所作所為 我們第一次迭代, 但是,它會直接返回5,因為我們扔在了空終止, 定義字符串的長度 由位置,\ 0。 在這種情況下,這是一個偉大的路要走,因為我們修改它。 但是你注意,這實際上是出奇的簡單加密 如果你能得到正確的數學。 所有這一切需要的是檢查是否或不信你看 是大寫還是小寫。 究其原因,我們只需要檢查,我們並不一定要檢查 是α的情況下是因為 如果一個字符是大寫的,或者如果它是小寫 這絕對是一個字母, 因為我們沒有大寫和小寫的數字。 我們做其他的事情,這是一個小技巧 - 我們已經修改了標準的愷撒密碼式 我們給問題集規範。 這裡有什麼不同的是,我們減去 A,大寫的情況下,資本,然後我們增加了大寫字母A 備份結束時。 我知道一些你在你的代碼中已經這樣做了。 有沒有你這樣做您提交的嗎? 你這樣做。你能解釋一下這是什麼做的,Sahb? 通過減去它,因為你做了一個mod後, 你必須把它拿出來,這樣一來你[咳嗽]位置。 然後加入回來後移了過來,你想。 是的,沒錯。 什麼Sahb說的是,當我們要添加 我們的信息和我們的鍵 然後國防部稱,國防部,的NUM_LETTERS, 如果我們不擴大我們的信息到相應的0至25的範圍內,第一, 那麼,我們可能最終得到一個非常奇怪的數字 因為,我們正在尋找時,我們期待在消息[I]的值, 當我們看到我們的純文本消息在第i個字符, 在這65至122的範圍內,是一種價值的地方 通過小寫字母z的大寫字母A的ASCII值的基礎上。 因此,當我們mod這26或由NUM_LETTERS的, 因為那是我們的#define在這裡的右上角, 這給我們一個值,在0至25的範圍內, 我們需要一個方法,然後,備份擴展 並在適當的ASCII範圍。 做到這一點最簡單的方法是,只是規模都記錄下來 到0至25的範圍內,首先, 然後改變一切結束時。 另一個常見的錯誤,我看到了人碰上的是, 實際上,如果你不這樣做縮放馬上 和你添加消息和關鍵,你將它們添加,也就是說, 到一個char變量,問題與 既然這個消息[i]是一個比較大的數量開始 記得至少65,如果它是一個大寫字符 如果你有一個大的關鍵,說,像100, 和你添加那些連成一個符號的字符,你將得到一個溢出。 你會得到一個值,該值大於127, 這是一個char變量可以容納的最大價值。 同樣的,這就是為什麼你會想要做那種事情開始。 有些人得到了解決這種情況下做的,如果其他測試 在這之前,看看它會溢出, 但這種方式得到解決的。 然後在此解決方案中,我們打印出整個字符串在最後。 其他人打印出一個字符的時間。真棒。 在這一點上,你們有任何問題,任何意見? 你喜歡的東西,你不喜歡的東西嗎? 我有一個問題。 也許我錯過了在你的解釋,但如何做這個節目 跳過空格連接的關鍵文本的長度嗎? 這僅僅是愷撒密碼。哦,對不起,是的。 是的,我們會看到這一點。 在愷撒密碼,我們得到了解決,因為 我們只翻個字符。 我們只旋轉他們,如果他們是大寫或小寫。 你們感覺還不錯,對這個嗎? 感覺自由複製這個家,把它, 給你們寫了什麼。 肯定會覺得免費發送關於它的問題。 再次,認識到這裡的目標與您的問題集 不要讓你們來編寫完美的代碼為您的問題集。 這是一個學習的經驗。是啊。 返回的do while循環,如果它等於空, 所以空只是意味著什麼,他們只投中輸入? null是一個特殊的指針的值, 我們使用空當我們想要說 我們有一個指針變量,它指向沒有。 因此,它通常意味著這個變量,這個消息變量 是空的,在這裡,因為我們使用的是CS50特殊的字符串類型, 的CS50的字符串類型是什麼? 你見過它是什麼,當大衛拉了回來罩在演講嗎? 這是一個時髦的,它是一個指針,對不對? 好吧,是的。>>這是一個char *。 因此,我們真的可以取代 在這裡用char *的消息, 等GetString函數,如果它沒有成功地得到一個字符串的用戶, 它不能解析的字符串,在一種情況下,它不能解析的字符串 是,如果用戶鍵入文件結束字符,控制D, 這是不是你通常做的事情,但如果出現這種情況 然後該函數將返回為空值的一種說法 “嘿,我沒有得到一個字符串。” 會發生什麼,如果我們不把消息= 0, 這是一件好事,我們還沒有做呢? 為什麼會是這樣一個問題在這裡嗎? 因為我知道,我們談了一點點的內存洩漏演講。 是啊,讓我們做到這一點,讓我們看看會發生什麼。 羅勒的問題是會發生什麼,如果我們實際上並沒有 此消息= NULL測試? 讓我們來滾動到頂部。 你們可以評論了這一點。 其實,我將它保存在一個修訂。 這將是第三次修訂版。 你必須運行此程序是,你必須點擊齒輪圖標,在這裡, 你就必須給它添加一個參數。 你必須給它的主要論點,因為我們要通過在命令行中的參數。 在這裡,我要去給它的數量3。我喜歡3。 現在放大,運行該程序。 它的運行,編譯,構建。 在這裡,我們走了。它的等待提示。 如果我輸入的東西,喜歡Hello哪裡去了? 哦,我的程序運行時間太長。我jawing太長時間。 在這裡不言而喻。 現在,我輸入你好。 我們看到它加密適當。 現在會發生什麼,如果我們這樣做迅速的GetString返回null? 請記住,我說,我們這樣做,同時按控制D。 在這裡,我會向上滾動。我們將再次運行。 建設中。就這樣吧。 現在,當我打控制D 我說opt/sandbox50/bin/run.sh,這條線分割故障。 你們有沒有看到過嗎? [學生]:為什麼沒有“對不起? [學生]:為什麼在這種情況下,是沒有核心轉儲? 核心轉儲的問題是,為什麼沒有核心轉儲這裡嗎? 問題是有可能,但核心轉儲的文件 被存儲在硬盤驅動器。 在這種情況下,我們已禁用核心轉儲 運行服務器上,所以我們沒有人段斷層 建立核心轉儲噸。 但你可能會得到一個。 核心內存轉儲文件之類的事情,你經常可以禁用, 有時你做的。 分割故障,回答你的問題,羅勒, 是說,在我們試圖訪問一個指針 沒有被設置為指向任何。 視頻的時候Binky試圖記住Binky 去訪問的指針沒有指向什麼? 在這種情況下,我想技術上的指針指向的東西。 它指向空,這在技術上是0, 但是這被定義為在一個段是無法訪問的 你的程序,你會得到一個分割故障 因為你不訪問內存中一個有效的段 像堆段或堆棧段或數據段。 酷。 任何更多的問題,凱撒? 讓我們繼續前進。讓我們來看看在第二次修訂真的很快。 這是維瓊內爾。 在這裡,維瓊內爾 我們將步行通過這個很快,因為再次, 維瓊內爾和凱撒是非常相似的。 頭註釋之前, #define的前避免使用這些神奇的數字。 這種做法的好處是說,我們希望遷移到 不同的字母或類似的東西。 而不是去手動更改所有的26個代碼中的 我們可以改變這27或砸下來 如果我們使用不同的字母表,不同的語言。 同樣,我們已經得到了這個檢查計數參數, 真的是你幾乎可以作為一個模板。 幾乎每一個你寫的程序應該有 如果需要命令行參數的一些序列的線 在開始的時候是這樣的。 這是一個你想要做的第一次完整性測試。 這裡,我們所做的只是我們確信, 關鍵字是有效的,那就是,我們做了第二次檢查。 再次注意,我們分開argc和2。 請注意,在這種情況下,我們需要做的是一件事,而不是 使用我,我們想驗證的整個字符串, 在為了做到這一點,你確實有去逐個字符 在字符串。 有沒有很好的方法來調用一下就可以了 因為即使,例如,一個我將返回0 如果它不能解析一個整數,所以,甚至不工作。 同樣,不錯的消息,告訴用戶究竟發生了什麼事。 那麼在這裡,再次,我們也處理的情況下, 用戶控制三維隨機字符類型。 然後夏洛特有一個問題,我們如何管理跳過空格 在我們的字符串。 這是一種類似我們所做的Myspace程序 我們所做的部分,工作的方式,這 是我們跟踪的數量,我們看到的字母。 當我們走在消息字符串,因為我們逐個字符地走了過來, 我們跟踪的指數的一部分,我們的for循環,然後我們也跟踪 數量的字母,所以非特殊字符,非數字,非空白 我們看到在單獨的變量。 然後,該解決方案修改的關鍵 得到一個實際的的關鍵整數,它確實是在飛行中, 右,然後到實際的消息字符進行加密。 有一些解決方案,是完全 將修改鍵時,關鍵的有效性進行測試。 除,以確保該字符和關鍵字 是按字母順序排列的字符也變成為一個整數 在0至25的範圍內,然後跳過做到這一點後來在for循環。 同樣,你在這裡看到的,這真的是完全一樣的代碼 在這一點上,我們在凱撒。 你這樣做完全一樣的東西,所以真正的關鍵是搞清楚 如何把關鍵字轉換為整數。 有一件事,我們在這裡做的是有點晦澀難懂 是我們重複這句話,我想你可以稱它, 3個獨立的上線58,59和61倍。 有人可以解釋這句話究竟是什麼做的嗎? 訪問的是一個字符,像你說的。 是的,這是聽不見的字符的關鍵字, 所以它的數量,因為你只沿著看到的字母 關鍵字,一旦你已經看到了這封信, 因此,要有效地跳過空格之類的東西。 是的,沒錯。 然後,一旦你已經看到了你剛模的關鍵字空白,所以你搬回左右。 沒錯。這是一個完美的解釋。 凱文說的是,我們要索引關鍵字。 我們希望得到字符的num_letters_seen,如果你願意, ,但如果num_letters_seen超過關鍵字的長度, 到適當的範圍內,我們得到的是我們用mod運算符 有效地環繞。 例如,如在短期內,我們的關鍵詞是臘肉, 和它的5個字母長。 但在這一點上,我們已經看到了6個字母在我們的純文本 和加密。 我們最終將訪問num_letters_seen, 這是模的長度的關鍵字,5,6, ,所以我們會得到1,而我們要做的是,我們將 在這一點上,我們的關鍵字內部訪問的第一個字符。 所有的權利,任何上維瓊內爾的問題 在我們繼續之前嗎? 你們感覺還不錯,對這個嗎? 酷,太棒了。 我想,以確保你們有機會看到代碼 我們認為看起來不錯,有機會向它學習。 這將是最後一次,我們將使用空間的時間是, 我們要轉變目前,,我去cs50.net/lectures的 所以我們可以做一點點的測驗審查。 我認為最好的方式,開始做測驗複習 是來此講座頁,cs50.net/lectures 下一周的標題,所以,如果我在這裡看在第0週, 我看到我們有一個列表的主題,我們討論了在0週。 如果任何這些主題似乎你不熟悉的 你一定要回去和沖刷的講義,並可能 即使撇去通過講座,觀看他們,如果你想要的 這是怎麼回事每個主題的的感覺。 另外,我會說今年的一個很酷的資源,我們已經得到了 是,我們已經創建了這些短褲,如果你看一下在第0週, 我們並沒有覆蓋所有的主題,但我們已經有了相當多的, 一些棘手的,所以再次看著這些短褲 是一個很好的辦法讓你加快速度。 特別是,我要在一個插件為3的底部,因為我做了那些。 但是,如果你掙扎二進制位,十六進制,這樣的東西, 二進制是一個偉大的地方開始。 ASCII是另外一個,這是很好的查看過。 你甚至可以看我在1.5倍的速度太慢了,如果我要去。 由於它的檢討,覺得要做到這一點。 剛開始真的很快,我們要通過一對夫婦的這些測驗的問題 只是通過這些流失。 例如,讓我們來看看,我有問題16在黑板上。 我們有以下計算以二進制, 我們想要顯示的任何工作。 好吧,我想給這一個鏡頭。 你們應該跟隨紙, 我們會做到這一點真的很快。 我們要的二進制執行下列計算。 我有00110010。 我要添加它00110010。 對於數學天才,在家裡, 這是有效地乘以2。 讓我們開始。 我們要遵循相同的加法運算,我們做 當我們添加的十進制數。 真的是這裡唯一的區別是,我們回圈周圍 一旦我們擁有了1 + 1,而不是一旦我們得到10個。 如果我們從右邊開始,真的很快,第一個數字嗎? [學生]:0。>> [內特H.] 0。 大,第二個數字嗎? [學生]:1。 [內特H.]它是一個1? 1 + 1是什麼? [學生]:10。 [內特H.]沒錯,那麼什麼是數字,我寫的正下方加在一起呢? [學生] 1,0,0,然後再進行1。 [內特H.] 0和1,攜帶完全。 接下來一起來,羅勒,該你了。 什麼是第三個呢?>> [羅勒] 1。 內特H.] 1,完善。凱文? [凱文] 0。>> [內特H.] 0,夏洛特? [山貓] 0。>> [內特H.]是啊,我該怎麼辦? [學生]:1。 [內特H.]我該怎麼辦?然後,我攜帶1。 完美,Sahb >> [Sahb]現在你有1個。 [內特H.]我在這裡做什麼? [Sahb],然後在你下一次有1個,因為你結轉1。 內特H.大,所以在這裡我們就可以完成了。 酷。 [學生]:0 + 0 = 0? 0 + 0 = 0。 1 + 1,像你說的,是10個或1,0,而。 10是用詞不當,因為我的10是指10號, 這是我們如何代表它時,我們正在編寫的怪癖。 我們代表數字2,1,0,和10號是略有不同的。 是一種不錯的關於二進制是什麼,真的沒有那麼多的 情況下,你需要學習。 有0 + 0 = 0,0 + 1 = 1, 1 + 1為0,然後再進行1, 然後你可以在這裡看到第三列從右邊 我們有這個1,1,和1。 和1 + 1 + 1是1,則 攜帶其他1。 當你做二進制加法,很簡單。 完整性檢查自己,我做了這些夫婦更 在你走之前,因為這是 或許我們會看到的測驗。 現在,讓我們做下一個。 讓我們做的問題17。 我們將以下二進制數轉換為十進制。 我有10100111001。 請記住,在我做的二進制視頻 我走過一對夫婦的例子,我展示了如何 一切正常,當你這樣做是在十進制。 當你在工作中的十進制表示,我認為,我們 這一點在我們的生活中,流利的 這是很容易掩飾它是如何工作的機制。 但是,要做到快速回顧一下,如果我有137 這實際上意味著再次,這是在十進制表示 十進制的137,我有1×100 + 3×10 + 7×1。 這一切都停留在屏幕上。 然後,如果你看看這些數字就在這裡, 100,10,1,你看,它們實際上是一切權力的10。 我有10 2,10 1,和10到零。 我們有一個相類似的事情在二進制, 除了我們的基地,我們把它稱為是2,而不是10。 這些10秒,我在這裡寫下的底部, 這10 2,10 1,10到零,10是我們的基地, 和指數,0,1,或2, 是隱含的數量,我們寫的數字的位置。 1,如果我們看一下吧,這是在第二的位置。 圖3是在第一位置,和圖7是在第0個位置。 這就是我們得到的各種指數,以下為我們的基地。 在此我們將實際,你知道嗎? 我們會盡我撤消“按鈕去了? 就這樣吧。 我喜歡這撤消事情。 在此,我認為至少對我來說 最簡單的方法開始將二進制數轉換 或十六進制數,其中的鹼是16 而不是10或2繼續前進,寫出來的 我在上面的二進制數中的數字的基準和指數。 如果我們開始從左至右再次, 這是一種違反直覺的, 我會重新變回黑色在這裡,我們有2至第0個位置, 然後我們有2 1,2 2, 然後2 3,2 4,2 5,6, 7,8,9和10。 我已經寫了這些數字是所有的指數。 我只寫了基地在第3的空間。 在這一點上,我要繼續前進,我要刪除 的東西,我們在小數,如果那也沒關係。 你都明白了。 你看網上我敢肯定,將能夠倒帶我,如果你想。 切換回筆。 現在,我們可以做的,如果你們不完全取決於你的權力,以加快2, 這是很酷。 它發生。我明白了。 我曾經有一個面試時,有人告訴我,我應該知道的一切權力2 通過2的30。 這不是我的工作。 總之,你們可以繼續在這裡做數學題, 但與二進制文件,它沒有真正意義的, 它也不有意義的十進制或十六進制, 做數學題,你在哪裡有零。 你可以看到我有0在這裡,這裡的0,0在這裡,在這裡,在這裡,在這裡。 為什麼它可能沒有任何意義,做實際的數學 該位置計算出相應的功率為2? 沒錯,像夏洛特說,這將是0。 還不如節省自己的時間,如果計算2的冪是不是你的強項。 在這種情況下,我們只需要計算它的0-2? [學生]:1。 [內特H.] 1,2到3是-? [學生] >> [內特H.] 8。 2到4? [學生]:2。對不起,1。 [內特H.] 2至4是16的,沒錯。 2到5,凱文?>> 32。 [內特H.] 32,2到8? [學生]:32×8,256。 [內特H.]完美。 和2至10嗎? [學生] 1024。 [內特H.]是啊,1024。 一旦我們得到這些數字,我們可以總結他們所有。 這是它做的幾件事情是非常重要的。 一個緩慢,並檢查您的工作。 在年底這個數字,你可以告訴大家有一個1, 我的結果,所以我一定要得到一個奇數, 因為所有其他的人都將是偶數 因為,這是一個二進制數。 其他的事情是,如果你得到這一點在測試 你寫的這一步 和你的時間不多了 看的點的數量,此問題是值得的。 這個問題,你可以看到,如果我迅速翻轉回我的筆記本電腦真的, 這個問題是值得2分,所以這不是那種此外 你應當經歷的,如果你真的時間緊迫。 但我們會切換到iPad上,我們將通過它真的很快。 我喜歡做的小數字第一 因為我發現,更容易。 我喜歡32和8,因為他們走在一起很容易,我們得到50。 16和1得到17。 在那裡,我們得到57, 然後,我們可以做的其餘部分,所以我們可以做的57,156。 來吧。 人,好了,讓我們來看看。 我們有57,256和1024。 在這一點上,我寧願去。 我不知道。我清楚地讀了。 7,6,和4中,您可以在17。 1,5,5,2,13。 然後,我們得到了3,然後我們得到1。 1337年。 復活節彩蛋,任何人? 任何人都承認這個數字嗎? 克里斯識別數字。是什麼意思,克里斯? [克里斯] LEET。 LEET,所以如果你看看這個,它看起來像利特。 黑客的東西。注意在期中考試或測驗,而這樣的東西。 如果你看到這樣的東西,你想知道“咦” 這可能意味著什麼。 我不知道。大衛喜歡它。 這是一個好辦法,完整性檢查。 像好吧,我可以看看會發生什麼。 這是週0/Week東西。 如果我們切換到我們的筆記本電腦,現在, 縮小,和一些其他的事情。 有ASCII,這是我們已經做了很多的問題集。 A.資本這個概念什麼是真的嗎? 知道它的十進制整數。 65是它被映射到ASCII表中, 因此,這是電腦如何寫, 這就是我們已經越來越遠,其實寫 字符大寫字母A和字符小寫的a 在一些你一直在做的這些解決方案和習題集。 一對夫婦的其他東西。 我們有報表,布爾表達式,條件,循環,變量和線程。 這些都似乎最有意義嗎? 這個術語有時是有點時髦的。 我喜歡的一份聲明中認為,大部分的東西,以一個分號結束。 報表如x = 7,設置一個變量, 想必稱為x = 7。 據推測x是一個類型,可以存儲數字7, 因此它可能是一個int或float或短或一個字符, 類似的東西。 布爾表達式是使用這些雙等號 爆炸等於或不等於,小於,大於, 小於或等於,所有這樣的東西。 條件是if else語句。 我會記住,你不能有別的沒有相應的如果。 同樣,你可以沒有其他,如果沒有相應的如果。 循環,召回的3種循環已經被錘打成 特別是最近幾個部分和習題集。 使用,而當你獲取用戶輸入, 使用whil​​e循環,直到特定的條件是真實的, 然後利用這些循環,如果你需要的 你知道循環迭代目前是我想想。 或者,如果你做了我想要做的事情在一個字符串中的每個字符, 我想要做的事,該元素在數組中的每個元素。 線程和事件。 這些我們還沒有涉及到明確在C中, 但是請記住這個從頭開始。 這是概念具有不同的腳本。 廣播事件,這也是這個概念。 有些人不使用廣播最初在自己的項目, 這是很酷的, 但這些都被稱為並發兩種不同的方式處理這個更大的問題, 這是你如何讓程序執行 或看似同時執行? 不同的任務運行,而其他任務同時運行。 這是你的操作系統是如何工作的。 這就是為什麼,即使,例如, 我有我的瀏覽器中運行,我也可以將Spotify的,播放一首歌曲。 這是一個概念性的東西了解。 我想看一看線程的短 如果您想了解更多關於。 讓我們來看看,我認為有可能是 其中的一個一個問題,在這個問題上。 同樣,我認為是不是線程和事件,我們將介紹在C 只是因為它的顯著更多的困難比在Scratch。 你不應該擔心它有,但絕對明白的概念, 明白發生了什麼事情。 在我們繼續之前,任何問題上0週材料? 每個人都感覺還不錯呢? 了解變量,什麼是變量? 移動。每週1次。 一對夫婦的事情,在這裡,沒有覆蓋 在測驗審查必要的,也有更多的概念性的東西,去思考。 首先是這個概念的源代碼,編譯代碼和目標代碼是什麼。 任何人?羅勒。 是對象的代碼,我的意思是源代碼是什麼,你把鐺, 代碼和目標代碼是什麼鐺放出來,讓您的計算機可以讀取的程序。 沒錯。 源代碼是C代碼,您輸入。 目標代碼是你得到了什麼鐺。 這是“0”和“1,二進制格式。 那會發生什麼情況是,當你有一大堆的目標文件, 說你要編譯一個項目或程序使用多個源代碼文件, 按照慣例給定的文件擴展名。 那為什麼我們caesar.c,vigenère.c。 如果你正在編寫Java程序,你給他們的。java擴展名。 Python程序。py擴展名通常。 一旦你有多個c文件,編譯它們。 鐺吐出了這一切二進制垃圾。 然後,因為你只需要1個程序 你有鏈接器鏈接所有這些對象文件一起 為1可執行文件。 這也是發生了什麼,當你使用的CS50庫,例如。 CS50庫既h頭文件。 您閱讀,#includecs50.h。 那麼它也是一個特殊的二進制庫文件 被編譯的,是“0”和“1, 和-L標誌,因此,如果我們回到我們的空間,我們期待真的很快 在這裡發生了什麼事情,當我們看我們的鐺命令, 我們得到的是在這裡,這是我們的源代碼文件。 這是一群編譯器的標誌。 然後在最後,這些在-l標誌鏈接 實際的二進制文件,這2個庫,的CS50庫,然後數學庫。 了解每種類型的文件的目的 在編譯過程中,你要的東西能夠 至少給一個高層次的概述。 源代碼的原因。目標代碼出來。 目標代碼文件鏈接在一起,你會得到一個美麗的,可執行文件。 酷。 這也是在那裡你可以得到的錯誤在多點 在編譯過程中。 這是在哪裡,例如,如果你把這個連接的標誌, CS50標誌,你忽略它在空間,或當你運行你的代碼, 這是在那裡你會得到一個錯誤的鏈接階段, 和鏈接器會說:“嘿,你調用一個函數的GetString 這是在的CS50庫。“ “你告訴我是在CS50庫,我無法找到它的代碼。” 這就是你有鏈接,這就是獨立的 從一個編譯錯誤,因為編譯器的語法和諸如此類的東西。 知道發生了什麼事情的時候,這是很好的。 其他的事情了解。 我會說,你一定要來看看短的類型轉換通過約旦 了解整數是什麼引擎蓋下, 引擎蓋下的是什麼字符。 當我們談論的ASCII和我們其實看的ASCII表, 什麼做的是給了我們一個引擎蓋下的樣子 如何在計算機實際上代表了資本和數字7 一個逗號和問號。 電腦還具有特殊的方式來表示 為一個整數的數目7。 它有一個特殊的方式來表示一個浮點數7號, 有很大的不同。 類型轉換是如何告訴計算機“嘿,我想你轉換 從一個表示的另一種表示。“ 我們為什麼不來看看在那。 我也來看看在短庫和短期的編譯器上。 那些談論編譯的過程中, 圖書館是什麼,並去了其中的一些問題,你可能會問。 上一周1材料? 在這裡,令人望而生畏你想覆蓋的任何話題? 我企圖炸毀通過這些早期的主題,因此,我們可以得到 指針和做一點點的遞歸。 思考? 凡是有哪些? 一些巧克力可能的時間? 你們正在通過它。 我要在我的咖啡喝著。 第2週。 良好的通話,良好的通話。 在第2週,我們談了一點點更多的功能。 在最初的幾個問題集,我們並沒有真正寫在所有的任何功能 以外的功能嗎? [學生]主。>>主,準確。 所以,我們看到了不同的服飾,主要穿。 它不帶任何參數, 我們只說在括號之間的空白, 然後有另外一個我們要採取命令行參數, 正如我們所看到的,這就是你有int argc和字符串argv數組 現在我們實際上已經暴露字符串的char *,它是 我們要開始寫為char * argv和括號。 習題集3,你們看到了一堆的功能, 實施了一堆的功能,畫畫,看後,爭奪戰。 的原型都寫在你身邊。 我想在這裡談論與功能真的很快 有3個部分,只要你寫一個函數。 你必須指定返回類型的函數。 你必須指定一個函數名稱,然後你必須指定 參數列表參數列表。 例如,如果我寫一個函數來匯總了一堆的整數 然後回到我這裡來的總和,這將是我的返回類型 如果我想總結的整數,然後返回的總和嗎? 然後的函數名。 如果我繼續寫在綠色,這部分是返回類型。 這部分的名稱。 然後在括號之間的 是我給的參數, 通常縮寫為args,有時也被稱為參數的參數的。 如果你有一個,您只需指定一個。 如果您有多個,用逗號分開,每一個。 為每一個參數,你給它兩件事情是凱文? [凱文]你有給類型及名稱。 然後的名稱的名稱是您要使用的名稱 的金額範圍內功能是指這樣的說法, 在函數內,您目前正在編寫的。 您不必例如,如果我要總結, 也就是說,一個數組的整數 - 我們將做的int數組, 我給自己一些花括號 然後,當我傳遞一個數組的總和功能 我把它的參數列表中的第一個位置。 但傳遞的數組,我不必有名字改編。 到達將是我指的是身體內的功能,參數。 其他的事情,我們需要考慮到, ,這是從功能略有不同,但我認為這是一個很重要的一點, 是,在C,當我在寫一個這樣的函數 我怎麼知道這個數組有多少元素? 這是有點一個棘手的問題。 我們談到這一點在上週的部分。 我怎麼知道在C數組裡面的元​​素的數量? 有沒有辦法呢? 事實證明,有沒有辦法知道。 你必須通過它分別。 有一個技巧,你可以做 如果你在相同的陣列功能,其中已申報, 你正在使用的堆棧陣列。 但是,這只是工作,如果你在相同的功能。 一旦你將數組傳遞給另一個函數,或者,如果你已經聲明數組 你把該數組在堆上,你使用的malloc  和這樣的東西,那麼所有的賭注都關閉。 然後,你必須通過左右 一個特殊的參數或其他參數 告訴你有多大的數組。 在這種情況下,對不起,這是怎麼回事了屏幕在這裡,我想使用一個逗號,我 我會通過另一種說法  ,詮釋萊恩的長度。 有一件事可能遇到的測驗 要求你寫或執行特定的功能叫什麼。 如果我們不給你的原型,所以這整個事情在這裡, 這全亂了調用該函數的聲明或函數原型, 這是一個的第一件事情,你會想要確定下來,如果它不給 你馬上測驗。 我已經學會的技巧是: 說,我們給你一個函數的原型,和我們說,“嘿,你得把它寫。” 在大括號中,你必須在測驗 如果您發現有一個返回類型,你注意到的返回類型 是無效,這意味著該函數不返回任何東西以外的東西, 然後一件事,你一定要做到的是寫 某種類型的return語句在最後的功能。 返回,在這種情況下,我們會把一個空白,因為我們要填補的空白。 但是,這可以讓你想以正確的方式,我要如何解決這個問題呢? 它提醒你,你要返回一個值 該函數的調用者。 是啊。>> [學生]:風格當我們編寫代碼的測驗? 如縮進和這樣的東西嗎?>> [學生]:是的。 不,沒有那麼多。 我想了很多,這是我們的日子會澄清的測驗, 但通常擔心的#include,這樣的東西,它是一種外。 [學生]:你需要回應你的手寫代碼? 你需要回應你的手寫代碼嗎? 談到始終是一件好事,如果你擔心部分信貸 或者你想傳達你的意圖,平地機。 但是,我再次將澄清的測驗和測驗的一天, 但我不相信你會被要求寫評論,沒有。 通常不會,但它絕對是諸如此類的事情, 你可以傳達你的意圖,想:“嘿,這是我要去的地方用它。” 有時,可以幫助部分信貸。 酷。 羅勒。 [羅勒]聲明說,INT郎之間的區別是什麼 在與聲明一個變量,在函數中的參數或參數? 哇,咖啡去了氣管。 [羅勒]喜歡的事情,我們希望把在參數。 是啊,這是一個很大的問題。 你會選擇什麼樣的事情,你要投入的參數 對你應該做的事裡面的功能是什麼? 在這種情況下,我們這兩個參數 因為他們的東西,不管是誰去使用SUM函數 需要指定這些事情。 和功能,像我們談到了,有沒有辦法知道 有多大的數組是得到它的調用者或任何人使用SUM函數。 它沒有辦法知道這個數組有多大。 我們之所以在這裡通過這個長度作為參數 是因為在這個時候,我們基本上是告訴來電者的功能, 誰是將要使用SUM函數,“嘿,不僅你得給我們一個數組 整數,你也必須告訴我們有多大的數組,你已經給了我們。“ [羅勒這些都將是命令行參數? 沒有,這些都是實實在在的,你會傳遞給函數的參數。 讓我在這裡做了新的一頁。 [羅勒]喜歡的名字將傳遞 [內特H.]如果我有詮釋的主要(無效), 我要把我返回0,在這裡的底部, 並說我要打電話功能的總和。 我想說的詮釋x = SUM(); 使用SUM函數,我想總結的,我必須要通過在陣列 和陣列的長度,所以這是 假設我有一個整型數組, 說我有numbaz [] = 1,2,3, 種使用砍死語法正確, 然後我會做什麼,總之,我希望通過 兩個numbaz和3號 告訴SUM函數“好了,在這裡我要你總結的陣列。” “這是它的大小。” 這是否有意義嗎?回答你的問題嗎? 在許多方面,它平行的就是我們正在做的主要 當我們有命令行參數。 像愷撒密碼的程序,例如,需要 命令行參數將無法做任何事情。 不知道如何進行加密,如果你沒有告訴它使用什麼鍵 或者,如果你沒有告訴它你想加密的字符串。 提示輸入,這是我們已經有2個不同的機制 用於輸入來自用戶的,在來自用戶的信息採取。 對於問題1,我們看到這個調用getInt,GetString的,GetFloat的方式 提示輸入,這就是所謂的使用標準輸入流。 這是稍有不同。 這件事情,你可以做一次,而不是 當你調用程序,當您啟動程序的運行。 所有的命令行參數指定當您啟動程序運行。 我們已經將兩個。 當我們使用參數的函數,這是非常類似的命令行參數主要。 這是當你調用這個函數,你需要告訴它 它究竟是什麼的需要,以執行其任務。 另一個好處看,我就讓你看看它在你的空餘時間, 它覆蓋在測驗是這個概念的範圍 與全局變量和局部變量。 千萬要注意。 現在,我們要對這個其他的東西, 第3週,我們開始談到的搜索和排序。 檢索和排序,CS50,至少在 非常多介紹一些計算機科學的理論部分。 的問題的搜索,排序的問題 是大的,規範的問題。 你怎麼找到的數十億美元的整數數組中的一個特定的數字嗎? 你如何找到一個特別的名字裡面的電話簿 是存儲在您的筆記本電腦嗎? 因此,我們提出這個概念的漸近運行時間 要真正量化多久,這些問題是如何努力, 他們需要多長時間來解決。 我相信,在2011年的測驗有一個問題,我認為這是值得的 覆蓋速度非常快,這是一個問題12。 哦,不,這是歐米茄。 在這裡,我們談論以最快的速度運行時 對於一個特定的算法,然後最慢的可能的運行時間。 歐米茄(Omega)和O這是真的只是快捷方式。 他們的符號的快捷鍵說 如何快速在最好的情況下,我們的算法來看, 如何在最壞的情況下緩慢將我們的算法運行? 讓我們做一對夫婦這些,而這些,也包括了 在短期漸近符號,這是我極力推薦的。 傑克遜做了很好的工作。 二進制搜索,我們談論二進制搜索算法, 我們通常談論它,其大澳 大O是什麼? 什麼是運行時的二進制搜索速度最慢的可能嗎? [學生] N²? 關閉,我想類似的。 這是快了很多。 [學生]:二進制嗎?是的,二進制搜索。 [學生]:這是日誌n。 登錄n,所以日誌N意味著什麼? 它一半在每次迭代。 沒錯,所以在最慢的情況下, 說,如果你有一個排序的數組 你正在尋找一百萬整數, 是第一個元素的數組或數組中的最後一個元素。 請記住,二進制搜索算法的工作原理是在中間的元素, 如果是這樣的比賽,你要尋找的。 如果是,那麼偉大,你發現了它。 在最好的情況下,二進制搜索運行的速度有多快? [學生] 1。 1,這是恆定的時間,大O 1。是啊。 [學生]:我有一個問題。當你說的n登錄,您的意思是與基地2,對不對? 是的,所以其他的事情。 我們說為log N,我想,當我在高中 我一直認為日誌基數為10。 是啊,這樣的話,2為底通常我們使用的是什麼。 再次,要回二進制搜索,如果你正在尋找無論是 在最後元素或元素在開始的時候, 因為你開始在中間,然後丟棄 取其一半不符合標準,你要尋找的, 你去下一半,下一半,下半。 如果我在尋找萬整數數組中的最大元素 在100萬次的日誌,我要減半 之前,我終於測試,看看,我要找的元素 是在最大或指數最高的陣列中, 將日誌的n,記錄的100萬次。 冒泡排序。 你們是否還記得冒泡排序算法? 凱文,你能不能給我一個快速回顧中,冒泡排序算法發生了什麼事嗎? [凱文],基本上它通過在列表中的一切。 它著眼於前兩個。 如果第一個比第二個它掉期將是更大的。 然後比較第二和第三,同樣的事情,掉期, 第三和第四,一路下跌。 更大的數字會跟進的。 然而,許多循環後,你就大功告成了。 沒錯,凱文說的是,我們會看更大的數字 泡沫結束的數組。 例如,你不介意走我們通過這個例子,如果這是我們的數組? [凱文]你會需要2個和3個。 3大於2,所以你換。 內特H.]右,所以我們交換這些,和這樣我們就得到2,3,6,4,和9。 [凱文]那麼你就比較3和6。 3小於6,所以你離開他們, 6和4,你會交換他們,因為4小於6。 [內特H.]對,所以我得到2,3,4,6,9。 [凱文]和9大於6,所以你離開它。 你通過它回去了。 [內特H.]在這一點上我做了嗎?凱文號 我為什麼要在這一點上沒有這樣做呢? 因為它看起來像我的數組進行排序。我看著它。 [凱文]再經歷一遍,確保沒有更多的掉期 才可以完全停止。 沒錯,所以你仍然需要繼續通過並確保不存在交換 在這一點上,你可以使。 這真的只是幸運,就像你說的,我們結束了 只有1通過我們排序。 但要做到這在一般情況下,我們實際上要做到這一點,一遍又一遍。 而事實上,這是一個可能的情況下最好的例子, 像我們所看到的問題。 我們看到,最好的可能的情況下為N。 我們經歷了陣列1次。 最壞的情況下,該算法是什麼? [凱文] N“。 而且,看起來像什麼?數組的樣子,取n²時間嗎? [凱文] [聽不清]排序。 沒錯,所以如果我有數組9,7,6,5,2, 第9泡沫一路。 1次迭代後,我們就會有7,6,5,2,9。 7將泡漲,6,5,2,7,9,等等等等。 我們不得不去整個數組n次, 實際上,你可以得到比這更精確的 因為一旦我們已經提出9一路到最後可能的位置 我們知道,我們永遠都不會擁有再次反對該元素比較。 一旦我們開始冒泡7 我們知道,我們可以停止後,7是正​​確的前9 因為我們已經比較9。 如果你這樣做一個聰明的方式,它並不是真正的,我想,那麼多的時間。 你不是要比較所有可能的[聽不清]組合 每一次你通過每一次迭代。 但儘管如此,當我們談論這個上限,我們說, 您正在尋找在n²通過比較所有方式。 讓我們回去了,因為我們已經開始得到一點點的時間短 我會說,你一定要通過此表,其餘的, 填補了這一切。 想想例子。想想具體的例子。 這是非常方便的和做的。 畫出來。 這是排序的表,當你通過在計算機科學 你應該開始知道這些由心。 這是你在接受採訪時的各種問題。 這些都是各種各樣的東西,是很好的了解, 想想那些邊緣的情況下,真正搞清楚如何思考 知道冒泡排序可能出現的最壞的陣列的 進行排序的,是一個以相反的順序。 指針。讓我們來談談關於指針一點點。 在過去的幾年時間裡,我們這裡有 我知道這是與文件I / O,是相當新的東西。 當我們談論指針的原因,我們要談論的指針 是因為,當我們工作在C 我們真的是在一個相當低的水平相比,大多數現代編程語言。 我們實際上能夠操縱內存中的變量, 他們實際上是在我們的RAM。 一旦你到了操作系統類,你會看到 ,,,種一個抽象的概念。 這是事實並非如此。 我們的隱藏這些細節,我們已經得到了虛擬內存。 但現在,你可以假設你有一個程序時, 例如,當您開始您的愷撒密碼程序 我會切換回我的iPad真的很快 在一開始你的程序,如果你有,說, 4 GB的RAM您的筆記本電腦, 你得到拋開這一塊,我們把它稱為RAM。 在一個地方,我們要調用0開始, 它結束的地方,我們會打電話給4千兆字節。 我真的可以不寫。人,被黑客攻擊。 當你的程序執行 操作系統瓜分RAM, 它規定了不同的細分為不同的部分,你的程序的居住環境。 到這裡,這方面是怎麼樣的無人區。 當你去了稍遠一點這裡 你已經得到了實際的地方 你的程序的代碼生活。 實際的二進制代碼,可執行文件實際上被加載到內​​存中 當你運行一個程序,它住在代碼段。 你的程序執行的處理器看起來在這個代碼段 要弄清楚什麼是下一個指令? 我需要執行的下一行代碼是什麼? 還有一個數據段,這是這些字符串常量 獲取存儲,你一直在使用。 再遠些了這個地方稱為堆。 我們在那裡存取記憶體使用malloc, 然後向你的程序的最頂端 有堆棧, 而這也正是我們一直在玩的最開始。 這是沒有規模或任何東西。 這是很多非常依賴於機器, 依賴於操作系統,但是這是比較如何得到分塊。 當你運行一個程序,你聲明一個變量名為x- 我要畫一個框下方,這將是RAM以及。 我去看看。 我們將繪製鋸齒線來表示,這僅僅是一小部分的RAM 不是所有的為我們繪製在上面。 如果我聲明了一個整數變量x, 其實我得到的是一個映射 我的程序被存儲在符號表中的 連接這個區域的記憶,我畫的名字x 在這裡之間的豎線。 如果我有一個在我的計劃,說X = 7的代碼行 處理器知道“哦,好吧,我知道在這個位置在內存中的x生活。” “我要繼續前進,並寫了7。” 它是如何知道什麼位置,這是在內存中嗎? 那麼,這一切都在編譯時完成。 編譯器負責分配中的每一個變量都去 創建一個特殊的映射,或者更確切地說,點與點之間 一個符號,到哪裡去,一個變量的名稱 到哪裡去住在內存中。 但事實證明,我們實際上可以訪問它在我們的程序中。 這得到重要的,當我們開始談論一些數據結構, 這是一個概念,我們將在後​​面介紹。 但是現在,你可以知道的是,我可以創造一個指針,指向這個位置,X。 例如,我可以創建一個指針變量。 當我們創建一個指針變量,我們使用星符號。 在這種情況下,說,我要創建一個指向整數的指針。 這是一個類型,就像任何其他。 我們給它一個變量,如Y, 然後,我們將它的地址,地址。 在這種情況下,我們可以設置y以指向到x 通過x的地址,這是我們做這個符號, 然後我們設置y來指向它。 這基本上是不是,如果我們看一下我們的RAM 這將創建一個獨立的變量。 這將調用它的Ÿ, 而當這行代碼執行 它實際上是要創建一個小的指針,我們通常畫一個箭頭, 點為x和y置。 是。 [學生]:如果x是一個指針,你會做 詮釋* Y = X代替的符號? 是。 如果x是一個指針,然後就可以設置兩個指針彼此相等, 在這種情況下,y的設置將不會為x, 但它會指向到任何x被指向。 不幸的是,我們沒有時間了。 我想說在這一點上,我們可以談論這個脫機, 但我要說的開始工作,通過這個問題,#14。 你可以看到已經有一點點充滿在你這裡。 您可以看到,當我們聲明了兩個指針,* X * Y, 注意,指向的變量*的東西,是去年。 原來,這是類似的,以我們正在做的這一年。 不要緊,你寫的*當你聲明的指針。 但是,我們已經寫了旁邊的類型* 因為這使得它很清楚,你聲明一個指針變量。 你可以看到,申報2個三分球,為我們提供了2盒。 在這裡,當我們設置x等於對malloc 這是什麼說的預留內存在堆中。 這個小盒子在這裡,這個圈子裡,位於堆。 X是指向它。 需要注意的是Y還沒有指向任何東西。 要獲得內存來存儲數字42到x 我們將使用什麼樣的符號? [學生] * X = 42。 沒錯,* X = 42。 這意味著按照箭頭,並在那裡罰42。 在這裡我們設置y和x有y指向為x。 同樣,這就像凱文說什麼,我們設y等於x。 Y不指向為x。 相反,它指向x是指向以及。 然後終於在這最後一箱有2種可能,我們可以做的事情。 其中之一是,我們可以說X = 13。 另一件事是,我們可以說,亞歷克斯,你知道,我們可以在這裡做什麼? 你可以說* X = 13 [學生]:你可以說詮釋什麼。 內特H.]如果這被稱為一個int變量,我們能做到這一點。 我們還可以說* Y = 13,因為它們都指向同一個地方, 這樣我們就可以使用任一變量到那裡。 是啊。>> [學生]:會是什麼樣子,如果我們只說INT x是13嗎? 這將宣告一個新的變量x,它是行不通的。 我們希望有一個碰撞,因為我們聲明x是一個指針。 [學生]:如果我們只是有這樣的聲明本身會是什麼樣子的圓嗎? 如果我們有X = 13,那麼我們就會有一個盒子,而不是箭頭 開箱即用的,我們得出它只是一個13。 [學生]:在“名稱”框中。好吧。 感謝您的收看,祝你好運測驗0。 [CS50.TV]