条件分岐,繰り返しは,マスターできましたか?
今回は,繰り返しのバリエーションを増やします.
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万円を超えるのは何年後になるかを求めよ.