解答 1 複素数を構造体として定義し、二つの複素数の積(結果は複素数)を返す 関数 を定義せよ。 #include <stdio.h> struct complex { double real, imag; }; typedef struct complex Complex; Complex cmult(Complex, Complex); main() { Complex x = {1.0, 1.0}; Complex y = {1.414, 1.414}; Complex z; z = cmult(x,y); printf(“z = %f + %fi\n”, z.real, z.imag); } Complex cmult(Complex a, Complex b) { Complex c; c.real = a.real*b.real - a.imag * b.imag; c.imag = a.real*b.imag + a.imag * b.real; return c; } 1 解答 2 3次元での座標(x、y、z)ベクトルを構造体で定義し、二つの点の 間の距離を計算する関数distanceを定義せよ。 この関数を使って、(1、1、1)と(0、1、0)の距離を求める プログラムを作成せよ。 #include <stdio.h> #include <math.h> struct vector { double x, y, z; }; typedef struct vector Vector; double distance(Vector, Vector); main() { Vector x = {1.0, 1.0, 1.0}; Vector y = {0.0, 1.0, 0.0}; double d; d = distance(x,y); printf(“distance = %f”, d); } double distance(Vector a, Vector b) { double d; d = (a.x-b.x)*(a.x -b.x)+(a.y-b.y)*(a.y-b.y) + (a.z - b.z)*(a.z - b.z); d = sqrt(d); return d; } 2 解答 1 #include <stdio.h> #include <math.h> main() { char bun[100]; int n,j; char c; printf(“文章を入力”);scanf(“%s”, bun); n = strlen(bun); for(j = 0; j < n; j++) { c = bun[j]; if(c >= ‘a’ && c <= ‘z’) { c = c + 3; if(c > ‘z’) c = c - ‘z’ + ‘a’; } if(c >= ‘A’ && c <= ‘Z’) { c = c + 3; if(c > ‘Z’) c = c - ‘Z’ + ‘A’; } } printf(“暗号文は%s¥n”, bun); } 3 解答 2 正の整数nに対して、nの約数の和(1を含みnを含まない 約数の和)を返す関数を作れ。これをもとに、1以上 10000以下の友愛数を求めるプログラムを作成せよ。 #include <stdio.h> int yakusuu(int n) { int i,m=0; for(i = 1; i < n; i++) if(n % i == 0) m = m + i; return m; } 4 解答 2(続き) 正の整数nに対して、nの約数の和(1を含みnを含まない 約数の和)を返す関数を作れ。これをもとに、1以上 10000以下の友愛数を求めるプログラムを作成せよ。 #include <stdio.h> int yakusu(int); main() { int i,m,n; for(i = 1; i < 10000; i++){ m = yakusu(i); n = yakusu(m); if(n == i) printf(“%d and %d は友愛数¥n”, i, m); } } 5 解答 3 #include <stdio.h> double func(double,double[],int); main() { double f[] = {-3,1,3,0,0,1}; double a = 2.0; int n; double s; n = sizeof(f)/sizeof(double); s = func(a, f, n); printf(“関数の値は%f\n”, s); } double func(double a, double f[], int n) { int I; double s=0; for(I = 0; I < n; I++) { s = s*a + f[n-I-1]; } return s; } 6 解答 4 平面での座標ベクトル(x、y)を構造体として定義し、 2点間の距離を求める関数をプログラムせよ。 また、この関数を用いて与えられた3点を頂点とする 三角形の面積を求めるプログラムを作成せよ。 #include <stdio.h> #include <math.h> struct point { double x,y; }; typedef struct point Point; double distance(Point, Point); Double helon(double, double, double); main() { Point A = {1,0}; Point B = {0, 1}; Point C = {1,1}; double a, b, c, s; a = distance(A,B); b = distance(B,C); c = distance(C,A); d = helon(a,b,c); printf(“面積は%d\n”, d); } 7 解答 4(続き) double distance(Point a, Point b) { double d; d = (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); return sqrt(d); } double helon(double a, double b, double, c) { double s; s = (a+b+c)/2; S = s*(s-a)*(s-b)*(s-c); return sqrt(s); } 8 解答 5 正の実数を入力し平方根を計算するプログラム。ただし、負の実数を 入力した場合は、その旨表示するよう気配りすること。 #include <stdio.h> #include <math.h> main() { double d, s; printf(“正の実数を入力せよ”); scanf(“%lf”, &d); if(d > 0) { s = sqrt(d); printf(“%fの平方根は%fです\n”, d, s); } else { printf(“正の実数じゃないとだめ\n”); } } 9 解答 6 キーボードから 10 人の成績(100 点満点の整数値)を配列に読み込み、最高 点、最低点及び 平均点を表示するプログラム % ./a.out 学籍 No. 0 の成績:80 学籍 No. 1 の成績:70 学籍 No. 2 の成績:95 ... 学籍 No. 9 の成績:40 最高点は 100 点です。 最低点は 10 点です。 平均点は 55.3 点です。 % #include <stdio.h> main() { int d[10]; int j; double av, amax, amin; for(j = 0; j < 10; j++) { printf(“学籍番号 No. %d の成績”); scanf(“%d”, &d[j]); } amax = amin = d[0]; for(j = 0; j < 10; j++) { if(amax < d[j]) amax = d[j]; if(amin > d[j]) amin = d[j]; av = av+ d[j]; } av = av/10; printf(“最高点は%d点です\n”, amax); printf(“最低点は%d点です\n”, amin); printf(“平均点は%d点です\n”, av); } 10 解答 7 下のような模様を出力するプログラムをつくれ。 %./a.out 文字は何にする?# 最大の個数は?5 ##### #### ### ## # % #include <stdio.h> main() { char c; int n; int I,j; printf(“文字は何にする”); scanf(“%c”, &c); printf(“最大の個数は”); scanf(“%d”, &n); for(I = 0; I < n; I++) { for(j = 0; j < n-I;j++) putchar(‘ ‘); for(j = 0; j < n-I, j++) putchar(c ); } } 11 解答 8 ユークリッドの互除法を用いて、入力した 2 つの自然数の最大公約数を求めるプロ グラムを作れ。 #include <stdio.h> main() { int n,m; int a, b,r; printf(“自然数を二つ入力せよ:”); scanf(“%d %d”, &a, &b); if(a <= 0 || b <= 0) { printf(“入力エラー\n”); exit(1); } n = a; m = b; while(m != 0) { r = n % m; n = m; m = r; } printf(“%d と %d の最大公約数は%dです。\n”, a, b, m); } 12 解答 9 適当な初期値 を順に求めていくと、 の解を求める方法にニュートン法がある。 から始めて、 は解に近づいていく。 #include <stdio.h> #include <math.h> main() { double x,y,c; c = 2.0; y=1.0; do { x = y; y = (2*x+c/(x*x))/3.0; } while(fabs(x-y) > 0.0001); printf(“sqrt(%lf) = %lf¥n”, c, y); } 13
© Copyright 2024 ExpyDoc