Ex14Ans
From Prog0
演習第14回
Contents |
解答例
A問題
A-1 BMI計算
ファイル名: ex14a1.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; }
B問題
B-1 三つ子素数
ファイル名: ex14b1.c
#include <stdio.h> #define NUM 200 int isPrime(int); void print_result(int, int, int); int main() { int i, p0, p2, p4, p6; printf("200 以下の三つ子素数の組は次の通り:\n"); for (i = 5; i <= NUM; i+=2) { /* 継続条件を i<=NUM-6 としてもよい。その場合下の break 判定は不要 */ p0 = isPrime(i); p2 = isPrime(i+2); p4 = isPrime(i+4); p6 = isPrime(i+6); if ( p0 * p6 ) { /* p0もp6も1 */ if ( p2 ) { /* p0, p6, p2が素数 */ if ( i+6 > NUM) break; print_result(i, i+2, i+6); } else if ( p4 ) { /* p0, p6, p4が素数 */ if ( i+6 > NUM) break; print_result(i, i+4, i+6); } } } return 0; } void print_result(int a, int b, int c) { printf("三つ子素数{%4d,%4d,%4d}\n", a, b, c); } int isPrime(int a){ int i; if (a == 2) return 1; /* 2 は素数 */ if (a%2 == 0) return 0; /* 2 以外の 2 で割り切れるものは非素数 */ /* 以下の for 文は 3 から d/2 までの奇数で割り切れるかを調査 */ for (i = 3; i < a/2; i+=2) { if (a%i == 0) return 0; /* 割り切れたので非素数 */ } return 1; /* 割り切れなかったので素数 */ }
Extra問題
E-1 三角形の面積
三角形の3つの頂点の座標 (x0, y0), (x1, y1), (x2, y2) が与えられたとき, 三角形の面積を求める方法はいくつか考えられます.
- 1/2 * (底辺) * (高さ) を計算する.
- 3辺の長さを出して,ヘロンの公式を用いて面積を計算する.
- 原点 (0,0) と他の 2点が (ax, ay), (bx, by) のとき,1/2 | axby - aybx | で求められることを利用する.
ここでは 3つ目の方法を用います. 与えられた 3点のうちいずれかの点,たとえば (x0, y0) を原点になるように並行移動すると, 残りの 2点は (x1-x0, y1-y0), (x2-x0, y2-y0) となるので, 面積は 1/2 | (x1-x0)(y2-y0) - (y1-y0)(x2-x0)| で計算できます.
#include <stdio.h> #include <math.h> #define TRI 3 double triangleArea (double, double, double, double, double, double); int main () { int i; double x[TRI], y[TRI]; printf ("3点の座標 (x0, y0), (x1, y1), (x2, y2) を入力してください\n"); for (i=0; i<TRI; i++) { printf ("x%d, y%d: ", i, i); scanf ("%lf%lf", &x[i], &y[i]); } printf ("三角形の面積: %f\n", triangleArea(x[0], y[0], x[1], y[1], x[2], y[2])); return 0; } double triangleArea (double ax, double ay, double bx, double by, double cx, double cy) { return .5 * fabs ((bx-ax)*(cy-ay) - (by-ay)*(cx-ax)); }