Ex14Ans
From Prog0
演習第14回
Contents |
解答例
A問題
A-1 ヒストグラム
ファイル名: ex14a1.c
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
void histogram(int);
int main()
{
int i, n;
int data[MAX];
for (i = 0; i < MAX; i++) {
scanf("%d", &data[i]);
if (data[i] < 0) break;
}
n = i;
for (i = 0; i < n; i++) {
histogram( data[i] );
}
return 0;
}
void histogram(int n)
{
int i;
if (n < 0 || n > 70) { /* n<0 は無くてもよい */
fprintf(stderr, "illegal value!\n");
exit(4);
}
printf("[%2d]:", n);
for (i = 0; i < n; i++) printf("#");
printf("\n");
}
B問題
B-1 BMI計算
ファイル名: ex14b1.c
#include <stdio.h>
#define NUM 12
int bmi_hantei(double b);
int main()
{
int i, n;
int status;
int count, frac;
double data[NUM][2];
double bmi[NUM];
double rate;
count = 0;
printf("身長(cm)と体重(kg)を空白で区切って入力してください。\n");
printf("入力可能な最大の人数は %d 人です。\n", NUM);
for( i = 0; i < NUM; i++ ) {
status = scanf("%lf%lf",&data[i][0], &data[i][1]);
if (status != 2) break;
data[i][0]=data[i][0]/100.0;
bmi[i] = data[i][1]/(data[i][0]*data[i][0]);
}
n = i;
printf("\n");
printf(" BMI 肥満度分類\n");
for( i = 0; i < n; i++ ) {
printf("%2d 人目 %3.1f ", i+1, bmi[i]);
switch(bmi_hantei(bmi[i])) {
case -1:
printf("低体重\n");
break;
case 0:
printf("普通体重\n");
count++;
break;
case 1:
printf("肥満(1度)\n");
break;
case 2:
printf("肥満(2度)\n");
break;
case 3:
printf("肥満(3度)\n");
break;
case 4:
printf("肥満(4度)\n");
break;
}
}
rate = (double)count/n;
frac = (int)(rate*100.0 + 0.5);
printf("\n");
printf( "肥満度分類が普通体重である人の割合は %2d パーセントです。\n",frac);
return 0;
}
int bmi_hantei(double bmi)
{
if (bmi < 18.5) return -1;
else if (bmi < 25.0) return 0;
else if (bmi < 30.0) return 1;
else if (bmi < 35.0) return 2;
else if (bmi < 40.0) return 3;
else return 4;
}
Extra問題
E-1 エラトステネスの篩(ふるい)による素数判定法
ファイル名: ex14e1.c
/*
Sieve of Eratosthenes
エラトステネスの篩:ある数以下の全ての素数を知る単純な方法
*/
#include <stdio.h>
#define N 900
#define RTN 30 /* Nの平方根 */
int main(){
int isPN[N+1]; /* 各整数が素数かどうかを表す変数。(要素0は使用しない) */
int i, j, num=0;
/* isPN[n]に、整数nが素数の候補のとき1、素数でないとき0をセットする */
isPN[1] = 0; /* 1 は素数でない */
for ( i=2; i<=N; i++ ){
isPN[i] = 1; /* 素数候補として初期化 */
}
for ( i=2; i<=RTN; i++ ){
/*
整数i の倍数なら素数ではないと判定する。
なおi が素数でない場合は、もっと小さい整数を使ってiの倍数が素数でない
ことの判定は既に済んでいるはずなので、処理を省略する。
*/
if (isPN[i] == 1){
for ( j=2; i*j<=N; j++ ){ /* i*j<=N の範囲で処理を行う */
isPN[i*j] = 0; /* iの倍数 i*j (j>=2) は素数でない */
}
}
}
/* 結果の表示 */
for ( i=1; i<=N; i++ ){
if (isPN[i] == 1){
printf("%3d ", i); /* 素数ならばその値を表示 */
num++; /* 素数の数をカウント */
}
else{
printf("--- "); /* 素数でない場合の表示 */
}
if (i%10 == 0) printf("\n"); /* 10個表示ごとに改行 */
}
printf("\n%d 以下の素数は %d 個でした。\n", N, num);
return 0;
}
