跳到主要内容

中央大学 理工学研究科 情報工学専攻 2025年2月実施 一般入試(春季)問題III

Author​

祭音Myyura (co-authored with GPT 6 Astra)

Description​

問題 I は必答。問題 II~V のうち、2 問を選んで解答すること。

問題 III

つぎの C 言語のプログラム(ファイル名を ex1.c とする)について以下の設問に答えよ。

プログラム中 4~7 行に定義された関数「putNum(int x);」は非負の整数 xx を 10 進数で表示する関数である。引数 xx の値が 10 未満であれば、5 行目で、数字「0」の文字コードと xx とを加算することで数字「0」から「9」までの文字コードを計算し、「putchar('0'+x);」関数を用いてその数字を表示する。10 以上であれば、6 行目で、まず x/10 を再帰呼出しで表示してから、x%10 を再帰呼出しで表示する。

なお、以下では、引数 xx や ww には必ず非負の値が与えられること、および、ww の値は xx を表示するのに必要な桁数以上であることを仮定してよい。また、プログラム修正後に行数が増加してもよい。

 1 #include<stdio.h>
2 #include<stdlib.h>
3
4 void putNum(int x){
5 if(x<10)putchar('0'+x);
6 else { putNum(x/10); putNum(x%10); }
7 }
8
9 int main(){
10 int x=0;
11 for(int i=1;i<=100;i++) x=x+i;
12 putNum(x); putchar('\n');
13 return 0;
14 }

ex1.c

  1. このプログラムをコンパイル・実行したときに表示される文字列(数字列)を記せ。

  2. ex1.c の 4~7 行を修正し、非負の整数を 2 進数で表示する関数「void putNum(int x){}」を定義せよ。解答用紙には修正後の関数定義を記述せよ。また、修正後の ex1.c をコンパイル・実行させると表示される文字列を記せ。

  3. ex1.c の 4~7 行を修正し、非負の整数を ww 桁の 2 進数で表示する関数「void putNum(int x, int w){}」を定義せよ。たとえば、putNum(11,8); の結果は「00001011」である。解答用紙には修正後の関数定義を記述せよ。上記修正に加え、12 行目を「putNum(x,20); putchar('\n');」として修正したファイルをコンパイル・実行したとき表示される文字列を記せ。

  4. ex1.c の 4~7 行を修正し、非負の整数を ww 桁の 16 進数(0~9、A~F)で表示する関数「putNum(int x, int w){}」を定義せよ。たとえば、putNum(11,2); の結果は「0B」である。文字と文字コードの 16 進数の表を以下に示す。上記修正に加え、12 行目を「putNum(x,5); putchar('\n');」として修正したファイルをコンパイル・実行したとき表示される文字列を記せ。

ASCII 表(16 進数 2 桁表示)

行は上位 1 桁、列は下位 1 桁を表す。文字 'A' は、0x40 行、1 列にある。'A' の文字コードは 0x41。

       0 1 2 3 4 5 6 7 8 9 a b c d e f
0x20: ! " # $ % & ' ( ) * + , - . /
0x30: 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
0x40: @ A B C D E F G H I J K L M N O
0x50: P Q R S T U V W X Y Z [ \ ] ^ _
0x60: ` a b c d e f g h i j k l m n o
0x70: p q r s t u v w x y z { | } ~

题目描述​

问题 I 为必答题;从问题 II~V 中选择 2 题作答。

问题 III

对上述 C 程序(文件名为 ex1.c)回答问题。

第 4~7 行定义的 putNum(int x) 用十进制显示非负整数 xx。若 x<10x<10,第 5 行将数字字符 '0' 的字符编码与 xx 相加,得到 '0' 至 '9' 中相应数字的编码,再用 putchar('0'+x); 显示该数字。若 x≥10x\geq10,第 6 行先递归显示 x/10,再递归显示 x%10。

可以假设参数 x,wx,w 均非负,且 ww 不小于表示 xx 所需的位数。修改后代码行数可以增加。原程序、行号与 ASCII 表见上方。

  1. 写出编译并执行该程序后显示的字符串(数字串)。

  2. 修改 ex1.c 第 4~7 行,定义用二进制显示非负整数的函数 void putNum(int x){}。写出修改后的函数定义,以及编译、执行修改后程序时显示的字符串。

  3. 修改第 4~7 行,定义用 ww 位二进制显示非负整数的函数 void putNum(int x, int w){}。例如 putNum(11,8); 输出「00001011」。写出函数定义。再将第 12 行改为 putNum(x,20); putchar('\n');,写出执行结果。

  4. 修改第 4~7 行,定义用 ww 位十六进制(0~9、A~F)显示非负整数的函数 putNum(int x, int w){}。例如 putNum(11,2); 输出「0B」。上方给出了字符与十六进制字符编码的 ASCII 表:行表示高位、列表示低位,字符 'A' 位于 0x40 行、1 列,其编码为 0x41。写出函数定义;再将第 12 行改为 putNum(x,5); putchar('\n');,写出执行结果。

Kai​

1. 十進表示​

ループ終了後の xx は 1+2+⋯+100=100⋅101/2=50501+2+\cdots+100=100\cdot101/2=5050。従って表示は

5050

であり、末尾には改行が付く。

2. 二進表示​

10 を 2 に置き換えればよい。

void putNum(int x) {
if (x < 2) putchar('0' + x);
else {
putNum(x / 2);
putNum(x % 2);
}
}

5050=212+29+28+27+25+24+23+215050=2^{12}+2^9+2^8+2^7+2^5+2^4+2^3+2^1 より、出力は

1001110111010

となる。x=0x=0 でも基底の場合に '0' を 1 文字出力する。

3. 幅を指定した二進表示​

桁数 ww を再帰の停止条件にする。

void putNum(int x, int w) {
if (w == 0) return;
putNum(x / 2, w - 1);
putchar('0' + x % 2);
}

上位 w−1w-1 桁を先に表示してから最下位ビットを表示する。途中で x=0x=0 になっても、残りの桁数だけ '0' を出力する。問題文の ww に関する仮定により、有効桁は失われない。

5050 の二進表現は 13 桁なので、先頭に 7 個の '0' を補った

00000001001110111010

が表示される。

4. 幅を指定した十六進表示​

void putNum(int x, int w) {
if (w == 0) return;
putNum(x / 16, w - 1);
int d = x % 16;
putchar(d < 10 ? '0' + d : 'A' + (d - 10));
}

ASCII 表では '0'~'9' と 'A'~'F' がそれぞれ連続しているため、この文字コード計算で正しい桁が得られる。

5050=1⋅163+3⋅162+11⋅16+105050=1\cdot16^3+3\cdot16^2+11\cdot16+10 なので、5 桁での出力は

013BA

である。各出力の末尾には main の putchar('\n') による改行が付く。

Reference​