C言語ことはじめ 2日目: scanf関数、四則演算、関数定義、プロトタイプ

# <i class="fa fa-pencil fa-x"></i> C言語ことはじめ

![スクリーンショット 2015-08-12 15.49.15.png](https://qiita-image-store.s3.amazonaws.com/0/80075/706dd83b-0320-8144-e504-797d4d7fa097.png)


これからC言語について学んでいく経過をまとめていこうかと思います。
基本的に「独習C」( http://www.amazon.co.jp/%E7%8B%AC%E7%BF%92C-%E3%83%8F%E3%83%BC%E3%83%90%E3%83%BC%E3%83%88-%E3%82%B7%E3%83%AB%E3%83%88/dp/4798102962 )に沿って学習していく事になります。
現在の自分のレベルは、Rubyの基本的なコードを理解することができ、C言語は苦しんで覚えるC言語(書籍版)(http://www.amazon.co.jp/%E8%8B%A6%E3%81%97%E3%82%93%E3%81%A7%E8%A6%9A%E3%81%88%E3%82%8BC%E8%A8%80%E8%AA%9E-MMGames-x/dp/4798030147 )に一度さらっと目を通した状態です。

それでははりきって行きましょう <i class="fa fa-star"></i>

## <i class="fa fa-pencil fa-x"></i> scanf関数

他のたくさんのプログラミング言語でも可能なように、C言語でも標準入力からの入力を受け取り、それをコード内に反映させることが出来ます。

そうしたいときに、C言語では`scanf`関数を使用します。

## <i class="fa fa-pencil fa-x"></i> scanf関数の使い方

```c
int number;
scanf("%d", &number); //scanfで標準入力から数値を受け取ってnumberに代入
```
あらかじめ標準入力から受け取った値を入れる為の変数を用意しておき、そこに代入することになります。
このときに２つ注意点があります。
1. 代入したい変数名の前にアンパサンド(&)を付ける
2. 用意した変数の型と、代入する値の型が同じになるようにする

printfと同様に、データ型はしっかり意識する必要があります。
※ちなみに、double型の値を受け取るときは`%lf`を使います

## <i class="fa fa-pencil fa-x"></i> 四則演算
```c
#include <stdio.h>

int main(void) {
  int first = 10, second = 5;
  int sum;

  sum = first - second;  //sum == 5

  printf("合計は%dです\n", sum ); //合計は5です
  printf("さらに5を足した答えは%dですね\n", sum + 5); //さらに5を足した答えは10ですね
  printf("符号を転換させてみましょう%d\n", -sum ); //符号を転換させてみましょう-5
  return 0;
} 
```

C言語での演算です。
他の言語と同様に、`+``-``*``/``%`などが使えます。

ここで大事な事は、**計算結果のデータ型が何になるか意識する事**です。
int型変数にfloatが入ったりしないように気をつけましょう。

```c

//地球の日数を木製の年数に変換するプログラム
//地球の1年は木星での12年に相当します

#include <stdio.h>

int main(){
	// 日数入力させる
	double day_earth;
	double year_jupiter;

  printf("木星の年数に変換したい数を入力してください");
  scanf("%lf", &day_earth);

  year_jupiter = day_earth / (365 * 12); //木星での年数に換算
 
  printf("入力した日数を木星での年数に変換すると、%f年になります！\n", year_jupiter);
  return 0;
}
```

* 浮動小数点を扱うときは基本的にdouble型にしておきましょう。

## <i class="fa fa-pencil fa-x"></i> 関数の定義とプロトタイプ

今までは基本的にCプログラムに必須なmain関数のみを定義してきました。今度は自分でオリジナルの関数を定義してみましょう！

```c

//プロトタイプを利用したサンプルコード
#include <stdio.h>

void print_momozono_name(void); //プロトタイプ宣言

int main() {
	printf("このPCのホスト名を出力します\n");
	print_momozono_name();
	printf("ちゃんと表示されましたでしょうか？\n");
	return 0;
}

void print_momozono_name(void){
	printf("私の名前はmomozonoです！\n");
}
```

ここで新しい**プロトタイプ**という単語が出てきました。
特に難しいものではなく、今の所は、**main関数内でオリジナルの関数を使用したいときに定義するもの**と理解しておけば大丈夫です。

プロトタイプ宣言に必要な物は以下の３つの要素です。
1.　戻り値の型
2.　呼び出す関数名
3.　仮引数

といっても、オリジナルの関数から、関数の処理本体を抜いた所を書けばよいだけです。
これをmain関数の**前に**書いておきましょう。

この処理によって、main関数内でオリジナルの関数が使えるようになります。


## <i class="fa fa-pencil fa-x"></i> 戻り値の利用

```c

// 戻り値の利用
#include <stdio.h>
#include <math.h>  //sqrt()関数が含まれている

int main(void) {
	double answer;

	answer = sqrt(10.0); //戻り値をanswerに代入している
	printf("%f", answer); // printf("%f", sqrt(10.0));
	return 0;
}
```

こういった形で、変数に代入することで戻り値を利用出来ます。
このときも同様に、変数の型と演算結果のデータ型が同じある必要があることを忘れないようにしましょう！

```c
#include <stdio.h>

int get_sqr(void);

int main(void) {
	int sqr;

	sqr = get_sqr();
	printf("2乗値:%d", sqr);

	return 0;
}

int get_sqr(void) {
    int number;
    printf("2乗にしたい値を入力してください！");
    scanf("%d", &number);

    return (number * number);
}
```
定義したオリジナルの関数に欲しい演算結果や定数などを入れておいて、main関数で呼び出す事が出来ますね。

## <i class="fa fa-pencil fa-x"></i> 引数の指定


```c

#include <stdio.h>

int sum(int x, int y);

int main(void) {
	int number1, number2, number3;

	number1 = sum(14, 3);
	number2 = sum(5, 34);
	number3 = sum(22, 67);

	printf("%d\n", number2);

	return 0;

}

int sum(int x, int y){
	return (x + y);
}
```

仮引数の数と型も自由に変えることが出来ます。
上記の`sum`関数では、`int`型の仮引数を２個とることを指定しています。

**関数の戻り値、仮引数とその型や個数**をしっかり意識していれば、これだけでも様々な関数を定義する事が出来ますね！

## <i class="fa fa-star"></i> まとめ

今回はC言語での標準入力の受け取り方から始まって、独自の関数を定義するところまで学習しました。
また、独自の関数を定義し、それをCプログラムの中で使用するにはプロトタイプの宣言が必要であることも学びました。

まだまだ初歩の段階ではありますが、何度も述べてきたように、C言語では**型の意識が非常に重要である**と感じています。

次回は制御分を中心にまとめていきたいと思います。

それでは、また次回会いましょう！！