とりあえずC言語を入門してみた 

##概要
この記事はC言語の初級レベルを主に記載しています。なお、コンパイラやエディタですが各自で準備をお願いします。（※なお、筆者に余裕があれば別の記事で**「Windows編とMac編のC/C++環境設定のやり方」**を記載していきたいと思います。)


##### 1)C言語の"Hello, World"をしてみた

```
index01.c
-----------------

#include <stdio.h> <--ヘッダーファィル
int main(void){_______________
                              |   
   printf("Hello, World");    |ブ      <<|
                              |ロ    <<<<|<<<| 本体
   return 0;                  |ッ      <<|
} ____________________________|ク    

```

**解説**　　　　　　　　　　　　　　　　
C言語のプログラムはヘッダー部分と本体部分に分けることができます。
**・自分がやりたいと思っている固有の仕事＝本体
・その仕事を行うために必要な下準備＝ヘッダーファィル**

{}で囲まれたところが、１つの**ブロック**であることを示しています。
printfは標準出力といって文字列をコマンド上に表示するためです。
return文は{}で囲まれたブロックから抜けだすための指示です。


##### 2)特殊文字で文字列を指示してみた

```
index02.c
-----------------


int main(void){
    printf("¥a");
    printf("¥b");
    printf("¥r");
    printf("¥t");
    printf("¥'");
    printf("¥"");
    printf("¥?");
    printf("¥¥");
}

```


|特殊文字|意味|
|-----|-----|
|¥a|音を鳴らす|
|¥b|カーソルを左側に１文字ずらす|
|¥n|改行|
|¥r|行の先頭に戻る（行動復帰)
|¥t| タブ|
|¥'|'を表示する|
|¥"|"を表示する|
|¥?|?を表示する|
|¥¥|¥を表示する|


##### 3)コメントは読む人にやさしく

```
index03.c
-----------------
/*こんにちは*/

/*テスト
 *こちらはコメント用紙です。
 *こちらはコメント用紙です。
 *こちらはコメント用紙です。
 */

##### 4)情報を挿入して表示してみよう

```

```
index04.c
-----------------

int main(void){
  printf("my old is %d .", 21);
  return 0;
}

=> my old is 21

```
情報を指定した形式へ変換するので、**変換指定**と呼ばれます。
###### おもな変換指定

|データーの形|変換指定|
|------|------|
|整数（符号付き）|%d|
|整数（符号なし）|%u|
|実数|%f|
|文字|%c|
|文字列|%s|

##### 4)足す、引く、かける、割るを表現
**Ｃ言語で使う算術演算子**

|演算子の種類|算術演算子|
|-----|-----|
|足し算記号|+|
|引き算記号|-|
|かけ算記号|*|
|割り算記号|/|
|剰余の記号|%|

>**※数の種類のおさらい**
**整数**　０と１を加えていくか、減じていくかすることで得られる数の総称。 ー３、ー２、ー１、０、１、２、３
**実数** 整数と、整数と整数の間にある無数の数の総称。数値線上の点のすべて。一般的には少数点を用いて、**整数部**、**小数部**のように表記する。
**少数** １より小さい値の表記法

##### 5)変数を使った計算をしてみる
```
index05.c
-----------------
int main(void) {
 int a; <-- 変数の宣言
 a = 80;
 printf(a); <-- 80
 a = 50;
 printf(a); <-- 50
 return 0;
}

```

>**変数**とは
変化する情報のこと。また変数に情報を入れることを**代入**といいます。

事前準備なしでいきなり変数を使えるプログラミング言語もありますが、Ｃ言語では変数の名前ばかりか、格納するデータの型まで事前に言っておかないと使えないようです。これを**変数の宣言**と呼びます。

**主な変数の形**

|カテゴリ| 種別 | 型名 | 格納できる範囲 | メモリ上のサイズ | 
|------|-----|----|-------|-----------|
|文字型|符号ありの文字型|signed char|-128~127|1バイト|
|文字型|文字型|char|-128~127|1バイト|
|文字型|符号なしの文字型|unsigned char|0~255|1バイト|
|整数形|短い整数型|short int|-32768~32767|2バイト|
|整数形|符号なしの短い整数型|unsigned short int|0~65535|2バイト|
|整数形|整数型|int|-2147483648~2147483647|4バイト|
|整数形|符号なしの整数型|unsigned int|0~4294967295|4バイト|
|整数形|長い整数型|long int|-2147483648~2147483647|4バイト|
|整数形|符号なしの長い整数型|unsigned long int|0~ 429967295|4バイト|
|浮動小数点|単精度浮動小数点数型|float|3.4E - 38 ~ 3.4E + 38 |4バイト|
|浮動小数点|倍精浮動小数点数型|double|1.7E - 308 ~1.7E +308|8バイト|
|浮動小数点|拡張倍精度浮動小数点数型|long double|1.7E - 308 ~1.7E +308|8バイト|


##### 6)オペランドと演算子
>計算の対象をオペランド、計算するものを演算子と呼びます。
a+1では、aと1がオペランド、＋が演算子です。
演算子には優先順位があります。算数で習った「掛け算は足し算を優先する」とかと一緒です。演算子ごとの優先順位は巻末の付録に掲載してあります。
同じ優先順位の演算子は左から計算（C言語では**評価**と呼びます。）していきますが、計算順序の変更を行いたいときは、算数と同じで（）を使います。

##### 7)予想外の内容を変数に入れる
```
index06.c
-----------------
int main(void) {
  int a = 0;
  int b = 0;

  printf("計算機"\n);
  printf("掛け算");
     scanf("%d",&a); <-& アドレス演算子
     scanf("%d",&b);
  printf("%d, %d = %d", a, b, a*b);
 
  return 0;

}
```



中に入る情報もあらかじめ予想できないものにしてみましょう。そう、使う人にキーボードから入力してもらうのです。
キーボードからの入力を受け付ける指示は、何種類もあります。入力に使う関数と出力に使う関数はペアになっていて、以下のようなものがあります。

**主な入力/出力関数**

|入力|出力|
|---|---|
|1文字入力 getchar| 1文字出力 putchar|
|1行入力 gets | 1行出力 puts|
|書式付き入力 scanf | 書式付き出力 printf|


##### 8)人生にも分岐があるようにプログラミングにもある
```
index07.c
-----------------
#include <stdio.h>

int main(void) {
  int a  = 0;
  printf("奇数か偶数かを判定するプログラムです\n");
  printf("整数を入力してください\n");

  scanf("%d", &a);

  if (a%2 == 0) printf("これは偶数です");
  else if (a%1 == 0) printf("これは奇数です");
  else printf("どちらでもないです");

  return 0;

}
```
**関係演算子**　2つの対象の関係を調べるもの

|演算子|意味|
|---|---|
|==| 左と右が等しい|
|!=| 左と右が等しくない|
|<| 右の方が大きい|
|>| 左の方が大きい|
|<=|左右が等しい、もしくは、右の方が大きい|
|>=|左右が等しい、もしくは、左の方が大きい|

##### 9)スイッチのようにやることを切り替えるswitch文

```
index08.c
-----------------
#include <stdio.h>

int main(void) {
  int a = 0; //利用者に数字を入力してもらう変数
  
  printf("血液型占いにようこそ！\n");
  printf("A型なら１　B型なら２　O型なら３　AB型なら４入力してください\n");
 
  scanf("%d" ,&a);

  switch (a) // 条件式
  {
     case 1: // 1のときにやること
           printf("几帳面ですね");
           break;
     case 2: // 2のときにやること　
           printf("天然ですね");
           break;
     case 3: // 3のときにやること
           printf("燃える系ですね");
           break;
     case 4: // 4のときにやること
           printf("好奇心旺盛ですね");
           break;
     default:
           printf("ちゃんとやってください");
           break;
  }

  return 0;

}
```

どのcaseにも当該しないばあいはdefault

##### 10)論理演算子を使うと複雑の条件をシンプルに表現できる
複雑な条件分岐を、if文を入れ子にせず書く方法として、**論理演算子**を使うこともできます。

|論理演算子|使い方|意味|
|--|--|--|
|&&|a&&b|かつ(AND)|
|//|a//b|または(OR)|
|!|!a|ではない(NOT)|

##### 11)複雑は条件式を書いてみよう

```
index09.c
-----------------

#include <iostream>
int main(void) {
  int a=0; //好感度
  int b=0; 
  int c=0;

  printf("1=あいうえお");
  printf("2=あいうえお");

  scanf("%d", &c);

  if(c == 1) b=2;
  if(c == 2) b=1;

  printf("1=");
  printf("2=");
  printf("3=");
  printf("4=");
  
  scanf("%d", &c);

  switch(c){
     case 1; a=10;
        break;
     case 2; a=4;
        break;
     case 3; a=-10;
        break;
     case 4; a=100;
        break;
   }
   if (a>5 && b==1) printf("toolend");
   if (a>=5 && b!=1) printf("friend");
   if (a<5 && b==1) printf("oniend");
   if (a<5 && b!=1) printf("Backend");
 
   return 0;
}

```

##### 12)決まった回数の繰り返しを実行する
```
index10.c
-----------------
for (下準: 繰り返す条件: 1回繰り返すごとにやること)
{
  繰り返す内容；
}


#include <stdio.h>

int main(void){
  int a;

for( a=1; a<=10; a=a+1)
{
 printf("hello world"0;
}
 return 0;

}
```

##### 13)入れ子構造（ネスト化）

```
index11.c
-----------------

#include <stdio.h>

int main(void) {
   for( int a=1; a<= 10; a=a+1 )
   {
      for( int b=1; b<=a; b=b+1 )
      {
         printf("*");
      }
      printf("\n");
   }
   return 0;
}

```

##### 14)回数じゃない条件による繰り返す

```
index12.c
-----------------

while(繰り返す条件)
{
    繰り返す内容;
}

#include <stdio.h>

int main(void){
   int a = 7;
   int b = 0;
   printf("数あてゲーム\n");
   printf("数字を入れてください");
   scanf("%d", &b);
   
   whil(a != b)
   {
     　printf("はずれ");
       scanf("%d",&b);
    }

    printf("正解");
    return 0;

}
```

##### 15)最低でも１回は繰り返しを実行する

```
index13.c
-----------------
do
{
  繰り返す内容
} while (繰り返す条件)


#include <stdio.h>

int main(void) {
  int a =7;
  int b =0;
  printf("数あてゲーム");
  printf("整数入力");
  
  do{
    scanf("%d", &b);
    printf("はずれ");
   } while (a != b);
    printf("正解");
    
    return 0;
}

```

##### 16)変数をまとめて扱う配列

例えば友達の好感度を管理するプログラムを考えてみましょう

```
index14.c
-----------------

int suzuki = 30;
int sato = 20;
int tanaka = 5;
int furukawa = -10;
int ban = 15;
```
これをクラスの人数分やるとしたら、プログラムが書きたくなります。
こんなときに便利に使えるしくみ、**配列（配列変数）**があります。配列変数はグループのようなもので、**添え字**と呼ばれる管理番号を使って、たくさんの変数を一緒くたに扱うことができます。


```
index14.c
-----------------

#include <stdio.h>

int main(void){
  int group[5];

  group[0] = 30;
  group[1] = 31;
  group[2] = 32;
  group[3] = 33;
  group[4] = 34;
  group[5] = 35;


  printf("%d\n",group[0]);
  printf("%d\n",group[1]);
  printf("%d\n",group[2]);
  printf("%d\n",group[3]);
  printf("%d\n",group[4]);
  printf("%d\n",group[5]);

  return 0;
}

```

>**初期化**
変数をつかったとき、一緒に値を代入してしまうことを**初期化**といいます。初期化しないと、変数の中身は不定な状態です。


##### 17)配列への代入を考える

```
index15.c
-----------------

#include <stdio.h>

int main(void){

  int group[5] = {30, 20, 5};

  printf("%d\n",group[0]);
  printf("%d\n",group[1]);
  printf("%d\n",group[2]);

  return 0;
}
```

##### 18)できることが広がる多次元配列

配列には多次元配列という種類があります。

土地の種類を表示する

```
index16.c
-----------------

#include <stdio.h>

int main(void){

  int a[3][3];

  a[0][0] = 5;
  a[0][1] = 5;
  a[0][2] = 5;
  a[1][0] = 5;
  a[1][1] = 5;
  a[1][2] = 4;
  a[2][0] = 3;
  a[2][1] = 3;
  a[2][2] = 2;


  for(int i=0; i <=2; i=i+1) {
     for(int j=0; j<=2; j=j+1){
        printf("%d",a[i][j]);
     }
     printf("\n");
  }

  return 0;
}
```



##### 19)重複する処理をまとめる
プログラムが大きくなると同じような処理があちこちに登録するようにないります。これをプログラムすると大変だし、ミスが入りやすくなってしまいます。そんなときは一定の処理をまとめておいて一言で呼び出せる**関数**を使います。


```
index17.c
-----------------

#include <stdio.h>

void ayamaru(void)
{
  printf("ごめんなさい\n");
  return 0;
}


int main(void){
   printf("岡さん\n);
   ayamaru();
   
   return 0;
}
```

>**Point**
・処理を依頼する関数に渡す情報を**引数**という
・引数は関数を作る際に型を宣言しておく必要があります。
・引数がない場合はvoidと書く
・printf,scanfなどＣ言語であらかじめ用意されている関数を**標準ライブラリ関数**と呼ぶ
・標準ライブラリ関数は、stdio.h、math.h、time.hなどのヘッダーファィルで宣言されているので、これをプログラムの先頭で読み込むことにより、使用できる。


##### 20)引き渡す情報型とは
例えば謝る回数を引き渡す必要があって、５が引き渡されています。
この引き渡す情報のことを**引数**といいます。

```
index17.c
-----------------

#include <stdio.h>

void ayamaru(void)
{
  for(int i=1; i <=a; i = i+1; ) printf("ごめんなさい\n");
  return;
}

int main(void){
   printf("岡本くん、気持ち悪いからあってに行って\n");
   ayamaru(5);

   return 0;
}

```

##### 21)戻り値の型とは

関数の戻り値の型とはどういうことかというと関数が仕事をした結果を呼び出されたところに持って帰る気のうのことです。
持って帰る値を**戻り値**と呼びます。

```
int ayamaru(int a)
{
   for(int i= 0;  i<=a; i=i+1) printf("ごめん\m");
   return 5; <------------------------------------------持って帰る情報を指定する
}

```

>**Point**
・関数が処理の結果として渡す情報を**戻り値**という
・戻り値の型は、戻り値の種類を合わせて、関数を作るときに宣言しなければなりません
・呼び出されている戻り値を変数に格納することで、戻り値を活用することができる
・戻り値は固定値ではなく、変数とすることも可能。


##### 22)引数にまつわる知識あれこれ

```

b = ayamaru(5);--渡す側
                ↓
int ayamaru(int a)渡される側
{
 for(int i=1; i<=a; i=i+1) printf("ごめん\n");
    return 7;
}

```

>**Point**
・引数は２種類あり、情報を渡す側のものを**実引数**、渡される側のものは**仮引数** という
・仮引数を関数内で変更しても、オリジナルである実引数には影響せず、呼び出したときのままとなる 

##### 23)アドレスを使ってデーターを参照するポインタ
プログラムを使うメモリ上のデータは場所を表すアドレスによって管理されています。どのアドレスにデータを置くかは通常はパソコンが自動的に管理してくれます。しかしポインタを使えばプログラマもアドレスを使った処理が書けます。

>**Point**
・プログラムやデータはメモリに存在する。
・メモリにはアドレスが振られている。
・アドレスを指定して直接メモリをいじるのは、OSが必要とするデータを上書きするなどの危険を伴う。
・そのためプログラマは変数を宣言するだけにして、その変数をメモリ上のアドレスに割り振るのは管理しているパソコンに任せた方が安全。
・そのためプログラマは変数を宣言するだけにして、その変数をメモリ上のアドレスに割り振るのは管理しているパソコンに任せた方が安全。
・ただし熟練のプログラマはメモリを直接いじることで、プログラマの幅を広げることができる

##### 24)ポインタの基本
```
#include <stdio.h>
int main(void) {
   int a = 10;
   
   printf("変数aの中身は、アドレス%pに格納されています。",&a);

}
```

**%p** は、アドレスを表示するための変数指定です。
**&a** は、「変数aに割り当てられるアドレス」を示すための書き方です。&マークを**アドレス演算子**と呼びます。

>**Point**
・ポインタを使うには、ポインタの宣言だけでなく、変数の宣言も必要。
・ポインタに代入するときには、変数のアドレスであることを示す**「＆」**を忘れまいうように注意する
・ポインタ名に**「＊」** は含まれないので注意。*paとpaは意味が異なります。