C言語[備忘録]

#C言語
会社でC言語を扱うので学習したことをアウトプットしたいと思います。
初学者なので間違えて覚えているかもしれませんが暖かい目で拝見してください。

#基本的なフォーマット

フォーマットと記載していいのかわかりませんが覚えたことを記述します。

```
#include <stdio.h>
int main(void){
  return 0;
}
```
１行目```#include <stdio.h>```ですがprintf関数やputchar関数を使えるように取り込んでいますよ。と宣言している。Railsで言うGemみたいな感じかな？(ライブラリ関数)

２行目```int main(void)```C言語にはmain関数が一番先に実行されるため必ず必要になる。intは返り値のデータ型。(void)引数がないのでvoid=空。

3行目```return 0;```返り値。０は正常に処理が終わった証。

##printf関数
基本的な使い方。

```
#include <stdio.h>
int main(void){

printf ("%d",15+37);

  return 0;
}
```
コンパイラして実行すると「52」が表示されます。
表示させたい文字は""ダブルクォーテーションで囲みます。
"%d"は続いて与える値(15+37)の表示を10進数で行ってくださいと書式の指示をしている。この%の指示は表示によって変わります。
%f 小数点　　double型の表示(浮動小数点数)

#キャスト
型の変換をおこないます。

```
printf("それらの平均は%fです。\n",(a + b) / 2.0);
```
このような計算結果があったとする。しっかり実行できるが普段2.0なんて小数点を使っては行わないであろう。整数の2を使うはずだ。しかし

```
printf("それらの平均は%fです。\n",(a + b) / 2);
```
コンパイラエラーになってしまう．．．こんな時にキャスト(型を変換)を使う。
int・・・整数%d   (例)5.7は小数点を切り捨てたint型の5を生成する。
double・・・実数%f　(例)5は整数定数5からdouble型の5.0を生成する。

まずなんでエラーになったかと言うと
（ a + b ）は"int　+　int"答えもint型になる
/ 2 これも上記を踏まえたらint型になる
なので"%f"は"%d"にしないといけなくなる。(整数なので)
これでエラーは起こさないが答えが小数点を含む場合int型なので切り捨てられてしまいます。

そこで型変換をおこない解決します。

```
printf("それらの平均は%fです。\n",(double)(a + b) / 2);
```
見事、エラーもでず答えが出てきました。

```
 printf("それらの平均は%fです。\n",(a + b) /(double) 2);
```
こちらでもいけます。すなわち式にdouble型を仕込まないと%fは帰ってきませんよと言うのが証明できました。

###switch文
ある一つの式に複数の答えが複数あるときに使うswitch文

```
#include<stdio.h>
int main(void){
  
  int no;
  printf("整数を入力してください：");
  scanf("%d", &no);

  switch (no % 3){
  case 0 :puts("その数は3で割り切れます。");     break;
  case 1 :puts("その数は3で割った剰余は1です。"); break;
  case 2 :puts("その数は3で割った剰余は2です。"); break;
  }
  return 0;
}
```
入力が55の場合計算結果は1なのでcase 1に行き、その数は3で割った剰余は1です。と出力される。
この例題は必ず答えが出るのでcaseが三つでいいのですがcase外もある場合は

```
default : puts("hoge"); break;
```
と書けます。

###do文/while文
doは「実行せよ」,whileは「~のあいだ」
do文は()の中の式を評価した値が非0のである限り文を繰り返します。

```
#include<stdio.h>
int main(void){

  int retry;

  do{
    int no;
    printf("整数を入力してください:");
    scanf("%d",&no);

    if (no % 2)
      puts("その数は奇数です。"); /*非0*/
    else
      puts("その数は偶数です。"); /*0*/
    
    printf("もう一度？【Yes...0/No...9】:");
    scanf("%d",&retry);

  }while (retry == 0); /*retryが0で評価して得られる値は1なのでtrueで繰り返す*/
  
  return 0;
}
```
次はwhile文です。
先ほどは、繰り返しの継続条件をループ本体の実行後ではなく、実行前に判定するのがwhile文です。
・ do文...後判定繰り返し : ループ本体を実行した後に判定を行う。
・ while文...前判定繰り返し : ループ判定を実行する前に判定を行う。
```do文はループ本体は少なくとも一回は実行されるがwhile文はループ本体は一回も実行されない可能性がある。```

```
#include<stdio.h>
int main(void){

 int no;

 printf("正の整数を入力してください : ");
 scanf("%d", &no);

 while (no >= 0){  /*0になるまで終わりません*/
   printf("%d",no);
   no--;
 }
 printf("\n");

  return 0;
}
```

###for文
for文が好きな私です。
while文よりも簡潔かつ読みやすくなります。

```
for(A; B; C)
文
```

```
A;
while(B){
　文
  C;
}
```
このように明らかに読みやすさが違います。

それではfor文を使いカウントアップのプログラムを書きます。

```
#include<stdio.h>
int main(void){

  int i ,no;

  printf("正の整数を入力してください : ");
  scanf("%d",&no);

  for (i = 0; i <= no; i++)
  printf("%d", i);
  putchar('\n');
  
  return 0;
}
```
上記のプログラムで仮に8を入力すると
"012345678"まで出力される。処理 ⇨ i <= 8;
この処理を i < 8; とすると
"01234567"となる。この違いを覚えておく。

```
#include<stdio.h>
int main(void){

  int i = 0;
  int sum = 0;
  int num, tmp;

  printf("整数は何個ですか？ : ");
  scanf("%d", &num);

  for (i = 0; i < num; i++){
    printf("No.%d : ",i + 1);
    scanf("%d",&tmp);
    sum += tmp;
  }

  printf("合計値: %d\n",sum);
  printf("平均値: %.2f\n", (double)sum/num);
  
  return 0;
}
```
上記は合計値と平均値を求めるプログラムです。
カウントアップは普段0123...と0から使わないので```printf("No.%d : ",i + 1);```この行の　i + 1は1から表示させるよう補正しています。
sum += tmpは入力された数値をsumに読み込ませている。
```printf("平均値: %.2f\n", (double)sum/num);```
の%.2fは小数点第2位まで出力する。

次回もC言語について備忘録として投稿します。