2. 変数を使う
新しいプログラムですからプロジェクトも新しくno2にしましょう。前回もやりましたが下図の①の▼をクリックしてCプロジェクトを選択。プロジェクト名はno2。さらに②のアイコンをクリックしてファイル名をvar1.cと指定してください。
(1) 変数を使ったプログラム
それでは変数を使ったプログラムを作りましょう。変数を使うとプログラムの汎用性が増えます。変数は値の入れ物で、変数を使うには宣言が必要。宣言は例えば次のように行います。
int a, b, c;
ここでintは整数のみを扱う型であることを示し、a, b, cの3つはその型の変数でこれらを使うとこのプログラムを読むコンピュータ(コンパイラ)に宣言します。宣言の後にも;が必要です。次のプログラムを入力してください。9行目から命令の書き出しが右にずれています。これをインデント(段付け、字下げ)と呼びます。C言語では実行結果に影響は与えませんがプログラムを見やすくするためには重要ですので必ず行ってください。
/*
* var1.c
*
* Created on: 2017/08/20
* Author: ***
*/
#include <stdio.h>
int main(){
int a,b;
a=10;
printf("a=%d\n",a);
b=3;
printf("b=%d\n",b);
a=b+4;
printf("a=%d\n",a);
a=a+1;
printf("a=%d\n",a);
return(0);
}
ビルドして実行すると結果は次のようになる。※以前のプロジェクトのno1が実行されてしまった場合には、メニューの実行(R)ー>実行構成を選び、C/C++アプリケーションのno1 Debugを右クリックで削除して、もう一度C/C++アプリケーションをダブルクリック、プロジェクト(P):をno2, C/C++アプリケーションをDebug¥no2.exeとして実行してください。
新しく出てきた命令
int a,b; a, bをint型の変数とするという宣言。
a=10; aに10を代入する(aという変数の値を10にする)。
a=a+1; aにa+1の値を代入する(もともとaが7ならばこの命令が実行されると8)
変数に値を格納する、a=10; や x=2+5; の命令を代入文と呼ぶ。左辺(左オペランド)は変数名だけ、右辺は変数や計算式、定数といった一つの値を持つものが使える。a+b=4; やa+4=10; はエラーになる。
さて、プログラムを一行一行追ってみましょう。10行目で、aに10が代入されます。よって11行目のprintfの出力は、a=10↵です。↵は改行を示します。12行目ではbに3が代入されます。14行目のprintfの出力は、b=3↵です。15行目では、右辺が式になっています。代入文では右辺の式を評価して左辺の変数に代入します。ここでaの値は7になります。以前入力された10という値は上書きされて消えます。
重要 代入文:変数名=計算式、定数など
右辺の計算を行った結果を左辺の変数に代入する。
プログラムの右辺を色々変えたり変数を増やしてみて実行結果がどのように変わるか試してみてください。四則演算は+,―,*,/で表現します。剰余は%です。べき乗は^でも**でもなく関数を用います。しばらくべき乗はa*aなどとしましょう。
(2) コンソールから入力した値を使ったプログラム
プロジェクトno3を作成し, ソース名var2.cを追加。var2.cには次のプログラムを入力してください。コメント部分は省略可です。
/*
* var2.c
*
* Created on: 2017/08/20
* Author: ***
*/
#include <stdio.h>
int main(){
int a,b;
setvbuf(stdout, NULL, _IONBF, 0); /* 出力のバッファを使わない */
printf("input a: ");
scanf("%d",&a); /* aの入力*/
printf("input b: ");
scanf("%d",&b); /* bの入力*/
printf("%d + %d = %d\n",a,b,a+b); /* a, b, a+bの値を出力 */
printf("%d - %d = %d\n ",a,b,a-b); /* a, b, a-bの値を出力 */
printf("%d * %d = %d\n ",a,b,a*b); /* a, b, a*bの値を出力 */
printf("%d / %d = %d\n ",a,b,a/b); /* a, b, a/bの値を出力 */
return(0);
}
このプログラムをビルド、実行するとコンソール部分にinput a:と現れて入力待ちの状態になります。例えば整数値12を入力しエンターキーを押すと、さらにinput b:となり再度入力待ちになります。4を入力してエンターキーを押すと次のような実行結果になりました。緑の文字はこちらが入力した文字です。
四則演算がちゃんと行われていることがわかります。いろいろな値を入力して実行結果を見てください。さて、次のような実行結果が現れました。入力は13と5です。
足し算、引き算、掛け算の値は計算通りですが、割り算結果は本来2.6のはずですが、2と表示されています。これは整数型で計算しているため小数点以下が切り捨てられて2と表示されるためです。小数点以下の値を扱うための方法は次のページで取り扱います。
新しく出てきた命令
setvbuf(stdout, NULL, _IONBF, 0); printfの出力を確実にする命令。とりあえずつけておきましょう。
scanf("%d", &a); 標準入力(ここではコンソール)からの入力された整数の値をaに代入する。
scanf関数の形式は、
scanf(書式文字列,引数,…);
です。入力された値を書式文字列によって指定された形式で引数で与えらえた変数に代入します。但し、scanf関数の引数に変数を与えるときには変数名の前に&を付ける必要があります。
演習1 3つの整数値をコンソールから入力して、その総和と最初に入力した値から残り2つの値を引いた値を表示するプログラムを作成せよ。
演習2 1つの整数値をコンソールから入力して、1の位と10の位を表示するプログラムを作成せよ。
(3) 浮動小数点型(実数型)
先ほど使ったint型は整数しか扱えませんでした。小数点以下の値を扱うにはdouble型(64ビット)、あるいはfloat型(大方の場合32ビット)を使います。double型とfloat型の違いはdoubleの方が扱える値の範囲が大きくや精度は倍以上になります。※double型は次のページで扱いましょう。
【補足】
setvbufは教科書にはない命令ですが、Eclipseでは、printfなどの出力が一旦バッファーに溜められてから出力されます。そのため、入力のタイミングと出力がコンソールに現れるタイミングがおかしくなることがありますのでこれを防ぐために出力のバッファーを使わないという設定にしてあります。今は分からなくてOKです。Eclipseはバッファーを使っていますが、バッファーを使っているかどうかは環境によります。