JavaRush /Java Blog /Random-TW /講座 CS50 的附加資料:第 1 週(講座 3 和 4)
Masha
等級 41

講座 CS50 的附加資料:第 1 週(講座 3 和 4)

在 Random-TW 群組發布
cs50 俄文附加資料 第 1 週任務

第一周目標

  • 熟悉基本的 Linux 指令
  • 學習基本的 C 文法並解決一些問題
  • 開始更清晰地思考=)
IDE CS50
為了完成任務,CS50 在雲端提供了 IDE(整合開發環境)。要使用它,請在 edX 平台上建立帳戶並註冊原始課程。之後:
1. 前往 cs50.io,從清單中選擇 edX,輸入您的登入名稱和密碼,按一下「提交」 2. 輸入您的 edX 帳戶信息,按一下「返回 ID.CS50.NET」CS50.io 3. 我們正在等待:您的虛擬空間正在創建。 虛擬空間CS50 4. 完成! CS50IDE
命令列和啟動 CS50 IDE
在 CS50 IDE 視窗底部的「終端」標籤中,有一個終端機視窗或命令列面板。您可以在這裡輸入字串命令:您可以執行與視窗介面相同的操作,例如啟動應用程式、刪除和建立檔案、安裝軟體。如果您從未使用過命令列,那麼此方法可能看起來很麻煩:您必須記住命令並鍵入它們,而不是單擊圖示和按鈕。從某種程度上來說這是真的,然後視窗介面就被發明了。然而,命令列在所有作業系統中都可用,並且管理員喜歡它。這一切都是因為有時候沒有它你就無法生存。在終端機的 IDE 視窗中,您將看到一行神秘的行:username:~/workspace $ 取代“username”,將有一個自動產生的名稱(基於您的註冊資料)。點選終端機窗口,輸入: update50 按 Enter。此指令要求系統更新。您將看到終端機中出現描述安裝過程的行。在看到更新完成之前不要關閉 CS50 IDE 。此後,預設行將再次出現,即帶有您名字的行。
在 IDE 中工作
讓我們建立一個用於儲存檔案的資料夾。右鍵點選CS50 IDE左上角的~/workspace (您的根目錄) ,選擇新建資料夾。重新命名資料夾pset1(如果名稱拼字錯誤,請右鍵單擊資料夾並選擇“重新命名”)。 然後右鍵單擊pset1資料夾並選擇“新檔案”。Untilted 檔案出現,讓我們將其重新命名為hello.txt。 雙擊 hello.txt。在 CS50 IDE 中,您將看到一個新分頁和右側可以鍵入的欄位。如果您已執行此操作,請注意選項卡上檔案名稱前面出現的星號 (*) - 該指示符表示已對檔案進行了更改,但尚未儲存。 透過前往*檔案 > 儲存或使用command + S(在 Apple 電腦上)或Ctrl + S(在 PC 上)來儲存檔案。星號應該會消失。讓我們檢查一下文件是否位於應有的位置。讓我們使用命令列來完成此操作,是時候習慣它了:)。和先前一樣,終端機中的活動行如下所示: Workspace - 目前工作目錄(在工作環境中開啟的目錄)。波形符號 (~) 表示根目錄(工作空間位於其中)。請注意,終端機中的工作區與 CS50 IDE 左上角的 ~/workspace 圖示相同。讓我們來練習。點擊終端機中的任意位置並輸入命令列 並按 Enter。這兩個小寫字母 - 「清單」的縮寫 - 將顯示位於目前工作區目錄內的檔案和資料夾的清單。除此之外,您將看到您創建的pset1!現在讓我們使用命令打開資料夾。我們輸入 或更詳細的內容: cd(更改目錄)命令更改活動目錄,在我們的例子中為 活動行已更改為 這確認您現在位於該目錄中 (該行代表“我在工作區內的pset1 中」資料夾,位於根資料夾中,以 ~" 表示)。現在輸入 您將看到文件hello.txt!如果您在終端中單擊該名稱,則不會發生任何事情:它是文本,並且不會給出活動的鏈接,但它確認 hello.txt 是它應該在的位置。類型 如果您只編寫 cd 命令本身,但不提供參數(即它應該轉到的資料夾的名稱),它將返回您到預設根目錄,因此您將在活動線路上看到以下圖片: 若要返回資料夾 pset1,請撥打 cs50 ide重命名資料夾CS50IDE講座 CS50 的附加資料:第 1 週(講座 3 和 4)- 1username:~/workspace $lscd pset1cd ~/workspace/pset1~/pset1username:~/workspace/pset1 $~/workspace/pset1lscdusername:~ $cd workspace 並按 Enter 鍵。然後 cd pset1 再次輸入。您也可以將這兩個命令替換為一個更真實的命令: cd workspace/pset1
你好ç!
終於,這一刻來了!讓我們開始程式設計吧。在 IDE 的 pset1 資料夾中,建立一個名為hello.c的檔案(副檔名是必需的),在新分頁中開啟它(我們認為您還記得上一段中如何執行此操作)。 重要的!字母必須小寫,Linux 區分大小寫。Hello.c 和 hello.c 是不同的檔案。在 CS50 IDE 視窗的右側,鍵入與下方所示完全相同的文字。是的,您可以複製它,但打字更有用。 由於 CS50 IDE 具有語法高亮功能,因此字母的顏色不同。它用顏色突出顯示文字區塊,以提高可讀性。顏色不會保存在檔案本身中;它們僅在 IDE 中可見。如果它們在那裡,那麼 IDE 可以識別 C,並且您在檔案副檔名 (*.c) 中指出它是 C。如果您呼叫相同檔案 hello.txt,則文字將為一種顏色。確保您輸入的所有內容與範例中完全相同,否則您將遇到第一個錯誤 =)。我們再次提請您注意小寫字母和大寫字母之間的差異。\n 字元將遊標移到下一行,接下來輸入的文字不會與程式的輸出黏在一起。哦,是的,不要忘記分號 (;)。這是程式語句的重要分隔符號;如果沒有它們,C 將無法運作。按一下檔案 > 儲存(或 command- 或 Ctrl-s)。注意到檔案名稱前面的星號消失了嗎?如果是,則變更已儲存。點擊程式碼下方終端視窗中的任意位置,並確保您位於~/workspace/pset1中(如果不在~/workspace/pset1 中,請按住cd 鍵點擊並按Enter 鍵,然後再次按cdworkspace/pset1 並按Enter 鍵)。您的活動行應如下所示: 讓我們確保hello.c檔案恰好位於其應在的位置。鍵入 並按 Enter 鍵。你也看到 hello.c 了嗎?如果沒有,請返回幾個步驟並再次在所需目錄中建立檔案。……現在是莊嚴的時刻:我們交叉手指,然後...我們打字: 然後交叉手指,按下 Enter 鍵。確切地說是 hello,而不是 hello.c。如果執行此操作後您看到的只是第二個活動行,它看起來與前一個活動行完全一樣,那麼一切正常!您的原始程式碼已翻譯為機器碼或目標程式碼(即按 0 和 1 的序列)。現在這段程式碼可以被執行了(也就是說,程式可以運行了!)。為此,請 在命令列中鍵入:,然後按 Enter 鍵。如果您沒有更改「」之間包含的文本,您將看到以下內容: 如果您現在鍵入命令 並按 Enter 鍵,您將看到一個新的 hello 文件,以及 hello.c 和 hello.txt。第一個 hello 名稱後面應該有一個星號,這表示這是一個可執行文件,也就是您用來啟動程式的文件。 #include int main(void) { printf("hello, world\n"); } username:~/workspace/pset1 $lsmake hello./hellohello, worldls
蟲子?
如果在 make 命令之後您看到錯誤,那麼就需要進行第一次偵錯了!像「預期聲明」這樣的銘文意味著你在某個地方犯了錯字。再次檢查上面的程式碼,只要非常小心所有細節即可。 注意力!錯誤描述以英文提供。如果不清楚,請使用搜尋引擎、谷歌翻譯,或在評論中提出問題。修正錯誤後,不要忘記使用「檔案」>「儲存」(或 command- 或 Ctrl-s)儲存程式碼,再次點擊終端機視窗內部並鍵入 make hello (只需確保您處於〜首先是 /workspace/pset1 )。如果沒有更多錯誤,則透過鍵入命令來運行程式。 ./hello 理論上,您所珍視的短語應該出現在您的前面,並用 printf 運算子的引號引起來,該運算子命令「print」。如果終端機視窗看起來太小,請點選 hello.c 旁邊帶圓圈的加號 (+) 圖示。
檢查正確性
check50 應用程式內建於 CS50 IDE 中。它從命令行運行並檢查某些程式是否有錯誤。如果還沒有,請透過在終端機中執行命令前往 ~/workspace/pset1 目錄: cd ~/workspace/pset1 現在運行 ls 您將至少看到一個 hello.c 檔案。確保檔案名稱如下所示,而不是 Hello.c 或 hello.C。mv source destination 您可以透過執行命令來源 - 目前檔案名,目標 - 新檔案名稱來重新命名檔案 。mv(來自英文 move)是一個重新命名實用程式。如果您不小心將檔案命名為 Hello.c,請鍵入以下行: mv Hello.c hello.c 在確保該檔案準確命名為 hello.c 後,讓我們呼叫 check50 檢查程式。請注意,2015.fall.pset1.hello 是「hello world」問題的唯一識別碼。check50 2015.fall.pset1.hello hello.c 如果程式執行正確,你會看到: 講座 CS50 的附加資料:第 1 週(講座 3 和 4)- 2 綠色笑臉表示測試通過。您也可以在 check50 輸出的底部看到 URL,但它僅適用於員工(但是,如果您有興趣,請檢查一下!)。check50 執行 3 個測試:hello.c 檔案是否存在、hello.c 是否編譯以及應用程式是否產生一行「hello, world\n」。如果您看到悲傷的紅色表情符號,則表示您遇到了錯誤。 :( hello.c exists \ expected hello.c to exist :| hello.c compiles \ can't check until a frown turns upside down :| prints "hello, world\n" \ can't check until a frown turns upside down 這裡check50沒有找到hello.c,紅色笑臉顯示你要嘛是名字寫錯了,要嘛是檔案上傳到了錯誤的地方。黃色“中性”表情符號意味著測試未運行。如果程式沒有找到需要檢查的文件,他們可以從哪裡開始?如果您更改 printf() 函數應輸出的文本,則會彈出以下另一個選項: :) hello.c exists :) hello.c compiles :( prints "hello, world\n" \ expected output, but not "hello, world" check50 報告預期有 hello, world\n 行,但出現了其他內容。check50 不計算完成課程的分數,而是檢查作業的結果是否與預期不同。它允許您在確認課程中任務的正確性之前驗證這一點(我們稍後將告訴您如何執行此操作)。
C 基礎知識:與 Scratch 的比較
Scratch 與 C 語言中的 Hello world:
講座 CS50 的附加資料:第 1 週(講座 3 和 4)- 3 #include int main(void) { printf("hello, world\n"); }
  • 講座 CS50 的附加資料:第 1 週(講座 3 和 4)- 4表示在 Scratch 中將精靈的「單字」印到漫畫氣泡中的函數,C 中有一個 printf 函數可以執行相同的動作,但沒有漫畫。
  • main - 英文 - “main”。程序的入口點。與...一樣講座 CS50 的附加資料:第 1 週(講座 3 和 4)- 5
無限循環
講座 CS50 的附加資料:第 1 週(講座 3 和 4)- 6 翻譯成C語言: while (true) { printf("hello, world\n"); } while(true)做同樣的事情:當(while)值為真(布林表達式「true」或「one」)時,循環繼續工作。這個循環將無限地運行。
在螢幕上循環顯示一個短語 10 次
Scratch 講座 CS50 的附加資料:第 1 週(講座 3 和 4)- 7 C for (int i = 0; i < 10; i++) { printf("hello, world!\n"); } i 是計數器變數;它的值由增量運算子 i++ 更改,在循環的每次迭代中將其加 1。最初,使用賦值運算子 = 為 i 賦值 0。 注意力! 與 Java 中一樣,在 C 中,相等由 ==(賦值運算子 =)表示。即a = 5表示變數a已被賦值5,(a= =5)表示布洛涅表達式(如果a等於5,則表達式為真,如果不等於,則為假) 。 當i「成長」到9時循環就會停止。很容易計算,循環會執行10次。因此,如果您需要重複某件事一定次數,可以在 C 中定義一個 for 迴圈 (int i = 0; i < 10; i++)。 另一個例子: 講座 CS50 的附加資料:第 1 週(講座 3 和 4)- 8 同樣的事情翻譯成 C: int counter = 0; while (true) { printf("%i\n", counter); counter++; }
  • 計數器將值儲存在 C 和 Scratch 中。在 C 中,我們設定 int counter = 0 而不是Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 9.
  • 為了澄清起見,我們將變數的類型標記為 int:i 是一個整數(來自英語的 integer,whole)。
  • 我們在第四行 printf 中使用的 %i 是一個佔位符,告訴我們列印十進制整數,就像我們告訴 printf 將佔位符替換為計數器變數所採用的值一樣。
布林表達式
Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 10 它是一樣的 (x < y) ((x < y) && (y < z))
狀況
Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 11 以及「狗屎」的等價物: Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 12 第一個難以理解的短語怎麼樣? 稍後在“庫”部分對此進行更多介紹。 #include
條件語句
這些人檢查某些條件(邏輯表達式,只能用「是」或「否」回答的問題)是否為真,如果是,則他們執行與該條件相關的一些操作。生活中的一個例子:如果下雨(假設下雨)而我在外面(下雨時我在外面),我會打開雨傘。 if (condition) { //исполнить, если meaning истинно } 一個更複雜的選項:如果滿足條件,則執行一個操作;如果不滿足,則執行另一個操作。 if (condition) { //выполнить действие } else { //выполнить другое действие, если condition ложно } 範例:如果您年滿 18 歲,請批准訪問。如果少於,則不予批准。 Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 12
選擇運算符
switch (n) { case const1: // если n equals const1, выполнить break; // condition совершилось — выйти из выбора case const2: // если n equals const2, выполнить break; ... default: // если n не equals ни одной из констант, выполнить break; } 範例:如果n = 50,則列印“CS50是計算機科學概論I”,如果n = 51,則列印“CS51是計算機科學概論II”,否則打印“對不起,我對那門課不熟悉!” switch (n) { case 50: printf("CS50 is Introduction to Computer Science I\n"); break; case 51: printf("CS51 is Introduction to Computer Science II\n"); break; default: printf("Sorry, I'm not familiar with that class!\n"); break; }
週期
while:檢查條件,然後在條件為真時執行操作 while (condition) { // выполнять, пока истина } do/while 的不同之處在於,第一次執行操作時不檢查條件,然後只檢查條件。如果條件為真,則重複該操作,直到條件變為假。 do { ) // выполнять, пока истина } while (condition); for 迴圈重複一個操作指定的次數。 Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 13 迴圈可以互相嵌套。在這種情況下,在外循環的每一步,內循環都會被完整執行。 Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 14
C 中的基本資料型別
основные типы данных в C
庫C
您可能已經想知道 C 程式的第一行意味著什麼: 它的作用是什麼?沒有它是否可以完成?#include 行做了一件非常重要的事情:它將已編寫的程式碼庫包含到您的程式中。連接的庫的名稱包含在尖括號 (<>) 中,並具有副檔名 (.h)。如果沒有庫,那麼任何操作,即使是最基本的操作,每次都必須一遍又一遍地描述。我們連結的圖書館#include 包含輸入/輸出功能。正是這個允許我們使用 printf() 函數列印到螢幕上。也就是說,如果我們沒有寫#include 行 ,但將 printf() 函數留在程式主體中;當我們嘗試執行它時,我們會收到錯誤!因為如果沒有這個函式庫,編譯器就不知道 printf() 是什麼。有標準庫,它們構成了語言的詞彙。printf()函數並不是電腦內建的,而是包含在C語言的標準庫中的,即之前有程式設計師編寫了它並包含在庫中。現在其他人可以使用它而無需重新發​​明輪子。為了讓編譯器「理解」它,我們連接 。CS50 流程中也使用了其他標準函式庫。例如,字串庫,它描述了字串的操作(確定長度、加法等)。與其他流行的程式語言相比,標準 C 函式庫的數量非常少。但也有一些自行編寫的、通常更為高度專業化的函式庫。是的,圖書館 專為 CS50 學生創建。 是時候做一個重要的說明了:除了使用自己的程式碼編寫程式和解決問題之外,優秀的開發人員還擁有另一項重要技能:了解已經編寫的工具以及使用它們(其他人的程式庫)的能力,以便不要浪費時間重新發明「輪子」。因此,如果您正在解決一個似乎很常見的乏味或複雜的問題,請學會問自己這個問題:“解決方案是其他人寫的嗎?” 很可能是這種情況,並且您可以在現有庫中找到此函數。用技術術語來說,函式庫是透過使用連結器組合目標檔案集合而產生的二進位檔案。目標檔案是編譯應用程式時獲得的帶有副檔名 (*.o) 的檔案。
C 庫的結構
Когда программист пишет библиотеку, code распределяется по двум типам файлов — заголовочный файл (header, расширение *.h) и файл реализации (implementation, расширение *.c). Заголовочный файл содержит code, описывающий ресурсы библиотеки, которые вы можете использовать. То есть описания переменных, функций, структур, типов и прочее. Если вам интересно, что содержит та or иная библиотека, нужно заглянуть именно в заголовочный файл. В терминале CS50 IDE (и других средах Linux) вы можете вызвать приложение less для просмотра файлов и открыть с его помощью интересующую вас библиотеку: less /usr/include/stdio.h Файл откроется прямо в терминале. Правда, для новичков он будет очень трудночитаемым. Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 15 Whatбы выйти из less, нажмите q на клавиатуре. Заголовочный файл не содержит code функций, что служит примером очень важного понятия — сокрытия данных or инкапсуляции. Пользователю системы незачем знать «внутренности» библиотек, ему достаточно, чтобы она работала. Если вы прошерстите stdio.h, то не найдете там реализации printf(), хотя How её использовать, вы уже знаете. Это сделано для того, чтобы защитить данные от вмешательства, которое порой может плохо отразиться на системе. Так, если кто-то изменит реализацию функции printf() в библиотеке, это отразится на всех тех программах, которые её используют. Любознательным будет интересно, где спрятана реализация. Согласно конвенции (соглашения, принятые в мире программирования) такой code хранят в файле с расширением (*.c). После компиляции библиотеки на основе двух файлов с одинаковым именем, но разным расширением создается an objectный файл, который собран так, чтобы создать файл с двоичным codeом библиотеки. Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 16 Author библиотеки передает программисту, который хочет её использовать, два file — с двоичным codeом, а также заголовочный файл. Таким образом, файл с исходным codeом программисту не нужен. Точнее, он может быть нужен, если программист хочет что-то поменять в самой библиотеке и перекомпorровать её под собственные нужды. Whatбы воспользоваться функциями библиотеки в своей программе нужно проделать следующее: 1. Включить заголовочный файл в программу с помощью строки #include В случае стандартных библиотек достаточно указать Name библиотеки в угловых скобках: #include <Name_библиотеки.h> Если библиотека, которую вы хотите подключить, лежит в той же папке, что и ваша программа, подключайте её следующим образом: #include “Name_библиотеки.h” 2.Присоединить бинарный файл для компиляции. Это очень важный шаг, поскольку, How мы говорor выше, заголовочный файл не содержит реализации элементов библиотеки. Whatбы это сделать, нужно вызвать компилятор clang с флагом –l и идущим непосредственно за ним названием библиотеки. Например, компонуем библиотеку cs50: clang hello –lcs50 Clang — один из компиляторов. Для компиляции можно также использовать уже знакомую вам программу make. По сути, она вызывает clang с определенными аргументами командной строки.
И снова Hello C: разбор синтаксиса простейших программ
Директива #include подключает библиотеку ввода/вывода . Программы в C состоят из функций, а те — из операторов и переменных. Функция — это кусок codeа, в котором уже есть or подаются Howие-то данные, а Howие-то данные получают в результате её исполнения. Фигурные скобки { } ограничивают тело функции — описание того, что она должна делать. printf() из стандартной библиотеки stdio выводит любую строку на экран. Строки заключаются в двойные кавычки, а символ “\n” означает перевод курсора на новую строку. Пример: функция «посчитать квадрат целого числа». Передаем функции данные, в нашем случае — число, которое нужно возвести в квадрат. Затем в ней прописывается алгоритм умножения числа на самое себя, и результат этого умножения она выдает на выходе. int sqr(int a) { return a*a; } int sqr(int a) — название функции. В скобках — её аргумент a, это то, что подается на вход функции. Это How переменная в уравнении. То есть, если мы хотим узнать квадрат числа 5, то мы вызовем нашу функцию в виде sqr(5) и получим результат 25. int — тип данных (от англ. integer — целые числа). Наша функция написана так, что мы не можем вызвать её с аргументом a = 5.5. Такая попытка выдаст ошибку, поскольку 5.5 — число дробное, а наше число должно быть целым. int перед именем функции означает тип, который должна эта функция возвращать. Он не обязательно совпадает с типом аргумента. Пример: функция, которая отнимает от целого числа 0.5: double bit_less(int a) { double b; b = a – 0.5; return b; } int main (void) — название главной функции. В одной программе может быть много функций, но, чтобы начать её выполнять, нужна функция под названием main. Слово void в скобках означает, что у этой функции нет аргументов. Внимание! main всегда возвращает int, но return для неё не обязателен. Пример функции не возвращающей значения: void sayhello(void) { printf(“hello everyone!\n”); } При вызове функции в главной программе, она выведет приветствие. Давайте напишем одну программу, в которой будет несколько функций. Тех, что мы уже создали выше. Две созданные нами функции вызовем через главную функцию main(). В C, How и любом языке, есть такой элемент, How комментарий or примечание в коле программы, предназначенное не для компьютера, а для понимания людей. Например, описание, что именно делает code. Компилятор комментариев не видит. Комментирование программ — очень важный момент, поскольку порой разобраться в чужом (и даже своем) codeе очень сложно. //пример однострочного комментария /** а это – многострочного **/ #include //функция возведения в квадрат числа a int sqr(int a) { return a*a; } //выводит приветствие void test(void) { printf ("hello everyone!\n"); } //главная функция int main(void) { test(); printf("%d\n", sqr(5)); } Почти всё, что есть в этой программе вы уже видели. Две функции — возведения в квадрат и приветствия и главная функция main, где мы последовательно вызываем эти две функции. В результате выполнения программы у нас сначала выведется приветствие, на следующей строке — квадрат 5. Обратите внимание, функция test() вызывается с пустыми скобками, потому что её аргументы определены How void.
Еще немного о вводе/выводе в C
Вы, наверное, уже успели заметить странные символы %d и %f в скобках оператора printf. Дело в том, что функция printf выводит данные в следующем обобщенном виде: рrintf ("управляющая строка", аргумент1, аргумент2,...); Управляющая строка содержит компоненты трех типов:
  • символы, которые выводятся на экран дисплея;
  • спецификаторы преобразования, которые вызывают вывод на экран очередного аргумента из последующего списка;
  • управляющие символьные константы.
Спецификатор преобразования начинается со знака % и заканчивается символом, задающим преобразование. Некоторые из таких символов:
  • с: meaningм аргумента является символ;
  • d or i: десятичное целое число;
  • f: десятичное число с плавающей точкой;
  • s: строка символов.
То есть, %d означает, что на экране появится целое десятичное, а %f — десятичное с плавающей запятой. What если нам нужно, чтобы пользователь ввёл данные с клавиатуры? Для этого можно использовать функцию scanf( ), прототип которой также лежит в библиотеке stdio. Whatбы считать с экрана вещественное число, в программе нужно написать строку scanf("%d", &a); Давайте перепишем нашу программу так, чтобы пользователь сам вводил число, которое нужно возвести в квадрат. Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 17
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION