[音樂播放] DAVID馬蘭:大家好。 這是CS50的超部分。 分配的部分將不 開始一個星期。 所以今天,我在這裡with-- 瑪麗亞:瑪麗亞。 DAVID馬蘭:--to實際 看看問題 設置之一,課程的 第一週的材料, 讓你用面向CS50 IDE,有點 的Linux,操作系統那的 上IDE中運行,以及 看看一些過渡 從零開始到C領先 長達問題集之一。 因此,事不宜遲, 在問題集中的一個, 你會是 推出CS50 IDE,它 這是基於網絡的節目 我們為了使用環境而定 寫程序。 它的設計看起來非常 讓人聯想到典型的計算機 運行的操作系統 系統稱為Linux。 但是,它在所謂的雲, 這意味著每個人都在類 其實可以有他或她的 自己的帳戶,並使用它,以及。 因此,大多數人可能從未使用過 之前或者Linux環境 甚至一個命令行環境。 和命令行 環境是不同的。 它的所有文字。 它的所有鍵盤命令。 而且它沒有鼠標移動,沒有圖標, 沒有對話窗口,沒有菜單。 這是純粹的文字。 所以剛開始,它種 的感覺就像一個步 向後複雜的條款。 但它最終被很多 功能更強大,當然, 對於計算機科學家,最終。 因此,讓我們一起來看看。 在這裡,我在CS50.io,通過這 您可以登錄到CS50 IDE。 而就像在刮,有 三個主要方面來此屏幕。 等的左手側,我們有 會是怎樣的文件瀏覽器。 還有的這個文件夾中 頂,這是正確的,現在空 因為我擺脫我所有的 超部分之前的文件。 而這也正是我們將 保存我們寫的C文件。 在右上角,我們有一個地方, 我們所有的代碼會得到寫入。 事實上,如果我點擊這個加號,這 是打算讓我選擇新建文件。 在這裡,我可以開始寫C代碼,或者, 確實,任何數量的其他語言。 然後在底部的地方 說jharvard @ ide50--和你的將 說的東西有點 different--什麼這個叫什麼? 終端窗口。 是啊。 因此,終端窗口 所謂的命令行 接口,通過它,你可以進行交互 與底層操作系統。 而現在,我們要 讓很少使用this--的 只是編譯,看看 我們看到錯誤消息, 並運行我們的程序。 但最終,我們將 這樣做的多,以及。 你甚至可以安裝軟件 和管理您的工作空間 CS50在IDE中,也是如此。 但更多的是一些其他的時間。 因此,讓我們繼續前進,寫 一個非常簡單的程序只是 經過一個熱身 hello.c的,這也許就是 我們可以寫出簡單的程序。 我已經打開了一個新的標籤。 我要繼續前進, 說包括標準io.h. 然後,詮釋的主要(無效)。 然後的printf(“你好,世界” 反斜杠N,密切報價, 關閉括號和分號。 好吧。 所以,現在發現我的窗口沒有標題。 所以,我很快會 上去文件,保存。 而且它是非常重要的 我把這種不是“你好”。 所以有一個非常常見的錯誤, 尤其是在問題的設置之一, 是意外只是打電話給你 節目“水”和“貪婪”和“馬里奧” 或“信用”等。 但是,你真的想使 確保您有文件擴展名 因為這是唯一的方式, 編譯器和還代碼編輯器 知道你 實際上編寫C代碼。 因此,讓我繼續前進,然後點擊保存。 現在也一樣,什麼CS50 IDE 已經為我們做的這也是 語法高亮一切。 因此,它是由一切非常豐富多彩。 而整個目的 不能正常工作。 這只是吸引我的目光投向 在概念上不同的部分 這個方案的。 因此,讓我們繼續前進,編譯這個。 我可以編譯此 在幾個方面。 並且在一個星期的 老派的方式,我們做了 這是字面上的 命令line--“鐺hello.c的。” 然後,我敲回車。 而且似乎什麼都沒有發生 在終端窗口。 但沒有改變的IDE? 其中,再次,IDE只是手段 集成開發環境。 它是說一個奇特的方式 這個集成開發 環境,用於開發軟件。 那麼,在UI沒有變化? 你有沒有注意到什麼 這是不同的,瑪麗亞? 瑪麗亞:我發現了一些 在IDE50夾在這裡。 DAVID馬蘭:是的。 所以在這裡,不僅 我們是否有“hello.c的。” 我們也有“的a.out”,這是 樣一個程序一個愚蠢的名字。 不過說實在的,這是一個默認的名字 當你只是編譯代碼的程序 不要告訴編譯器 什麼樣的文件輸出。 所以,如果我要運行這個,我 需要告訴compiler-- 或者說,我需要 告訴工作區,我 要運行調用的程序“的a.out。” 輸入。 還有的“你好, 世界“。現在的”./“。 其實是很重要的。 雖然通常我們只 寫的命令的名稱, 當它是你已經計劃 寫的,你要說“./” 因為這明確地告訴Linux 要運行一個名為程序 “a.out的”這是在這一點,在那裡點 意味著這個目錄是我目前 中,這恰好是 所謂的工作空間,“a.out的。 因為如果我只是說:“a.out中,”回車, 我要得到“a.out的命令不 找到“因為computer-- 因為我發明了“a.out的;” 它沒有附帶computer-- 不知道去哪裡找它, 即使它是正確的 在我的鼻子,可以這麼說。 好。 所以,我們可以改變這 是“鐺鄰打招呼hello.c的。” 如果我敲回車,什麼程序 這是怎麼回事輸出給我嗎? 什麼是文件的名稱? 是啊,在後面。 那就對了。 “您好。” 因此,“你好”將是 節目的名稱 因為我們使用了所謂的 命令行參數,這僅僅是 改變的行為的一種方式 編譯器實際輸出 特定的文件名。 事實上,如果我放大 並尋找在這裡, 現在我不僅是“的a.out”和 “hello.c的”,而且“你好”,以及。 所以,現在我可以做“./hello,”回車。 還有的“你好,世界”。 但lastly--這 現在將公約 我們在整個使用 學期,typically-- 是你也可以只是說“讓你好。” 事實上,它說這完全取決於 迄今為止,因為它已經存在。 讓我繼續前進,撈出,用 rm命令,這兩個“的a.out” - 並說“刪除普通文件a.out的?” 這只是意味著,你 確定要刪除嗎? 我會說是的。 然後,我會刪除 “你好”,而不是“hello.c的。” 我會說“是”明確, 但“y”為足夠,以及。 如果現在通知我 鍵入ls--其中,召回, 意味著列表中 - 它列出了所有 在我的文件夾中的文件。 事實上,如果我放大 出去看左上角, 它證實了什麼 此文件夾中,甚至 雖然它在這裡標註為IDE50 而不是工作空間,它只是“hello.c的。” 所以,現在在這兒,如果我 執行“make你好”,回車, 現在我看到一個更長的命令,但一 那將會更複雜的命令 將在今後數週內有用。 現在我可以說“./hello。” 因此,讓我們快速瀏覽 一些其他的Linux命令。 那麼我們為什麼不採取一步 回來居然看C的具體 一般,從頭開始轉變 到C,然後總結了一下 在第一個問題 在C設置的所有權利。 所以我要繼續前進,只是乾淨 我的工作區控制-L剛 保持屏幕整潔。 但是,沒有功能 影響並非如此。 回想一下,我們已經看到 一些命令了。 因此,我們已經看到了鏗鏘,通常你 不必手動執行了。 我們將改用化妝。 但是,我們也看到了LS,它顯示了 在我的目錄中的文件清單。 現在為什麼那裡 - 有兩家 現在的文件,“你好”和“hello.c的。” 為什麼會出現一個明星或 之後,“你好”星號? 那是什麼表示,基於 對我們在每週一看見? 你怎麼看? 什麼是星意味著什麼? 瑪麗亞:For--節目“你好”? DAVID馬蘭:“你好*”。 是啊。 哦耶? 哦,可執行。 那就對了。 這樣就意味著 “你好”是可執行的。 因此,我們確實,這就是為什麼 我能做到“./hello。” 好吧。 所以,還有什麼我可以做嗎? 嗯,事實證明,我可以 還創建目錄。 因此,讓我繼續前進,創造, 例如,一個“PSET1”目錄中。 而問題集規範 可以讓你做的正是這一點, 所以你不必今天記住。 但“MKDIR PSET1”似乎 到沒有影響。 但同樣,沒有錯誤信息 通常是一件好事。 所以,如果我輸入“LS”now--啊,現在 我有一個名為可執行文件 “你好,”一個C文件名為“hello.c的。” 然後是斜線,所以 講,意味著這是一個目錄。 因此,我們確實,現在我要打開它。 我不雙擊它像 在圖形用戶界面,圖形環境。 我不是說“CD PSET1。” 輸入。 沒有什麼有趣的似乎有 除非發生了我的小提示 這裡 - 這是提醒Linux的方法 我我在哪裡,所以哪個文件夾打開。 這只是明確地告訴我, 相對於圖形。 如果我鍵入“ls”,為什麼我看到另 立刻提示,你認為, 當我列出PSET1的內容是什麼? 瑪麗亞:你可能不 在有什麼。 DAVID馬蘭:是的。 然後我們還沒有明顯 在那裡創造了什麼 因為我剛剛創建的目錄中。 現在,如果我想創建一個file--為 例如,我可以創建一個新的文件。 然後我會去 保存並保存為, 像“mario.c”如果你正在做 PSET的一個標準版本。 然後,像任何Mac或PC,只 選擇文件夾“PSET1,保存。 而現在的文件是空的。 但是,讓我們再次放大一秒鐘。 讓我們在這裡做的LS。 現在我們看到的“mario.c”。 因此,有一些其他的命令 值得記住了時間 - 清除或控制-L是我所 被擊中; MKDIR我們已經看到了; RM我們所看到的,還有,這是 去除或刪除文件。 當心你可以also--,如果你看看 在網上的教程,你將RM -rf 是說一個很常見的方式 刪除有東西在它的文件夾。 只要是超級,超級小心。 -rf意味著遞歸 刪除不管它是什麼 你想刪除 並強行將其刪除。 這樣循環的手段,如果它是一個文件夾 與文件夾的文件夾的文件夾, 刪除所有的人。 並強行手段甚至不 問我是或不是,我是肯定? 所以這是一個超級危險方法 刪除很多東西很快。 但beware--往往做一個勇敢的 學生意外刪除,也就是說,PSET 1,例如。 瑪麗亞:如果他們只是 做-r,他們會 問他們的每一個文件。 DAVID馬蘭:這是 適度煩人。 瑪麗亞:是的。 DAVID馬蘭:所以這就是為什麼 我們這麼多人,自包含, 我在使用-rf的習慣。 但它是危險的。 因此,買家當心。 然後,MV是怎麼樣的 有趣的命名。 因此,這是移動命令, 這感覺有點怪異 因為你的確可以用它來 從一個地方移動到另一個文件。 舉例來說,假設我搞砸了。 假設我創建 一個新的文件處理器集。 我將它保存為“greedy.c。” 但是假設我不小心將它保存 在IDE50--所以在我區本身 而不是在PSET1。 你可以看到盡可能多的左上方。 有“greedy.c。” 還有的幾個解決方案。 所以一個,我可以使用 超級用戶友好的方式 只是拖放。 而這實際上 解決這個問題。 但是今天,我們想看看 更神秘而強大的方式 對這樣做。 因此,讓我走“LS”的PSET1。 而我只看到“mario.c。” 讓我繼續前進,做“CD ..”。 所以CD再次改變目錄。 “”是指什麼有關係嗎? 上次我說:“CD PSET1“進入PSET1。 所以當我說“CD ..”,我在做什麼? 向後。 是啊。 因此,這將所謂的父母。 進入上一層,像 退出了一個文件夾中。 所以輸入。 事實上,看看它的所作所為。 這讓我感動剛剛進入工作區,而不是 成PSET1,這是在工作區中。 而現在,如果我輸入“LS” 有一大堆的東西。 在有“greedy.c”。 所以,現在讓我用MV來字面上 移動“greedy.c”到PSET1。 所以很多Li​​nux命令 工作完全是這樣。 他們沒有參數或者他們需要一 參數或他們採取兩個命令行 參數等等。 在這種情況下,它的 從字面上做什麼 它說,儘管succinctly-- 移動greedy.c到PSET1。 輸入。 好像沒有什麼改變。 但是,如果我再次做了LS,貪走了。 如果我做“CD PSET1”,回車,然後 LS再次,現在是在正確的地方。 順便說一句,如果 一些reason--特別是 如果你有間歇性 網絡連接 或者你走動 校園裡與你的筆記本電腦的蓋子 關閉,然後打開它 再次和您的工作空間 似乎有點不同步,沒有什麼大不了的。 只需重新加載瀏覽器 窗口,它應 重新同步,以使左側 文件瀏覽器看上去完全 如終端窗口。 不用擔心。 如果有疑問,重新載入頁面,所以 只要你已經保存的文件。 好。 因此MV也可用於重命名文件。 讓我們來看看 在這份最後的命令。 所以suppose--並且這是 超級常見的,也很早。 有些學生偶爾創建一個文件 所謂的,讓我們say--什麼別的? 像“WATER.C。” 所以,我就吆喝,為 沒有任何理由,全部大寫。 但是這不是 正確的文件名, 如果僅僅是因為我們的問題集 規範沒有告訴你 將文件保存為全部大寫“WATER.C。” 相反,我們預計 小寫的“water.c”。 而且,事實上,這是 問題的,因為check50, 你要去一個程序 在的問題,以滿足 設置一個自動測試 你的代碼的正確性 是要罵你,如果它不能 發現在所有的小寫字母“water.c”。 所以我需要解決這個問題。 因此,許多不同的方式來 做到這一點,其中第一個 需要控制或右鍵單擊 文件名,只需要改變重命名。 完全好這樣做。 但同樣,今天,讓我們 做一個小票友。 讓我們用MV來改變 “WATER.C”到“water.c”。 所以,你還可以用第一個參數 將其重命名為第二個參數 如果第二個參數是不是在 事實上,文件夾或目錄名。 好吧。 最後,一點點trick--所以我在 此刻我的工作區目錄。 如果我想進入PSET之一, 我當然可以鍵入“cd PSET1。” 但它是如此繁瑣的輸入“PSET1”或 長文件名或目錄名 仍然。 所以,很多時候在Linux中,有什麼 你能做的就是開始輸入“PSE” 和剛剛獲得無聊,打標籤,並讓 計算機數字出來給你。 超級有助於進入這個習慣。 唯一的缺點是,如果你有 啟動多個文件或文件夾 以字母“P”或 “PS”,你可能有 鍵入前幾個 電腦知道該怎麼做。 瑪麗亞:我們喜歡的快捷鍵。 DAVID馬蘭:這將 為您節省了很多時間。 而且,正如我們所說的講座,你 可以在歷史上滾動,上下, 找最近執行 命令,以及。 好吧。 所以,現在,讓我們把注意力轉回 以一個簡單的程序,你好世界。 因此,我們完全編譯這一點。 而現在,我們為什麼不拿 看看數據類型 然後從一些過渡 相應的划痕塊C. 瑪麗亞:真棒。 所以,現在你已經開始 C語言編寫程序, 我們將開始討論 有關數據類型和變量。 因此,某些數據類型,你 想知道從現在開始 是那些是 以藍色突出顯示。 因此,我們有INT第一, 它代表的整數。 而持有整數,因為你 可能具有guessed--所以1,2,3, 和任何其它整數 你能想到的。 DAVID馬蘭:而且也不利。 瑪麗亞:而且還消極的,是的。 和0。 然後我們有花車,其中 是浮點數。 所以這是所有的實數 有小數點。 所以5.0,5.2,並且甚至更 小數點後的數字, 同時,也是消極的。 然後我們有焦炭這是一個字符。 因此,我認為我們談論 這在今天的講座。 但是,我們有字母,example-- A, 乙,C--可以存儲作為char。 但是,我們有更多的符號 可以存儲為char。 而這些被存儲為ASCII。 然後我們有布爾, 這是布爾值。 而那些評估為True或 假或1和0。 DAVID馬蘭:重溫使 布爾來自CS50庫。 所以,它沒有內置到 C,但它的超級有用 以具有真假的概念。 而且即使你 可能think--有趣的事實。 布爾技術上需要多少位, 確實,表示真與假? 多少位,你認為 你需要,最大限度地? 是啊,只有一個。 所以,事實證明,Ç 不能給你只是一個位。 度量的最小單位 你可以為8。 所以這是一個有點浪費他們你 使用中的整個字節或八個比特, 代表真或假。 但是,這只是它的方式 由CS50庫中實現C語言。 瑪麗亞:然後那些我們 不是要談論的廣泛 右now--雙, 這是更大的浮動。 龍多空 還可用於整數。 DAVID馬蘭:的確。 在PSET一個黑客版, 我們實際使用很長很長。 但對於標準版, 它不應該是必要的。 瑪麗亞:酷。 好。 所以operators--你應該 可能熟悉其中的大多數。 此外,+;減法, - 。 對於乘法,我們有*。 所以不是在X,我們平時使用。 事業部,我們有反斜杠。 和模是我們最後的運算符 我們要談論現在。 這是一個運營商,使我們能夠 拿一個除法的餘數。 因此,如果我們有4%2,4分 由圖2是2用的0剩餘部分。 所以4%2為0。 4%3是1。 4%,5 4,你可能已經猜到了。 請記住,當使用所有這些 經營者利用PEMDAS規則。 DAVID馬蘭:所以要清楚,如果你 做4%2,為什麼是0,到底是什麼? 瑪麗亞:因為4除以 圖2是2用的0剩餘部分。 因此,模給我們,剩下的作為 反對分裂的結果。 DAVID馬蘭:事實上, 我們會發現這是很有幫助的 為是,在一些問題 這並不一定是, 如果你想擁有 限制自己的作用 一個數字範圍 像0到的東西, 您可以使用模環繞 早於像2十億 或四十億值 我們已經談到了講座。 瑪麗亞:是的。 即使在“貪婪”我們可能。 DAVID馬蘭:是的,在 問題集之一,也是如此。 瑪麗亞:是的,不錯。 DAVID馬蘭:好的暗示。 瑪麗亞:對不起。 布爾expressions--所以 布爾型的操作, 我們要談的所有 這些是你在這裡看到。 所以現在,我們有兩個 等號列出的平等。 因此,這些都是進行比較。 到目前為止,我們只看過一等號。 這時候,我們分配 一個值的變量。 因此,如果我們已經看到INT N = 5,則 我們給5到變量n。 但是,如果我們想用==進行 相比之下,我們可以檢查如果n == 5。 而如果n == 5,那麼這是真的。 所以布爾運算符 讓我們,基本上, 評估布爾 表達式為真或假。 所以沒有equals--我們有 感嘆號和equals。 因此,我們也可以查看如果n 不等於5--因此n!= 5。 小於,小於或等於, 大於,大於或等於, 然後我們有邏輯 與和邏輯或。 而那些讓我們能夠評估 多個布爾表達式一起 基本上走到一起 一個完整的布爾表達式。 因此,如果我們想找到一個號碼,說: 大於5但小於15 與此同時,我們將​​使用 邏輯AND運算,以查看是否n是 大於5 &&Ñ小於15。 DAVID馬蘭:在這裡, 同樣,它真的很容易 早早就意外 只使用一個單一的符號 或單豎線。 並希望編譯器會 罵你,因為他們實際上 具有非常不同的含義。 對於那些好奇,他們是 用於位運算, 操作上的各個位。 但是,你想對他們在這裡。 和超級重要的是, 第一個,等號, 這是運營商的平等作為 反對賦值運算符。 瑪麗亞:與豎線 位於刪除和收益之間。 DAVID馬蘭:是的。 在一個典型的美式鍵盤。 瑪麗亞:是的。 因此,讓我們直接進入 條件語句。 在刮,你 已經看到,大概, if語句,讓您 檢查如果事情是真的,那麼 做別的事情。 所以,你可能會想 檢查你的精靈是 接觸一些其他的精靈 或者你的屏幕邊框。 然後你可能會想 結束遊戲或做其他事。 這樣的語法說 是“如果(條件)。” 所以,如果你的精靈是感人的東西, 然後要做的就是花括號內。 然後我們有if-else語句。 否則讓我們做一些事情 如果條件我們 在開始時檢查是不正確的。 因此,如果精靈的觸摸 邊境做到這一點,否則做其他的事情。 因此,否則做別的事情。 然後我們有一個簡單的例子這一點。 因此,如果(military_time <12),我們 想給printf“早上好!” 否則我們將 printf的“晚上好!” 基本的例子。 DAVID馬蘭:好。 瑪麗亞:酷。 所以現在我們有switch語句。 交換機一般都能發言 讓我們做了很多同樣的事情 我們剛才講 有關使用if語句。 例如,現在我們有 switch語句的一般形式 這使我們能夠 一個變量調用ñ 並比較了很多 不同的值,在這裡我們 呼籲CONSTANT1,CONSTANT2。 我們可能有更多的。 而那些被稱為案件。 因此,如果我們有一個開關 statement--這個作品 僅用於integers--我們有一個 變量在這種情況下n值。 如果變量n是 等於CONSTANT1,我們 將執行一些代碼段 或者說,我們想要做的事情。 然後我們將打破。 因此,突破意味著, switch語句 將停止,如果執行 n等於CONSTANT1, 然後你的程序將繼續進行。 這將退出的出 switch語句,它會 繼續做別的事情。 然而,如果n不等於 CONSTANT1,然後案例CONSTANT2 將被檢查。 因此,如果n等於CONSTANT2,其他 的代碼段會被執行。 然後它會打破 如果這是等於它。 然後我們就可以有also--不 不一定,though--默認的情況下, 如果n不等於將發生 任何你所列舉的案例。 與在默認的情況下,我們還 不需要休息不一定 因為switch語句就知道了 它需要的默認後結束 情況下,如果是這樣的話。 DAVID馬蘭:但在風格上, 我們始終把它放在那裡。 瑪麗亞:是的。 DAVID馬蘭:是的。 因此,特別是在開始的時候了, 尤其是在那些較少 舒服,我會親自 只是建議堅持與IFS 和IFS-別人的和的if-else-IF-別人的 等等,如果僅 因為他們是一個小 更直接。 這是一個很好的優化,或者 有時甚至是美學上它 使得代碼更易讀。 而事實上,可能 期中,我們將看到一個問題 設置它只是看起來更好 並且更容易閱讀的人 通過使用switch語句。 不過不要擔心 執著於這個為時尚早。 瑪麗亞:是的。 如果你有if語句很多, 它可能只是不是很可讀。 它可能不是非常快 讓你通過它。 所以,sw​​itch語句可以 是非常有用的,也是如此。 而且,不要remember--不 忘了把休息時間在那裡。 DAVID馬蘭:不記得這一點。 瑪麗亞:因為這樣你可能會下降 通過從一個案件到另一個。 所以我們可以說這種情況下CONSTANT1 沒有一個break語句在裡面。 然後,我們可能告吹 裡面的情況CONSTANT2。 同時,我們也不想這樣做,如果 我們已經達到的情況下CONSTANT1 它是等於n。 因此,例如,如果我們有一個可變 n表示包含一個類號, 我們希望看到什麼 如果n等於50級的is--, 我們要打印“CS50是 計算機科學導論一。“ 然後,我們要打破。 就是這樣。 然而,如果n等於 51,我們將 打印“CS51是介紹 計算機科學II“。 然後,再次,我們要打破。 但是,如果那麼我們就把124,61,任何 你可能會想其他的號碼, 或程序是不會 認識到這一點。 因此,它會說,“對不起,我 不熟悉的類。“ 而這將打破。 DAVID馬蘭:所以你真的可以看到 中頻,否則的話,其他人的想法在這裡。 這只是不同的語法 表達完全相同的想法。 瑪麗亞:沒錯。 現在,我們有我們的三元運營商。 因此,三元運營商 3 parts--的條件, 事做,如果 該條件是真的, 然後事做 如果該條件為假。 所以你看,基本上, 的是,這裡的語法。 我們有問號, 那麼the--我們怎麼叫呢? DAVID馬蘭:結腸。 瑪麗亞:結腸。 謝謝。 抱歉。 因此,讓我們來看看我們的榜樣 看看我們是否可以this--感 class_num == 50。 所以在這裡,我們看到我們的布爾運算符== 用於比較變量class_num 50。 所以class_num存儲的整數。 如果該整數 等於50,那麼我們 將存儲“大衛·馬蘭” 裡面的字符串教授。 如果班級人數不 等於50,“不是大衛·馬蘭” 將是教授。 DAVID馬蘭:謝謝。 因此這似乎相當於 什麼,你會說,乍一看? 瑪麗亞:對我來說,似乎 像if-else語句。 DAVID馬蘭:是的。 而事實上,這是一種 一個漂亮的單行的, 可以這麼說,對於實施 究竟邏輯的if-else 但這樣做的一切一步到位。 瑪麗亞:沒錯。 是啊。 所以if-else語句可能 佔用了大量的空間。 他們可能是太長時間 一些簡單不過的了。 因此,這可以是非常 簡潔,非常漂亮。 所以,現在我們正在進入觀察 一次又一次地執行一些東西, 所以檢查的 條件多次 然後繼續做一些事情 而條件為真。 因此,這給我們帶來了 很好地進入while循環。 到左側,我們有 我們的第一個while循環。 因此,雖然事情是真的, 一次又一次地做一些事情。 所以一定要注意,我們的 條件這裡在頂部驗證。 而我們的我們稱之為第二loop-- 這一個做,而loop--我們做一些事情, 然後我們檢查的條件。 如果該條件 仍然是真實的, 我們再回去做的事。 這樣的主要區別是,其中 該條件檢查。 以及碼可能永遠 執行如果條件不 真正的while循環。 而隨做,而 循環,我們有碼 即至少要執行一次。 然後,當條件 仍然是真實的, 我們可以回去裡面再次重複。 那麼,為什麼你認為我們會用 一個do-whil​​e循環在while循環? 對。 因此,如果我們想提示的 用戶對某種類型的輸入, 如果我們要問他們 輸入他們的姓名, 我們希望至少讓他們一次。 如果他們確實進入 這個名字,我們不 又要問他們 因為我們已經知道了。 但是如果它們不進入 他們的姓名,或如果他們 進入東西是 顯然不是一個名字, 我們還是要繼續 要求他們對自己的名字。 DAVID馬蘭:而在演講中,我們有一個 像這樣的得到正INT 例如,那裡什麼也沒有到 首先檢查一下,因為你甚至還沒有 得到一個int。 所以我們想要做的this-- 您可以通過user--一個int 然後檢查一下,也許, 一遍又一遍又一遍。 瑪麗亞:沒錯。 對於loops--確定。 For循環可以讓我們做的差不多 同樣的事情,也是如此。 它實際上是完全一樣的東西。 因此,有沒有什麼 您可以為循環做 你將無法 做while循環。 但對於循環可能看起來有點 更多的複雜語法 因為它們具有 三個部分裡面有什麼 是以前只是 條件與while循環。 因此,第一個部分,你的大海, 最左邊的,我們有“INT矮人= 0”。 因此,這是我們 初始化我們的變量。 然後我們有一個分號 和“矮人<7”。 因此,這是出 條件實際上是。 所以,這就是我們將有 把剛剛在同時loop-- “而矮人<7”。 這裡,雲在 中間我們的for循環。 因此,“dwaves <7”。 然後,我們的最後一部分是“矮人++” 這就是我們更新我們的變量。 所以,最重要的事情 要知道的是,這 是要通過這個循環 七次並執行七次。 因此,我們有七個 矮人,和他們都 會說,“我在這裡 幫你,白雪公主“ 因為他們已經準備好 幫助白雪公主。 隨著while循環,我們會做 初始化和更新 滿足條件內,再次,但 之前或while循環中 確保we--因為 我們總是需要的部分。 因此,為了確保我們有 他們,我們會一直還增加他們 上,只是沒有在括號內。 DAVID馬蘭:所以它看起來like-- 在講座中,例如, 我幾乎總是使用一樣,我和 n和很無聊的變量。 它看起來像您可以使用更多 巧妙地命名變量了。 瑪麗亞:是的,它實際上是非常好的 使用多一點的描述變量 因為特別是如果別人是 讀你的代碼 - 也許你是平地機 或者如果你合作 與somebody-- 你要確保他們 了解你在做什麼。 好。 因此,這是一件很funky-- for循環內的for循環。 我不知道,如果我們之前已經看到了這一點。 可能不會。 但是,我們其實可以有this-- 如此循環,而不是循環。 所以想也許走沒有人 我穿過這是怎麼回事嗎? DAVID馬蘭:我要一刺。 瑪麗亞:酷。 DAVID馬蘭:OK。 因此,spoiler--我們要打印的東西 這是在底部右下角 那裡。 瑪麗亞:對。 是啊。 DAVID馬蘭:所以我們剛剛 把該樣品的輸出存在。 因此,我可以從推斷 你是最上面的循環 迭代行 最外層循環,可以這麼說。 而你遍歷 列與最內層的循環。 直觀地,這 應該有希望才有意義 因為性質 每一個我們所看到的節目 之前,printf的,這是 功能我們使用,最終, 有打印的東西的能力 出基本上逐行。 象,一旦你輸 一個新的生產線,有 沒有加倍背部和打印的東西 在屏幕更高,至少 不是用printf這樣。 所以在這方面,它使 某種意義上說,最外層循環 應該是指各行 因為對於每個給定行, 你會想 打印出XXXXX,然後 移動到下一行,XXXXX。 因此,行是第一位的。 然後在每個 行,你打印的列。 如果你想做到這一點 相反,它可能不會 出來,你打算。 瑪麗亞:是的。 我們只是不能回去 上一行用printf的。 DAVID馬蘭:這有什麼有趣 按今天的大約範圍聊天, 實際上,是該行是一個int 該公司在最上面的循環聲明。 但是請注意,它仍然是 內部,可以這麼說, 大括號的 緊隨其後, 即使它不是技術上 在這些大括號內。 因此,行範圍為 代碼片段的全部, 兩外循環內 與內循環的內部。 但與此相反,在那裡 是列在範圍? 可變列? 是啊,只有在裡面循環。 這沒關係,因為我們沒有訪問 它的花括號外面。 我們所要做的就是打印出新 線在最後出現。 所以,實際上是確定。 因此,這具有這樣的效果,它看起來像, 的操作的三行和四列。 瑪麗亞:對。 所以首先我們通過我們的第一行。 而就在我們的第一行,我們做的 四列的第一行內。 因此,我們打印出四個X的。 然後我們就可以退出循環,因為 我們已經印了四X的。 我們打印新的生產線。 然後我們經過 同樣的過程兩個行 使一共有三個。 DAVID馬蘭:而且值得注意的是 字體的只是一個假象,事實 樣品輸出 似乎如此多高, 好像還有更多 行比列。 但它只是因為X 高度大於寬。 這一切發生的事情有, 加上線之間的空白。 瑪麗亞:對。 涼。 DAVID馬蘭:好的。 因此,快速瀏覽一下問題集之一, 採取任何問題,然後宣布休會? 好吧。 因此,在問題設置一個,還有三個 主要挑戰,大勢所趨。 但首先,你會發現 這個問題集 說明書中,作為與許多 pset時,今年秋天,是要帶你 通過一些熱身練習, 你指出了幾個資源 你可能會或可能 沒見過了。 例如,CS50 擁有一套短褲, 這是短視頻, 沒有什麼不同這一點,但該 很話題specific-- 也許五分鐘, 長度為10分鐘的循環或 上條件或算法 或更高版本的更多 先進的主題,也是如此。 而我們一般嵌入 這些成難題 集使學生 有哪些資源 審查可能具有材料 已經來在演講或部分。 但是,這樣一來它更集中 更在他們的指尖。 我們也往往在問題嵌入 集東西叫做演練。 因此,幾乎所有我做的例子 在講座中,這裡的舞台,我們也 在已經拍攝的攝像頭 推進更慢, 更貼心的演練由我的 我的筆記本電腦的代碼,一行行 因此,在課堂上,我們經常會 脫脂通過某事或某人 將與插 回答的一個問題。 但它並不一定下沉 在每個人的觀眾。 所以,你會發現代碼走查 對於大部分的實施例 我們在這裡做演講,讓你 可以通過它按照自己的節奏走 快退或快進或 完全跳過,如果你願意的話​​。 經常會有一些 熱身問題,這 請你進行排序 強化這種材料 並確保您舒適前 你繼續處理器集的其餘部分。 然後,當然, 有處理器集本身。 和的事情之一 我們很刻意 做CS50是幾乎每一個無趣 或智力無趣 機械的步驟, 你可能需要做的 幾乎總是非常有據可查。 在長期的過程中,我們將 開始提出更多的反問句 像記得如何做這做那? 但通常情況下,你會發現 該習題集給你 通過力學 東西使 有趣的,智力的挑戰 最終都是留給你的學生。 隨著中說,Zamyla,我們向他 不停地談到今天的講座, 是我們長期的工作人員1 成員誰也持有演練 像馬里奧特定PSET問題 和貪婪,雖然不是水這一年。 而且它是在那些 演練,她經常 提供了一些提示和技巧 如何進行,從來沒有告訴你 到底該怎麼做,但 rather--像的狀態下, 如果你will--給你至少一 幾個想法,這樣就看你的, 最終,決定 如何接近他們。 瑪麗亞:有點像一個高層次 邏輯的理解是什麼 我們要求你這樣做。 DAVID馬蘭:沒錯。 而且,事實上,Zamyla的 演練旨在 經常回答 在那裡問到的問題 我開始了,特別是當 這些長規格 有點令人生畏給所有的文字 和圖像,他們有他們。 所以water.c,你會發現 你已經完成後, 實際上是相對簡單的。 絕對是一幫 你要一鼓作氣 靠在牆上你的頭試圖 弄清楚為什麼它不編譯 或者為什麼它沒有運行正常。 但是,一旦你完成 它,一旦你 花一些時間與任何摔跤 那你可能有缺陷, 你會發現,它的 在很短的程序。 它可以在短短幾分鐘來完成 行代碼,其中大部分 我們在這裡看到的講座已經,如果 你組裝正確的積木。 正如我們建議 在這裡,它會問 您可以指定多少分鐘 有人走在校園裡洗澡。 我們在這個問題說明 設置流動水的速率 在一樣,低流量的淋浴 頭,很像宋飛夾 我們昨天看到或 相反物。 然後你只需要 做數學了一下, 用C來告訴really--算術 我們知道有多少,大概,瓶裝水 就是相當於,如果我們 採取一個n分鐘的淋浴。 現在,在mario.c,這是去 要稍長程序。 它仍然不會長期是這個。 短短幾行比water.c更長。 但是,這將是機會 重現老同學馬里奧 從超級馬里奧金字塔 兄弟或者一些後續。 它不會看起來更漂亮 或者豐富多彩的作為一個人也沒有。 我們只是用很少的#標籤 像我們這裡在屏幕上 使用ASCII文本。 但是,這將接近同樣的想法。 而且這將是一個 鍛煉第一眼 似乎只是很simple-- 打印一個簡單的金字塔。 但是,有一對夫婦的特點 在這裡,很有意思。 請注意,最右邊邊緣 金字塔實際上有寬度兩種。 因此,有兩個相等 身高列,這 使得它需要一點點 思想位,使 確保你得到了完全正確的,因為 而不僅僅是一個完美的角度的 線。 所以這是一個有點角落案件 但比賽的實際比賽。 而且,這也是非顯而易見的,在第一 一目了然如何打印空白。 所以,當我看 示例輸出這裡 - 而且它也是在spec--它 那種看起來像一個矩形, 但一個對角線的 矩形已經砍掉了, 它只是空格,可以這麼說。 所以,一個經常被問到的 這裡的問題是一如既往的好, 我怎麼動的#標籤 到正確的? 或者,我怎麼打印空白? 它實際上更容易 比大多數學生認為。 對? 你可以通過可視化地接近它 按下空格鍵一次或兩次 或三次。 因此,即使與我們的printf幾乎 總是打印出一個字符串或一個int 或者像“你好一句話, 世界“或一系列字的, 你也可以只打印 報價,空間,引文結束。 這實際上給 你一個空格那裡。 所以記住這一點,並 不overthink這一點。 你真的要 決定逐行逐行, 沒有什麼不同的例子 剛才,有多少的 列應該是白色的空間和 有多少人應該是井號標籤。 這將需要一些時間,但它的 各種各樣最終邏輯謎題。 瑪麗亞:是的。 但再逐行邏輯 是要在這裡是非常有用的。 DAVID馬蘭:是的。 我想示例代碼,你gave--甚至 雖然這不是一個完整的程序。 您還需要int和主 和無效的和的#include stdio.h中, 很多從演講的東西。 但積木 似乎是在那裡。 然後最後是什麼 多一點的算法。 所以,事實證明,任何時候你 進入CVS或便利店 有人遞給你的 出納票據或硬幣的變化, 事實證明,他們,人類, 不管他們是否意識到這一點, 可能正在使用什麼 所謂的貪婪算法, 因此,如果你欠,說,$ 21日 在變化,因為出於某種原因 你買東西很便宜 與CVS的一個非常大的法案, 這將是非常煩人,如果 收銀員給你21單曲,更有甚者 然而,一大堆硬幣。 相反,什麼是合理的人 可能要做的是他們要去 搶$ 20,然後$ 1鈔票,和 交給你只有兩個法案在這種情況下。 瑪麗亞:所以他們正在尋求減少 他們給回你的變化。 DAVID馬蘭:沒錯。 而同樣的處理硬幣,以及。 如果你欠,說,$ 0.50, 希望你不想要50便士。 你不是想要兩個 宿舍,例如。 現在,這確實承擔 該出納員具有 足夠的每一個教派的 他或她可能想給你。 但是,我們讓你承擔 盡可能多的問題。 和目標,最終是 在C代碼實現貪心算法。 因此用戶被允許 在鍵入多少 改變他或她是欠與美元 而仙,某種浮點 值可能。 然後你需要做的數學和 弄清楚算法,好了, 有多少硬幣,我可以給 你最少給你 正是這樣的變化量。 但是,將是一個 這裡幾個棘手的部分,對吧? 像有全 不準確的問題。 瑪麗亞:沒錯。 因此,浮點 值具有不精確。 難道我們談論這個講座的今天? DAVID馬蘭:我們做了 最後一次演講。 我們談論的不精確性。 而你不想欺騙用戶 多少變化,他或她是欠。 這樣一來,演練,在 問題設置規範, 想一想,最終以 你如何減輕這些不精確 錯誤,有可能。 這是可以避免的,當然,對於 我們談論的投入。 而且,事實上,pennies-- 也許我們會推遲到Zamyla, 我想,對於花樣那裡。 所以,最後,你會發現一個 問題的進展,本週, 其中第一個是非常小的, 然後介質,然後一點點大。 但是,所有的人都使用的建築 從過去的這個星期塊, 從這個超部分, 問題設置規範 讓你在無數的資源。 但儘管如此,如果在所有掙扎, 尤其是那些不舒服 沒有事先的背景下, 來到辦公時間 在週一和週二和 週三和週四。 進入CS50通過討論 課程的網站, 通過它,你可以聊天 與工作人員和同學們。 但最終,我認為, 最好的建議是剛剛起步早。 它不是那種類的,你 要在週三開始的pset 晚上,或者更糟糕的週四晚上。 瑪麗亞:我最好的建議是 已經開始在星期一。 DAVID馬蘭:週一。 所以,如果你還沒有開始already--沒有。 但是,即使沒有星期一,然後週二。 越早越好。 而這就是原因 當然,有這麼多晚天 給你一個有點 心理壓力 應儘早開始,但仍讓 事情滑,當事情需要更長的時間 比您預期的。 瑪麗亞:你想利用 辦公時間盡量您也可以做到。 DAVID馬蘭:有什麼問題? 好吧。 那麼,我們為什麼不這裡休會?