编程语言基础 C语言

情 1
以下の問に答えよ。

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

#include<stdio.h>
int main(void){
    int a=0x0f0f, b=0x1234; char s[]="abcd";
    printf(" %d  %x  %x  %x  %c", a, a<<3, a|b, a^b, s[1]);
    return 0;
}

[2] 整数変数xに代入された整数が素数であるかどうかを判定するプログラムの処理過程は以下のようになる。下線部を適切な言葉や数式を用いて埋めよ。

  1. 整数変数iに ——(1)—— する。
  2. xとiの ——(2)—— を求める。
  3. ——(2)—— が0の場合,「素数でない。」と表示して, ——(3)—— する。
  4. ——(2)—— が0でない場合,iに1を加える。
  5. iが ——(4)—— の場合,ステップ2へ戻る。
  6. 「素数である。」と表示して, ——(3)—— する。

[3] 問題 [2] の処理過程に基づいて,整数変数xが素数かどうかを判定する関数プログラムfunc1をC言語により作成した。この関数は,入力引数として整数変数xをとり,返り値として“素数である”または“素数でない”という文字列を返す。下線部を適切に埋めよ。

___(1)___(int x)
{
    int i;
    for( ___(2)___ ){
        if( ___(3)___ ) return("素数でない");
    }
    return("素数である");
}
 

[4] 問題 [3] の関数プログラムの引数xに299を代入してプログラムを実行する。このとき,問題 [3] の関数プログラム内のforループが繰り返される回数を求めよ。

[5] 大きさがnである整数型1次元配列変数aの各要素に任意の整数が代入されている。また,整数変数xに別の整数が代入されている。配列変数aの各要素のなかで,xより大きな数値をもつ要素の値の合計を求めるプログラムを,再帰的プログラミングにより作成した。作成した関数プログラムfunc2は,x,a,nを引数として受け取り,配列変数aの各要素のなかで,xより大きな数値をもつ要素の値の合計を返り値として返す。下線部を適切に埋めよ。

int func2(int x, int a[], int n){
    if( ___(1)___ ){
        return ___(2)___;
    }else{
        if( ___(3)___ ){
            return ( func2(___(4)___) + ___(5)___ );
        }else{
            return ( func2(___(4)___) );
        }
    }
}
 

解答:

[1]

[2]
(1)
(2)
(3)
(4)

[3]
(1)
(2)
(3)

[4]

ループは のとき実行され、条件を満たして終了する。
実行回数は、

[5]
(1)
(2)
(3)
(4)
(5)


本题主要考察C语言的基础知识和算法逻辑。第一题涉及十六进制的位运算,包括左移按位或按位异或以及字符串数组的索引读取,注意十六进制到十进制的转换和位运算的对齐。第二题和第三题是判断素数的标准算法实现,通过从2遍历到目标数字减1,判断是否存在能整除的因子来确定素数,填空时需注意C语言中返回字符串字面量通常需要将其声明为字符指针类型,以及for循环和求余运算符的标准语法编写。第四题是对素数判断循环执行次数的计算,对299进行质因数分解即可得出其最小的非1质因子为13,因此循环从2一直执行到13共计12次。第五题考察递归函数的编写,核心在于寻找递归的基线条件即数组剩余检查长度为0时返回0,以及递归的递推关系即判断当前数组检查的最后一个元素是否大于x,若大于则将其加入总和并对剩余的子数组进行递归调用,否则仅对剩余子数组进行递归,编写时需特别注意C语言中数组索引从0开始,因此长度为n的数组末尾元素索引为n减1。