JavaRush /Java Blog /Random-TW /哈佛 CS50:第一週作業(講座 3 和 4)
Masha
等級 41

哈佛 CS50:第一週作業(講座 3 和 4)

在 Random-TW 群組發布
哈佛 CS50:第一週作業(講座 3 和 4)- 1朋友們,您可以從研討會筆記中收集基本的理論資訊。在那裡,除了 C 基礎知識之外,它還講述瞭如何連接到特殊的雲端 IDE CS50(必須執行此操作才能運行和檢查任務),並描述了基本的必要 Linux 命令和語言結構。如果講座中提供的資料和有關 C 的註釋對您來說不夠,請轉向其他來源。例如,本文末尾列出的那些。在主題「附加資料」 中
  • 第一周目標
  • IDE CS50
  • 命令列和工作台更新
  • 在 IDE 中工作
  • 你好ç!
  • 蟲子?
  • 驗證檢查:check50測試
  • C 基礎知識:與 Scratch 的比較
  • C 中的基本資料型別
  • 庫C
  • 再次Hello C:最簡單程式的語法分析
  • 更多關於 C 中 I/O 的信息
本主題的材料:
  • 驗證資料輸入:cs50.h 函式庫的特殊函數
  • 任務1.智能計算用水量
  • 任務2.馬裡奧與我們同在!
  • 任務 3. 換零錢的時間
  • 如何驗證您的代碼並獲得分數
  • 程式碼資源
  • 附加文獻

驗證資料輸入:cs50.h 函式庫的特殊函數

為了讓本課程更加方便,我們開發了一個特殊的庫CS50,它特別具有處理使用者輸入資料的非常有用的功能。
  • GetString()讀取使用者輸入的字串;

  • GetInt()讀取使用者輸入的字串並檢查其是否包含整數;

  • GetFloat()讀取使用者輸入的字串並檢查其是否包含浮點數;

  • GetLongLong()讀取使用者輸入的字串並檢查其是否包含長實數。

任務1.智能計算用水量

哈佛 CS50:第一週作業(講座 3 和 4)- 2這是合乎邏輯的:你洗澡的時間越長,這個過程中消耗的水就越多。我們來算算多少錢?即使您的淋浴間幾乎沒有打開,每分鐘也會流出約 6 公升水。這是您隨身攜帶飲用的 12 瓶水。通常一個人洗澡大約10分鐘。總共需要120個半公升的瓶子來清洗。非常多!在water.c您的~/workspace/pset1. 程式應根據時間計算淋浴時使用了多少瓶水。那是:
  1. 該程式詢問用戶淋浴的分鐘數
  2. 使用者輸入一個正整數
  3. 程式顯示使用者使用的瓶子數量。
username:~/workspace/pset1 $ ./water
minutes: 10
bottles: 120
為了簡單起見,這次我們將假設使用者總是正確輸入分鐘數,也就是我們不檢查輸入的數字是否為正整數。稍後我們將學習如何寫支票,但現在這已經足夠了。要檢查程式是否正確運行,check50,您需要在終端機中輸入以下行:
check50 2015.fall.pset1.water water.c
如果您想查看課程人員編寫的程式如何water運作,請執行以下命令:
~cs50/pset1/water

任務2.馬裡奧與我們同在!

哈佛 CS50:第一週作業(講座 3 和 4)- 3你知道世界上最有名的水管工嗎?在任天堂的幫助下,這個虛構的留著小鬍子、戴著紅色帽子、略顯肥胖的傢伙已經成為幾代遊戲玩家的英雄。如果你不知道我們在談論誰,這裡有一個 1985 年經典遊戲的連結:相信我,它仍然很好,值得一試!您還可以找到適用於智慧型手機或離線模擬器的經典超級瑪利歐版本。我們需要所有這些來進行總體開發,不幸的是,這還不是一項任務;)。而任務是這樣的。在第一個馬裡奧關卡結束時,每個玩家都看到了這個半金字塔:mario.c在您的~/workspace/pset1. 我們的程式將繪製一個與您所看到的類似的半金字塔,但直接在控制台中繪製,沒有圖形:每個區塊將包含一個井號圖示(#)。即使您還不知道如何做,請相信我:這很容易。為了讓問題變得更有趣,讓我們加入使用 0 到 23 之間的非負整數來設定半金字塔高度的功能。圖中金字塔的高度被認為是最高位置,等於8。如果使用者輸入的數字錯誤,需要讓他再輸入一次。然後生成(使用 printf 金字塔)。請注意將半金字塔的左下角與終端視窗的左邊緣對齊,如下例所示。帶下劃線的文字是使用者自己輸入的內容。
username:~/workspace/pset1 $ ./mario

height: 8
       ##
      ###
     ####
    #####
   ######
  #######
 ########
#########
請注意,最右邊的兩列高度相同。現在還不值得生成管道、雲彩和馬裡奧本人 =)。至少對於這個任務來說。如果使用者輸入的數據不正確(輸入的不是數字,或者輸入的數字小於 1 或大於 23),程式應該要求他重新輸入數據,如下例所示,其中帶下劃線的文字是什麼用戶從鍵盤輸入。若要讀取輸入的字串,請使用GetInt. 它可以幫助檢查不正確的輸入,但並非在所有情況下都如此。
username:~/workspace/pset1 $ ./mario
Height: -2
Height: -1
Height: foo
Retry: bar
Retry: 1
##
若要編譯程序,請在終端機中輸入以下行:
make mario
或更透明但更長的版本:
clang -o mario mario.c -lcs50
之後,運行程式執行:
./mario
如果您想檢查程式是否正確運行,請運行check50
check50 2015.fall.pset1.mario mario.c
如果您想玩課程助理版本的馬裡奧,請輸入以下行:
~cs50/pset1/mario

任務 3. 換零錢的時間

哈佛 CS50:第一週作業(講座 3 和 4)- 4在我們的緯度,我們還沒有看到這種情況,但在美國,似乎有這樣的玩具,如圖所示:圓柱體是為不同直徑(和麵額)的硬幣設計的,它們由彈簧機構釋放,並且該裝置本身可以連接到兒童收銀員的腰帶上。但是,如果有人向收銀員支付大額帳單,會發生什麼事?想像一下,數硬幣換零錢會有多麻煩。為了最大限度地減少發行的硬幣數量,您可以使用所謂的「貪婪」演算法。根據美國國家標準與技術研究所(NIST) 的定義,它們總是在解決問題的每個步驟中找到最佳解決方案,並假設最終解決方案(從所有這些步驟中獲得)也將是最佳的。這是什麼意思?讓我們想像一下,一名收銀員欠顧客 41 美分的零錢,而他的腰帶上有幾筒硬幣,可以兌換面額為 25、10、5 和 1 美分的零錢。在「貪婪」演算法的指導下,收銀員會立即想要在第一步中給出最大值。此時,最優或最好的解決方案是捐出 25 便士。41-25 = 16。還剩 16 便士待支付。顯然,25 便士太多了,所以還剩下10。16-10 = 6。現在我們按照同樣的原理,先出5 便士,然後再出1。這樣,買家只會收到4 個面額為25 、10 的硬幣。 、 5 又 1 便士。事實證明,「貪婪」的分步發行貨幣指令不僅對於這種情況是最佳的,而且對於美國貨幣面額(以及歐盟)也是最佳的。也就是說,如果收銀員有足夠的任何面額的硬幣,演算法將發揮最佳作用,即它將從所有可能的情況中發行最少數量的硬幣。那麼,我們需要找零的最少硬幣數量是多少呢?這是我們的第三個任務。greedy.c在您的目錄中建立一個檔案~/workspace/pset1已知:面額為 25、10、5、1 分的硬幣 該程序應:
  1. 問用戶要給多少零錢
  2. 計算您可以執行此操作的最小硬幣數量
筆記:GetFloat我們將使用CS50 函式庫中的函數作為輸入,printf並使用標準 I/O 函式庫中的函數作為輸出。另外,程式必須檢查輸入的正確性。我們要求您使用GetFloat, 來允許使用者輸入以點分隔的美元和美分值。例如,如果我們欠 9.75 美元,使用者應該輸入 9.75,而不是 9.75 美元或 975。您必須確保使用者輸入有意義的數字。假設是非負數;函數本身對 thisGetFloat沒有幫助。如果使用者輸入錯誤,您需要要求他重複輸入,並僅使用正確的資料運行程式。請注意浮點數固有的不準確性。例如,0.01不能直接表示為float。嘗試使用格式化輸出,例如小數點後 50 位,使用以下程式碼:
float f = 0.01;
printf("%.50f\n", f);
順便說一句,在計算任何東西之前,將整個金額轉換為美分(同時將其從 轉換為floatint是合乎邏輯的,這將有助於避免很多錯誤和困難。為了確保我們的自動程式碼分析器能夠正確檢查您的問題,請確保您的程式輸出的最後一行不包含最小硬幣數量以外的任何其他資訊:後面帶有 \n 的整數(學習 JavaRush 的人)很清楚我們在這裡談論的是什麼=))。下面是程式結果的範例。
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
0.41
4
鑑於浮點數的性質,您可以忽略零並以 0.41 的形式輸入這樣的數字。當然,想要檢查程式是否可能完整輸入錯誤資料的使用者應該會看到類似以下內容的內容:
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
-0.41
How much change is owed?
-0.41
How much change is owed?
foo
Retry: 0.41
4
根據這些要求和您在上面看到的範例,您的程式碼很可能應該包含某種循環。如果在測試應用程式時發現循環不會停止,則可以使用 ctrl-c 組合中斷程序的執行(有時多次)。您已經知道如何編譯和執行程式。如果您想使用該實用程式檢查程式是否正常運作check50,請在終端機中輸入以下行:
check50 2015.fall.pset1.greedy greedy.c
如果你想使用課程助理製作的程序,請寫以下指令:
~cs50/pset1/greedy

如何驗證您的代碼並獲得分數

  1. 選項1

    如果檢查程式碼的正確性對您來說很重要,而不是獲得最終成績,則可以使用該命令檢查並修正它。

    check50 2015.fall.pset1.name name.c

    在CS50 IDE的終端行輸入?其中name是任務文件的名稱。

  2. 選項2

    如果您想獲得成績(與運行 check50 基本上相同,但要記住結果並用英語填寫一些表格,請按照以下步驟操作:

    • 第 1 步(共 2 步)

      1. 當應用程式準備就緒後,登入 CS50 IDE。
      2. 在 CS50 IDE 的左上角的檔案瀏覽器(而非終端機視窗)中,左鍵或以滑鼠右鍵按一下 hello.c 檔案(位於 pset1 目錄中的檔案),然後按一下「下載」。您應該會發現瀏覽器已載入 hello.c。
      3. 對水重複上述步驟。
      4. 對 mario.c 重複上述操作。
      5. 重複貪婪。c。
      6. 在單獨的選項卡或視窗中,登入CS50 提交
      7. 點選視窗左下角的提交。
      8. 在出現的視窗中的問題集 1 下,按一下上傳新提交。
      9. 在出現的視窗中,按一下新增檔案...。應該會出現一個名為「開啟檔案」的視窗。
      10. 導航至下載 hello.c 的位置。它通常位於“下載”資料夾中或預設分配給您下載的資料夾中。找到 hello.c 後,按一下它一次以對其進行標記,然後按一下「開啟」。
      11. 再次點擊“新增檔案...”,“開啟檔案”視窗將再次出現。
      12. 現在以同樣的方式找到文件water.c。單擊它,然後單擊“打開”(或“打開”)。
      13. 現在找到 mario.c。也用同樣的方法點擊打開。
      14. 一切與greedy.c 文件相同。
      15. 點擊開始上傳開始將檔案上傳到 CS50 伺服器。
      16. 在出現的畫面上,您將看到一個標有「未選擇檔案」的視窗。如果將滑鼠遊標移到螢幕左側,您將看到已下載的檔案清單。點擊每個以確認每個的內容。(無需單擊其他按鈕或圖示)。如果您確定已準備好發送文件進行驗證,請認為您已完成!如果您想自己再次檢查程式碼或修復任何問題,請返回 CS50 提交並重複這些步驟。您可以根據需要多次重新發送;僅評估最近提交的內容。
  3. 步驟 2(共 2 步)(不需要進行評估,如果 =))

    現在造訪https://www.edx.org/course/cs50s-introduction-computer-science-harvardx-cs50x,您可以在其中找到特殊表格。在其中,您需要回答幾個理論問題,然後點擊它們下方的「提交」。

帶星號的問題為必填:
  • 好吧,應該看到這個來了!簡而言之,什麼是圖書館?*(簡單描述一下什麼是函式庫)
  • 就幾句話來說,#include <cs50.h> 當你把它寫在某個程式之上時起什麼作用?*(出現在某些程式頂部的 #include <cs50.h> 行的作用是什麼?)
  • 您認為您在問題集 0:Scratch 上花了大約多少小時?
  • 您認為您在問題集 1:C 上花了大約多少小時?
  • 到目前為止,您對 CS50x 有什麼看法?*(您目前對CS50的看法,請選擇喜歡或不喜歡的選項)
  • 您是否透過 CS50s Facebook 群組 http://www.facebook.com/groups/cs50 向同學或工作人員尋求協助?*(你有沒有在Facebook群組中向其他學生或助理尋求協助)
  • 您是否透過 CS50s Subreddit http://www.reddit.com/r/cs50 向同學或工作人員尋求協助 *(您是否透過 Subreddit 向其他學生或助理尋求協助)
  • 您是否曾經透過 Twitter 使用@cs50 或#cs50 向同學或工作人員尋求協助?*(您是否在 Twitter 上使用 @cs50 或 #cs50 向其他學生或助教尋求幫助)。
朋友們,如果您有任何疑問,請在本指南下方的評論中留言。如果您尚未達到 JavaRush 5 級以接收訊息邀請,我們建議您這樣做。它是免費的、有趣的而且不是很困難。

代碼資源:

  1. 第三講

    http://cdn.cs50.net/2015/fall/lectures/1/w/src1w.zip

  2. 第四講

    http://cdn.cs50.net/2015/fall/lectures/1/f/src1f.zip

    http://cdn.cs50.net/2015/fall/lectures/1/f/src1f/

附加文獻

http://cpp.com.ru/kr_cbook - C 語言作者 Brian Kernighan 和 Dennis Ritchie 撰寫的經典 C 書籍的俄語版本。在狹窄的圈子裡被廣泛稱為 K&R。然而,該翻譯不是最新版本。閱讀前三章。材料會比您需要的多一點,但足以解決問題。 https://computer.howstuffworks.com/c.htm是 CS50 作者推薦的資源。用英語。頁 1-7、9和10。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION