一、单选题(每题2分,共30分)
题目 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
答案 | C | D | C | C | C | A | A | D | C | C | A | B | A | C | B |
1.下面C++数组的定义中,会丢失数据的是( )。
A.char dict_key[] = {'p','t','o'};
B.int dict_value[] = {33,22,11};
C.char dict_name[]={'chen','wang','zhou'};
D.float dict_value[]={3,2,1};
【答案】C
【考纲知识点】
数组的定义与初始化规则:考查对 C++ 中数组定义及初始化时数据类型和赋值方式的正确理解,属于一级考纲中数组相关知识点范畴。不同数据类型的数组在初始化时有着特定的要求,若不符合这些要求,可能会出现编译错误或者导致数据不符合预期的情况,如数据丢失等问题。
字符数组的特性:重点涉及字符数组在存储字符串相关内容时的特殊处理方式,与普通基本数据类型数组有所区别,需要准确把握字符数组存储多个字符串时的正确初始化语法,以此来判断各选项中数组定义是否正确以及是否存在数据丢失等情况。
【解析】
选项 A:
“char dict_key[] = {'p', 't', 'o'};”,这是定义一个字符数组并进行初始化的正确方式。这里将单个字符依次罗列在初始化列表中,数组会根据这些字符的数量来确定自身的大小,它能够正确地存储这几个字符元素,不存在数据丢失的情况,所以该选项不符合题意。
选项 B:
“int dict_value[] = {33, 22, 11};”,对于整型数组的初始化,这样将整型常量依次写在初始化列表中是合法的操作,数组会按照给定的整型值进行初始化,每个元素都能准确存储相应的值,不会出现数据丢失,因此该选项也不符合题意。
选项 C:
“char dict_name[] = {'chen', 'wang', 'zhou'};”,这种初始化方式对于字符数组来说是错误的。在 C++ 中,如果要使用字符数组存储多个字符串(这里‘chen’‘wang’‘zhou’可看作是三个字符串),正确的做法是使用二维字符数组或者使用字符指针数组等合适的方式来处理。而这里的写法,编译器并不能按照期望的那样将三个字符串完整存储到 dict_name 数组中,会导致数据丢失或者编译报错等问题,因为它不符合字符数组存储多个字符串的语法规范,所以该选项符合会丢失数据的描述。
选项 D:
“float dict_value[] = {3, 2, 1};”,浮点型数组按照这样的方式初始化,即将浮点型常量罗列在初始化列表中,是符合浮点型数组初始化规则的,数组能够正确地为每个元素分配空间并存储相应的浮点值,不存在数据丢失情况,该选项不符合题意。
综上所述,会丢失数据的是选项 C。
2.在下列编码中,不能够和二进制"1101 1101"相等的是( )。
A.(221)10进制
B.(335)8进制
C.(dd)16进制
D.(5d)16进制
【答案】D
【考纲知识点】
不同进制数的转换规则:考查二进制、十进制、八进制以及十六进制之间相互转换的知识,属于计算机基础知识以及 C++ 编程中涉及数据表示相关的一级考纲知识点范畴。需要掌握各进制转换的方法,以便准确判断不同进制表示的数是否等价。
进制转换的计算过程:重点在于能熟练运用相应的计算方法将给定的各进制数转换为二进制数或者将二进制数转换为其他进制数进行对比,以此来确定哪一个选项与给定的二进制数 “1101 1101” 不相等。
【解析】
1.将二进制数 “1101 1101” 转换为十进制数
按照二进制转十进制的方法 “按权展开求和”,计算如下:
1×27+1×26+0×25+1×24+1×23+1×22+0×21+1×20
=128+64+0+16+8+4+0+1
=221(10)
所以选项 A 是相等的,不符合题意。
2. 将二进制数 “1101 1101” 转换为八进制数
先将二进制数从右到左每三位一组进行分组(不足三位的在左边补 0),得到 “011 011 101”,然后将每组二进制数转换为对应的八进制数:
011对应3
011对应3
010对应5
组合起来就是 335(8),所以选项 B 是相等的,不符合题意。
3. 将二进制数 “1101 1101” 转换为十六进制数
先将二进制数从右到左每四位一组进行分组(不足四位的在左边补 0),得到 “1101 1101”,然后将每组二进制数转换为对应的十六进制数:
1101对应D(在十六进制中用A-F表示10-15,这里1101对应13,用D表示)
1101对应D
组合起来就是DD(16),所以选项 C 是相等的,不符合题意。
而选项 D 是 5D(16),,与通过转换得到的十六进制 DD(16) 不相等,符合题意。
综上所述,不能够和二进制 “1101 1101” 相等的是选项 D。
3.下面C++代码执行后不能输出"GESP"的是( )。
A.string str("GESP"); cout<<str<<endl;
B.string str="GESP"; cout<<str<<endl;
C.string str("GESP"); cout<<str[1]<<str[2]<<str[3]<<str[4]<<endl;
D.string str{"GESP"}; cout<<str<<endl;
【答案】C
【考纲知识点】字符串的定义和使用
【解析】
选项 A 中,通过 string str("GESP"); 定义了一个字符串 str 并初始化为 "GESP",然后使用 cout<<str<<endl; 能正确输出整个字符串 "GESP"。
选项 B 中,string str = "GESP"; 这种方式同样定义并初始化了字符串 str 为 "GESP",输出也没问题。
选项 C 中,cout<<str[1]<<str[2]<<str[3]<<str[4]<<endl; 这种方式是输出字符串中指定位置的字符,依次是 E、S、P,缺少了第一个字符 G,所以不能输出 "GESP"。
选项 D 中,string str{"GESP"}; 也是一种合法的定义字符串的方式,输出同样能得到 "GESP"。
综上所述,选择 C 选项。
4.执行下面C++代码输出是( )。
int temp=0;
for(int i=l;i<7;i++)
{
for(int j=1;j<5;j++)
{
if(i/j==2){
temp++;
}
}
}
cout<<temp<<endl;
A.10
B.8
C.4
D.3
【答案】C
【考纲知识点】循环结构、条件判断
【解析】
外层循环 i 从 1 到 6 变化,内层循环 j 从 1 到 4 变化。
当 i / j == 2 时,temp 会自增。
当 i = 4 时,j = 1 和 j = 2 满足条件;当 i = 6 时,j = 1 和 j = 2 满足条件,所以一共满足条件 4 次,temp 自增 4 次,最终 temp 的值为 4。
所以选择 C 选项。
5.执行下面C++代码输出是( )。
string str = ("chen");
int x = str.length();
int temp = 0;
for (int i = 0; i <= x; i++)
{
temp++;
}
cout << temp << endl;
A.4
B.2
C.5
D.3
【答案】C
【考纲知识点】字符串操作、循环结构。
【解析】
首先,string str = "chen" 定义了一个字符串 str ,其长度为 4 。
然后,循环 for (int i = 0; i <= x; i++) ,这里 x 是字符串 str 的长度 4 ,由于循环条件是 i <= x ,所以循环会执行 5 次(0、1、2、3、4),每次循环 temp 自增 1 ,最终 temp 的值为 5 。
所以选择 C 选项。
6.执行下面C++代码输出是( )。
string str = ("chen");
int x = str.length();
cout << x << endl;
A. 4
B. 3
C. 2
D. 5
【答案】A
【考纲知识点】字符串的基本操作。
【解析】
在 C++ 中,string str = "chen" 定义了一个字符串 str ,其内容为 "chen" 。通过 str.length() 可以获取字符串的长度,即字符的个数。字符串 "chen" 包含 4 个字符,所以 x 的值为 4 ,最终输出 4 。
因此选择 A 选项。
7.执行下面C++代码输出是( )。
string str = ("chen");
cout << str[5] << endl;
A. 输出未知的数B. 输出'n'
C. 输出'\0'
D. 输出空格
【答案】A
【考纲知识点】字符串的索引访问及越界处理。
【解析】
字符串 str = "chen" 的有效索引范围是 0 到 4 。当尝试访问 str[5] 时,发生了越界访问。C++ 对于越界访问的行为是未定义的,所以输出的结果是未知的,可能会导致程序崩溃或产生不可预测的结果。
因此选择 A 选项。
8.下⾯C++代码执⾏后的输出是( )。
char ch[10] = {'1'};
cout << ch[2] << endl;
A. 0
B. 1
C. 输出空格
D. 什么也不输出
【答案】D
【考纲知识点】字符数组的初始化和未初始化元素的默认值。
【解析】
在这个代码中,定义了一个字符数组 ch[10] 并初始化为 {'1'} ,只初始化了第一个元素为 '1' ,其余元素未初始化。对于未初始化的字符数组元素,其值是未定义的。
当使用 cout << ch[2] << endl; 尝试输出未初始化的元素 ch[2] 时,由于其值未定义,所以不会有明确的输出。
因此选择 D 选项。
9.下⾯C++代码⽤于统计每种字符出现的次数,当输出为3时,横线上不能填⼊的代码是( )。
string str = "GESP is a good programming test!";
int x = 0;
for (int i = 0; i < str.length(); i++){
if(___________){
x++;
}
}
cout << x << endl;
A. str[i]==’o’
B. str[i]==’a’+14
C. str[i]==115
D. str[i]==111
【答案】C
【考纲知识点】字符串操作、字符比较。
【解析】
在 ASCII 码中,'o' 的 ASCII 值是 111,'a' + 14 计算得出的也是 111。
选项 A,str[i] == 'o',直接比较字符 'o',可以统计 'o' 的出现次数。
选项 B,'a' 的 ASCII 值是 97,97 + 14 = 111,所以 str[i] == 'a' + 14 也能统计 'o' 的出现次数。
选项 C,115 对应的字符不是 'o',所以不能统计 'o' 的出现次数。
选项 D,111 对应的字符是 'o',可以统计 'o' 的出现次数。
综上所述,不能填入的代码是 C 选项。
10.32位计算机中,C++的整型变量int能够表⽰的数据范围是( )。
A.2^31~(2^31)-1
B.2^32
C.-2^31~+(2^31)-1
D.-(2^31)+1~2^31
【答案】C
【考纲知识点】整型数据类型的取值范围
【解析】
在 32 位计算机中,C++ 的整型变量 int 一般是 4 个字节,即 32 位。最高位为符号位,0 表示正数,1 表示负数。
能表示的最大正数是 2^31 - 1,能表示的最小负数是 -2^31。
所以 int 能够表示的数据范围是 -2^31 ~ +(2^31 - 1) 。
因此选择 C 选项。
11.下⾯C++程序执⾏的结果是( )。
int cnt = 0;
for (int i = 0; i <= 20; i++){
if (i % 3 == 0 && i % 5 == 0){
cnt++;
}
}
cout << cnt;
A. 2
B. 3
C. 5
D. 4
【答案】A
【考纲知识点】循环结构、取余运算。
【解析】
在这个循环中,i 从 0 到 20 变化。
当 i 同时能被 3 和 5 整除时,即能被 15 整除时,cnt 会加 1 。
在 0 到 20 中,能被 15 整除的数有 0 和 15 ,共 2 个。
所以 cnt 最终的值为 2 。
因此选择 A 选项。
12.C++的数据类型转换让⼈很难琢磨透,下列代码输出的值是( )。
int a = 3;
int b = 2;
cout << a / b * 1.0 << endl;
A.1.5
B.1
C.2
D.1.50
【答案】B
【考纲知识点】数据类型转换、运算优先级
【解析】
在 C++ 中,当整数和浮点数进行混合运算时,如果先进行整数运算,结果仍然是整数。
在这个例子中,先计算 a / b,由于 a 和 b 都是整数,所以 a / b 的结果是整数 1,然后再乘以 1.0,得到的结果仍然是 1。
因此选择 B 选项。
13.C++代码⽤于抽取字符串中的电话号码。约定:电话号码全部是数字,数字之间没有其他符号如连字符或空格等。代码中变量strSrc仅仅是⽰例,可以包含更多字符。下⾯有关代码说法,正确的说法是( )。
string strSrc = "红十字:01084025890火警电话:119急救电话:120紧急求助:110";
string tel = "";
for (int i = 0; i <= strSrc.length(); i++){
if (strSrc[i] >= '0' && strSrc[i] <= '9'){
tel = tel + strSrc[i];
}else if (tel != ""){
cout << tel << endl;
tel = "";
}
}
A. 代码将换⾏输出各个含有数字的电话号码。
B. 代码将不换⾏输出各个含有数字的电话号码,号码中间没有分隔。
C. 代码将不换⾏输出各个含有数字的电话号码,号码中间有分隔。
D. 不能够输出数字电话号码。
【答案】A
【考纲知识点】字符串遍历、条件判断
【解析】这段代码通过遍历字符串 strSrc ,当遇到数字字符时将其累加到 tel 中。当遇到非数字字符且 tel 不为空时,输出 tel 并将 tel 清空。这样就能够逐个提取出字符串中的电话号码并换行输出。
所以代码将换行输出各个含有数字的电话号码。
因此选择 A 选项。
14.某公司新出了⼀款⽆⼈驾驶的⼩汽车,通过声控智能驾驶系统,乘客只要告诉汽车⽬的地,车⼦就能⾃动选择⼀条优化路线,告诉乘客后驶达那⾥。请问下⾯哪项不是驾驶系统完成选路所必须的。( )
A. 麦克风
B. 扬声器
C. 油量表
D. 传感器
【答案】C
【考纲知识点】无人驾驶系统的组成和功能
【解析】在无人驾驶的小汽车中,通过声控智能驾驶系统,麦克风用于接收乘客告知的目的地信息,扬声器用于向乘客告知选择的路线,传感器用于获取车辆周围的环境信息以辅助路线选择和行驶。
而油量表主要用于显示车辆燃油的余量,它并不是驾驶系统完成选路所必须的。
因此选择 C 选项。
15.现代计算机是指电⼦计算机,它所基于的是( )体系结构。
A. 艾伦·图灵
B. 冯·诺依曼
C. 阿塔纳索夫
D. 埃克特-莫克利
【答案】B
【考纲知识点】计算机体系结构的发展
【解析】现代计算机所基于的是冯・诺依曼体系结构。
冯・诺依曼体系结构的特点包括:采用二进制形式表示数据和指令;计算机由运算器、控制器、存储器、输入设备和输出设备五大部分组成;程序和数据以同等地位存放在存储器中,并按地址寻访;指令由操作码和地址码组成等。
因此选择 B 选项。
二、判断题(每题2分,共20分)
题目 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
答案 | √ | √ | √ | √ | × | × | √ | √ | × | √ |
1.执行C++代码 cout<<(5&&2)<<endl; 后将输出 1 。( )
【答案】正确
【考纲知识点】逻辑运算符的运算规则
【解析】在 C++ 中,逻辑与(&&)运算符当且仅当两个操作数都为非零值时,结果为 1(真),否则为 0(假)。
5 和 2 都是非零值,所以 5 && 2 的结果为 1。
因此,答案是正确。
2.C++程序执行后,输入 chen a dai 输出应该为: chen 。( )
【答案】正确
【考纲知识点】C++ 的输入输出操作
【解析】在 C++ 中,如果使用 cin 进行输入,默认情况下它以空格作为分隔符。当输入 chen a dai 时,第一次提取到的字符串会是 chen 。
因此,答案是正确。
3.执行C++代码 cout<<(5||2); 后将输出 1 。( )
【答案】正确
【考纲知识点】逻辑或运算符的运算规则
【解析】在 C++ 中,逻辑或(||)运算符只要两个操作数中有一个为非零值,结果就为 1(真),只有当两个操作数都为 0 时,结果才为 0(假)。
5 和 2 都是非零值,所以 5 || 2 的结果为 1。
因此,答案是正确。
4.执行下面C++代码后将输出"China"。( )
string a = "china";
a.replace(0, 1, "c");
cout << a << endl;
【答案】正确
【考纲知识点】字符串的操作,replace 函数的使用。
【解析】首先,定义了一个字符串 a 并初始化为 "china" 。
然后,使用 replace 函数将字符串 a 从索引 0 开始,长度为 1 的部分替换为 "c" 。这就将原来的 "h" 替换为了 "c" ,使得字符串 a 变为 "China" 。
最后,使用 cout 输出字符串 a ,结果为 "China" 。
因此,答案是正确。
5.执行C++代码将输出 0 5 , 5 之后还有一个空格。( )
int list[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < 10; i++)
if (i % 5 == 0)
cout << list[i] << "";
【答案】错误
【考纲知识点】数组遍历、取余运算。
【解析】
在这段 C++ 代码中,数组 list 里的值为 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 。
当 i 为 0 和 5 时,满足 i % 5 == 0 的条件,会输出 list[0] 和 list[5] ,即 1 和 6 ,而不是 0 和 5 。
所以答案是错误。
6.下面C++代码将输出1( )
int list[10] = {1};
cout << list << endl;
【答案】错误
【考纲知识点】数组与指针、输出操作
【解析】在 C++ 中,当直接输出一个数组名时,实际上输出的是数组的地址,而不是数组中的元素值。
所以这段代码不会输出 1 ,答案是错误。
7.下面C++程序将输出1。( )
int arr[10]={1};
cout<<arr[0]<<endl;
【答案】正确
【考纲知识点】数组的初始化与访问
【解析】在这个 C++ 程序中,定义了一个包含 10 个整数的数组 arr 并进行了初始化,初始化时只有第一个元素被初始化为 1,其余元素默认初始化为 0 。
当使用 arr[0] 访问数组的第一个元素时,得到的值就是初始化时赋予的 1 。然后通过 cout 输出,所以会输出 1 。
因此答案是正确。
8.执行C++代码,将输出 1 3 5 7 9 , 9 之后还有一个空格。( )
int list[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < 10; i += 2){
cout << list[i] << " ";
}
【答案】正确
【考纲知识点】数组遍历、循环控制
【解析】在这个代码中,数组 list 包含了 1 到 10 这 10 个数字。
循环 for (int i = 0; i < 10; i += 2) 会使得 i 依次取值 0、2、4、6、8。
当 i 为这些值时,输出对应的 list[i] ,即 1、3、5、7、9 ,并且每个数字后面都有一个空格。
所以答案是正确。
9.小杨最近在准备考GESP,他用的Dev C++来练习和运行程序,所以Dev C++也是一个小型操作系统。( )
【答案】错误
【考纲知识点】操作系统与编程工具的区别
【解析】
Dev C++ 是一个集成开发环境(IDE),用于编写、编译和运行 C++ 程序。
操作系统是管理计算机硬件与软件资源的程序,它负责控制和协调计算机的各种活动。
Dev C++ 运行在操作系统之上,依赖操作系统提供的资源和服务来工作,它本身并不是一个操作系统。
所以答案是错误。
10.任何一个while循环都可以转化为等价的for循环( )。
【答案】正确
【考纲知识点】while 循环和 for 循环的结构和特点
【解析】
while 循环的基本形式是:while(条件) { 循环体 }
for 循环的基本形式是:for(初始化; 条件; 迭代) { 循环体 }
在 while 循环中,条件判断在循环开始时进行,只要条件为真,就执行循环体。
在 for 循环中,初始化部分用于初始化循环控制变量,条件部分用于判断是否继续循环,迭代部分用于在每次循环结束后更新循环控制变量。
可以通过合适的设置,将 while 循环中的条件和循环体的相关逻辑,对应地转换为 for 循环中的初始化、条件和迭代部分,从而实现等价的功能。
所以,任何一个 while 循环都可以转化为等价的 for 循环,答案是正确。
三、编程题(每题25分,共50分)
1、小猫分鱼
【问题描述】
海滩上有一堆鱼,N只小猫来分。第一只小猫把这堆鱼平均分为N份,多了i< N个,这只小猫把多的i个扔入海中,拿走了一份。第二只小猫接着把剩下的鱼平均分成N份,又多了i个,小猫同样把多的i个扔入海中,拿走了一份。第三、第四、……,第N只小猫仍是最终剩下的鱼分成N份,扔掉多了的i个,并拿走一份。
编写程序,输入小猫的数量N以及每次扔到海里的鱼的数量i,输出海滩上最少的鱼数,使得每只小猫都可吃到鱼。
例如:两只小猫来分鱼N=2,每次扔掉鱼的数量为i= 1,为了每只小猫都可吃到鱼,可令第二只小猫需要拿走1条鱼,则此时待分配的有3条鱼。第一只小猫待分配的鱼有3*2+1=7条。
【输入描述】
总共 2 行。第一行一个整数N,第二行一个整数i。
【输出描述】
一行一个整数,表示满足要求的海滩上最少的鱼数。
【样例输入 1】
2
1
【样例输出 1】
7
【样例输入 2】
3
1
【样例输出 2】
25
【题目大意】
三只小猫来分鱼N = 3,每次扔掉鱼的数量为i=1,为了每只小猫都可吃到鱼,可令第三只小猫需要拿走3条鱼(拿走1条和2条不满足要求),则此时待分配的有10条鱼。第二只小猫待分配的鱼有10x3/2+1=16条。第一只小猫待分配的鱼有16x3/2+1=25条。
【考纲知识点】
循环结构、条件判断、数学推理
【解题思路】
通过不断尝试可能的初始鱼的数量 k ,计算每次分配后的鱼的数量 ans 。对于每只小猫的分配过程进行判断,如果在某一次分配中不能平均分成 n 份且多余 i 个,就标记此次尝试失败,继续增加初始鱼的数量重新尝试,直到找到满足要求的最少鱼数。
【参考程序】
#include <stdio.h>
int main(int argc, char **argv) {
long long n, i, j, k, ans; // 定义变量,n 表示小猫数量,i 表示每次扔掉的鱼数,k 用于尝试初始鱼数,ans 存储每次计算的鱼数
bool flag; // 用于标记某次尝试是否成功
scanf("%lld%lld", &n, &i); // 输入小猫数量和每次扔掉的鱼数
k = 1; // 初始从 1 开始尝试
while (true) { // 无限循环,直到找到满足条件的结果
flag = true; // 每次尝试开始标记为成功
ans = k*n + i; // 计算初始鱼数
for (j = 1; j < n; j++) { // 模拟每只小猫的分配过程
if (ans % (n - 1)!= 0) { // 如果不能平均分成 n - 1 份
flag = false; // 标记此次尝试失败
break; // 跳出当前循环
}
ans = ans / (n - 1) * n + i; // 计算下一只小猫分配前的鱼数
}
if (flag) { // 如果此次尝试成功
break; // 结束循环
}
k++; // 增加初始鱼数继续尝试
}
printf("%lld\n", ans); // 输出满足要求的最少鱼数
return 0;
}
2、单位转换
【问题描述】
小杨这周的数学作业是做单位转换,喜欢编程的小杨决定编程帮他解决这些问题。
小杨只学了长度单位和重量单位,具体来说:
长度单位包括千米( km )、米( m )、毫米( mm ),它们之间的关系是: 。
重量单位包括千克( kg )、克( g )、毫克( mg ),它们之间的关系是: 。
小杨的作业只涉及将更大的单位转换为更小的单位,也就是说,小杨的作业只会包含如下题型:米转换为毫米,千米转换为毫米,千米转换为米,克转换为毫克,千克转换为毫克,千克转换为克。
现在,请你帮忙完成单位转换的程序。
【输入描述】
输入的第一行为一个整数 N,表示题目数量。
接下来N行,每行一个字符串,表示转换单位的题目,格式为 x 单位1 = ? 单位2 。
【输出描述】
输出N行,依次输出所有题目的答案,输出时,只需要将输入中的 ? 代入答案,其余部分一字不差地输出即可。
由于小杨的题目只涉及将更大的单位转换为更小的单位,并且输入的 x 是整数,因此答案一定也是整数。
【样例输入 1】
2
1 km = ? mm
1 m= ? mm
【样例输出 1】
1 km = 1000000 mm
1 m = 1000 mm
【样例输入 2】
5
100 m = ? mm
1000 km = ? m
20 kg = ? g
200 g = ? mg
0 kg = ? mg
【样例输出 2】
100 m = 100000 mm
1000 km = 1000000 m
20 kg = 20000 g
200 g = 200000 mg
0 kg = 0 mg
【题目大意】
这道题主要是关于单位转换的编程任务。小杨需要完成长度单位(千米、米、毫米)和重量单位(千克、克、毫克)从大单位到小单位的转换。程序需要读入题目数量和具体的转换题目,然后计算并输出转换结果。
【考纲知识点】
字符串处理、条件判断、数学计算
【解题思路】
定义一个函数 get_base 用于根据输入的单位字符串获取对应的转换基数。在主函数中,通过循环读取输入的题目,提取出数值、单位 1 和单位 2 ,然后根据单位 1 和单位 2 的转换基数计算出转换后的结果并输出。
【参考程序】
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
// 根据单位字符串获取转换基数
int get_base(char *s) {
if (strlen(s) == 1) // 如果单位字符串长度为 1
return 1000; // 默认为 1000(如 m 到 mm 的转换基数)
return s[0] == 'k'? 1000000 : 1; // 如果是 'k' 开头(如 km)返回 1000000,否则返回 1(如 mm 本身)
}
int main() {
int T; // 题目数量
scanf("%d", &T); // 输入题目数量
while (T --) { // 循环处理每个题目
int x; // 要转换的数值
char s1[5], s2[5]; // 单位 1 和单位 2 的字符串
scanf("%d", &x); // 输入数值
scanf("%s", s1); // 输入单位 1
scanf("%s", s2), scanf("%s", s2), scanf("%s", s2); // 输入单位 2(多输入两次是为了处理输入格式)
// 输出转换结果
printf("%d %s = %d %s\n", x, s1, x * get_base(s1) / get_base(s2), s2);
}
return 0;
}