[Powered by Google Translate] DAVID J.馬蘭:好吧,這是CS50,這是 本週二開始。 謝謝。 讓我們從這裡開始,一個電話。 我要撥打617-BUG-CS50。 CS50:這是CS50。 穿梭男孩,按1。 在開始之前,請按9。 DAVID J.馬蘭:所以他說,班車男孩,請按1。 因此,我們準備按1。 CS50:您的起源是什麼? 對於四,請按1。 馬瑟,請按2。 斯頓,請按3。 拉蒙特,請按4。 紀念品館,請按5。 在開始之前,請按0。 DAVID J.馬蘭:我們會按四。 CS50:下穿梭離開這一刻,在1:10 PM, 然後在1:20 PM,1:30 PM,1:40 PM。 這是CS50。 DAVID J.馬蘭:這是CS50的聲音。 這是一個例子的最終的項目, 例如,你可以咬向 學期結束的時候。 比如,,shuttleboy.cs50.net存在 - 其實一個項目,我第一次寫後,CS51 回來時,我是一名大學生。 這裡的靈感當年,他們所有的 印刷穿梭巴士時間表,以及有沒有 尋找的東西了網上的概念。 所以,我的鴿子在一個週末,通過澆 印刷的時間表,並把它移植到一個計算機程序。 當時,所述計算機程序發生了要寫入 在C,你居然跑了它在輸入班車男孩 閃爍提示,如我們已經做了迄今。 但這些年來,它演變成瞬間 消息槐樹。 最近到本網站的發展,成 基於短信的工具,以及這個基於語音的工具。 這是暗示在各種各樣的事情,你可以 學期結束為自己做的。 例如,在那裡,發生班車男孩的短信版 操作如下。 ,你的手機上,如果你發送一條短信到41411 然後發送的的特殊符號sboy,請為班車男孩, 其次是由A和B,其中A是一個原點和B是一個 目的地 - 例如,博伊爾斯頓空間四 - 你應該在幾秒鐘內是一個文本 從航天飛機男孩的消息告訴你什麼時候 未來幾年的班車,從A點到該 B點。 這是一個更普遍的例子,被稱為什麼 使用API​​。 因此,舉例來說,這裡只是shuttleboy.cs50.net的, 實際的基於Web的化身。 但強調這一點和其他應用程序的數據,CS50 已開發的所有暴露的形式在這裡給大家 的API,應用程序編程接口。 而這僅僅是一種奇特的方式,人們喜歡說,我們對 互聯網和其他人花了一些時間來創建 為了搶從我們的數據和軟件,您可以使用 然後在上面建立自己的應用程序 該數據集。 因此,舉例來說,這班車男孩API頁面在這裡, 恰好是在CS50手冊,基本上文件 你可以去CS50服務器的數據要求。 例如,如果你熟悉CSV文件,逗號 分隔的值,這些都只是形式的快速和骯髒的 類似Excel的文件。 所以,你可以問班車上所有的男孩的所有數據 房子和他們的GPS坐標,你會得到 回來了,從本質上講,一個類似電子表格的, 然後,你可以閱讀到自己的程序,然後 產生的結果,就像班車男孩本身 發生做的事情。 對於那些比較熟悉的,更現代的數據表示 包括JSON,JavaScript對象表示法。 東西會回來給你走向 學期結束的時候。 但是,這只是其中的幾個CS50自己的API。 而令人興奮的事情,現在,這些天來,Facebook和 Twitter和谷歌,幾乎每一個受歡迎的網站了 有某種形式的API,這意味著如果你讀了 在他們的網站上的文檔,你註冊一個 帳戶,您就可以開始編寫軟件之上 有任何工具或數據公司提供的。 因此,我們自己的教學研究員幾年 寫了Mac版本的。 因此,在左上角的鏈接標題為“蘋果在這裡,你其實可以 下載你自己的Mac上運行的Mac OS部件的做 同樣的事情。 因此,它是所有有關的數據集上,像這樣的。 但更向本學期結束。 所以我們來看看真正的快速的一個錯誤,只是一種獲得 事情回暖的今天,與回想起一些 事情,我們看到在上週。 特別是,讓我去拉起來,說, 這個例子在這裡。 Buggy1.c,這是本課程的網站上,如果您想 喜歡下載並戳在自己周圍。 但是,讓我們在這裡的放大在這相當短節目, 超快速的回顧一下一些基本構建塊, 我們真的要開始考慮是理所當然的。 因此,藍色的東西,在第1行至第9行,只是 壘球的問題。 所以,這些都只是意見。 他們有沒有功能上的意義。 但他們在這個意義上,他們的意見筆記 我的人,做自己的事情,所以在演講後 講座中,我實際上可以記得這是什麼程序 沒有讀通過一行行 在我的腦海裡重新創建歷史。 此外,如果有人喜歡我把這個程序 你,這是更清晰的你,因為這樣的意見, 是什麼程序實際上做,或至少是 程序應該做的事情。 無論它是正確的,是另一回事。 現在,在C,多行註釋,回想一下,上線 這裡是神奇的符號,/ *。 這意味著在這裡來了一個註釋的開始。 並沒有什麼別的事情,直到你到達終點終止, 這是* /,相反。 因此,事實上,我這裡有80個,一些奇怪的恆星從 從左到右依次是真的只是一個審美的細節。 它沒有功能上的意義。 第11行嗎? 通俗地說是什麼? 那是什麼? 聽眾:包括標準。 DAVID J.馬蘭:OK,好。 因此,它包括stdio.h中的庫。 那麼,是什麼意思呢? 那麼,在這個文件中,stdio.h中,一大堆的 函數聲明 - 那是別人寫的代碼。 聲明一個函數,在一個完美的例子, stdio.h中 - 現在最喜歡的? 因此我們知道printf,最常用的方法之一,使用,當然 在初期,該庫是存在的。 如果我排除該行的代碼,鐺大喊 在我一些有關使用未聲明的符號。 東西未申報的可能是關鍵字,因為 我們沒有告訴編譯器輸出看起來 喜歡,除非我們有該行。 而更多的地球,真的,該行說的是 打開該文件,stdio.h中,無論它是在服務器上的 硬盤驅動器或設備的硬盤驅動器,複製粘貼 到我的文件,沒有我的 做手工。 現在,一旦我們在這裡為主,不久我們將開始 梳理int和空洞。 但現在,讓我們來看看在三線 在15到17。 這裡,我要求車。 7號線在我的評論說:“如果打印10 星號,但沒有。“為什麼這不是打印的,其實, 10個這樣的明星嗎? 觀眾:[聽不清]。 DAVID J.馬蘭:沒錯。 所以,請注意,我們從0開始計數。 這實際上是一個編程慣例 計算機科學,更普遍,開始計數 從0而不是1。 這真的只是來自於事實,即 例如,當我們有八人在舞台上時, 沒有人舉手,他們 所有有效的零。 因此,它只是種一台計算機公約, 因此,從0開始計數。 如果是這樣的最低數量,你可以以二進制表示。 所以,在這裡,我們已經開始初始化i為0。 我們設定i等於0。 但後​​來我犯了這個錯誤,在這裡,說我是小於或 等於10。 但是,如果你認為,如果我是從0開始,然後我去 ,1,2,3,4,5,6,7,8,9,10,實際上,我要 打印到屏幕上的11顆星,因為我已​​經走了 和等於10。 因此,簡單的辦法是什麼? 觀眾:[聽不清]。 DAVID J.馬蘭:只要將它更改為小於。 如果你真的想,你可以做到這一點。 但在一般情況下,是不可取的。 因此,從0開始計數的東西,你應該 通常習慣。 現在,這整個結構本身? 這條線的15 demarks一個for循環。 因此,對於是不是一個函數。 這只是一個聲明。 這是一個循環結構,就像我們所看到的划痕。 它由三部分組成。 請注意,這裡是第一部分 左邊的分號。 兩個分號之間的中間部分。 再有就是右手部分的權利 第二個分號。 現在,這些做什麼? 觀眾:[聽不清]。 DAVID J.馬蘭嗎? 是嗎? 觀眾:初始化。 DAVID J.馬蘭:初始化。 所以,這是什麼意思呢? 我們已經聲明了一個變量叫我。 它的類型是int,因為我已​​經指定了INT I。 我初始化i的值為0。 那麼,這是什麼真正的意思嗎? 它是有效的電腦說:嘿,給我足夠的 內存,足夠的RAM,以適應數字,然後把 0,塊RAM。 順便說一句,有多大,是一個int通常情況下,至少裡面 的產品? 觀眾:32位。 DAVID J.馬蘭:32位。 因此,這意味著32位,否則被稱為4字節給我, 並把值0,這是很容易的,因為 它只是意味著將所有的位為0。 所以,現在,這裡的第二部分是條件。 和條件,顧名思義,就是檢查 再,再而三,是否是真還是假。 因此,這只是說做下面的幾行代碼 - 即第16行,因為這是唯一一個縮進 下 - 所以,只要i小於10。 通過這個循環的每次迭代後,做 遞加在這種情況下,這是一+ +。 現在,它不具有為i + +。 這可能是我 - 。 但如果我這樣做,什麼行為會 這個計劃嗎? 觀眾:這將是一個無限循環。 DAVID J.馬蘭:這將是某種形式的無限循環, 除非我們很幸運後2負億左右。 也許事情會環繞,只是性質的有限 數,我們已經分配給一個int的位數。 但它肯定是要遍歷遠遠超過10 肯定超過11次。 而現在,正如順便說一句,我+ +和i - 真的只是語法糖。 什麼是多一點,這只是速記符號 明確寫入如下: I = I + 1。 這是相同的到i + +。 它只是一種看起來更漂亮,說我+ +。 它更簡潔,更具可讀性。 因此,大多數人做,而不是。 但是,這是相同的功能,以 我們剛才看到的東西。 因此,在短期,快速修復這裡只是說重複我的 從0一路攀升至不到10個。 然後,我們將確實得到10顆星。 所以,讓我們來試試這個。 讓我打開終端底部。 讓我進入的目錄,這是英寸 我要手動編譯鐺現在。 而且我要編譯為buggy1.c,輸入的。 現在buggy1,為什麼沒有這樣的文件或目錄 被稱為buggy1? 觀眾:[聽不清]。 DAVID J.馬蘭:是的。 因此,它實際上是名為a.out。 所以,記得,如果你只是運行鐺,鐺 編譯器,和你沒有指定你想要的名稱 給你的程序,它會默認為a.out的。 事實上,如果我做LS - 哎呀。 我沒說 - 黑與白的問題的一些 你所面對的已得到修復。 但是,讓我這樣做。 在那裡,我們有a.out的左側。 因此,我們必須運行a.out,而不是buggy1。 所以,讓我繼續這樣做。 。/ a.out格式,回車。 而我顯然沒有做什麼呢? 觀眾:保存。 DAVID J.馬蘭:我的文件。 所以,很容易通過點擊控制S,或去解決 文件,保存,就像在大多數程序中。 讓我走在這裡,清屏,再次運行它。 仍然是一個錯誤。 這是怎麼回事 - 觀眾:你沒有編譯。 DAVID J.馬蘭:啊,太好了。 我沒有編譯它。 像一個白痴,我在看代碼,看看什麼是錯的。 所以的的鐺buggy1.c,現在的a.out。 和不快,保存。 因此,它看起來有點難看,因為沒有新的生產線 在程序的任何地方。 但同樣,這只是一個審美的細節。 至少,如果再算上這些的時候,我們應該 現在看到10個這樣的恆星。 那麼,關於第二個熱身的例子? 所以在buggy2的,我要求這個版本中,也將打印 10顆星,每行一個。 所以這一次,我有一個換行符,只是為了讓 事情有點漂亮。 但不是我所得到的是這樣的。 因此,讓我做鐺buggy2.c的,Enter鍵。 現在,它再次名為a.out。 輸入。 我只看到一個新的生產線,只有最後一個新行 我的提示移動到下一行。 ,但顯然我已經打印*,然後一個新的生產線, *,然後一個新行。 但是,什麼是這裡的錯誤? 是嗎? 觀眾:[聽不清]。 DAVID J.馬蘭:沒錯。 因此,不像有些語言,如Python中,縮進 實際上有功能意義,在 語言,如C - 正如我們將看到的,PHP,JavaScript的 - 的的縮進是真的,只是為了人類的利益。 因此,事實上,我已經縮進了16和17號線看起來不錯, 但它沒有功能上的意義。 如果我想這兩條線執行的一部分, 循環,那麼我必須把它們括在大括號內這樣做。 你只能砍那個角落,省略了花括號,如果 什麼情況下? 觀眾:只要一行。 DAVID J.馬蘭:只要一行。 所以,這只是一個很好的排序,排序的語法細節,使 你不要浪費時間寫三行,其中兩個是 花括號,只是寫了一行代碼。 但是,如果你有兩個或兩個以上的線,我們 確實需要做到這一點。 所以,現在讓我保存這個。 讓我繼續前進,重新運行鐺。 然後讓我重新運行a.out的,現在我讓他們每行一個。 現在,a.out格式是怎麼樣的一個愚蠢的程序名稱。 我怎麼能告訴鏘給我一個文件名 更重要的是用戶友好的,像buggy2本身? 一個更清楚一點嗎? 觀眾:[聽不清]。 DAVID J.馬蘭:OK,所以我其實可以採取非常 用戶友好的快捷方式,只是寫buggy2。 我不指定,C在這種情況下,並按下回車鍵。 做確實是編譯buggy2.c我 問鐺做到這一點。 具體而言,它會調用鐺鐺,它運行使用方式 比我真正需要的命令行參數或開關。 隨著時間的推移,我們會回來,所有這些不同的 神秘的連字符號的表達的意思。 但就目前而言,這只是救了我的麻煩 記住,不必輸入所有的這些 不同的連字符號的表達。 上攻,最終是 現在我有buggy2。 如果我想做到這一點,不過,我手動 而是可以做到這一點 - 鐺-O buggy2然後buggy2.c的。 這同樣給我一個名為buggy2。 因此,在短,鐺的編譯器。 使僅僅是一個用戶友好的工具,我們將使用更多的 多,因為它只是開始 簡化對我們的事情。 而我們,最後返回0。 現在,只因為,但我們會開始戲弄的那部分 今日(星期三)。 對任何有任何疑問? 是嗎? 觀眾:[聽不清] LS的報價有嗎? DAVID J.馬蘭:OK。 當我輸入ls命令報價,那是我做了一些神奇的 幕後修復一個bug。 我忘了,好像我們已經告訴你了 討論板,做的 - 我們會做到這一點現在 - :sudo的議案Ÿ更新appliance50,。 哎呀,這拼寫正確的。 因此,設備,就像是一個操作系統。 它的運行這個名為Fedora操作系統。 而現在,因為我的Internet連接速度較慢,我已經 真的大清洗。 因此,運行sudo yum更新,我們告訴你做的 習題集,基本上是喜歡跑步的自動更新 在Mac OS或Windows。 和的原因,這在一開始的 問題集,因為當我們創建設備時,我 搞砸了,我不小心讓所有的程序看 黑色在黑色屏幕上,這就是為什麼你沒有看到他們 默認情況下。 但設備的最新版本修復了這一點。 我會解決這個問題在休息,一旦我有上網 連通性。 因此,在報價只是隱藏我的錯,非常謹慎, 顯然是。 其他問題嗎? 是嗎? 觀眾:不使來自? [聽不清] DAVID J.馬蘭:好問題。 在哪裡做從何而來? 這是一個Linux程序已經存在了很多年,長 前CS50。 它配備了如Fedora操作系統。 它不來從CS50庫。 事實上,來自CS50庫的唯一的東西, 到目前為止,我們已經看到的,是GetString時,調用getInt,所有的 這些獲取的功能,以及字字符串,並在一定 程度上,這個詞的布爾值。 但是,我們會逗,除了當我們深入到CS50 設備本身。 所以,是的,還有一個問題在這裡。 聽眾:當你說,然後車,請問該怎麼 計算機知道[聽不清]? DAVID J.馬蘭:好問題。 所以,當你只需要運行使buggy1或使buggy2,如何 做知道嗎? 因此,默認情況下,如果您鍵入buggy1,尋找一個 文件名為buggy1.c。 然後執行的適當鐺命令, 從而覆蓋默認的輸出文件名為a.out。 事實上,如果我們看一下在做什麼 - 讓我們退出。 如果我們看一下實際上是做什麼的,讓buggy2, 它已經是最新的。 因此,讓我的rm命令刪除, 程序我以前寫的。 鍵入Y-E-S確認,我想刪除它。 如果我現在做,請注意,在這個很長的線, 這最後一件事,在這裡:-O buggy2。 所有品牌做的是通過這樣的說法,可以這麼說,到 鐺,我沒有自己輸入。 好了,所以快速夫婦的行政 公告。 因此,對於部分,從而正式開始了這一未來 週日,你會總是要帶上,如果 你有一個,一台筆記本電腦。 如果你沒有一台筆記本電腦,也達到了我的 把我丟一封電子郵件。 我們會找出一個工作流程。 一般,你會發現在部分是,他們的一部分 的概念,部分動手。 我們會專門用一節的問題, 本週的問題集,通過一些走 從演講的概念性材料。 而這一切在目前的習題集。 而且我們還深入到一些實踐活動,有時 其中將被要求提交,有時 哪些不會。 例如,第一週,他們注定只是作為一個 熱身運動。 你會發現,這些問題真的只是。 這意味著他們是相當小的,但不一定 重要的程序寫的,不一定 令人興奮的和自己,但良好的機會 練習用的語法,新的功能,在一個舒適的 部分,在那裡你有幾個你的同學表現為 以及您的TF。 隨著時間的推移,我們要做的是使用稱為CS50空間的工具, 據此,而不是僅僅使用CS50家電,你會 而不是去一個網頁在瀏覽器中,你就可以 在部分編寫代碼在瀏覽器窗口。 然後,如果你選擇的,你的助教可以顯示 不管它是你在你的屏幕在瀏覽器中輸入 窗口在全班同學面前,無論是匿名或 公開,因此,他或她可以步行通過與 你的同學,你做得很好,你沒有做的很好。 再次,放心,所有這一切都可以很好匿名。 但是這將是一個很好的機會,讓更多的 類似講座的互動性允許的。 在此期間,我們將這些東西叫做超級 部分,這是可選的,但是是向所有人開放 類的,這樣你可以做到這一點更合 問題的設置。 這裡的時間表。 這是也發布的網頁cs50.net。 請注意,這裡是一個黑客特定 明天下午。 我們會拍一個今天和明天,發布者 在24小時內在線。 所以,如果你不能做任何的這些時間,不用擔心。 再次,日程安排在線cs50.net。 在切片本身而言,你應該得到一個 電子郵件,指示你去的過程找到的網頁 你的部分。 如果生活發生了改變,你需要改變你的部分, 不是一個問題。 返回到相同的URL,cs50.net/section,奇異, 你會填寫類似的表格,這樣就可以 然後給我們您的喜好。 同時,我們會作出跟進,本週的結束,我們所能 容納。 上週,記得,我們​​提出使用CS50討論的, 該課程的討論工具,在課堂上。 因此,我們不得不問的40個問題,和 在演講回答。 因此,它似乎很好地工作,因此,我們將繼續 努力做到這一點。 如果您在演講過程中,不只是感覺很舒服提高 你的手,而不是一個問題。 cs50.net/discuss,張貼在那裡,我們的教學 研究員將接聽電子或提高 匿名問,這取決於您的名義手 問題的性質。 的反饋,一般的pset會 在一個星期內返回。 因為它需要一小會兒的部分實現 均衡,第一pset中,0和1,將一點點 延遲沉澱下來的東西。 但敬請期待,在未來幾週內。 好吧,讓我把我嚴重 只是一瞬間的聲音。 因此,這實際上是一個有趣的氣候 具有這個討論中,與所有其他的事情 在校園內與之有關的事情。 但CS50當然有其歷史的這個特殊的 主題,每年在盡可能多的,這門課程,對許多人來說 年,廣告板之類的大約3%。 最近一年,2011年,CS50廣告登上35名學生。 ,我想,這是不是由於缺乏明確性。 實現課程的教學大綱中,有一個頁面 說明,解釋的線條。 重複相同的語句上的每一個 問題設置第一頁上。 所以,我今天提到這真的只是為了讓 人們重視。 我們已經嘗試了不同的東西。 我想,今天我們會做的只是花一點時間來 其實看過去的情況下,已經提出了一些。 而不是讓這​​些骯髒的小秘密,其實 指出學生做了什麼,以及我們如何檢測 它和真正的首要動機是什麼 甚至討論這個問題。 因此,隨著中說,該行基本上是這樣的 - 根據教學大綱,你不客氣,你被鼓勵,以 與同學交談。 這就是全部的這些合作的目的 辦公時間安嫩伯格和鼓勵的人 最後的項目協同工作。 當它來的時候,其實寫的,但界線 您的最終解決方案。 說到英語,完全正常,偽代碼, 完全罰款。 通過電子郵件發送同學PSET,讓他們看 屏幕上的手繼續鍵入, 過線。 不要看教學大綱的特定行。 但為了畫一幅畫,這是怎麼不幸的是 現實中,實現有網站在那裡, 有這一類的解決方案和許多其他類。 事實上,你或約3%,你知道這存在 這意味著,我們知道存在的。 事實上,有這樣的網站,在那裡你 可以花錢找人做你的問題集 - 這是 實際的情況下,來到了去年。 這是一個網站叫做odesk.com。 和TIM的名字是這裡的人到底是誰發布 本網站,並要求別人做他的pset 7 這種特殊情況下。 那麼,odesk.com是非常谷歌能,我們也沒有 在谷歌搜索非常好。 在這裡,有網站 - 這是相當 殘酷的,坦率地說。 [笑] DAVID J.馬蘭:關於本網站的有趣的事情是,如果 你讀了“關於”頁面,他們談論他們的企業 文化和客戶服務是他們的頭號 優先順序,以確保您的任務獲得 開啟時間。 再次,但在所有的嚴重性,事實上,這些網站 存在,實現我們也認識到, 這些類型的站點。 給你什麼樣的感覺形成一般 需要,我們一般不會有很大的醜聞,人們 任何形式的大規模合作,而是 它的這些弱點,深夜的時刻,你有 很多工作要做,這是上午04點00分,你累了,和你 心裡對自己說,好吧,讓我來看看我的 室友或朋友的代碼等。 的表現,這不幸的是涉及學生 像這樣的學生B一起提交一個提交的東西 這樣的事情,其中​​肯定的是,在一台電腦 理科類,是非常簡單的計算機科學家 檢測軟件。 這是另一種常見的範例,在那裡,你 一起工作的人,也許說 英語,就好了,偽代碼。 但後​​來它的時候,實際提交,pset時 剛剛獲得通過電子郵件或Dropbox或類似的交換。 但是,在不那麼明顯,這是企圖使 發生了什麼事,那麼這就是提交的。 這也是,不跳閘,寫得很好件 之類的軟件,我們必須實際檢測 這些各種各樣的東西。 事實上,我們要做的是運行的軟件比較所有 今年提交的文件對過去一年的 意見書,反對一切我們發現在 互聯網,在那裡對每一個招聘網站。 這一切都非常自動化。 因此,我們這樣做真的很大公正的97%的 真正的工作在這方面和其他的驢 類,並把所有的努力,使工作 他們最終提交的是自己。 我可以去的年齡。 去年的情況下,只是極少數。 一些學生提交的這些文件相同的pset 2, pset中3,PSET 4,6,PSET 9 5,PSET的pset。 在這種情況下,這是競猜0並在去年,其中兩個 學生提交相同的這句話在許多 其他“類型的請求 - ”點,點,點。 因此,即使在一類600,我們發現這 對提交的測驗。 因此,在短期,這 - 坦率地說,我討厭這種 談話 - 但是這的確是一個刻意 今年盡量壓低這個數字。 因為即使我們說這些事情每 今年,我覺得現實有得住就可以了幾個 比平常多秒,其實只是指出 ,看起來可能,嗯,沒有什麼大不了的,至少 回想起這個特殊的時刻,無論是在公平性 你自己和你的同學在這裡。 所以,如果你有任何問題就行了 ,請伸出手,就我個人。 但是我的回答永遠是,完全強調, 最後一分鐘,在晚一天的現金。 或者,如果這是一個問題,沒有任何遲交天數, 說實話,親自給我發電子郵件。 我們會想出一些東西。 請不要把你的時間在哈佛的風險。 現在,我想我們應該減輕情緒,所以我 包括下一張幻燈片。 [笑] DAVID J.馬蘭:此網站是偉大的。 事實上,我有點心煩意亂。 有這一個。 那麼這個人是驚人的。 好了,所以想到,小貓在深夜時, 這些決定。 好,那麼更多的樂趣和不太嚴重的東西,比如 條件。 好,那麼我們短暫交談,了解這些。 這是這可能是相當熟悉的 從頭開始的世界。 在世界上的划痕,我們有這方面的需要,有時 去岔路。 可以這樣做或這樣或那樣的東西在這裡。 而當我們要做到這一點,我們就可以使用,在C,這一點,如果 else結構。 那麼在這裡我們有布爾表達式。 例如,布爾表達式在這裡,我們可以或 他們在一起,在這個意義上,我們有這個條件,或 這一條件。 我們可以和他們一起,在這個意義上,我們要 檢查此條件,但該條件。 在這裡,我們有一個switch語句,這是不那麼 類似的語法上的那些種條件,但它 允許我們這樣做相當於,如果,如​​果,如​​果,否則, 如果,並通過簡單地枚舉他們個案等 由個案。 於是,我們看到了這些最後的時間。 然後我們就開始接觸後,循環類的東西。 我們剛才看到其中一個。 但也有其他循環結構。 比如,這一個在這裡。 因此,雖然(條件),一次又一次地做這件事情。 因此,從根本上說,這之間似乎是不同的 這裡for循環,這個while循環? 這for循環,這個while循環。 是嗎? 那是什麼? 觀眾:[聽不清]。 DAVID J.馬蘭:好。 而在循環條件,顯然有 更多的語法。 有這樣的初始化,此更新。 在while循環中,只是有這個條件。 如此看來,這是一個有點縮減兌 循環,這意味著如果我們希望有變量,我們希望 有遞增,我們實際上有 我們自己做這件事情。 所以,讓我去進取,不斷開拓gedit的。 讓我切換到設備。 讓我們做一個快速的小例子, 區別之一從其他。 在我的腦海,我應該說的一件事。 我特別提到了名添。 蒂姆是確實有人,有學生試圖找到做 他們為他們的功課。 我們沒有添在特定的部分。 因此,實現好,免得我透露一個學生,是不是學生。 這是一個素不相識的人在互聯網上做的事情 由代理在去年。 因此我們發現了。 因此,在這種情況下,在這裡,讓我繼續前進, 打開一個新的文件。 文件,新建。 這給了我一個標籤。 讓我繼續前進,將其保存為loop.c. 讓我走,單擊“保存”。 那麼在這裡,讓我們繼續前進,並開始寫 等級。 讓我放大。 現在,我們要做的詮釋主要(無效)。 現在,讓我繼續做(INT I = 0; 哦,我+ +)。 現在我要繼續做打印的明星,我 前面所做的那樣。 然後在課程結束後,我們只是要 打印新的生產線,只是讓我的提示 不看所有的凌亂。 返回0。 似乎語法上是正確的嗎? 到目前為止。 所以,讓我們來看看。 因此,讓我放大了,進入我的終端窗口。 讓我繼續運行循環,因為我把這個 事情loop.c. 所以循環。 似乎編譯OK。 讓我跑環,現在輸入。 它似乎已經印刷了10位明星。 因此,讓我們將它轉換為一個while循環,看看有什麼 種問題,我們絆倒。 因此,而不是這個,讓我就在這裡說,而我是 小於10 - 讓我擺脫的for循環。 好了,我們已經有一對夫婦的問題。 因此,條件是相同的,但我明顯缺失 初始化。 我錯過了遞增。 那麼應該怎樣編譯器可能會告訴我,當我嘗試 編譯這個程序? 是嗎? 觀眾:[聽不清]。 DAVID J.馬蘭:好。 因此,它會說類似未申報 - 在這種 在這種情況下,變量。 事實上,使用未聲明的標識符我。 所以這是在對比的語言,如PHP, Python和Ruby,有些人可能是熟悉的, 在那裡你可以開始使用一種變量 不管三七二十一,而不必擔心有關聲明 明確的始終。 在C語言如Java和C + +,你必須要 超明確。 如果你要一個變量叫我,你一定要告訴我 它是什麼類型的變量。 因此,我們要解決這個問題如下。 我要在這裡輸入INT I,因此, 我聲明了一個變量叫我。 現在,我已經跳過一個步驟。 我顯然沒有初始化它,但讓我們看看,在 品牌鐺停止抱怨。 因此,讓我重新製作這個節目。 好了,現在它只是抱怨 出於不同的原因。 “變數”我未初始化的時候用在這裡。“好,那麼 這是非常清楚的。 初始化設置它的值等於。 我們還沒有這樣做,所以讓我來試試等於0。 現在,讓我們再試一次,然後重新運行鐺。 編譯時間。 我運行它。 但是又大又老的無限循環,因為我已​​經做了 初始化時,我已經做了的情況,但我從來沒有做過 任何形式的遞增。 那麼,我該怎麼辦遞增? 那麼,在一個while循環,那感覺就像我要去有 做它的內部循環,因為非常類似於第一個 本週的的做循環結構的例子,如與 襪子和計數,我們不得不這樣做 在最後的東西,想回去到下一行。 如果我繼續做這個,我+ +嗎? 讓我們甚至不能編譯這個。 趕上我了。 什麼是錯的嗎? 觀眾:[聽不清]。 DAVID J.馬蘭:這絕對不是整數。 這是我。 和花括號,像以前一樣, 縮進是不夠的。 所以,現在我有這個。 因此,雖然我是小於10,打印的明星, 然後遞增。 的方式,而循環的作品,只要你打的 底部的循環,在這種情況下,看起來像10行, 它會回到6號線,在這一點上, 條件將被再次審核。 ,如果我仍然低於10,我們會做8號線和 然後按9,然後我們會打10,並返回至6,再和 一遍又一遍,這樣,只要i小於10。 因此,讓我們重新運行。 好了,我們已經編制了還好。 讓我重新運行循環。 現在它實際上似乎工作。 所以,這裡的長處和短處? 嗯,到目前為止,有其實並沒有一個整體的巴解組織 - 太可愛了。 所有的權利,這是一個 - 啊,那是個意外。 好吧,讓我們回到for循環。 因此,for循環是不錯的,因為他們是超級明確。 即使他們寫的是一個有點笨拙,這是 非常強大,它可以讓你做 多件事情。 While循環不似乎有一個巨大的量的值 然而,因為它感覺就像是我們必須做更多的工作。 我們必須把初始化在這裡, 更新在這裡,我們要記住做的一切。 因此,我們會看到在while循環的時間,實際上是借 只是不同的背景,不同的數據 列表和哈希表等結構的事,我們會得到 學期中。 但現在,知道有這第三類被稱為一個做 while循環。 我們已經看到了這個簡單。 這可能是超級有幫助的pset 1。 任何時候你想要做的事,然後檢查 用戶合作,如果他們沒有,再這樣做,一做, while循環適合自己的那種邏輯。 因為作為從頂部到底部的順序在這裡表明, “的字面意思是”做到這一點。 一次又一次的做到這​​一點,可能是什麼? 也許這意味著調用getInt或GetString和 調用getInt或GetString的檢查值,然後大呼小叫 在用戶,如果他們沒有要求他們合作, 再次,一遍又一遍。 如果您想要做的事一次, 然後檢查一些條件。 所以,讓我們來試試這個。 讓我真正改變現在到do-whil​​e循環。 我要繼續前進並執行以下操作。 因此,請執行以下操作。 讓我們做INT I =調用getInt(),但讓我們先告訴用戶 該怎麼做。 有那麼一點點不同,這一次。 “給我一個int”。 所以,我會使用printf。 現在我來這兒的,我要做到這一點 而我,比方說,大於 - 讓我們來看看,我是,讓我們說,小於0,或I 大於10。 換句話說,我想一個數字從1到9,只 隨意。 所以,我使用的是組​​合布爾表達式,這裡 確保i是小於0或大於10時,在其中 情況下,我會在這裡做這個循環。 所以,再一次,做到這一點 - 而i是小於0或i是大於10。 現在讓我們繼續前進,做到這一點,一旦我們做到了這一點。 讓我們做一個快速的完整性檢查。 printf(“請謝謝你,我是%d”,I)。 因此,這個簡單的程序要求用戶類型為int的, 確保是在一定範圍內,1至9, 感謝用戶,提醒他們什麼,他們只是 輸入的,只是作為一個小的完整性檢查。 但是,讓我們來看看,如果這個工程預期。 讓我去低著頭,並重新運行make循環。 嗯。 “使用未聲明的標識符'我'”。這很奇怪。 我想,我們議決。 相同的症狀,但不同的代碼。 是嗎? 觀眾:[聽不清]裡面的兩個,我們必須 [聽不清]。 DAVID J.馬蘭:沒錯。 因此,這實際上導致我們的主題被稱為範圍。 原來,C,再次,它真的需要你從字面上。 如果你做這樣的事情,你聲明一個int 然後將其分配一定的價值,但你這樣做,裡面的 一對花括號,什麼C也就是它假設你 只希望知道,因為我存在於那些32位 這些花括號的情況下,行範圍內 6至9。所以我宣布,它被賦予一個 在第8行,但只要你以外的 9號線以下的花括號,我不再是 範圍,可以這麼說。 S-C-O-P-E。它不再是在正確的上下文。 所以,現在有沒有我,所以,雖然我們甚至沒有 宣布它在所有。 那麼,什麼是修復這樣的事情,如果 原因是,我花括號內聲明的, 顯然是壞? 在這裡嗎? 觀眾:[聽不清]。 DAVID J.馬蘭:是的。 因此,我們可以初始化外面。 因此,讓我繼續和刪除的聲明部分, 我指定的類型,並讓我在這裡做起來。 因此,在第5行,現在說“給我一個int。”我呼叫它。 請注意,在第9行,我並不想這樣做,因為我 已經有32位。 我不想問電腦中 不同的32比特。 我想使用相同的32位。 而現在,因為我是第5行中宣布,它仍然是合法的 使用它在第11行和第12行。 因此,讓我嘗試重新編譯,看看 如果鐺停止叫喊。 使循環。 因此,現在是“隱式聲明函數 調用getInt“在C99是無效的。”那是什麼?“ 是嗎? 觀眾:[聽不清]。 DAVID J.馬蘭:是的。 所以,現在,我實際使用的調用getInt,這是不是 這只是配備了C.這是來自CS50。 因此,我們需要在這裡。 讓我回去的迅速下降 在這裡,重新運行。 好了,終於。 現在我們已經解決了,其它的錯誤。 讓我跑去循環,並看看會發生什麼。 “給我一個int。”我給它11。 我給它-1。 我給它富。 我給它5。 而現在,它確實工作的。 但提示改變的原因就在這裡。 為什麼說重試這些時間,但給我一個 int的三倍嗎? 這是為什麼行為有什麼不同? 聽眾:給它一個字符串。 DAVID J.馬蘭:你說什麼? 觀眾:你給它一個字符串。 DAVID J.馬蘭:是的。 所以我們給它一個字符串在這第三次嘗試, 當我輸入foo的。 foo是一個字符串。 這顯然不是一個int。 CS50已實施的方式調用getInt的是,我們 不檢查,如果事情是小於0或大於10 你,因為我們該如何提前知道什麼樣的 int的你要嗎? 最低限度,但我們可以檢查你的,沒用戶至少 輸入一個整數? 如果他們沒有,我們喊在用戶鍵入“重試” 在屏幕上。 所以,現在我們有一個程序的循環。好吧。 現在,這是一種更好的結構? 因此,這是事情開始變得有些混亂, 事實上,你一定要記住在這裡聲明一個變量 如果你想使用它裡面的一些 花括號外。 但是,即使這看起來有點神秘 一目了然,只是,記得簡單的邏輯。 為了使用任何C,它是否是一個函數或 它是一個變量,你必須包括它,如果它是一個函數 在一些圖書館,或者你需要聲明它。 但現在你需要額外注意的事實, 你宣布它在正確的範圍內。 你不把它得緊緊的括號內。 所以,讓我真正回滾。 如果我們回到我們的例子前面的內容,和我一起去 為int i = 0; <10; i + +,和我 做printf的明星,這樣,然後關閉括號,現在 printf的,我是現在 - 根據同樣的邏輯,會發生什麼事,當我嘗試 編譯這個程序? 觀眾:無效的標識符。 DAVID J.馬蘭:這是另一種無效的標識符, 未聲明的標識符。 現在,原因是有一點不同。 這裡顯然沒有花括號,但同樣 的想法,同樣的故事,適用範圍。 如果你像我聲明了一個變量內的 循環,即使你沒有明確的書面的花 括號,認為他們在精神上仍然存在,在 情況下,我是唯一有效的內部循環。 它是無效的,一旦你到下一行,這 這種情況下,現在是10。 因此,只要幾個問題的範圍之類。 好吧,什麼問題嗎? 正確的,所以這是一個簡單的小程序, 打印小星星。 但是,讓我們來看看,如果你還記得這首歌。 這是一個令人難以置信的討厭的歌曲,孩子們會唱 校車等。 但好處是,它有這樣的週期性, 據此,它的“99瓶啤酒在牆壁上, 99瓶啤酒。 拿一個,通過它,98瓶啤酒 牆上。“的歌曲,然後重複97,然後96,然後 95,94,一路下降到0,如果你真的得到了, 遠在總線上。 因此,這是一個很好的方案的實施進行排序,因為我的 上帝,如果你可以只實施這幾個 行代碼,你可以吐出這整個歌詞 歌曲相當快。 但前進的道路上,我們現在就可以開始梳理除了一些 這些基本的循環結構,現在也 介紹,我們寫自己的函數,返回值 我們通過左右。 但是,第一,為什麼我們不繼續前進,並採取我們的五分鐘 在這裡休息一下嗎? 當我們回來時,我們會唱這首歌。 好了,所以我們又回來了。 我說,我們現在唱這首歌時,我的意思是 通過編程,而不是口頭上。 所以在這裡我們beer1.c,這是一個實現 特別的歌。 而僅僅是明確的,對於那些不熟悉 這件事情的樣子,讓我繼續 使beer1,回車。 現在讓我跑beer1,我們會看到什麼 - 有多少瓶 啤酒有嗎? 我會輸入99,喜歡的歌。 輸入。 現在,如果我們通過滾動 - 很抱歉 - 如果滾動通過這一切,我們會看到, 這確實唱整首歌曲。 等待一分鐘。 我的滾動條有點亂。 讓我們用更大的窗口。 因此,beer1,99,我們走吧。 所以在這裡我們唱整首歌曲,更快, 計算機,它可能是我們。 所以注意到,雖然,這裡的週期性質。 它說99,然後99,然後拿一個下來,通過它 圍繞“98。 現在,它重複了一次又一次。 因此,這實際上是一個絕好的機會某種 循環結構。 請注意,我這裡種切割一個角落。 請注意,我說:“在牆壁上的98瓶啤酒, 在牆壁上,97瓶啤酒“,這僅僅是 當我們得到一個瓶啤酒,我沒有 擔心的英語語法。 但我們也可以解決這個問題的,如果一點點 的情況下,也許。 如果這個數字是單數,繼續說:“瓶子”, 否則,如果它是多元的,說:“瓶”。 但現在,我完全切斷那個角落。 因此,讓我們來看看我們有什麼。 因此,我們在上面已經得到了一些意見。 我包括這兩個庫, 我們已經普遍了。 現在讓我向下滾動到第一 實際的代碼行。 第17行揭開序幕主。 21和20號線將有多少瓶啤酒? 然後調用調用getInt。 現在我有一個位的完整性檢查。 因此,這是一個約定,我們現在將開始採用 更嚴格檢查用戶的輸入。 有時候,你只是不希望促使他們再次 一遍又一遍。 如果用戶螺釘和不配合,挺好的。 退出,只是不處理。 所以這是我在這裡做什麼。 如果n是小於1的,我只是罵的用戶, “對不起,這是沒有意義的。”然後我去 隨意返回1。 所以,再一次,這僅僅是一個慣例習慣。 現在,只要相信。 但到現在為止,我們一直返回0,因為 我們說過的話返回0表示什麼呢? 觀眾:成功。 DAVID J.馬蘭:成功,僅此而已。 所以,現在我們終於開始思考 非成功 - 換句話說,角的情況下,錯誤條件 - 現在我有一個無限供給,或至少四個億 可能的事情,可以去在我的程序錯誤。 我就可以開始給他們分配單獨的數字。 現在,一般就足夠了剛剛返回 0以外的東西。 因此,我們現在簡單地返回1。 但是,返回1的原因是,一旦你返回 1,你猜對其餘的程序會發生什麼情況? 它停止。 就是這樣。 因此,事實上,我返回1是有效的 短路這個程序的執行,使 第27行以下將繼續執行。 一旦作為主要的回報,就是它了。 所有權利,因此,如果用戶合作,我們到達第30行 因為他們中鍵入一個合法的號碼,這是我的 這首歌的實施。 所以,我第一次打印一個換行符,只為 美學。 我現在有一個for循環。 請注意,我做的事情位 不同的方向。 我沒有想得多做得少,我沒有做+ +。 相反,我可以說初始化變量i,它設置為等於 N,用戶輸入的數量,然後執行以下操作,所以 只要我是大於0的,然後我 - 一旦你完成了這個循環的一次迭代。 因此,我們可以使用for循環倒計時為好。 現在,這是相當多星期的東西現在,用printf。 因此,打印“%d的啤酒瓶在牆上。”打印“%d 瓶啤酒。“”拿一個下來,傳遞它。“打印 “%d個啤酒瓶在牆上。”因此,它仍然是%d,但 注意的參數printf是不斷變化的。 在逗號後面,我有我的,因為我想說的是99。 這個逗號後,我有我的,因為我想說的是99。 這個逗號後,我有我 - 1,因為我想說98 這第一次迭代中,等等。 現在在這裡,我只是有一些雞毛蒜皮的話。 然後第42行,返回0,按照慣例,表示 一切都正常。 那麼,如果我弄錯了嗎? 一個常見的錯誤是什麼? 那麼,如果我不小心說好了,我要算 下降到0,我想0的啤酒瓶在牆上嗎? 所以我說,我是大於或等於0。 這是怎麼回事,是我現在的症狀看,如果我重新編譯 beer1並運行它呢? 觀眾:陰性。 DAVID J.馬蘭:是的,這是要去負。 這是一個令人難以置信的一個off-by-one錯誤, 常見的錯誤。 讓我們回到終端窗口 在這裡,所以我們可以看到更多的時間。 輸入,99瓶啤酒。 關閉,但我們就非常輕微太遠。 我們唱的歌曲太遠了,這樣,我們現在打的 負數。 因此,它不是那麼回事。 好了,這樣我們就可以很容易地解決這個問題,回去 它曾經是。 但有一些機會 改善? 好吧,讓我們我打開beer2.c,向下滾動這裡,並採取 看看這個版本。 什麼跳出來的第一件事情就是在你為不同的 在這個版本在這裡? 觀眾:[聽不清]。 DAVID J.馬蘭:是的,所以沒有更多的我,是因為它發生在 我說你知道什麼,我詢問用戶的n,然後我 設定i等於n,然後我改變了我,但我從來沒有 接觸N鍵。 那麼到底什麼是你點的分配另外32個 位叫我,這樣我可以有一個不同的變量? 因此,在這種情況下,我認識到不必要的 設計功能。 我現在去說,而n是大於0的,去 進行打印同一首歌,通過一個n的printf的 第二個參數,N - 1,第二個參數在這裡。 然後在這個循環的每次迭代,繼續前進,只是 減n本身。 現在,在功能上,這個方案 會是相同的。 如果我輸入99,正開始在99。 我遞減,遞減,遞減,遞減。 我要一路下調至“一瓶啤酒 在牆上,一瓶啤酒。 拿一個,到處傳遞。 0的啤酒瓶在牆上。“結束,因為我做 得到正確的條件。 這是大於0。 我沒有犯這樣的錯誤。 因此,這是更好的,版本1或版本2? 所以,我聽到了一堆怨言了兩個。 為什麼是兩個呢? 那是什麼? 觀眾:[聽不清]。 DAVID J.馬蘭:哦,好吧。 因此,它不會低於0,但要記住,在一個版本, 原來正確的版本不低於0或者去。 所以請記住,這是正確的版本。 因此,讓我們至少比較正確的版本。 什麼是贊成的版本的參數 兩個分別是,嗯,更好的嗎? 是嗎? 觀眾:它使用較少的空間。 DAVID J.馬蘭:好了,所以它使用更少的空間,對不對? 而使用一個版本的32位為n,然後又 32位我。 版本只使用32位為n,所以 似乎是一個加號。 其他的想法? 有誰不想爭辯贊成,1? 是嗎? 觀眾:你必須使用額外的代碼為n - 。 DAVID J.馬蘭:好,確保萬無一失。 所以這是公平的。 所以這只不過是,至少對我來說 - 我的意思是,這其實感覺稍微複雜一些,但事實上, 我不能在一個封裝了所有我的邏輯排序 線條美,for循環,for循環可以。 在這裡,我有釘在這n - 在循環結束時,由於 它的必然邏輯。 但它種磨我走錯了路,只是因為它 似乎從這裡的邏輯分開,即使 再次,它是必要的。 其他的想法? 是嗎? 觀眾:[聽不清]。 DAVID J.馬蘭:是的。 那麼,如果你去,在結尾的歌曲,希望 再次打印出這首歌的名字嗎? 打了99瓶啤酒,如“謝謝”,或者什麼 這樣的傻嗎? 但問題是,你想進入到原來的值。 事實上,你已經突變或改變n在每 迭代,因此破壞了其原有的價值 意味著你不能做到這一點底。 可以說,現在,我們可以清楚地不想要做的 ,在這種方案。 那麼,誰在乎呢? 但是,這是一個非常有效的一點。 而且說實話,現在真的是沒有人 正確的答案。 他們兩個人都同樣正確。 我可以確信無論哪種方式。 我會說,在一般情況下,這是一個很好的原則,如果你 要求用戶為某個值,並且將存儲在變量 如N,只是有點原則上,它可能是好 保持周圍。 和任何你想要的數據變異,一遍又一遍, 給自己一個該變量的副本,只是讓你 有機會到原來的。 你花32位,但現實的情況是這樣的 電腦,喜歡,2 GB的RAM,這些天, 我們糾纏了32位? 真的不是什麼大不了的。 甚至在此設備,用半的演出或 千兆字節的RAM,32位和64位, 沒有什麼大不了的。 當然,今天,這將是不堪重負的大小的方法 程序本身,這將是幾百 千字節,如果不是幾百兆,這些天。 因此,合理的關切,沒有一個正確的答案。 但至少這些都是想法,應該開始 經過你的頭腦嗎? 由於在pset中0,即使我們真的只有預期 正確性,或者至少是否認的各種錯誤, 你可能也遇到過,因為我們向前邁進,設計 將是另一個重要方面,編寫代碼 也是我們的評估代碼。 因此,至少給想這樣的事情。 只是因為一些作品,並不意味著它的好, 並不意味著它的精心設計。 而那是一個的教學研究員的東西, 問題集將幫助我們逗隨著時間的推移。 好了,怎麼樣,讓我們說,這個版本嗎? 讓我做的東西一點點性感這裡的時刻。 首先,讓我擺脫這一點。 現在讓我們來解決這個語法問題。 所以,我想在這個版本中修復的語法,所以, 而不是僅僅說括號中的S,如“瓶” 或“瓶” - 我不想砍那個角落 - 我也想動態地打印出來的字“瓶” “瓶”,從而利用這些%S佔位符。 所以,我需要有條件地檢查i的值是什麼。 如果是1,我想說的“瓶”,而如果它的任何東西 否則,我想說的“瓶”。因此,讓我們嘗試這樣做。 所以,如果我== 1,然後就讓我去,並宣布 - 我需要一個字符串,所以讓我做字符串s1,因為它是 第一個字符串我只關心現在。 我會說:“瓶子”。然後,讓我們來看看,串 S2 - ,我將解釋我要去的地方在一個時刻 - “瓶”。所以記得,在這首歌中,我們需要能夠 打印的東西,兩個不同的詞可能。 因此,如果我們回頭看看在這裡要注意的是,當我們到達 這個例子在這裡,“兩瓶啤酒在牆壁上, 兩瓶啤酒,一跌,通過它,我想 這第四行說:“一瓶啤酒 牆“,所以我需要決定,我想說的”瓶“ “瓶”嗎?所以,我要武斷地說,沒事的, 我現在宣布一個名為S1的變量,字符串 一,要插在這裡和這裡, 因為這些話都是相同的,只是因為 歌曲的性質。 我現在就打電話給S2的話,我想 最終會出現在這裡。 現在,從字面上看,滿分100分的99倍,它的將是 在這種情況下,因為是複數,2 複數,4個是複數。 但在這個角落裡的情況下,我們得到為2,然後按1,或 即使是1和0,我需要這樣的邏輯。 所以,我必須花一些時間在我理解的正確的代碼。 所以,如果我這樣做,如果我== 1,則集合S1等於“瓶” 和S2等於“瓶”,因為這將是1 瓶,而這將是0瓶。 而這裡,這是什麼代表什麼呢? 只要是明確的。 這僅僅是一個評論。 因此,事實上,你可以有單行註釋意味著你 註釋你的代碼,但另一種常見的 範例,也就是如果你有一個超級短的短語, 你想要把自己和它只是更具可讀性,把 正確的代碼行的末尾,你可以 絕對做這樣的事情。 所以,現在如果我這樣做呢?否則,如果i不等於1。 因此,砰等於 - 被稱為“砰”的驚嘆號。 因此,砰= 1。 所以,如果我是不等於1,什麼我不是想這樣做嗎? 那麼,第一個字我要的是什麼嗎? 因此,字符串1用於多瓶“瓶”, 那麼這將是複數的“瓶”為好,現在。 我們來看看這實際上是讓我們 我們想要去的地方。 所以,現在如果我在這裡向下滾動,請注意,我堵在 不僅是我,但S1。 我堵在我和S1。 然後向下這裡,我減1,這是相同的 之前,但s2的。 換句話說,我想改變基礎的英文單詞 這個邏輯。 現在,已經有一些在這段代碼中的問題。 什麼是已經出了門壞了嗎? 是嗎? 觀眾:[聽不清]。 DAVID J.馬蘭:沒錯。 所以,我已經侵犯範圍的教訓。 所以,我宣布s1和s2,但我已經做了它裡面的 花括號,裡面是啊,這段代碼將工作 直到第42行,但只要我打43號線,你猜怎麼沒有 不再存在? 好了,你猜怎麼著不再在範圍 - 既不s1或s2。 因此,我們必須解決這個問題。 因此,讓我刪除的聲明。 我會離開的變量名,這裡刪除 並刪除在這裡。 在什麼線我真的應該聲明這些東西嗎? 觀眾:[聽不清]。 DAVID J.馬蘭:是啊,所以可能 在這裡,直到33上下的。 因此,字符串s1和字符串s2。 而事實證明,我可以做到這一點。 如果你聲明了兩個變量相同類型的, 實際上,你可以只用一個逗號和做到這一點。所有 正確的,所以我現在有兩個變量 - s1和s2。 我給他們分配這些值 條件在這裡,或者在這裡。 然後我使用了下面。 如何以及現在去上班? 那麼,它仍然是一個小馬車,但至少讓我們看到 有多遠,我們已經得到了。 所以,讓我繼續,並beer3的。 是這beer3嗎? 是的,這是beer3。 現在讓我們我繼續運行beer3的。 399 99。 我們可以跳過其中的大多數。 在這裡,你看那個。 “在牆壁上一瓶啤酒,一瓶啤酒, 一跌,通過它周圍,啤酒瓶在牆上。“ 但我提請你注意,只有一半的解決方案。 類搞砸了這裡。 因此,它似乎角落的情況下出現時,我等於什麼 兩個值嗎? 觀眾:1。 DAVID J.馬蘭:2和1。 這是不為1,而不是1。 這真的只是這些這首歌曲的最後兩段。 那麼,什麼我不是想要做什麼? 因此,我似乎已經陷入的情況下,如果我是== 1, 那麼第一個字是“瓶”,但第二個字 “瓶”。但在這裡,我想改變這是== 2。 而如果是這樣的話,我該怎麼想的 第一個字是什麼? 觀眾:“瓶”。 DAVID J.馬蘭:“瓶”,所以兩瓶。 然後,這個詞在這裡應該是 - 觀眾:“瓶子”。 DAVID J.馬蘭:“瓶子”,單數。 好吧,讓我們放大了,回到這裡,重新運行make, 重新運行,99式再次beer3。 好吧,“分割故障(核心轉儲)。” 我做了什麼錯了嗎? 觀眾:你不必值[聽不清]。 DAVID J.馬蘭:啊,良好的出發點。 好吧,有什麼錯嗎? 所以分割故障,我們其實要看到 這是一個幾十倍的未來,是故意的。 但現在,這其實是什麼意思? 幾乎總是意味著你有一個分割故障 不知何故試圖存取記憶體,RAM在您的計算機上, 不屬於你的,你有沒有問 操作系統。 因此,在這種情況下,請注意我做了什麼,這是 在我的邏輯有缺陷的。 我已經指定S1和S2的值如果我等於1。 我也做了,如果i等於2。 但我沒有這樣做,在無限多的其他 可能性 - 特別是,3或4,點,99點,或點。 所以固定的,這可能僅僅是讓我們的 有其他條件。 讓我就在這裡說,S1等於 - 在這裡,它應該是什麼? 觀眾:[聽不清]。 DAVID J.馬蘭:“瓶子”,因為在通常情況下, 它只是同樣的事情。 所以等於報價,引文結束,“瓶”。因此,對於複數 瓶,然後在這裡,多個瓶。 好了,現在讓我回到我的終端窗口, 重新編譯,再運行它。 99。 哇! 讓我們做一個快速的完整性檢查。 從技術上講,我們要閱讀所有這些,以確保 他們是正確的,但讓我們來看看 至少已知的罪魁禍首。 3瓶,2瓶,2瓶,1 瓶,1瓶,瓶。 我們似乎已經固定在至少它現在。 但這裡的捕獲量是什麼神爛攤子這是 只是為了解決一個愚蠢的 一個字符的語法細節。 因此,有一個原因,我將這個角落種 早些時候,因為它是完全惱人的 寫這麼多的代碼。 但事實證明,有更優雅的方式 表示完全一樣的東西。 我們可以做到這一點,如下所示。 讓我離開這了一會兒在屏幕上, 介紹一些被稱為一個三元運算符。 這是一個班輪,只是為了讓我們 生活一點點的性感,如許。 我要做到這一點,如下。 給我一個字符串名為S1,讓我 分配如下。 (我== 1)? “瓶”,否則“瓶”。字符串s2得到(我== 2)? “瓶”,否則“瓶”。 所以,這裡的區別又是什麼呢? 這兩行代碼,我認為, 更換整個的混亂。 所以我把它稱為一個爛攤子,只是因為它讓我反感 走錯了路,它是那麼多行代碼。 沒有錯。 這不是糟糕的設計。 喜歡,這是完全正確的,完全沒有問題。 不過,編碼很乏味,如果你有表達自己的 該死的專門一而再,再而再次用一個簡單的 場景是這樣的。 所以C有一些快捷鍵,像這樣。 因此,這實質上是說聲明一個字符串名為S1, 指定此值,這個值,如果我是== - 對不起,我應該說得更清楚。 聲明一個變量s1,指定此值,如果這是真的。 否則,指定此值。 所以,換句話說,這是一個行的方式 如果別人說,但前進的道路上做一個賦值。 所以,如果我是1,然後繼續前進,稱此為“瓶”。和 那麼這個東西,稱之為“瓶”。同時,s2中, 第二個字,我們需要定義,如果i等於2,我們將 集S2“瓶”。否則,將其設置為“瓶”。有什麼 這意味著現在是我可以通過這一點,並刪除所有的 這些代碼行。 當我說,有點可笑的是,這是目前 性感的性感,這是在排序的文體意識。 事實上功能,這段代碼實際上是要 做完全一樣的東西。 儘管它可能看起來有點神秘 一目了然,因為我們從來沒見過這個結構之前,我 認為它是最終要這麼多 可讀性和更容易為我們人類排序 理解,因為現在你可以只讀取 所有代碼在一行上。 它仍然是類似的,如果這是在精神 條件,然後,這是內部的,如果這 是的else裡面有什麼。 但我們可以做到這一點只是更優雅的。 如果我現在回去,我的終端,刪除所有 這些生產線,取而代之的只是這兩個, 重新編譯,重新運行的99瓶啤酒,請注意,我 語法是,其實仍然是正確的。 所以,再一次,事情開始。 2瓶啤酒,1瓶啤酒。 看起來是對的。 是啊。 因此,我們有一個更簡潔的解決方案。 因此,這也一樣,你獲得更舒適的C,而不是 一定pset或第二,但 認識到這些結構可以讓我們做的事情永遠 更優雅。 現在,讓我們在這裡做的另一件事情。 讓我走進取,不斷開拓return1.c。 現在,讓我們開始解決其他問題的方式, 使我們能夠編寫更複雜的代碼。 所以這裡有一個簡單的小程序,其目的在生活中 是增加值。 其實,讓我們退後一步。 讓我這樣做手工。 讓我做包括和int的主要(無效)。 讓我叫increment.c。 我該怎麼辦? 我要繼續前進,這樣說 - 我們所說的數字是相同的 - 詮釋x。 所以int X取得的printf x是%d,新線,X。 所以,我打字快​​,但現在有點熟悉的東西。 然後,我會做x + +。 然後,我要再次打印相同的句子。 然後我將返回0只退出程序。 所有的權利,所以這是一個程序, 增加一個數。 它的第一要初始化的東西2,那麼它的 要增加它,並再次打印。 因此,讓我們的運行增量,令人難以置信的簡單的程序。 但是,假設現在我要對多維數據集的值,這樣做 東西有點亂。 我真正想要做X取得的立方。 所以,我可以使用什麼所謂的pow函數,但我不 真的知道它在哪兒還。 所以,我要做到這一點,老式的方法。 x次,這等於x次,x倍所述。 所以我刺再次乘以它本身的價值, 一次又一次,使我們獲得的權力 在這種情況下,共3。 所以,現在我要打印的數字應該是,正如我們將看到的 - 增量,因此它實際上並沒有真正增加 了,但我們會離開的名稱孤獨 - 2和8。 現在,我們已經有了一個初步的機會細化 在這裡,由此這種魔方事情乘以一個數字 由自己本身的感覺,這樣做可能是 作為一個功能非常有用的,就像有人決定 年前 - 你知道嗎,有用的,如果我們坐下 並寫入輸出使世界的其餘部分可以用它 我們為什麼不坐下來寫一個函數調用的立方體 做這個魔方給我們,這樣我們就不必手動 實施立方值的概念呢? 因此,一個簡單的例子,但是讓我們繼續使用,這是​​作為一個 寫我們自己的函數。 因此,到目前為止,我們已經用主,我們已經使用了其他 人的職能,但我們還沒有實現我們自己的。 所以,在這裡,我們走了。 我要繼續前進,寫一個函數,稱為立方體。 我想,有需要的輸入。 所以它的輸入將是一個整數。 又是什麼呢怎麼辦呢? 這將聲明int輸出輸入的輸入時間 次輸入。 那麼它會返回的輸出。 然後,我現在要具體。 這個函數會返回一個int。 所以在這裡告訴您如何編寫自己的函數。 您可以決定什麼是你的名字 功能將是。 而且一般的東西解釋是不錯的,所以我會 把它立方體。 然後,你必須指定它會返回什麼,有什麼 將是它的輸出。 同時,我們也沒有那麼多的選項。 int,char和浮點型,布爾型,字符串。 現在,我要堅持用一個int,因為我想它 返回一個整數。 然後,你必須指定其輸入,如果有的話,是什麼。 如果多維數據集需要一個參數,需要的東西之間 括號,你必須給該參數的名稱,使 你可以把它的東西,因為你正在實施或寫 這個功能,你必須給它一個類型,在這種 案件正在為int。 因此,在短,多維數據集是一個函數,它接受一個整數 作為輸入,並返回一個整數作為輸出。 所以它是做什麼用的輸入? 那麼,在第14行中,我聲明了一個變量稱為輸出,和我 分配給它的值,輸入時間輸入時間輸入。 然後,我返回的輸出。 所以,我怎麼使用呢? 我該怎麼改變這些高亮顯示的字符上線 7〜,你覺得呢? 觀眾:[聽不清]。 DAVID J.馬蘭:是啊,所以多維數據集的x。 因此,x是一個變量,這意味著它擁有一定的價值。 幸運的是,它是整數類型。 因為x是一個整數,這意味著我可以將它傳遞到立方體。 即使我壓倒一切的x的值的值 多維數據集x,迄今為止的情況下,任何時候你 有等號的一行代碼,在正確的東西 被執行,然後被分配到 左側值。 因此,操作的順序是我們希望的。 所以做這項工作? 好了,讓我去這裡。 讓我打開了我的終端窗口。 讓我做增量,輸入。 “隱式聲明的函數”立方體“是無效的, C99。“順便說一句,C99指的是C語言,因為它是 定義於1999年,是一個在版本更新 1989,這是一個較原來的更新。 因此,所有的手段。 所以,這是什麼意思,“隱式聲明 功能“立方體”是無效的嗎?“就在這裡。 在第12行,這是正確的。 觀眾:[聽不清]。 DAVID J.馬蘭:那是什麼? 觀眾:這是不是之前。 DAVID J.馬蘭:這是不是之前。 所以這是事情。 C是一種愚蠢的,或C編譯器是一種愚蠢。 他們真的只能做你告訴他們做什麼。 而他們,尤其是只閱讀你的代碼頂部至底部, 左到右。 因此,如果編譯器,鐺,閱讀你的代碼,1號線, 如何做到這一點。 哦,來這裡主要的。 好吧,讓我繼續前進,聲明一個變量x。 讓我打印的東西。 7號線,到底是什麼魔方? 這不是stdio.h中聲明的。 它不來,我不知道該怎麼辦。 因此,鐺剛剛撈出,並退出該錯誤消息。 因此,我們可以在一對夫婦的方式來解決這個問題。 多維數據集是什麼,只是移動的,我們可以教鐺 聲明。 所以,我的剪切和粘貼上面主要。 現在認識到,只是因為主不再是第一,這是 默認情況下,仍然執行。 主要是主要的。 這是默認的函數名。 它並不重要,它是在一個文件中。 但至少現在鐺已經看到立方體之前,我使用它。 因此,讓我們來看看如果鐺現在是非常美好的。 增加,並編譯這個時間。 讓我跑的增量。 而事實上,它似乎是工作。 現在,你可以拿出情況下,最終在那裡 它把每一個功能是不可行的 以上所有其它功能。 你會陷在這個無限循環在現實中, 這傢伙想在這裡,但這個 傢伙在那裡。 所以,這並不總是工作。 幸運的是,C有一個更優雅的解決方案。 我打算把它這回是,只是因為我 喜歡的話,作為一個原則問題,即主永遠是 在頂部,因為它只是很高興看到這是什麼程序 的默認操作。 我要在這裡做了什麼,宣布什麼叫做 一個原型。 我要重新申報,我的立方體函數的字面意思 複製和粘貼。 其實,這是不是真的。 因此,從字面上複製和粘貼15行 第6行以上。 不要緊,哪行結束了。 它正好是在第4行。 但它確實有前主。 但是,注意到其中的差別。 4號線以分號結束,這意味著哎, 鐺,把我的話,存在一個函數 稱為多維數據集採用了一個int並返回一個int。 但我不會告訴你它是什麼,但。 只知道,我承諾最終告訴你。 事實上,現在沒事,這是在下面。 因此,這通常是更好的,因為這時的頂部 你的文件,你就可以背出,速射,一行 ,你的職責是什麼名字,他們的 輸入,其輸出是什麼。 更清晰,輸入通常是指參數或 參數的代名詞。 輸出裝置的返回值,這是什麼 手回到我的身邊。 因此,在這種情況下,在這裡,多維數據集已宣布在頂部,但 定義,否則被稱為實施,在底部。 所以,現在讓我們回到這裡,重新運行。 所以,現在讓我繼續前進,重新運行make,重新運行增量。 它現在似乎工作得很好。 所以,現在我們可以繼續分解出類似的 這第四個版本的啤酒例子。 因此,讓我向下滾動。 注意到,我種了心剛才的教訓。 事實上,我是唱同一節再次 一遍又一遍,同樣的合唱隊中的歌曲,感覺 喜歡我為什麼不成為一個功能的因素,出嗎? 事實上,這應該是的動機之一。 另外一個事實,在世界上其他的人可能要 使用多維數據集的功能 - 這是一個很好的理由因素的東西,寫你的 自己的自定義功能 - 如果有一個塊中的代碼,只是讓你的程序 概念意義上說,你有種想給它一個 名稱 - 像在這種情況下,合唱 - 那麼你同樣可以寫,作為一個單獨的函數。 你不寫的一切,如果它只是在主 感覺清潔劑分離出來,並給它一個名稱。 因此,在這種情況下,在這裡,請注意,我有一個評論頂上 這個功能,只是唱 指定數目的瓶子。 請注意,在這裡,我不需要調用這些 輸入和輸出的事情。 其實,這個時候,我只是叫我輸入b瓶。 注意的,無效的建議是什麼? 該合唱團 - 聽眾:不會返回。 DAVID J. MALAN:不返回一個值。 事實上,函數沒有返回值。 他們可以做一些事情。 他們可以有什麼是所謂的副作用,而在這種 情況下,僅僅是打印在屏幕上一大堆。 所以請注意,此代碼在這裡,我真的只是偷 前面的例子。 唯一的區別是,而不是利用i作為我 可變的,我現在使用b作為我的變量。 所以,我有b在這裡,我有b在這裡,我有b 減去1這裡。 但代碼是完全一樣的。 但就現在向您展示如何我們可以利用這一點,讓我去 進取,實際上這是一個循環。 (INT I = i> N時,我 - )。 所以,我偷了,從我們前面的例子。 在此之前,它是在第37行,我就已經開始 唱這討厭的歌曲。 但是,我只是去,我現在請合唱團。 完成。 所以,現在這個循環在每次迭代中,我把這種 功能,合唱,,我碰巧寫的。 它不是別人幾年前寫的。 但是,合唱團,同時,使用printf來打印 出這四行。 但事實上我打電話合唱一遍又一遍的 循環意味著,我要得到的,在最後一刻, 相同的歌曲,因此,我有。 因此,在短期,如果我現在回頭看我的代碼,即使 在功能上,這是等價的,發現它的 開始變得更可讀。 我並不確切地知道如何調用getInt 實施。 坦率地說,我不知道如何合唱實施。 不過,這並不重要,我。 我不在乎,因為我現在可以排序的,作為一個人,讀 這從頂部向底部。 因為這些功能根據他們命名 這樣做,我的代碼是越來越可讀。 我們的計劃複雜得多 - 學期結束,你會寫幾百行 代碼語言,如PHP和JavaScript之類的 - 你會發現,它是如此容易得多跟踪 你做了什麼。 當你開始與朋友或 合作夥伴或同事,你就可以寫更多 大規模計劃開始行使這些基本 積木。 因此,隨著中說,為什麼我們不收工了嗎? 我們將看到你(星期三)。 [掌聲]