cs50x 2022まとめてみた【Week1】

## C
> 今日はスクラッチじゃなくてC言語っていうのをやっていくで。重要なものだけをいいとこ取りして解説していくから、そないに緊張せんでええよ。

C言語に入っていくの早いですね〜

>　コードの質を評価するには以下の三つの項目を考えるんやで。
1,正確さ　問題を解決できるか
2,設計　どれだけ効率的で読みやすいか
3,スタイル　どれだけ正しくフォーマットに沿っているか

なるほど〜

> 画面にHello worldを出力させるプログラムをC言語で書くとどうなるかをとりあえず見せるで。

```C:hello.c
#include <stdio.h>

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

## IDEs, compilers, interfaces
> ところでさっき書いたプログラムは機械には理解できへんから機械が理解できる言葉に変換する必要があるな？
そこでこのIDE（統合開発環境)っちゅうのをつかうんや！これを使えば書いて翻訳して実行が直ぐにできるんやで！
ちなみにこのソースコードからマシン語に翻訳をしてくれるプログラムはコンパイラって言うんやで。

この後の説明ではクラウドベースのVScodeにアクセスしてコマンドラインからmakeコマンドを使ってコンパイルしてみるみたいなことをやっています。
ここでは解説を省略します。それとここから先の話はcs50が用意したクラウド上で行われていることが前提ですのでよくわからない所は飛ばしてください。

## Functions, arguments, return values, variables
ここではscratchのどの部分がc言語に置き換えられるかみたいなのも話しているのですが、scratchに詳しくないので省きます。
> 関数の出力には目に見える変化を引き起こすやつと返り値を返すやつがあるんやで！
ちょっと返り値を返すやつの例をだすよっと
`string answer = get_string("What's your name? ");`
これを実行するとコマンドプロンプトにWhat's your name?と表示されて何かを入力した場合
その何かはanswerに代入されるわけやな。ほんで最後にstringという型を示すわけや。この型というのはバイトを解釈する方法やで。

ここから少しエスケープシーケンスやコンパイラのエラーについて話した後、

> C言語に標準で付属してない機能を使う場合はライブライをロードしないといけないんや。
ライブラリちゅうのは他の人が書いた便利な拡張機能セットみたいなもんやで。
printf関数が使えるのも<stdio.h>からロードしてるからなんやな！
ちなみにこのstring型とかは<cs50.h>っていう独自のライブラリからstring型とかget_string関数をロードしてるんで標準ではないで！

printfのプレースホルダー(一時的な名前)だったりテクストエディタに色をセットする方法だったりを話してます。

## main, header files, commands
> C言語ではmain関数のみが実際に実行される関数やで！

ふ〜んな感じですね。

## Types, format codes, operators
ここでは変数に使用できるデータ型について説明してますね。
いろいろあるな〜

- bool, a Boolean expression of either true or false
- char, a single character like a or 2
- double, a floating-point value with more digits than a float
- float, a floating-point value, or real number with a decimal value
- int, integers up to a certain size, or number of bits
- long, integers with more bits, so they can count higher than an int
- string, a string of characters
- …

デフォルトのC言語にはstring型はないのでお気をつけ遊ばせ...

## Variables, syntactic sugar
> シンタックスシュガーってのは別名糖衣構文で、挙動は変わらないがより簡単に書ける書き方を指すで〜

ほへ〜

## Calculations
> 再利用する可能性のある関数かよく考えて書きな〜

とかコメントの書き方について解説してます〜
C言語ではコメントは`//コメント`みたいに書けますね。

## Conditionals, Boolean expressions
```C:conditionals.c
if (x < y)
{
    printf("x is less than y\n");
}
else if (x > y)
{
    printf("x is greater than y\n");
}
else if (x == y)
{
    printf("x is equal to y\n");
}

```

みたいな感じです
これは上から順に実行されていきます。
条件に引っ掛かったらそこの箇所が実行されて終了します。

> マジックナンバーっていうのは自分以外わからん、数日経ったら自分もわからなくなっちゃう適当に設定した数字の事やで〜
それとC言語ではconst（定数)を使う場合は変数名をすべて大文字にする必要があるんやで〜

てな感じです。


## Loops, functions
While文
```C:while.c
while (true)
{
    printf("meow\n");
}
```
for文
```C:for.c
for (int i = 0; i < 3; i++)
{
    printf("meow\n");
}
```
for文で作成した変数iはfor文内でのみアクセス可能です

独自の関数の作成
```C:selfMadeFunction.c
#include <stdio.h>

void meow(void)
{
    printf("meow\n");
}

int main(void)
{
    for (int i = 0; i < 3; i++)
    {
        meow();
    }
}
```
実際に実行される関数はmain関数ですが、main関数内で他の関数を呼び出すことはできますね〜

main関数より下に関数を定義したい場合はプロタイプ宣言をしよう。
```C:prototype.c
#include <stdio.h>

void meow(void);

int main(void)
{
    for (int i = 0; i < 3; i++)
    {
        meow();
    }
}

void meow(void)
{
    printf("meow\n");
}

```

> それとな.hとつくファイルはヘッダーファイルって言うんやけど、ここには実際の関数は書かれていなくてプロトタイプ宣言みたいのがいっぱい乗ってる感じなんやで。




## Mario
入力した数分、?と出力されるプログラム
```C:printQuestionMark.c
#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int n;
    do
    {
        n = get_int("Width: ");
    }
    while (n < 1);

    for (int i = 0; i < n; i++)
    {
        printf("?");
    }
    printf("\n");
}
```
２次元ループ(mario.c)プログラム
```C:mario.c
#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int n;
    do
    {
        n = get_int("Size: ");
    }
    while (n < 1);

    // For each row
    for (int i = 0; i < n; i++)
    {
        // For each column
        for (int j = 0; j < n; j++)
        {
            // Print a brick
            printf("#");
        }

        // Move to next row
        printf("\n");
    }   
}
```
shellで動かしてみる
```bash
$ make mario
$ ./mario
Size: 3
###
###
###
$

```

なぜmarioかは全然わからないですね...

## Imprecision, overflow
型が保持できる値の範囲が違うのでオーバーフローには気をつけろよって言うのと、
型によって表せないものは近似値になるから不正確さがあるよって話です。

>3bitしかない場合、111までしか表せないことになるが、これを1000としようとすると、4bit必要なことになりこれは保持できないので000に...
これを整数オーバーフローという。

ここから後は2028年問題やY2K問題について解説されてます。
> 2028年問題
32bitsで表せる一番大きい数が2147483647、2進数でいうと01111111111111111111111111111111
これに１足してみると10000000000000000000000000000000(-2147483648)になってしまう。

1970年1月1日以降、秒数をカウントするための標準ビット数として32ビットを使用するって決めたんですけど、そろそろ32bitじゃ効かなくなりそうで...
まあ、でも最近は64ビットが使われてきているので大丈夫でしょう〜

*値の不確実性の対処法例*
```C:round.c
#include <cs50.h>
#include <math.h>
#include <stdio.h>

int main(void)
{
    float amount = get_float("Dollar Amount: ");
    int pennies = round(amount * 100);
    printf("Pennies: %i\n", pennies);
}
```

mathライブラリを使うと良さそうですね〜

# Shorts　ショート解説
なんと今回はショート解説動画がありました。
トピックは以下の通りです。
- Data Types
- Operators
- Conditional Statements
- Loops
- Command Line


## 最後に
いやあ長かったですね....
結構飛ばし飛ばしになりましたがなんとか終わりましたね...
以上でweek1でした〜


読んでくれてありがとうございます！
ではまた！

## 注意
ここに書かれているものはあくまで参考として捉えるのを推奨し、内容を保証するものではないことをここに明記します。