条件分岐,繰り返しは,マスターできましたか?
今回は,繰り返しのバリエーションを増やします.
1. 整数nを入力すると,n!を一回だけもとめる. 注意:0!=1
まず,問題が与えられたら,プログラムの実行手順を考えよう
1 階乗を求める数 n を入力する
2 繰り返しの回数(カウンタ)を,0にする 3 カウンタの値が n を超えるまで,以下を繰り返す 2-1 前の計算で求めた値に,(カウンタの値+1)を乗算する |
となる.
和の場合と異なり0をかけてしまうと,いつまでも答えが0になってしまう点を注意する.また,n=0の場合の取り扱いを考慮する.
これを,プログラムにしてみよう.
解答例:
#include <stdio.h> void main() { int i, n, kaijo = 1; printf("n の階乗を求めます.nを入力してください.n = "); scanf("%d", &n); for(i=0; i<n; i++){ kaijo *= i+1; } printf("%d の階乗は,%dです.\n", n, kaijo); }
2. 整数nを入力すると,奇数か偶数かの判定を繰り返し,0以下の整数が入力されたら終了する
まず,問題が与えられたら,プログラムの実行手順を考えよう.繰り返しの判定条件,どうやって奇数偶数を判断するかがポイントです.
1 整数 n を入力する
2 整数 n が0より大きい場合,以下を繰り返す 2-1 n は奇数か,偶数か |
となる.
これを,プログラムにしてみよう.
解答例:
#include <stdio.h> void main() { int n; printf("奇数偶数を判定する数 n を入力してください n = "); scanf("%d", &n); for( ; n > 0; ){ if(n%2 == 0){ printf("%d は偶数です\n", n); }else{ printf("%d は奇数です\n", n); } printf("奇数偶数を判定する数 n を入力してください n = "); scanf("%d", &n); } printf("終わります\n"); }
nの入力をする部分が2回出てくる.もう少しスマートにプログラムできないかな?? → 今日の課題
3. まずデータの件数を入力し,続いてその件数だけ実験データを入力し,実験データの合計と平均値を求める.
データの例: 10,20,30,40,50 の5件なら,合計150,平均30.0
今度は,繰り返しが終わってから,さらに計算が必要です.
1 データの件数 n を入力する
2 繰り返しの回数(カウンタ)を,0に,合計を0にする. 3 カウンタの値が n を超えるまで,以下を繰り返す 2-1 実験データを入力する 4 求まった合計をデータの数 n で割り,平均点を求める |
となる.
これを,プログラムにしてみよう.
解答例:
#include <stdio.h> void main() { int i, n, data, sum = 0; float ave; printf("入力するデータの数を入力してください n = "); scanf("%d", &n); for(i=0; i<n ; i++){ printf("%d 番目のデータ = ", i+1); scanf("%d", &data); sum += data; } ave = (float)sum / (float)n; printf("%d 個のデータの合計は %d ,平均は %f です\n", i, sum, ave); }
for文を二つ組あせて使うと,どうなるか試してみよう.
例:
#include <stdio.h> void main() { int i, j; for(j=1; j<=9; j++){ for(i=1; i<=9; i++){ printf("%d×%d=%d\n", j, i, j*i); } } }
繰り返しの回数が,あらかじめわかっていない場合は,while文を用いるとプログラムが見やすくなります.while文は,ある条件が成り立っている間は,繰り返しを続けます.
主に,キーボードから**が入力されるまで繰り返すとか,計算結果が**になるまで繰り返すなどの場合に用います.
while(式)
文1
do
文1
while(式)
前判定(while文)と後判定(do-while文)の違いは,while文は文の実行よりも先に条件判断を行うので,最初に条件が成立しなければ,文は一度も実行されないことがあるのに対し,do-while文では,文が必ず一度は実行されます.
たとえば,0が入力されるまで,入力された数字を加えるプログラムは,次のようになります.
例:
#include <stdio.h> void main() { int n, sum; sum = 0; do{ scanf("%d", &n); sum += n; } while(n!=0); printf("合計は%dです\n", sum); }
#include <stdio.h> void main() { int i, n, kaijo = 1; printf("n の階乗を求めます.nを入力してください.n = "); scanf("%d", &n); i = 0; while(i<n){ kaijo *= i+1; i++; } printf("%d の階乗は,%dです.\n", n, kaijo); }
1. A,B が1桁の正整数のとき,(A * 10 + B) ― (B * 10 + A) = 45となる,A,Bの組み合わせを求めよ.
2. 年利5%の複利(1年経つごとに利子を元金に繰り入れて,その加算額を次期の元金とする)の定期預金に1万円預けると,元利合計が10万円を超えるのは何年後になるかを求めよ.