[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]