コンピュータプログラミング演習(CPII) 中間テスト(2006/12/01)

制限時間90分 20点満点
http://www.tuat.ac.jp/~kamelab/gcc/test061201.html
教科書、ノート、配布資料持ち込み可。PC使用可。
解答は解答用紙の各欄に記述すること。

第1問

キーボードから、5桁の二進数(binary)を5桁目から1桁づつ入力し、十進数(decimal)へと変換するプログラムを作る。

例:キーボードから「1→0→0→1→1」と入力すると、二進数10011は、十進数では

(1・24)+(0・23)+(0・22)+(1・21)+(1・20)=19
であり、従って画面上に「19」と表示する。

問1
int power(int n)は、1つの整数n(≧1)を入力すると、2のべき乗

2n-1
を返り値(戻り値)として返す(戻す)関数です。返り値(戻り値)として変数ansをとり、n>1の場合はforループを使用して2のべき乗を計算、n=1の場合はans=1とします。題意に沿うよう[空欄1],[空欄2],[空欄3]を埋めなさい。

問2
main()中において、5桁目から順番に1桁目まで、キーボードから0または1の整数を読み込みます。変数nが何桁目かを表すとして、題意に沿うよう[空欄4]を埋めなさい。

問3
キーボードから入力する整数値を、変数aに格納します。変数aは0または1でなければなりません(二進数)。正しい値が入力された場合は演算を実行、「0または1」以外の値が読み込まれた場合は、「正しい値を入力せよ」と画面に表示します。題意に沿うよう[空欄5],[空欄6]を埋めなさい。

問4
関数int power(int n)を呼び出し、何桁目かを表す変数nの値を引き渡します(実引数)。関数power()の返り値(戻り値)2n-1を変数ansに代入します。題意に沿うよう[空欄7]を埋めなさい。

問5
変数sumに変数ansの値を加え、新たなsumの値とします。題意に沿うよう[空欄8]を埋めなさい。

(プログラム内左端の行番号は便宜上付けたにすぎません。第2問も同様)

1:#include <stdio.h> /* 二進数を十進数へと変換する */
2:int power(int n) /* 2のべき乗2(n-1)計算用関数 */
3:{
4:	int i,ans;
5:	ans=1;
6:	if([空欄1]){
7:		for([空欄2]){
8:			[空欄3] /* 2のべき乗計算 */
9:		}
10:	}
11:	return ans;
12:}
13:int main() /* main */
14:{
15:	int n,a,ans,sum; 
16:	sum=0;
17:	n=5; /* 入力値は5桁目からスタート */
18:	while([空欄4]){ /* 5桁目から1桁目までwhileループ */
19:		printf("2進数(0または1)を入力\n");
20:		[空欄5] /* キーボードから変数aへ入力 */
21:			if([空欄6]){
22:				printf("%d桁目:%d\n",n,a);
23:					if(a==1){ /* aが1の場合 */
24:						ans=[空欄7]
25:						[空欄8]
26:					}
27:				n--;
28:			}
29:			else{
30:				printf("正しい値を入力せよ\n");
31:			}
32:	}
33:	printf("入力値を十進数で表す:%d\n",sum);
34:	return 0;
35:}

第2問

区分求積法を用いて以下の積分を実行し、解析値(この場合2)と比較、結果をファイルに出力するプログラムを作成します。

問1
本プログラム中において数学ライブラリーを利用します。題意に沿うよう [空欄1]に必要なヘッダーファイル名を書きなさい。

問2
区分求積法(後述する「参考」参照のこと)を利用するため、積分区間0≦x≦πを変数Nを用いてN等分し、変数dx=π/Nとします(等分数N)。題意に沿うよう[空欄2]を埋めなさい。なお、円周率πの値を表すのに、本プログラム中で設定したマクロpi、もしくは、マクロM_PI(gccコンパイラにおいてあらかじめ設定されているマクロの一つ)を利用してよい。

問3
forループ内にて変数kの値を0からN-1まで一つづつ増加させ、区分求積法により、

の値を、変数sumを用いて計算します。なお、Δxは変数dxに対応します。題意に沿うよう[空欄3],[空欄4]を埋めなさい。

問4
ファイルkekka.datを書き込みモードで開きます。題意に沿うよう[空欄5]を埋めなさい。

問5
解析値2、等分数の値N、区分求積法による計算値sumを、画面に表示、同様に、ファイルkekka.datへと書き出します。題意に沿うよう[空欄6]を埋めなさい。

問6
等分数の値としてN=10,N=100と2通り設定した場合の計算値sumを、解答欄にそれぞれ書きなさい。

1:#include<stdio.h> /* 区分求積法 */
2:#include<stdlib.h>
3:#include<[空欄1]> /* 数学ライブラリー利用 */
4:#define pi 3.1415926 /* 円周率πの値としてマクロpiを設定 */
5:int main()
6:{
7:	FILE *fp; /* ファイルポインタ */
8:	int N,k;
9:	double dx,sum;
10:	N=10; /* 積分区間をN等分、Nの値は10とする */
11:	dx=[空欄2] /* Δxの値設定 */
12:	sum=0; /* 計算された積分値を格納する変数sum */
13:	for([空欄3]){
14:		[空欄4] /* 敗in(k・Δx)・Δxを計算 */
15:	}
16:	fp=[空欄5] /* ファイルkekka.datオープン */
17:	if(fp==NULL){
18:		printf("Can not open kekka.dat!\n");
19:		exit(1);
20:	}
21:	printf("解析値=2,等分数=%d,区分求積値=%lf\n",N,sum);
22: 	[空欄6] /* ファイルkekka.datへ出力 */
23:	fclose(fp); /* ファイルクローズ */
24: return 0;
25:}

(参考:関数f(x)をa≦x≦bの範囲で区分求積する場合は以下の通りになります。積分区間をN等分し、Δx=(b-a)/Nと与えます。分点をa,a+Δx,a+2・Δx,・・・,a+(N-1)・Δxとします。その結果、積分値を

と近似し、求めることができます。今回のプログラムでは、a=0,b=π、従ってΔx=π/Nとなるので、次の計算式を用います。

区分求積法では、和の範囲を0≦k≦N-1ではなく、1≦k≦Nと設定した、

を近似式として用いることもあります。また、これら二つの式を平均化した
を、近似式として用いる場合もあり、台形則と呼びます。)

***問題文ここまで***

http://www.tuat.ac.jp/~kamelab/gcc/index.html コンピュータプログラミング演習II 亀田・佐藤クラスのページへ