Ex14Ans

From Prog0

Jump to: navigation, search

演習第14回

Contents

解答例

A問題

A-1 組み合わせの数

#include <stdio.h>

int combi (int, int);
int fact (int);

int main ()
{
  int n, r;

  printf ("nCr の n と r とを入力してください: ");
  scanf ("%d%d", &n, &r);

  printf ("%dC%d: %d\n", n, r, combi (n, r));

  return 0;
}

int combi (int n, int r)
{
  return fact(n)/(fact(r)*fact(n-r));
}

int fact (int n)
{
  int f;

  for (f=1; n>0; n--)
    f *= n;

  return f;
}

B問題

B-1 気温と気候区分

ファイル名: ex14b1.c

#include <stdio.h>

int main(){
  /* cAw: Aの判定に使う冬の気温、cCw: Cの判定に使う冬の気温、cEs: Eの判定に使う夏の気温 */
  double cAw = 18.0, cCw = -3.0, cEs = 10.0;
  double T[12], Tmax, Tmin, Tave, Tdif;
  int i;


  printf("1月~12月の気温(摂氏)を入力してください\n");
  for ( i=0 ; i<12 ; i++ ){
    scanf("%lf", &T[i]);         /* 入力の読み込み */
  }

  Tmax = T[0];
  Tmin = T[0];
  Tave = T[0];
  for ( i=1 ; i<12 ; i++ ){      /* 最大最小の発見と平均計算のループ */
    if ( T[i] > Tmax ) Tmax = T[i];
    if ( T[i] < Tmin ) Tmin = T[i];
    Tave += T[i];
  }
  Tave /= 12.0;
  Tdif = Tmax-Tmin;

  printf("最高: %4.1f   最低: %4.1f\n", Tmax, Tmin);
  printf("平均: %4.1f   年較差: %4.1f\n", Tave, Tdif);

  printf( "気候区分: " );
  if ( Tmin >= cAw ){
    printf( "A(熱帯)\n\n" );
  }
  else if ( Tmin >= cCw && Tmax >= cEs ){
    printf( "C(温帯)\n\n" );
  }
  else if ( Tmin < cCw && Tmax >= cEs ){
    printf( "D(亜寒帯)\n\n" );
  }
  else if ( Tmax < cEs ){
    printf( "E(寒帯)\n\n" );
  }

  return 0; 
}

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