羅伯:好吧。 歡迎到首節。 我搶。 約瑟夫:我是約瑟夫。 羅伯:所以我們將深入權利英寸 首先要說說 是電器。 所以希望你們中的大多數都 已經下載了它。 但是你可以看到指示 在cs50.net/appliance。 哦,上帝,現在我的自我意識。 我還聽到它。 約瑟夫:哇,這聽起來像 它的暈頭轉向。 羅伯:所以有些人一直有 與它的問題,所以不要等到 問題的最後一分鐘設置為 試圖解決的電器和 找出它不工作。 約瑟夫:如果有什麼不工作 而你需要幫助,你可以去 cs50.net/discussion我們 有一個論壇,在這裡你 可以發布您的問題。 我們會得到他們最終。 羅伯:好吧。 因此,這是什麼樣的電器 模樣。 再次,它只是一個完全獨立的 操作系統內運行的 無論操作系統你 在筆記本電腦上運行。 和主就是你 使用是gedit的。 所以希望這已經 成為一個熟悉的網站。 該終端。 你也可以運行Chrome瀏覽器 內的電器。 曾有一對夫婦的人 誰曾報導互聯網 在設備無法正常工作。 其中一些剛剛假設 有是不應該 網絡中的設備。 但是,是的,還有被認為 是互聯網。 我會說出來的權利,但它不 真正意味著什麼。 如果網絡不能正常工作, 這就是你往往需要 運行修復它。 如果您有互聯網的問題,不 記住它,只是它張貼在 討論,我們會說,運行。 但互聯網應該是工作。 所以,唯一的其他東西 - 是啊,沒有什麼 別的是真正相關。 但我只是想指出 - 請參閱本右下角。 所以,你的每一個設備的應 有一個IP地址。 後來在這個學期,該IP 地址將變得更加重要時 你的工作在網絡上對集,因為 你就可以訪問 網站,你正在努力從你的 當地的Chrome使用此IP地址。 但我喜歡用的IP地址 為 - 和你沒有做到這一點,我 只是想指出來 - 就在這裡。 所以這是一個終端窗口 我的Mac,這不是在 電器都沒有。 並且你可以看看是什麼 這個命令的作用。 但我直接去的SSH 我的電器。 我不知道IP是什麼。 約瑟夫:168 - 168.224.1.0。 羅伯:所以一旦我受夠了 與此,請登錄。 現在,基本上,這是相同的 我的電器內的終端窗口。 所以,我幾乎從來沒有真正的工作 從設備本身。 我只是一直有它運行 在最小化的背景 並SSHed進去。 這個問題是你不打算 能夠容易地用gedit 直接從本。 但是,如果你想成為一個真正的酷 黑客,那麼你應該習慣了一個 命令行的文本編輯器呢。 所以Vim和Emacs和納米,所有這些 有不同的選擇。 納米往往是最容易的。 而且我認為它沒有 語法高亮。 哦,不,完全不會。 所以你可以使用納米,因為 那一個是很容易的。 你看到所有這些命令 在底部。 這個小胡蘿蔔象徵。 如果你以前沒有見過它,你會 可能看到了很多了。 這通常意味著控制胡蘿蔔, 喜歡你的鍵盤的左下角 控制字符。 所以在這裡它告訴我到這裡 - 哦,這不是斷我是否放大。 所以,控制,X是如何 我要退出。 和它說我打的Y 是的,對於節能,N代表號 所以這是納米。 Vim和Emacs往往是稍 複雜的和壓倒一切的。 但是你可以習慣它, 然後你會愛上它。 所以,就是這樣。 約瑟夫:沒必要那樣做。 羅伯:是啊。 你可以自由地用gedit的 其餘的學期。 所以任何設備相關的問題? 還是你有什麼別的什麼想法 必須談及有關 家電? 是。 揚聲器1:當你SSHed到您的 的事情,是密碼深紅? 羅伯:是啊。 對於幾乎所有的密碼 在電器是怎麼回事 是深紅。 揚聲器2:安裝像一個真正的IDE 在設備上,將它的工作? 羅伯:我想像的Eclipse確實有 Fedora的版本,在這種情況下,是的, 你可以做到這一點。 它可能不是真的值得。 揚聲器2:確定。 所以它可能如果我想更輕鬆 使用Eclipse,只需使用原生和 然後上傳到 - 羅伯:哦,那也是可能更容易。 但你可以得到它的工作 內的電器。 約瑟夫:而對於攝像頭的問題 是,你可以安裝另一個 IDE中的電器內? 羅伯:Eclipse中作為一個 例如一個IDE的。 任何其它電器問題嗎? 好的。 所以我們現在進入到命令行 接口相關的東西,所以CLI。 又一次,我只是去上班的 在這裡,因為這是相同的 在一個終端窗口工作 內的電器。 是如何形成的字體看? 是否足夠大? 好的。 所以有很多的命令是 你應該得到很習慣 整個學期。 大二用於導航的LS,列表 此目錄中的文件;和 CD,所以更改目錄。 這樣我就可以改變桌面,然後 一個很常見的模式是cd到一個 目錄並立即LS 什麼的在目錄中。 人們有時也沒有意識到 該選項卡完成的一件事。 因此,像CD,VH,然後我打標籤。 我幾乎從來不打出來 整個事情。 然後,如果我繼續打標籤 再次,它會自動 開始我列出。 所以我可以cd虛擬主機,本地主機。 而這只是要 - 如果你還沒有聽說過這個詞 之前,目錄是另一個字 為文件夾。 所以,現在如果你看 - 讓我們把那個頂端。 所以,現在,如果你在括號中看到的,你 看到小波浪線,斜線,虛擬主機, 斜線,本地主機。 所以,波浪,是指 我的主目錄。 這是你的目錄 當你通過SSH連接。在 這是你在當目錄 你打開一個終端。 這是你從哪裡開始。 所以我為我的主目錄裡面, 而我的虛擬主機裡面 我的主目錄的目錄中。 然後我在本地內 主辦這裡面的目錄。 因此,一些其他的與CD有用的事情 - 或好,一般,所以總是點 指的是當前目錄。 鎘,點是一個非常值錢的命令。 但是,這改變的 當前目錄。 一個更有效的方法之一在以下方面 CD是點,點,這是 只是去了一個目錄。 並注意,這些 - 我想說的別名,但這些 符號,點和點,點,這些工作 對於幾乎你的任何命令 將運行在想。 因此,像CD可能是在那裡你會 使用最多的,但這些都不是 事情剛剛CD理解。 這是相當多的東西你的整個 命令行了解。 很多程序可以理解 點與點,點。 所以其他有用的 - CD,破折號。 所以這是要帶我去了 我是去年英寸目錄 所以有時候我會做這樣的事情, 哦,我的工作在這裡。 而我看​​到的東西一定誤差, 我會去通過去調查它 一些隨機的目錄裡。 我不知道這是否會 讓我在那裡。 它的意志。 於是我做我想做的事情 在此目錄中。 胡說,胡說,胡說,胡說,胡說。 我當時想,沒事,我想 回到我在哪裡。 CD,破折號,它帶給我的右後衛。 所以,我要扔了很多 今天的這些你。 我不希望你記住 所有的人。 樣的,它只是知道 它們的存在。 再後來就當你喜歡, 嗯,我想回去 目錄我只是在,哦,等等, 類似的東西存在。 你不必只需鍵入 再整個目錄。 約瑟夫:最終你會剛 一遍又一遍的使用它們,並且 它會變成肌肉記憶。 羅伯:是啊。 我以前那麼如何說,那波浪 是你的home目錄。 所以我可以cd,波浪線。 但我什至不有 這樣做,如果我只是 - 我會回去的目錄,以便 這不是一個毫無意義的例子。 但是,如果我只是做CD,這也是該 一樣,去我的主目錄。 我做的命令,K. 約瑟夫:您也可以鍵入清晰, 總之,它應該清除它。 羅伯:我也想控制, L同時,這樣做了。 所以,很多不同的方式。 我覺得有一定的差異,其中 明確和控制,L將只 真的把它推到頂部, 我仍然可以向後滾動。 命令,K字面上破壞 一切,你 不能滾動備份。 最起碼,這是 它是如何工作的iTerm2。 我不知道其他的事情 - 哦。 用ssh方式連接,所以如果你是在Windows上, 你將要下載的PuTTY 為了SSH,因為Windows不 有這樣一個內置的SSH工具。 從Mac電腦,你可以只是直接的SSH 從終端窗口。 確定。 有問題嗎? 通過ls,所以一些習慣 大多數這些命令是 - 好了,我就做一個。 LS,破折號,L。 所以破折號,l是什麼,我們要去 調用一個標誌,LS。 和很多這些命令有標誌 您可以傳遞給他們。 所以在這種情況下,儀表板,l是一個標誌 告訴它給我一個完整的 所有的信息清單 這些文件。 所以,我們在這裡看到,桌面是 在12:54更新於7月30日。 下載於9月6日修改。 這些都是當前大小和 這些目錄中的字節數。 您不必了解 所有這一切。 這東西在左邊,這些drwx的, 這將成為更相關 以後當你不得不處理 - 有做誰擁有權限 來看看這些文件。 所以,如果你沒有上唯一的用戶 這台電腦,你就可以到 說好,我應該是唯一一個 可以看看這個文件,或者我 要允許每個人 看看這個文件。 所以,別人在我的電腦上 可以看看這個文件。 我什至不知道這是什麼 - 這是什麼呢? 約瑟夫:我不太清楚,其實。 羅伯:不知道。 約瑟夫:但是,如果你不知道,有 您可以使用一個有用的命令 告訴你什麼裝置的輸出。 如果你的男人類型 該命令前 - 所以M-A-N。羅伯:男人。 這樣的人是另外一個 這是非常有用的。 和男人,LS。 因此,手冊頁,他們有兩個 命令,你將要使用 在命令行中,他們也有 功能,將有關 與C所以,你可以man - 我忽略3。 但3人的printf會帶來 了C版的printf。 但是,如果我只是做男人的printf,這是 要調出命令的printf 這種情況發生在命令行。 這樣的男人,LS。 手冊頁可以很 鋪天蓋地。 在這裡,雖然,你會看到此房源 所有這些標誌的是LS 理解。 因此,如果我們去衝,l和 - 我只是要在你扔了。 但為了搜索,你要 先打問題 標記或斜線按鈕。 所以,兇多吉少。 然後我就可以搜索 對於我想做的事情。 所以我打算削減為破折號,L。 而且它那裡。 因此,使用一個長列表格式。 這並不能幫助我弄清楚什麼 該特定列的意思,但我 假設在這裡的某個地方 它會解釋。 因此,使用手冊頁的任何命令 你不立刻明白了。 我敢肯定,你甚至可以男人,男人。 在線給接口 參考手冊。 呵呵,最後一個是也許稍微 相關的是LS,破折號,。 所以請注意,如果我只是做LS, 我得到這五個文件。 如果我做LS,破折號,我 得到更多的文件。 所以,所有這些之間的共同點 新文件是事先點。 因此,該公約是一個文件, 以圓點開頭的隱藏。 所以,你不希望看到這個文件,你 不想擁有它惹 您的目錄清單。 只有當你明確要求, 沒事,LS,破折號,,告訴我。 的一個代表所有文件, 包括隱藏的。 因此,一些其他命令。 哦,在這一點上的問題? 是。 揚聲器3:當你做LS, 一,什麼是點,點? 羅伯:哦。 所以,這就是我在說什麼。 這是同樣的事情在那裡 我喜歡的CD,點,點。 所以在技術上,點和點,點是 存在於每一個文件 所在的目錄dot文件指 到當前目錄。 所以,如果我的CD,點,我只是去 留在目錄中。 和圓點,圓點總是指 以前的一級目錄。 所以,如果我進入日誌和ls,破折號,人​​, 我會看到圓點,圓點。 cd到網點,網點 使我先前的目錄。 是啊。 確定。 因此,另一個非常重要的 命令為rm。 所以,這就是我們要去 使用去除。 讓我實際上做一套 命令第一。 所以MKDIR。 MKDIR是你可以 創建目錄。 我會創建一個臨時目錄 並進入該臨時目錄。 和預期的一樣,它是空的。 但是,如果我LS,破折號,一個,我還有點 與點,點,因為點是指 當前目錄。 與點,點指 上一個目錄。 而那些將永遠存在,無論 您所在的目錄 這是一個完全沒有必要的 命令,但觸摸。 我只是用它,因為它是 一個簡單的方法來創建文件。 所以觸摸,觸摸B,觸摸c是剛 要創建一個名為三個文件, b和c是完全空的。 於是我點創建那些在 首先就是這麼說是RM 我們如何才能將其刪除。 所以,RM,一。 它會問我,取出 常規的空文件? 然後我會說是的。 所以,如果我確實知道我要 刪除該文件,而不必是 提示,定期刪除空文件?, 然後RM,破折號,f為將成為 標誌,上面寫著,強制刪除而不 甚至促使我哦,是你 確定要刪除的文件? 是的,我敢肯定。 所以,RM,破折號,FB將只 做到這一點不求回報。 因此,讓我們做一些更多的目錄。 MKDIR,TMP2,CD,TMP2, 觸,觸按B。 確定。 所以現在我想刪除 TMP2作為目錄。 所以,RM TMP2。 你不能刪除TMP2, 它是一個目錄。 因此,這裡的問題是,RM不 馬上工作在目錄上。 它只是意味著像文件 非目錄的文件。 所以我們能做些什麼 這裡為rm,破折號,河 這表示遞歸,這可能 不是對你意味著什麼呢。 但是,當你到了遞歸, 這將意味著更多。 所以,RM,破折號,R,TMP2是要 遞歸進入該目錄。 於是陷入目錄TMP2? 是的,讓我們考慮這樣做。 難道我們要刪除TMP2 /一? 是。 難道我們要刪除TMP2 / B? 是。 現在,我們要刪除 目錄TMP2? 是。 所以現在的目錄 和裡面的一切 它已被刪除。 有技術上的命令RMDIR 您可以用它來去除 目錄,但它僅適用 在空目錄反正。 並且一看就知道,我們只 再做MKDIR,TMP2。 TMP2,觸摸。 確定。 所以,如果我嘗試刪除dirtmp2,它​​會 說,目錄不是空的。 所以,我幾乎從來沒有使用remove dir命令無論如何,因為RM,破折號, r會為其工作的空目錄 和非空目錄。 還有,如果我不希望有 經歷了整個過程 降入目錄,並 刪除每個單獨的文件,RM, 破折號,RF,TMP2。 而現在它不見了。 東西要小心 關於為rm,破折號,RF。 它讓我害怕,甚至鍵入它, 因為如果我不小心 按Enter鍵或東西。 所以,RM,破折號,RF,波浪會,不 提示我,F不提示 我,它會自動刪除 我的整個主目錄和 一切都在它。 所以,你可能認為這是 一個愚蠢的事情。 很好,它是。 但它可以通過很容易出現 意外,如果說,我想刪除 我的斜線,虛擬主機目錄。 而就在快速打字, 我不小心這樣做。 這將遞歸刪除我的兩個 主目錄和虛擬主機目錄 這個特定的目錄中,僅僅 恰好不存在現在。 但是,這仍然會刪除 我的整個主目錄。 至少是沒有一個f, 它會先提示我。 我會想,哦,不,我 不想做。 但是,人們,斜線,包括 我往往會得到進 習慣總是RF-ING。 即使是常規文件,我可以只RM, C,我傾向於只RM,破折號,RF,C。 只是要小心,當你RF-ING。 揚聲器4:什麼是c執行? 羅伯:C被我說的是C文件 在此目錄中,即RM,C。 約瑟夫:而更危險的是,如果你使用 一個明星,它是指在一切 的目錄。 所以我通常傾向於做是我會的 進入一個目錄,我想 除去在那裡的所有文件。 所以,RM,破折號,RF,明星。 羅伯:是啊。 室,破折號,RF,明星。 約瑟夫:如果你不小心 你在哪個目錄 - 我是不是臨時的,但我還是不小心 在我的主目錄, 然後我會刪除一切 在我的主目錄。 而我實際上做到這一點之前,和 我覺得你還是以前做過這 周杰倫之前做到這一點。 羅伯:我不小心刪除 - 所以忽略該命令為位。 喬瑟夫:不好玩。 羅伯:所以在斜線bin目錄是一個 一串二進制文件,其中有會 熟悉的像鐺。 好了,鐺,基本上所有這些 我在命令正在運行的東西 線是在這個斜線bin目錄下。 約瑟夫:像LS是在這裡。 羅伯:那麼點,斜線,LS會 列出該目錄。 約瑟夫:室也是在這個目錄中。 羅伯:我不小心RM,RF,海關斌, 其中刪除任何命令我可以 可能是有史以來想要的。 然後我剛剛重新安裝 新的電器在該點。 喬瑟夫:所以要非常小心,當 使用此命令。 觀眾:[聽不清]? 羅伯:是的。 這也是一個不好的習慣進入。 如果你注意到,我現在 - 好了,你不能看到,但 我使用zoom-in,也許可以。 所以,我現在根@設備。 所以jharvard是我們想要的用戶 你總是可以使用。 根是具有權限的用戶 做任何事情絕。 所以請注意,當我jharvard, 如果我嘗試到CD - 什麼是目錄? 哦,根是一個很好的例子。 所以CD,根。 權限被拒絕。 因為如果我們看一下此房源 - 又一次,你不必 完全理解這一點。 但是這三個破折號都這麼說 沒有讓任何其他 用戶進入這個目錄。 並且該目錄恰好 由root用戶所擁有。 所以,我其實jharvard無 一個誰不是root允許進入 這個目錄,這意味著我 會得到權限被拒絕時,我 試試cd到它。 所以,當我的根,我有權限 絕對做任何事情,包括 刪除重要文件 在電器和 毀掉整個事情。 所以這是一個不好的習慣進入 只是四處遊蕩的 操作系統的根。 我反正做。 有問題嗎? 我會退出的根,留為jharvard。 確定。 更多相關的命令。 所以,要回我們的溫度時, mv命令代表的舉動。 您可以移動。 現在,我們要叫它B, 所以現在它稱為B。 或者,也許我們要移動 B上漲一個目錄。 所以,現在這個目錄是空的。 我將回到我的主目錄, 我們看到,b為在這裡,因為 主目錄是從一個目錄了 是B曾經所在的目錄。 還有CP。 因此,CP是複製的超級節, 點,文字。 我可以調用它s,點,文字。 現在我們有兩個超級節, 點,文字,和s,點,文字。 這也適用於目錄。 我RF,海關單個文件。 因此,CP - 好了,首先讓我們來試試CP,TMP,TMP2。 所以省略tmp目錄。 如此相似RM,默認行為 是對目錄不起作用。 再次,類似RM,默認 行為 - 好,得到它的工作 使用目錄是一個,破折號-R的路程。 所以遞歸複製該溫度 目錄複製到TMP2。 所以現在我們有兩個tmp目錄和tmp2 那是不是有益的,因為TMP 是空擺在首位。 TMP2。 現在,讓我們tmp目錄複製到TMP2。 而且我們看到,TMP2還具有文件 一,因為目錄和 一切的那裡面 目錄被複製。 而這可能有點幫助 如果說你的工作 在問題設置1 - 或者實際上,後來問題集 更為重要的,因為有 將一大堆 文件和事情。 但你只是想,對於一個分裂 第二,你喜歡,沒事,我 要嘗試不同的東西。 讓我複製我的整個PSET1 目錄複製到PSET1備份,這樣如果 我最終搞砸的事情了,我可以 返回到我的備份目錄。 還有更合適的方法 版本備份你的代碼,但 這始終是一個快速的方法來只是讓 確保你有東西副本 那你要修改。 所以迴聲也是一次性的命令 一種sillily將只打印到 命令行到底是什麼 你想呼應。 所以迴聲喜。 我們將只打印喜。 迴聲的hello world。 我們將打印的hello world。 這涉及到使用的時候你 啟動合併命令。 再次,不要指望你完全 理解這一步,但它的 看到的東西。 然後,如果你對谷歌搜索的例子 或者你知道你想要做的 的東西,它可以是有益的。 因此,讓我們作為一個例子, 所以LS,破折號,L。 所以我在這裡看到的輸出 LS的,破折號,L。 我說好,我想 存儲到文件中。 所有在這裡的輸出,我想 投入到一個單獨的文件。 比符號更大所以這一點 就是我們要去打電話。 我們的重定向 輸出到文件中。 讓我們把文件等等,因為這是 我往往會在調用它。 所以現在我們看到我們有一個 文件胡說就在這裡。 如果我打開它,我會看到它的 正是從這個命令的輸出 我只是跑。 同樣,你可以 - 如果這是輸出到一個文件中,這 從文件中獲得輸入。 什麼是命令,我 - 約瑟夫:我想你可以用 少跌多,大概。 羅伯:但如何只少廢話? 我不知道。 如果你進入這個場景,像 有pset時,它是很有用的。 約瑟夫:你可以管成迴聲。 管道文件到回波看到它。 羅伯:這是管道。 約瑟夫:對不起。 羅伯:好吧。 因此,這是輸出到文件。 這是從文件中獲取文本 並把它交給該程序。 而且你還可以看到這個傢伙。 因此,這是一次那種做兩個。 而實際上,我將介紹兩個新 命令只是為了它的使用。 歷史是一個方便的命令,這只是 將打印出的清單 任何我曾經運行的命令行。 所以,我們在這裡看到的一切,我有 已經運行這整個時間。 大量的LS的。 而另一個有用的命令是grep的那 其目的是為了在搜索 文字尋找模式,好了, 尋找任何你 希望它去尋找。 所以這裡一個方便的用途是,比方說 我們要抓住歷史。 我要尋找的命令 在那裡我 - 什麼是 有用的寶貝? 約瑟夫:[聽不清]? 羅伯:還是讓我們只是看所有 倒是,不管是什麼原因。 所以這是它的樣子。 而你也不必完全 理解這一點。 但這個想法是在這裡,歷史是給 相同的輸出它確實在這裡 在那裡它打印出整個 一切我曾經運行的歷史。 然後我們又路過那個 - 而不是將它打印到屏幕,這樣, 我們要傳遞給 命令grep的是尋找 字觸摸的所有實例。 所以使用的這個組合 歷史的工具和grep,我可以看到,OK, 這裡的所有的命令,我曾經 運行,這裡是一個有點常見的一種。 我們是在底部。 並且它也給了我命令 我剛跑了有 在它的詞聯繫。 但管道是一個非常有用的東西 用於組合多個程序。 而實際上,這是為讓快捷方式 我歷史輸出到文件等等,並 讓我用grep使用文件等等 因為我想看看了。 所以管只是一個快捷方式 對於這兩個命令。 是。 揚聲器4:[聽不清]? 羅伯:是的。 什麼是 - 呵呵。 讓我們來測試一下。 所以,貓,狗,魚。 所以我想給grep。 短跑河,再次,將是 遞歸的,所以我想降下來 所有目錄。 我想遞歸的grep對所有 - 讓我暫時得到 這一點的方式。 不理我。 確定。 所以我想暫時用grep的 這個詞的魚的所有實例。 所以在這裡我在做什麼是用grep搜索 遞歸的字魚。 和星意味著在所有的這些 此目錄中的文件。 因此,這給了我拒絕的權限, 因為這是不允許讀 特定的文件。 但它在文件中,測試中發現的魚。 我也可以說,具體而言,我只 想看看在文件等等,在 這種情況下它不會找到任何東西。 我只是想看看在文件,測試。 它會找到魚。 這是一個非常有用的命令 要知道一般。 有一些替代品到grep 這被認為是更加 程序員友好的,但我傾向於 仍然依傍的grep。 有問題嗎? 確定。 還有沒有其他的命令? 呵呵。 只是一次性的一個,我始終 發現很有趣的卡爾。 所以,當我在這個可愛的通知 全屏模式下,我沒有最喜歡 工具欄或任何東西。 所以,卡爾只是給了我一個可愛的小 日曆這是正確的 現在斷了,我假設。 但可愛的小命令。 約瑟夫:這是[聽不清]。 你可能有其他的命令 看到包括鏗鏘而作。 我們就去了他們 後面更詳細。 但是,如果你已經工作 在PSET,你應該 熟悉這些。 羅伯:好吧。 在命令行的東西有問題? 好的。 因此,讓我們進入到一些 C-相關的東西。 變量的數學。 確定。 所以就像我們有數學的划痕, 您還可以使用數學三中 在我們到達那個完全, 這樣的變量。 請記住,當你聲明一個 如int X或浮動y,則變量 必須給它之前鍵入 變量名。 因此,我們已經看到了類型到目前為止是int, 浮點型,雙,很長很長,我 實際上不知道我們是否已經 看到這麼遠。 還有一些其他的。 我們已經看到字符。 有短,這是喜歡它的 相反的很長很長的地方是 比小的整數。 我們也看到字符串。 那麼,什麼是特別的字符串? 為什麼我會說這是 不是很喜歡整型? 揚聲器4:它並不真的​​存在。 羅伯:是啊。 因此,我們有字符串的唯一理由 是因為當你這樣做 哈希,包括cs50.h. 我們會看到這樣的例子以後 - 哦,那不處理好 - 其中cs50.h正在做的事情 沿型的線 閃避,焦炭星,字符串。 所以這是說,我們甚至不 知道一個char明星是什麼呢。 但是,這是說我們要的字符串。 任何你已經使用字符串,你的地方 可以用字符明星已, 這實際上是一個類型, 存在於C語言。 但我們會到達那個。 哦,它會馬上回來。 整齊。 所以,同樣的事情與布爾 其中真假。 這是不是真的在C的內置型 相反,它只是,這是否有 零值? 然後,我們將只考慮 它是假的。 這是否有值 - 好了,這是否有任何 值不為零? 然後,我們將認為這是正確的。 所以,有一個為真,二是真實的, 任何非零為真。 因此,這些都是那些。 在聲明變量的問題和 變量類型和所有? 是啊。 揚聲器4:對於長很長,在書中, 它說,它必須是long long int的。 但也只是很長很長的工作? 羅伯:所以這些類型修飾符。 所以詮釋x。 所以我們也可以說無符號詮釋x。 我們可以說短詮釋x。 我們可以說,很長很長詮釋x。 但這些東西幾乎任何我 剛才說了,無符號整型,短整型, long long int的,你可以擺脫 int和它只是假設 那你的意思是int類型。 所以無符號x,它只是意味著 - 你知道如何正常使用int, 你可以說x等於負3? 用一個無符號整數,你不能。 約瑟夫:再次,對於攝像頭, 問題是,有什麼區別 長的長整型之間 和公正的很長很長? 羅伯:是啊。 所以,我幾乎從來不會 寫的很長很長整型。 我會寫很長很長。 約瑟夫:有問題嗎? 羅伯:確定。 那真是太傻了一點提醒是如何 我們聲明一個變量並初始化 變量和聲明其他 變量和初始化 這一切在一個步驟。 變量如此的聲明和 初始化變量沒有 到,但可以在同一條線上。 因此,我們有標準的數學運算符 你已經習慣了 - 加,減,除,次。 還有模,我們拭目以待。 沒有的話,至少在 C,一個內置電源 冪^操作符。 嗯,有一個插入符號運算符, 但它不是權力。 約瑟夫:但它不是冪, 是。 羅伯:不要使用插入符號 假定它是指 像方或什麼的。 所以有些事情保持 介意師。 我會受不了。 如此宣布初始化的答案。 所以,我們說浮動答案 等於1除以10。 打印答案到小數點後兩位。 這就是這種東西,我 將男人的printf弄清楚, 這到底是什麼%,網點,2F是什麼意思? 而這只是意味著,好吧, 無視0.2。 和%f是用什麼 打印浮動。 0.2是說,複印件 浮到小數點後兩位。 所以這個程序有一個bug,你可能會 已經在一些見過這個 前政務司司長課程。 但是,什麼是錯誤? 揚聲器5:零。 羅伯:是啊。 所以,當我們說,答案等於 1除以10,我們想要的 回答是0.1。 但1除以10,圖1是 整數,10是一個整數。 所以當我們做一個整數除以 一個整數,我們要拿回 的整數。 因此,1除以10是0.1。 因為它需要給我們一個整數, 它只是要扔掉 小數位,說 答案是0。 所以當我們打印的答案, 這將打印0.00。 約瑟夫:而且,正如一個音符,它實際上 扔掉什麼後 小數點。 所以,如果你不是有6除以10, 你可能會認為它會給你 0.6,然後你會四捨五入到1。 但實際上,當輸入發生了什麼 任務,那就是它滴是什麼 小數點後。 所以0.6也變為0。 羅伯:是啊。 我們會說截斷了點。 所以每當你強制轉換為int, 小數將被截斷。 因此,對於該修復 - 有 其實是兩個。 而我要做的那一秒,因為 這個是一個很容易修復。 因此,一個解決辦法是使用浮點數 在分裂。 真的,你只需要 讓其中一人的持股量。 但它的有些只是更清晰 讓他們都浮在水上。 因此,1.0除以10.0是 劃分兩個浮點數。 因此,答案最終會被 一個浮點數,所以你會 正確打印0.10這裡。 一些不工作這麼好 大約也就是,嗯,當然,這是很容易 夠轉換1至 通過使1.0浮動。 但是,如果不是我們有兩個整數 如int x等於1和詮釋y 等於10,然後我們想 以做X除以Y' 因此它是不容易的剛 做X.0什麼的。 所以要修復被鑄造。 所以鑄件是用C來轉換方式 從1變到另一種。 因此,這裡,圖1是一個整數。 並把這個浮在眼前 它,我們是鑄造1為float。 所以這將轉換 在1至1.0。 這將轉換 在10至10.0。 然後事情的行為類似於 我們只是表明以前的版本 其中,符合市場預期,我們得到0.10 它會打印。 我們可以做到這一點 變量,也。 所以我們可以說,浮x 通過浮動Ÿ分。 約瑟夫:有問題嗎? 羅伯:所以,就像在常規的數學, 我們有運算符優先級。 因此,在數學課上,你就更有可能 調用它的操作順序。 在這裡,官方用語是 運算符優先級。 但是,運算符優先級,或最 運營商,是你所期望的。 所以,就像在數學,2次10 將要超過密切分組 這10除以2,然後2。 操作的順序,它會做2 次10,10除以2,然後 它會做20加5加2。 所以它的預期效果,您可以使用 括號把表達式分組。 你不能使用方括號 分組表達式。 是嗎? 你居然能:喇叭5 只是回去一下嗎? 你可以投一個int為字符串? 羅伯:那麼在C中,你可以投什麼 你要你想要的任何東西。 這並不意味著它是 一個好的事情。 所以,當你施放一個int到 一個字符串,即表示 - 我們將進入這個 更徹底 - 約瑟夫:晚得多。 羅伯:我不想很久以後說, 所以我試圖改變我的句子。 我們將進入它更徹底 以後如果真的是當你有一個 字符串變量 - 所以一個字符串可以是任意 長,對不對? 我們一直在說,一個int 四個字節和long long是八 字節和浮子是4個字節。 所以一個字符串,就像一個int,只有 一定數目的字節到它的。 而這將是四個字節。 但一個字符串可以很 任意長,對不對? 等你好了世界上已經,如果這是10 字符或什麼的,這已經 將要在4個字節 我可以放入一個字符串。 所以如何將字符串真正的工作是, 他們是在內存中的字符串 被保留。 所以在這裡,當我說串X 等於的hello world,X裡面是 只是說,哦,你好,世界存儲 在內存中這個特殊的地方。 因此,如果我們嘗試將整數轉換為 字符串,然後我們試圖解讀 內存部分隨機部分 作為一個字符串。 而且幾乎總是打破的東西。 約瑟夫:但是,如果,混淆 您,我們將覆蓋它 更深入的後面。 羅伯:是啊。 這就是你要去的地方 進入指針。 那就是顯著塊 二週課程的。 揚聲器6:它的工作狀物體 在其他語言或不是真的? 羅伯:那麼在其他語言中,對象 會使用指針來表示。 這是不一樣的東西,雖然。 有什麼想法? 約瑟夫:號 沒有思想。 羅伯:確定。 約瑟夫:下一步。 羅伯:剛去這一點。 好的。 所以模。 就像我們有加,減, 分裂和繁殖。 所以模是一個你可以 以前沒看過。 它只是說,給 的我的其餘部分。 所以55%10。 在做55的餘數 由10將是5。 所以55%10 5。 和3%5是3。 8%8將0。 16%15將是1。 約瑟夫:有一點要注意這一點, 也就是它如預期可能無法正常工作 如果你使用一個負數。 因此,負5%​​4,有些人 可能會認為那就是 - 你會怎麼想負 5%4會是什麼? 揚聲器5:一。 喬瑟夫:所以有些人說的, 有人說消極的。 但是 - 羅伯:我什至不會有 說其中的一個。 約瑟夫:二,對不起。 有人說 - 羅伯:三。 約瑟夫:三? 羅伯:負 - 究竟是什麼 - 負5 - 約瑟夫:三,三,三。 抱歉。 因為模,通常,當你已經 看到它在其他地方,這通常意味著 返回一個正數,對不對? 羅伯:所以當我們說數學,10%的, 他們往往想給你 - 如果我們國防部10,那麼我們預期 得到0到9之間的數字。 在這裡,這不是這種情況,你 將得到負數返回。 喬瑟夫:所以負5% 4將是負1。 羅伯:但它是罕見的,你是MOD-ING 負數開始。 跳過此。 約瑟夫:是啊。 羅伯:MEH。 確定。 所以最後一件事要指出有關 彩車是它是一個危險的行為, 但花車是不是一個確切的 表示。 所以回到字節一遍,記住 那一個int總是有四個字節,一個 浮總是四個字節。 所以盧卡斯的例子是相當不錯的。 因此,認為1除以3。 所以0.3333333。 如果我只有32位,怎麼能 我保存0.33333到底是什麼? 也許,不管什麼原因,你說, 好吧,好吧,讓我們只說 這個特殊的1011001,讓我們 只是說,應該是0.333333。 那麼,你只有有限數量的 這些位,所以這是不可能的 代表每一個浮點 鑑於只有32位值。 嗯,這是不可能代表任何 浮點值給出無限 - 還有,由於位中的任何數量有限。 因此,這裡的問題是,好了,當我們用 打印到小數點後兩位, 我們沒有得到正確的答案0.10。 但引擎蓋下,它是真正 被存儲盡可能接近到 0.10那些位可以代表。 這是對下一張幻燈片? 或者,是不是? 約瑟夫:是啊,就是這樣。 羅伯:Blegh,blegh。 約瑟夫:是啊,你可以只 拉筆記了一下。 羅伯:我只是要放大 中的最後一個上。 哦,我的天哪,這是[聽不清]。 使數。 這就是將要打印 如果我們運行該程序。 並請注意,這不是一個真正的大問題 如果我們只關心像 兩到三個小數位。 像我們最初只印刷0.10, 這就是為什麼我們看到什麼不對。 但是,一旦我們開始漸入 確切的說,確切的數字,它是 代表,我們看到,它不能 完全代表0.1。 在這裡,問題的一部分是喜歡, 沒事,這很好,但是,好吧, 首先,如果我們試圖做的, 答案等於等於0.1? 是要返回true或false? 因此,這很難說。 我認為它實際上可能返回true。 它會先 - 我不知道。 答案是,一旦你開始處理 與浮點值,你漂亮 很多不應該使用相等 因為這種不精確性。 而對於所有你知道,它的百 小數位的 浮點無法 正確處理。 所以平等只會失敗,甚至 雖然數 - 如果你已經 用確切的數字,該數字應 已經完全一樣。 一切都結束了的像50的過程 使用這些浮動的計算 點值,誤差可以建立 起來,起來,起來, 事情就出錯。 約瑟夫:還有一直很 這種情況發生的著名的例子。 像美國航空航天局的工程師們獲得這樣的 錯了,造成火箭爆炸的 他們已經發動後的空氣。 和很多類似的問題。 所以,是的。 揚聲器6:當你說0.3樓 它截斷的休息嗎? 抑或是一輪上漲或下跌? 羅伯:請問printf的圓嗎? 約瑟夫:我認為printf的截斷。 羅伯:確定。 所以,我們同樣可以走向反面 這其中的方向,在這種情況下, 它可以代表最接近 0.1是用這個號碼。 它或許能在最接近 表示0.2是在相反的 方向,0.199999996356 什麼的。 所以,如果我們去的那個方向 的東西,然後printf的0.3 F.將返回 1.99,而不是2.00。 約瑟夫:我也完全不 確定這一點。 你可能想要寫一個小的,小 程序只是檢查。 羅伯:雖然,我們所肯定的是, 如果你試圖強制轉換成一個 int和鑄造為int是要 導致它截斷小數,如果 您嘗試轉換1.9999999 為int,您將獲得1。 所以你通常應該使用 輪函數的數學函數庫。 有問題嗎? 確定。 喬瑟夫:所以,移動到條件 和布爾表達式。 所以,你以前見過這些。 而實際上,讓我確保我 電腦是正確的格式在這裡。 空間。 對不起,我們將不得不面對一個 與截止點點的邊緣。 但是,是的,你們已經看到 這之前,在划痕。 所以這裡這個權利是一個表達式 這是用來在 一個條件語句。 所以回答大於零的意志 告訴你,真或假。 這些都是非常重要的,因為 他們允許我們介紹 邏輯到我們的代碼。 因此,例如,這是一個程序 寫在刮,要求用戶 為一個整數,並告訴他們是否 整數,他們給你是一個 正數或負數。 和轉換在這裡看到的是 你先打印出報表, 給我一個整數。 然後你問他們一個整數。 然後使用條件邏輯在 在這裡,檢查該號碼是否 實際上比為零或不大於。 所以在這裡,我們有一個布爾表達式 裡面的條件If語句。 有什麼問題嗎? 是否有關於什麼問題嗎? 確定。 因此,有不止 比,當然,更大。 你可以構造布爾表達式 使用大多數的各種各樣的事情你 會想到數學。 因此大於。 這應該是一個小於。 抱歉。 和間距。 羅伯:上帝保佑你離開它。 約瑟夫:好吧。 這樣比,小於,大於更大 大於或等於,小於 大於或等於。 我們使用雙等號檢查 平等,因為單等於手段 分配,對不對? 是。 然後我們也可以不等於由 使用感嘆號,等於。 而這個感嘆號符號可以 也可以擴展,這樣,如果你​​想 顛倒任何形式的布爾 表達式,你可以做到這一點。 因此,這將評估為true 只有當回答為少 大於或等於零。 上有問題嗎? 確定。 所以,你也可以將這些 使用邏輯與和表達式 邏輯或。 所以,這只是和符號, 這應該是平移,7。 這是管道符號,這是 不是小寫L.這是一個 這是正確的上方的Enter鍵。 所以你使用其中的兩個象徵 邏輯的邏輯或。 因此,這將只返回true,如果答案 是一個,兩個,三個或四個。 這將只返回true,如果答案 超出該兩側。 所以它不是一個,兩個,三個或四個。 並且你會使用的方式 在一個表達式 - 羅伯:或零或五。 約瑟夫:零或五。 抱歉。 是的,是的,是的。 確定。 而在這裡現在,同樣的方式,你 將使用該表達式,一個較小的 的如果條件表達式側 聲明中,你也會使用它 同樣的方式通過只把它的內部 If語句的括號中。 因此,這將printf的只有火,如果答案 是一個,兩個,三個或四個。 結合上有任何問題 表達式? 因此,有另一個條件 構建體,我們稱之為一個if / else語句。 所以基本上,這意味著現在好不好,如果 我想要的東西,檢查是不是 真的,然後去Else和 執行其他動作。 因此,在這種特殊情況下,我問 用戶的一個整數。 是大於零的整數? 是嗎? 好吧,那麼他們選 一個正數。 如果沒有,那麼它必須有 是負或零。 所以,你選擇了一個負數 或者在此情況下為零。 是。 或零。 然後我們也有if / else語句, 如果和其他人。 因此,這可以讓我們執行的順序 事情只有首當其衝失敗。 因此,在這種情況下,我們現在正在做的 最後一個你挑為零。 所以,如果他們既不挑了積極的,也不 一個負數,那麼他們必須 紛紛拿起為零。 因此,它只是下降的 鏈條是這樣的。 如何在這樣一個例子 如果是從不同的 - 一個if / else語句是不同的 只是一個序列IFS的。 這是一個常見的問題, 人們問的是,好吧,如果你得到一個像 95 CS50,又會此 程序告訴你嗎? 揚聲器5:你有一個A。 約瑟夫:是的。 你得到的每一個 其中的一個權利。 你有一個A,你有一個B,你 得到了一個C和D,對不對? 因此,所有這些得到評估 為了。 因此,雖然95大於90,它的 比80也更大,這也是 大於70,它的 也大於60。 所以,你得到了所有這些成績的。 我相信,你會 只希望A。 要解決這一問題的方法是更換 那些否則/如果的。 所以在這種情況下,它看到的是95 大於90,然後它 不評價其他地區 的語句。 關於什麼問題嗎? 因此,有另一個條件排序 結構,我們在這裡,我們 調用一個switch語句。 因此,這可以讓你基本檢查 怎樣的一個數字,你把價值 進入switch語句。 所以在這種情況下,我們切換 於n,和我們說,哦,如果n為 一個,然後打印該報表。 再突破,這意味著退出 出了switch語句。 如果它不是一個,那麼,很好,只是 最後檢查所有的這些情況。 所以它會檢查是否它的一個或兩個或 三,它打印相應。 什麼這個默認的關鍵字到這裡 方法是,如果他們沒有進入任何 那些,然後說無效。 因此,讓我們說,我問n和 用戶給我四。 那麼,它沒有匹配的那些情況下, 所以它會打印出什麼在 默認段。 是的,質疑? 揚聲器5:你可以使用布爾 表達式代替 一個,兩個,或三個? 喬瑟夫:所以,問題是你能使用 布爾表達式,而不是一個, 二,三? 而在C中,我相信你 不能做到這一點。 但在其他語言中,你可能會 在遇到的結束 學期如JavaScript,你可以。 那麼,你就必須先計算 該值,然後使用它在 switch語句。 是嗎? 羅伯:開關部分的利益所以 報表是想,如果你這樣做 作為一個if / else語句,所以如果n等於像 等於一個或什麼的。 其他/如果n等於等於二,什麼的。 其他/如果n等於等於三。 這樣的方式,程序將運行的是它 會按順序往下走的列表 並檢查是N嗎? 不。 為n 2? 不。 為n 3? 是啊。 做到這一點。 而用switch語句,它的 居然能夠編譯它是 真快。 而一旦它說開關,它 說,沒事,n為2時,我 馬上要跳的地方 我應該開始執行。 我不會先檢查, 為n之一,N雙? 它可以立即開始做 什麼是應該做的。 正因為如此,它不能 採取布爾條件。 否則將不得不這樣做的 順序一樣,所有的權利,為n 大於零? 否則為n大於10或任何更高。 約瑟夫:在這種情況下,如果你使用 if / else語句,如果的,則開關會 運行約3倍 比的if / else,如果速度更快。 我們可以組織開關在這樣的 我們不分手的方式 之後每個案件。 因此,在這種情況下,我分隔 我們選擇到一個和數字 兩個是不高的數字和 三位的是大量的。 因此,在這種情況下,如果n是1或2,它 會打的情況下,然後它會 告吹,因為 沒有休息。 它會在這裡結束。 因此,如果我們挑一個,它會做的printf 然後突破,這樣的無 這被執行。 當然,如果他們在三個進入 還是其他什麼東西,然後它會跳過 這些,而不是去那裡,它 將執行的,而不是 相應的行。 是否有關於什麼問題嗎? 是嗎? 揚聲器4:你會得到一個錯誤,如果你 有情況下,一前一後休息,但它 沒有東西給它做? 喬瑟夫:所以,問題是,你會得到 一個錯誤,如果你有後休息 案例一但有什麼可以做? 答案是否定的。 你不會真正得到一個錯誤。 是啊,毫米嗯。 作為排序的那麼一點點這裡的變化, 我打算把一個printf這裡。 哎呦。 那麼,什麼會這樣,如果打印 我把一個在輸入? 是啊。 它會告訴你,它沒有考慮 高數的兩倍,對嗎? 因為它會打的第一種情況下, 它不會打破,一下子就摔倒 通過向所述第二殼體。 關於什麼問題嗎? 羅伯:你有別的問題? 約瑟夫:好,冷卻。 好的。 因此,有我們所說的別的東西 三元運算符這基本上是一個 替代語法幹嘛 如果再別的。 它可以讓你做這一切在同一行。 所以這個特定的程序中, 我問n的用戶。 如果n大於100時,我告訴 他們,他們選擇了一個高的數字。 別的我告訴他們,他們 挑一個低的數字。 因此,我們可以用這個很長的語法, 字符串,S,然後檢查是否n是 大於100,並分配 它相應。 但是,我們可以讓這個更簡潔 通過使用這個三元運算符語法 其中涉及的問題 標記和一個冒號。 所以問號本質上是 問一個問題,對不對? 羅伯:或許放大了。 約瑟夫:是的。 好點。 因此,這是三元運算符。 我首先要問的問題, 為n大於100? 如果是,那麼我執行第一 冒號前的部分。 如果不是,那麼我執行 在冒號後面第二部分。 因此,如果n大於100, 然後挑選高,看跌期權 那到字符串s。 如果n小於100,它選擇低 進而提出了到字符串s。 因此,將這種凝結大塊 成只是一條線。 揚聲器5:這是流行? 約瑟夫:是的,這是很流行的 那裡基本上你要的東西 做基於任務 某種條件。 在這種情況下,我們試圖 到一個值賦給字符串s。 這不是那麼 - 我想我真的不喜歡 但在其他情況下。 但它是特別有用 對於這項任務。 羅伯:這是一個很常見的模式 在那裡你有一些變量, 你會說,如果事情,設置 該變量為一個值,否則,設置 此變量為另一個值。 那就是場景 其中使用三元。 約瑟夫:你是在救 很多行,對不對? 它只是使你的代碼可以說是 更可讀的一點點。 是的,質疑? 揚聲器6:對於三元,你能不能去, 字符串s等於S,問號? 然後你可以有,比方說, 五個不同的選項。 以及根據什麼n的數目 是,你會選擇其​​中的一個? 喬瑟夫:所以,問題是,有沒有 排序語法,你可以做字符串 s等於n,並且隨後有兩個以上的 那個問號的選項? 而一個簡單的答案是否定的,有沒有 真是一個好辦法做到這一點,除非 要嵌套多個三元 彼此的內部運算符。 你可以做如:n大於100, 問號,然後再 三元運算符中,n大於50, 問號,巢這種方式。 但在這種情況下,你的代碼是 得到一種不可讀和凌亂, 它可能是更好的只是去 一個if / else語句在這一點上。 羅伯:還有,作為一​​個側面說明,PHP 不正確地實現了三元 運營商這樣嵌套的三元系 甚至不工作,因為他們應該。 約瑟夫:是啊。 因此,它變得有點混亂, 尤其是當你去 以不同的語言。 羅伯:這是迷惑,以至於 語言是錯的。 喬瑟夫:所以其實只是為了澄清, 每個人都知道那是什麼 %s的確實在這裡? 關於什麼問題嗎? 我猜只是相機,%s的 基本上讓我們放一個佔位符 為一個字符串。 然後到了最後,我們指定的 變量,我們希望把這個 佔位符為s。 所以,基本上需要s 它把它在這裡。 然後它會打印出來,你挑 高或你選擇了一個低的數字。 確定。 所以循環允許你執行的事情 在打圈,對不對? 你可能會在遇到此 在從無到有的永遠的形式循環 或重複,直到或重複特定的 的次數。 那麼,為什麼這是對我們有好處? 那麼,在C中,假設我們有這樣的 在刮歌實施了 唱歌,這是歌曲 永遠不會結束。 它只是和和 永遠,永遠。 好了,你真的不能讓一個程序 具有printf的無限數量的 在它的報表,對不對? 因此,在這種特定的情況下,單程 您可以進行這項工作, 讓它永遠印是 而不是使用一個while循環。 因此,一個While循環將執行什麼 在兩個支撐體是 屬於它的依據是什麼 條件是。 因此,在這個特定的例子之前,如果 我們要永遠的打印本,有什麼 也許我們做什麼? 嗯,當然,對不對? 所以,這樣的結合的想法 一些布爾表達式 隨著循環。 我們了解了布爾 表達式前面。 所以每當裡面的條件 這雖然仍是如此,這個循環 將執行上和和。 在這種情況下,如果我們只是提供了 與真實的,這將導致無限 循環打印出的歌曲,並在 和我們之前沒有期望 具有一個程序,有無限 的printf語句數目,這是 不可能的。 所以更令人信服,不過, 你可以使用這個用 變量和條件。 因此,讓我們說,我們要重複的 詞組,完全充滿循環,10倍。 所以,你可以用一個While循環做的是 你可以先初始化一個計數器 變量以外的 While循環到10。 然後基本上,每次你走 通過While循環,打印出 您降低語句,然後將 計數器變量,直到在最後, 在某些時候,當我們減去我不夠 次,1次從我足夠的時間 - 而只是為了澄清,我減減 意味著我等於I減1。 這將基本上把我下到 點,一旦我打零,這 條件不再真實, 所以它退出圈外。 所以完全充滿循環只打印10倍。 關於While循環有問題嗎? 確定。 因此,有一個辦法,我們可以做什麼,我們只是 在一個更簡潔的方式與做 我們所說的For循環。 因此,一個For循環由一個 初始化的狀態下,和一個 更新,就像我們以前有 在這個While循環。 因此,讓我們一起來看看。 在這個while循環,我們有 初始化,然後我們有一個 調理,我們檢查。 然後我們有一個更新 步驟在頂部。 在fo​​r循環中,這主要取 這三樣東西和它凝結 成一行。 因此,它確實在的第一件事 for循環的初始化。 然後,你做一個分號,然後 你做的條件,這是我 大於零去那邊, 然後在更新步驟。 因此,這被在執行 循環體的最後一刻。 所以,這兩個程序是 基本上是等價的。 有問題嗎? 那麼,什麼是一個區別 這兩者之間? 任何人都可以指出來? 它可能是一個有點微妙。 這只是一個非常小的差異。 是嗎? 揚聲器5:您將無法使用 For循環外的我變 [聽不清]? 約瑟夫:沒錯。 所以,這是我們會得到 後來被稱為變量的作用域。 但本質上,這種詮釋我的生活 這個while循環之外。 所以一旦這個while循環完成 執行時,我就可以在以後使用我 在該程序。 而用這種For循環,這個INT I 作用域是這裡面的for循環。 並且,因為它是該部分的內 For循環,即啟動 在括號和結束 大括號那邊。 這就是內聲明的任何事情 這裡不能被外部使用。 所以,如果我嘗試使用外我,它會 告訴我,未申報的象徵。 而且基本上,我不會 能夠使用它。 羅伯:和好了,10年前,在 從字面上所有的情況下,大括號 你用什麼來確定 一個變量的範圍。 所以在那裡,INT I等於10 這裡面聲明 設置大括號。 所以這時只要您嘗試使用我 這個大括號之前,它的罰款。 當你鍵入make您可能會看到,你 看破折號,破折號,標準,等於和C99。 所以這是C以後的版本, 海灣合作委員會已實施也給 此快捷方式。 因此,這用於不能在C.允許和 你可以看到為什麼,因為這個整數 我是這個大括號之外,但 它仍然被認為是在 這些大括號的範圍。 但是,這是一個非常方便的事情, 所以它是一個很好的延伸。 約瑟夫:有問題嗎? 確定。 那麼什麼是更有益的是,有時 你想在那種活力 你的循環,對不對? 你不想只是必然打印 完全糊塗的所有的時間,你 要從倒計時 10什麼的。 所以你可以使用計數器變量 那裡面循環的為好。 在這種情況下,本程序只是 倒計時從10一路下跌下來。 它有什麼不能打印? 它不打印零, 沒錯,因為當 - 是的,它也不會打印11。 因此,它不打印零,因為當 我是零,請記住,它會評估 之前那張條件 執行循環體。 當我是零,這是假的,所以 它不會打印出倒計時 零,它只是打印出票 跌10一路下滑至1。 如果我們真的想要它打印為零, 然後我們會把等號 比後簽訂本更大。 確定。 因此,一個辦法做到的輸入驗證,這 是當你問用戶做 什麼,你要確保他們 按照您的指示,是使用 While循環,對不對? 因此,在這種特殊情況下,我在問 為正數,那麼我 等待輸入。 然後我檢查而輸入 小於零,不斷地問他們。 所以只要他們給我一個號碼 這不是積極的,不斷地問, 不停的問,不停的問。 但是,什麼是有點兒奇怪這件事? 或似乎有什麼不理想有關 這種結構在這裡? 任何人嗎? 是嗎? 揚聲器6:你重複 該指令的兩倍。 喬瑟夫:對。 因此,我們有兩個printf語句 在這裡,對不對? 因此,有一個辦法,我們可以得到這個剛 下降到一個會令我們的 代碼更易於閱讀和 更乾淨一點。 然後我們就不必 已取得在兩次為好。 你也可以做到這一點的方法之一是 通過使用一個do-whil​​e循環。 和do-whil​​e循環基本上是一個 不同形式的While循環在哪裡 無論是在大括號內 被至少執行一次。 所以在這裡,我宣布,整型 輸入外第一。 然後,我只是說,這樣做 指令同時輸入 小於零。 所以,它擊中先做。 它總是至少執行此 一次,所以它總是會詢問用戶 對於至少一次輸入。 然後它計算的輸入, 並且它繼續了一圈。 是的,質疑? 揚聲器6:有沒有辦法做到這一點 [聽不清]的類型,如果你說喜歡, GetString的,有人[聽不清] 是有辦法[聽不清] 喬瑟夫:所以,問題是,有沒有 這樣做的輸入驗證,如果用戶 不把正確的 變量的類型? 因此,如果我們要求一個int和他們 給我們一個字符串來代替。 而在我們實現的功能 對你來說,調用getInt是,GetString在所有的 這些功能,他們實際上已經 做那種基本類型的輸入 引擎蓋下驗證。 所以,如果你正在使用的功能,我們 給了你,你真的沒有來。 但是,如果你想看起來更探討如何 你其實可以做到這一點,你可以看看 罩在文件下I/O-- 不是一個文件,標準I / O函數 像一個從標準輸入讀取和 標準輸出。 你可以得到一個更好的感覺 您可能如何做到這一點。 羅伯:有一個問題,雖然是專門 用你的例子 說,你期望一個字符串 而我進入一個int。 你將如何分辨 故意想要的 串123對想要整型123? 這樣的字符串,它幾乎沒有 驗證,它只是不管他們 進入你將圓夢 作為一個字符串。 int是比較容易的,因為不管 輸入你從用戶,你是 始終以一個字符串。 所以該字符串就可以再 檢查一下,是所有這些 實際上位數字? 約瑟夫:確定。 大約一個do-whil​​e循環有問題嗎? 羅伯:哦,這也是 - 回去範圍,一個比較常見的 錯誤是試圖用一些當地的 從這個的do-whil​​e中變量 循環的這種情況下的內部。 而實際上,如果我們只是擺脫了 這一點,並說,INT輸入等於 調用getInt,那麼編譯器會罵 我們,因為輸入不存在 的範圍之外的 這些大括號。 約瑟夫:這就是為什麼我們 需要這樣的陣容在這裡。 確定。 所以你也可以打出來的 循環初期,如果你想。 所以這是一個不同的方式 實施我們剛剛實施。 和,而不是使用條件 在括號內,我們使用了 如果身體的內部表 在do-whil​​e循環的。 基本上,當輸入最後 大於零,我們將 跳出循環。 因此,我們將全力以赴 一路下來這裡。 而且你可以看到這會 可能是優選的這 情況下,因為它是一個小 有點清潔和一點點 位更容易閱讀。 而這一類的,你 有多餘的線條在裡面。 這只是一點點醜陋, 我猜想,在某種意義上。 是的,質疑? 揚聲器4:將僅獲得突破 你出一組大括號? 喬瑟夫:對。 所以,問題是只破 讓你出一個循環的? 答案是肯定的。 所以,如果你有嵌套的For循環,對於 舉例來說,如果我有整型I等於0 直到10然後對於int j為0 直到10,如果我打出來的內在的 環,我還是會去 到外循環。 所以它會繼續執行 操作在外面。 關於什麼問題嗎? 是嗎? 揚聲器5:但只有突破功能 對大括號,而不是其他 報表? [聽不清] 喬瑟夫:所以,問題是將打破 唯一的功能for循環,而不是 其他語句一樣,如果? 是的,是這樣的話,因為 你打破一個循環出來了吧, 在感。 羅伯:在案件的絕大多數,這是 這是如果某樣東西的那種, 然後打破。 所以,你不必打破申請 的如果是環繞著它。 而且,這並不是太大的環, 但請記住,開關也 通過斷裂破碎出來的。 我們看到正在使用的中斷 與切換前。 約瑟夫:你也可以使用它們 在While循環和for循環。 有問題嗎? 確定。 所以,接下來是功能。 所以,你可能已經使用了這些BYOB之一 塊,將刮項目。 這基本上可以讓 您可以定義一組 指令被執行。 而我的意思是讓我們覺得 回到數學,右,代數。 你有什麼我們稱之為x的函數, 一些變量,並假設本 函數是f的x等於x加5。 所以,你能想到前後x的,因為這黑色 框取15,然後 生產20。 所以更一般地,一個功能是 的東西,需要一些投入和 然後產生一些輸出。 以及為什麼是功能好? 他們是很好的為一定數量的原因。 因此,沒有人想採取刺 在組織什麼意思? 在為什麼功能方面都是有幫助嗎? 是嗎? 揚聲器4:它使你的 代碼更具可讀性。 喬瑟夫:對。 這樣的事情之一是它使 你的代碼更易讀,對不對? 而不必像詮釋x等於x時 次x次X,我可以得x的立方, 這是更具可讀性,更 可以理解的讀者。 組織也是來講 把您的代碼轉換成可管理的 部分,因此,與其試圖 實現這一切在一個長款 在主,你可以有點分裂它 成想,好,讓我們寫一個函數 多維數據集的東西,讓我們寫一個 功能為方形的東西。 這樣,你可以把它分解成微小的, 小部分,你可以解決 而不是試圖解決 一個很大的問題一下子。 羅伯:甚至微小的,小零件 你和你的伴侶可以解決。 約瑟夫:是啊。 羅伯:所以不是兩個 你想植入1 功能的同時。 約瑟夫:簡化。 有人想以此來猜測? 是嗎? 揚聲器5:更多的重複。 喬瑟夫:對。 這樣一件事,你可以做 簡化是它的排序上 相同的線作為可重用性是 有一次我寫一個立方體函數,我可以 剛剛使用過,並一遍又一遍 又在我的程序,而不是打字 x次x次x在和 一遍又一遍。 和簡化在這裡也只是 意味著它使你的代碼排序 一旦你分割更容易調試 這成函數。 因為這樣你可以在那裡本地化 排序您的問題。 有問題嗎? 所以另一個想法是抽象的,對不對? 這個黑匣子。 就像你知道什麼調用getInt呢 以接收來自用戶的輸入? 我們還沒有真正告訴你,對不對? 所有我們告訴你的是調用getInt呢 正是它說,它的作用。 所以,即使我們不告訴你如何 它的工作原理,你還是知道的。 因此,在這種特殊情況下,這是 四重功能,不 不同的東西來輸入 以產生一個輸出。 而且你可以翻兩番一個數字 通過將其乘以4。 或者您也可以就是我們所說的 位由兩個移動它。 我們將討論這 一點點後。 而且也沒有必要知道如何 函數實際上只要工程,它 誠如作品。 於是在引擎蓋下,我可能是 像,返回輸入倍 8除以二。 而你不知道吧? 所有你需要知道的是, 它做什麼它說。 所以這是有用的東西 關於抽象。 而另一件事是有點這樣的想法 定位你的代碼之一 特定部分。 所以,如果你有一個問題,你不 要走遍你的代碼試圖 解決那裡的問題。 因此,在這種情況下,我實現 立方體錯誤的。 我想多維數據集乘以 三。 所以在這種情況下,這是一個程序 只是已經由三個相乘 無處不在。 而且,還有另一個計劃,有 保理立方體出成一個函數。 所以現在如果我想解決我的錯 在這裡,我必須要修好每一行 這個程序的代碼。 而在另一方面,如果我用 功能,我只需要改變 在一個地方發生了什麼事。 因此,在計算機科學中,我們 調用的輸入和輸出。 輸入被稱為參數或 參數,並輸出被稱為 返回值。 我們將看到如何這可以幫助我們理清 在第二個定義一個函數。 所以這是一個函數定義 對於體積測量。 因此它需要一個輸入,然後 它返回一個數字時代 本身三次。 因此,讓我們打破這種分解。 所以我們有一個函數頭,其中 基本上由三件事情。 所以,我們有參數, 是,正如我前面所說的, 投入到這個功能。 然後我們給函數的名稱。 在這種情況下,它被稱為多維數據集。 然後,我們指定哪些類型 的返回值是。 所以在這種情況下,我的立方體函數 取入的整數,並且它也 返回一個整數。 所以,如果我通過在二,二是整數, 它返回八到我,這 是一個整數。 因此,返回類型名稱參數。 有關該問題? 然後返回值實際上是 在最後說指定的回報 然後回到什麼 包含返回值。 因此,在這種情況下,如果我們把它全部 同時,一個函數接受 參數,這就是所謂的東西, 它返回的東西是類型 我們說這將是。 有問題嗎? 那麼,我們如何使用函數? 好了,我們寫一個函數,然後 我們用它在我們的計劃,對不對? 所以我把它稱為多維數據集, 然後我可以使用多維數據集。 但重要的是要注意 就是為了事宜。 如果我有以下主要的立方體,它的 要碰上立方體。 在這一點上,沒有什麼 所謂的魔方程序中,它的 只是要像,我有 不知道什麼是立方體。 因此,它會告訴你,隱 聲明的函數。 這顯示了錯誤。 所以在這種情況下,立方體低於 主要的,所以它不會 來了解一下吧。 揚聲器5:所以主要是通常 最後一個函數定義? 喬瑟夫:所以,問題是, 是主要的通常是最後 你想定義的事情嗎? 並沒有。 這是因為我們通常喜歡主 要在頂部,對不對? 因為這是第一件事情你 希望程序員打開 程序,看看。 所以,我們如何解決這個問題,我們 想主要是在頂部,但 我們想要的功能,我們希望他們 將低於主還能夠使用 他們的主要內? 好了,我們用我們稱之為 函數原型。 那麼,什麼函數原型本質 是被它首先需要什麼 簽名或函數頭 什麼我們要實現下降 在這裡,我們把它放在 一個程序的頂部。 因此,在這種情況下,我們說,好了, 後來在我們的節目中,我們將 作出承諾來實現這個 函數調用整型立方體,這需要 一個整數輸入。 所以,現在,因為那是上面的主, 主要的,它會說,哦,好吧, 在節目後,也將是 有這樣我就可以參考它,所以我會 就讓它通過去現在。 然後在底部, 我們實現的立方體。 然後主只想說, 好了,它會進行排序的鏈接 這兩個符號在一起。 我們將討論是什麼 意味著以後。 所以它會知道,這是 立方體函數,它應該使用。 羅伯:在[聽不清]關於希望 主要在底部或 頂,我見過兩個。 有些事情,就像 把主要的底部。 但是,一旦一個項目獲得特別 大,平時主要是在 提交自己的所有。 在這一點上,如 整型立方體線會 - stdio.h中裡面是一堆 就這樣整型行 立方體整型輸入線。 等等這些原型都是你 往往投入的頭文件,在 這一點,也沒有關係。 好吧,沒關係。 那些總是在頂部。 如果主要不是一個文件自身所有, 你不必擔心這會讓 個別函數原型 在文件中。 約瑟夫:我們會得到一個小 位後,當羅布開始談論 有關編譯。 所以還有一個區別 之間的參數和參數。 和參數正是 我們稱這些投入時 我們定義函數。 我們把它叫做一個參數,當我們 實際上它傳遞到函數。 所以在這種情況下,這是一個參數, 正如我們之前所說的。 而當我們真正使用它在那邊, 的x立方體,那麼X本身是 我們所說的論點 該函數的立方體。 羅伯:所以參數的論點是 - 有這種區別,很 交替混淆。 在這一點上,對我來說,它就像一個 那些話,當我看到它在 野外,我不禁馬上 質疑他們是否在使用它 正確的上下文,因為 差足夠細微,僅僅 每個人都傾向於 - 我幾乎總是說參數 不管我是什麼意思。 約瑟夫:和功能也很有用 對於我們所說的副作用。 因此,一個函數可以不取輸入,並 它也可以不產生輸出。 因此,在這種特殊情況下,我 定義一個子程序,有沒有 返回值。 並且為了指定這一點,我們使用 我們稱之為無效在這裡。 因此該函數的副作用 是,它只是打印的東西 出到頁面中。 它實際上並沒有採取任何 輸入,並且它不 實際上產生任何輸出。 但是這可能在這個意義上是有用 如果你想,例如,調試 東西在你的程序中,如果你想要 寫一點子程序 打印出來,讓我們說,內容 內存什麼的。 等等這些副作用是有時 上下文之外有用 只是想輸入和輸出。 有問題嗎? 並結束這個特殊的領域, 這是什麼節目呢? 我給你們一對夫婦 秒讀通過它。 在一個非常基本的水平,我們要 說的是,它交換x和y,對不對? 所以,你們有多少人真的認為 這將交換x和y? 舉起你的手。 沒有之一。 確定。 誰認為它會 不會掉x和y? 和該總和是 不是整個房間。 所以有些人不知道。 確定。 這是合理的。 所以,讓我們通過會發生什麼時, 你實際上調用函數首先在 為了回答這個問題。 因此,這是什麼內存 那種樣子。 這有點像一個簡化模型 的記憶是什麼樣子時, 你運行一個程序。 因此,有一種叫 堆棧下來這裡 一種叫做堆。 而這些對成長 的存儲器的中間。 因此,在這種特殊情況下,當 你調用一個函數,它 被放在堆棧上。 然後無論是包含在 功能停留在我們所說的 函數的堆棧幀。 等拿到一個不錯的可視化 對此,let's - 例如,我們有 程序主要更早。 和主裡面,我們稱之為立方體。 所以主要會先進入堆疊 框架,因為它是第一個函數 這就是所謂的。 然後當立方體被稱為內側 主要的,它被放在主頂部 內的存儲器中。 所以,你會發現這裡是立方體 有它自己的參數和其 自己的本地人。 所以,當你真正傳遞的東西 一個函數,參數,它 得到是什麼副本 從主要的傳遞。 和排序來解釋這一點,讓我們 走過一個程序。 因此,我們有棧,這是 只是部分堆垛。 而我們要做的是,我們首先初始化 x和y為一個和兩個。 因此,我們有這些小盒子。 他們坐在主的堆棧 框架堆棧上。 它們含有一個和兩個。 現在,我們稱之為交換。 什麼情況是我們通過x和y成 掉期,掉期和創建自己的副本 這些變量裡面使用 它的堆棧幀。 所以,現在在那邊,我們有一個,這 包含x具有的值,以及b, 其中包含使y的值是。 這樣的一,二。 而且你會發現,這是獨立的 從x和y的主內。 所以我們現在創建一個臨時的 變量包含。 我們設置一個等於b,那麼它 變化從一到兩個。 然後我們將b等於 到溫度,這是其中之一。 然後現在我們退出了 這個功能。 當您退出功能的出去, 堆棧幀被彈出堆棧。 我們稱它推。 你推一個棧幀壓入堆棧 而你若彈出從堆棧中。 所以會發生什麼事是一切 是剛才那個堆棧幀排序 上升在火焰中。 所以不再存在。 但是,我們注意到了嗎? 我們從來沒有真正改變 x和y的值,對不對? 所以那些地方呆主。 並通過傳遞東西掉期,我們 其實從來沒有改變這些值。 而我們稱這是什麼? 我們按值調用這個傳球。 所以在C中,當你通過東西進入 功能,它通過它們按價值計算, 使他們的副本 該函數使用。 我們將了解一些所謂的 通過引用傳遞後,但是這 一種方法可以解決這個問題。 但我們不會擔心 那直到後來。 羅伯:而實際上,這個詞,傳遞 通過引用,所以C甚至沒有 路過的參考。 Ç已經完全經過值。 不管你做什麼,你總是 路過的一些副本。 它只是說,像我樣的提 之前的指針 和一個字符串確實是只有四 字節指著某處在內存中。 好吧,如果我有這樣的字符串,它的 告訴我,是其中的字符串 - 好吧,如果我有這個指針指向這個 放置在內存中,然後我可以通過一個 該指針指向一個函數的副本, 該功能仍然知道在哪裡 內存是。 所以,這兩個指針都指向 內存中的同一個地方,和 這就是我們要如何才能夠 修改以後的事情 當前堆棧幀。 約瑟夫:你們想幹什麼編譯? 羅伯:不,這是5:30。 約瑟夫:確定。 它是5:30。 確定。 因此,我們將覆蓋編譯我猜 下一節,或者你的節 領導者會在這一點上。 和 - 羅伯:有問題嗎? 約瑟夫:有問題嗎? 是嗎? 喇叭5:使用從CS50,任何字符串 我們要使用的功能 這些,那將是像C函數。 CS50並沒有消失在和 做任何額外的。 羅伯:正確。 任何的C狀[聽不清],您 會使用那些在我們的字符串。 約瑟夫:最後一件事我想 一提的是,我們有一個風格指南 這個類。 羅伯:哦,是的。 喬瑟夫:所以,如果你來自一個 前編程背景,你 可能有一定的約定,當 你寫的代碼就像把 在同一行或特定括號 縮進方式 或命名變量。 在這個類中,我們要遵循 具體風格指南只是因為, 好吧,如果你出去工作的 行業,你會在意料之中 遵循的風格指南 公司在這你去。 像例如,Facebook的我覺得 已命名的特定排序 約定。 還有的駱駝之間的差異 外殼變量和像 他們用下劃線分隔。 而且,我認為最重要的是,像 例如,壓痕,對不對? 我們花括號開始的地方 的條件是,它們 是從下一行的。 而我們也把花括號中 即使是只有一條線。 而很多時候,有很多方法可以做 它在那裡你可以將這些括號 如果是只有一條線斷 下的If語句。 但在這個類中,我們要遵循 具體風格指南只是讓你得到 用之類的事情。 羅伯:是啊,50款將要 執行本風格指南,我們很 要使用樣式50 分級代碼。 因此,它使事情變得更容易為我們和 希望不要把事情說 為你提供了很多糟糕的 標準化的風格不應該是 不現實的。 約瑟夫:最後,找到風格 引導,去manual.cs50.net/style。 ,是的。 揚聲器4:你要強制執行 每行的所有字符? 羅伯:是的。 約瑟夫:對不起,伙計們。 羅伯:這就像唯一的一個。 在這一點上,我與120確定。 我跟說120行 每行的字符。 據我所知,被一些限制。 我覺得80是如此之小,但 我們正在執行它。 約瑟夫:我個人認為,用 C,80個字符是比較確定。 一旦你開始給其他 語言如JavaScript和PHP,不 所以合理的,只是限制 它為80個字符。 確定。 嗯,這是超級節。 有誰要糖果? 揚聲器4:是的。