[1]次のプログラムの演算結果を求めよ。
#include<stdio.h>
int main(void){
int a=0x1234, b=0xabcd;
printf(" %x\n %x\n %x\n %x\n", a&b, a|b, a^b, b>>3 );
return 0;
}[2]正方行列の転置行列を求める関数 trans を作成した。2次元配列の整数変数 a に転置したい行列を,整数変数 n にそのサイズを与えて関数 trans を呼ぶと,trans は a に定義された行列の転置行列を a に代入して返す。ただし,2次元配列の整数変数 a の最大サイズは 10 である。下線部に入れるべき式,または式の一部を答えよ。
____(1)____ trans( int a[][10], int n ){
int i,j,x;
for( i=0; ____(2)____ ){
for( ____(3)____; j++ ){
x=a[i][j]; ____(4)____;
}
}
}[3]整数 n を素数判定する関数 check を再帰的プログラミングによって作成した。関数 check は引数として整数変数 n と m をとり,n が素数であれば OK を,素数でなければ NG を返す。ただし,最初に関数 check が呼ばれるときには,m に 2 を与えなければならない。下線部に入れるべき式,または式の一部を答えよ。
____(1)____ (int n, int m){
if( m > n/2 ){
return "OK";
}else if( ____(2)____ ){
return "NG";
}else{
return check(____(3)____);
}
}[4]問[3]の関数 check において,引数 n に 143 を,引数 m に 2 を代入して関数 check を呼ぶとき,関数 check が呼ばれる回数を求めよ。また,その理由について述べよ。
[5]問[3]の関数 check を用いて整数 n の素数判定を行い,その結果を出力する関数 main を作成せよ。関数 main では,変数 n へ値をキーボードから入力し,関数 check の結果をファイル result に出力するようにせよ。
解答:
[1]
よって出力は
[2]
[3]
[4]
[5]
这道题综合考查了C语言的基础知识。第一问涉及按位逻辑运算(与、或、异或)和右移运算,需要将十六进制数展开为二进制进行逐位计算,注意右移时高位补零(通常正数算术右移或逻辑右移效果相同)。第二问考查二维数组操作和循环逻辑,转置矩阵即将矩阵的行和列互换,遍历时内层循环的起始索引应为 i+1,以避免重复交换导致矩阵还原。第三问是利用递归进行素数判断,返回值是字符串字面量因此函数类型应为 char*;判断整除的条件是取模运算为0;递归时被除数 n 不变,除数 m 递增。第四问追踪递归执行过程,143是合数(),只有当除数达到11时才会命中整除条件返回,因此经历了从2到11的10次调用。第五问考查标准输入输出以及文件读写操作,需要使用 fopen 打开文件,使用 fprintf 写入数据,最后用 fclose 关闭文件指针。