Ex14Ans

From Prog0

Jump to: navigation, search

演習第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));
}
Personal tools