[音樂播放] 大衛·馬蘭:所有的權利, 歡迎回到CS50。 這是兩個星期的開始。 從我們的一個字 朋友們在校園 - 如果你有興趣,可能的話,無論是 現在或將來的某個長期 甚至,一旦更舒適,教學 初中學生一點點 計算機科學的東西, 做頭到該網址。 他們現在特別需要 教師,特別是如果你有 有一些接觸計算機科學。 所以記得,最後一次,我們引入 有一些數據類型在C中, 您可能已經開始讓你的 這些迄今的手臟 設置問題之一。 我們有一個字符。 因此,在有些技術方面, 你今天所知道的是一個char? 所以這是一個字符,但我們的 現在更精確。 字符是什麼意思 或個別字符? 非數字字符 - 不一定。 事實證明,即使是數字,甚至 標點符號和字母 與此數據表示 類型稱為一個char。 所以它不一定是按字母順序排列。 是嗎? 所以這是一個ASCII字符。 所以,如果你想返回到零週,當 我們有我們的志願者字節 要么上來,握住他們的手 不是全部,他們所代表的位。 但合八為一組, 他們代表一個字節。 我們介紹了概念ASCII 在這次演講中,這簡直是一個 數字和字母之間的映射。 和ASCII用途,因為這些人 暗示,八位 來表示一個字符。 因此,如果8位 每次取兩個值之一 - 零次或一次 - 這意味著有兩種可能性 這個人 - 零次或一次 - 這個人,這兩個 人,為這一個兩個。 因此,兩次共兩次 兩次兩兩三次 - 所以兩個總第八。 所以這是一個總的字符數 256種可能,你可以 代表與8位。 現在,那些你們誰講亞洲 語言可能知道,有更多的 不僅僅是在世界上的字符 AS和BS和CS和DS。 事實上,ASCII不足夠 很多世界的語言。 但另一個時間。 現在,知道如果你想在C 代表一個字母,一塊 標點符號,或只是一些字符 在自然界中,我們使用一個字符。 它是一個字節或8位。 一個int怎麼樣? 嗯,一個int是一個整數。 多少位,如果你還記得, 通常是一個整數嗎? 任何人都召回? 因此,它是典型的32。 實際上,它取決於在計算機上 你使用。 但在家電,並在很多 計算機,它是32位或4個 字節 - 八倍四個。 和整數只是用於存儲 數字,要么是負, 陽性,或零。 如果你只得到了32位,你 關心正數, 有人看球多少可能 整數,是一台計算機可以表示從 零,就到了嗎? 因此這將是2到32,這 大約40億。 因此,這些權力的兩個將要 在計算機科學中反复出現的主題。 正如我們所看到的,他們很方便 即使是不太 容易做數學題,在一個人的頭上。 所以我們會說大約40億。 現在,很長很長 - 你可以猜測的那種。 它長於一個int。 多少位? 因此,64位或8個字節。 這只是意味著你甚至可以代表 更大的數字,更大的積極或 較大的負數。 又有怎樣的浮動? 這是一個浮點 32位的值。 這僅僅是一個實數,東西 小數點。 但是,如果你的地方,而不是需要更多的 小數點後或者你想 一些代表一個更大的數目 分數後,你可以使用一個 雙,這是64位。 但有一個有趣的 這裡的外賣。 是有限的32位,所以,如果整數 64即使是有限的長期多頭 位,那種引出了一個問題, 如果你真的要算 高於4億元為int? 嗯,你只是用很長很長。 但是,如果你要算高 超過兩至第64個,給予或採取? 現在,這是一個龐大的數字。 但最終,你實際上可能 關心這些類型的值, 尤其是如果你正在使用的數據庫 並開始收集很多很多 和大量數據,並且分配唯一的 編號,每一塊的數據。 因此,我們有一個問題。 同樣,浮點運算 價值 - 花車或雙打 - 如果你只得到了有限數量的 位,你總共有多少個數字 可能代表什麼呢? 嗯,這是不太清楚,當你 涉及小數點。 但它肯定是有限的。 如果你有一個有限的比特數, 有限數量的人類,一個有限的 燈泡的數目,你一定可以 只能表示有限數量的 浮點值。 但究竟有多少真正的數字 是他們在世界上? 有一個無限。 所以這是樣的一個問題,因為我們 不具有無限長的 我們的電腦內的內存或RAM。 所以一些具有挑戰性的事情都可能發生。 所以,讓我們繼續前進,並嘗試 這裡表達。 讓我去進取,不斷開拓gedit的。 我要繼續前進,並保存文件 被稱為“floats0.c”剛需 一致的,例如,即 可在網上,如果你想。 而且我要繼續前進, 它定義如下 - 我要繼續前進,並說,詮釋 主要無效的,因為我們經常做的。 然後在這個方案中,我要 申報自己的持股量,所以32位 變量稱為F,任意。 然後我要存儲在 我不知道,十分之一,所以0.1。 所以我要表達的是作為一個 除以10,這是完全 C.合法 然後在第二行,我只是 要打印出它的值。 所以,記得,我們​​可以使用 熟悉的printf。 我們不希望使用%i的類型為int。 我們要使用一個浮點數%F。 然後我要做的反斜杠n, 引號,逗號,F,分號。 因此,這裡是我的計劃。 已經有一個錯誤。 是否有人對他們來說,這點擊 早就想點滿 一個bug,我呢? 是嗎? 嗯。 我忘了“#” 頂,他們的症狀,如果我嘗試 編譯這是怎麼回事, 編譯器會罵我, 說未定義的象徵或 東西的效果。 它不明白的東西 printf的喜歡。 所以我打算做“# “,保存該文件。 現在它在更好的形狀。 但我也要去點 出一個新的細節。 除了指定的地方 %F%%s的持有人一樣,你可以 有時會影響行為 這個佔位符。 例如,在一個浮動的情況下 點值,如果我只想 顯示一個小數位後 期間,我其實可以做0.1F。 因此,換句話說,分開f和 0.1,剛百分號 告訴printf的,你可能有一個整體 一串數字的小數點後 指向我。 但我只想看其中之一。 所以,我要繼續前進並保存 這個程序,進入我的終端 窗口,我要繼續前進 和類型浮法0,回車。 我看到有些神秘的線, 因為我們將開始使更多的意義 逗它除了本週和下週。 現在,我要繼續前進 運行浮法零。 而且,該死的。 因此,有另一個錯誤 這裡的一些原因。 我敢肯定,有十分之一,或 除以10,是不是0.0。 也許我只是不找 足夠的位數。 所以我為什麼不說兩個.2看到兩個 小數位,而不只是一個。 讓我回到我的終端窗口 這裡打了幾次 看看我的歷史。 不要使再次零漂浮, 然後再度上升。 現在進入。 現在,我敢肯定,這是錯誤的。 我可以做三和四,而我 可能會看到零。 那麼,是錯誤嗎? 除以10應為0.1。 有人要採取刺在什麼 根本的問題是什麼? 是嗎? 他們倆都是整數。 還等什麼? 因此,除以10,這是 我做算術。 我得到0.1。 嗯。 所以這的確是這個問題。 當你在一台電腦一個整數 它除以另一個整數, 計算機默認情況下,是怎麼回事 假設您想要一個整數。 的問題,雖然,當然是 是0.1,不是一個整數。 這是一個實數。 還等什麼計算機未通過 默認情況下,它只是扔掉 小數點後的一切。 它不向下舍入或本身。 它只是拋出了一切 小數點後。 現在是有道理的。 因為現在我們清楚 留下了零。 但是且慢。 我沒有看到一個int零。 實際上,我看到0.00。 所以,我怎麼調和嗎? 如果除以10是零,但我 看到0.00,它從哪兒得到 轉換回一個實數嗎? 嗯。 沒錯。 所以在這裡5行,當我真正 存儲是0.1,然後 截斷為零,裡面的浮動, 實際上相當於 存儲為int,但是, 的確,作為一個浮動。 此外,我再使用的printf 明確兩個打印該號碼 小數位,即使有 可能實際上沒有任何秘密協議。 所以這種很爛,對不對? 顯然,你不能做數學, 至少在這個級別的 精度,在一台計算機。 但是肯定有一個解決方案。 我們也許可以簡單的解決辦法是什麼 做,甚至只是憑直覺在這裡 解決這個問題? 是嗎? 打開整數 - 是的。 即使我不太知道什麼是 真的會在這裡,如果它 這些都從根本上做 是整數,好,為什麼不是我 10.0,使得這個 1.0,重新保存該文件。 讓我去回落到 底部並重新編譯。 現在讓我重新運行。 還有 - 現在,我已經得到了我的十分之一 表示為0.10。 好的。 所以這是不壞。 並讓我指出另一種方式 我們已經解決了這個。 實際上,讓我及時回滾 當我們作為一個 前十片刻。 並讓我繼續前進,重新保存這個文件 作為一個不同的文件名,只是為了 有一點點的檢查點。 所以這是版本之一。 現在讓我繼續前進, 做一個多個版本。 我們稱這個版本 兩個零的索引。 我要去,而不是做 - 你知道嗎? 添加點零,在這種情況下工作。 但是,假設一個人的變量。 10應該是一個變量。 換句話說,假設我做不到 只是很難在最後的代碼.0 此算術表達式。 好吧,我可以做一些實際的 括號中稱為鑄造。 我可以投一個浮點數,整數10, 我可以投,整一至 浮動,以及。 然後做數學 有效1.0除以10.0, 的結果,其中去 在f前。 所以,如果我重新編譯這使花車 2,現在浮2,我得到同樣的 回答,以及。 因此,這是一個相當做作的例子, 解決這個問題的 通過引進鑄造。 但在一般情況下,鑄造將是 一個強大的東西,特別是對於 問題設置兩個在一個星期的時間,當 你要轉換的一種數據類型 另一種是在一天結束時 以同樣的方式來表示。 在一天結束時,每一單 迄今為止,我們已經談到的事情是 只是整數引擎蓋下。 或者,如果太低級 你,他們只是數字 引擎蓋下。 再次,即使字符記得 週為零,是數字 引擎蓋下。 這是說,我們之間可以轉換 如果不同種類的數字 他們只是位。 我們之間可以轉換數字 和字母,如果他們只是 位,反之亦然。 以這種方式和鑄造是一種機制 在編程中,可以讓你強行 改變一個數據類型到另一個。 不幸的是,這是不 簡單,因為我可能會喜歡。 我要回去花車 如圖1所示,這是更簡單,更 直截了當的與 .0到每個。 而只是作為一個快速複習, 讓我繼續前進,重新編譯 這一點,使花車2 - 對不起,這是彩車1。 現在讓我們運行彩車1。 而在底部,請注意 我確實得到0.1。 所以,問題就解決了。 但不是現在。 現在,我會得到一點點好奇, 我要回去到我的 printf語句和 說,你知道是什麼嗎? 我想證實這 真的是十分之一。 我希望看到這個 ,比方說,小數點後五位。 這不是一個問題。 我改變了兩到五年, 使我重新編譯。 我重新運行它漂浮1。 展望相當不錯的。 我的理智檢查可能結束,但 我得到多一點冒險精神。 我要改變0.5至0.10。 我希望看到10位後 小數位。 而且我要繼續前進,並重新編譯 並重新運行漂浮1。 我有點遺憾經測試此 進一步,因為我的數學也不是那麼 糾正了,它似乎。 但是,等待一分鐘,也許 這只是一個偶然。 也許計算機充當 有點怪。 讓我繼續前進,做20個小數點 安慰自己,我知道 如何做數學。 我知道如何編程。 彩車1,重新編譯,該死的。 這是真的,真的越來越 遠處的標記。 那麼,這是怎麼回事? 直觀地說,根據我們的假設 早期的數據類型的大小, 什麼是必須發生在這裡 引擎蓋下? 是嗎? 沒錯。 如果你要這麼多的精度, 這是一個了不起的很多精密 - 20小數點後的數字。 你不可能代表 除非你有一個任意數量 任意的比特數。 但我們不這樣做。 對於浮動,我們只有32位。 因此,如果32位只能在置換 的方式 - 就像我們人類,舞台 向上或向下的手 - 在有限數量的 方式中,只有數量有限 實數可以代表 這些位。 因此,計算機最終 將不得不 開始偷工減料。 計算機可以隱藏這些細節 從我們一點點的時間。 但是,如果我們開始戳的數字 並期待在越走越遠 後數字的整數, 然後,我們開始看到它的 實際上接近 十分之一的想法。 所以事實證明,可悲的是,有 無限數量的數字 我們不能代表正是在 計算機,至少在一個有限的 的比特數,一個有限的 RAM的數量。 不幸的是,現在這有時 具有現實世界的後果。 如果人們不很明白這一點 或那種想當然的事實 他們的計算機只是做 他們告訴它做不 了解這些基礎 代表性的細節 - 坦率地說,在有些語言 對用戶隱藏的,不像在C - 一些不好的事情都可能發生。 什麼,我想我們會做 是退後一步。 這是關於 八分鐘的錄像片。 它宣揚了幾年前,它給 其實是可以去的洞察 錯了,當你欣賞這些 各種細節都非常太 真實的世界。 如果我們可以把燈光調暗 了幾分鐘。 揚聲器1:現在我們回到工程 災​​害對現代奇蹟。 電腦 - 我們都將接受 往往是令人沮喪的問題 ,和他們一起去。 錯誤,病毒,軟件故障 小的價格支付 方便。 但是,在高科技和高速 軍事和航天計劃 應用中,最小的問題 可以放大成災難。 1996年6月4日,科學家準備 發射無人駕駛的阿麗亞娜5型火箭。 它攜帶的科學衛星 正是如何建立 地球磁場的相互作用 太陽風。 火箭始建歐洲 航天局和其升空 在海岸設施 法屬圭亞那。 JACK GANSSLE:在約37秒 飛行中,他們首先注意到 東西是錯誤的。 噴嘴旋轉 一種方式,他們真的不應該。 進入飛行約40秒, 明確了車輛遇到了麻煩。 這就是當他們做了一個 決定銷毀它。 範圍內的安全人員, 巨大的膽量,按下按鈕, 炸毀了火箭之前,它可以 成為危害公眾安全。 揚聲器1:這是首航 阿麗亞娜5型火箭,它的破壞 因為嵌入一個缺陷發生 在火箭的軟件。 JACK GANSSLE:阿麗亞娜問題 的是,有一個數字 ,需要64位來表示。 他們想轉換 一個16位的數字。 他們假設的數量從來沒有 將是非常大的,最 那些在64位的位數 數量是零。 但他們錯了。 揚聲器1:一個軟件無法 程序接受的那種 數所產生的另一個 在根目錄的失敗。 軟件開發已經成為一個非常 昂貴的新技術。 阿麗亞娜4型火箭一直非常 成功的,那麼多的軟件 為它創建的也是 用於在阿麗亞娜5型火箭。 菲科伊爾:最根本的問題是 阿麗亞娜5速度更快, 更快地加速。 軟件 佔該。 揚聲器1:破壞火箭 是一個巨大的金融災難, 由於軟件錯誤一分鐘。 但是,這是不是第一次數據 轉換問題一直困擾現代 火箭技術。 JACK GANSSLE:開始於1991年, 第一次海灣戰爭中,“愛國者” 導彈經歷了類似 數轉換的問題。 其結果是,28名美國士兵 死亡,約100人受傷 當愛國者,這是應該 以防止傳入飛毛腿, 沒有發射導彈。 揚聲器1:當伊拉克入侵科威特和 美國發動“沙漠風暴” 1991年初,愛國者導彈 被部署到保護沙特 以色列從伊拉克飛毛腿 導彈攻擊。 愛國者是美國的中程 表面空氣系統製造 雷神公司。 THEODORE波斯托爾:愛國者的大小 攔截器本身大約是 20英尺長。 它重約2000磅。 它攜帶的彈頭約 - 我認為這是大約150磅。 和彈頭本身是一個 高爆 它周圍的碎片。 彈頭的殼體設計 像巴克肖特。 導彈進行了四個揚聲器1: 容器和運輸 半拖車。 菲科伊爾:愛國者反導彈 系統可以追溯到 至少有20年了。 它最初被設計為 防空導彈 擊落敵方飛機。 在第一次海灣戰爭,那場戰爭時, 走過來,陸軍想使用它 擊落“飛毛腿”導彈,而不是飛機。 伊拉克空軍沒有 這麼多的問題。 但陸軍擔心飛毛腿導彈。 因此,他們試圖升級 愛國者。 揚聲器1:攔截敵方導彈 在5馬赫 將要足夠的挑戰性。 但是,當愛國者衝進 服務,陸軍不知道的 伊拉克的修改,使他們 打飛毛腿導彈幾乎是不可能的。 西奧多·波斯托爾:發生了什麼事 飛毛腿 進來的是不穩定的。 他們搖晃。 這樣做的原因是伊拉克人, 為了獲得600公里的 300公里的遠程導彈,把 出前彈頭重量。 他們使彈頭打火機。 所以,現在愛國者的嘗試 來的飛毛腿。 而大部分時間,鋪天蓋地的 大部分時間裡,它只是 飛毛腿飛。 揚聲器1:一旦愛國者導彈系統 運營商意識到錯過的愛國者 它的目標,他們引爆了愛國者 彈頭,以避免可能 如果它被允許傷亡 倒在地上。 THEODORE波斯托爾:這是最 人們看到大火球在天空中 作為攔截和誤解 飛毛腿彈頭。 揚聲器1:雖然在夜空 愛國者似乎是成功 摧毀“飛毛腿”導彈,在達蘭有 關於它的可能是沒有錯 性能。 有愛國者的雷達系統失去 跟踪傳入飛毛腿從未 由於軟件缺陷而推出。 這是以色列首次發現 的時間越長系統 是,更大的時間差 成為由於時鐘 嵌入式系統的計算機。 JACK GANSSLE:大約兩個星期前 在達蘭,以色列人的悲劇 國防部報告 該系統是失去的時間。 經過約8個小時的運行, 他們注意到,該系統是 越來越明顯不準確的。 國防部回應 告訴所有的愛國者電池 不能離開系統 很長一段時間。 他們從來不說,很長一段時間。 8個小時? 10小時? 千小時? 沒有人知道。 揚聲器1:愛國者進駐 在宰赫蘭兵營 一直有問題的內部時鐘 對超過100小時的夜 2月25日。 JACK GANSSLE:跟踪時間到 的大約十分之一秒的精度。 現在,十分之一秒為 有趣的數字,因為它不能 以二進制表示完全相同,表示 它不能被精確地表示在 任何現代數字計算機。 這很難相信,但 用這個作為一個例子。 讓拿多少三分之一。 三分之一也無法表達 在小數正是。 三分之一0.333 無窮。 有沒有辦法做到這一點 絕對精度在小數。 這也正是同樣的問題 ,在愛國者發生。 系統運行的時間越長, 最壞的時間誤差就成了。 揚聲器1:運行100小時後, 只有時間錯誤 大約三分之一的第二個。 但無論在目標導彈 在5馬赫,它導致 超過600米的跟踪誤差。 這將是一個致命的錯誤 在宰赫蘭的士兵。 西奧多·波斯托爾:發生了什麼事是一個 飛毛腿發射早期檢測 預警衛星。 他們知道,飛毛腿 在他們的大方向。 他們不知道它在哪裡來。 揚聲器1:現在是雷達 “愛國者”系統的組成部分 衛冕達蘭定位,並保持 跟踪來襲的敵方導彈。 JACK GANSSLE:雷達 是非常聰明的。 它實際上跟踪的位置 飛毛腿,然後預測 可能會是今後一段時間 雷達發出一個脈衝。 這被稱為距離門。 THEODORE波斯托爾:然後,一旦愛國者 決定有足夠的時間已經過去了去 備份和檢查的下一個位置 此檢測對象,它可以追溯到。 因此,當它回到了錯 地方,然後看到沒有對象。 而它決定,沒有任何對象, 這是一個虛假的檢測,並 下降的軌道。 揚聲器1:傳入飛毛腿消失 從雷達屏幕上, 秒鐘後,它抨擊 走進軍營。 飛毛腿殺害28是最後一個 第一次海灣戰爭期間發射。 可悲的是,更新後的軟件到達 在宰赫蘭的第二天。 軟件漏洞已被固定, 關閉一章的困擾 歷史的“愛國者”導彈。 愛國者實際上是一個縮寫 相控陣跟踪 攔截的目標。 DAVID J MALAN:所有的權利,所以 發人深省的例子,可以肯定的。 幸運的是,這些較低水平 錯誤是沒有的東西,我們會 通常有升值,當然 不是與我們的一些 最早的方案。 相反,大多數的錯誤,你會 將所遇到的邏輯性, 語法性質,據此, 代碼只是不工作的權利。 而且你知道它相當快的。 但是,尤其是當我們得到的 學期結束時,它會 的可能性變得越來越 真的好好想想的設計 您的程序和底層 表示 有太多的數據。 舉例來說,我們將介紹MySQL中, 這是一個受歡迎的數據庫引擎 您可以使用網站 數據存儲在後端。 你就得開始決定 學期結束的不僅是 沿著這些線路的類型的數據,使用 但究竟有多少位使用, 您是否想存儲日期 隨著時代的日期和時間,也 之類的東西你要多大的 是唯一的ID,也就是說,用戶 在數據庫中。 事實上,如果你有一些有 Facebook的佔了相當長的一段時間, 你知道如何獲得 您的用戶ID - 這有時會顯示在你的 除非你選擇了一個配置文件的URL 綽號的URL,或者如果你已經 常用的Facebook的圖形API, 公開可用的API,通過它 可以要求Facebook的原始數據 - 你可以看到你的數字ID是什麼。 若干年前,Facebook的本質 不得不改變使用 使用長整型相當於 長,因為隨著​​時間的推移,用戶前來 去創建大量的賬戶, 假帳戶,即使他們很容易 能用盡的東西就像一個4 十億可能像一個int值。 所以這些類型的問題 在路上,以及。 所有權利,使被鑄造。 這是不精確的。 一對夫婦迅速公佈。 所以部分正式開始 週日,週一,週二。 你會聽到在本週晚些時候通過電子郵件 為您的部分分配。 你怎麼在這一點也在這裡 改變你的部分,如果你 時間表現在已經改變或 舒適程度現在已經改變。 同時,P-集合一個黑客之一 本週四到期的選項 延長該期限每 規格至週五 在一個典型的方式。 實現的問題,其中包括 集規格說明 如何使用的CS50家電, 以及一些CS50具體工具 50般的風格,可以為您提供 動態與反饋 你的代碼風格和質量也 檢查50個,可為您提供 動態反饋到您的 代碼的正確性。 請原諒,我們仍然熨燙 出幾個扭結支票50。 有幾個你的同學們開始 四點左右,上週五晚上,當 規範上升從那時起已經注意到 一些錯誤,我們正在努力 通過和道歉的人誰 經歷了不必要的挫折。 該故障是我的。 但是我們會跟進CS50 討論何時得到解決。 所以一個字的分數本身。 因此,這將是一兩個星期之前, 開始得到反饋問題集 因為你還沒有 教學研究員。 即使到那時,我們將​​開始評估 C問題之前,我們設置 回去從頭如此評價 你得到更多的有關 更快速的反饋。 但在一般每教學大綱,CS50 習題集一起評估 以下四個軸 - 範圍,正確性,設計和風格。 範圍將是一個數字通常 0至5, 捕獲多少 一塊咬下。 通常情況下,你想這是五。 至少你嘗試了一切。 並注意到這是一個乘數因子 所以,這樣做只是部分的 問題集是不是最好的策略。 同時,更明顯的是 正確性的重要性 - 僅僅是你的程序正確 尊重規範? 這是故意加權 重比其他兩個軸由一個 三個因素,因為我們認識 通常你會花 更多的時間追了一些bug, 讓你的代碼工作,那麼你 縮進它並選擇 適當的變量名和 等,這是在另一端 的頻譜風格。 這並不是說風格是不是 重要的,我們會傳過來 講座和部分時間。 式是指美學 你的代碼。 你有選擇的命名變量 很短,但有些 的描述嗎? 你的代碼縮進你見過 講座和一致的方式 風格50? 最後是設計權 還有在中間。 放一個更難的設計 手指上,因為它更 主觀的。 但它也許是最重要的 三個軸在教學方面的 價值隨著時間的推移,這將是 教學研究員的機會 為您提供定性反饋。 事實上,在CS50,即使我們確實有 這些公式和成績,在年底 的一天,這些都是很刻意 非常小水桶 - 點值 0和3之間 零和五​​。 我們不要嘗試畫很粗的線條 之間的問題集之間或 學生而是盡可能集中 我們可以定性,普通的 反饋,無論是打字或口頭 您的特定的教學研究員, 你會得到相當不錯知道。 但在一般情況下,這些權重 各軸。 同時,太,這是值得保持 介意你不應該假設, 五分之三是60% 因此,大致失敗。 三是故意為了 中間的道路好樣的。 如果你在得到三分 從本學期開始,這是 的確意味著是一個很好的 開始的地方。 如果你有三三兩兩,展銷會, 一定工作付出一點 更多的關注,以充分利用 段和辦公時間。 如果你得到四肢 五,偉大的。 不過說真的,我們希望看到的軌跡 學生之間 - 每名學生的個性化,但啟動 本學期,在這裡排序 兩到三個範圍內,但結束 這裡在四到五的範圍內。 這就是我們真正需要的。 同時,我們也牢記三角洲 週之間的零和週展出 12時,我做的成績。 不要緊,我們絕對怎麼樣 你公平的開始,如果您的 的確軌跡 向上和堅強。 學術誠信 - 所以讓我把我的 更嚴重的只是一瞬間的聲音。 因此,這當然有區別 派遣更多的學生比其他任何 在歷史上的廣告板,我相信。 我們有點記不清 點如何經常發生這種情況。 而這還不是因為學生在50 任何比自己更不誠實 其他地方的同學。 但要意識到,那就是,我們都非常好 在檢測這樣的事情。 而這就是的優點是 計算機科學類,因為我們 可以和我們比較所有學生 問題設置成對對每 ,不僅今年 但往年。 我們有能力,像學生 類,谷歌和找到代碼 像GitHub和網站上 討論論壇。 CS50的是絕對有解決方案 P-集合漂浮在那裡。 但是,如果你能找到他們, 我們可以找到他們。 而所有這一切都是非常自動化 和容易和悲傷的為我們找到。 但我想強調的是,也 課程的學術誠信政策 非常意味著是非常 相反的這種精神。 事實上,這一年中,我們改寫的東西 在教學大綱,點 點點,更多的細節 在教學大綱。 但過程中的最重要的主題 真的是要合理。 我們認識到,有一個顯著的 教學量 值在協作,在一定程度上 與同學,讓你 兩個或三個或更多 站在白板 白板,所以 說,你的想法 - 寫出來的偽代碼的圖片, 圖表馬里奧應該是,如果 你先寫 在偽代碼。 應該採取什麼貪心算法 - 應該如何表現每 問題設置一個? 等意識到行為 我們鼓勵非常 沿著這些線路大部分。 在教學大綱中,你會看到一個 下一大堆子彈 合理的類別和一個不太合理 類別有助於我們幫助 您所在位置周圍包裹你的心靈 我們畫出這條線。 而在一般情況下,一個體面的經驗法則 是,如果你正在努力解決 一些bug和您的朋友或同學 坐在你旁邊, 合理的為你顯示他或她 你的代碼和說,哎,你能不能幫 我弄清楚發生了什麼事情錯在這裡? 我們通常不擁抱 的相反側。 它不是一個正確的響應為您的 朋友或同學在這裡說,哦, 只要看看礦山和圖 它從。 這是一種不合理。 但有別人,另一個大腦, 另一雙眼睛看 您的屏幕或看看你的代碼 說,你確定你想要的 這裡有一個循環? 或者是你確定要 ,分號這裡? 哦,該錯誤消息意味著這一點。 這些都是非常合理的, 鼓勵的行為。 的情況下,我被影射 早期歸結為當學生 深夜判斷力差 決策和收發電子郵件代碼 或者只是別人說, 在這裡,它是在Dropbox或 谷歌搜索在深夜。 所以我會鼓勵,求求你了, 如果你有那些不可避免 緊張的時刻,你撞了 對最後期限,你有沒有後期 一天,因為它已經在星期五 點,發送電子郵件的過程的元首或 自己直接。 說,聽著,我在我的 突破點在這裡。 我們有一個談話 和看著辦吧。 訴諸於網絡或其他一些不 合理的行為從來都不是 解決方案,太多你 同學這裡就不再 校園裡,因為那可憐的判斷。 但它很容易裙子線。 這裡是一個小的圖片來捧場 你從書籤交易,因此現在 一切都會好的。 因此,快速回顧一下,然後, 我們離開的地方。 於是在上週,還記得我們介紹 的條件下,而不是在Scratch 但在C這個時候。 有一些新的語法,但 真的沒有新的想法本身。 我們有布爾表達式,我們可以 或連同兩個垂直 條或連同兩 &符號,他說,無論是左 和正確的必須是真實的 為這來執行。 然後我們有開關,我們看了 簡單地說,但我建議是真的 只是為實現不同的語法 相同樣的目標,如果你知道在 推進你的案件 將要。 我們著眼於循環。 for循環是可能是最常見的, 或至少​​一個人 通常達到本能。 即使它看起來有點神秘, 你會看到很多很多這樣的例子 過不了多久,你有 已經在上週晚些時候。 While循環同樣可以 達到同樣的事情。 但是,如果你想要做的任何增量 或更新 變量的值,你必須 它比手動 for循環之前允許。 再有就是do-whil​​e循環, 這使我們能夠做點什麼 至少一次,而一些 別人是真實的。 這是特別好 程序或遊戲,你想在哪裡 提示用戶的東西 至少一次。 然後,如果他或她不配合, 你可能會想這樣做 一遍又一遍。 有了變量,同時,我們不得不線 像這樣的代碼,這可能 是兩行。 你可以聲明一個int叫 計數器,分號。 或者,你可以聲明和 定義它,可以這麼說。 給它一個價值在同一時間。 然後最後,我們談到 有關功能。 這是一個很好的例子 某種意義上說,它說明 兩種類型的函數。 一個是的GetString的(),再次 得到了來自用戶的字符串。 但是GetString的()是一種有趣的, 到目前為止,我們已經用它, 因為我們一直用它 上的東西的左手側的 等號。 也就是說,GetString的() 返回一個值。 當然,它返回一個字符串。 然後在左側,我們 簡單地保存該字符串裡面的 叫name的變量。 這一點是不同的,在某種意義上說,從 因為printf printf的,至少在我們的 這裡使用,不返回任何東西。 順便說一句,它返回的東西。 我們只是不關心它是什麼。 但它確實有什麼 所謂的一個副作用。 那是什麼副作用,在每 情況下,我們迄今見過嗎? printf的是什麼? 它打印的東西在屏幕上, 顯示文字或數字或東西 在屏幕上。 認為這只是一個副作用 因為它不是真正交給 還給我。 這裡面不是一個答案 一個黑盒子,然後我就可以 伸入搶。 它只是在做對自己,多 像科爾頓插入此 黑匣子的最後一周,他不知何故 奇蹟般地在黑板上畫 我沒有實際參與。 這將是一個副作用。 但是,如果我真的必須達到回 在這裡,說,哦,這裡是字符串 來自用戶的,會 是一個返回值。 並且到目前為止,我們只使用的功能 其他人都寫了。 但實際上,我們可以做這些 自己種的東西。 所以我要進入 CS50再次電器。 讓我關閉該標籤, 打開了剛才。 讓我繼續前進, 創建一個新的文件。 而且我要繼續前進, 調用這個positive.c。 所以,我想要做的事 這裡正數。 所以,我要繼續前進,做詮釋 - 對不起 - #。 讓我們不要讓同一 像以前那樣的錯誤。 詮釋的主要(無效),開放式捲髮 撐,封閉大括號。 現在我要做到以下幾點。 我想編寫一個程序, 堅持用戶提供 我的一個正整數。 因此,有沒有GetPositiveInt功能 在CS50庫。 有只調用getInt()。 不過沒關係,因為我有 我可以並處的結構 小該值約束。 我可以做這樣的事情。 所以INT N - 如果你敲字,只是實現 我要回去 改變一些東西在一瞬間 - 所以整數n等於調用getInt()。 這就是要放 一個int n的內部。 讓我成為一個更具描述。 讓我說,像我要求的東西 你給我一個正整數。 好的。 因此,只是一點點的指令。 現在我能做些什麼呢? 好吧,我已經知道我的簡單 條件或分支機構,就像我 有划痕,我能說些什麼 等,當n是小於或等於 零的話,我想要做的事 喜歡,那不積極。 然後,我可以做的 - OK,但我真的很想得到詮釋。 所以我可以去這裡,我可以種 複製和縮進。 ,然後“確定”。 因此,如果n是小於或 等於零做到這一點。 現在,如果用戶 不配合? 好吧,那麼我要 借用在這裡。 然後我在這裡 這裡和這裡。 因此,這顯然是不 的解決方案,對不對? 因為有沒有結束的跡象。 如果我想要求用戶提供 我一個正整數,我可以 實際上得到的int。 然後我就可以檢查這個int。 但後​​來我想再次檢查和 再次檢查,並重新進行檢查。 所以,很顯然,什麼是更好的 建造在這裡使用? 所有的權利,所以某種循環。 所以,我要擺脫 幾乎所有這一切。 我想要得到這個 int類型至少一次。 所以我說的去做 - 我會回來的 而在短短的時刻 - 現在做什麼呢? 我打算做INT N獲取調用getInt()。 確定。 所以這是相當不錯的。 現在怎麼經常做 我想這樣做嗎? 讓我把裡面的printf循環 這樣我就可以要求一遍又一遍, 如果需要的話。 什麼我想這 while條件怎麼辦? 我想繼續這樣做 而事件是什麼? 嗯。 N是小於或等於零。 的話,我們已經顯著 清理這個代碼。 我們借了一個非常簡單的構建 - do-whil​​e循環。 我剛剛被盜重要的行 我開始複製和代碼 粘貼,這是不明智的。 所以現在我要以實際粘貼 在這裡,只是做一次。 現在做什麼我想要做的 這個程序結束? 我就簡單的說一下 喜歡,感謝 - 我會盡我為int% - 反斜杠N,逗號,然後 插頭N,分號。 好的。 因此,讓我們看看會發生什麼現在 當我運行這個程序。 我要繼續前進, 做積極的。 該死的。 有幾個錯誤。 因此,讓我向後滾動到第一。 不要通過他們的工作倒退。 通過他們的工作從上而下 免得他們級聯和 有一件事是錯誤的。 隱式聲明 函數調用getInt()。 嗯。 因此,它是不夠的。 我有點犯同樣的錯誤,但 這次有點不同。 我不僅要包括stdio.h中,但 也cs50.h,其中包括 所謂的聲明int時,其 教設備,或教 C有什麼調用getInt()。 因此,讓我重新保存。 我要忽略其他錯誤 因為我希望他們 主題相關的錯誤 我已經固定。 因此,讓我繼續前進,重新編譯 與作出積極,回車。 該死的。 誤區三,仍然。 讓我向上滾動到第一。 未使用的變量n。 我們從來沒見過此之前。 而這,也同樣是一個有點神秘。 這是編譯器的輸出。 什麼,強調線 - positive.c :9:13 - 是說,它的上線九說 positive.c,在第13個字符, 13列,你犯了這個錯誤。 ,特別是,它告訴 我未使用的變量n。 因此,讓我們來看看 - 九號線。 我在這個意義上使用n 我給它一個值。 但編譯不喜歡的是 我不是看似使用它。 但是且慢,我使用它。 在第11行,我在這裡使用。 但是,如果我繼續向下滾動 於:11 positive.c - 因此在第11行,12字符的 編譯器告訴我,使用 未聲明的標識符N。 因此,未申報的手段,我有 不指定它作為一個 變量的數據類型。 但是且慢。 我確實做到了,在九號線。 所以有人在這裡真的很困惑。 這是我或者編譯器,因為 九號線,再次,我聲明 INT N,和我分配的 調用getInt()的返回值。 然後,我使用的變量n行 11和檢查,如果其值小於 大於或等於零。 但是,這顯然是 壞破為什麼? 再說一遍嗎? 啊,我要申報前N 進入循環。 但是為什麼呢? 我的意思是,我們只是提出了一點前, 聲明變量,它的罰款 在一個行,然後 他們分配一定的價值。 全局變量 - 讓我們回來 那只是一瞬間的想法。 你為什麼要我把 它的循環之外? 它是。 沒錯。 所以,雖然有點違反直覺, 讓我總結一下。 當你聲明Ñ裡面 ,do塊的 - 具體的內部 那些花括號 - 該變量n有什麼 所謂的範圍 - 我們的評分系統在無關 當然 - 但有一個範圍 限於那些大括號。 換句話說,通常如果你聲明 一組內的變量 大括號,即變量只存在 那些大括號內。 所以,儘管這個邏輯單 我宣布n在九號線, 基本上消失,從範圍, 從內存中消失,可以這麼說, 的時候,我打了11行。 因為不幸的是,11號線, 外面那些大括號。 所以,我遺憾的是不能修復這個 回去我做了什麼之前。 起初,你可能做到這一點。 但什麼是你現在不 循環做? 顯然,你沒有得到 的INT週期性。 因此,我們可以離開調用getInt(),我們 應該離開調用getInt()裡面的 循環,因為這就是我們要 一次又一次纏著用戶。 但它確實足以去 上升到線,比方說6。 INT N,分號。 不要給它的值,但由於 你不需要只是還沒有。 但是現在這裡,請注意 - 將是一個非常容易犯的錯誤。 我不想影子我以前 n的聲明。 我想使用n 確實存在。 所以現在10號線, 我給你N個值。 但是,六行,我宣布N。 所以我或我不能 使用它現在在第12行嗎? 我行,因為它們之間捲髮 括號是n現在宣布呢? 一起來這裡第五行。 到這裡的人在第14行。 所以,如果我現在縮小,保存此文件,請 備份和運行做出積極的,它 編譯這個時候。 因此,這已經進步。 斜線。 /積極,回車。 我要求你給我 一個正整數。 負1。 負2。 負3。 為零。 一。 感謝一個 現在印。 讓我試試別的, 出於好奇。 我被告知要輸入一個整數。 但是,如果我,而不是鍵入羊肉? 所以,你現在可以看到一個不同的提示 - 試。 但無處在我的代碼 我寫重試。 所以,據推測,這是重試 來自提示,你會說嗎? 是啊,從調用getInt()本身。 所以CS50的員工做的事情之一 適合你,至少在這些最初的幾個 週,我們已經寫了一些量 錯誤檢查,以確保,如果 你叫調用getInt(),你會至少 從用戶得到一個int。 你不會得到一個字符串。 你不會得到一個字符。 你不會得到的東西 否則乾脆。 你會得到一個int。 現在,它可能不會是積極的。 它可能不會是負數。 解決這一問題,我們不作任何保證。 但我們會糾纏使用者重試, 重試,重試,直到他或她居然 合作。 同樣,如果我做1.23, 這是不是一個int。 但是,如果我不輸入,也就是說,50, 給我的價值,我想。 好的。 所以不壞。 上的任何問題,我們剛剛做了什麼? 關鍵的外賣,是明確的,而不是 這麼多的循環,這是我們見過的 即使之前,我們還沒有真正 使用它,但是範圍的問題,其中 變量只能只能使用 一些指定的範圍內。 好吧,讓我解決的建議 你所說,一個 全局變量。 順便說一句,事實證明,另一 解決這個問題的,但 通常是一個不正確的解決方案或 設計不佳的解決方案, 什麼宣告變數 所謂的一個全局變量。 現在,我有點違反我的定義 的範圍,因為有 在最高層沒有大括號 最底部的文件。 但含意, 是,現在第四行, n是一個全局變量。 顧名思義,這是 只是到處訪問。 划痕實際上有這些。 如果你使用一個變量,您可能還記得 你不得不選擇,如果它是為 這個精靈或所有精靈。 那麼,所有的精靈只是更清晰 說全球。 是嗎? 啊,非常好的問題。 所以記得,在第一次版本 我的代碼,當我不正確 聲明和定義的n行九 - 我宣布它作為一個變量 我給它一個價值 賦值運算符 - 這給了我兩個錯誤。 其中,事實是n不使用 和兩個,即在第11行 它只是沒有宣布。 因此,第一個我沒有 地址的時間。 它不是嚴格意義上的錯誤申報 一個變量,但不能使用它。 但其中的事情,我們已經做了 CS50設備,故意 教學,是我們已經拍成了 預期的編譯器 確保你正在做的事情不只是 正確的,但真正正確的。 因為如果你聲明一個變量 如n和從來沒有使用它,或使用 正確的話,那麼什麼 它是做什麼呢? 它真正沒有目的。 而且它很容易隨著時間的推移,如果你 不配置您自己的電腦 這樣一來,只是有代碼 這裡一點殘存,殘存有。 然後,幾個月後你回頭看, 你像,這是為什麼行 有代碼嗎? 如果沒有很好的理由, 不利於你或你的同事 在路上有 然後絆倒。 順便說一句,哪裡是 來自? 嗯,記得我們每次編譯 計劃,所有這東西 正在打印。 所以,我們會回來的。 但同樣,是一種實用工具, 自動編譯的過程中,由 實際運行的編譯器 鐺。 這件事情,我們最終會看到,有 做一個特殊的調試 程序調用調試器。 這具有與優化 代碼 - 未來。 STD = C99 - 這也就意味著使用1999年版 C. C'S左右甚至更長的時間比 ,但他們提出了一些不錯的 變化10多年以前。 這裡是相關的。 我們說做任何事情, 以前本來是一個警告 防止學生的錯誤 從編譯。 掛壁方式,對於一個 一大堆的東西,而不是 只是涉及到的變量。 然後讓我滾動 此行的末尾。 這也,我們最終會 回來。 這是很明顯的名稱 我編譯的文件。 這回顧的文件的名稱 我輸出作為名稱的 我的可運行程序。 這只是意味著lcs50使用CS50 庫,以及任何的零和那些 工作人員寫了先前編譯 今年,整合 他們到我的程序。 有誰知道-LM是什麼? 這是數學庫,這是 就在那裡,即使你 沒有做任何數學。 這只是自動提供 我們做。 好吧,讓我做一個其他的例子 在這裡開闢一個新的文件。 讓我保存這個string.c。 事實證明,作為我們談論的數據 類型的今天,甚至還有更多 引擎蓋下 比我們迄今為止見過。 因此,讓我很快做一個快速的程序。 包括stdio.h中。 我來救。 而且你知道,讓我不能使 一次又一次地犯同樣的錯誤。 包括cs50.h. 讓我現在繼續 做詮釋的主要(無效)。 現在我只想做一個程序 這 - ​​聲明一個字符串 s和得到一個字符串 從用戶。 讓我做一個小小的 這裡說明 - 請給我一個字符串 - 用戶知道該怎麼做。 這裡再向下低於此, 我要做到以下幾點 - INT I會變為零。 同樣,計算機科學家通常 開始計數為零,但我們可以 使那一個,如果我們真的想。 現在我要做的i小於 比字符串s的長度。 所以strlen的 - S-T-R-L-E-Ñ - 再次,它的簡潔,因為它更容易 打字,即使它是一個 有點神秘。 這是一個我們還沒有使用的功能 但字面上 - 我返回一個數字,表示 字符串的長度 用戶鍵入。 如果他們中鍵入“你好”,它會返回 五,因為有五 字母打招呼。 然後,在每一次迭代中 這個循環中,i再加加。 如此反复,即使一個標準的構建 你不太舒服或太 熟悉它。 但是,現在在此循環中的每一次迭代, 注意什麼,我要做的事情。 我想去和打印 出單個字符 - 所以%C反斜杠n在一個新行。 然後,你知道我想要做什麼? 無論字的用戶類型 ,像你好,我想打印 H-E-L-L-O,每行一個字符。 換句話說,我希望得到的 單個字符串中的字符, 據此,到現在為止字符串 是一個字符序列。 事實證明,我可以做,支架, ,密切支架,關閉 括號,分號。 我必須做的一件事。 這是在一個名為string.h中 ,strlen的宣布。 所以,如果我想使用該功能, 我需要告訴編譯器, 希望使用它。 現在讓我繼續前進,使 字符串調用的程序。 點,斜線,字符串。 請給我一個字符串。 我會繼續前進,鍵入它。 你好,在全部大寫,回車。 現在發現我已經印 後一個字符。 因此,新的細節在這裡是一個字符串, 在一天結束時,可 其個別方式訪問 字符引入廣場 支架符號。 那是因為一個字符串下方 引擎蓋的確是一個序列 字符。 但什麼是整齊的是 在您的計算機的RAM - 的Mac,PC,不管它是什麼 - 他們 從字面上回背靠背 - H-E-L-L-O - 個人,相鄰 在內存中的字節。 所以,如果你想獲得等在第八屆 字節,它在這個循環中,將很 零支架,支架,支架兩個, 三支架,支架四 - 零索引,直到五 - 將打印出H-E-L-L-ø 在自己的行。 現在,作為一個傳情,讓我告訴你 各種各樣的事情,你會最終 能夠理解,至少 與一些密切尋找。 為一體,包括在今天的 的例子,如果你願意,實際上是 第一越獄 為iPhone。 越獄是指破解手機 所以實際上,你可以用它在一個 不同的運營商或安裝 自己的軟件。 你會發現這看起來完全 神秘,最有可能的。 但是看看這個。 iPhone顯然破獲 一個for循環,如果條件,其他 條件下,一組函數 我們從來沒見過的。 再次,你不會在 乍一看可能 明白這是怎麼工作的。 但是我們採取的一切 授予在我們的現代生活 實際上趨於減少,甚至一些 這些基本面,我們已經 看著。 讓我繼續前進,打開一個 其他程序,holloway.c。 ,也因此,這是你 真的不應該知道。 甚至沒有工作人員或者我可以 大概弄清楚了這一點,通過觀察 ,因為這是別人的代碼 提交什麼 歷史上被稱為一個模糊處理C 比賽,在那裡你寫一個程序 編譯和運行,但這麼該死的 神秘的無人能明白什麼 它這樣做,直到 他們實際上運行它。 因此,我們確實,如果你看一下 代碼中,我看到一個開關。 我看到主。 我看到這些方括號暗示 某種類型的一個數組。 有誰不想去猜測什麼 實際上這個程序 如果我跑霍洛威? 是。 確定。 幹得好。 因此,只有工作人員和我想不通 出這些東西做什麼。 最後,讓我繼續 並開拓其他程序。 這一次 - 再次,我們就會使源代碼 可在網上 - 這就是 樣靚來看待。 他們所做的一切被擊中 空格鍵頗有幾分。 但是,這是真正的代碼。 所以,如果你認為那是相當,如果我們 實際運行此提示, 最終你將看到我們如何 可能做這樣的事情。 因此,我們將離開你,說明 看到你在週三。 [音樂播放] 揚聲器2:在接下來的CS50, TFS上演一場兵變。 揚聲器3:在那裡,他是。 抓住他! [音樂播放]