Ex14Ans
From Prog0
演習第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)); }