编程语言基础 C语言 位运算 多维数组 递归

以下のC言語の問に答えよ。
[1] 次のプログラム実行時の標準出力への表示結果を示せ。

#include <stdio.h>
int main(void){
    int x1 = 0xacac, x2 = 1010;
    printf(" %4x %d %d %x \n", x2, x1+x2, x1|x2, x1>>3);
    return 0;
}

[2] 行列の積を求めるプログラムを作成した。下線部を適切に埋めよ。

#include <stdio.h>
int f(    (1)    ){
    int i,k,l;
    for(k=0; k<n; k++)
        for(l=0; l<n; l++){
            (2)   ;
            for(i=0; i<m; i++) c[k][l]   (3)   ;
        }
    return 0;
}
int main(void){
    int a[2][3]={{1,2,3},{7,8,9}},
        b[3][2]={{1,-1},{10,-10},{100,-100}}, c[2][2],
        i, j, n=2, m=3;
    f(a,b,c,m,n);
    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
            printf("%d\n",c[i][j]);
    return 0;
}

標準出力結果例:

321
-321
987
-987

[3] 配列の要素の最大値を出力するプログラムを再帰的プログラミングを用いて作成した。下線部を適切に埋めよ。

#include <stdio.h>
int f(int a[], int n, int max){
    if( n < 0 ){
        return    (1)   ;
    }else if( a[n] > max ){
        return f(   (2)   );
    }else{
        return f(   (3)   );
    }
}
int main(void){
    int a[]={-5,0,10,2,-3,5,-1,3,-20,1}, n=10;
    printf("%d\n",f(a, n-2, a[n-1]));
    return 0;
}

標準出力結果例:

10

解答:
[1]


[2]
(1)

(2)

(3)

[3]
(1)

(2)

(3)


这是一道C语言基础题。第一题考察了数制转换以及位运算。变量x1的值为十六进制数0xacac,十进制下等于44204。变量x2的值为十进制数1010,转换为十六进制为0x3f2。x1与x2相加结果为45214。x1和x2进行按位或运算,相当于0xacac | 0x03f2,结果为0xaffe,转换为十进制是45054。x1右移3位,即0xacac >> 3,二进制下是1010110010101100整体右移3位并在高位补零,得到0001010110010101,即十六进制的0x1595。注意格式化字符串中的前导空格,%4x由于位数不足四位会在前面补一个空格,因此最终输出的开头有两个空格。第二题考察了多维数组作为函数参数的传递和矩阵乘法。由于函数调用时直接传入了二维数组的名字,因此函数形参必须指定除第一维以外的其他维度的长度。矩阵乘法中,计算结果矩阵的每一个元素之前必须将其初始化为0,然后利用内层循环累加对应行列元素的乘积。第三题考察了递归函数的编写。递归函数在处理数组最大值时,从数组尾部开始向前遍历,当索引n小于0时说明遍历完毕,直接返回记录的最大值max。如果当前考察的元素a[n]大于max,则用该元素更新max并继续向前递归搜索;否则max保持不变并继续向前递归。