编程语言基础 C语言 位运算 指针 递归

以下の問に答えよ。

[1]次のC言語プログラムの標準出力結果を示せ。

#include <stdio.h>
int main(void){
    int x1 = 5321, x2 = 0xf0f0, x3 = 037;
    printf( "%x %d %d %x \n", x1, x1-x2, x2+x3, x1>>2 );
    return 0;
}
 

[2]半角英数文字と半角空白からなる文字列に含まれる半角空白の個数を数えて標準出力に表示するプログラムをC言語で作成した。下線部を適切に埋めよ。

#include <stdio.h>
int main(void){
    char s[ ]="This is a pen";
    int ____(1)____ ;
    char *p;
    p = s;
    while( *p ____(2)____ ){
        if( *p ____(3)____ ){
            n++;
        }
        ____(4)____ ;
    }
    printf( ____(5)____ , n );
    return 0;
}

出力結果を以下に示す。
3

[3]ベクトルの内積を計算して標準出力に表示するプログラムを再帰的プログラミングによってC言語で作成した。下線部を適切に埋めよ。

#include <stdio.h>
double f( ____(1)____ ){
    if( n > 1 ){
        return ( ____(2)____ + f(a,b,n-1) );
    }else{
        return ( ____(3)____ );
    }
}
 
int main(void){
    int n = 5;
    double a[ ] = {5.0,4.0,3.0,2.0,1.0}, b[ ] = {1.0,10.0,100.0,1000.0,10000.0};
    printf( "%lf\n", f(a,b,n) );
    return 0;
}

解答:
[1]
各変数の値を10進数および16進数で評価する。

四則演算およびビット演算の結果を計算する。

指定されたフォーマットに従い、結果を出力する。

[2]
変数 に半角空白の個数を記録するため初期化する。

文字列の終端文字 \0 に達するまでループを行う。

現在指している文字が半角空白であるかを判定する。

ポインタを次の文字へ進める。

整数 を出力するための書式指定子を記述する。

[3]
メイン関数における f(a,b,n) の呼び出しに対応するため、配列 および整数 を引数として受け取る。

再帰の漸化式として、インデックス の要素同士の積を現在の結果に加算する。

の場合、配列の先頭要素同士の積を返す。


这三道题目综合考察了C语言的基础语法与核心机制。第一题涉及不同进制常量的表示与转换机制,以及位移运算符的性质,需要明确有符号和无符号格式化输出的具体作用。第二题利用字符指针遍历字符串,考查了对字符串在内存中以空字符结尾的理解,循环条件依赖于解引用指针得到的值,并在满足特定匹配条件时累加计数。第三题通过递归函数实现向量内积的计算,需要正确设置递归的边界终止条件和传递的参数类型,尤其是需要理解C语言数组从零开始索引的特点,从而在每次递归调用中准确访问相应的数组元素。