[音樂] DAVID J. MALAN:好吧,這是CS50。 而這是一個星期。 所以,記得最後一次是在零一周, 我們專注於計算思維。 而我們從轉變,要 從無到有,圖形化編程 從我們的朋友的語言 在麻省理工學院的媒體實驗室。 並與划痕,沒有我們探討 想法一樣的功能,和條件, 和循環,和變量,甚至 事件,以及線程,以及更多。 而今天,我們要 繼續使用這些想法, 真正帶他們 理所當然,但他們翻譯 被稱為現在C.另一種語言, C是一個更傳統的語言。 這是一個較低的水平 語言,如果你願意。 這純粹是文字。 所以乍看之下,它的 一切都將看起來相當神秘 如果你從來沒有編程。 我們將有 分號和括號, 和大括號,等等。 但是認識到,即使 雖然語法 即將看起來有點陌生 大多數的你,看過去那種。 並嘗試看看的想法 這的確都是熟悉的, 因為在這裡每週有什麼 我們將開始做的是比較, 最初,耐刮與C. 所以,舉例來說,回想一下,當我們 實現了第一個我們的節目 最後一次,我們有看起來塊 有點像this--時 綠旗點擊,然後我們有 一個或多個拼圖在它下面, 在這種情況下,就是說,世界你好。 因此,事實上,在划痕, 當我點擊了綠色環保標誌 運行我的程序,所以 可以說,這些都是 得到執行的塊,或運行。 和,特別是,臨時 說,你好,世界。 現在,我可以指定 這裡不同的話。 但是我們會發現,事實上,許多 這些blocks--確實的, 用C許多functions--可 參數化或定制 做不同的事情。 事實上,在C,如果我們 要轉換,現在, 這耐刮劃 這個其他語言, 我們將寫一 小這樣的事情。 當然,有一些陌生 語法有最有可能,INT, 和括號,和無效的。 但是,儘管你甚至會printf-- 認為這將只是打印。 但是打印表示打印 格式化,因為我們很快就會看到。 這從字面上將打印 到屏幕上的任何 是那些括號內,這 當然,在這種情況下,世界你好。 但你會發現一些其他的 語法,一些雙引號, ,在結束括號, 分號等。 因此,有一點開銷, 可以這麼說,無論是認知 和語法,我們要去 有不久記住。 但要意識到聯繫實際, 這將開始在你跳出來。 事實上,讓我們專注於一個 功能specifically--在這種情況下, 打招呼的世界。 所以說是功能。 你好世界是它的參數, 或參數,它的定制。 而在C中的等價只是 要在這裡成為這一行, 在這裡的printf相當於,說, 雙引號字符串,你好 世界是等效的,當然, 什麼是在白框那裡。 和反斜線N,雖然有點 奇怪的並從頭缺席, 簡單地說就是將有我們的影響 看到一台電腦,像我的Mac或PC, 只是移動 光標移到下一行。 這就像打 鍵盤上的Enter。 因此,我們將不久再次看到這一點。 但首先,讓我們來看看這個 在循環的情況下,其他的例子。 我們有這樣永遠循環最後一次, 這是一系列的拼圖 那做了字面上 forever--在這種情況下, 說,你好世界,你好世界, 世界你好,你好世界。 所以這是設計一個無限循環。 在C中,如果我們想實現這個 同樣的想法,我們可以簡單地做到這一點。 雖然如此,printf的招呼現在天下 - 同時,剛剛語義,那種 聯想到做的念頭 重複的事情,又一次,又一次, 多長時間? 那麼,true--回憶一下, 真正是剛上或1。 而真正的,當然,總是如此。 所以這是一種毫無意義的 聲明只是說真的。 但事實上,這是故意的, 因為如果真的僅僅是總是正確的, 而不是真正的就是意味著, 如果有點間接的, 那下面的代碼行 在這些大括號 應該只是又一次,又一次執行, 又一次,從來沒有真正停止。 但是,如果你希望你的 循環停止,因為我們 跟上次喜歡的東西 這種重複以下50次, 用C我們可以做什麼是相同的 被稱為為loop--關鍵字 不是一陣子,而是。 然後,我們有一些新的語法在這裡, 使用int i等於0,我不到50, 我++。 我們會回來這一點。 但是,這僅僅是我們如何會 翻譯組划痕塊 一組的碼C的行。 同時,考慮的變量。 而且,事實上,我們只是 看見一個人剛才。 並且在暫存的情況下,如果我們 要聲明一個叫做變量i 因為我是整數,只是一個數字, 我們希望將它設置為某個值, 我們將使用這個橙色 阻斷這裡 - 我設置為0。 而我們今天將看到和 超越,就像上週, 程序員做幾乎總是 從零開始計數,真 按照慣例。 但也因為召回 我們的二元討論, 最小的號碼,你可以 用任何數目的位表示 只是將是0本身。 所以,我們通常會開始 即使初始化我們的變量為0。 而在C ++做的一樣, 我們會說INT 為整數,我只是按照慣例。 我可以叫這個變量 任何我想要的,就像在刮。 然後等於0只是受讓人 從右側的值0 並將其放入變量,或 儲存容器有,在左側。 和分號,我們會see--和 我們已經看到了一些這些already--的 只是意味著思想的終結。 繼續做別的事情 在接下來的線。 現在,關於布爾表達式? 回想一下,在刮, 這些人表情 那些是真 或false--問題, 真的,要么是真還是假。 因此,在划痕的情況下,我們可能 問一個簡單的問題,這樣, 為i小於50? 所以我,再次是整數。 也許我們正在使用它 在臨時計劃 保持比分的軌道 或類似的東西。 所以這個語法在這裡划痕 只是手段,是我不到50? 好了,幸運的是,事情是 簡單的C。和翻譯, 這一點,我們就簡單的說我少 50,使用熟悉的關鍵 鍵盤上。 同時,如果你想 說一些比較一般, 像,很好,比y這裡每個x少 x和y的本身變量? 我們可以做同樣的事情 在C,只要我們已經 創建這些變量了。 我們將看到如何 這樣做不久。 我們就簡單的說比Y X更少。 所以,你開始 看到一些相似之處。 和誰做那些人 從無到有是肯定 通過其中的一些基本思想的啟發。 你會看到這樣的 語法在很多languages​​-- 不只是劃傷, 只是C,但是Python, 和JavaScript,以及 其他語言依舊。 讓我們考慮另一種結構 從C,條件的概念, 做一些有條件。 如果事情是真的,做到這一點。 如果別的東西是真實的,做到這一點。 這有點編程的 在一個岔路口的等價物。 也許這是一個叉雙向的, 三通叉,或更多。 而在划痕,我們可能有 看到這樣的事情。 所以這一塊是一個大的。 但考慮到相對 邏輯簡單性。 如果x小於y,然後說x是少 比Y,否則如果x大於y, 然後說x是大於y。 然後,在邏輯上,如果, 回想一下划痕 或者只是你自己的人的直覺, 好吧,如果x不大於y,並且x 不除Y更小,則當然 x被將是等於y。 因此,在這種情況下,通過嵌套 這些划痕塊, 我們可以實現一個三 在行進的方式叉? 同時,如果我們想 這樣做,在C,它可以說是 看起來至少有一點simpler-- 一旦你熟悉的語法。 如果x小於y, printf的x是小於y。 否則如果x大於y, printf的x是大於y。 其他的printf x等於y--和, 再次,與那些反斜杠只 對於這些新的生產線,這樣,如果你 居然跑這種方案 它只是移動 光標最終 到屏幕的下一行。 現在,同時有划痕等 更複雜的功能,只 其中有些我們要 最初移動到C的世界 其中之一是 稱為划痕列表。 這是一個特殊的 變量的類型 允許你存儲多個事 在回來,背,背,背。 在C中,它不具有 名單,本身的事,但 是更一般 所謂的陣列,雖然我們 回來以後這個學期 要尋找的東西 所謂的名單,還是真的鍊錶。 但現在,最接近 相當於C語言為我們 會是什麼 稱為陣列。 和陣列是一個簡單的 特殊類型的可變的 這允許你存儲數據 背,背,背,背到。 而且,事實上,在划痕, 如果我們想訪問 數組的第一元素或 一個列表中 - 我要去稱呼它, 按照慣例,argv的,說法 矢量,但不久還有更多。 如果我想要得到的第一個元素 ARGV的,在刮的世界 你實際上做一般 從1開始計數。 所以,我可能會得到argv的第1項。 這是麻省理工學院的只是如何實現的 列表的概念。 但在C,我要去 更簡單地只是說,ARGV, 這又是對我的名字 列表中 - 或者是明確的,一個數組。 如果我想第一 元素,我要去 用方括號,你 可能不會經常鍵盤下使用。 但是,0只是意味著,拿到我的第一。 等等場合和 久而久之,我們要去 開始看到這些二分法 划痕和C之間, 即刮使用一個。 我們用C在這裡使用0。 但你會很快看到 一旦你理解 每種語言的基礎,即 這些事情開始變得更加 熟悉通過實踐和實踐。 因此,讓我們實際上是在一個程序現在看起來。 這裡應是第一個我們的C 完整程序的源代碼。 而該計劃,我們要去 提供審議 就是這相當於一個 那個早期的刮片。 所以在這裡,我們有什麼 可以說是最簡單的C程序 你可以寫 實際上做什麼。 現在,我們來看看過去, 現在,已經包括, 標準io.h,而這些角度 括號和int和無效的, 及大括號,和類似物。 而我們只專注於 什麼,至少直覺, 可能會對你已經跳出。 事實上,主要的,我不知道 一定知道這是什麼, 但就像刮了,當 綠旗點擊拼圖, 這樣做C作為編程語言 有一個主一段代碼, 被默認執行。而且,事實上, 它字面上將被稱為主。 所以主要是一個函數。 而且它是一個真實存在的特殊功能 用C,當你運行一個程序, 它是由被主運行 默認。在划痕的世界裡, 它通常是,當綠旗 點擊的得到了默認情況下運行。 同時,我們已經見過這個, printf的或打印的格式,這是 也會有一些自帶的功能 C,伴隨著一大堆別人的, 從時間和時間的意願 再次,為了準確地做 正如它的名字所暗示的,打印的東西。 我們究竟要打印? 好吧,我們會看到, 由封閉字符 像these--世界你好, 反斜杠n的雙引號, 我們可以告訴準確的printf 什麼要打印在屏幕上。 但為了做 這一點,我們很遺憾 需要採取的東西是 已經隱晦了我們人類, 但至少它有點readable-- 犀利包括標準io.h,INT, 主要的,無效的printf,所有的神奇 咒語剛才我們看到在屏幕上。 但是實際上我們要 走得更神秘依舊。 我們首先需要翻譯的代碼 我們編寫成機器代碼。 而從上週回顧機, 至少那些我們知道這裡, 在一天結束的時候只 了解零和一。 我的上帝,如果我們寫這些 零和的實際計劃, 它會非常快 採取樂趣的事情。 但事實證明,每上週, 該零和一的這些模式 只是有特殊的意義。 在某些情況下, 他們可能意味著數。 在某些情況下,它們可能意味著 字母或顏色,或任何數目的 其他抽象存在於。 但是,就像你的電腦有 一個CPU,中央處理單元, 或您的計算機內的大腦。 它通常是英特爾 在裡面,因為這是 最大的公司之一 這使得CPU的電腦。 那麼,英特爾的CPU及其他 只需提前決定 該零點的某些模式和 那些指具體的事情。 零和一的某種模式 將意味著,打印此屏幕, 或加這兩個數字,或 減去這兩個數字, 或將這塊數據從 我的電腦的記憶在這裡, 或任何數量的其他非常低的水平, 但最終有用的,運營。 不過,值得慶幸的是,我們人類都不會 需要知道這些細節。 事實上,和上次一樣,我們在那裡 又一次,又一次,又一次抽象, 從很低水平建設 基元像零和一 更高層次的概念 像數字和字母, 和顏色,以及多, 所以我們可以為程序員 站在肩上 別人在我們面前誰也來了 和使用的軟件,其他 人前us--采寫 即所謂的程序編譯器。 C是一種語言, 通常編譯, 這意味著從轉換 源代碼的機器代碼。 特別是,這意味著什麼 是,如果你有你的源代碼 代碼,您自己寫,因為我們很快 將在剛剛在屏幕上的時刻, 並且希望將其轉換 最終以機器代碼 - 這些零和那些 只有你的Mac或PC機 understands--你已經有了一個第一 養活源代碼作為 輸入到一個特 程序調用一個編譯器, 輸出其中我們 應當看到的是機器代碼。 而且,事實上,上次我們聊 一下,果然,在一天結束的時候, 解決問題。 你有投入。 和你有輸出。 和你有某種 在中間算法。 算法可以肯定是 在軟件中實現, 正如我們所看到上週偽 當我們將與實際的代碼看 本星期。 所以編譯器真的只是 有一組算法內 它知道如何 轉換成特殊的關鍵字, 像主,和printf, 和其他人,我們只是 只見到零的模式和 那些Intel Inside和其他CPU 其實理解。 那麼,如何才能做到這一點? 我們在哪裡可以得到一個編譯器? 我們中的大多數在這裡有一台Mac或PC。 而你運行Mac OS,或 Windows或Linux或Solaris, 或任何數量的其他 操作系統。 而且,事實上,我們可以 走出去到網上 並下載一個編譯器 為您的Mac或PC機 為您的特定的操作系統。 但是,我們都將是上 不同的頁面,可以這麼說。 我們會略有 不同的配置。 而事情是行不通的都是一樣的。 而且,事實上,這些天 我們很多人不使用 僅運行在我們的筆記本電腦的軟件。 相反,我們使用的東西 像的瀏覽器 允許我們訪問基於Web的 在雲應用。 後來這個學期, 我們將這樣做。 我們將編寫應用程序或 使用代碼 - 軟件不是C, 但其他語言如Python和 JavaScript--在雲中運行。 要做到這一點,我們自己 在本學期 將實際使用基於雲計算的 環境被稱為CS50 IDE。 這是一個基於網絡的編程 環境,或集成開發 環境,IDE,它內建一些之上 所謂雲9開源軟件。 我們已經取得了一定的教學 簡化到它 從而隱藏某些功能 我們並不需要在第一週, 之後就可以 揭示他們做最 任何你想要的環境。 它讓我們也一樣,要 預安裝某些軟件。 比如像所謂的CS50 圖書館,我們很快就會看到 為我們提供了用C與一些 附加功能。 所以,如果你去,最終CS50.io, 你會被提示登錄, 一旦你這樣做,並創建 一個是免費的賬號, 你將能夠訪問 環境看起來很喜歡這一點。 現在,這是默認模式。 一切都是好的, 明亮的屏幕上。 我們很多人都習慣 工作CS50一塊是 挺到深夜。 所以,有些人可能更喜歡 把它變成夜間模式,可以這麼說。 但是,最終,你在做什麼 要CS50 IDE中看到 是三個不同的areas-- 在離開的地方面積 您的文件將要在 雲,在右上方的區域 在您的代碼將是編輯。 您可以打開 對於任何程序各個選項卡 你寫的裡面這學期 最重要的是右上角。 然後最arcanely, 然而有力, 將是這個東西在 底部被稱為一個終端窗口。 這是一個老同學 命令行界面, 或CLI,允許 你執行命令 在這種情況下,computer--, 在cloud--電腦 做事喜歡編譯代碼 從源代碼到機器碼, 運行您的程序,或者啟動 Web服務器或訪問數據庫, 和任意數量的其他技術 我們將開始不久使用。 但到那裡,我們 去居然有 到網上去,並開始播放。 要做到這一點,讓我們先 開始擺弄為主, 寫一個程序的主要部分。 讓我們使用這個函數 printf的,這是我們前面使用, 簡單地說幾句。 所以我在這裡已經CS50 IDE裡面。 我登錄的進步。 我完全屏蔽的窗口。 所以,最終,你 過在未來的問題 將遵循類似步驟 將提供在線文檔。 所以你不必擔心 每吸收一點技術一步 我今天在這裡做。 但你會得到這樣的畫面。 我碰巧在夜間模式。 你可以照亮一切 同比禁用夜間模式。 而在底了 一天,你會看到 這三個主要areas--文件 在瀏覽器的左邊,代碼標籤向上頂, 和在底部的終端窗口。 讓我繼續前進, 寫我的第一個程序。 我要搶先去文件, 保存,我的文件保存為hello.c的。 事實上,按照慣例,任何程序我們 寫是寫C語言 名稱應該 C點,按照約定。 所以,我打算將其命名為hello.c的,因為 我只是想打個招呼世界。 現在,我要放大 並點擊保存。 和所有我現在這裡是一個標籤 在我可以開始編寫代碼。 這不會編譯。 這意味著什麼。 所以,即使我轉換 這對零和一, 在CPU將不得不無 知道發生了什麼繞來繞去。 但是,如果我寫的線條那些匹配 就以C的conventions-- C是, 再次,這language--語法像 對此,printf的招呼天下 - 我已經 得到舒服 這樣隨著時間的推移。 所以,我不認為我做了 任何印刷錯誤。 但是,不約而同地,第一個 你這樣做的時候,你會的。 什麼我將做很可能會 也不會為你工作的第一次。 而這完全確定, 因為現在你 可能只是看到一大堆新奇的, 但隨著時間的推移,一旦你熟悉 與此環境下,並 這種語言,等人, 你會開始看到的東西, 要么是正確或不正確。 這是什麼 教學研究員,當然 助理在得到隨著時間的推移這麼好,是 察覺你的代碼錯誤或錯誤。 但我要求有 在這段代碼中沒有錯誤。 所以,我現在要運行這個程序。 現在我自己的Mac或PC,我在 中雙擊圖標的習慣 當我要運行一些程序。 但是,這不是模型在這裡。 在這樣的環境中,這是CS50的IDE。 我們使用的操作系統 系統稱為Linux。 Linux是讓人聯想到另一 操作系統,通常已知 作為Unix的。 而Linux是特別出名 有一個命令行環境,CLI。 現在,我們使用一個特定的 Linux的味道叫做Ubuntu Linux系統。 和Ubuntu是一個簡單的 某些版本的Linux。 但是這些的Linux的這些天真正做到 配備了圖形用戶界面。 和一個我們碰巧 在這裡使用是基於Web的。 因此,這可能看起來甚至 從東西有點不同 你自己可能有 看到或跑過去。 所以我要繼續前進 現在做到以下幾點。 我已經保存此文件的hello.c。 我要繼續前進, 類型clanghello.c所以鏘 對於C語言編譯器。 這是預安裝在CS50 IDE。 你完全可以下載 在自己的Mac或PC上安裝它。 但是,同樣,你不會有所有的 為您預先配置完成。 所以現在,我只是 要運行clanghello.c。 而現在注意到這一點語法 這裡最終將 認識只是意味著我在 文件夾或目錄被稱為工作區。 這個美元符號僅僅是慣例 為內涵,在這裡輸入你的命令。 這就是被稱為一個提示,只是 按照慣例是美元符號。 如果我繼續前進,現在並點擊 回車後,似乎沒有任何已經發生。 但是,這實際上是一件好事。 出現這種情況就少 您的屏幕,越有可能 你的代碼是正確, 至少語法。 所以,如果我想運行此 程序,我該怎麼辦? 嗯,事實證明, 按照慣例默認名稱 對於程序時,您不指定 名稱為您的計劃僅僅是為a.out。 而這也是語法,你會 熟悉不久。 點斜線只是意味著,哎,CS50 IDE,運行一個名為a.out的程序 這是我的當前目錄裡。 這點是指當前目錄。 我們會看到什麼其他的這些序列 人物不久手段。 所以在這裡我們去,回車,世界你好。 你會發現,發生了什麼? 它不僅打印的hello world。 它也感動 光標移到下一行。 以及為什麼呢? 那是什麼,我們以前寫的代碼 即確保該光標將 繼續下一行? 大約一個有趣的事情 計算機是它一定會 做字面上你告訴它做。 所以,如果你告訴它給printf你好, 逗號,空間,世界,接近報價, 它字面上只打算 打印這些字符。 但我有這個特殊字符 在年底,召回,反斜線ñ。 而這正是保證 該字符去 到屏幕的下一行。 事實上,讓我去做到這一點。 讓我繼續前進,刪除。 現在,請注意 我的屏幕上方有 一個小紅燈 標籤顯示, 哎,你不保存文件。 所以,我要與控制繼續前進 S或命令S,保存文件。 現在goes--去了moment--綠色。 而現在又回到了 只是作為一個關閉圖標。 如果我現在再次運行clanghello.c, 進入,點斜線,a.out的,回車, 你會看到,它仍然工作。 但它可以說是一個小馬車。 現在,我的工作區prompt--, 然後是美元符號, 然後我的實際prompt-- 是所有在同一行上。 所以這肯定是一個錯誤的審美, 即使它不是一個真正的邏輯錯誤。 所以,我要撤銷我只是做了。 我要重新運行的a.out。 請注意,我已經添加了 換行符回來。 我保存的文件。 所以,我要的a.out重新運行,還有 - 該死,一個bug,錯誤的意思的錯誤。 因此,錯誤是,即使 我加了反斜線Ñ那裡, 重新保存,重新運行該程序, 的行為是相同的。 為什麼會是這樣? 我缺少的一個步驟,對不對? 這關鍵的一步早前是你有 當你改變你的源代碼中場休息, 事實證明也辦 它通過編譯 再次讓你獲得新的機器代碼。 和機器代碼, 在零和一, 將要幾乎相同,但 不完全是這樣,因為我們需要的, 當然,新的線路。 因此,要解決這個問題,我會需要 重新運行clanghello.c,輸入,點 斜線,a.out的。 而現在,世界您好又回來了 在那裡我希望它是。 因此,這是一切優秀和良好。 但a.out的是一個相當愚蠢的名字 方案,即使它正好是, 由於歷史的原因, default--意思裝配輸出。 但讓​​我繼續在這裡 而不同的做到這一點。 我希望我的Hello World程序 實際上叫你好。 所以,如果它是一個圖標我 台式機,它不會被A.OUT。 它會被稱為打招呼。 因此,要做到這一點,事實證明 那鐺,像許多節目, 支持命令行參數, 或標誌,或開關 它只是影響其行為。 具體來說,鏘支持破折號Ø 標誌,然後拿著第二個字。 在這種情況下,我會隨意, 但合理的,把它打個招呼。 但我可以把它叫做什麼 我想,除了a.out的,這 會相當除了點。 然後只需指定名稱 文件我確實想編譯。 所以,現在即使在開始 命令我仍然有鐺的, 在命令結束時 我仍然有文件名, 我現在有這些命令行 參數,這些標誌是在說, 哦,對了,輸出-O,文件 名為hello,而不是默認的a.out。 所以,現在如果我打回車鍵,沒什麼 似乎已經發生了。 而且,然而,現在我可以做點斜線打招呼。 所以這是相同的程序。 在零和一的 相同在一天結束。 但是他們兩個 不同files--的a.out, 這是第一個版本 和公正的愚蠢命名, 現在你好,這是一個非常 更引人注目的名字的程序。 但是,說實話,我從來沒有 又要記住這一點, 又一次,又一次。 而且,事實上,正如我們寫 更複雜的程序, 你的命令 不得不寫 要報復 更複雜的仍。 所以不用擔心。 事實證明,人類前 我們已經意識到,他們也 有這個相同的問題。 他們也沒有享受不必 鍵入相當長的,神秘的命令, 更不用說記住他們。 所以,擺在我們面前的人類已經取得 其他程序,可以更容易 編譯軟件。 而且,事實上,這樣的一個 計劃被稱為製作。 所以我要繼續前進,並做到這一點。 我要撤銷我的一切 正好在下面的方式一樣。 讓我LS型。 你會注意到三個things-- a.out的,和一個明星,你好 和一個明星,而hello.c中。 但願,這應該 有一點直觀, 只要前面有 沒有在此工作空間。 沒有什麼,我有 創建,直到我們開始上課。 和我創建的hello.c。 然後我編譯它,並把它稱為a.out的。 然後我再編譯稍微 不同,稱之為打招呼。 所以我有這個目錄中的三個文件, 在這個文件夾叫工作空間。 現在,我可以看到,以及 如果我縮小實際。 如果我縮小這裡 看那個右上角 角落裡,如許左 屏幕的右側 總是會告訴你 什麼是在您的帳戶,有什麼 裡面CS50的IDE。 而且有三個文件存在。 所以,我想擺脫的a.out和打招呼。 正如你可能 想像直觀,你 可以控制排序點擊 或右鍵點擊這個。 而這個小菜單彈出。 您也可以下載文件,運行 它,預覽,刷新,重命名, 或什麼不是。 而且我可能只是刪除, 它會消失。 但是讓我們做的事情有一個命令 行了,這樣才能讓自己舒服 這一點,並做到以下幾點。 我要繼續前進,並刪除 通過鍵入字面上rma.out的a.out。 原來,該命令 去除或刪除的東西, 是不是刪除或刪除。 這是更簡潔RM,只是為了節省 你一些按鍵,並按下回車鍵。 現在,我們要有點 神秘地刪除常規文件的a.out。 我真的不知道是什麼的 不規則的文件會呢。 但我要刪除它。 所以,我要鍵入Y(是)。 或者,我可以鍵入它,然後按Enter鍵。 並再次,好像沒有什麼改變。 但是,這是一般,是一件好事。 如果我輸入ls這一次, 我應該怎麼看? 我們希望,只是打招呼,hello.c中。 現在,順便說一句,你會 注意到這一點明星,星號, 這是在我的節目的結束。 而且他們也顯示為綠色。 這僅僅是CS50 IDE的方式 cluing你到事實的 那這不是源代碼。 這是一個可執行文件,可運行 你可以實際運行的程序 通過做點斜杠,然後它的名字。 現在,讓我繼續和刪除 對此,RM你好,回車,定期刪除 文件你好,是的。 現在,如果我輸入LS, 我們又回到hello.c中。 盡量不要刪除 實際的源代碼。 即使有特點 內置IDE CS50在哪裡 你可以通過你的修訂歷史記錄 並及時退,如果你不小心 刪除一些東西,做銘記 按照這些提示是或否, 什麼你真正想做的事情。 如果我去到頂部 這裡左手角落, 剩下的工作就是hello.c中。 因此,有一束束 其他命令你 可在Linux世界執行, 其中之一是,再次進行。 而我們要製作 我現在的程序如下。 而不是做鐺的, 而不是做鐺-O, 我要簡單地 從字面上類型,製造打招呼。 而現在發現,我 不打字做的hello.c。 我打字做打招呼。 而這個節目的製作 自帶CS50 IDE,以及更多 一般的Linux, 是一個程序,是 要做一個名為Hello程序。 而且它要承擔,按照慣例, 如果可以進行該程序, 它會從一個源發 代碼文件中C點結束,hello.c中。 所以,現在如果我打回車,通知, 這被執行的命令 實際上甚至更長 前比以前。 那是因為我們已經 預配置CS50 IDE有 建於一些額外的功能 我們並不需要,只是還沒有,但很快會。 但關鍵的事情來實現 現在我有一個Hello程序。 如果我再次鍵入LS,我 有一個hello程序。 而且我可以運行它 點斜線a.out的,不, 因為這個整點 演習點斜線打招呼。 現在,我有我的Hello World程序。 所以向前走, 我們幾乎永遠只是 要編譯我們的節目 使用命令make。 然後,我們將通過為它們運行 點斜線,程序的名字。 但要意識到什麼使正在為 你,是它本身不是一個編譯器。 這只是一個方便程序 知道如何觸發一個編譯器 運行,讓你自己可以使用它。 還有什麼其他的命令中存在 Linux和依次CS50的IDE? 我們很快就會看到,有一個 CD命令,切換目錄。 這允許您在 你的命令行界面 繼續前進,和背部, 並打開不同的文件夾 不使用鼠標。 我們看到了LS,代表名單 在當前目錄中的文件。 讓迪爾,你可以 可能開始推斷 這些意味著什麼now--創建目錄, 如果你想創建一個文件夾。 RM為刪除,RM為迪爾 刪除directory--而這些, 再次,是命令行 什麼你現金等價物 可在CS50 IDE與你的鼠標。 但是,你很快就會發現 有時它只是 速度快了很多做 事用鍵盤, 最終很多更強大。 但是,這很難說 任何事情我們一直在做,到目前為止 是所有強大的,當所有 我們一直在說的是,世界你好。 而且,事實上,我的硬編碼 也就是說世界你好了我的計劃。 有沒有活力呢。 划痕是一個數量級 更有趣的最後一周。 所以,讓我們在那裡。 讓我們走向一個一步 一些這些功能的方法。 所以不僅ç配備的printf, 其它的功能和束 其中的一些,我們會看到 隨著時間的推移,它不 使這一切容易右出 在獲取用戶輸入的柵極。 弱點事實上,人們 的語言,如C, 甚至Java和尚未 別人是,它不 可以很容易地只得到一樣的東西 從用戶或字符串,整數的話, 和短語,讓喜歡獨處的東西 浮點值,或實數 帶有小數點的,真 長數字,因為我們很快就會看到。 所以功能這個名單在這裡,這些 就像其他的划痕拼圖 我們已經預先安裝在CS50 IDE,我們將用數週 作為各種訓練車輪,和 最終把他們趕走,並期待 引擎蓋,也許,在下方 這些東西是如何實現的。 但要做到這一點,讓我們 其實寫一個程序。 現在讓我先走。 而且我要創建一個新的 通過點擊這個小加檔, 然後單擊新建文件。 我要救這下 一個作為,讓我們說,string.c, 因為我想用繩子玩。 和字符串在C是剛 字符序列。 所以,現在讓我們繼續 並做到以下幾點。 包括標準IO.h--和 事實證明標準IO, IO只是意味著輸入和輸出。 所以,事實證明, 這裡這條線是什麼 在相鄰的我們用printf。 printf的,當然,產生輸出。 因此,為了用printf,原來 出你必須有這行代碼 在你的文件的頂部。 我們會回來的是什麼 不久的真正含義。 事實證明,在 任何C程序我寫的, 我必須與啟動 代碼如下所示。 你會發現CS50 IDE和 其他集成開發 喜歡它的環境, 要盡可能在 他們可以完成你的想法。 其實,剛才我是否撤消 我只是做了,我打回車鍵。 然後我打左大 撐,命中再次輸入。 它完成了我的想法。 它給了我一個新的生產線,縮進不會少 對於好的文體的原因,我們拭目以待。 然後它會自動給我 那花括號來完成我的想法。 現在,它並不總是 猜你想要做什麼。 但在很大程度上,它確實 為您節省一些按鍵。 所以,剛才,我們跑這program-- 你好,世界,然後編譯它, 然後運行它。 但這裡有沒有活力。 如果我們想 做不同的事情? 好吧,如果我想實際 獲取來自用戶的字符串? 我將使用一塊拼圖 正是所謂的that--得到的字符串。 用C原來,當你不想要 提供輸入到一塊拼圖, 或者更恰當給一個函數,你 從字面上只是做開括號, 右括號。 因此,這好像有 沒有白框鍵入。 之前說塊 有一個白色的小盒子。 我們沒有白框現在。 但是,當我調用get字符串,我 想不想找個地方把結果。 所以在C很常見的模式是 這裡調用一個函數,以獲得更多的字符串, 然後存儲它的返回值。 它的結果其 努力的東西。 什麼是 構造在編程, 無論是在划痕或現在C,我們 可以使用實際存儲的東西嗎? 稱它是可變的,對不對? 而在劃傷,我們真的不 關心變量打算。 但是,在這種情況下,我們實際上做的。 我要說的字符串。 然後,我可以打電話給 這樣的事情我想要的。 我要叫它 名稱,獲取得到的字符串。 現在,即使你 有點新本, 注意到,我缺少一些細節。 我忘了一個分號。 我需要完成這一思想。 所以,我打算將我的光標, 並創下分號那裡。 和你有我只是做了什麼? 在這行代碼, 此刻號5, 我調用get字符串,沒有投入。 因此,有不小的白色 像盒保存塊。 我只是說,嘿, 電腦,給我一個字符串。 等號是不是真的 一個等號,本身。 這是分配 操作者,這意味著, 哎,電腦,移動值 從以上至左右。 而在左邊,我有以下。 嘿,電腦,給我一個string-- 字符序列。 並調用該字符串名稱。 我甚至不具備調用它的名稱。 我可以調用它,按照慣例, 像S, 就像我們用我來 調用變量i。 但現在我需要用它做什麼。 這將是非常愚蠢的 嘗試編譯這段代碼,運行 這個程序,即使 我得到一個字符串, 因為它仍然只是 去打招呼的世界。 但是,如果我不想要什麼來改變這種狀況。 我為什麼不這樣做呢? %的S,逗號秒。 這是一個有點神秘依舊。 所以,讓我的變量更加清晰。 讓我這個變量名稱。 讓我們看看如果我們不能去惹 除了這裡發生了什麼。 因此,對五號線,我得到的字符串。 而我存儲這個字符串, 無論用戶已鍵入的 在他或她的鍵盤, 在一個名為名稱的變量。 而事實證明, printf的不只是 採取雙重一個參數 引號,在雙引號的輸入。 它可以採取兩個或三個,或更多,如 使第二,或第三,或第四, 是變量所有的名字, 或者特別重視, 要插入, 動態,用引號引起該字符串。 換句話說,什麼 將問題呢? 如果我只是說你好名稱,反斜線 N,救了我的文件,我的編譯代碼, 跑了這一點,會發生什麼? 它只是會說,你好 名字,從字面上N-A-M-E, 這是一種愚蠢的,因為 這是一個從世界上沒有什麼不同。 因此,在行情是什麼 什麼字面上被打印出來。 所以,如果我想有 一個佔位符那裡, 我真正需要使用 一些特殊的語法。 而事實證明,如果你讀了 對於printf函數的文檔, 它會告訴你, 如果你使用%的S, 您可以按如下替換值。 後一個逗號後 雙引號,你只需 寫的名字 要變 插上到該格式 代碼或格式說明, %的S代表字符串。 現在,如果我救了我的文件, 我回去到我的終端。 而I型製作繩, 因為,再次,在此名稱 我之前選擇的文件是string.c。 所以,我要說讓字符串,請輸入。 我的天哪,看看所有的 錯誤我們已經取得了。 而這is--什麼,這實在是 像六,七行程序? 因此,這是它可以很 快速獲得壓倒性的。 該終端窗口有 現在只是反芻 數量巨大的錯誤消息。 當然,我沒有更多的錯誤 消息比我行代碼。 那麼到底是怎麼回事? 那麼,最好的策略 做到任何時候你 確實遇到了壓倒性 這樣的錯誤列表, 被回滾,查找命令 你剛剛運行,這在我的情況下, 為使字符串。 看看什麼使所做的,就是這樣 長鐺命令,沒什麼大不了的存在。 但紅色是壞的。 格林試圖將 溫柔,樂於助人。 但它仍然很糟糕,在這種情況下。 但是,在這樣做不好? String.c,五號線,性格五位。 所以這只是常見的約定。 結腸癌的東西意味著什麼 行數和字符數。 錯誤,使用未申報 標識字符串。 你的意思是標準? 所以,不幸的是,鏘 試圖有所幫助。 但是,它是錯的,在這種情況下。 不,鏘,我不是故意的標準IO。 我的意思是在同一行,不錯。 但是,五號線在這裡這一個。 而鏘不 了解S-T-R-I-N-G。 這是一個未聲明的標識符, 一句話,它只是從來沒有見過的。 那是因為C,語言 我們在寫代碼的權利, 不具有的變量稱為串。 這不,在默認情況下,支持 所謂的字符串。 這是一個CS50一塊 行話,但很傳統。 但是,我可以按如下方式解決這個問題。 如果我添加一行代碼 這個程序的頂部, 包括CS50.h,這是另一種文件 裡面的某個地方IDE CS50的某處 在硬盤上,可以這麼說, 在Ubuntu操作系統 我參加競選,這 是的文件 要教工作 系統中的字符串是什麼,只是 像標準io.h是文件 在操作系統中那 要教它是什麼的printf。 事實上,我們會得到 一個非常類似的消息 如果IO也認標準 IO.h並試圖用printf。 所以我要繼續前進,只是 採取控制L到清除我的屏幕。 或者,您可以鍵入清晰,它會 只是清除終端窗口。 但你仍然可以在時間上向後滾動。 而我要重新運行製作繩。 穿過我的手指此時,回車。 哦,我的上帝,它的工作。 它顯示了我很長的神秘命令 這是通過鏘請生成的內容, 但沒有錯誤消息。 所以實現的,即使 你可能會得到完全 此番與 錯誤信息的數量, 也許會是這惱人的級聯 實際上,在那裡鏘不明白 一方面,這意味著它然後 不理解下一個字, 或下一行。 所以它只是扼流圈您的代碼。 但是,該補丁可能很簡單。 所以始終圍繞 輸出的第一行。 如果你不這樣做 理解,只是看 關鍵字,可能是 線索,並且行號, 和字符,其中 這種錯誤可能是。 現在讓我先走,然後鍵入 點斜線,字符串,請輸入。 嗯,這不是打個招呼什麼。 為什麼? 好了,還記得,它在哪兒跑? 它可能停留在此刻 在一個循環中,如果你願意,六線, 因為設計的GET字符串, 通過CS50的工作人員寫的, 字面意思只是坐在 在那裡等著,等著, 並等待一個字符串。 所有我們所說的字符串是人力的投入。 所以,你知道嗎? 讓我先走。 而就心血來潮,讓我 輸入我的名字,大衛進入。 現在我有一個更加動態的程序。 它說,你好大衛。 如果我繼續前進,再次運行此, 讓我試試說Zamila名稱,輸入。 現在我們有一個動態的程序。 我沒有硬編碼的世界。 我沒有硬編碼 名稱或大衛,或Zamila。 現在它更像程序 我們知道,在那裡,如果需要輸入, 它產生的輸出結果略有不同。 現在,這並不是最好的 用戶體驗,或者UX。 我運行該程序。 我不知道我應該 這樣做,除非我其實看 或記住的源代碼。 因此,讓用戶 遇到好一點 用最簡單的事情。 讓我回去到這個 程序,簡單地說printf的。 讓我繼續說名字,結腸, 和一個空間,然後分號。 而只是踢,無隙ñ。 這就是故意的, 因為我不想 提示移動到下一行。 我想,相反,這樣做,使串 重新編譯我的代碼到新機 代碼點斜線的字符串。 啊,這是非常漂亮。 現在,我實際上知道什麼是電腦 要我做的,給它一個名字。 所以我要繼續前進,並鍵入 在羅布,進入,你好,羅布。 因此,實現,這仍然是,在結束 當天,只有一個九行程序。 但是,我們已經採取了這些嬰兒的步驟。 我們寫了一行與我們 熟悉,printf的,世界你好。 然後,我們毀掉了那一點。 而我們實際使用的GET字符串。 而我們在扔一個變量值。 然後我們說乾就幹,提高 它進一步與第三行。 與此迭代過程 寫軟件是真正的關鍵。 在CS50,而在一般的生活, 一般情況下不應坐下, 心中有一個程序,並嘗試寫作 整個該死的事情一下子。 這將不可避免地導致的方式 更多的錯誤比我們自己在這裡看到。 就連我,為了這一天,不斷 讓其他愚蠢的錯誤, 其實更難錯誤 這是很難搞清楚。 但你會犯更多的錯誤越多 行代碼你寫的一次。 所以這種做法, 編寫代碼一點點 你是舒服,編譯 它,運行它,更普遍的測試, 然後移動on--所以就像我們不停 分層和上週層次感, 從建築的東西很 簡單,更複雜的東西, 做同樣的在這裡。 不要坐下來,並嘗試 寫一個完整的問題。 實際上採取這些嬰兒的步驟。 現在,字符串是不是所有的 對自己有用。 實際上,我們應該,理想情況下,喜歡 在我們的工具包東西。 因此,讓我們真正做到這一點。 現在讓我繼續前進,掀起 一個稍微不同的程序。 我們會打電話給這個int.c,為整數。 我要去,同樣, 包括CS550.h。 我將包括標準IO。 而這將是很常見 在類的這些最初幾天。 而我要準備好 我自己用的主要功能。 而現在,而不是得到一個字符串, 讓我們繼續前進,並得到一個int。 讓我們把它叫做我,並把它弄 INT,關閉括號,分號。 現在,讓我們做 東西吧,printf的。 比方說像 你好,反斜杠N,逗號我。 所以,我幾乎模仿 我所做的只是一個剛才。 我有一個佔位符在這裡。 我在這裡用逗號我,因為我想 堵塞我到該佔位符。 因此,讓我們繼續前進,並嘗試 編譯此程序。 該文件稱為int.c. 所以我要說,讓INT輸入。 噢,我的上帝,但沒什麼大不了的,對不對? 有一個錯誤。 有一個語法錯誤 這裡是程序不能 裡面int.c,行編譯 七,性格27,錯誤格式 指定char類型 明星,不管它是什麼。 不過,參數類型為int。 所以在這裡,我們不打算中場休息 雖然今天是很多的材料, 我們要以壓倒你 絕對的C每一個功能, 和編程更一般地, 在短短的這些最初的幾個星期。 因此,有經常將是行話 與你不熟悉。 而且,事實上,焦炭星是什麼 我們要回來 在兩個星期的時間。 但現在,讓我們看看如果我們能 解析是熟悉的字眼。 Formats--所以我們聽到的格式 說明,格式代碼之前。 這是熟悉的。 類型 - 但參數的類型為int。 等一下,我是一個int。 也許%的5事實上 有一些定義的含義。 而且,事實上,它的作用。 一個整數,如果你想 printf的替代它, 你確實有使用 不同的格式說明。 你不會知道這 除非有人告訴你, 或者你已經這樣做。 但是我百分之什麼 可共同使用 在printf中的一個整數堵塞。 您還可以使用百分比 d表示十進制整數。 但我是好的,簡單的在這裡。 因此,我們將與該走了。 現在讓我繼續前進, 重新運行化妝INT,回車。 這是很好的,沒有錯誤。 點斜線int-- OK,不好的用戶體驗, 因為我沒有告訴自己 該怎麼辦。 但是,這很好。 我迅速迎頭趕上。 現在讓我去前進, 鍵入大衛,OK,Zamila,羅布。 好了,所以這是一件好事。 這一次,我使用的功能, 一個拼圖,名為get int類型。 而事實證明out--,我們將 看到這個以後在term-- 該工作人員CS50已實施 以這樣的方式獲得的字符串 它只會物理 得到你的字符串。 它已經實施的get int類型 這樣一種方式,它僅將 得到一個整數你。 如果你的人, 不配合,這是 從字面上只是要 說重試,重試,重試, 從字面上坐在那裡循環,直到 你迫使一些神奇的數字, 像50和50打招呼。 或者,如果我們再次運行此 並鍵入42,你好42。 這樣一來,GET INT功能 那一塊拼圖內 足夠的邏輯,足夠的思想, 要弄清楚,什麼是一個字? 什麼是多少? 只有接受,最終的數字。 因此,原來這 是不是所有的表現力。 至今。 所以,耶,我們最後一次 去很快 為實現遊戲和動畫, 在划痕和藝術作品。 而在這裡,我們正在內容 與世界你好,你好和50。 這是不是所有的令人振奮。 而且,事實上,這些前幾 實施例將需要一些時間 在興奮的增產行動。 但是,我們有這麼多 現在控制,實際上。 而且我們要非常 快速啟動分層 這些基本的原語的頂部。 但首先,讓我們了解 什麼限制是。 的東西事實上,人們 刮不容易 讓我們做的是真正審視 引擎蓋下, 並且明白什麼是 計算機是,它能做什麼, 和它的局限性是什麼。 而且,事實上,缺乏的 理解,潛在地,長期 可以導致我們自己的寫作mistakes-- 錯誤,寫出不安全的軟件, 以某種方式被黑客攻擊。 因此,讓我們對一些步驟 理解這一點更好一點通過 的,這樣說了,下面的例子。 我要繼續前進,實現 真正的快一個叫做加法程序。 像,讓我們添加一些數字加在一起。 而且我要編寫一些角落 在這裡,只是複製和粘貼 我在那裡之前,恰好 所以我們可以得到更快去。 所以,現在我已經得到了基本的開端 一個叫做加法器程序。 讓我們繼續前進,做到這一點。 我要繼續前進, 比方說和INTx得到得到int類型。 你知道嗎? 讓我們做一個更好的用戶體驗。 所以讓我們只說X是有效的 提示用戶給我們的X. 然後讓我先走,說的printf 怎麼樣y是,這一次期待 從用戶的兩個值。 然後就讓我們繼續前進, 比方說,printf的,x和y的總和為。 現在我不想做百分之秒。 我想做%的我,反斜線 N,再插上總和值。 所以,我怎麼能去這樣做? 你知道嗎? 我知道如何使用變量。 讓我聲明一個新的,INT態。 而我要在這裡採取了猜測。 如果在此等號 語言,也許我可以做X加Y, 只要我結束我的 用分號想? 現在我可以回到這裡了,插上Z, 完成本以為用分號。 而且,我們現在看到的,如果這些 lines-- x的序列是獲得int類型。 Y是獲得int類型。 添加x和y,存儲在值z-- 所以,再一次,記住等號 是不相等的。 這是從右到左分配。 讓我們打印出的總和 x和y的是不是字面上Z, 但什麼的Z裡面。 所以,讓我們做加法 - 不錯,沒有錯誤這一次。 點斜線加法器,輸入, x被將是1。 Y為將是2。 x和y的總和為3。 所以這是一切優秀和良好。 所以,你會想像數學 應該在這樣的程序中工作。 但是,你知道嗎? 這是可變的,行 12,甚至是必要的? 你不需要的習慣得到 只是存儲在變數的事情 只是因為你可以。 並且,實際上,它通常是 認為是不好的設計 如果您正在創建一個變量,叫 中的Z這種情況下,存儲在它的東西, 然後立即 使用它,但從來沒有一次。 為什麼要給東西的名字 像Z如果你從字面上 要使用該 事僅一次,所以 近端創建哪裡 它擺在首位, 如此接近的代碼行的條款? 所以,你知道嗎? 事實證明,C是非常靈活。 如果我真的想 插件值這裡, 我並不需要聲明一個新的變量。 我可以外掛x加 Y,因為C理解 算術和數學運算。 所以,我可以簡單地說,這樣做數學, X加Y,無論這些值, 堵塞造成 整成字符串。 因此,這可能是,雖然 只有一條線短, 一個更好的設計,更好的節目, 因為有更少的代碼,因此 少我明白。 而且這也只是清潔, 只要我們不是 引進新詞, 新的符號,比如Z, 即使他們真的不 服務太大的目的。 不幸的是,數學不是 所有可靠的時候。 讓我們繼續前進,並做到這一點。 我要繼續前進 現在做到以下幾點。 讓我們做的printf,我百分之,百分之加 我,應該我百分之,反斜線ñ。 而我要做的this-- XYX加y。 所以我只是要改寫 此略有不同在這裡。 我只想做一個快速的健全性檢查。 再次,讓我們不要超前。 做加法,點斜線加法器。 x為1,y為2,1加2是3。 所以這是很好的。 但是,讓我們現在這個複雜 了一下,並創建一個新的文件。 我會打電話給這一個, 說,整型,複數的整數。 讓我先在那裡我是剛才。 但是,現在讓我們做一些其他的線路。 讓我繼續前進,做到以下幾點, printf的,我百分比,減去%的我, 是我百分之逗號X,逗號YX減Y。 所以我稍微做 不同的數學存在。 讓我們做一個又一個。 所以,我百分之百分之倍 我是百分之一,反斜線ñ。 讓我們插件x和y,以及x乘以y。 我們將使用星號上 您的計算機時代。 你不會用x。 x是 這裡變量名。 你用乘法的明星。 讓我們做一個。 百分之printf的我,分 由百分之一,百分之是我, 反斜杠ñ。 XY由y--分 所以你用C中的正斜杠 做除法。 讓我們做一個其他的。 我百分比剩餘,分 由百分之一,百分之是我。 xy--現在剩下的 是什麼遺留下來的。 當您嘗試將一 分母變成分子, 有多少是遺留下來 你不能分裂出去? 所以是不是真的, 必須地,一個符號 我們在小學用於此。 但是,在C.你可以 例如x模y,其中 在這個context--這個百分號 容易混淆的,當你在裡面 雙引號的, 裡面的printf,百分比 用作格式說明。 當您使用百分比之外 在數學表達式, 它是模塊化模運算符 arithmetic--我們的目的 在這裡,只是意味著,什麼是 x的剩餘除以y? 所以x除以y為x斜線年。 什麼是x的除以y的餘數? 它的x模Y,作為一個程序員會說。 所以,如果我在這裡沒有失誤,讓我 繼續前進,使整型,複數,美觀大方, 和點斜線整數。 讓我們繼續前進, 這樣做,比方說,1,10。 好吧,1加10是11,檢查。 1減去10為負9,檢查。 1次10是10,檢查。 1 10 is--分 OK,我們將跳過一個。 餘數1除以10為1。 這是正確的。 但有一個錯誤在這裡。 所以,一個我把我的 交出,不正確的。 我的意思是,這是接近0。 1除以10,你知道,如果我們 削減一些角落,當然,它是零。 但它確實應該1/10, 0.1或0.10,0.1000,或等等。 它真的不應該是零。 那麼,事實證明,電腦 從字面上做什麼,我們告訴它做的事。 我們正在做數學一樣x除以y。 和x和y,每行 代碼前,都是整數。 此外,第15行,我們都 告訴printf的,嘿嘿,printf的插件 的整數,插件的整數, 插件的integer--具體 x,然後y和則x 除以y。 x和y是整數。 我們是好那裡。 但是,為x除以x? 點¯x分由y是應該的, 數學上,1/10,或0.1, 這是一個實數,一個實數 有潛在的,一個小數點。 這不是一個整數。 但是,什麼是最接近 整數到1/10,或0.1? 是的,這一種是零。 0.1是這個樣子了。 和1是本得多。 所以1/10更接近 0比它為一個。 所以什麼C是做us-- 樣的,因為我們告訴它中場休息 被截斷的整數。 它採取的值,而這又是 應該是這樣的0.1000, 0等等。 而且這一切截斷 小數點後 這樣,所有這一切 的東西,因為它沒有 適合的整數的概念,這 就像負1,0,1的數, 上下,它拋出了一切 小數點,因為你以後 不適合小數點 在由定義的整數。 因此,這裡的答案是零。 那麼,我們如何解決這個問題? 我們需要另一種解決方案都在一起。 我們可以做到這一點,如下所示。 讓我繼續前進,創造一個新的 文件中,這個叫floats.c。 這裡保存了 同一目錄下,float.c。 讓我繼續和複製 一些早期的代碼。 但是,而不是領 一個int,讓我們做到這一點。 給我一個浮點值 名為x。其中,浮點 值只是從字面上 一些與一個浮點。 它可以移動到左邊,在右邊。 這是一個實數。 讓我沒有打電話 得到INT,但得到浮動, 這也就是菜單中 在C250庫選項。 讓我們修改y為float。 因此,這將成為獲取浮動。 而現在,我們不希望在整數堵塞。 事實證明,我們必須使用百分 如欲浮動,浮法%的樓 現在保存它。 而現在,手指交叉,使 彩車,美觀大方,點斜線浮動。 x被打算當1ÿ 將會再次成為10。 而且,美觀大方,OK我除了是正確的。 我希望更多的, 但我忘了寫。 因此,讓我們去解決這個邏輯上的錯誤。 讓我們繼續前進,抓住以下。 我們只是做一些複製和粘貼。 而我要說負。 而我要說倍。 而我要說的分歧。 而且我不會做模, 這是不一樣鍺這裡, 用f分割,時間plus-- 好吧,讓我們再次做到這一點。 製作花車,點斜線花車, 1,10,還有 - 不錯,沒有,OK。 所以,我是個白痴。 因此,這是很常見 在計算機科學 做出愚蠢的錯誤是這樣的。 用於教導的目的, 我真正想做的事 在這裡改變科學 要加,零下,到時候, 和來劃分,你希望 這個練習過程中發現。 現在讓我們重新編譯這個 節目,做點斜線浮動。 而第三次,我們 看它是否符合我的期望。 1,10,輸入,是的,OK,1.000, 由10.000分,是0.100000。 而事實證明,我們能控制多少 數字是那些小數點後。 實際上,我們會的。 我們會回來這一點。 但現在,其實數學是正確的。 那麼,又是什麼這裡的外賣? 事實證明,在C,有 不僅只是strings--,事實上, 有沒有真正的,因為我們 添加這些與CS50庫。 但也有不只是整數。 也有浮動。 而事實證明了一堆其他數據 類型也一樣,我們將在不久使用。 事實證明,如果你想單 字符,而不是一個字符串, 你可以只使用一個char。 事實證明,如果你想有一個布爾值, 一個布爾值,只有真或假, 感謝CS50庫,我們已經 添加到C BOOL數據類型為好。 但它也存在於 許多其他語言。 而事實證明,有時你 需要更大的數字則默認情況下都 與整型和浮點型。 並且,實際上,雙是一個數字 使用不是32位,但64位。 和長隆是一個數字, 不使用32位,但64位, 分別為浮點 值和整數,分別為。 所以,讓我們現在實際上 看到這個動作。 我要在這裡繼續 並掀起另一個程序。 在這裡,我要繼續前進 並且確實包括CS50.h. 讓我走,包括標準IO.h. 你會發現什麼 時髦發生在這裡。 這不是顏色編碼的東西 以同樣的方式,因為它以前那樣。 而事實證明,那是因為我 沒有給的東西的文件名。 我會打電話給這一個 sizeof.c,並創下保存。 並注意發生了什麼我很 白色的代碼針對黑色背景。 現在,至少有 一些紫色在那裡。 它是語法高亮。 這是因為,很簡單,我已經 告訴IDE哪些類型的文件 它是由給它一個名稱, 具體的文件擴展名。 現在,讓我們繼續前進,做到這一點。 我要繼續前進,很 簡單地打印出following--布爾 是百分之LU。 我們會回來的 在短短的時刻。 然後我要去 布爾的打印尺寸。 而現在,只是為了節省 我有一段時間,我 要做一個整體 這些一堆一次。 而且,具體而言,我要去 更改為一個char和char。 這一次,我要改變 以一張雙人床和一個雙。 這一次,我要改變 一個浮子和一個浮動。 這一次,我要去 更改為int和一個int。 而這一次,我要去 更改為一個很長很長。 它仍然採取 時間長了,很長很長。 然後,最後,我放棄 我太多了,字符串。 事實證明,在C,有 被稱為特殊的運算符 那大小是字面上 要在運行時, 告訴我們的大小 這些變量。 這是一種方式,現在, 我們可以連接回 上週的討論 數據和代表性。 讓我繼續前進,編譯 的點斜線大小的尺寸。 讓我們來看看。 事實證明,在C, 特別是在CS50 IDE, 特別是在 操作系統Ubuntu的, 這是一個64位操作 系統在此情況下, 一個布爾打算 使用的空間的一個字節。 這就是大小如何衡量, 不在位,但在字節。 並且記得,一個字節為8位。 因此,一個布爾值,即使你 技術上只需要一個0或1, 這是一個有點浪費 如何我們已經實現了它。 它實際上是要使用一個整體 byte--因此所有零,也許是 所有的人,或者類似的東西, 或只是一個1間八位。 一個char,同時,用於字符 每一樣上週ASCII字符, 將是一個字符。 這SYNCHS與我們的觀念 它是不超過256 bits--相當, SYNCHS了它是沒有 超過8位,這 為我們提供了多達256個值。 雙打算 為8字節或64位。 一個浮點是4。 一個int是4。 長,長為8。 和一個字符串為8。 但是不要擔心。 我們要剝開那層。 事實證明,字符串可以 超過8個字節。 而且,事實上,我們已經寫 弦已經,世界你好, 超過8個字節。 但是,我們會回來的 在短短的時刻。 但帶走這裡如下。 任何計算機中僅具有有限 的存儲器和空間量。 你只能儲存那麼多 你的Mac或PC上的文件。 您只能存儲在這麼多程序 RAM運行一次,一定,甚至 使用虛擬內存,因為 你的內存有限數量。 而只是為了picture--如果 你從來沒有打開一台筆記本電腦 或下令額外的內存 對於一台電腦,你 可能不知道 你的電腦裡面 是一些看起來 有點像這樣。 所以,這只是一個普通的公司命名為 至關重要的是,使計算機的RAM。 和RAM就是程序 而他們正在運行生活。 所以每次Mac或PC,當您雙擊上 點擊一個程序,它打開了, 它打開了一些Word文檔 或類似的東西, 它存儲在臨時 RAM,RAM因為速度更快 比你的硬盤上,或 你的固態硬盤。 所以,這只是程序的地方去 當他們正在運行的生活, 或當正在使用的文件。 所以,你有事情看起來 這樣你的筆記本電腦裡面, 或者稍微大一點的東西 裡面的桌面。 但關鍵是你只有一個 有限數量的這些事情。 還有的只是一個有限的 硬件坐在這張桌子右邊 這裡。 因此,可以肯定,我們不能存儲 無限長的數字。 而且,然而,如果你想回 小學的時候,有多少位可以 你有權利 一個小數點? 對於這個問題,有多少位可以 你有一個小數點左邊? 真的,無限多的。 現在,我們人類唯一可能 知道如何發音萬元, 和十億,萬億,和 萬億和三次方。 而我推的限制我 understanding--或my--我明白 數字,但我 數字的發音。 但他們可以得到無限大 無限多的數字向左 或小數點的右邊。 但電腦只有一個 內存量有限, 晶體管的一個有限數量,一 數量有限的內部燈泡。 會發生什麼時 您運行的空間? 換句話說,如果 回想起上週 當我們談到數字 自己被代表二進制, 假設我們有 這8位值在這裡。 而且我們有七個1的和一個0。 而假設我們想 添加1至這個值。 這是一個非常大的數字現在。 這是254,如果我沒有記錯 從上週權的數學。 但是,如果我改變 最右邊是0到1? 整數, 當然,成為8個1的。 所以,我們還是不錯的。 這可能代表 255,雖然根據上下文 它實際上代表 負數。 但更多的是另一次。 這感覺就像它是關於 高達我可以指望。 現在,它只有8位。 而我的Mac,當然,有辦法 內存大於8位。 但它確實有有限的。 所以同樣的觀點也適用,即使我們 有更多的人,這些在屏幕上。 但是,如果你發生了什麼 存儲該號碼,255, 並且要算1位高? 你想去從255到256。 的問題,當然,是如果 從零開始,就像上週算起, 你不能指望高 256,更不用說257, 別說258,男因為什麼 當您添加1會怎麼樣? 如果你做舊小學 方法,你把這裡1, 然後1加1是2,但是這 真的是零,你扛1, 扛1,攜帶1。 所有這些事情, 這些1的,去到零。 和你風,是的,正如有人 在左手側所指出的,一個1。 但是,一切都可以 真正看到並裝入內存 是只有八0年代,這是說 在某些時候,如果你一台電腦, 試著計數足夠高了,你 要環繞,這似乎 零,或者甚至負 號,這是大於零甚至更低。 我們可以樣的看到這一點。 我要繼續寫 一個真正的快速程序在這裡。 我要繼續寫 一個叫溢出程序。 包括CS50.h包括 標準IO.h--哦, 我真的很想念我的語法高亮。 因此,讓我們這個保存為overflow.c。 而現在INT主要void-- 過不了多久,我們就會 回過頭來解釋為什麼 我們繼續寫INT主作廢。 但現在,我們只是做 它,視之為理所當然。 讓我們給自己一個int, 並初始化為0。 讓我們再對INT做我得到zero-- 其實,讓我們做一個無限循環 看看會發生什麼。 雖然如此,那麼讓我們打印出ñ 是我百分比,反斜線N,插件在正。 但是,現在,讓我們做n得到n與1。 因此,換句話說,在每 這個無限循環迭代, 讓我們取n的值, 並把它加1,然後 將結果存儲回在正在左側。 而且,事實上,我們已經看到了語法 微微就是這樣,簡單。 一個很棒的技巧反而 編寫出這一切的, 你可以居然說一個n加等於1。 或者,如果你真的想成為幻想, 你可以說n與加分號。 但後​​兩個都只是 我們會打電話語法糖 對的第一件事。 的第一件事是更加明確, 完全正常的,完全正確的。 但是,這是比較常見的,我會說。 所以,我們會為短短的時刻做到這一點。 現在,讓我們做溢出,這聽起來 而不祥,點斜線溢出。 讓我們來看看,正變得越來越蠻大的。 但我們認為,有多大可能得到ň? n是一個int。 我們看到剛才用的大小 例子,一個int是四個字節。 我們從上週知道,四個字節是 32位,因為8次4,這是32。 那將是4個十億。 而我們可達80萬。 這將永遠採取 數高達我所能。 所以我要繼續前進, 正如你可能過不了多久, 並創下控制C--坦言,控制 C,很多,其中對照C一般 手段取消。 不幸的是,因為這 在雲中運行時, 有時雲 吐出了這麼多東西, 如此多的產量,這將 取一小會兒我輸入 去雲。 所以,即使我打 對照C幾秒鐘前, 這絕對是側 無限循環的效果。 因此在這種情況下,我們 要離開的是。 而且我們要增加另一個 在這裡的終端窗口 與加,這當然不 這樣,因為它仍在思考。 讓我們繼續前進,並 多了幾分合理性。 我要繼續前進,做 這只有有限多次。 讓我們用一個for循環, 我前面提到。 我們開工吧。 再給我一次變量int我得到0。 我不到,比方說,64個I ++。 現在讓我繼續和打印 出n是百分之一,逗號ñ。 然後N--這仍然是 要採取永遠。 我們開工吧。 n得到n次2。 或者我們可以被看中 做次等於2。 但是,讓我們只說ñ 等於本身,乘以2。 換句話說,在該 程序的新版本, 我不想永遠等待 從像80萬至4十億。 就讓我們這種過度使用。 讓我們實際上每次加倍ñ。 其中,召回,加倍是 對面有當然的。 和而上週我們有 重複的事情,並再次, 又一次,超快速, 加倍必將 1讓我們以最大的可能 值,我們可以用一個int計數。 因此,讓我們做的正是這一點。 我們再回過頭來此不久。 但是這又好比 在從無到有的重複塊。 你會不久使用。 這也就意味著,從零計數 達,但不相等,為64。 而在此每次迭代 循環,只是不停地增加i。 所以,我++ - 這一般結構 第7行僅僅是一個超級常見的方式 重複的部分線路 代碼,一些次數。 哪行代碼? 這些大括號,如你 可能從現在收集, 手段,做到以下幾點。 它像划痕,當 它具有黃色塊 和其他顏色的那種 擁抱或擁抱其他塊。 這就是那些花 括號在這裡做。 所以,如果我得到了我的語法right--你 可以看到C表示胡蘿蔔符號 這就是我多少次 試圖解決這個問題。 因此,讓我們擺脫的那一個 乾脆,並關閉該窗口。 我們將使用新的。 使溢出,點斜杠 溢出,進入,所有的權利, 它看起來壞在第一。 但是,讓我們向後滾動的時候, 因為我這樣做64次。 和在第一時間通知,n是1。 第二次,n為2, 然後4,然後按8,然後16。 並盡快似乎 我得到低於約1十億, 如果我再翻一番它, 應該給我兩十億。 但事實證明,這是 正確的風口浪尖上。 所以它實際上溢出 1十億一個int 大致2負 十億,因為一個整數, 不像我們的數字 上週假設, 既可以是正和負 在現實中,並在一台計算機。 而這些,所以至少一個 位被有效被盜。 所以,我們真的只有31位, 或2十億可能的值。 但就目前而言,外賣相當 簡單地說,不管這些數字 而無論數學, 有壞事發生,最終, 因為最終你試圖 重排的位太多次。 你有效地都去 1對也許所有0,或者 只是一些其他的模式,它 清楚地,根據上下文, 可以理解為一個負數。 因此它似乎最高的I 可以在這個特定的程序計數 只有大約1十億。 但是,這裡有一個部分解決方案。 你知道嗎? 讓我從改變 詮釋一個很長很長。 讓我繼續在這裡 和say--我將有 要改變這種為unsigned long。 或者,讓我們來看看,我從來不記得自己。 讓我們繼續前進,使溢出。 不,這不是它,LLD,謝謝。 所以有時鏘能有所幫助。 我不記得是什麼格式 說明是一個很長很長。 但是,事實上,鏘告訴我的。 綠色是某種好, 仍然意味著你犯了一個錯誤。 它是猜,我的意思是LLD。 因此,讓我把它的建議,長 長十進制數,保存。 讓我重新運行它,點 斜線溢出,回車。 現在什麼是酷是這樣的。 如果我回卷的時候,我們還是開始 在同一place--計數1,2,4, 8,16。 請注意,我們得到了所有的 一路攀升至1十億。 但是,我們安全到達2十億。 然後我們4十億, 然後從8十億,17個十億。 而我們走的更高,而且 越來越高。 最終,這也算休息。 最終,用長長的, 它是64位的值,而不是 一個32位的值,如果算上 過高,環繞0。 在這種情況下,我們碰巧 結束了一個負數。 因此,這是一個問題。 而事實證明,這 問題是,不是所有的神秘。 即使我刻意 這些錯誤引起的, 事實證明,我們那種看到它的全部 我們,或者至少我們中的一些周圍的人。 因此,在樂高星球大戰,如果 你曾經玩過的遊戲, 事實證明,你可以去周圍 打破東西在世界樂高, 和收集硬幣,本質上。 如果你打過 這個遊戲了太多的時間, 因為這無名的個人 在這裡做到了,總數 你可以收集硬幣 是,它似乎,4個十億。 現在,它的實際四捨五入。 所以LEGO試圖 讓事情變得人性化。 他們沒有做到這一點正是2 32次冪,每上週。 但4個十億是一個道理。 看來,基於該信息, 這LEGO,該公司的 使這個實際的軟件,決定 該硬幣的最大數目 用戶可以積累 確實是,4個十億, 因為他們選擇在自己的代碼 使用不是很長很長,很顯然, 但僅僅是一個整數,一個無符號 整數,只有一個正整數,其 最大值大約是這一點。 那麼,這裡的另一個有趣的。 所以在遊戲中文明,這 有些人可能很熟悉,與 原來,幾年前有 在本場比賽由此錯誤 如果你所扮演的角色 甘地在比賽中, 代替他的是非常和平, 反而是令人難以置信的,令人難以置信 攻擊性,在某些情況下。 特別是,方式文明 作品是,如果您的播放器, 採取民主,你 侵略性成績獲得 由兩個,所以減去遞減 減,再減去負。 所以你減去2從 實際的迭代。 不幸的是,如果你的是迭代 最初1,你從中減去2 採用經過民主 甘地在這裡可能 這樣做,是因為他很passive-- 1對侵略性的規模。 但是,如果他採取民主,那麼 他去從1到1負。 不幸的是,它們是 使用無符號數, 這意味著他們對待甚至是負 數字,好像他們是積極的。 而且事實證明, 負1陽性當量, 在典型的計算機程序,為255。 因此,如果採用甘地 ,因此具有民主 他的侵略性評分下降, 它實際上來臨時,以255 而讓他最 侵略性的比賽。 所以,你可以在此Google了。 而且,的確是一個 意外編程錯誤, 但是這相當進入 絕殺至今。 這是所有的樂趣和可愛。 更可怕的是,當實際 真實世界的設備,而不是遊戲, 有這些相同的錯誤。 事實上,就在一年前的一篇文章來了 更多關於波音787夢想飛機。 和製品在第一 讀取一目了然有點神秘。 但它說,這是一家軟件 在波音公司的脆弱性 新型787夢想飛機具有 可能造成飛行員 失去控制 飛機,可能 在飛行中,美國聯邦航空局官員 告誡航空公司最近。 這是確定 一個模型787 已通電飛機 連續248天 可能會失去所有的交流電流,交流, 電功率,由於發電機 控制單元,同時GCUs, 進入故障安全模式。 這是一種失去我的。 但備忘錄說,好了,現在我得到的, 條件是由軟件引起的 專櫃內部 發電機控制 單元後,將溢出 248天連續功率。 頒發本 注意防止損失 所有交流電 功率,這可能導致 在飛機的失控。 所以,從字面上看,有一些整數, 或者一些等價的數據類型, 在軟件被使用 在實際的飛機 如果你保持你的飛機 足夠長的時間,這顯然 可如果你只是運行情況 他們不斷地從不拔下 你的飛機,現在看來,還是 讓其電池不行了, 將最終計數和向上, 和起來,向上,及以上,和向上。 並且,按質,一 內存數量有限 會溢出,回滾到 零或者一些負值, 其中的一個副作用是 實得嚇人現實 這架飛機可能需要 必須重新啟動,有效, 也可能下降,更糟糕的,因為它飛起來。 所以這類問題 仍然伴隨著我們, even--這是一個2015年的文章, 所有的更可怕 當你不一定 理解,欣賞,或預期 這些類型的錯誤。 因此,原來還有另一個 有關數據表示壞事。 事實證明,即使花車 樣的缺陷,因為花車也是如此, 我提出的是32位的,或 也許64如果你使用雙。 但是,這仍然是有限的。 而美中不足的是,如果你能 把數的無限數量 小數點後, 沒有辦法,你 可以代表所有可能的 我們被教導號碼 在小學可以在世界上存在。 一台電腦,從本質上講,有 選擇這些數字的一個子集 準確地表示。 現在,該計算機可以 輪也許一點點, 並且可以讓你大致店 任何號碼,你有可能會需要。 但是,僅僅憑直覺,如果你 有比特的有限數目, 你只能他們重排 在很多方面有限。 所以,你不可能 用有限數量的 比特置換, 零和一的模式, 代表無限 號的數目, 這表明計算機可能 很好是對我們撒謊的時候。 事實上,讓我們做到這一點。 讓我重新回到CS50 IDE。 讓我繼續前進, 創建一個小程序 叫不精確,就表明 電腦的確都是不精確的。 讓我繼續前進,並與開始 一些代碼來自之前, 現在只要做到以下幾點。 我要繼續做的printf,百分比 樓反斜線N,1除以10。 換句話說,讓我們在更深的下潛 到1/10,象1和除以10。 當然,一個計算機可以代表1/10。 因此,讓我們繼續前進,使不精確。 讓我們來看看。 格式指定double類型。 但參數的類型為int。 這是怎麼回事? 呵呵,有意思,所以這是一個 從課前的教訓。 我說,哎,電腦展 我百分之F A浮動。 但我給它2個整數。 所以,事實證明,我可以修復 這幾種方式。 我只是把一成1.0,和 10到10.0,這,的確, 有轉換的效果 他們進入floats--仍有望 相同的號碼。 或者,它原來有什麼東西 我們不久再見到。 你可以投中的數字。 您可以使用此括號 表達式,你可以說, 哎,電腦,藉此 10,我知道是一個int。 但是對待它,請 就好像它是一個浮動。 但這種感覺過於複雜。 對於我們今天的目的, 我們只是從字面上 讓他們浮點值 帶小數點,就像這樣。 讓我繼續前進並重新運行,使 不精確,好,點斜線 不精確,進入。 OK,我們正在尋找好的。 1除以10,按照我的 蘋果在這裡,的確是0.100000。 現在,我學會了上小學的時候有 應該是0的無限數量。 因此,讓我們至少嘗試 看到其中的一些。 事實證明,printf的是一個小 票友仍然比我們一直在使用。 原來你沒有指定 剛剛%的F或只是我百分比。 實際上,你可以指定 這裡的一些控制選項。 具體來說,我要去 就是說,哎,printf的, 居然告訴我10小數點。 所以它看起來有點怪異。 但是你說個百分點, 點,多少號 你想以後看到 小數點,以及則f 平,只是因為這是 文件說什麼。 讓我繼續前進並保存。 並注意過,我越來越 厭倦了重複輸入的事情。 所以我只是設置和 在這裡我的鑰匙向下箭頭。 如果我繼續打了,你 可以看到所有的命令 我犯了,或不正確的。 而我現在要繼續前進, 沒有實際使用,顯然。 讓不精確,點 斜線imprecision--所以 我所教 小學檢查出來。 即使我把它打印到10進制 地方,它確實是0.10000。 但是,你知道嗎? 讓我們有點貪心。 比方說,比如,告訴我55 小數點後點。 讓我們真的採取這種 劃出來兜風。 讓我用make改造它 不精確,點斜線,不精確。 現在我們開始。 你的童年是一個謊言。 很顯然,1除以10的確 0.100000000000000005551115123-- 到底是怎麼回事? 那麼,事實證明,如果你種 看遠遠不夠出在底層 這表示 數目,它實際上 是不完全的1/10,或0.1和 無限數量的零。 現在,這是為什麼? 那麼,即使這是一個簡單的 我們人類數,1除以10, 它仍然是無限多的一個 數字,我們能想到的。 但是,一台電腦只能代表 有限多個這樣的數字。 所以,有效的,是什麼 電腦正顯示出我們的是其最接近 近似​​與數 我們願意相信是1/10, 還是真的0.10000循環往復。 而,雖然,這是 盡可能接近,因為它可以得到的。 而且,事實上,如果你看看 引擎蓋下, 因為我們在這裡通過看 小數點後55位, 實際上我們看到的現實。 現在,順便說一句,如果你 見過movie-- 大多數人可能haven't-- 但超人3若干年前, 理查德·普賴爾基本上是利用這 現實中,他的公司竊取了很多 便士的分數和分數的, 因為我記得在company--, 它是一個while--基本上是 扔掉任何東西,不適合 進入仙的概念。 但是,如果你把所有這些 很小,很小,很小的數字再次, 又一次,又一次,你可以象在 他的情況下,賺錢的一個良好的數額。 那同樣的想法被扯掉 更近,但還是現在年紀大了 電影,叫辦公空間, 凡在那部電影的傢伙, 做同樣的事情,搞砸了 徹底,結束了太多 錢在自己的銀行賬戶。 這一切都是很可疑。 但在一天結束時, 不精確就在我們身邊。 並且,也可以是 令人震驚的情況。 原來,3超人 和辦公空間之外,還有 可能有一些非常現實的 世界後果 不精確的現實 數據的表示 即使我們人類 這一天不一定 理解,以及我們應該, 或記住盡可能多我們應該。 而且,事實上,以下剪輯是 從看一些很真實的世界 如果你會發生什麼後果 不欣賞的不精確性 在數字代表出現。 [視頻回放] -Computers,我們都逐漸接受 經常令人沮喪的問題, 去them--錯誤,病毒, 和軟件故障, 對於小的價格支付 為方便。 但是,在高科技和高速度 軍事和航天計劃的應用, 最小的問題即可 被放大成災難。 在1996年6月4日,科學家們準備 發射無人阿麗亞娜5型火箭。 它攜帶的科學 衛星設計 建立精確如何 地球的磁場相互作用 與太陽風。 火箭是專為 歐洲航天局, 並從其設施升空 在法屬圭亞那的海岸。 -At約37秒進 飛行中,他們首先 注意到某些事正在錯誤的。 噴嘴在被旋轉 某種意義上說,他們實在不應該。 大約40秒後進入飛行, 顯然,車輛遇到了麻煩。 那就是當他們做了 決定摧毀它。 該範圍內的安全官員,與 巨大的膽量,按下按鈕, 炸毀了火箭,它可能前 成為對公眾安全造成危害。 - 這是處女 阿麗亞娜5的航程。 而其毀滅了 地方,因為一個缺陷 嵌入火箭的軟件。 在阿麗亞娜-The問題是 認為有許多 需要64位來表示。 他們想轉換 它的16位數字。 他們假定 數字是永遠不會 是非常大的,大多數的那些 在一個64位的號碼數字是零。 但他們錯了。 -The無力之一 軟件程序接受 所產生的那種數 另一種是在失敗的根源。 軟件開發已經成為一個 的新技術非常昂貴的部分。 該阿麗亞娜火箭已經很 成功,那麼多的軟件 創造了它也是 在阿麗亞娜5中。 -The根本的問題是,阿麗亞娜 5增快,加速快。 而且軟件早已不是 佔了點。 火箭-The破壞 是一個巨大的金融災難, 一切緣於一分鐘,軟件錯誤。 但是,這不是第一次 實時數據轉換問題 一直困擾現代火箭技術。 -in 1991年,開始時 第一次海灣戰爭中, 愛國者導彈 經歷了類似的一種 數轉換的問題。 而作為一個結果,28人, 28名美國士兵, 被打死,約 100人受傷, 當愛國者,這本來是 防止傳入的飛毛腿導彈, 沒有發射導彈。 - 當伊拉克入侵科威特和美國 在1991年年初推出沙漠風暴 愛國者導彈部署 保護沙特阿拉伯和以色列 伊拉克飛毛腿導彈襲擊。 愛國者是美國中程 表面空氣系統,製造 由雷神公司。 愛國者攔截-The大小 本身是關於約20英尺長。 它重約2000磅。 同時還可以進行約一個彈頭, 我認為這是大約150磅。 和彈頭本身 高爆發力,這 周圍有碎片。 彈頭的外殼是 旨在像大號鉛彈。 -The導彈進行 百分之四的容器中, 和由半拖車運輸。 -The愛國者反導彈系統 追溯到現在至少有20年。 它最初的設計 作為防空導彈 擊落敵人的飛機。 在第一次海灣戰爭, 當戰爭來了, 陸軍想用它來 擊落飛毛腿導彈,而不是飛機。 伊拉克空軍 沒有那麼多的問題。 但軍隊是擔心飛毛腿導彈。 所以他們試圖 升級愛國者。 -Intercepting敵人 在導彈5馬赫旅行 將要被足夠的挑戰性。 但是,當愛國者 被送往投入服務, 陸軍不知道的 伊拉克的修改,使得 他們的飛毛腿導彈幾乎是不可能的打擊。 - 什麼事是飛毛腿導彈的 要來的是不穩定的。 他們在晃動。 這樣做的原因是 伊拉克人,為了 獲得600公里 出300公里 中程導彈,重了 從前面彈頭。 他們提出的彈頭更輕。 所以,現在的愛國者 苦思的飛毛腿。 和大部分的時間,該 絕大多數的時間, 它只是由飛毛腿飛。 一旦愛國者系統運營商 實現了愛國者錯過了目標, 他們引爆愛國者的彈頭 以避免如果可能的人員傷亡 被允許倒在地上。 - 那是大多數人所看到的, 在天空中那些大火球, 和誤解成 飛毛腿彈頭的攔截。 - 雖然在夜間 天空,出現了愛國者 要成功地 摧毀飛毛腿導彈,在宰赫蘭 有可能是沒有錯 關於它的性能。 目前,愛國者的雷達系統 失去了進入的飛毛腿的軌道, 從不因推出 到一個軟件缺陷。 這是誰首先發現了以色列人 的時間越長該系統上, 越大時間差異 成為,由於嵌入的時鐘 在系統的計算機。 - 關於前兩週 悲劇發生在宰赫蘭 以色列人報 國防部 該系統正在失去的時間。 約8小時運行之後, 他們注意到,該系統 變得明顯不準確。 國防部回應 告訴所有的愛國者電池 不離開系統 上很長一段時間。 他們從來不說什麼了很久was-- 八小時,10小時,千小時。 沒有人知道。 -The愛國者電池 駐紮在軍營 在宰赫蘭和內部缺陷 時鐘已經超過100小時一直在 2月25日的夜晚。 - 它跟踪的時間精度 約一秒鐘的十分之一。 現在,第二的第十 是一個有趣的數字, 因為它不能表示 二進制準確地說,這 意味著它不能精確地表達 在任何現代數字計算機。 很難相信。 但是使用此作為一個例子。 讓我們來數三分之一。 三分之一不能 十進制明確地表達。 三分之一是0.333 持續了無窮大。 有沒有辦法做到這一點與 絕對精度十進制。 這正是那種問題 這發生在愛國者。 時間越長,系統運行時, 更糟糕的時間誤差成了。 - 後運行100小時後, 在時間誤差僅為約三分之一 的第二。 但是,在一個目標的角度 導彈在5馬赫旅行, 它導致了跟踪 超過600米錯誤。 這將是一個致命的錯誤 對於什麼戰士 碰巧是飛毛腿發射是 通過預警衛星檢測 他們知道,是飛毛腿 未來在他們的大方向。 他們不知道有人來了。 - 它現在要由雷達 愛國者系統的組成部分 衛冕達蘭定位和保持 跟踪來襲的敵方導彈。 -The雷達是非常聰明的。 它實際上是將跟踪 飛毛腿的位置, 然後預測出可能 將是下一個時間的雷達發送 脈衝出來。 這是所謂的範圍內門。 - 然後,一旦愛國者 決定時間已夠 傳遞回去檢查下 此檢測物體的位置, 它可以追溯到。 因此,當它回到了錯 地方,然後看見沒有對象。 和它決定,沒有 對象,這是一個錯誤的檢測, 和下降的軌道。 -The傳入飛毛腿消失 從雷達屏幕上。 幾秒鐘後,它 撞上軍營。 飛毛腿打死28,並且是最後一個 在第一次海灣戰爭中開火。 可悲的是,更新的軟件 抵達宰赫蘭的第二天。 該軟件有缺陷 得到修復,閉合 在陷入困境的一章 愛國者導彈的歷史。 [視頻回放] DAVID J. MALAN:所以這是所有 說,溢出的這些問題 和不精確都太真實了。 那麼我們是如何來到這裡的? 我們開始只是談論的printf。 再次,此函數 打印一些東西到屏幕上, 我們隨後推出 幾個其他功能 從所謂CS50的庫。 我們將繼續 看到這些在適當的時候。 而我們,尤其是使用的GET字符串, 並獲得INT,現在還可以獲得浮動, 還有一些仍然會遇到我們 不久使用自己。 但有時,有 我們已經看到有必要 存儲什麼這些功能的手背? 他們一方面我們回到一個字符串, 或int或浮動。 有時,我們需要把該 字符串或int,或float地方。 並存儲那些東西,只是召回 就像在刮,我們有變數。 但與划痕, 在C中有實際的類型 variables--數據 類型,更generally-- 其中,一個字符串,一個int,一個 浮動,而這些人依然。 所以,當我們用C聲明變量, 我們必須聲明的數據類型。 這不是我們 必須在學期過去了做 因為我們過渡到其他語言。 但現在,我們確實需要 到預先先驗, 解釋計算機是什麼類型 可變的,我們希望它給我們。 現在,同時,進行打印 這些類型的數據類型, 我們要告訴printf的什麼期望。 我們看到字符串%的S, 和我百分之整數, 和其他幾個人了。 而這些僅僅是要求 對於視覺呈現 這些信息。 而且每個這些其實是可以 參數化或以某種方式調整, 如果你想進一步控制 你得到的輸出類型。 而且,事實上,它不僅證明 有反斜杠n,則新行。 還有別的東西叫反斜線 r代表回車,這 更類似於一個 老同學打字機, 並且還視窗使用多年。 有製表符反斜杠噸。 事實證明,如果你想 字符串裡面的雙引號, 我們已經使用召回 雙引號雙 引用在左側和右 迄今為止,我們的字符串結束。 這似乎混淆的東西。 如果你想要把雙引號中 一個string--,實際上中間, 它是混亂看到的。 所以你要逃跑,所以 說話,用的東西一個雙引號 像,從字面上看,反斜杠雙引號。 而且還有一些其他的還在。 我們將看到更多的這些 在不久的實際使用。 現在讓我們從過渡 數據和代表性, 和算術運算符,所有 這給了我們一些建築 與玩積木。 但現在,讓我們實際上給 我們的詞彙的其餘部分 我們已經完成了 上週與划痕 通過一些其他的考慮看看 在C--結構不是所有的人。 但是我們的想法 就要看真的只是 要強調從翻譯 一種語言,從無到有,到另一個,C. 隨著時間的推移,我們會拿起 更多的工具,我們的工具包, 可以這麼說,語​​法上。 而且,事實上,你會看到的想法 現在從上週相當熟悉。 因此,讓我們做到這一點。 讓我們繼續前進,並掀起程序 實際使用一些表情, 布爾表達式。 讓我繼續在這裡 並創建一個新的文件。 我會打電話給這個condition.c。 讓我繼續前進, 包括CS50庫。 讓我繼續前進,包括 標準IO.h我們的功能, 和printf,更分別。 讓我給自己的樣板 INT主要無效,其解釋我們 回來的未來。 現在讓我先走,並把 我通過get INT一個int。 然後讓我繼續前進,做到這一點。 我想說,如果我是less--讓我們 正,負區分 或零值。 所以,如果我是小於零,讓我 只是有這個計劃簡單地說, 負,反斜線N,否則 如果i大於零。 現在,我當然會說 printf的正面,反斜線ñ。 然後,其他if--我能做到這一點。 如果我等於0,我可以做的。 但我在做被 至少一個錯誤了。 回想一下,等號 不相等的,因為我們人類知道這一點。 但它的賦值操作符。 而我們不希望在採取0 權利,把它放在我的左邊。 因此,為了避免這種混亂,或 也許是平等的濫用簽收, 人類決定幾年前 在許多編程語言 當您要檢查等式 左和右之間, 你實際使用等於等號。 所以,你打等號的兩倍。 當你想從分配權 到左,你用一個等號。 因此,我們可以做別的this-- 如果我等於為零。 然後,我可以去 打開我的大括號, 並說,printf的0,反斜線N,完成。 但要記住,這些是如何 在岔路口能正常工作。 而且,真的,只是想想邏輯。 i是一個數字。 這是一個整數,具體。 這意味著它將會是少 大於0,或者大於0,或者0大。 因此,有一種這樣 隱含的默認情況。 因此,我們可以,就像 劃傷,免除了其他如, 而只是說別的。 從邏輯上講,如果您在 程序員知道,只有 三個存儲成一個 情況可能fall--第一, 第二,或第三 在這個case--不 懶得添加額外的精度 和附加​​邏輯那裡。 只是繼續用 默認情況下,這裡的人。 現在,讓我們繼續 保存此之後,使 條件斜線點條件 - 不是一個偉大的用戶界面, 因為我不惹得 用戶,正如我前面提到的。 但是,這很好。 我們將保持簡單。 讓我們嘗試數字42。 這就是積極的。 讓我們嘗試次數 負42負。 讓我們嘗試值0。 而且,事實上,它的工作原理。 現在,你將與之前看到的問題 長,檢測的事三次, 可能不充分。 你可能想測試一些 更大的數字,一些規模較小的 數字,一些角落情況下,如 我們會來描述它們。 但現在,這是一個 很簡單的程序。 而且我敢肯定,在邏輯上, 它分為三種情況。 而且,事實上,即使我們只是 集中在潛在的缺點 不精確和溢出,在 現實中,許多的CS50的問題, 我們不會擔心 一下,所有的時間, 溢出的這些問題, 不精確的,因為,事實上,在C, 它實際上不是所有的 容易避免這些東西。 如果你想計數 大,大,大, 事實證明,有技術,您 可以使用,常累及東西叫做 圖書館的館藏代碼,即 其他人寫的,你可以使用, 和其他語言如 Java和其他人,其實 讓人們更方便 數甚至更高。 因此,它確實是有些危險 您使用的語言的函數。 並在未來幾週內,我們將 看有多危險真的Ç 可如果不正確地使用它。 但是從那裡,並與 蟒蛇,和JavaScript,將 我們圖層上的某些額外的保護, 並運行這些風險較少。 因此,讓多一點 有趣的邏輯在我們的節目。 因此,讓我繼續創建 一個叫做邏輯程序 只是這樣我就可以玩一些 實際的邏輯,logical.c。 我只是複製和粘貼一些 從早期的代碼,所以我回來 這個漂亮的出發點。 讓我這個時候做字符C.我 打算給它的C名稱 只是因為它的傳統, 獲取來自用戶的字符。 讓我們假裝 我實施的一部分 該室的方案,刪除 在此之前,程序提示用戶 刪除文件。 我們怎麼能做到這一點? 我想說的是,如果C等於 等於,報價引文結束, Y,然後我要去承擔 該用戶已經是選擇。 我只是要打印的是。 如果它被實際編寫 拆除程序, 我們可以刪除文件 有更多行的代碼。 但我們會保持它的簡單。 如果C等於等於N-- 現在這裡,我會說, 用戶必須意味著沒有。 然後別的,你知道嗎? 我不知道還有什麼 用戶將要輸入。 所以,我只是說, 這是一個錯誤,無論 他或她實際鍵入。 那麼是什麼回事? 有一個根本的區別 與我在過去所做的那樣。 雙引號,雙引號,雙 報價和,但是,單引號 單引號。 原來,在C,當 你想要寫一個字符串, 你使用雙引號,就像我們已經 使用所有這一次的printf了。 但是,如果你要處理的只是一個 單個字符,所謂字符, 那麼你實際使用單引號。 你們當中誰已設定 之前,你可能沒有 不用擔心這個 區別在某些語言。 在C中,這非常重要。 所以,當我得到一個char,我想 使用equals來比較字符 等於像y或n一些信,我做的, 的確,需要有單引號。 現在,讓我們繼續前進,做到這一點。 讓我們繼續前進,不要做 邏輯點斜線邏輯。 而現在我被提示。 因此,據推測,更好的用戶體驗 實際上告訴我在這裡做什麼。 但我要去只是盲目 說Y(是),不錯,真不錯。 讓我們再次運行它,正因為沒有,美觀大方。 假設像某些人我知道, 我的大寫鎖定鍵是所有過於頻繁。 所以我做資本Y,回車,錯誤。 OK,這不是正是我期待的。 的確,計算機 簡直是在做什麼 我告訴它do--檢查 小寫字母y和小寫的n。 這並不覺得自己是最好 用戶體驗,雖然。 讓我索取,接受採訪 無論是小寫或大寫。 因此,原來,你可能想 說類似的划痕, 像字面上或C等於 等於資本單引號年。 事實證明,C沒有 這個文字關鍵字或。 但它確實有兩個豎條。 你要平時按住Shift, 如果您使用的是美式鍵盤, 並擊中豎線 按鍵上的回車鍵。 但是,這豎線 豎線表示或。 如果,相反,我們希望 說,就像在刮, 我們可以做的符號與符號。 這使得沒有任何邏輯意義在這裡, 因為人不可能 鍵入y和小寫ÿ 和資本y為相同的字符。 所以,還是就是我們打算在這裡。 所以,如果我這樣做,在這兩個地方,或c 等於等於資本N,現在重新運行, 使邏輯,重新運行邏輯。 現在,我可以鍵入y。 而且我可以再做一次 資本Y,或資本N. 而且我可以添加額外的 組合依然。 因此,這是一個邏輯 程序只要現在 我檢查的邏輯 這個值或該值。 我不就得了,必然, 拿出兩個IFS否則IFS。 其實我可以結合一些 以這種方式將相關邏輯。 因此,這將是更好 設計不是簡單的 他說,如果C等於較低的情況下,y, 打印是的,如果C等於資本Y, 打印是的,如果C等於 lower--換句話說, 你不必有 越來越多的分支。 您可以結合一些等價的 分支邏輯,如在這種方式。 因此,讓我們來看看只有一個 最後一個要素,一是最終的構建, 這C允許。 我們會回來的 今後其他的還是。 然後我們通過觀察得出結論: 在代碼 - 不正確性 讓代碼work--而設計 的代碼,建廠初期這些種子。 因此,讓我繼續前進, 在這裡開闢一個新的文件。 你知道嗎? 我要重新實現 同樣的程序, 但使用不同的構建體。 因此,讓我趕緊給自己 獲得包括CS50.h 為CS50庫, 標準Io.h像printf。 給我INT主要無效。 然後在這裡,讓 我繼續前進,做到這一點。 煤焦Ç得到得到CHAR,就像以前一樣。 而且我將使用一個新的結構 now--切換,什麼角色? 因此,開關是一種像 切換火車軌道。 或者,真的,這是怎麼樣的 如果一個別人,如果別人如果 但寫的有些不同。 開關看起來是這樣的。 你有開關,然後什麼 字符或你想看看號碼, 然後一些大括號喜歡 划痕,只是說做這個東西。 然後你有不同的情況。 你不if和else使用。 你從字面上用字情況。 你會說這樣的事情。 因此,在一個小寫y的情況下, 或在資本Y的情況下, 繼續前進並打印出肯定的。 然後打出來的開關。 而已。 我們就大功告成了。 否則,如果,可以這麼說, 小寫n或大寫字母N, 然後繼續和打印 出去不,再突破。 Else--和這種是 默認情況下indeed--的printf error-- 和公正的良好措施,但 這在邏輯上破則沒有必要 因為我們是在最後 反正開關, 現在我打破了開關了。 因此,這看起來有點不同。 但是,從邏輯上講,它是 實際上相當於。 你為什麼要使用 一個比其他? 有時候,只是個人喜好, 有時美學, 如果我看了一眼這個 現在,有什麼東西 以說是為 這個代碼的可讀性。 我的意思是,心中永遠的事實,這 代碼是新的在房間裡我們許多人。 但它只是一種很漂亮。 你看小寫字母Y,資本Y, 小寫N,大寫字母N默認情況下, 它只是一種跳躍 出你的方式 如此,可以說,也許 在前面的例子 與如果,和垂直桿, 和其他IFS,可能沒有。 因此,這是真正的個人問題 選擇,真的,還是可讀性, 的代碼。 但在功能方面,讓我 繼續前進,使開關,點斜杠 開關,現在鍵入小寫字母Y, 資本Y,小寫的n,資本N, 大衛,重試,因為這是 不是單個字符。 讓我們做X,錯誤,符合市場預期。 和,logically--這是值得 我會鼓勵general--甚至 雖然我們只是刮傷 的一些功能上。 它可能不是很明顯,當你 自己坐到鍵盤, 這個怎麼用? 你會這樣嗎? 關於有美麗的東西 膝上型或桌面,或訪問 與編譯器的計算機, 與這樣的代碼編輯器, 是你幾乎總是可以回答這些 問題為自己只是嘗試。 例如,如果修辭 在眼前的問題是, 如果你忘記了,會發生什麼 你break語句? 這實際上是一個 很平常的事, 因為它看起來並不 就像你真的需要它們。 他們並不真正完成 像想一個括號或捲曲 括號一樣。 讓我們繼續前進, 重新編譯代碼,看看。 因此,請開關,點斜線開關。 讓我們輸入小寫 Y,頂的情況下,回車。 所以我輸入年。 該計劃說的沒錯,沒有,錯誤, 因為雖然它是改變了主意。 但是,那種是的,因為會發生什麼 有開關是第一種情況是 比賽實際上意味著,哎電腦, 執行所有代碼的下方。 如果你不說破,或 不說破,還是不說破, 電腦會爆 通過所有這些行 並執行所有的人,直到 它獲取到大括號。 因此,剎車,的確有必要。 但這裡外賣,當 有疑問,嘗試一些東西。 也許先救你的代碼, 或將其保存在一個額外的文件 如果你真的很擔心 搞亂了,不得不恢復 你知道的工作是工作。 但嘗試的事情。 不要像害怕,也許, 什麼樣的電腦可能會做, 或者,你可能碰壞。 您可以隨時恢復 一些早期版本。 因此,讓我們通過觀察結束 在代碼的設計。 現在,我們有這個能力來寫 的條件下,與寫循環, 和變量,和通話功能。 因此,坦率地說,我們是那種回 我們是一個星期前從無到有, 儘管有一個不太引人注目的文本 環境比刮允許。 但是請注意,我們的速度已經獲得 那個詞彙,即使是 要帶一小會兒下沉, 所以,我們現在可以使用這個詞彙 寫出比較有趣的節目。 讓我們一起來小步 往那,如下所示。 讓我繼續前進, 在這裡創建一個新文件。 我要調用此 prototype.c,並引進 首次的能力 使自己的功能。 有些人可能有 有划痕做到了這一點, 讓你可以創建你 在刮自己的自定義模塊, 然後將它們拖放到的地方 無論你想在C. 而在大多數編程 語言,你可以做完全 that--使自己的功能, 如果它們不存在。 所以,舉例來說,讓我先走 和包括CS50.h,並且包括 標準IO.h,INT主要作廢。 現在我們有一個 佔位蓄勢待發。 我一直在承印物 像今天的人的名字。 那種感覺like-- 不會是很好,如果有 是所謂的打印功能的名稱? 我沒有用printf。 我不必記住 所有的格式代碼。 為什麼不要我,為什麼 沒有人在我面前, 創建一個函數調用打印 名,給予一定的名字, 簡單地打印出來? 換句話說,如果我說,嘿, 電腦,給我一個字符串 通過詢問用戶這樣, 通過CS50的get字符串函數。 嘿,計算機,把那個字符串 在左手側的變量, 並稱之為秒。 然後,嘿嘿計算機,勇往直前 並打印此人的姓名,完成。 現在,這將是很好的,因為 這一方案,適當命名的, 告訴我這是什麼應該做的 這些函數的名稱的方式。 讓我走,讓原型,回車。 而且,不幸的是, 這是不會飛。 Prototype.c,7號線,字符 5,錯誤,隱式聲明 函數打印名字 在C99,C99是無效的 這意味著一個版本的C 在1999年就出來了。 就這樣。 所以,我不知道是什麼 所有這一切意味著呢。 但我認識到紅色的錯誤。 這是很明顯的。 並且似乎與 綠色性格在這裡, 問題是打印的名字,開 括號S,右括號,分號。 但隱式聲明 函數,我們確實看到前面簡單。 這意味著,簡單地說,鏘 不知道我的意思。 我用一個詞彙詞,它的 以前從未見過或被教導。 所以,我要教它 這個函數是什麼意思。 所以我要繼續前進,並做到這一點。 我要繼續前進,實現 我自己的函數調用打印名稱。 而我要說,如下所示,這 它這樣做,printf的,你好,百分比 S,反斜線N,名稱,分號。 那麼,為什麼我只是做? 因此,原來,為了 實現自己的功能, 我們種借用一些 相同的結構主要 我們剛剛得到 理所當然的,我 知道剛才複製和 粘貼幾乎什麼 我已經寫了過去。 但這裡要注意的格局。 詮釋,主,無效的,我們將梳理出 沒過多久什麼實際意義。 但在今天,只是 注意到並行性。 太虛,打印的名字, 字符串名稱,所以有 一個紫色的關鍵字,這 我們要開始 調用返回類型,名稱 的功能,並且然後將輸入。 所以,實際上,我們可以提煉出 這種上週一樣的 如,這是名稱或 我們的代碼算法 去寫 - 的 底層算法 代碼我們將書寫。 這是它的輸入。 這是它的輸出。 此功能,打印的名字,是 設計上採用了一個名為名稱的字符串, 也好,作為輸入,然後空隙。 它不返回任何東西, 像得到字符串或得到INT一樣。 所以它要交給我的東西回來。 它只是將有一個 副作用,可以這麼說, 印刷一個人的名字。 因此注意到,7號線,我 可以調用打印名稱。 10號線,我可以定義 或實施打印的名稱。 但不幸的是,這還不夠。 讓我繼續前進, 保存後重新編譯這一點。 哇,現在,我做了它 更糟的是,它似乎。 這樣的隱式聲明 功能打印名稱無效。 並再次,還有更多的錯誤。 但正如我前面提醒,即使 如果你不知所措, 還是有點難過,看到這麼多 錯誤,只專注於第一 最初,因為它可能只是 產生了連鎖效應。 所以C,或鏘更具體地, 仍不能識別打印的名稱。 那是因為鐺, 在設計上,是種愚蠢。 它只做你告訴它做什麼。 而且只在該命令這樣做 在你告訴它做。 所以我定義主四線, 就像我們一直很經常做的事情。 我在第10行定義的打印名稱。 但我想使用 在七號線打印的名稱。 這太快了,還不存在。 所以,我可能是聰明,像, 好了,我們只是一起玩, 和移動打印的名字了 這裡,和重新編譯。 哦,我的上帝。 有效。 它是那樣簡單。 但邏輯正是如此。 你要教鏘什麼 是通過首先確定函數。 然後你可以使用它。 但是,坦率地說,這種感覺 像滑坡。 所以每次我運行 一個問題,我只是 要突出顯示並複製代碼 我寫的,就把它和它粘貼在這裡了。 而且,可以肯定,我們可以 圖謀一些場景 其中一個可能的功能 需要調用另一個。 而你只是不能把每 功能上面隔。 因此,原來在那裡的 一個更好的解決方案。 我們可以離開這個可以。 而且,坦率地說,這是普遍不錯, 方便,良好的設計 把主要一是因為,再次, 主要就好像當綠旗​​點擊, 這是函數是 被默認執行。 所以,你不妨把 它在該文件的頂部 所以,當您或任何 其他人查看文件 你知道這是怎麼回事 通過閱讀主要首位。 所以,事實證明,我們可以告訴鏘 主動,嘿嘿,鏘,四線, 我答應實施 一個函數調用打印 名稱以一個字符串名為name 作為輸入,並且沒有返回的,無效的。 我會避開 後來實現它。 這裡談到主。 現在主要在第9行可以使用 打印名稱,因為鏘 被信任的是,最終, 它會遇到的定義 姓名正楷的實施。 所以,救了我的文件之後,讓 我繼續前進,使原型, 看起來不錯,這一次。 點斜線,原型,讓我 繼續前進,鍵入一個名稱。 大衛,你好大衛Zamila,你好 Zamila,事實上,現在的作品。 因此,這裡的成分是,我們已經 做了一個自定義的功能,如自定義 划痕塊中,我們要調用它。 但是,與划痕在那裡你可以 只是創建它,並開始使用它, 現在我們要成為一個 多一點迂腐, 實際上訓練鏘 使用,或指望它。 現在,順便說一句,為什麼這段時間有 我們一直只是盲目信仰,包括 CS50.h,並且包括標準IO.h? 那麼,事實證明, 其中一些其他的東西, 所有的這些點^ h 文件,這恰好是文件。 他們在頭文件,可以這麼說。 他們還在用C寫的但是 他們是不同類型的文件。 現在,你幾乎可以承擔 所有這是CS50.h內 一些單行尚且如此, 名為打印名稱的功能, 但對於獲取字符串,獲取 浮動,和其他幾個人。 而也有類似的原型, 單行,標準IO.h內 像printf,這是現在在 我自己打印名稱的功能。 因此,換句話說,這整個時間內,我們 剛剛被盲目複製和粘貼 包括這一點,包括 這,這是怎麼回事? 這些僅僅是一種線索 以鐺,以什麼功能 的確都是執行,只是 在不同的文件別處 別處在系統上。 因此,我們已經實現打印的名稱。 它確實有這種副作用 打印屏幕上的內容。 但它實際上並沒有 遞給我的東西回來。 我們如何去 執行一個程序, 並交給我的東西回來? 好吧,讓我們試試這個。 我要繼續貫徹 一個名為return.c 所以我們可以演示如何的東西 以獲得更多的字符串,或得到詮釋, 實際上回國 回饋給用戶。 讓我們繼續前進,並確定主要INT無效。 並再次,在未來,我們將 解釋什麼是int和這一空白 其實這樣做。 但今天,我們將 理所當然。 我會繼續和printf, 一個良好的用戶體驗,x是。 然後,我會等待 用戶給我x,其中GET INT。 然後我要繼續前進 並打印出X到廣場。 所以,當你只有一個 鍵盤,一般的人 使用小蘿蔔 鍵盤上的符號 代表的功率 的,或者的指數。 SO x的平方是目前我。 現在我要做到這一點。 我可以do--什麼的x 平方?點¯x平方為x倍的X. 我們這樣做了一些 今天已經很久以前。 這種感覺並不像 那麼多的進展。 你知道嗎? 讓我們利用一些想法 從抽象的最後一次。 那豈不是很好,如果 有一個調用的函數 方認為正是這麼做的? 它仍然在的結束 一天,做了同樣的數學。 但是,讓我們抽象 拿走的想法 一個數字乘以 另一個,只要給它一個名稱, 像方此值。 並且,換句話說,在 C,讓我們創建一個功能 叫方認為正是這麼做的。 這將被調用方。 這將需要一個int。 我們會只是 稱之為N,默認情況下。 但我們可以把它叫做什麼,我們想要的。 和所有它會 這樣做,從字面上看,就是回報 n次n的結果。 但是,因為它是 回國東西,這 在紫色我們已經關鍵字 以前從未見過,我,第11行, 不能說作廢這個時候。 太虛,在這個例子中,我們剛才看到 而打印的名字,只是表示, 做一點事。 但是,不要遞給我的東西回來。 在這種情況下,我想 返回n次N, 或者不管它是什麼,該號碼。 所以,我不能說,哎,電腦, 我返回任何結果,無效的。 這將返回在本質上,一個int。 所以,這是所有在這裡嗎。 輸入方 將是一個int。 因此,我們可以使用它,它有 有一個名字,N.這將輸出 一個int並不需要一個名字。 我們可以把它交給主,或者是誰 用我記住,如果我們這個值 想擁有自己的變量。 並再次,唯一的新 關鍵字這裡是回歸。 而我只是在做一些數學。 如果我真的想成為不必要的, 我可以說INT產品得到n次ñ。 然後,我可以說,回歸產品。 但同樣,我的觀點同期 這恰恰不是好的設計 - 喜歡,為什麼引入一個名字, 一個符號,如產品, 只是立即返回呢? 這是一個有點清潔, 有點緊張,所以 說話,只是說回n倍 N,擺脫這一行乾脆。 它只是較少的代碼閱讀, 失誤少的機會。 讓我們看看這個 其實現在的作品。 現在,我要去 提前做出回報。 嗯,哦,功能隱式聲明。 我以前犯了這個錯誤,沒什麼大不了的。 我只需鍵入,或突出顯示和 複製,完全相同的函數原型, 或簽名,該功能在這裡的。 或者,我可以移動整個功能。 但是,這是一個有點懶惰。 因此,我們不會那麼做。 現在,讓我回 再次,點斜線回報。 x為2。X的平方等於4。 x被。X的平方等於9。 而功能似乎 現在的工作。 那麼,有什麼區別嗎? 我有一個這就是所謂的平方函數, 在這種情況下,我把在一個輸入。 而我回來的輸出。 然而,此前,如果 我打開其他的例子 從早期的,這 被稱為prototype.c, 我有打印的名稱, 退回作廢,可以這麼說, 或者,它返回什麼, 簡單地產生了副作用。 那麼是什麼回事? 那麼,考慮功能 得到的字符串只是一瞬間。 我們一直在使用功能 得到以下列方式串。 我們有一個函數來獲取 字符串,如包括CS50.h, 包括標準IO.h,INT,主要的,無效的。 然後每一次我 名為get字符串到目前為止, 我說的一樣,字符串s 得到得到的字符串,因為GET string-- 我們稱之為get.c-- GET字符串 本身返回一個字符串,我可以再 用了,說,你好,逗號, %的S,反斜線N,S。 因此,這是相同的例子, 真的,我們前面了。 因此,獲得字符串返回一個值。 但是剛才,打印字符串 沒有返回值。 它只是有一個副作用。 所以這是一個根本的區別。 我們已經看到了不同的 類型的功能現在, 其中一些已經返回 值,其中一些則沒有。 因此,也許它的字符串或整型,浮點或。 或者,也許它只是無效。 不同的是 這些函數 獲取數據並返回一個值實際上是 把東西回表, 可以這麼說。 因此,讓我們繼續前進, 看一眼決勝盤 的實施例,給出了一個感,現在的 我們怎麼可能,的確,抽象更好, 更好,更好或更多 多,而且多,為了 寫,最終更好的代碼。 讓我們繼續前進,並在精神 刮,做到以下幾點。 讓我繼續前進,包括 CS50.h和標準IO.h. 讓我先走,並把 我自己一個int,主要的,無效的。 讓我先走,稱此cough.c。 讓我繼續前進,只是 像划痕,打印出咳嗽/ N。 我想這樣做三次。 所以我,當然,只是去 複製和粘貼三次。 我現在要作 咳嗽點斜線咳嗽。 讓我們給自己多一點的房間 在這裡,回車,咳,咳,咳。 還有,很明顯,已經是一個 機會改善。 我複製並粘貼 今天一幾次。 但是,這是唯一的,所以我沒有 必須輸入盡可能多的字符。 我還是改變了什麼 這些代碼行。 這三條線是相同的, 這感覺懶惰,的確是, 而可能是不正確的方法。 那麼什麼成分 我們可以改善這個代碼? 我們不必複製和粘貼的代碼。 而且,事實上,任何時候你感覺 自己複製和粘貼, 即使不更改代碼, 賠率是有一個更好的辦法。 而且,事實上,有。 讓我繼續前進,循環做了, 即使語法可能不 自然來呢。 這樣做三次,只需 通過執行following-- 我碰巧從實踐中知道這一點。 但是,我們有一些例子吧。 你會看到在線 更多的參考依然。 這是第6行的句法,即 就像從頭開始重複 塊,重複下面的三倍。 這是一個有點神奇現在。 但是,這會得到更多, 越來越熟悉。 而且它會重複 八號線三次, 所以,如果我重新編譯化妝咳嗽, 點斜線咳,咳,咳,咳。 它仍然以同樣的方式。 所以這是一切優秀和良好。 但是,這不是很抽象。 這是完全正確的。 但感覺好像有 可能是一個機會, 作為在世界 從無到有,來樣開始 在這裡添加一些語義使 我不只是有一定的循環, 和一個函數,說 咳嗽,還是咳嗽。 你知道嗎? 我想做個 有點涼比, 實際上編寫一個函數, 有一定的副作用,稱之為咳嗽。 而且它沒有輸入, 無返回值作為輸出。 但是你知道它做什麼? 它this--的printf, 報價引文結束,咳嗽。 現在在這裡,我要去 繼續前進,對於int, 我得到零,我不到3,我加再加。 我會不會做的printf,這是 可以說是一個低層次的實現 詳情。 我不在乎怎麼咳嗽。 我只是想用止咳的功能。 而我只是要打電話咳嗽。 現在,請注意二分法。 當你調用一個函數,如果你不 想給它輸入,完全罰款。 只要做開括號,接近 括號,就大功告成了。 當你定義一個函數,或 聲明函數的原型, 如果你事先知道這不是 要採取任何參數, 說這些括號出現空白。 這使某些你 會不小心誤用。 讓我繼續前進,使咳嗽。 而且,當然,我犯了一個錯誤。 該死的,還有那 隱式聲明。 但是,這很好。 這是一個容易解決。 我需要的只是原型上漲 在我的文件比我實際使用它。 所以,現在讓我又咳嗽,美觀大方。 現在,它的工作原理。 讓咳,咳,咳,咳。 所以,你可能會認為我們真的 剛過工程這個問題。 而且,事實上,我們是。 這不是一個好 的程序的候補 在時刻 重構,做什麼 所謂的層次分解, 在這裡你需要一些代碼,然後 有種你因子東西出來,這樣 歸於更多的語義他們, 和重用它最終長期的。 但它是一個構建塊朝 更複雜的程序 我們將開始 之前寫了長 讓我們有詞彙 與寫出更好的代碼。 而且,事實上,讓我們看看,如果我們 不能一概而論進一步此。 這似乎有點跛,我,主, 需要擔心這個該死的for循環, 並一再呼籲咳嗽。 為什麼我不能只是告訴咳嗽, 請咳嗽三次? 換句話說,為什麼我不能只是 給輸入咳嗽,做到這一點? 為什麼我不能只是說,在 主咳嗽三次。 而現在,這是種神奇。 這是非常反复的在這裡。 而且它是,事實上,一個嬰兒的一步。 但就在能力上說, 八號線,咳嗽三次, 它只是這麼多的可讀性。 而且,再加上,我不必知道 或護理咳嗽是如何實現的。 而且,事實上,在後來的 長期和最終項目, 如果你處理一個項目 一個同學或兩位同學, 你會意識到,你要 有,或者想,分工。 而你會想決定 事先,誰去做些什麼, 並在其中部分? 而不會是好的 如果,例如, 負責撰寫主力,完成。 而你的室友,或者你 夥伴更一般地, 負責實施的咳嗽。 而且這種劃分,這些 抽象的牆, 抽象或層,如果 你會,是超級強大, 因為特別是較大的, 更複雜的程序和系統, 它允許多個人建 東西放在一起,最終 縫合在一起以這種方式工作。 但是,當然,我們 現在需要解決的咳嗽。 我們需要告訴咳嗽 ,嘿,你知道嗎? 你將需要採取 input--所以並不作廢,int和現在。 讓我們繼續前進並投入 咳嗽整型。我得到零。 i小於多少倍。 我以前說過三種。 但是,這不是我想要的。 我想咳嗽推廣到 支持任何數量的迭代。 所以,事實上,它是n表示我想, 無論用戶告訴我。 現在,我可以繼續說打印咳嗽。 無論什麼號碼 用戶通過在, 我會重複很多次。 這樣在一天結束時, 程序是相同的。 但是請注意,所有的這些東西 甚至可以是在另一文件中。 事實上,我不知道在 此刻怎麼printf的實現。 我不知道此刻怎麼弄 串,或得到int或獲得浮動 的貫徹落實。 而且我不希望 看到他們我的屏幕上。 正因為如此,我開始專注於 我的程序,而不是那些功能。 所以,事實上,只要你 開始分解這樣的代碼了, 可能我們連招咳嗽 到一個單獨的文件? 別人可以實現它。 你和你的程序成為 很漂亮,非常具有可讀性, 可以說,真正的4 行程序就在那裡。 現在讓我們繼續前進 並作一次改變。 請注意,我的原型 必須改變往上頂。 因此,讓我解決,這麼 我沒有得到大聲呵斥。 使咳嗽,讓我跑一次咳嗽 更多的,仍然在做同樣的事情。 但現在,看到我們有一個 成分為最後一個版本。 你知道嗎? 我不希望只是咳嗽,不一定。 我希望有更多的東西一般。 所以,你知道嗎? 我想這樣做。 我想有,就像刮 確實,一說塊,但不只是 說些什麼的時候一定數目。 我希望它說一個非常具體的字符串。 ,因此,我不知道 希望它只是說咳嗽。 我希望它說什麼 字符串在通過。 所以請注意,我全身 這讓現在 比方說感覺就像一個好名字 對於這一點,喜歡從無到有, 有兩個參數,不像劃傷。 之一是一個字符串。 一個是一個int。 我可以切換。 我只是有點像的想法 說字符串,然後再 多少次以後。 虛空意味著它仍然 不返回任何東西。 這些僅僅是視覺方面 效果,像[?喬丹?] 大呼小叫的口頭副作用。 它仍然做了n次, 0到,但不等於n。 這意味著全部N次。 然後只需打印出 無論是字符串。 所以,我真的全身 這行代碼。 所以,現在,我該如何實現 咳嗽功能? 我可以做無效咳嗽。 我仍然可以在如何 你想多次咳嗽。 但是,你知道嗎? 現在我可以踢的話。 我可以調用的說 字咳嗽,經過n的。 如果我想,也能實現, 只是為了好玩,一個噴嚏功能, 我打噴嚏的時候一定數目。 我可以繼續重用N,因為 注意到在這種情況下或範圍是m 只有在這個函數中存在。 和N在這種情況下只 這裡這個函數中存在。 因此,我們會回來的 範圍這些問題。 而在這裡,我只是說, ACHOO,然後n倍,分號。 而現在,我只需要借用 這些功能在這裡簽名了。 所以咳嗽是正確的。 虛空噴嚏現在是正確的。 我仍然只是需要說。 所以我要說,說 字符串s,詮釋N,分號。 所以,我已經過度設計的 赫克出這個計劃。 這並不 一定意味著這是 寫作時你應該做的 節目即使是最簡單。 就拿東西是很明顯 很簡單,真的很短, 並重新實現它 使用太多的代碼。 但是,你實際看到的,而在 時間回頭看這些例子, 與實現,哦,那些步驟 我們採取了實際一概而論, 要因素出來的東西, 直到在一天結束 我的代碼實際上是非常合理的。 因為如果我想咳嗽3 次,然後打噴嚏三次, 我只是要重新運行此, 計劃使咳嗽,並運行咳嗽。 而且我有三個咳嗽 和三個噴嚏。 所以這是一個基本的 範例,如果你願意, 對於我們如何去 實際執行的程序。 但是讓我們只看到現在是什麼 我們一直在做這一切的時候, 什麼一些最終件 這是簡單的命令後面。 在一天結束的時候,我們已經 使用鏘作為我們編譯了。 我們一直在寫源 代碼,將其轉換 通過鏘成機器代碼。 而且我們一直在使用剛剛製作 以方便我們這樣的擊鍵 我們不必記住 鏘本身的咒語。 但是,什麼是讓真正在做什麼? 並且,反過來,是什麼 鏘實際上做? 事實證明,儘管我們已經簡化 說今天的討論, 你把源代碼,把它作為 輸入一個編譯器,它給你 機的輸出 代碼,原來有 裡邊有幾個不同的步驟。 和編譯恰好是傘 術語一大堆的步驟。 但是,我們只是戲弄 這一點真的很快。 事實證明,我們一直在做 更多的事情我每次運行一個程序的時候, 或每次我今天編譯程序。 因此,預處理是指 在C程序this--什麼, 如我們一次又一次地看到, 與此井號開始, 還是這裡的#標籤符號,意味著 這是一個預處理指令。 這意味著,在這種情況下,餵 計算機,做一些與此文件 在你真正編譯自己的代碼。 在此情況下,散列包括就是 本質上,C的說法方式, 哎電腦,去獲得內容 CS50.h,並將其粘貼在這裡。 嘿電腦,去獲得的 標準IO.h的內容, 無論是在 硬盤驅動器,它貼在這裡。 因此,這些事情發生 預處理時先。 而鏘做這一切對我們來說。 並且實現起來這麼混賬 快,你甚至不 看到四個不同的事情發生。 但是,這是第一個這樣的一步。 其實什麼接下來會發生? 好了,接下來的正式 一步是編譯。 而事實證明, 編譯程序 技術上意味著從去 源代碼,我們已經東東 今天一直在寫,東西 所謂的彙編代碼,東西 看起來有點不同。 而且,事實上,我們可以真正快速的看到這一點。 讓我真正進入我的IDE。 讓我繼續前進,開放的hello.c,這 是第一個程序,使用它我們 今天開始了。 讓我繼續運行鏘一 有點不同,鏘-S,hello.c中, 這實際上是要 給我另一個文件hello.s。 我們可能永遠不會 再次看到這種代碼。 如果你把一個較低的水平 系統類像CS61, 你會看到更多 的這種代碼。 但是,這是彙編語言。 這是X86彙編語言 這是基本的CPU CS50 IDE實際上理解。 和隱蔽因為它 看,那是什麼 計算機理解得很好。 子Q,這是一個減法。 有動作。 還有的調用函數在這裡, 點¯xO形圈,一個動作,一個插件,彈出, 回報。 因此,有一些非常 低級別的指令 該CPU的理解, 我前面提到。 這就是英特爾內部。 有模式 零和一其 映射到這些措辭arcanely,但 有些良好的命名,說明, 可以這麼說。 那是發生在什麼 您編譯代碼。 你得到總成 語言出來,這 裝置的第三個步驟是組裝 該彙編代碼進入,最終, 機代碼 - 零和一,而不是 文本剛才我們看到剛才。 因此,預處理這是否找到 和替換,以及一些其他的東西。 編譯把你的源代碼 從C代碼,源代碼 我們寫的,到組裝 代碼,我們只是看了一眼。 組裝需要該程序集 碼到零和一 該CPU真的會 理解在一天結束。 和鏈接是最後一步 出現這種情況的再次us--, 如此之快,我們甚至不 notice--,上面寫著: 哎電腦,採取所有的 在零和一的 源於編譯大衛的代碼, 和他在這種情況下,主要的功能。 哎電腦,去獲得 所有的零和一 該工作人員CS50寫道: 在CS50庫內。 混合那些與大衛的。 哎電腦,去獲得所有的零 和那些別人寫了幾年 以前像printf。 而這些添加進 整個事情,讓我們已經 得到了我的零和一的 CS50員工的零和的, printf的的零和一, 和我們使用其他任何東西。 它們都能夠結合在一起成一個 程序調用,在這種情況下,餵。 所以,從今以後,我們將只 用這個詞編譯。 我們會理所當然地認為,當 我們說,編譯你的程序,這意味著, 哎做預處理, 彙編和連接。 但實際上有一些多汁的東西 對那裡發生的引擎蓋下面。 特別是如果你 讓好奇的一段時間, 你可以開始戳 圍繞在這個較低的水平。 但是現在,意識到 在外賣今天之一 是很簡單的 開始的過程中, 越來越舒服的 類似的hello world。 事實上,大多數的我們今天做了 當然不會下沉超快。 它會採取一些 時間,以及一些實踐。 賠率是,你將整理 的想打你的鍵盤 或者在屏幕大喊大叫。 而所有的這行。 不過,也許是盡量不要 這樣做在圖書館這麼多。 最終,你會 被能夠雖然,以啟動 眼看模式,無論是在好的代碼 你寫在錯誤 你所做的。 和很像的過程 成為一個TF或CA是什麼樣子, 你會開始變得更好, 在看到這些模式比較好, 和公正的解決您的 自己的問題最終。 在此期間,將有大量 我們借給你們的支持,讓你 通過這個。 而在寫窗口 對於所有的問題 你會通過引導 所有的命令 我當然知道,從 現在大量的實踐, 但可能已飛過 在一個人的頭了。 這是完全的罰款。 但是,最終,你會 開始看到的模式出現。 而一旦你過去所有的 愚蠢的細節,比如括號, 和大括號和分號, 和東西,坦率地說, 這不是在所有的 智力有趣。 它不是客觀 服用任何入門級。 它是將要事情的想法。 它的循環,而 條件,以及功能, 和更有力的抽象, 與上面的代碼保理, 和良好的設計,以及良好的 風格,最終的正確性 你的代碼,這是最終 事情影響最大。 所以下週,我們將採取以下 想法,我們第一次看到划痕 現在已經翻譯 到C.我們將開始 引進第一的 當然,真實世界的領域。 我們將專注於安全領域, 更具體密碼學, 藝術擾碼信息。 和第一批 你自己的問題,你 將得到超越寫 與一些語法的打 和解決一些邏輯 問題,最終沒多久, 是真正爭我奪,或加密, 並最終解密信息。 而我們所做的一切 今天,將相當低 的水平,只是要允許 我們採取之一,和一, 以上朝著一個步驟 寫作最有趣的代碼呢。 因此,更多的是在下週。 [視頻回放] - 什麼,你能告訴我 您看見他是什麼時候? - 什麼我可以說,真的嗎? 我的意思是,它像任何其他 生產前的排練, 但有些事情,他說 在最後與我卡住了。 - 這是CS50。 - 那是一個切大家, 在排練偉大的工作。 - 這就是午餐? 是啊,你和我可以 搶位三明治。 我只是聽取匯報 大衛真的很快。 大衛? 大衛? [結束播放]