[1] C言語で記述された以下のプログラムの画面出力結果を示せ。
#include <stdio.h>
int main() {
int a, b;
a = 1.5; b=9.7;
printf("%d\n", a++ );
printf("%d\n", b%a );
printf("%d\n", b>>2);
return 0;
}[2] 関数 maxswap は,サイズ m の整数型配列変数 a と整数型変数 n ( )を受け取り, a[0], a[1], ..., a[n-1] のうちで最大値を格納する要素の要素番号を整数型変数 imax に代入する。続いて,変数 a の imax 番目の要素と a[n-1] の値を交換する。下線部に記載するべき式,または式の一部を答えよ。
int maxswap( int a[], int n ) {
int i, imax, max;
____(1)____ ;
for( ____(2)____ ; i++) if( ____(3)____ ) imax = i;
max = a[imax] ; ____(4)____ a[n-1] = max ;
return 0;
}[3] 問題[2]の関数 maxswap を用いて整数型配列変数 a の要素を昇順に並べかえるプログラムを作成した。下線部に記載するべき式,または式の一部を答えよ。
#include <stdio.h>
int maxswap(int a[], int n);
int main() {
int a[]={1,20,-3,100,5,-6,8,-10}, n=8, i;
for(i=0; ____(1)____ ) maxswap( ____(2)____ );
for(i=0; i<n; i++) printf("%d ", a[i]);
return 0;
}[4] 零ベクトルでない2つのn次元ベクトルのなす角度を求めるプログラムを作成した。各ベクトルの値はサイズnの倍精度型実数配列aとbに格納されている。値xの平方根と逆余弦は,それぞれ関数 sqrt(x) と acos(x) で与えられる。括弧内に入れるべき式,または式の一部を答えよ。
#include <stdio.h>
____(1)____
int main() {
int i, n=3;
double a[]={1,2,3}, b[]={2,-1,1}, ____(2)____;
for(i=0; i<n; i++){
sa += a[i]*a[i]; sb += b[i]*b[i]; prod += a[i]*b[i];
}
printf("%lf ", acos(____(3)____) );
return 0;
}解答:
[1]
変数 は整数型(int)であるため、代入時に小数点以下が切り捨てられる。
printf("%d\n", a++ ); について、後置インクリメントであるため を出力した直後に となる。
printf("%d\n", b%a ); について、剰余演算であるため以下の値を出力する。
printf("%d\n", b>>2); について、右シフト演算は での除算と等価であるため以下の値を出力する。
[2]
最大値のインデックスを初期化し、配列の要素を走査して最大値を探し、最後に末尾の要素と交換する処理を行う。
(1) 最大値のインデックスを初期化する。
(2) ループの初期化と継続条件を指定する。
(3) 現在の最大値よりも大きい要素を見つけた場合の条件を指定する。
(4) 要素の交換処理を完成させる。
[3]
maxswap 関数を用いて選択ソートを実装し、配列を昇順に並べ替える。未ソート部分の最大値を順次後方に移動させる。
[4]
のなす角度 は、内積とノルムを用いて以下のように表される。
(1) 数学関数 sqrt および acos を使用するため、ヘッダファイルをインクルードする。
(2) 累積和を計算するための変数をゼロで初期化する。
(3) 上記の公式に基づく計算式を記述する。
本题主要考察C语言的基础语法以及基本的算法实现。第一题涉及数据类型的隐式转换,浮点数赋值给整型变量时会截断小数部分。同时考察了后置自增运算符的特性,表达式先返回原值再进行加一操作。位运算符右移相当于对原数进行除以二的指定次幂并向下取整的操作。第二题和第三题实现了一个经典的变种选择排序,每次在未排序的序列中找到最大值并将其交换到当前未排序部分的末尾,从而实现数组的升序排列。在填写循环条件时需要注意数组下标的边界问题。第四题则考察了空间几何中向量夹角的求解公式,即通过内积除以两个向量的模长乘积来计算夹角的余弦值,最后利用反余弦函数求出角度,同时测试了对C语言标准数学库的调用和变量初始化的重要性。