JavaRush /Java Blog /Random-JA /ハーバード CS50: 第 1 週の課題 (講義 3 および 4)
Masha
レベル 41

ハーバード CS50: 第 1 週の課題 (講義 3 および 4)

Random-JA グループに公開済み
ハーバード CS50: 第 1 週の課題 (講義 3 および 4) - 1皆さん、基本的な理論情報はセミナーノートから収集できます。そこでは、C の基本に加えて、特別なクラウド IDE CS50 への接続方法 (タスクの実行と確認にはこれを行う必要があります)、および必要な基本的な Linux コマンドと言語構造について説明します。講義やノートで C に関する十分な資料が見つからない場合は、他の情報源を参照してください。たとえば、この記事の最後にリストされているものです。トピック「追加資料」 内
  • 最初の週の目標
  • IDE CS50
  • コマンドラインとワークベンチの更新
  • IDE での作業
  • こんにちはC!
  • バグ?
  • 検証チェック: check50 テスト
  • Cの基礎: Scratchとの比較
  • C の基本的なデータ型
  • 図書館C
  • こんにちは C です: 最も単純なプログラムの構文の分析
  • C の I/O についてもう少し詳しく
このトピックの資料:
  • 検証されたデータ入力: cs50.h ライブラリの特殊関数
  • タスク 1. 水の消費量をスマートに計算する
  • タスク 2. マリオも一緒です!
  • タスク 3. 小銭を受け取る時間
  • コードを検証してマークを取得する方法
  • コードリソース
  • 追加の文献

検証されたデータ入力: cs50.h ライブラリの特殊関数

このコースをより便利にするために、特別な CS50 ライブラリを開発しました。これには、特にユーザーが入力したデータを処理するための非常に便利な機能があります。
  • GetString()ユーザーが入力した文字列を読み取ります。

  • GetInt()ユーザーが入力した文字列を読み取り、その文字列に整数が含まれているかどうかを確認します。

  • GetFloat()ユーザーが入力した文字列を読み取り、その文字列に浮動小数点数が含まれているかどうかを確認します。

  • GetLongLong()ユーザーが入力した文字列を読み取り、その文字列に長い実数が含まれているかどうかを確認します。

タスク 1. 水の消費量をスマートに計算する

ハーバード CS50: 第 1 週の課題 (講義 3 および 4) - 2それは論理的です。シャワーを浴びる時間が長ければ長いほど、このプロセスでより多くの水が費やされます。いくらか調べてみましょう?シャワーがほとんど開いていない場合でも、1 分間に約 6 リットルの水がシャワーから流れ出します。これは飲料用に持ち歩く水のボトル12本です。通常、人がシャワーを浴びるのは約 10 分で、体を洗うには合計 0.5 リットルのボトルが 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: 第 1 週の課題 (講義 3 および 4) - 3世界で最も有名な配管工を知っていますか? 任天堂の協力により、赤い帽子をかぶった口ひげを生やした少しふくよかな架空の男は、数世代のゲーマーにとってヒーローになりました。誰のことを言っているのか分からない場合は、1985 年の古典的なゲームへのリンクをご覧ください。信じてください。このゲームは今でも優れており、チェックしてみる価値があります。クラシックなスーパーマリオのスマートフォン版やオフラインエミュレータもあります。一般的な開発にはこれらすべてが必要ですが、残念ながら、これはまだタスクではありません ;)。そしてその任務はこれです。マリオの最初のレベルの終わりに、すべてのプレイヤーはこの半ピラミッドを見ました。mario.cにファイルを作成します~/workspace/pset1。私たちのプログラムは、ご覧のような半ピラミッドをグラフィックスなしでコンソールに直接描画します。各ブロックはハッシュ アイコン (#) で構成されます。まだやり方がわからなくても、信じてください。簡単です。問題をさらに面白くするために、0 ~ 23 の非負の整数を使用して半ピラミッドの高さを設定する機能を追加しましょう。写真内のピラミッドの高さは最も高い場所にあると考えられます。つまり、8 に相当します。ユーザーが数値を間違って入力した場合は、もう一度入力するように依頼する必要があります。次に、(printf を使用してピラミッドを) 生成します。以下の例のように、ハーフピラミッドの左下隅をターミナル ウィンドウの左端に合わせるように注意してください。下線付きのテキストはユーザーが自分で入力するものです。
username:~/workspace/pset1 $ ./mario

height: 8
       ##
      ###
     ####
    #####
   ######
  #######
 ########
#########
右端の 2 つの列が同じ高さであることに注意してください。パイプ、雲、マリオ自身を生成する価値はまだありません =)。少なくともこのタスクに関しては。ユーザーが間違ったデータを入力した場合 (数値を入力しなかった場合、または 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: 第 1 週の課題 (講義 3 および 4) - 4私たちの緯度ではこれを見たことはありませんが、アメリカには写真に示されているようなおもちゃがあるようです。シリンダーは異なる直径(および金種)のコイン用に設計されており、バネ機構によって解放されます。 、本体自体は子供レジのベルトに取り付け可能です。しかし、誰かがレジ係に高額の請求書を支払った場合はどうなるでしょうか? おつりの硬貨を数えるのがどれほど面倒かを想像してみてください。発行されるコインの数を最小限に抑えるために、いわゆる「貪欲な」アルゴリズムを使用できます。米国立標準技術研究所 (NIST) の定義によれば、最終的な解決策 (そのようなステップの全体から得られる) も最適であると仮定して、問題を解決する各ステップで常に最適な解決策を見つけます。それはどういう意味ですか?レジ係が顧客に 41 セントの小銭を借りていて、ベルトに 25、10、5、1 セントの額面の小銭が入ったシリンダーを持っていると想像してみましょう。「貪欲な」アルゴリズムに導かれたレジ担当者は、最初のステップですぐに最大額を出そうとします。この時点で、最適または最善の解決策は、25 ペンスを配ることでしょう。41-25 = 16。支払いまであと 16 ペンス。明らかに、25 ペンスは多すぎるので、10 が残ります。16-10 = 6。今度は、同じ原理を使用して 5 ペンスを配り、次に 1 を配ります。したがって、購入者は、25、10、 5ペンスと1ペンス。通貨発行のための「貪欲な」段階的な指示は、この場合だけでなく、米国の通貨単位(そして欧州連合も)にとっても最適であることが判明しました。つまり、レジ係がどの額面であっても十分なコインを持っている場合、アルゴリズムは最もよく機能し、すべての可能なケースから最小数のコインを発行します。では、おつりを渡すために必要なコインの最低枚数はいくらでしょうか? これが 3 番目のタスクです。greedy.cディレクトリにファイルを作成します~/workspace/pset1与えられたもの: 25、10、5、1 セントの額面の硬貨 プログラムは次のことを行う必要があります。
  1. ユーザーにいくらお釣りを渡すかを尋ねます
  2. これを実行できる最小コイン数を計算します。
注記:GetFloat入力には CS50 ライブラリの関数を使用し、printf出力には標準 I/O ライブラリの関数を使用します。さらに、プログラムは入力の正確性をチェックする必要があります。GetFloatユーザーがドルとセントの値をドットで区切って入力できるようにするには、を使用するようにお願いしました。たとえば、9.75 ドルを借りている場合、ユーザーは 9.75 ドルや 975 ではなく、9.75 と入力する必要があります。ユーザーが意味のある数字を入力するようにする必要があります。非負の値としましょう; 関数自体はこれにGetFloat役立ちません。ユーザーが間違った入力をした場合は、入力を繰り返し、正しいデータのみを使用してプログラムを実行するように依頼する必要があります。浮動小数点数に固有の不正確さに注意してください。たとえば、0.01 を として直接表すことはできませんfloat。以下のコードを使用して、たとえば小数点以下 50 桁の書式設定された出力を使用してみてください。
float f = 0.01;
printf("%.50f\n", f);
ちなみに、何かを数える前に、全額をセントに変換する (同時に から に変換するfloat)ことが論理的でint、多くの間違いや困難を避けるのに役立ちます。自動コード アナライザーが問題を正しくチェックできるようにするには、プログラムの出力の最後の行に、最小コイン数 (後ろに \n が付いた整数) 以外の情報が含まれていないことを確認してください (JavaRush を学習している人)私たちがここで何を話しているのかはよくわかっています =))。以下は、プログラムの結果がどのようになるかを示す例です。
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
0.41
4
浮動小数点数の性質を考慮すると、ゼロを無視して、そのような数値を .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 のファイル ブラウザ内で、CS50 IDE の左上隅にある hello.c ファイル (pset1 ディレクトリにあるファイル) を左クリックまたは右クリックし、[ダウンロード] をクリックします。ブラウザに hello.c が読み込まれていることがわかります。
      3. 水についても繰り返します。c.
      4. mario.c についても繰り返します。
      5. 貪欲な.c についても繰り返します。
      6. 別のタブまたはウィンドウで、CS50 にログインし、送信します
      7. ウィンドウの左下隅にある「送信」をクリックします。
      8. 表示されるウィンドウの [問題セット 1] で、[新しい提出物をアップロード] をクリックします。
      9. 表示されるウィンドウで、「ファイルの追加…」をクリックします。「ファイルを開く」というウィンドウが表示されます。
      10. hello.c がダウンロードされた場所に移動します。通常、ダウンロード フォルダー、またはダウンロード用にデフォルトで割り当てられたフォルダーにあります。hello.c を見つけたら、それを 1 回クリックしてマークし、「開く」をクリックします。
      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: スクラッチに費やした時間は約何時間だと思いますか?
  • 問題セット 1: C に費やした時間は約何時間だと思いますか?
  • これまでの CS50x についてどう思いますか? *(現時点での CS50 についてのあなたの意見、好きか嫌いかを選択してください)
  • CS50 の Facebook グループ (http://www.facebook.com/groups/cs50) を通じてクラスメートやスタッフに助けを求めたことがありますか? *(Facebookグループで他の学生やアシスタントに助けを求めましたか)
  • http://www.reddit.com/r/cs50 の CS50s Subreddit を介してクラスメートまたはスタッフに助けを求めましたか *(Subreddit を介して他の学生またはアシスタントに助けを求めましたか)
  • @cs50 または #cs50 を使用して Twitter 経由でクラスメートやスタッフに助けを求めたことがありますか? *(@cs50 または #cs50 を使用して Twitter で他の学生や TA に助けを求めましたか)。
ご質問がある場合は、このガイドの下のコメントに書き込んでください。JavaRush レベル 5 に到達していない場合は、情報への招待を受け取ることをお勧めします。無料で面白くて、それほど難しくありません。

コードリソース:

  1. 講義3

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

  2. 講義4

    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として広く知られています。ただし、この翻訳は最新版ではありません。最初の 3 章を読んでください。必要な資料よりも少し多くなりますが、問題を解決するには十分です。 https://computer.howstuffworks.com/c.htmは、CS50 の作成者によって推奨されるリソースです。英語で。ページ 1~7、9、10。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION