文华学院2024~2025学年第一学期《C语言程序设计》考试试卷(A卷)答案与解析
一、单项选择题(每小题2分,共10题,满分20分)
题目1
以下关于C语言的说法正确的是( )
A. C语言程序总是从第一个的函数开始执行
B. 在C语言程序中,要调用的函数必须在main()函数中定义
C. C语言程序总是从main()函数开始执行
D. C语言程序中的main()函数必须放在程序的开始部分
答案:C
解析:C语言程序的执行入口是main()函数,无论main()函数在程序的哪个位置,程序都会从main()函数开始执行,故A错误,C正确;被调用的函数可以在main()函数外部定义(声明后即可调用),不需要在main()函数中定义,B错误;main()函数的位置没有强制要求,可在程序开头、中间或结尾,D错误。
题目2
C语言中,以下( )运算符要求的操作数必须是整型
A. /
B. *
C. (无选项C内容)
D. %
答案:D
解析:%是取余运算符,其操作数必须是整型,结果为两数相除后的余数;/(除法)和*(乘法)运算符的操作数可以是整型或实型,例如3.5/2.0、4*2.5都是合法的,故A、B错误,D正确。
题目3
如果用一个变量存储中国的人口数,这个变量的类型最应该设计成( )
A. unsigned char
B. unsigned short int
C. unsigned int
D. float
答案:C
解析:中国人口数约14亿,需选择能容纳该数值的变量类型:
- unsigned char取值范围0~255,远小于14亿,A错误;
- unsigned short int取值范围通常0~65535,无法容纳,B错误;
- unsigned int取值范围通常0~4294967295(约43亿),可容纳14亿,C正确;
- float是浮点型,存储整数时可能存在精度损失,不适合存储人口数这类需要精确表示的整数,D错误。
题目4
程序运行到scanf语句会( )
A. 暂时停止运行,等待用户的键盘输入
B. 打印出scanf语句后面的字符串
C. 退出紧邻本语句外面的一对闭合的{}
D. 退出紧邻本语句前后的循环语句对应的一对闭合的{}
答案:A
解析:scanf是输入函数,功能是读取用户从键盘输入的数据,程序运行到scanf语句时会暂停,等待用户输入完成后继续执行,A正确;打印字符串是printf函数的功能,B错误;C、D描述的是break或goto语句的作用,与scanf无关,故C、D错误。
题目5
已知float a=12.35,要打印出"12.35%"的效果,程序语句应该是:printf(" ",a);
A. %d%
B. %d%
C. %.2f%%
D. %.2f%
答案:C
解析:
- 要输出保留2位小数的浮点数,格式控制符应为
%.2f(%d用于输出整数,会导致数据错误),故A、B错误; - %是格式控制符的起始符号,若要输出普通字符%,需使用
%%转义(单个%会被识别为格式控制符的开始,无法直接输出),因此正确格式为%.2f%%,C正确,D错误。
题目6
如下程序的预期输出结果是( )
unsigned int a = 5; unsigned int b = 8; unsigned int c= a/b; printf(“%d”,c);
A. 0
B. 1
C. 0.625
D. 程序报错,无法运行
答案:A
解析:unsigned int是无符号整型,整型除法的规则是“截断取整”(只保留整数部分,舍弃小数部分)。5除以8的结果是0.625,截断小数后得0,因此c的值为0,printf以%d输出整型变量c,结果为0,A正确;B、C错误,程序无语法错误,可正常运行,D错误。
题目7
已知球的半径r和球的体积V都是已经定义的float变量,(V=\frac{4}{3}\pi r^3)。以下为球的体积V进行赋值计算的语句,正确的是( )
A. (V =4 / 3 * 3.14 * r* r;)
B. (V = 43.14r^3/3;)
C. (V == (43.14rrr)/3;)
D. 以上都不对
答案:D
解析:
- 选项A:公式错误,缺少r的三次方(应为rrr),且4/3是整型除法,结果为1(截断取整),导致计算结果错误;
- 选项B:C语言中没有
^3的幂运算语法(^是按位异或运算符),计算r的三次方需用rrr或pow(r,3)(需包含math.h头文件),语法错误; - 选项C:使用
==(等于判断运算符)而非=(赋值运算符),逻辑错误,无法给V赋值; - 因此A、B、C均错误,D正确。
题目8
执行下面的程序框图,输出的(A=( ))
开始
输入A=1,B=2,k=1
k<=3?
是→A=A+B;k=k+1→重复判断
否→输出A
结束
A. 3
B. 5
C. 7
D. 9
答案:C
解析:程序框图执行过程如下:
- 初始状态:A=1,B=2,k=1;
- 第一次循环(k=1≤3):A=1+2=3,k=2;
- 第二次循环(k=2≤3):A=3+2=5,k=3;
- 第三次循环(k=3≤3):A=5+2=7,k=4;
- k=4>3,退出循环,输出A=7,C正确。
题目9
已知unsigned int uiNumbers[30]是一个数组,那么该数组的起始位置的元素应该表示成( )
A. uiNumbers
B. uiNumbers[1]
C. uiNumbers[0]
D. &uiNumbers
答案:C
解析:C语言数组的下标从0开始,数组的起始位置(第一个元素)的下标为0,因此表示为uiNumbers[0],C正确;
- uiNumbers是数组名,代表数组的首地址(指针),并非元素,A错误;
- uiNumbers[1]是数组的第二个元素,B错误;
- &uiNumbers是数组的地址(与数组首地址值相同,但类型不同),并非元素,D错误。
题目10
阅读以下程序段,关于程序循环结束后说法正确的选项是( )
unsigned int i=0;
while(i<100){
printf("做个事情\n");
i++;}
printf("%d\n",i);
A. “做个事情”被打印了99次,循环结束后i等于99
B. “做个事情”被打印了100次,循环结束后i等于100
C. “做个事情”被打印了101次,循环结束后i等于101
D. 以上说法都不对
答案:B
解析:循环条件为i<100,i初始值为0:
- 当i从0到99时,共100次循环(0≤i≤99,共100个值),每次循环打印一次“做个事情”,因此打印100次;
- 循环结束时,i increments to 100,此时i<100不成立,退出循环,最终i=100;
- 因此B正确,A、C错误。
二、填空题(每空2分,共5题,满分10分)
题目1
默写2的6次方、2的10次方的十进制值:
答案:64;1024
解析:2^6=2×2×2×2×2×2=64;2^10=1024(C语言中常用2^10表示1KB,是基础常识)。
题目2
若有说明:int a[][3]={1,2,3,4,5,6,7};则数组a的第一维大小是_
答案:3
解析:C语言中二维数组可省略第一维大小,编译器会根据初始化元素个数和第二维大小自动计算。数组第二维大小为3,初始化元素共7个:
- 前6个元素分为2行(每行3个),第7个元素单独占第3行,因此第一维大小为3(数组实际为3行3列,未初始化的元素默认为0)。
题目3
已知printf("%d",strlen("Chinese"));输出结果为:
答案:7
解析:strlen函数用于计算字符串的长度(不包含字符串结束符'\0')。"Chinese"包含C、h、i、n、e、s、e共7个字符,因此长度为7。
题目4
若有定义语句:int a=10; double b=3.14;,则表达式'A'+a+b的值的数据类型为
答案:double
解析:C语言中不同类型数据混合运算时,会进行“类型提升”,规则为:
- 'A'是字符型(ASCII值为65),会先提升为int型;
- int型与double型混合运算时,int型会提升为double型;
- 最终整个表达式的结果类型为double型。
题目5
若变量a、b已定义为int类型并分别为25和65,现要求用printf函数以a=25, ~b=A的形式输出,请写出完整的输出语句
答案:printf("a=%d, ~b=%c\n", a, b);
解析:
- a是int型,输出其值用%d格式控制符;
- b=65,对应ASCII码表中的大写字母'A',输出字符用%c格式控制符;
- 按照要求的格式,需包含"a="、", ~b="等固定字符,因此完整语句为上述答案(换行符\n可根据需求添加,不影响核心格式)。
三、阅读和补全程序(每空3分,共10空,满分30分)
题目1
下面一段代码的功能为:计算r=1到r=10的圆面积,当面积大于100时结束循环。
for(r=1;r<=10;r++)
{ area= ① ;
if(area>100)
② ;
printf(“%f”,area); }
答案:① 3.14rr;② break
解析:
- 圆的面积公式为S=πr²,此处π取3.14,r为半径,因此①处填3.14rr(需保证area为浮点型变量,如float或double);
- 当面积大于100时结束循环,break语句的功能是跳出当前循环,因此②处填break。
题目2
已知:unsigned int auiB[20];
现在要求把auiB[20]赋值成一个首项为1,公比为2的等比数列,请补全下面的代码:
auiB[0] = 1;
for (i=1; ③ ; i++)
{ auiB[i] = ④ ;
}
答案:③ i<20;④ auiB[i-1]*2
解析:
- 数组auiB有20个元素(下标0
19),首项auiB[0]=1,从i=1开始赋值,循环需覆盖下标119,因此循环条件③为i<20(或i<=19); - 等比数列公比为2,每一项等于前一项乘以2,因此第i项auiB[i] = auiB[i-1]*2,④处填此表达式。
题目3
阅读下面程序,请直接给出该程序的打印输出结果(有换行的地方要体现出多行):
int main()
{
unsigned int i,j;
for (i = 0; i < 2; i++)
printf(“A”);
for (j = 0; j < 3; j++)
{
printf(“B”);
}
printf(“C\n”);
printf(“D\n”);
return 0;
}
答案:ABBBC ABBBC D
解析:
- 第一个for循环(i=0和i=1):循环2次,打印2个'A',即"AA";
- 第二个for循环(j=0、1、2):循环3次,打印3个'B',即"BBB";
- 随后打印"C\n":输出"C"并换行;
- 最后打印"D\n":输出"D"并换行;
- 整体输出为"AA BBB C"(无空格,连续输出AA后接BBB,再接C换行,然后D换行),即上述答案。
题目4
已知下述函数实现了:函数传入三个整型的长度,函数判断这三个长度能够构成的三角形的形态。函数设计的返回值如下:
返回0:表示无法构成三角形;返回1:表示构成三角形。
根据上述要求补充空行处的代码。
unsigned int TriangleJudge(unsigned int a, unsigned int b, unsigned int c)
{
if ((a + b > c) ⑧ (a + c > b) ⑨ (b + c > a))
{
return 1;
}
else
{
return 0;
}
}
答案:⑧ &&;⑨ &&
解析:构成三角形的条件是“任意两边之和大于第三边”,即a+b>c、a+c>b、b+c>c三个条件必须同时成立。C语言中逻辑与运算符&&表示“同时成立”,因此⑧和⑨处均填&&。原代码返回值逻辑需调整:满足条件时返回1(能构成),否则返回0(不能构成),补充else分支后逻辑完整。
四、程序设计(每题10分,共4题,满分40分)
题目1
编程序计算下面的分段函数:输入x值,求下列相应y值。
[y= \begin{cases}-1 & (x<1) \ 2 x+1 & (1 \leq x<10) \ 3 x+2 & (x \geq 10)\end{cases}]
答案:
#include <stdio.h>
int main() {
float x, y;
printf("请输入x的值:");
scanf("%f", &x);
if (x < 1) {
y = -1;
} else if (x >= 1 && x < 10) {
y = 2 * x + 1;
} else { // x >= 10
y = 3 * x + 2;
}
printf("对应的y值为:%f\n", y);
return 0;
}
解析:
- 定义float型变量x(输入值)和y(结果值),适配小数输入;
- 用if-else if-else语句判断x的范围,按分段函数规则计算y;
- 输入输出提示用户操作,逻辑清晰,覆盖所有分支情况。
题目2
编程序打印出所有的水仙花数。所谓水仙花数是指一个三位整数,其各位数字的立方和等于该数字本身,如(xyz=x^3+y^3+z^3)
答案:
#include <stdio.h>
int main() {
int num, x, y, z;
printf("所有水仙花数为:\n");
// 遍历所有三位整数(100~999)
for (num = 100; num <= 999; num++) {
x = num / 100; // 百位数字
y = (num / 10) % 10; // 十位数字
z = num % 10; // 个位数字
// 判断各位数字的立方和是否等于原数
if (x*x*x + y*y*y + z*z*z == num) {
printf("%d\n", num);
}
}
return 0;
}
解析:
- 水仙花数是三位整数,因此循环范围为100~999;
- 用整除和取余运算分离百位(x=num/100)、十位(y=(num/10)%10)、个位(z=num%10)数字;
- 计算各位数字的立方和,与原数比较,相等则为水仙花数,打印输出;
- 运行结果:153、370、371、407。
题目3
成绩统计:从键盘输入10个学生的成绩(实型)至数组中,输出所有学生的平均分(小数点后保留一位)。
答案:
#include <stdio.h>
#define N 10 // 定义学生人数为10
int main() {
float scores[N], sum = 0.0, avg;
int i;
// 输入10个学生成绩
printf("请输入10个学生的成绩:\n");
for (i = 0; i < N; i++) {
printf("成绩%d:", i+1);
scanf("%f", &scores[i]);
sum += scores[i]; // 累加成绩求和
}
avg = sum / N; // 计算平均分
printf("所有学生的平均分为:%.1f\n", avg); // 保留1位小数
return 0;
}
解析:
- 用宏定义N=10,方便修改学生人数;
- 定义float型数组scores存储成绩,sum存储总分(初始化为0.0,避免整型溢出);
- 循环输入10个成绩,同时累加求和;
- 平均分=总分/人数,用%.1f控制输出格式,保留1位小数。
题目4
编写一个判别某一年份是否为闰年的自定义函数,由主函数调用,年份year在主函数中输入,是否为闰年的判别结果在主函数中输出。(已知符合下列条件之一者是闰年:①能被4整除,但不能被100整除;②能被400整除)
答案:
#include <stdio.h>
// 自定义闰年判别函数:返回1表示闰年,0表示非闰年
int isLeapYear(int year) {
// 闰年条件:能被400整除,或能被4整除但不能被100整除
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
return 1;
} else {
return 0;
}
}
int main() {
int year;
printf("请输入年份:");
scanf("%d", &year);
// 调用自定义函数判断
if (isLeapYear(year)) {
printf("%d年是闰年\n", year);
} else {
printf("%d年不是闰年\n", year);
}
return 0;
}
解析:
- 自定义函数isLeapYear接收int型参数year,根据闰年规则返回1(闰年)或0(非闰年);
- 闰年规则用逻辑表达式表示:(year%400==0) || (year%4==0 && year%100!=0),涵盖两种合法情况;
- 主函数负责输入年份、调用自定义函数、输出结果,逻辑清晰,符合模块化设计思想。
评论区