CS50:Week1 C

CS50 for Japanese(開始3日目。なお、カウントは取り組んでいる日数)

 

Week1 C

映像授業を受講した。映像は2時間16分48秒。

今回の授業では、C言語を扱う。

C言語は先週のScratchよりもグラフィカルで遊び心があるもので、MITの学生が消火栓と水飲み場を接続した(曰く、MITで学ぶというのは消火栓から水を飲むようなものであるらしい)というできごとを基に、今日はそういった経験になるであろうとのことだった。

 

先週のScratchと基本的な考え方は同じである、しかしよりテキストベース、キーボードベースで多く表されることであるとのことだった。

また、プログラミングにおいて大事なことを3つ挙げ、それぞれの要素がどのように作用しあっているのかについて確認した。

  • 正確性、つまりコードが意図したとおりに正しく動作するかどうか。
  • デザイン、つまり、コードがどれだけ効率的であるか、どれだけエレガントか、論理的に読みやすいかに基づいて、不必要な繰り返しなしに、コードがどれだけ良く書かれているかを主観的に測定します。
  • スタイル、つまり一貫したインデントや記号の配置がされており、また美しく書式が設定されているか。スタイルの違いは、コードの正確さや意味には影響しませんが、視覚的な読みやすさには影響します。

良いコードは正しいことは当然で、それが効率的であり誰にとってもわかりやすいかということも同様に重要であるということであった。

 

CS50のために作られたIDE(Integrated Developed Environment )という環境が案内される。

特別に一から作ったものではなく、第三者クラウドツールに教育上役立つ機能を付加したらしい。

 

画面が二分割されていて、上部にコードを書いて、下部のターミナルウィンドウにおいては、コードの実行が行われるとのことだった。

新しいファイルを作って名前を付けて保存するあたりはいつも使っているワードとかエクセルとかそういったものと同じなんだなあと少し安心した。

C言語の拡張子は .c らしい。この辺はまだついていけそうだなという感じである。

 

講師がさらさらさらっと以下を書いたので分かっていないと前提が共有できていないのかと思ったらそうではなかった。

#include <stdio.h>

int main(void)
{
    printf("hello, world");
}

これから、それぞれの記号が何を表しているのかを学んでいく、自分はトレーニングしたり経験があるからわかるけど、それぞれの意味を正確に把握していこうとのことだった。

 

そしてここで確認があり、

前回において、コンピューターって何の言語を解するんだっけ?バイナリだよね、前回は数字とか画像とか文字とかそういったことを表示することに関して話してきたけど内蔵された機能については話していなくて、コンピューターのボンネットの下ではどうやって作用してるかというと、入力した英語をまずはバイナリに変換する必要があるよね、ということだった。

インプットとアウトプットの話をしたけど、

ソースコード(私たちが書いたもの)をコンピューターが読めるようにマシンコードにしてあげる必要があって、その間にあるブラックボックスって何だろうか、

正解はコンパイラというプログラム、とのことだった。

黄色や赤の表示がないとエラーがない、ということらしい。

 

関数はいうなればミニ・プログラムであり、引数はその関数への入力のことをいうとのこと。

様々な言語で句点で文章を終わらせるように、考えたことをセミコロンで終わらせないといけないとのこと。

ダブルクオーテーションは中に含まれる文字をそのまま表示したいときのもの。

C言語において = はget_stringで表され、代入(左辺と右辺が同じであるということ)と同じ考えに基づいてるよとの説明があった。

最初はいろんなことの記載忘れをしてイライラすることもあるだろうけど、いま1時間かけて理解したことは慣れればすぐにできるようになるし、根気強くやっていこうねということも確認された。

 

ここまで聞いていて、自分が新たな外国語をやるときとは違う頭の使い方、やり方をしなければならないな、ということに気づいた。とりあえず語彙を叩き込んで多くの文章に触れるというやり方をしていると、とてもじゃないけどプログラミング言語は習得できないであろうと思う。

 

関数については、以下の通り特徴が確認された。

また、printf関数がなぜprint関数でないかということについては、書式化された(formatted)ものだから、という説明もあった。

  • 関数には、次の2種類の出力もあります。
    • 画面に印刷されるものなどの副作用
    • 戻り値は、プログラムに返される値で、後で使用したり保存したりすることができます。
      • 例えばScratchの 「ask」 ブロックは、「answer」 ブロックを作成します。
  • 「ask」 ブロックと同じ機能を使用するには、ライブラリ (すでに作成されているコードの集合) を使用します。CS50 Libraryには、すぐに使用できる基本的で簡単な関数が含まれています。例えば、get_stringはユーザに文字列あるいはテキストのシーケンスを問い合わせ、それをプログラムに返します。get_stringは、 What's your name?などの入力をユーザーのプロンプトとして取り込みます。次のように変数に保存する必要があります。

ここからはもうずっと具体的なコードのお話が続いていった。

頑張ってついていくので精一杯であんまりメモとかNotes参照しながらできてない。

 

printf("hello, %s", answer);
  • %s書式コード(変換指定子)と呼ばれます。これは単に、プレースホルダ%sがある変数をprintf関数に代入するという意味です。上記の場合使用する変数はanswerで、printfに別の引数として与え、最初の引数とコンマで区切ります (printf("hello, answer")は文字通りhello, answerを毎回出力します) 。

このへんとか

printf("hello, %s\n", answer);
  • \nエスケープシーケンス、または他の特定のテキストを表すテキストの例です。

このへんは、自分の記憶の傾向とかを鑑みるとかなり意識していないと適切に使用できない気がしている。

 

個人的には、40億の話(下記引用)がすごく面白い、というか考えたことがない種類のお話だなと思った。

#include <cd50.h> 
#include <stdio.h>

int main(void)
{
    int x = get_int("x: ");
    int y = get_int("y: "); printf("%i\n", x + y); }
  • 使用するライブラリのヘッダファイルをインクルードし、get_intを呼び出してユーザから整数を取得し、x およびyという名前の変数に格納します。
    • printfで、整数%iプレースホルダの後に改行を出力します。xyの合計を出力したいので、printfで文字列に代入するために+ yを渡します。
    • 保存し、ターミナルでmake additionを実行してから、./additionでプログラムが動作することを確認します。整数以外の値を入力すると、get_intが再び整数を要求します。4000000000のような大きな数字を入力しても、get_intがプロンプトへの入力を促します。これは、多くのコンピュータシステムと同様に、CS50 IDEのintは32ビットであり、約40億の異なる値しか含むことができないためです。整数には正と負があるので、intの正の最大値は約20億、負の最小値は約20億となり、合計で約40億となります。

 

あと、以下については全く知らないことだったので終わったら検索しようと考えた。

  • Y2K問題が発生したのは、1998年の98、1999年の99のように、多くのプログラムが暦年を2桁だけで格納していたためですが、2000年が近づくと00しか格納しなくなり、1900年と2000年の間で混乱が生じました。
  • 2038年には、時間を追跡するためのビットもなくなります。何年も前に、1970年1月1日以降の秒数を数えるために32ビットを標準のビット数として使用することを決めた人がいたためです。しかし、32ビットで正の数を表すとすると、40億までしか数えることができません。2038年には、ソフトウェアをアップグレードしない限り、その制限に達するでしょう。

 

私見ではあるが、数学ができるかできないでプログラミング言語の習得具合はかなり変わってくる気がする。自分はあまり数学は得意ではないものの好きだったので、考えるのが楽しいトピックがあったり、直感が外れなかったりするが、嫌いである場合はかなり嫌な時間になりそうである。

 

今回のC言語についての講義は正直、ついていくだけで精一杯でその後の発展とか、そのほかへの活用等を検討する間もなく進んでいった。

次回以降もなんとかついていけるといいなあというのが今の率直な感想である。

 

本講義のNotesは以下。

https://cs50.jp/x/2021/week1/notes/