条件分岐、理解できましたか??
小技??
ここで、
C
言語の小技??…
と言うんでしょうか、知ってて得する情報を紹介します。
インクリメント演算子 デクリメント演算子
Ans = Ans + 1;
とかって、なんかスッキリしませんよね。
こういうときは
インクリメント演算子と デクリメント演算子
を利用するとスッキリします。
インクリメント演算子
++
こいつがインクリメント演算子。
Ans++;
のように書くと、Ans = Ans + 1;
と同じ意味を持ちます。この方がちょっと楽ですね。
デクリメント演算子
--同様にこいつがデクリメント演算子。
Ans--;
で、Ans = Ans - 1;
と同じ意味を持ちます。複合代入演算子
お次は複合代入演算子を使って、
Ans = Ans * 3;
のようなヤツをスッキリさせてやりま しょう。
複合代入演算子
加算代入演算子
Ans += 3; ⇒ Ans = Ans + 3;
減算代入演算子
Ans -= 3; ⇒ Ans = Ans – 3;
乗算代入演算子
Ans *= 3; ⇒ Ans = Ans * 3;
除算代入演算子
Ans /= 3; ⇒ Ans = Ans / 3;
複合代入演算子
あと余剰もできます。余りを代入。
余剰代入演算子
Ans %= 3; ⇒ Ans = Ans % 3;
第 3.5 章はここまで。
インクメント・デクリメント、複合演算子。
ぜひ活用してみてください。
繰り返し文
プログラムには、
何度か同じ処理を繰り返す必要が ある場合が出て来ます。
ここでは繰り返されるプログラムを 書く方法を見ていきましょう。
while 文
while
文を使うとプログラムの同じ部分を繰り返して実行させることが出来ます。
論理式が真である間、
{ }
の中が繰り返されます。 英語の
while
、「~のあいだ」。そのままですね。while( 論理式 ){
}
while 文
{ }
の中を10
回通って、num
が10
になります。num < 10
が真になる場合はnum
が0, 1, 2, 3, 4, 5, 6, 7, 8, 9
のときなので10
回の繰り返しになりますね。int num=0;
while( num < 10 ){
num = num+1;
}
printf(“num = %d ¥n”,num);
実行結果
num = 10
while 文
この流れのイメージが掴めれば
OK
。論理式
while( 論理式 ){
}
真
偽
while 文
論理式が最初から偽ならば、
{ }
内は一回も実行されません。int Num=30;
while( Num < 10 ){
Num = Num+1;
}
printf(“Num = %d ¥n”,Num);
実行結果
Num = 30
while 文のカタチ
while
文を書く上で考えるものは1.論理式
2.論理式に使う変数の最初の値(初期値)
3.論理式に使う変数の増減・変化 この
3
点の関係ですね。1と2が合わなければそもそも
{ }
内は無視され実行されませんし、3によって1が偽になることがなければ・・・
そう、無限ループが発生します。
num = 0;
while( num < 10 ){
num = num + 1;
}
カウンタ
先ほどの
2.論理式に使う変数の最初の値(初期値)
…
の「論理式に使う変数」の部分。これ専用の変数はカウンタと呼ばれます。
具体的には
「今が何回目かを格納しておく変数」
というニュアンスですね。
必ずしもそのループの回数に対応してはいません。
2づつ増えたりとか、逆に減らしていくケースがあります。
カウンタ
とくに他の変数との違いはなく、
単純にそう呼ばれるだけです。
カウンタの変数名には
i , j , k
がよく使われます。別にそう行った決まりはありませんが、
言わば「お約束」なのです。
単純に言ってしまえば、
数学の
Σ
におけるi
と一緒ですね。カウンタを用いたプログラム
さて、これはどんなプログラムでしょう??
n
回、「MMC
」を出力するプログラムです。 カウンタのイメージ、掴めましたでしょうか?
int n, i ;
printf(“数字を入力してください: ”);
scanf(“%d” , &n);
i = 0;
while( i < n ){
printf(“MMC¥n”);
i = i + 1;
}
while 文の演習
問題です。
自然数
n
を入力すると、n
から0
までのカウントダウンを出力する プログラムを作ってください。while 文の演習その2
問題です。
自然数
a
を入力すると、a
の階乗を「a! =
○○」のように出力するプログラムを 作ってください。
頭の中で流れが描けるかな??
解答例 a の階乗
]
青字部分の書き方で2パターン。
int a, i, Ans = 1;
printf("aを入力: ");
scanf("%d",&a);
i = a;
while( i > 0){
Ans = Ans * i;
i = i - 1;
}
printf("%d! = %d¥n",a,Ans);
int a, i, Ans = 1;
printf("aを入力: ");
scanf("%d",&a);
i = 1;
while( i <= a){
Ans = Ans * i;
i = i + 1;
}
printf("%d! = %d¥n",a,Ans);
while 文の演習その 3
問題です。
自然数
a
とn
を入力すると、a
のn
乗を「a^n =
○○」のように出力するプログラムを 作ってください。
解答例 a の n 乗
int a, n, i, Ans = 1;
printf("aを入力: ");
scanf("%d",&a);
printf("nを入力: ");
scanf("%d",&n);
i = 0;
while( i < n ){
Ans = Ans * a;
i = i + 1;
} int a, n, i, Ans = 1;
printf("aを入力: ");
scanf("%d",&a);
printf("nを入力: ");
scanf("%d",&n);
i = n;
while( i > 0 ){
Ans = Ans * a;
i = i - 1;
}
printf("%d ^ %d = %d ¥n“ ,a,n,Ans);
do while 文
最初の1回を無条件で実行。
論理式
do{
} while( 論理式 );
真
偽
ここだけ 違う。
do while 文
最初の1回のみ
{ }
内が実行されます。int num=30;
do{
num = Num+1;
} while( num < 10 );
printf(“num = %d ¥n”,num);
実行結果
num = 31
for 文
さて、繰り返しにはもう
1
つfor
文というものがあります。{ }
内を繰り返す…
という点ではwhile
文と同じなんですが、なにやら
( )
内に3つも出てきましたね。また覚えることがいっぱい~
X_X
そうでもありません~ここで
while
文で大切な 3要素を思い出してみましょう。for( 初期化 ; 論理式 ; 変数の増分 ){
}
for 文と while 文のカンケイ
1.論理式
2.論理式に使う変数の最初の値(初期化)
3.論理式に使う変数の増減・変化 この3つでしたね。
もう一度
for
文を見て見ましょう。対応してくれていることが分かると思います。
for( 初期化 ; 論理式 ;変数の増減){
}
for 文と while 文のカンケイ
N
乗の問題の解答例の繰り返し部です。 これを先ほどの対応に倣えば、
for
文を使って書き換えられるハズ!!Ans = 1 ; i = n;
while( i > 0 ){
Ans = Ans * A ; i = i – 1;
}
for 文と while 文のカンケイ
1.論理式
2.論理式に使う変数の最初の値(初期化)
3.論理式に使う変数の増減・変化
3要素を抜き出して、
for
文に書き換えてみます。i = n;
while( i > 0 ){
Ans = Ans * A ; i = i – 1;
for( 初期化 ; 論理式 ;変数の増減){
}
for( i = n ; i > 0 ; i = i - 1){
Ans = Ans * A ; }
なんということでしょう!
とてもスッキリしましたね。
このように
for
文を使った方が 見やすくなる場合があるので、while
文 とfor
文うまく使い分けていきましょう!!
for( i = n ; i > 0 ; i = i - 1){
Ans = Ans * A ; }
for 文のまとめ
for
文の流れをまとめると、for( 初期化 ; 論理式 ; 変数の増減 ){
} 初期化
論理式
変数の増減
真 偽
ちなみに
for
文も一行だけなら{ }
が省略できます。 さらにスッキリしましたね。
デクリメント演算子と 複合代入演算子を使うと さらにさらにスッキリ。
for( i = n ; i > 0 ; i = i - 1)Ans = Ans * A ;
for( i = n ; i > 0 ; i-- )Ans *= A ;
for 文の演習
問題です。
自然数
A
を入力すると、A
の階乗を「A! =
○○」のように出力するプログラムを 今度は
for
文で書いてください。ちなみに
A
のN
乗のときはこうでしたね。i = n;
while( i > 0 ){
Ans = Ans * A ;
for( i = n ; i > 0 ; i = i - 1){
Ans = Ans * A ;
for( 初期化 ; 論理式 ;変数の増減){
}
解答例 階乗 for 文 Ver.
int i, a, Ans = 1;
printf("aを入力: ");
scanf("%d",&a);
for( i=1 ; i<=a ; i=i+1 ){
Ans=Ans*i;
}
printf("%d! = %d ¥n“ , a, Ans);
int i, a, Ans = 1;
printf("aを入力: ");
scanf("%d",&a);
for( i=a ; i>0 ; i=i-1 ){
Ans=Ans*i;
}
printf("%d! = %d ¥n“ , a, Ans);
繰り返し文の演習
問題です。
初めに
n
を入力し、n
回、自然数を入力するとn
の最大値と最小値を出力するプログラムを 書いてください。
実行例
nを入力してください : 5 0個目 : 10
1個目 : 3 2個目 : 5 3個目 : 2 4個目 : 7
繰り返し文のテンプレ問題・素数判定
問題です。
自然数
n
を入力すると、n
が素数かどうかを判定するプログラムを書いてください。
余剰演算子%を 活用すべし。