中央大学 理工学研究科 情報工学専攻 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);」は非負の整数 を 10 進数で表示する関数である。引数 の値が 10 未満であれば、5 行目で、数字「0」の文字コードと とを加算することで数字「0」から「9」までの文字コードを計算し、「putchar('0'+x);」関数を用いてその数字を表示する。10 以上であれば、6 行目で、まず x/10 を再帰呼出しで表示してから、x%10 を再帰呼出しで表示する。
なお、以下では、引数 や には必ず非負の値が与えられること、および、 の値は を表示するのに必要な桁数以上であることを仮定してよい。また、プログラム修正後に行数が増加してもよい。
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
-
このプログラムをコンパイル・実行したときに表示される文字列(数字列)を記せ。
-
ex1.cの 4~7 行を修正し、非負の整数を 2 進数で表示する関数「void putNum(int x){}」を定義せよ。解答用紙には修正後の関数定義を記述せよ。また、修正後のex1.cをコンパイル・実行させると表示される文字列を記せ。 -
ex1.cの 4~7 行を修正し、非負の整数を 桁の 2 進数で表示する関数「void putNum(int x, int w){}」を定義せよ。たとえば、putNum(11,8);の結果は「00001011」である。解答用紙には修正後の関数定義を記述せよ。上記修正に加え、12 行目を「putNum(x,20); putchar('\n');」として修正したファイルをコンパイル・実行したとき表示される文字列を記せ。 -
ex1.cの 4~7 行を修正し、非負の整数を 桁の 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) 用十进制显示非负整数 。若 ,第 5 行将数字字符 '0' 的字符编码与 相加,得到 '0' 至 '9' 中相应数字的编码,再用 putchar('0'+x); 显示该数字。若 ,第 6 行先递归显示 x/10,再递归显示 x%10。
可以假设参数 均非负,且 不小于表示 所需的位数。修改后代码行数可以增加。原程序、行号与 ASCII 表见上方。
-
写出编译并执行该程序后显示的字符串(数字串)。
-
修改
ex1.c第 4~7 行,定义用二进制显示非负整数的函数void putNum(int x){}。写出修改后的函数定义,以及编译、执行修改后程序时显示的字符串。 -
修改第 4~7 行,定义用 位二进制显示非负整数的函数
void putNum(int x, int w){}。例如putNum(11,8);输出「00001011」。写出函数定义。再将第 12 行改为putNum(x,20); putchar('\n');,写出执行结果。 -
修改第 4~7 行,定义用 位十六进制(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. 十進表示
ループ終了後の は 。従って表示は
5050
であり、末尾には改行が付く。
2. 二進表示
10 を 2 に置き換えればよい。
void putNum(int x) {
if (x < 2) putchar('0' + x);
else {
putNum(x / 2);
putNum(x % 2);
}
}
より、出力は
1001110111010
となる。 でも基底の場合に '0' を 1 文字出力する。
3. 幅を指定した二進表示
桁数 を再帰の停止条件にする。
void putNum(int x, int w) {
if (w == 0) return;
putNum(x / 2, w - 1);
putchar('0' + x % 2);
}
上位 桁を先に表示してから最下位ビットを表示する。途中で になっても、残りの桁数だけ '0' を出力する。問題文の に関する仮定により、有効桁は失われない。
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' がそれぞれ連続しているため、この文字コード計算で正しい桁が得られる。
なので、5 桁での出力は
013BA
である。各出力の末尾には main の putchar('\n') による改行が付く。