编程语言基础 C语言程序设计 进制转换 位运算 数组遍历 递归函数

以下のC言語の問に答えよ。

[1] 次のプログラム実行時の標準出力への表示結果を示せ。

#include <stdio.h>
 
int main(void)
{
    int x1 = 0xebda, x2 = 0456;
    printf("%d %d %x %x %x \n", x1, x2, x1-x2, x1&x2, x2>>2);
    return 0;
}
 

[2] 整数値からなるベクトルの成分のうち,偶数であるものの積を求めて表示するプログラムを作成した。下線部を適切に埋めよ。

#include <stdio.h>
 
int f(int *a, int n)
{
    int i, ans = 1;
    for(    (1)    ){
        if(    (2)    %2 == 0 ) ans *=    (2)    ;
    }
    return    (3)    ;
}
 
int main(void)
{
    int n = 10, a[] = {7,2,13,-4,5,9,-1,21,-6,3};
    printf("%d\n", f(a,n));
    return 0;
}
 

標準出力結果例:
48

[3] 整数値からなるベクトルの成分のうち,数値が0より大きいものの個数を求めるプログラムを再帰的プログラミングにより作成した。下線部を適切に埋めよ。

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

標準出力結果例:
6


解答:
[1]
は16進数であり、10進数で表すと


は8進数であり、10進数で表すと

また、 を16進数で表すと である。

を16進数で表すと である。
について、ビットごとの論理積を計算する。



を右に2ビットシフトした値である。


よって、出力結果は

[2]
(1) 配列の先頭から要素数 n までループを回すため、初期化、条件、更新式を記述する。

(2) 配列 ai 番目の要素にアクセスするため、配列要素の指定を行う。

(3) 最終的な偶数の積が格納された変数 ans を戻り値とする。

[3]
(1) 関数 f の引数リストを定義する。main 関数での呼び出し f(a, m, n) から、引数は整数配列のポインタ a、現在のインデックス(または残り要素数) m、および条件を満たす要素のカウント n である。

(2) 配列のすべての要素の検査が終わったとき(m == 0)、カウントされた個数 n を返す。

(3) 要素 a[m-1] が0より大きい場合、カウント n を1増やし、次の要素を検査するため m を1減らして再帰呼び出しを行う。

(4) 要素 a[m-1] が0以下の場合、カウント n はそのままで、次の要素を検査するため m を1減らして再帰呼び出しを行う。


本题考察了C语言基础语法,包含了格式化输出时的进制转换、位运算、循环遍历数组以及递归函数的编写。第一题重点在于理解各种进制表示的前缀(如0x代表十六进制,0代表八进制)以及位操作符(按位与和右移操作)。第二题是一个常规的数组遍历操作,只需要补全for循环的基本结构以及数组元素的访问即可。第三题要求使用递归的方式统计数组中大于0的元素个数,关键在于理解递归函数的参数传递过程。在这个递归设计中,变量 m 作为从后往前遍历的数组索引(同时表示剩余未处理元素的数量),而变量 n 作为累加器用来传递当前已经统计到的符合条件的元素个数。当 m 减小到0时,递归触底,返回最终累加的结果。