Ex14Ans

From Prog0

Jump to: navigation, search

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