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

C言語プログラミングに関する以下の問に答えよ。ただし,\は¥と同じである。

[1] 次のプログラムの出力結果を示せ。

#include<stdio.h>
int main(void) {
    int a = 0x456;
    int b = 0x0ff;
    printf("%x %d %d %x\n", a, b, a|b, b>>1);
    return 0;
}

[2] 組み合わせの数 に関するプログラムを作成する。ただし, は正の整数で とする。

  1. を計算する関数 comb を以下のように作成する。空欄を適切に埋めよ。
int comb(int n, int k) {
    int num=1, den=1;
    while(_____(1)_____) {
        num *=_____(2)_____;
        den_____(3)_____k--;
    }
    return num/den;
}
  1. 関数 comb を使って を計算し,右下図のような三角形を出力する関数 pascal を作成する。上下連続する段と段の数値の関係を考慮すると,これらの数値の配置には規則性があることがわかる。pascal(5) を実行したとき,右下図のように表示されるように,空欄を適切に埋めよ。
void pascal(int n) {
    int i, j, k;
    for(i=0; i<n; i++) {
        for(j=0; j<_____(4)_____; j++)
            printf(" ");
        for(k=0; k<=_____(5)_____;k++)
            printf("%2d",_____(6)_____);
        printf("\n");
    }
}
  1. 再帰法を用いて を計算する関数 comb2 を作成する。空欄を適切に埋めよ。
int comb2(int n, int k) {
    if(_____(7)_____|| n == k) return 1;
    else
        return _____(8)_____+_____(9)_____;
}

[3] 整数値の列 を処理するプログラムを作成する。以下のプログラムでは,これらの整数値は配列 data の要素として前から順に格納されており,配列の末尾に -1 を追加して値の終わりを表現している。

#include<stdio.h>
 
int get_min(int data[]) {
    int *p=data;
    int min=*p;
    while(_____(1)_____!=-1) {
        if(_____(2)_____) min=*p;
    }
    return min;
}
 
int get_order(int data[], int n);
 
int main(void) {
    int data[]={50,40,80,70,30,10,90,60,80,-1};
    int n;
    scanf("%d", &n);
    printf("最小値は%dです\n", get_min(data));
    printf("data[%d]=%d%d番目に大きい\n", \
    n, data[n], get_order(data, n));
    return 0;
}
  1. 配列 data の最小値を求める関数 get_min の空欄を適切に埋めよ。
  2. 配列 data[n] が,全体の大きい方から数えて何番目かを返す関数 get_order を作成する。ただし, は 0 以上の整数で,キーボードから入力するものとする。関数 get_order を作成せよ。
  3. のときのプログラムの実行結果を示せ。

解答:

[1]

[2]
1)

[3]
1)


这道编程题目综合考查了C语言中多个核心基础概念。第一大题主要考察对基本数据类型的格式化输出以及按位逻辑运算和移位运算的理解,需要特别注意十六进制和十进制的相互转换和占位符匹配。第二大题涉及基础算法的实现,通过循环和递归两种方式分别求取组合数,并且结合循环嵌套实现了经典的杨辉三角图案打印操作,在补全代码时要关注变量的自增自减特性及边界条件的判定。第三大题聚焦于数组与指针的操作,通过遍历带有特定结束标志的数组来计算最值与元素降序排名,填写求最小值的程序空缺时,需巧妙利用指针自增操作并提取其解引用值作为循环条件以避免死循环。