[Powered by Google Translate] DAVID J.馬蘭:好吧,這是CS50,這是 結束第1週,所以研究卡的總數 同學,你今年是745。 我們很高興能有這麼多的過程中, 這學期,但即使這個過程是如此之大, 認識到,它的這些事情,比如週五的午餐, 辦公時間,15人的部分,等等, 真正的意思創造這更親密 環境。 因此,即使我們可能會收集每週一次或兩次,在這裡 桑德斯知道這麼多你的經驗,在此過程 非常動手的同時,你的同學 和師資隊伍建設。 所以,在這裡,我們走了,秋天2012年。 所以,記得我們最後一次上記下結束 不精確,談論的數字表示。 同時,我們也發生的故障之一,在 現實世界中,當它來到誤解 計算機如何工作。 那麼,今天我們將重新審視這些想法另一個 繼續我們的討論的CS50客戶端的 和C,這意味著什麼真正的程序。 但是,第一,只是一對夫婦的旋風公告。 節本週日開始的第一週始終是一個 位的快速啟動,因為我們剛剛在 您的截面形式。 我們正在做的是相同的,現在的教學研究員,現在 他們知道他們的日程安排,所以我們的目標是,通過 星期六的早上,跟進你與你的部分 轉讓和TF。 要認識到,他們就會開始第二天,週日 週一或週二。 然後,我們將容納部分出現的變化,因為他們 在未來的日子裡。 辦公時間,同時,再次,今晚8日下午至11日,在 安嫩伯格,以及明天晚上。 即使問題集一般是由於上週四 中午,意識到你有五遲花, 因此,可用性,星期四辦公時間 你的現金在那些已故的日子,因此,提交 上週五的東西。 讓我從頭開始更多的樂趣之中,其中 更低調的習題集。 我會掛到那些遲交天數,在戰略上,只 在本學期後,當生活開始得到的方式 期中考試和其他類。 問題1,同時,將發布在球場上的 本網站將在課程的步行路程, 通過視頻,這將被拍攝下來,在上週五下午2點30分 然後在網上發布的第二天。 因此,我們於週一結束。 我想 - 實際上,注意這裡。 由於類 - 因為,桑德斯並不完全借給 本身以休閒Q&A回,來回非常好,我們 要嘗試一些新今年,據此, 如果你不舒服提高你的手或你只是 寧可不要這樣在一個房間裡,舉起你的手 我們將有一定的教學研究員和CA 在演講的人員編制cs50.net/discuss。 所以,如果你有一個問題,因為我完全 一些不清楚的東西或你很好奇 主題,嘗試張貼在那裡。 標記,它與標籤的演講,我們將竭盡所能 今天和下週 - 我們就會試試這個 - 到外地 無論是電子,網絡,或者如果它感覺就像是我們應該 真正解決這個集體,教學研究員之一 CA將提高他們的手,問 匿名您的代表。 所以,我們可以給它一個嘗試,看看它的原理。 但是,通過各種手段,不斷舉手,你想。 所以我們最後一次發現,10%的十分之一, 事實上,0.1,就像你教多年以前。 其實,這樣的值。 但是這還不是全部都是真實的,對不對? 我們只是有這樣的約束,在計算機,據此,如果你 只有在有限的記憶體,RAM,或更多 特別是位很好,有只有有限數量 的事情,你可以代表。 例如,如果我們的零的個數,我們要 代表二進位,8位,位, 又是一個0或1,我們可能會 它表示為00000000。 這是一個有點不必要的冗長。 就像在現實世界中的十進位制, 一般地,如果你想要寫的編號為123,我們 人類也許並不即使寫00000123, 功能,這是完全一樣的。 我們只是刪除前導零,可以這麼說。 在二進制中,我們可以做的是一樣的。 二進制零,零和二進制為零。 你只需要一個單一的位。 但同樣,最常見的在世界上的度量單位 的計算是字節,8個位。 僅僅因為一個位,好看不中用。 八位,而不是非常有用的,但至少,它更重要的是 有用的度量比一個單一的單元。 因此,用8位,我們通常會代表的二進制文件。 所以,在這裡,我們有數字零,一,二,那麼,作為 內特在我們的視頻最後一個星期三,我們可以繼續 向上計數到7,8。 然後,如果我們使用越來越多的位,我們 可計數到無窮大。 但是,如果你只有有限數量的這些位,因為是 任何計算機系統中的情況下,甚至導彈 系統,很好,你確實只有一個 有限數量的精度。 所以,如果你想代表的數字(如0.1),以及, 電腦挑選。 並且如果它僅具有有限數量的數字,它可以 代表,它可以接近0.1,但它不能 一定給你正是你想要的值。 而這僅僅是一個電腦的挑戰, 引擎蓋下的,令人欣慰的。 在本學期我們得更遠,這些較低的水平 變得不那麼有趣的細節,但可以肯定的 運用這些思想可以有一些非常現實的世界 的後果。 一個是一點樂趣。 你們有多少人看到了驚人的電影的辦公空間嗎? 如果你還沒有,那是你的非官方 功課的一周。 但是,在辦公空間中,研究人員在那部電影 優勢,正是這種想法,但他們實際上偷 從另一部電影,你可能有 可見,甚至幾年前。 因此,讓我給你幾秒鐘的這個預告片 這個驚人的電影,這是非常 學術有關。 [播放影片] 其實,我被提拔。 我可以編寫一個病毒,它們會撕裂, 將大的時間。 那麼,它是如何工作的? 每當有一銀行交易的興趣是 計算,每天有成千上萬的計算機結束 這些不足一仙。 但我不會做任何違法的事情。 非法?薩米爾,這是美國。 你必須向上帝發誓。 如果沒有人知道這一點,但我們,所有的權利嗎?沒有家人,沒有 女朋友,沒有人。 [聽不清]。 不要擔心,人,我不會告訴任何人,無論是。 [電影結束] 好吧,也許我比大多數人更好地發現這部電影 這裡的人,但在任何情況下,他們的病毒 努力創造 - 在電影中,隨時會打電話給一些病毒, 它通常不是真正的病毒。 這只是有人寫了一個程序,做一些事情。 在這種情況下,球員試圖寫一個程序 趁著他們的公司叫Innotech公司的 計算系統,從而計算機,也一樣,甚至當它 說到錢,可不一定 正是代表錢。 因此,即使你可能有您的銀行帳戶0.10美元, 0.10,好了,電腦實際上可能會認為你有 這美分,在您的銀行帳戶。 所以這些人是有志於做的 - 和他們 偷的想法,事實證明超人III,其中 理查德·普賴爾做同樣的事情 - 他們基本上是 編寫程序,渴望採取一切尾隨 號,所有的微小的,微小的,微小的分數 便士,及虹吸關閉,因此人類 想,哦,這是唯一的0.10美元存在,但所有這些 尾隨數字,最終增加。 因此,一個絕妙的主意,它事與願違歡快的, 尤其是電影。 但在現實世界中,也有更多的關於 這些事情的影響。 的原因之一潛入計算機領域的 再次,是科學,其適用性不 僅工程科學,但只是為了 其他領域。 因此,這是一個不太輕鬆的看看什麼可以去錯了,但 這也是相當睜眼,我認為,當涉及到 如何準確理解無所不在的技術,如 計算機和編程這些天來, 的軟件的形式。 因此,這下一個剪輯是剛剛約為6分鐘,繼續 最後一次我們離開的地方,但讓我們看看一點 在這樣一個對這些問題的深入。 讓我跳到我們離開的地方, 這是在這裡。 我們有兩個部分,約六分鐘在這裡。 [播放電影] 困擾現代火箭技術。 在1991年,開始第一次海灣戰爭中,“愛國者” 導彈經歷了類似的種 數字轉換問題。 而作為一個結果,20人,20名美國士兵被打死 約100人受傷,“愛國者”,這是應該 以防止傳入的飛毛腿導彈, 沒有發射導彈。 在伊拉克入侵科威特,美國發動的沙漠 風暴在1991年初,愛國者導彈 從伊拉克部署,以保護沙特阿拉伯和以色列 “飛毛腿”導彈的襲擊。 “愛國者”是美國的中程表面空氣系統, 由雷神公司製造。 “愛國者”攔截器本身的大小,它是關於 大約20英尺長,重約2000磅。 它攜帶的彈頭,約 - 我認為這是大約 150磅。 和彈頭本身就是一種高爆炸藥, 它周圍的碎片。 像霰彈的彈頭外殼的設計。 該型導彈進行4每個容器 半拖車運輸。 “愛國者”反導彈系統至少可以追溯到 20年了。 它最初被設計為防空導彈,以 擊落敵方飛機,在第一次海灣戰爭。 當那場戰爭以來,陸軍希望用它來拍攝 跌飛毛腿“導彈,而不是飛機。 空氣伊拉克隊就沒有那麼多的問題,但是陸軍 飛毛腿擔心。 因此,他們試圖升級“愛國者”。 攔截敵方導彈在5馬赫的速度行駛會 足夠的挑戰性。 但是,在的愛國者被送往服務時,陸軍 不知道的伊拉克修改了他們的 打飛毛腿導彈幾乎是不可能的。 發生了什麼事,是飛毛腿導彈, 未來是不穩定的。 他們搖晃。 這樣做的原因是伊拉克人,以獲得600 公里,有300公里的射程導彈,花 重量的前彈頭和 彈頭更輕。 所以,現在的愛國者的努力來飛毛腿,和大多數 的時候,絕大多數的時候,它會 只是飛的飛毛腿。 一旦運營商“愛國者”系統實現“愛國者” 錯過了它的目標,引爆的愛國者彈頭。 為了避免可能出現的傷亡,它被允許 倒在地上。 這是大多數人所看到的,大火球在天空中, 攔截飛毛腿彈頭和誤解。 雖然,在夜空中,似乎是 在宰赫蘭,成功地摧毀了飛毛腿導彈,有可能是沒有 錯誤關於它的性能。 在那裡,愛國者的雷達系統失去一個曲目 傳入的飛毛腿從未發起因 一個軟件缺陷。 這是以色列首次發現的時間越長 系統上,更大的時間差成為, 由於系統的計算機中的嵌入的時鐘。 在慘劇發生前大約兩個星期,在宰赫蘭, 以色列國防部報告說, 系統失去的時間。 經過約8個小時的運行,他們發現, 制度越來越明顯不準確的。 國防部回應,告訴所有的 愛國者不會離開系統 很長一段時間。 他們從來不說,很長一段時間 - 8小時,10 小時,千小時。 沒有人知道。 在宰赫蘭的軍營駐紮在愛國者 有問題的內部時鐘已經超過100小時 二月25日的夜晚。 它跟踪的約十分之一秒的精確度。 現在的十分之一,二是因為一個有趣的數字 它不能被以二進制表示,完全相同,這意味著 它不能被正好在任何表達 現代數字計算機。 這是很難相信。 但使用這個作為一個例子。 讓我們來數的三分之一。 ,究竟有三分之一不能以十進制表示。 三分之一是0.333是無限的。 有沒有辦法做到這一點的絕對精度十進制的。 這也正是同樣的問題發生在 “愛國者”。 系統運行的時間越長,成為時間更糟糕的錯誤。 運行100小時後,時間中的錯誤是只 大約三分之一的第二個。 但在5馬赫的速度行駛在導彈的目標, 這導致跟踪誤差超過600米。 在宰赫蘭的士兵,這將是一個致命的錯誤。 現在的情況是飛毛腿發射檢測預警 衛星,他們知道,飛毛腿在他們的 大方向。 他們不知道有人來了。 這是現在的愛國者的雷達組件 系統,保衛達蘭,定位和跟踪 來襲的敵方導彈。 該雷達是很聰明的。 實際上,你會跟踪的位置,飛毛腿,然後 預測它可能會是今後一段時間 雷達發出一個脈衝。 這是所謂的的範圍內的柵極。 然後,一旦決定有足夠的時間已經過去了,去愛國者 該檢測到的備份和檢查的下一個位置 對象,它可以追溯到。 因此,當去到錯誤的地方,然後看到沒有 反對,並決定,有沒有對象。 這是一個虛假的檢測和下降的軌道。 傳入的飛毛腿從雷達屏幕上消失。 幾秒鐘後,砰的一聲走進軍營。飛毛腿 殺害了28和發射過程中是最後一個 第一次海灣戰爭。 可悲的是,更新後的軟件在宰赫蘭 次日。 而軟件漏洞已被固定,關閉中的一個章節 多災多難的歷史的“愛國者”導彈。 愛國者實際上是一個縮寫為“相控陣跟踪 攔截的目標。“ 所有權利,更悲哀的結果不太 了解這個世界。 外賣,從電影,真的是該解決方案 有被重新啟動您的導彈防禦系統 每一次在一段時間內。 如此反复,這門課程的目的之一,當然 一種更謙遜的規模比這些應用程序, 真正的開放究竟如何,你去了解每個人的眼睛 使機器做你希望他們做什麼,以及你如何去 這樣做是正確的,而沿途做 好吧,優雅,等等。 所以今天,讓我們多一點點,這潛入,但 所以,我們不要走的太快,特別是那些少 舒適,而且還使我們能夠保留的利益 那些更舒適,讓我們迅速開始位 回顧一下其中的一些想法。 再次,要求離開,無論是在個人或網上,如果你有 的問題,所以我們可以讓每個人都在同一頁上。 因此,CS50電器,快速退後一步, 什麼,你自己的話怎麼辦? 這是確定的,如果你不知道那些話,可能是還沒有。 [聽不清] 好了,所以通用接口 - 我們都可以共享。 當然可以。 因此,我們可以,例如,告訴你去一些 網站,下載該軟件適用於Mac OS。 下載該軟件適用於Windows,配置 這條路上。 但現實情況是,我們遇到無數的技術 支持的問題。 這些天,許多正在做什麼的服務器端, 在計算世界中,特別是當它涉及到 Web開發和Web的應用程序,實際上是 經常在Unix或Linux計算機上,而不是 Mac或Windows電腦。 之間有利的一面,那麼,這件事情被稱為 CS50設備是我們將所有具有相同的環境。 因此,每個人都在同一頁上,無論什麼樣的硬件,你 來到校園,但也將涉足準確 同樣的環境下,你會使用朝 學期結束,以及網絡的發展,以及在 其未來真實世界的應用。 因此,更具體而言,CS50電器是免費的一塊 軟件,可以讓您運行其他操作系統, Linux操作系統,在這種情況下,在自己的計算機上,在一個窗口中。 現在,你不能只是下載設備。 你需要一個程序,播放或運行設備。 而這一塊的軟件一般稱為 虛擬機管理程序。 虛擬機管理程序的形式,如VMware的產品, 虛擬保險箱,相似之處。 所有的公司的各種軟件,包括免費的和 商業的一致好評。 你會看到什麼問題說明如何設置1 獲得免費的軟件,用以 執行CS50電器。 一旦你,你就必須在你的Mac或PC上的一個窗口, 一個桌面環境,看起來很喜歡這個, 它在開始菜單​​一樣的東西 底部的左上角。 它有一個Home文件夾,或主目錄,在左上角 在那裡,一個垃圾桶,等等。 因此,我們除了恥笑,因為我們去的必要的細節。 但現在讓我們開始潛入C. 因此,C是這樣的編程語言,精神, 從頭開始,但遠不如圖形,但具有諷刺意味的是,遠 更強大的,一旦你得到它精明。 因此,在C中,我們編寫的程序編寫源代碼,這是 這類似英語的語法,類似的襪子 我們做了示範,最後一次,可讓您 表達自己相當精確,如果 arcanely,到計算機。 那麼,什麼樣的軟件產品,你實際需要 編寫程序的語言,如C,根據我們的 在週一的談話嗎? [聽不清] OK,你只需要一個文本編輯器。 你不需要任何特殊的軟件 本身編寫程序。 你只需要一個文本編輯器(如記事本),在Windows, 文字編輯在Mac上,或稱為gedit的東西,在世界上的 Linux中,我們將在這裡使用。 就是這樣,寫的程序。 但寫作只有一半的方程。 然後,您需要運行它們。 但是,為了運行程序 - 你不能運行的源代碼。 你,而不是必須做什麼它? 是啊。 DAVID J.馬蘭:您需要 編譯它。 而且,別人編譯的源代碼是指 - [聽不清] DAVID J.馬蘭:沒錯。 把它轉換成零和一。 因為我們所有的人,這些天來,有電腦,有CPU的, 幾乎全部是由一家名為英特爾, 英特爾內部,有你的這個大腦內 計算機,稱為CPU。 ,大腦做的事情之一是,它知道 如何理解零和一的模式。 它知道什麼圖案位代表另外,什麼 圖案代表減法,什麼圖案 位代表打印,並創建一個可聽見的聲音。 因此,在短期中,CPU,加上與操作系統, 這是一塊的CPU上運行的軟件, 可以這麼說。 總之,這兩條都知道如何來運行程序, 我們人類寫。 所以,如果我去到CS50電器在這裡,我需要打開 一個文本編輯器,我可以訪問 一對夫婦的方式。 我可以進入菜單,編程, 然後我就可以選擇 - 不,不是的菜單。 我可以去配件/ gedit的打開 我的小文本編輯器。 或者更簡單地說,我可以點擊這個小圖標在底部 左上角。 現在我這裡的環境。 這是非常讓人聯想到的,只有一個簡單的文本編輯器 一個或兩個的差異。 在頂部,光標閃爍,這是 我可以開始寫我的代碼。 在底部的這個東西叫做終端窗口。 我可以做什麼樣的事情在這 所謂的終端窗口? [聽不清] 好吧,我會運行命令。 週一上運行的一些命令,我​​們是一個小 神秘第一,但“列表中的ls,cd命令更改目錄, RM,刪除。 因此,這是一個老派的方式瀏覽您的 電腦,只用你的鍵盤和文本命令, 不大,一般,使用鼠標。 但我們所看到的,用不了多久,這實際上是給了我們一個 多一點力量,其中一個更精確一點 表達自己。 然後在左邊,我們只是去看看, 當我們開始寫作軟件,一個小小的總結 程序,我們已經寫在左上角。 但我們會再次看到,在不久的。 因此,讓我們在這裡做一些比較簡單的。 首先,讓我繼續前進,到文件,保存,我只是 點擊jharvard,在左, 再次,jharvard,我的主文件夾的名稱,我 所有的個人檔案,我現在是約翰·哈佛, 很快就會約翰·哈佛在這樣的環境中。 他有主目錄,我的文檔等等, 我想保存,現在,這個文件中。 所以,我會打電話給它的hello.c。然後,我會去 進取,單擊“保存”,現在我這裡是一個標籤 名為hello.c,這麼多喜歡另一種類型的編輯器。 所以,現在讓我繼續前進,開始編寫程序。 詮釋的主要(無效)。 然後,我只是做了最後一次,輸出,打印的格式, (“你好,世界!” 。); 幾乎可以完成。 但是,我錯過了幾個細節。 從這項計劃中,我真正需要的是缺少什麼 它實際上編譯? 是啊。 [聽不見的? DAVID J.馬蘭:是啊,所以我需要包括標準 I / O庫。 因此,這需要去以上的主,所以我只是要 它有一些空間。 我要去,做#包括。 注意尖括號。 順便說一句,gedit是一個小的用戶友好,如果 有時有點混亂,因為它試圖幫助 眼睛注意哪些行了什麼。 因此,事實上,我的光標旁邊這個角度 支架,請注意它是如何突出等角度 支架加上這一個。 而這只是為了引起我的注意這樣的事實,我 具有對稱性。 對稱的編程通常是一件好事。 同樣,如果我將我的光標到最後,如何通知 花括號,是的,我有一個開放的 和封閉的,可以這麼說。 好吧,我可以做一件事。 這不是絕對必要的,但良好做法,說 返回0。 返回0為我們做什麼呢? 或者意味著什麼? [聽不清] DAVID J.馬蘭,但沒有什麼是錯的。 坦白地說,這是很難的大部分時間去錯在 編程這短暫的。 所以,我只是超級明確的,一切都很好。 我的人,當我運行這個程序時,可能永遠都不會 看到0。 一般來說,這些數字被返回從主 只有撫養他們的頭的人 出現錯誤。 你會得到一個小的彈出提示說系統錯誤,一, 兩個,三個,或任何的數量是 實際上返回。 所以別的問題? [聽不清] DAVID J.馬蘭:這是沒有這麼多的功能錯誤 但一個審美的。 我或許應該有一個換行符 這個字符串結束,所以,我們實際上是將光標移動到 下一行,並計劃只是看起來有點漂亮。 所以,現在讓我走我的終端窗口 和放大。 而這種事情在這裡,這就是所謂的提示。 它只是提醒我,我是誰,jharvard設備, 器具是我在計算機的名稱。 括號中的波浪線,波浪線符號, 代表著什麼? 觀眾:主目錄。 DAVID J.馬蘭:主目錄。 所以,這只是說,你是在一個速記符號 您的個人文件夾中的所有文件的默認位置。 所以,現在,在這裡,我可以輸入ls列表。 我在這裡看到的那一刻唯一的hello.c。 這是很好的,因為我剛才寫的。 因此,讓我繼續前進,不要讓你好。 請注意,我不打字使hello.c的。 相反,我只需要輸入該文件的基本名稱,你好。 做,因為我們看到在週一,也只是推斷,我想 c文件。 所以現在我已經輸入招呼。 現在,我看到這個相當長的命令,並會繼續 看到這一遍又一遍。 但要清楚,鐺,這個詞剛剛出現, 這是實際的編譯器。 Make是一個生成實用程序。 這只是一個更加用戶友好的程序,節省了我, 從長遠來看,鍵入了令人難以置信的乏味的長 這樣的一個命令。 所以,你可以手動運行鐺。 你可以輸入,手動。 只是變得非常乏味的。 ,所以一定要僅僅是一個程序,可以簡化我們的生活, 運行更複雜的命令給我們。 好吧,所以現在我應該有什麼文件 在當前目錄? 不只是hello.c的,但也打招呼。 所以,如果我要運行你好,還記得我說點斜線, 點手段去到當前文件夾,無論你 ,然後運行該程序名為hello的,而事實上,現在, 我的Hello World。 所有的權利,任何對工作流的問題或語法 我們只是做了什麼? 好吧,讓我們再次上升了一個檔次的東西。 因此,這給人留下深刻印象,只寫一個程序,只 曾經說:“你好,世界。 所以,我們改變了它,在星期一,說,你好,大衛。 這是一個有點多個人,但只是作為硬編碼為 第一個版本。 所以不是所有的引人注目。 但是存在,在C,功能當然除了 打印功能,可以讓您的用戶輸入。 的方式,我們這樣做,有一天,情況如下。 其實我之前打印出來的東西,我第一次 從用戶的東西。 因此,讓我再這樣做。 字符串s,其中s是只是一個任意的名稱,在這裡,對於一個 字符串,等於GetString的。 那麼,什麼是GetString的? 顯然,它獲取一個字符串,根據其名稱。 但究竟是什麼,技術上呢? 這是一個函數。 所以這是一個使用C本身功能不來。 CS50人員寫了這個。 因此,對於使用這個,你不能只包括stdio.h中, 您還需要包括什麼? 是啊。 因此,cs50.h,這僅僅是一個文件,我們幾年前寫的。 我們把它安裝在你一起家電 所有的標準文件。 因此,在這些最初的幾個星期之類的,我們將使用 這只是為了簡化的過程中,做的非常基本的 之類的東西獲取用戶輸入。 因為在幾個星期內我們會看到,在獲取用戶輸入 像C語言實際上是出奇的複雜, 特別是因為你不事先知道的,通常情況下,如何 太多的東西,用戶要輸入英寸 當你不知道多少數據,你不 我知道如何分配多少內存。 如果你真的有對抗性的用戶是誰試圖 入侵到你的系統,你的電腦崩潰,好了, 一般的攻擊方法是,就像我一樣 週一,鍵入一個長序列的隨機字符, 按下回車鍵,看什麼打破。 因為一般來說,如果程序中斷,這暗示 ,潛在的安全漏洞。 這當然暗示了你,程序員,做了 錯誤,但更危險的是,你可能已經做了 與安全相關的錯誤,而且通常我們會看到, 機被攻破這一天, 在世界上的網頁和方案, 命令行,像這樣。 好的。 因此,字符串s = GetString的。 所以更具體,第6行做什麼嗎? 因此,在右邊的功能得到字符串, 需要多少個參數? 好吧。 所以,沒有。 一點點神智檢查。 再次,是一個參數,只是輸入到函數改變 在某種程度上,它的默認行為。 但是,在這種情況下,我並不想改變 GetString的行為。 我只想得到一個字符串。 所以,我什麼也沒有括號中的,然後我把一個 分號demarking的代碼行的末尾。 現在,等號,不等於,本身。 這意味著分配,這意味著把任何得到 無論是在左邊上的右內側輸出。 因此,在左邊,我們說,我們已經宣布一個 字符串調用。 更特別的是,我們已經分配內存裡面的 我們可以把位序列 字符。 但今天,我們已撥出 或宣布一個字符串。 好的。 所以,現在一旦我這樣做,我想插入的價值 ,而不是大衛的價值。 因此,這是錯誤的,為什麼呢? 因此,這只是字面上的硬編碼的小號。 這是說“你好,”這是不是我想要的。 所以,我可以做到這一點。 百分號是一個佔位符,但現在我需要 打印第二個參數傳入。 回想一下,函數的參數分離 逗號,所以這裡的一個逗號後,我把這個字母s。 在這方面,S是可變的,和printf, 在收到這兩個輸入 - 上的字符串的左側,而在右邊的變量名稱s - 它會堵塞後者成為前者對我們來說, 只是打印出一個漂亮的美麗的字符串,其中包含 不管它是什麼,我們鍵入。 所以,讓我們來試試這個。 要繼續前進,放大了出來,回到 我的終端窗口。 在底部放大了。 重新輸入使招呼。 鐺似乎已經重新運行。 我要鍵入。/你好,回車。 似乎沒有發生,但在此提示 我可以鍵入一些東西,像內特,輸入,而現在我們有 你好,內特。 ,我還可以再與Rob,等等。 所以希望現在這個程序的行為,我打算。 現在,不是所有的用戶友好。 我不知道什麼是對我的期望。 因此,我們可以肯定清理了一點點。 讓我回到了這裡,而不是只是潛水, 要求用戶為一個字符串,讓我明確地告訴 用戶,我期待的是什麼。 所以printf(“請輸入一個字符串:” ); 所以這裡不變量。 沒有百分號。 只是簡單的英語短語。 現在讓我去的底部,然後重新運行我的程序。 但似乎什麼都沒有發生了變化。 為什麼呢? 我必須重新編譯它。 所以容易犯的錯誤。 但是,你不僅要保存該文件,但 重新編譯程序。 所以,如果我重新運行make您好,現在鐺運行。 現在,我可以運行。/打招呼。現在我看到“輸入一個字符串:”。 好吧。 現在,這是一個有點更加人性化。 內特,輸入,你好,內特。 好吧,讓我們再試一次,並開始思考 關於角落的情況下。 所以就像在刮,我們鼓勵你或正在 鼓勵在規範中那種認為什麼可以去 錯了,如果你沒有預料到用戶可能做的一切。 因此,錯誤,可能會隨之而來。 因此,輸入一個字符串 - 這裡一個角落的情況是什麼? 有一個場景,我的程序員,可能不會有什麼 預期? 是啊。 好吧。 那麼,如果我輸入一個像這樣的數字呢? 好的。 因此,它仍然有效。 Gramatically是沒有意義的。 但至少在程序的工作原理。 什麼是另一個角落的情況嗎? 我沒想到的東西。 是嗎? 好吧。 所以,我們可以做一些事情是一個非常,非常大的數字。 因此,讓我們在這裡做。 讓我們我縮小為第二,我要強調。 無法複製並粘貼到這裡。 好的。 所以我不能複製和粘貼在這個終端窗口,因此,我們將 它只是模擬。 讓我放大了,要包裝。 我不打算這樣做太長時間,因為它不會 實際上打破了這一計劃。 但它可能。 輸入。 但事實並非如此。 好的。 但它是一個真正的角落的情況。 唯一的正確行為的原因,這樣一來 說話,是因為CS50功能的GetString實際上是 引擎蓋下的設計,我們將在幾個星期內看到, 自動分配越來越多的RAM,越來越多的 從操作系統的內存,當它發現,哇, 你真的輸入在相當長的東西。 現在,這是一個善意的謊言一點點。 如果我們確實暫停相當長的一段時間,我輸入了 在鍵盤上像5十億個字符 在這裡,真的打複製 - 粘貼了不少,我們很可能 可能會導致程序崩潰。 只是有點難以模擬,用有限 的時間量。 另一個角落的情況下,我們可以嘗試什麼? 是嗎? 是啊。 那麼,為什麼我們不回答什麼? 因此,我們必須採取一些行動,因為否則 該方案的,要整天坐在那裡閃爍。 但是,如果我只需要敲擊回車 - 好了,現在,看起來還是錯誤的。 沒出事,但也許現在有一個機會, 開始實施更嚴格的程序 實際檢查。 而且,如果該字符串,這句話,我的字 輸入的長度為0,好,也許我應該喊的 用戶,或者告訴他或她再次輸入一個字符串,從而使 我們得到正確的行為是什麼樣子,而不是 只是我的一部分的完整的監督。 問題在後面呢? 十進制數。 因此,我們可以嘗試了。 1.10000005。 好像,只是工作其實沒關係。 這實際上是預期。 儘管我們可能已經輸入了數字,則或 數字越大所說,意識到,當我們輸入用戶 輸入和我們使用的是GetString函數,不 無論什麼我打字看起來像數字。 回想一下,根據ASCII,一切都在您的 鍵盤可以被映射到一個數值, 字符,一個字符。 因此,在這種情況下,即使我可能會輸入一個數字, 計算機將想起來了,可以這麼說,作為一個字符串 - 的東西,看起來像一個數字,但 實際上不是一個數字。 但是,這實際上是一個完美的SEGUE,因為現在我們可以 其實過渡到編寫程序, 使用其他數據類型。 因此,除了使用字符,或者更確切地說,除了使用字符串, 認識到,我們在C具有其他數據類型,以及在 其他語言。 一個char,顧名思義,僅僅是一個單個字符。 一個浮點數浮點值,而這只是看中 說實數的方式 - 有小數點的東西, 在它與點的左和/或右的一些數字。 int是一個整數,它只是一個數字123。 而現在更有趣的事情,如雙。 我們說什麼了雙是最後一次嗎? 它是64,正確的。 而通常一個浮點數是32位 - 所以它的這個長在內存中,它使用32個零和的, 代表值 - 雙是名副其實的兩倍, 意味著你可以代表更大的數字, 你能代表更精確的數字。 所以,你可以有更多的數字小數點後的,但 在視頻中說的傢伙,即使是簡單的東西 概念上有1/3不能代表正是由 電腦,因為最終你用完位,和 因此,你只能做0.33333333所以很多時候,在 這一點你只需要說我的代表 空間,我要的只是收工,並代表它 有些不準確。 很長很長 - 愚蠢的名字,但它是因為有一個數據類型被稱為 而巧合的是32位,就像一個經常在C int是32位,但很長很長的 一般為64位。 因此,它只是意味著你可以代表大 超過這個數字。 好的。 所以,如果我們真的要開始代表的東西,我們 可能需要更複雜的類型,並 這就是為什麼我們有字符串。 因此,在的CS50庫,文件名為cs50.h,我們 實際上宣布的數據類型,可以這麼說,叫串, 但字符串實際上並不存在。 再次,這是這些層我們要剝離 早在一兩個星期,把它扔掉,和實際 看看下面的罩實際上是一個字符串, 它是如何派代表出席了會議。 我們也去看看布爾值。 那麼什麼是一個布爾值的背景下,從頭開始嗎? 這是真還是假。 因此,它只是一個值是真還是假,開啟或關閉,或 0,但是你要查看的世界。 因此,在C,這要感謝的CS50庫,這反過來又 包括引擎蓋下方的另一個庫,我們有 訪問的數據類型,被稱為布爾值, 從字面上讓我們到指定的值true或false 在一個程序中的事情。 所以,讓我們繼續在這裡寫一個小程序, 涉及數字,而不是做一些事情。 因此,讓我回去CS50電器,讓我繼續前進, 創建一個新的文件,這裡所說的 - 讓我們只說簡單的東西,像math.c. 好的。 而現在我的程序上去的,我 通常要做的 - #中,這樣我就可以使用 printf的,詮釋的主要(無效) - 我們會回來,最終,詮釋意味著什麼 在這裡,在這裡的意思是什麼無效,但就目前而言,只是知道, 你要啟動這樣的程序。 現在,我要繼續前進,說的東西一點點 不同的 - printf(“請給我一個數字: 。); 然後,我該怎麼辦廉政n =調用getInt,因為它 原來調用getInt是另一個函數,在CS50庫 除了getString。 而現在,我會做一些愚蠢的,像“感謝 的%d“,為十進制整數,然後逗號N, 然後返回0。 所以,再一次,返回0,有沒有做我的 詢問用戶。 只是表示,大概,是在年底。 所以,讓我去到我的終端窗口。 讓我的類型進行數學,輸入。 東西是錯誤的。 使數學不工作。 這是第一個錯誤消息。 為什麼呢? 有點神秘,但是 - 是啊。 所以cs50.h. 如此反复,特別是早期,你會寫你的第一個 程序的pset 1節,於辦公時間內, 坦率地說,這將是壓倒性的,有時這些事是什麼 實際上說。 不過,你就會意識到非常快,他們開始下降 據此,這意味著你離開到桶 #包括的文件的頂部。 鐺,編譯器,通知你的 說,而美麗的,隱含的聲明 函數調用getInt是無效的。 好的。 那麼,是什麼意思呢? 它只是意味著你已經隱式聲明的調用getInt在 這個意義上,你沒有明確宣布它。 要明確地聲明int,你必須教 鐺它的存在。 非常簡單的解決方案就是教 包括本其他的的文件,cs50.h, 文件的開頭。 因為從字面上看,哪些#include是告訴鐺 幾乎去找到該文件名為cs50.h,複印, 對我來說,它會自動粘貼到我的程序的頂部, 然後將其轉換的源代碼,零和的。 但是,這顯然是非常乏味的,如果我們人類有 去複製和粘貼這些大文件的時間, 所以#包括所有的情況下自動 弄髒我的代碼用別人的庫。 圖書館是另一個文件包含的功能和 其他的東西,別人寫的,我們是 利用我們自己的利益。 好的。 讓我們再試一次。 使數學。 輸入。 好。 因此,這似乎發揮了作用。 因此,讓我現在運行的數學/數學。 輸入給了我一個號碼,123。 感謝為123。 現在,讓我們嘗試另一個角落的情況。 一個字符串是非常慷慨的,因為 字符串可以是任何東西。 可以像數字,看起來像 字符,看起來都像是單詞。 但是,int類型是int。 所以,現在如果我困難的用戶,它說:“給我 一個數字,“如果我嘗試做一些事情(如0.1)? 嗯,這是一個數字,這是符合 語法我在這裡使用,但引擎蓋下的,我的 當然,使用函數調用getInt。 因此,讓我們看看會發生什麼。 回車鍵,然後重試。 好的。 讓我是困難的,只需要敲擊回車再次。 輸入,回車。 因此,現在看來,調用getInt多一點 強大的比GetString的。 我們的工作人員,在這樣一種方式,如果我們注意到實施 你有沒有給我們一個int - 一個int是一個十進制數 包含零的人,三三兩兩,三,四,五,六人木球賽, 七,八,九。 就是這樣。 沒有小數點,沒有人物,沒有標點符號。 看來,我們有合作。 所以,讓我來試試四,五,六,讓我通過。 所以,真的,是肛這裡,我可能會說:“給我 為了傳達給用戶一個整數“ 正是我打算。 現在,讓我們覺得引擎蓋下的。 我們不打算在,如何cs50.h實施今天, 該庫。 但是,如果它口口聲聲說重試,重試,重試,什麼編程 構建我大概用下面的罩 實現了嗎? 因此,只要一個循環,對不對? 其中一個最簡單的想法,我們從頭看到。 永遠的建設,重複建設。 據推測,在這個程序中,引擎蓋下的,即使 雖然它的C語言編寫的,而不是從頭開始,它在做什麼 什麼叫如果用戶永遠不 輸入整數,說重試,重試,重試,重試,所以 最後,當我們這麼做的時候得到一個整數,那麼你 跳出這個循環。 那麼,還有什麼其他的功能,我們可以使用在這裡在CS50的圖書館? 好了,種明顯的,至少基礎上, 數據類型,我們現在知道存在。 我們實施GetString時,調用getInt,但在整個 這個詞的第一個星期,你也可以使用getFloat先把及 為了得到精確的GetDouble和GetLongLong 數據類型,你想要的。 因為這裡的關鍵細節是,不像某些語言中, Python和Ruby等,在那裡你不一定要 聲明變量的數據類型 - 你不必告訴計算機什麼樣的東西 你要放入變量 - C,你必須要非常精確。 所以,如果你想有一個變量n,一大塊存儲 在這種情況下,恰好是32位的,按照慣例,你 必須告訴電腦,這些位是 要存儲一個數字 - 不是一個字符,而不是一個字符串,而不是一個float。 這解決了問題,我們有效地 跑進上週。 如果我們使用的是零和的數字,不只是代表 電話號碼,但由於BS和CS,如何在世界上是一個 電腦要知道,這種模式實際使用的位 表示數字65,而不是代表 字母A,巧合的是,根據 ASCII,記得,相當於65? 因此,這些數據類型提供了上下文到電腦上,所以 它知道,如果這些位應該被解釋為 int或一個字符串。 如有任何疑問,然後,在此嗎? 是嗎? DAVID J.馬蘭:好問題。 如果我們採取了stdio.h中,我們保存文件 - 讓我去到終端窗口,並運行數學,放大 在進入 - 現在,我得到一個不同的錯誤,因為我含蓄地 聲明現在什麼功能? printf的。 所以,現在我已經創建了一個新的問題,它的解決方案是 本質上是相同的。 我需要把回來。 觀眾:[聽不清] DAVID J.馬蘭:哦。 所以,如果我拿出 - 好吧,是的。 所以,如果我刪除的標準I / O庫包含 在這裡,然後你說,如果我擺脫的printf,得到 擺脫了printf? 是。 這應該工作,因為我不再使用任何 - 哎呦。 我只是撒了謊? 哦,好吧。 這是不行的,因為我們剛剛推出了一個新的錯誤。 這是一個小更不言自明。 有什麼問題嗎? 未使用的變量n。 因此,這個錯誤是由於我們配置了 家電特別是迂腐,要真正大喊大叫 你的每一個可能的錯誤,即使它的種 這樣一個非致命的錯誤 - 是不是真的這麼大的 處理,我分配一個int,提出了一些,然後 只是做了什麼呢? 因此,在功能上,沒有。 這並不是要打破計劃。 這只是一種愚蠢的,對不對? 有沒有要求數量,存儲的值 在一個變量中,如果你永遠也不會做任何事情 有了它,無論它打印或保存。 因此,在這種情況下,鏘確認一樣多,並 它說未使用的變量n。 因此,我們可以解決這個問題,如果我們真正想要的。 但是,這是不是一種好的編程。 所以,我可以做到這一點 - 在這裡,讓我清楚的畫面,使數學。 該工程。 我現在可以運行我的數學程序,需要輸入 - 嗯,這是不好的。 接受輸入,那就是,在這種情況下,所有它。 因此,實際上,讓我們嘗試另外一個角落的情況,我們 沒想到的早期。 在這種情況下 - 在這裡,讓我們回到一個,這是一個 對用戶來說更加友好。 讓我回到這裡,再次運行make數學。 哎呀,我做了什麼錯了嗎? 得到進一步回滾。 好吧。 現在我們又回到了原來的狀態,所有 是希望。 而現在,如果我遇到數學,123似乎工作。 但是,這不是一個真正的有效的證據,只是說 好吧,這工作的。 789的作品。 提交時間。 因為有其他角落的情況下。 一個字符串,沒有真正給我們太多的麻煩通過鍵入 一大堆的字符。 但是,如果我輸入? 擊中了一大堆,這裡的很多 - 所有權利,它變得有點無聊,所以我要 停在這裡,我要按下回車鍵。 你到底發生了什麼? 所以,這其實是可以解釋的。 所以沒有把它作為二進制嗎? 一個好的想法,但沒有,這是不是事實,即它把它 二進制,因為事實上,這僅僅是一個怎樣的 巧合。 我們可以做到這一點。 因此,有沒有,這是二進位制 可能是足夠的了。 輸入。 所以這是沒有問題的。 還有什麼呢? 沒錯。 所以想返回一個int實際上是什麼。 這是32位解釋 為一個數字。 如果您有32位,這意味著每個比特可以 是0或1,0或1。 因此,這意味著有兩種可能性,該位, 這兩種可能性,這兩種可能性 位 - 所以這是2倍,2倍 - 所以這是2的32次冪的總數 排列零和的,如果你有32 佔位符,0或1,在你的面前。 所以,如果我有2到32個,數學,那是什麼? 因此,這是一個很大。 這是4億元,給予或採取。 和4億美元似乎並沒有被打印出來在這裡。 事實上,這看起來更接近至2億美元。 但是,這是不是一個巧合。 事實上,電腦已經誤解了我的大量, 我巨大的,然後我巨大的二進制補碼序列,序列 大約2億元,是如何解釋的呢? 有一個上限的int。 有一個肯定,你可以代表的最大值。 但它通常為4億元,對不對? 如果是2到32的約4億美元,這似乎是 這是最大的數。 因此,沒有餘數,但一個好的想法。 負數。 所以,如果你有4億的事情,你可以 代表這些不同排列的32 0 1秒,以及,它會隨時原因,我們人類可能要 不只是代表正整數 但負整數。 事實上,這是假設的C。 因此,32位,你可以代表大致負2 十億一路正2億元。 因此,在這種情況下,我們真正看到的僅僅是 附帶的能力,我們的整數,並且,因此我們有 可以說,溢出了整數。 我們試圖把它塞進更多的位比實際上可以適合。 所以,最終的結果是,我們基本上都為1的位。 我們所有的位翻轉,我們一直在努力,代表 最大的可能,但它顯然不是近 大到足以代表兩件事情,我剛剛輸入的字詞。 是嗎? 觀眾:[聽不清] DAVID J.馬蘭:好問題。 為什麼我們不能只是表示該負 簽名只是一個字符嗎? 所以,我們絕對可以,我們可以然後保存 一個附加位。 但你仍然要代表破折號,和 這要花費你至少東西, 想必位。 所以,是的,我們可以為我們的數32位,但現在 我們需要另一位用於我們的破折號 符號,減號。 所以,現在我們有33位的值,我們可以這樣做,但它的 只是沒有辦法做這項工作。 我們做了一個判斷調用年前,32位是排序的 在這裡的度量單位。 因此,我們將使用這些位有效 代表消極,31位代表的數量。 其他問題嗎? 好的。 這是一個很大。 我們為什麼不繼續在這裡我們五分鐘的休息時間嗎? 好的。 所以,再一次,不要過分強調數學的應用 的節目,就讓我們把她的一個例子 在我們進入其他結構,只是因為它 將一些常見的障礙點上的一些說明 當它涉及到編寫程序的基本。 在這種情況下,這樣做的算術表達式,有一些 有趣的語法的相關性。 因此,這只是一個公式,我們可以將 溫度從華氏攝氏度。 如果你不記得,這僅僅是一個公式。 因此,如果我們插在華氏32度,這是 凍結,這將是32減去32是0,而事實上, 0攝氏度也凍結。 這麼快的完整性檢查 - 這是熟悉的公式。 讓我去到設備,但是,並開始 寫一個程序稱為一樣,F2C“華氏 攝氏點C“。 在這裡的頂部,我要開始用#include stdio.h中,我要詮釋的主要(無效),並 再次,我們將在未來回來整數意味著什麼 有無效意味著什麼。 現在讓我繼續前進,執行一個程序, 基本上沒有我們這個轉換。 因此我們知道printf,比方說,華氏溫度。 然後讓我繼續前進,從用戶的價值。 我應該得到什麼樣的價值,如果我想從用戶 他們給我一個華氏溫度? 是嗎? 你會建議什麼? 是啊。 因此,浮動的感覺相當合理的。 再次,我們有幾個選項, 迄今為止,我們已經看到了。 我們有些事如char,雙,浮點型,整型,很長很長, 布爾,字符串。 所以這些,的浮動感覺很合理的。 我們可以用一個雙,正確的,因為如果我們真的要 代表一個人的溫度 - 98.60000 - 要做到這一點,我們可以使用64位,但感覺像 矯枉過正的溫度。 因此,讓我們一起去浮動。 現在,我需要一個變量。 只是為了讓事情簡單,我會打電話給它f,但我 可以很正確地調用它的溫度, 但無論是好的。 因此,浮動f = getFloat先把。 只要我現在已經決定了,不過,我使用getFloat先把 需要做一個修正。 是啊。 因此,我們需要#包括的,否則編譯器 要罵我們。 現在,我有一個浮動,讓我繼續做 轉換。 因此,首先讓我還養成早睡早起的習慣在這裡 評論我的代碼。 所以,再一次,評論的人,只是一個符號 不是程序本身的一部分,但它一個,幫助您 明白你做了什麼,第二天早上,或下 月,它可以幫助你的教學同胞知道你做了什麼 或者你打算做什麼,所以它的 通常是非常好的做法。 每隔幾行代碼,寫評論 你或你的同事。 所以在這裡,我會說,“詢問用戶的溫度。” 不必是一個完整的句子,只是一個簡單的短語。 但在C註釋背後的想法是,你的每一個 意見應賦予你 - 或說,,TF或同事的 - 撇去你的程序,不知道它究竟是什麼 這麼多的閱讀代碼,但通過閱讀註釋, 應該是簡潔明了。 好了,所以現在讓我繼續說,“轉換 華氏攝氏度。“所以我要繼續做, 比方說,浮動Ç。 我們將保持攝氏浮點值。 ,讓我帶刺在此。 其計算公式為,再次在這裡。 5/9次F零下32。 因此,讓我們做到這一點。 因此,5除以9,減 - 哎呦,我把事情搞糟了。 時報。 因此,5/9倍f零下32。 所以F減去32,分號。 而現在,在這裡,我要繼續前進 並說,打印結果。 而這部分很簡單。 printf的。 我該如何去打印此? 好吧,我可以說,“在攝氏這個數字是%f \ n”, 只是一些美學。 什麼樣的價值,我想在這裡插入printf的 第二個參數? 好吧。 因此,只要C。 因此,我們將從這裡開始,然後就返回0。 再次,它具有與數學無關。 它只是意味著一切都很好。 現在,這是正確的,這個程序嗎? 好的。 所以,我犯了一些錯誤。 即使你不知道是什麼程序,您可以排序 的推斷回到小學 可能的錯誤在這裡。 第一個是什麼? 觀眾:[聽不清] DAVID J.馬蘭:是的。 因此,我們漏掉括號內。 這是故意的,我沒有括號的基調 滑動這裡,因為這裡實際上這個概念的, 操作,或優先級,使某些操作 - 乘法 - 有較高的結合,具有較高的優先級,比東西 如加法或減法。 因此,我們所做的這幾年,只是為了清晰準確 首先應該做的是什麼數學運算。 所以,我也許應該模仿的正是這一點。 否則,電腦大概要嘗試做 類似9鴻溝5,再乘以F,然後減去 32從整個事情。 這不,事實上,我們想要做的是什麼。 因此,讓我們括號。 讓我們添加我的括號,括號在這裡。 讓我們把這個在這裡。 在這裡,我只注意到另一個錯誤,我一路走來。 是嗎? 觀眾:[聽不清] DAVID J.馬蘭啊。 好。 所以,我們其實有相同的整數 從之前的分工問題。 我糾正這個問題,讓我們來看看是什麼症狀。 但是我們要糾正一個 這裡的其他錯誤。 是嗎? 觀眾:[聽不清] DAVID J.馬蘭:是的。 所以,我做了愚蠢的錯誤,但非常重要的。 電腦是不會視而不見,只是讓 我用大寫F,當我宣布變量 作為一個小寫f,在第8行。 因此,我需要糾正在第11行我的資本,哪一個 剛才是一個大寫F誤。 這裡怎麼樣? 這應該是小寫的呢? 這是應該的,但是這是一個巧合。 ,%f有沒有做的變量。 因此,只要是超清晰,讓我繼續前進, 重命名,簡單地說,“溫度”。讓我重新命名 此“溫度”。讓我不能重命名。 因為,再次,%f全球範圍內的意思,“浮點值。” 有沒有做我的變量。 但“溫度”的地方只是一個小羅嗦, 所以,我要回到我的小寫字母“f”。 現在,讓我繼續我的窗前。 請F2C - 這是,再次,我的任意名稱 給這個文件。 似乎已經編譯。 讓我跑F2C。 輸入。 華氏溫度 - 讓我們做一個簡單的一個。 32。 OK,糾正。 但是,如果我現在做的212沸騰 - 該死的。 好的。 所以,這顯然不是正確的,如果你的TF嘗試 至少兩個值。 那麼,是什麼問題呢? 好了,你已經把你的手指上是什麼問題。 但是,為什麼是這樣呢? 在這裡,當我在做數學5分9。 因此,從理論上講,是完全正確的。 完全一致的公式。 但是,計算機只能做正是你 告訴他們做什麼。 我們有效地在這裡告訴計算機 除以整數5的整數9 給我的結果。 問題是,但是,如果你做除法數據 類型,輸出是輸入的相同的數據類型。 因此,如果兩個輸入是這兩種類型為int,輸出將 是一個int。 因此,5除以9點東西。 但是,什麼是最接近的整數點東西嗎? 因此,它實際上是0。 所以,當我們討論星期一,一切都小數點後 點被截斷。 它只是被丟棄。 所以這是一個完全錯誤的,因為我可能也只是 乘0這裡的一切。 現在,我可以在一對夫婦的方式來解決這個問題。 我能做到這一點。 5.0除以9.0。 從技術上講,我什至不需要做的。 它足以使一個浮動的數字之一 - 或雙 - 通過把小數點這裡。 因為發生的事情是,當你將整數 一個浮點數或雙,計算機的實現 哦,其中之一是更加精確。 我寧可讓你更精確的比側 您所想。 因此,將轉換的結果 - 將一個浮點值,以及返回的結果。 因此,這將工作。 這將工作。 還有另外一個機制,我們將看到在 更詳細的下週。 作為程序員,實際上,你可以告訴電腦 實際處理一個數據類型 雖然它是另一個。 所以,我可以真正做到這一點。 在括號中,我可以這樣說(浮動),開 括號,關閉括號。 這是所謂的“鑄造”。同樣, 在此下週。 但是,這僅僅是一個綱領性的方式告訴 電腦,是的,我知道9是一個整數或長。 我不知道這是一個浮點值。 但把它作為這樣呢。 因此,投的數據類型轉換成 從一個到另一個。 坦率地說,這只是一個小的醜陋,所以我會建議我們去 只是轉換回原來的建議 這些東西手動浮點值。 因為現在只是超級清楚是怎麼回事,和 它不是所有的分心。 現在讓我們回去到我的終端窗口中。 請F2C。 讓我去,繼續運行。 而且,順便說一句,你感到厭倦,輸入這些命令 一遍又一遍,認識到計算機,如Linux, 往往是很聰明的。 如果我撞了上去,我們可以通過我的整個歷史 命令,向上和向下。 因此,在這種情況下,在這裡,我可以去運行F2C。 我被大聲訓斥,因為我只是做了一秒鐘前。 這已經是最新的。 所以,現在我可以再次運行F2C。 讓我們嘗試32華氏度。 現在,讓我們嘗試212華氏度。 唷。 似乎工作。 現在,這是很好的,但是感覺有點任意的, 我顯示小數點後六位數字。 對嗎? 如果你人在電視上的天氣,你的doofus的 如果你正在讀的溫度 這個精確度。 所以,讓我們簡化這。 因此,讓我們其實在這裡,我的printf。 是的,我想自由浮動。 不過,我想現在指定的精度。 我是一個小的簡潔。 我說,給我一個點後的小數位。 因此,而不是說%F,我會說%.1 F。 而這只是給我一個位置 小數點後。 好的。 讓我們再試一次。 讓我重新編譯後運行。 現在我輸入32,我得到一個 更簡潔的價值。 我可以輸入,現在,212,和得到一個更簡潔 價值。 還有其他的事情可以做,用printf。 實際上,你可以指定數目應該有多寬。 如果你想,有填充就可以了,所以你可以用鼠標右鍵調整或 左對齊所有的數字或 嘗試為中心的東西。 因此,實現有小動作就做什麼。 但他們只是歸結為格式代碼, 像我們有。 因此,在這個問題的優先方面。 這是一個很無聊的表中去,通過有條不紊。 但認識到,紛紛拿出了作者的C 規則,指定運營商有更高的 優先,更多的結合力,比其他人。 因此而小學的時候,我們一般知道這是 乘法和除法,加法和減法, 然後一些其他的東西。 在編程的世界中,有一個更 更長的事情的清單。 這是不是現在值得記憶的東西。 用不了多久,你會得到馴化。 但就像小學的時候,括號一般解決 問題的優先級,超清晰的 計算機和人類一樣的目的是什麼。 因此,考慮這只是一個小的小抄。 但最重要的那些細節,我們不會去一段時間。 好的。 現在,讓我們建立和遠離這些無聊的小 數學的例子。 仍然使用相同的基本面,但啟動 表達自己有點像刮。 因此,在從頭開始,我們這些布爾表達式。 而在英語中,布爾表達式是什麼? TRUE或FALSE。 這件事情的計算結果為true或false。 1或0。 “開”或“關”。 無論你怎麼稱呼它。 現在在刮,的拼圖看起來像這樣的。 這相結合,在底部有三個, 拼圖。 一個結合 - 的東西,有空白和空白。 然後它裡面的布爾表達式。 所以,你可以窩的布爾表達式,以獲得更多的 複雜的布爾表達式。 例如,如果它是星期六,它是很好的 天氣,然後到外面去。 什麼的任意那樣。 所以,你可以加入了一個布爾表達式來 真值較大,其答案是基於 較小的。 現在,在C,幸運的是,這個映射 其實很簡單。 括號把事情說清楚在這裡。 &&是什麼意思“和”。所以,這就是 我們要轉換這些塊從白手起家到C. 的條件下,我們看到了從無到有,在左手 側有,我可以將它們堆疊同樣C.如果x小於 除y,然後做到這一點。 否則,如果x是大於y,那麼這樣做。 否則在邏輯上他們必須是平等的,所以說 他們是平等的。 所以,我們現在可以開始構建這些東西。 因此,讓我們做一個實例。 讓我打開了一個文件,該文件了課程網站, 我寫的提前。 這就是所謂的nonswitch.c。 我們會看到為什麼在短短的時刻。 因此,在這個文件 - nonswitch.c - 第一次認識到,有一大堆的 在上面的意見。 這只是解釋的文件名,它是什麼 ,等等。 它顯然說明了如何使用布爾AND-ING - 交接兩個表達式。 因此,讓我們來看看這個程序是如何工作的。 我包括我的兩個的文件,cs50.h和stdio.h中。 如果我向下滾動,現在的程序,它是一個小 比我們之前寫的,但非常可讀。 所以,我第一次打印的用戶,第18行, “給我一個1和10之間的整數。”所以 這是正確的。 現在,我得到的整數。 但認識到,調用getInt - 很簡單。 它只是將一個int。 這將確保,它並獲得一個int,而不是一個 字符串或浮點數。 但它不會做任何形式的邊界檢查。 這不是要過濾的號碼之間的 一定範圍內。 因此,我們必須實施自己。 所以就像在刮,在那裡我可以做一個結合的 兩個表達式,我可以做的,在C如下。 如果n大於或等於1,和n是小於和 或等於3,我會很隨意法令, 數是一個小數目。 只是為了一份聲明。 否則,如果n為4和6,打印“你選擇了一個中等 號“。否則,如果n為7和10之間,打印”你挑了 大的數字。“ELSE PRINT”你挑一個無效的號碼。“ 因為從邏輯上講,後面如果我們 用盡了我們的範圍。 因此,認識到這一點倒不怎麼寫大於或 等於在上數學課。 對嗎? 您通常像這樣繪製,與線下。 但是,我的鍵盤上有沒有這樣的關鍵。 因此,在C的符號用於表示大於或 等於是兩個字符,和符號為小於 或等於兩個字符。 好的。 所以,如果我運行這個程序,你大概可以猜出這是什麼 要做的事情。 如果我先走,使nonswitch,Enter鍵。 然後運行nonswitch。 給我1和10之間的一個數。 我要去給它11。 我拿起一個無效的數字。 讓我試試3號。 我拿起一個小數目。 所以相當簡單。 如果我想改變這個程序的行為, 做的東西有點不同呢? 讓我繼續前進,說這句話。 讓我擺脫這一切。 如果讓我說(N = 42)。 然後我要繼續前進,並說打印“你選 正確的答案。“不然,我們要繼續前進,並說, printf(“請你選 錯誤的答案。“);好了。 只是因為。 現在,有幾點我們可以在這裡提出。 一,我沒有鍵入符號,你會認為這是 最合理的。 當我要檢查平等,原來你不使用 等號。 您可以使用等於等號。 而原因可能是,只是憑直覺呢? 是啊。 觀眾:[聽不清] DAVID J.馬蘭:正確。 已經用於分配等號。 有人真的沒有想到。 所以現在,當它涉及到平等的測試中,我們必須 更加明確,並說等於平等的。 一個很常見的錯誤是做到這一點。 而且,如果在辦公時間或下週的某個時候或在 接下來的兩個星期,你做這樣的事情,然後 它奮鬥了10年,20分鐘,試圖找出 該死的錯誤是什麼,認識到,你是其中的一個 誰犯了這個錯誤的人。 因此,超級容易做。 但現在的目標是抵擋這樣的錯誤。 這可以評估,因為這是真正的意思嗎? 如果n得到42。 因此,動詞的人使用,口頭,以表達對 分配的概念是“得到”。因此,如果n得到42。 因此,這意味著到n分配42。 現在我有一個布爾表達式中括號, 此條件下的內部,它的數值是42。 對嗎? 因為如果你評估它從內到外,總 答案,現在是42。 所以,如果我問你的問題,“如果(42),”什麼是 真正在說什麼? 那麼,布爾表達式只能是真或假。 1或0。 “開”或“關”。 因此,我們似乎在這裡,有一個角落的情況下,讓所有的 突然,我說:“如果(42)”。這不是一個布爾值。 因此,電腦做什麼,但是,它基本上等同於 任何不為0的解釋是正確的。 1。 在。 它們是等價的所有功能。 只有值為0,或關鍵字假的,因為我們會 最終看到的,實際上是錯誤的。 因此,“(42)”,實際上是真實的,因為它是非零。 因此,為了更精確地在這裡,一個布爾值是真的不 的真或假,但在本 情況下,如果是0或非零。 因此,虛假或不假。 這使我們能夠涵蓋所有的 在括號表達式中的可能性。 因此,我們需要非常仔細,說 - (N = 42)。 很簡單,因為我們需要指定測試的平等, 不分配的值。 在這裡值得一提的是什麼? 這些花括號實際上是沒有必要的。 我一直在做,只是為了在這裡挑剔挑剔。 但是,當你有一個條件,只有一行 代碼的方便,程序員並不需要使用 大括號。 總之,只是縮進,出於美觀的考慮, 然後再編寫一行代碼。 只有當你想要寫的兩行代碼 - 例如,否則輸出(“細則”)。如果你想做的事 的是,這被打破了。 您可以縮進想要的一切,但事實上,你有 輸入的兩行代碼,而無需使用花括號 意味著這個程序將無法正常運行或可能 甚至沒有正確編譯。 所以現在,說實話,我認為最好的習慣是 使用大括號,你會發現,他們 超清晰是怎麼回事。 另外,順便說一句 - 特別是如果你在那些誰使用 推薦的書籍或在線資源 - 意識到有這個概念的風格 編程。 有些人喜歡把花括號 在這裡上線。 有些人喜歡做可笑的事情, 我喜歡把它們放在這裡。 有沒有錯誤的答案,當涉及到 風格,但是這是錯誤的。 但是,有些人做到這一點。 [笑] DAVID J.馬蘭:所以我現在提到這一點,僅僅是因為作為 你讀的書籍或網上的事情,你會得到 從不同的老師,不同的消息 不同的作者。 而剛剛意識到這一點,在功能上,他們 一般等價的,但是一致的。 因此,在這種情況下,我們將標準化的花 括號這裡排隊的左邊。 好的。 因此,讓我們繼續前進,現在和運行它,看看會發生什麼 這一計劃。 請nonswitch。 然後運行nonswitch。 給我一個介於0和 - 所以這是不相關的 了,但我只是隨意說42。 我選擇了正確的答案。 現在好了,讓我們藉此在不同的方向。 原來,有一些其他語法 可以在程序中使用。 這裡有一個新的語法,在功能上是相同的, 但只是介紹了另一種方式表達自己。 因此,這是什麼所謂的“switch語句”。和 switch語句如下。 它需要在括號中的數值要 “開關”。 你想不同的表現,根據其值。 因此,這意味著開關n的值。 這是什麼意思? 好了,如果n為1或2或3,繼續前進,並打印出“您 挑一個大數目“,然後打破。 突破的原因是,C工作 盡快找到相匹配的情況下,它開始執行 它下面的所有的代碼。 所以,如果我有,我在這裡做的第27行,一行代碼 被執行。 如果我在這裡增加一條生產線,它就會被執行。 另一條線,它就會被執行。 該方案只停止執行下面的是什麼 當我明確的適用case語句 說“分手”。所以是錯誤的。 右,在這種情況下,作為一個結果。 殼體4或5或6,同樣地,將 打印出的信息。 在這種情況下,介質編號。 打破。 案例7,8,9,10,它會打印出“你選擇了一個大 號“。突破。 再有就是名副其實的關鍵字被稱為“默認” 這是有效像“別人”的建設。 因此,新的語法,但在智力上, 沒有在所有新來的。 這就像擦除。 如果,否則的話,否則的話,代碼塊。 所以這是這個程序的切換版本。 但是請注意,我們這樣做,是這裡的數字。 讓我打開了第二個版本,只是為了顯示 更具體一點的東西。 所以,在這裡,我們有檔次。 原來,你可以使用交換機,不只是整數,但在 字符。 不是所有的數據類型,但至少在字符。 所以在這裡,我們可以做這樣的事情,如果C的值, 使用者輸入,在第19行中,通過使用GetChar函數, 是資本或小寫字母a,讓我們把它解釋為一個檔次, 並說,他們拿起一個優異的成績。 順著switch語句,我們還有其他的 為“B”和“C”,以及等等的情況下。 但是,現在讓我們圓了另一件事情。 再次,種飛行 一些這些實施例。 但它確實使我們可以將它們應用,現在 - 真的,只是他們現在翻譯 - 為C。 所以,讓我繼續這樣做。 我要打開一個新的文件。 我要去做包括。 然後我要詮釋的主要(無效)。 讓我將此文件保存為一個loop.c. 只是作為一個例子。 我要繼續前進並執行以下操作。 我想寫一個非常繁瑣的程序。 因此,10。 讓我們這樣做。 9。 好的。 只要你開始做這在編程中,你 可能做錯了什麼。 但我們會從這裡開始了。 哎呀。 這實際上是錯誤的。 7。 6。 5。 4。 沒有什麼會發生什麼,當我們到達0。 3。 2。 1。 好吧。 0。 刪除。 好的。 因此,返回0。 因此,這一計劃顯然會做什麼,很 不厭其煩地說,這是要做的。 這將打印所有這些 值,由上到下。 因此,讓我做循環。 然後 - 哎呦。 使環路。 我是在錯誤的目錄。 現在讓我跑環。 輸入。 嗚呼。 很不錯的。 不錯,長的節目。 所有的權利,但現在讓我們做到這一點。 就像在刮,當你開始使用一個循環 建設,而不是僅僅複製和粘貼所有的 拼圖,讓我​​介紹一下這件事情。 因此,在C,有不同的循環結構, 其中一個看起來是這樣的。 一個“for”循環有三樣東西,用兩個分號分隔。 然後,身體內部的循環,所以說 - 花括號裡面的東西 - 我們可以做一些事情一遍又一遍。 所以我就在屏幕上,這是 從字面上評論。 / /在這裡的意思來評論。 這是不是代碼。 這僅僅是英文說明,對我來說,人的。 所以,初始化,條件和更新。 那麼,讓我們來看看它是如何工作的。 這讓我重寫程序如下。 對於 - 所以這裡是我的循環 - INT I - 來了一個變量命名為“i”的 - 得到初始化為10。 因此,有我的初始化。 我想要做的這個循環中,只要“我”是大於或等於 等於0。 這個循環的每一次迭代的,我想 做我 - 。 於是,我們看到了+ +(星期一)。 - 是相反的。 它的值遞減1。 這個循環裡面,我希望做一些事情。 所以我要像printf說些什麼。 我不想說10了,因為這顯然是剛 要打印相同的值。 我想要什麼,而不是打印,可能嗎? 是啊。 因此,“我”。因此,%D,I。 所以我要偷到一從早期的那些想法 - 這種偷梁換柱的格式代碼 - ,然後在這裡,在底部,我將返回0,只 良好的措施。 但現在,我有一個更簡潔的方案。 這是只有幾行字,而不是一些10或11號線。 讓我去我的提示下來。 翻拍循環。 重新運行循環。 和它似乎是相同的。 現在,該方案沒有更有趣。 但現在我可以鍵入這樣的事情。 我可以更改為100。 然後我就可以重新編譯我的程序。 然後我就可以重新運行我的程序。 而現在“超高速今天的計算機上。 然而,有我有 - 而實際上,我的屏幕緩存不 遠不止這些。 我們走吧。 因此,我們有所有100個。 但它很容易在這裡犯錯。 這是怎麼回事,是預期的行為,如果我 不小心這樣做呢? 因此,它感覺就像是無限的。 因此,讓我們來看看,如果在計算機的行為。 因此,讓我繼續前進,使循環。 讓我跑環。 因此,讓我們回來,在短短的時刻。 我們將讓這個運行。 因為,我們應該算什麼,微創? 大概至少2個十億,如果我們有多少位,和 我們使用的是正面的價值觀。 所以,讓我們跳回到這裡。 除了這些類型的循環,我們有什麼時,被稱為 循環。所以,就像在刮,你永遠 塊,你不得不重複塊。 同樣,在C中,你有其他的方式 表達自己。 所以,你有這個概念的一個while循環,可讓您 表達自己的一點點不同。 然後你有一些所謂的do-whil​​e循環, 經營略有不同。 而我們除了恥笑這些隨著時間的推移。 但是,讓我們來看看在這最後一個在這裡。 如果我們去 - 仍在運行。 這是相當無限的。 因此,讓我進入正面,並顯示如何,我們實際上可以 一點點更有效地治理用戶輸入。 這是一個很短的程序。 在這裡,我們有,在主,廉政n聲明。 所以給我一個變量n。現在,我從字面上說 “做的。”然後,我有左大 括號,靠近大括號。 然後請注意,右後,它說,當n 是小於1。 所以注意到,這些線 - 19至24 - 共同組成一個do-whil​​e循環。 再次,新的語法,而不是一個新的想法。 它只是另一種方式的循環,語法。 那麼,這是什麼做的? 而n是小於1,執行下列操作。 那麼,我該怎麼辦? 我要求你給我一個正整數。 然後我嘗試從用戶得到一個整數。 但在這裡的操作順序,因為 而條件是在這裡,我要檢查,是n 小於1? 因此,假設用戶 - 在這樣的要求後 - 類型中的值0。 這種情況是怎麼回事,是真還是假? 那麼,它是真實的。 因為n是0,和0小於1。 那麼,這意味著什麼呢? 再次這樣做。 再次這樣做。 再次這樣做。 只有當該條件的計算結果為false。 如果我輸入42。 好了沒有,42是不小於1。 因此,這個循環被執行。 因此,在這一點上,該程序會說,感謝 42,在這種情況下。 既然你有這樣的方式表達自己 - 我們不應該等待完成。 這將需要一些時間。 要繼續下一次,也許吧。 但現在,你有能力,希望了解一個 位的怪胎幽默。 抱歉。 在計算機科學的幽默,這是不是代表 世界,但它很可愛。 [笑]讓我們結束關於這一點。 我們星期一見。 [掌聲]