第3回 if・else文,比較演算子
内 容
このドキュメントは http://icrus.org/c_language_beginers_course/ 上にあります.
3-1. if文
[課題3-1] 計算機にキーボードから入力された整数が10以上か10未満か判断させましょう.
[プログラム例2-1]
1: #include <stdio.h>
2: void main(void){
3: int n;
4:
5: printf( "整数を入力して下さい:" );
6: scanf( "%d%*c" , &n );
7: if( n>10 ){
8: printf( "%dは10以上の整数です\n", n );
9: }else{
10: printf( "%dは10未満の整数です\n",n );
11: }
12: getchar();
13: }
- 4行目→キーボードからの入力を促します.
- 5行目→標準関数scanf()を使って,変数nにキーボードから整数を代入します.
- %d→代入したい変数nが整数型であることをscanf()に知らせます.
- %*c→1文字入力を無視するようscanf()に知らせます.(実際には入力されたリターンコードをキーボードバッファから取り除きます.)
- &n→変数nの頭に&を付けたものです.詳しくはテーマ9以降で説明しますのでここでは,scanf()で変数にキーボードから入力するときは,変数名に&を付けると覚えて下さい.
[結果3-1]
例の1~12行をキ-ボ-ドから入力してコンパイル・実行すると,画面に「整数を入力して下さい:」と表示されます.そこで任意の整数をキーボードから入力し,リターンキーを押します.結果は次のようになります.
整数を入力して下さい:20 ⏎
20は10以上の整数です.
整数を入力して下さい:5 ⏎
5は10未満の整数です.
あなたの予想通り,条件式n>10が真なら(正しければ)if文の次のブロック(対になった{}で囲まれた部分)を実行します.条件式n>10が偽なら(誤りなら)else文の次のブロックが実行されます.if文,else文はつぎのような構成になります.
if(条件式){
条件式が真(正しい)とき実行するブロック
単文(1つの文)または複文(複数の文)で構成
}else{
条件式が偽(誤り)とき実行するブロック
単文(1つの文)または複文(複数の文)で構成
(esleとelse以降のブロックは不必要なら省略可)
}
if文,else文の構成
3-2. 比較演算子
条件式には次のようなものがあります.
条件式の種類 | ||
---|---|---|
条件式 | 説明 | 比較演算子 |
(n<10) | nが10未満のとき真 | < |
(n<=10) | nが10以下のとき真 | <= |
(n>10) | nが10より大きいとき真 | > |
(n>=10) | nが10以上のとき真 | >= |
(n==10) | nが10と等しいとき真 | == |
(n!=10) | nが10以外のとき真 | != |
(0以外の値) | 常に真 | --- |
(0) | 常に偽 | --- |
ここまでくると,条件式を処理ブロックを変更することにより,様々な条件によって別々な処理をする事ができます.また,標準関数scanf()とprintf()により,コンピュータとの会話ができるようになりました.
[課題3-2]
2次方程式の解の公式を解くプログラムを書こう.
[プログラム例3-2]
1: #include <stdio.h>
2: #include <math.h>
3: void main(void){
4: double a, b, c, d, x1, x2, j;
5:
6: printf( "ax^2+bx+c=0のときa~cを入力して下さい\n");
7: printf( "a=" );
8: scanf( "%lf%*c" , &a );
9: printf( "b=" );
10: scanf( "%lf%*c" , &b );
11: printf( "c=" );
12: scanf( "%lf%*c" , &c );
13:
14: d = b*b - 4.0*a*c;
15: if( d>=0.0 ){
16: printf( "判定式dは0以上です.\n");
17: x1 = (-b + sqrt( d ))/(2.0*a);
18: x2 = (-b - sqrt( d ))/(2.0*a);
19: printf( "x1 = %lf\n", x1);
20: printf( "x2 = %lf\n", x2 );
21: }else{
22: printf( "判定式dは0未満です.\n" );
23: x1 = (-b)/(2.0*a);
24: j = sqrt( -d )/(2.0*a);
25: printf( "x1 = %lf+%lfj\n", x1, j );
26: printf( "x2 = %lf-%lfj\n", x1, j );
27: }
28: getchar();
29: }
- 2行目→sqrt()など数学関数を使用するときに必要な1行です.
- 6行目→入力を促すコメント行を出力します.
- \n→入力を促すコメント行を出力した後,復改します.
- 7~12行→変数a~cをキーボードから入力し,それぞれリターンキーを押して入力を完了します.
- 14行目→判別式b^2-4acを計算しdに代入します.
- 15行目→判別式dが0以上のときは以降のブロックを,判別式dが0以上でないときは,else以降のブロックを実行します.
- 17~18行目→解の公式からx1,x2を求めます.
- sqrt(x)→xの平方根(√)を返す数学関数の一つです.
-
19~20行目→x1,x2を関数printf()で画面に表示します.
23行目→解の公式から実数部を求めx1に代入します. - 24行目→解の公式から虚数部を求めjに代入します.
- 25~26行目→x1,jをそれぞれ表示します.
-
%lf→double型の変数を表示することを関数printf()に伝えます.
\n→1行復改します. -
その他の文字列→そのまま画面に表示されます.
[結果3-2]
実行結果は次のようになります.
例1
ax^2+bx+c=0のときa~cを入力して下さい
a=1 (a~cをキーボードから入力します)
b=-6
c=9
判定式dは0以上です.(判定式の結果が出力されます)
x1 = 3.000000 (解を出力します)
x2 = 3.000000
例2
ax^2+bx+c=0のときa~cを入力して下さいa=1
b=0
c=9
判定式dは0未満です.
x1 = -0.000000+3.000000j
x2 = -0.000000-3.000000j
例3
ax^2+bx+c=0のときa~cを入力して下さいa=1
b=0
c=-4
判定式dは0以上です.
x1 = 2.000000
x2 = -2.000000
ここでは,判別式の値の判断にif文・else文を使用しました.ここまで来れば,電卓を使って苦労して行っていた,実験のデータ整理などの仕事が,キーボードから数値を入力し,計算し,解答を画面に表示させるこのプログラムを応用して楽にできそうですね.
[文法3]
if文の文法
if(条件式){
文1
}else{
文2
}
if(条件式){
文1
}else{
文2
}
- 文1,文2ともに複文(複数の文)でもok.
- 条件式が真(正しい)ときは,文1を実行,偽(誤り)のときは文2を実行.
- elseとelse以降のブロックは不要のときは省略可.
-
各ブロックが単文のときは,それにかかる一対の{}は省略可.
[問題3-1]
おつかれさまでした.以上,第3回はif・else文と条件演算子でした.
このドキュメントは http://icrus.org/c_language_beginers_course/ 上にあります.
2016,12
ssatoh@
足立工科大学 工学部 情報通信工学科