制御文は,コンピュータ・プログラミングの要のひとつです.
様々なセンサの値や計算値の結果などに応じて対処を変えるようなことが
コンピュータには求められます.例えば,電子レンジは,温度と時間を計測して,
熱量を上げたり下げたりしますし,皆さんが持っている携帯電話も
指で触ると画面が明るくなったりします.
これらは皆,コンピュータが
// コード例 #include <stdio.h> int main(void) { int x = 1; if(x>0) { printf("x is bigger than zero.\n"); } }
if文は,条件文(conditional statement)と呼ばれるCの文の種類の一つである.その動作は,
if(式) 文;
例えば, 3 > 2 は真(true, 関係演算子の演算結果は1)で,2 > 3は偽(false, 演算結果は0)である.次のif文を実行すると画面に「true」と表示される.
if(3 > 2) printf("true");
しかし,次のif文では,演算結果が偽となるので,その次の文は実行されない.
if(2 > 3) printf("これは実行されない.");
また,if文の内部には,関係演算子だけではなく,あらゆる整数値を置くことができる.例えば,以下の文も成り立つ.
int x; ...// x を使った計算 if(x) printf("xは0ではない.");
// コード例 #include <stdio.h> int main(void) { int x = 1; if(x>0) { printf("x is bigger than zero.\n"); } else { printf("x is a negative or zero value.\n"); } }
if文にelse文を組み合わせることによって,より複雑な条件を記述することができる.
if(式) 文1; else 文2;
if文の中の式を評価し,真であれば文1だけを,偽であれば文2だけを実行する.
else文に,if文を重ねる事によって,複数の式を評価することができる.
if(式1) 文1; else if(式2) 文2;
コードブロックは,複文とも呼ばれ,一連の文を左中括弧"{"と右中括弧"}"で囲んで作る.このような複数の文は,単一の文と同様に扱うことができる.
if(式1) { 文1; 文2; } else // ここで改行しても問題ない if(式2){ 文3; 文4; }
int main(void) {
printf("1 Hello!\n");
printf("2 Hello!\n");
printf("3 Hello!\n");
printf("4 Hello!\n");
printf("5 Hello!\n");
printf("6 Hello!\n");
printf("7 Hello!\n");
printf("8 Hello!\n");
printf("9 Hello!\n");
printf("10 Hello!\n");
}
この(悪)例のように,ループを使わずに書き並べて同じ結果にすることも出来なくはありません.
ですが,「1万回しゃべって!」だったらどうしますか? 書き並べられませんよね?
こんな時にはループを使うと簡単に実現できます.【ヒント】「データ」->「変数を作る」で,変数 i を作って使いましょう.
#include <stdio.h> int main(void) { int i = 1; // 変数iを作って値を1にする. while(i<=10){ // 10回繰り返す.より正しくは条件が真である間 繰り返す printf("%d Hello!\n", i); // iを表示します. i++; // iを1つずつ増やす. } }
#include <stdio.h> int main(void) { for(int i=0; i<10; i++){ // 変数iを作ります.0始まりにすることが多いです. printf("%d Hello!\n", i+1); // 0始まりなので1を足して表示します. } }
#include <iostream> using namespace std; int main(void) { for(int i=0; i<10; i++){ // 変数iを作ります.0始まりにすることが多いです. cout << i+1 << " Hello!" << endl; // 0始まりなので1を足して表示します. } }
while(式)文;whileループは,式が真である間,文の実行が繰り返され,式が偽になると終了します. 式の値は,文が実行される前に評価されます. つまり,最初から式が偽であれば, 文は一度も実行されないことになります.
forループを用いると,繰り返し計算することができる.
for(初期設定部; 条件判定部; インクリメント部)文;一番簡単で,かつ常套手段的に用いられる例を以下に示す.この例では,1から10までの値を足している.
int sum = 0; // 初期化 for(int i=0; i<10; i++) { sum += i+1; } printf("sum = %d\n", sum);ここで i はループカウンタと呼ばれる変数で,どのような名前をつけても構わないが,数学での慣例に則り,i, j, k などが用いられることが多い. i++ および sum += ... は,インクリメント演算子と呼ばれるものであり,実行一回につき値を一つ増やす.詳しくは次の節で説明する.
i++;の++は,インクリメント演算子といい,
i = i+1;と等価である. 同様に,i--; は,デクリメントで,値を一つ減らす. また,
sum += a;は,
sum = sum + a;と等価である.これも,sumから値を減らしていく場合は,
sum -= a;sumにaを掛ける場合は,
sum *= a;割る場合は,
sum /= a;である.
int i = 0; int j = i++;上記の演算の場合,J の値は0である.インクリメントの演算は,iの値をjに代入した後に行われる. ところが,インクリメント演算子は,変数の前に置くこともでき,
int i = 0; int j = ++i;と書くこともできる.この場合,演算結果は異なり,jの値は1である.インクリメントは代入に先んじて実施され,iを1にしてから代入される.
演算子 | 関係 |
> | ~より大きい |
>= | ~より大きいか,等しい |
== | 等しい |
<= | ~より小さいか,等しい |
< | ~より小さい |
C/C++では,関係演算子は「演算子」であり,従って演算結果は数値となることを認識せよ. 関係演算子による演算結果は,真の場合非ゼロ(多くの場合は1),偽の場合はゼロとなる.以下のプログラムの結果を確認せよ.printf("関係演算子の演算結果: 3>2=%d, 3<2=%d\n", 3>2, 3<2);
論理演算子 | 説明 |
AND(論理積) | |
OR(論理和) | |
NOT(否定) |
a | b | a&&b | a||b | !a |
ヒント:ANDはどちらか一方でも0なら,演算結果は0である.
ヒント:ORはどちらか一方でも1なら,演算結果は1である.
ヒント:NOTは単純に論理が反転する.
【実行例】 > Q3-1 7 10 13 16 19 22 25 28 31 34 >
int main(void) { int a = 7; int d = 3; int n = 10; }
Cのコードがわからない場合,まずはスクラッチで書いてみよう.
【実行例】 > Q3-2 > 何の段ですか?(1-9):5 5 10 15 20 25 30 35 40 45 >
【実行例】 > Q3-3 サイコロを何回振りますか?: 1000000 6が出た割合は 0.166697 です.
#include <stdlib.h> // rand()を使うために必要です. int main(void) { int n=0, x=0; printf("kaisuu:"); scanf("%d",&n); printf("me no kazu:"); scanf("%d",&x); int count = float p = (float)count/(float)n; printf("%dが出た割合は%fです.\n", x, p); }
【実行例】 > Q3-4 > 正の整数を入力してください:17 17は素数です. >
【ヒント】ある数 n が素数かどうか判定する最も簡単な方法は, 2〜n-1 までの数で割り切れるかどうかを調べることです.