内容正文:
编写说明:本冲刺卷严格依据山东省软件与应用技术类高考考纲编写,依托《编程语言基础—C语言》(高教版第五版),聚焦高三考生冲刺需求,助力高效提分。内容上深度覆盖考纲掌握、理解层级考点,既系统梳理构建知识框架,又强化应用能力训练;同时结合近五年高考真题,精准把握高频考点、命题趋势与题型特点,确保贴合高考方向。
山东省软件与应用技术类
《编程语言基础—C语言》高教版第五版
高频考点冲刺卷(五)原卷版
时间:60分钟 总分:100分
班级 姓名 学号 成绩
一、单选题(共25小题,每题2分,共50分)
1. 以下叙述正确的是( )。
A. 在C程序中,main函数必须位于程序的最前面
B. C程序的每行中只能写一条语句
C. C语言本身没有输入输出语句
D. 在对一个C程序进行编译的过程中,可发现注释中的拼写错误
2. 以下关于C语言数据类型的叙述中,正确的是( )
A. 枚举类型是基本数据类型
B. 使用typedef定义新类型后,原类型名不再可用
C. 结构体类型中的成员可以是不同的数据类型
D. 数组是一种基本数据类型
3. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a = 5, b = 3;
float c = 1.0/a*b;
printf("%.2f
", c);
}
A. 0.60 B. 0.00 C. 1.67 D. 0.67
4. 设int x=1, y=1; 表达式(!x||y--)的值是( )
A. 0 B. 1 C. 2 D. -1
5. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a = 0, b = 0, c = 0;
if (++a > 0 || ++b > 0)
++c;
printf("%d,%d,%d", a, b, c);
}
A. 1,0,1 B. 1,1,1 C. 0,1,1 D. 0,0,1
6. 以下程序的输出结果是( )
#include <stdio.h>
main(){
int i;
for (i = 0; i < 3; i++)
switch (i)
{
case 0: printf("%d", i);
case 2: printf("%d", i);
default: printf("%d", i);
}
}
A. 000122 B. 022111 C. 021021 D. 012
7. 以下程序的输出结果是( )
#include <stdio.h>
int main()
{
int i, j, n = 0;
for (i = 0; i < 2; i++)
{
n++;
for (j = 0; j < 3; j++)
{
if (j % 2) continue;
n++;
}
n++;
}
printf("n=%d
", n);
}
A. n=12 B. n=8 C. n=6 D. n=4
8. 以下对一维数组a的正确定义是( )
A. int a(10); B. int n=10, a[n];
C. int n; scanf("%d", &n); int a[n]; D. #define SIZE 10 int a[SIZE];
9. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
int i, s = 0;
for (i = 0; i < 3; i++)
s += a[i][i];
printf("%d", s);
}
A. 15 B. 45 C. 6 D. 24
10.以下关于函数的叙述中,正确的是( )
A. 函数必须返回一个值 B. 函数可以嵌套定义
C. 函数可以嵌套调用 D. 函数可以没有参数,但必须指定返回类型
11. 以下程序的输出结果是( )
#include <stdio.h>
int f(int x)
{
static int y = 1;
y++;
return x + y;
}
main()
{
int a = 2, i;
for (i = 0; i < 3; i++)
printf("%d ", f(a));
}
A. 4 5 6 B. 4 4 4 C. 4 6 8 D. 3 4 5
12. 以下程序的输出结果是( )
#include <stdio.h>
void fun(int x, int y, int *z)
{
*z = x > y ? x : y;
}
int main()
{
int a = 3, b = 5, c = 0;
fun(a, b, &c);
printf("%d", c);
}
A. 0 B. 3 C. 5 D. 8
13. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
char str[] = "ABCD", *p = str;
printf("%d
", *(p + 4));
}
A. 68 B. 0 C. 字符'D'的地址 D. 不确定的值
14. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a[5] = { 2,4,6,8,10 }, *p = a, **k = &p;
printf("%d ", *(p++));
printf("%d ", **k);
}
A. 2 4 B. 2 2 C. 4 4 D. 4 6
15. 以下程序的输出结果是( )
#include <stdio.h>
struct st
{
int x;
int *y;
} *p;
int dt[4] = { 10,20,30,40 };
struct st aa[4] = { 50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3] };
main()
{
p = aa;
printf("%d,", ++p->x);
printf("%d,", (++p)->x);
printf("%d
", ++(*p->y));
}
A.51,60,21 B. 50,60,21 C. 51,60,20 D. 50,60,20
16. 有如下程序
int func(int a,int b)
{ return(a+b);}
void main()
{ int x=2,y=5,z=8,r;
r=func(func(x,y),z);
printf(“%d
”,r);
}
该程序的输出结果是( )
A.12 B. 13 C. 14 D. 15
17. 以下程序的输出结果是( )
#include <stdio.h>
#define SQR(x) x*x
main()
{
int a = 10, k = 2, m = 1;
a /= SQR(k + m) / SQR(k + m);
printf("%d
", a);
}
A. 10 B. 1 C. 9 D. 0
18. 以下程序的输出结果是( )
#include <stdio.h>
void f(int x, int *y)
{
x = *y;
*y = x;
}
main()
{
int a = 3, b = 5;
f(a, &b);
printf("%d %d", a, b);
}
A. 3 5 B. 5 5 C. 3 3 D. 5 3
19. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
int (*p)[4] = a, i, j, k = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 2; j++)
k += *(*(p + i) + j);
printf("%d", k);
}
A. 60 B. 68 C. 99 D. 108
20. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
char s[] = "12345";
s[2] = '\0';
printf("%d", strlen(s));
}
A. 5 B. 2 C. 1 D. 0
21. 以下程序的输出结果是( )
#include <stdio.h>
void fun(int *a, int n)
{
int i, j, t;
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
if (a[i] < a[j])
{
t = a[i]; a[i] = a[j]; a[j] = t;
}
}
main()
{
int aa[10] = { 1,2,3,4,5,6,7,8,9,10 }, i;
fun(aa + 2, 5);
for (i = 0; i < 10; i++)
printf("%d,", aa[i]);
}
A. 1,2,3,4,5,6,7,8,9,10, B. 1,2,7,6,5,4,3,8,9,10,
C. 1,2,7,6,5,8,9,10,3,4, D. 1,2,9,8,7,6,5,4,3,10,
22. 以下程序的输出结果是( )
#include <stdio.h>
int f(int n)
{
if (n == 1) return 1;
else return f(n - 1) + 1;
}
main()
{
int i, j = 0;
for (i = 1; i < 3; i++)
j += f(i);
printf("%d
", j);
}
A. 1 B. 2 C. 3 D. 4
23.以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a = 1, b = 2, c = 3, d = 0;
if (a == 1 && b++ == 2)
if (b != 2 || c-- != 3)
printf("%d,%d,%d
", a, b, c);
else
printf("%d,%d,%d
", a, b, c);
else
printf("%d,%d,%d
", a, b, c);
}
A. 1,2,3 B. 1,3,2 C. 1,3,3 D. 1,2,2
24. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int x = 0, y = 5, z = 3;
while (z-- > 0 && ++x < 5)
y = y - 1;
printf("%d,%d,%d", x, y, z);
}
A. 3,2,-1 B. 3,2,0 C. 4,3,-1 D. 5,-2,-5
25.以下程序的输出结果是( )
#include <stdio.h>
main()
{
int i, k, a[10], p[3];
k = 5;
for (i = 0; i < 10; i++)
a[i] = i;
for (i = 0; i < 3; i++)
p[i] = a[i * (i + 1)];
for (i = 0; i < 3; i++)
k += p[i] * 2;
printf("%d", k);
}
A. 20 B. 21 C. 22 D. 23
二、简答题(共3小题,每题5分,共15分)
1. 请阅读程序并写出运行结果。
#include <stdio.h>
main()
{
int i;
long s = 0, t = 1;
for (i = 1; i <= 10; i++)
{
t = t * i;
s = s + t;
}
printf("1!+2!+...+10! = %ld
", s);
}
2. 以下程序的功能是:输入10个整数,将其中最小的数与第一个数交换,最大的数与最后一个数交换。请找出程序中的错误并改正。
#include <stdio.h>
main()
{
int a[10], i, max, min, t;
printf("input 10 numbers:");
for (i = 0; i < 10; i++)
scanf("%d", a[i]);
max = min = 0;
for (i = 1; i < 10; i++)
{
if (a[i] > a[max]) max = i;
if (a[i] < a[min]) min = i;
}
t = a[0]; a[0] = a[min]; a[min] = t;
t = a[9]; a[9] = a[max]; a[max] = t;
printf("after swapped:");
for (i = 0; i < 10; i++)
printf("%d ", a[i]);
}
3.阅读程序并写出运行结果(假设输入为"Hello World 123!@")。
#include <stdio.h>
#include <ctype.h>
main()
{
char str[100];
int i, letter = 0, digit = 0, space = 0, other = 0;
gets(str);
for (i = 0; str[i] != '\0'; i++)
{
if (isalpha(str[i])) letter++;
else if (isdigit(str[i])) digit++;
else if (isspace(str[i])) space++;
else other++;
}
printf("letter=%d,digit=%d,space=%d,other=%d
",
letter, digit, space, other);
}
三、案例分析题(共3小题,每题5分,共15分)
1. 以下程序的功能是:输出100以内能被3整除且个位数为6的所有整数。请将程序补充完整。
#include <stdio.h>
main()
{
int i, j;
for (i = 0; 【1】 ; i++)
{
j = i * 10 + 6;
if ( 【2】 ) continue;
printf("%d ", j);
}
}
2. 以下程序的功能是:将字符串中的数字字符删除后输出。请将程序补充完整。
#include <stdio.h>
#include <ctype.h>
main()
{
char str[80];
int i, j;
gets(str);
for (i = 0, j = 0; str[i] != '\0'; i++)
if (___【3】___)
str[j++] = str[i];
__【4】____ = '\0';
puts(str);
}
3. 以下程序的功能是:用递归方法计算学生的年龄。已知第一位学生年龄最小,为10岁,其余学生一个比一个大2岁,求第5位学生的年龄。请将程序补充完整。
#include <stdio.h>
int age(int n)
{
int c;
if (n == 1) c = 10;
else c = __【5】___;
return c;
}
main()
{
int n = 5;
printf("age(%d)=%d
", n, 【6】 );
}
四、综合应用题(共2小题,每题10分,共20分)
1. 编写程序,输入一个正整数n,计算并输出下列算式的值。
要求定义和调用函数total(n)计算1+1/2+1/3+...+1/n,函数返回值是double类型。
算式:sum = 1 + 1/2 + 1/3 + ... + 1/n
输入示例:
请输入n的值:5
输出示例:
sum = 2.283333
2. 用户密码是8537,输入一个密码,如果正确显示“欢迎你!”,若错误给出提示,错误三次则提示“三次密码错误!你不是合法用户!”
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:本冲刺卷严格依据山东省软件与应用技术类高考考纲编写,依托《编程语言基础—C语言》(高教版第五版),聚焦高三考生冲刺需求,助力高效提分。内容上深度覆盖考纲掌握、理解层级考点,既系统梳理构建知识框架,又强化应用能力训练;同时结合近五年高考真题,精准把握高频考点、命题趋势与题型特点,确保贴合高考方向。
山东省软件与应用技术类
《编程语言基础—C语言》高教版第五版
高频考点冲刺卷(五)解析版
时间:60分钟 总分:100分
班级 姓名 学号 成绩
一、单选题(共25小题,每题2分,共50分)
1. 以下叙述正确的是( )。
A. 在C程序中,main函数必须位于程序的最前面
B. C程序的每行中只能写一条语句
C. C语言本身没有输入输出语句
D. 在对一个C程序进行编译的过程中,可发现注释中的拼写错误
答案:C
解析:C语言中,main函数是程序执行的入口点,但它在源文件中的位置可以是任意的。C语言书写格式自由。一行可以多句,一句也可以写在多行上。C语言本身没有输入输出语句,需要调用库函数。注释是为了说明某语句或语句段的作用,它不影响程序的运行。
2. 以下关于C语言数据类型的叙述中,正确的是( )
A. 枚举类型是基本数据类型
B. 使用typedef定义新类型后,原类型名不再可用
C. 结构体类型中的成员可以是不同的数据类型
D. 数组是一种基本数据类型
答案:C
解析:枚举类型属于用户自定义类型,不属于基本数据类型。typedef是给类型取别名,原类型和新定义的类型都可以用来定义变量。结构体允许将多个不同类型的成员组合在一起。
3. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a = 5, b = 3;
float c = 1.0/a*b;
printf("%.2f
", c);
}
A. 0.60 B. 0.00 C. 1.67 D. 0.67
答案:A
解析:表达式计算:float c = 1.0 / a * b;运算符/和*优先级相同,且结合性为从左到右,因此等价于(1.0 / a) * b。计算1.0 / 5得到0.2。然后计算0.2 * b,b自动转换为浮点类型,得到0.6。最后将结果赋值给浮点变量c,值为0.6。0.6保留两位小数输出为0.60
4. 设int x=1, y=1; 表达式(!x||y--)的值是( )
A. 0 B. 1 C. 2 D. -1
答案:B
解析:运算符!的优先级为2,||的优先级为12,--的优先级为2,所以可以要先计算!x(!1)值为0.y--为后自增,所以先使用y的值1,y的值再增为1。再计算0||1的值为1。
5. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a = 0, b = 0, c = 0;
if (++a > 0 || ++b > 0)
++c;
printf("%d,%d,%d", a, b, c);
}
A. 1,0,1 B. 1,1,1 C. 0,1,1 D. 0,0,1
答案:A
解析:条件判断:(++a > 0 || ++b > 0)先计算++a:a自增为1,表达式++a的值为1。然后判断1 > 0为真。表达式++a>0||++b>0发生逻辑短路,++b>0不再执行。执行++c,使c自增为1。所以最终的输出结果:1,0,1。
6. 以下程序的输出结果是( )
#include <stdio.h>
main(){
int i;
for (i = 0; i < 3; i++)
switch (i)
{
case 0: printf("%d", i);
case 2: printf("%d", i);
default: printf("%d", i);
}
}
A. 000122 B. 022111 C. 021021 D. 012
答案:A
解析:for循环中i取值0、1、2。switch语句没有break,会顺序执行匹配到的case及其后的所有语句。
循环过程:
i=0:匹配case 0,执行三个printf,输出三个0 →000。
i=1:无匹配case,直接执行default,输出一个1 →1。
i=2:匹配case 2,执行后两个printf,输出两个2 →22。
所以最终的输出结果为000122。
7. 以下程序的输出结果是( )
#include <stdio.h>
int main()
{
int i, j, n = 0;
for (i = 0; i < 2; i++)
{
n++;
for (j = 0; j < 3; j++)
{
if (j % 2) continue;
n++;
}
n++;
}
printf("n=%d
", n);
}
A. n=12 B. n=8 C. n=6 D. n=4
答案:B
解析:外层循环执行 2 次(i=0 和 i=1),每次循环包含三步:
①:n++
②:内层循环(j=0,1,2):当 j 为偶数时(0 或 2)执行n++,共执行 2 次。
③:n++
具体执行过程:
i=0:n 从 0 → 1(第一步)→ 2(j=0)→ 3(j=2)→ 4(第三步)
i=1:n 从 4 → 5 → 6(j=0)→ 7(j=2)→ 8
最终n=8。
8. 以下对一维数组a的正确定义是( )
A. int a(10); B. int n=10, a[n];
C. int n; scanf("%d", &n); int a[n]; D. #define SIZE 10 int a[SIZE];
答案:D
解析:A 的格式不对;定义数组时,长度不能为变量,B、C不对;
9. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
int i, s = 0;
for (i = 0; i < 3; i++)
s += a[i][i];
printf("%d", s);
}
A. 15 B. 45 C. 6 D. 24
答案:A
解析:求对角线上数值的和
10.以下关于函数的叙述中,正确的是( )
A. 函数必须返回一个值 B. 函数可以嵌套定义
C. 函数可以嵌套调用 D. 函数可以没有参数,但必须指定返回类型
答案:C
解析:C语言中,函数可以没有返回值,使用void类型声明即可。C语言不允许在函数内部定义另一个函数(嵌套定义)。C语言允许函数之间相互调用,包括递归调用(函数调用自身)和间接调用。当函数没有参数时,系统默认为int。
11. 以下程序的输出结果是( )
#include <stdio.h>
int f(int x)
{
static int y = 1;
y++;
return x + y;
}
main()
{
int a = 2, i;
for (i = 0; i < 3; i++)
printf("%d ", f(a));
}
A. 4 5 6 B. 4 4 4 C. 4 6 8 D. 3 4 5
答案:A
解析:static int y = 1;,y是 f 函数内的静态局部变量,只在第一次调用f()时初始化为1,之后调用不会再初始化,而是保留上一次调用后的值。
f(a)函数调用
第一次调用f(2):y 初始值为1; y++ → y = 2;返回值:x+y=4;
第二次调用f(2):y保留2;y++→y = 3;返回值:2 + 3 = 5;
第三次调用f(2):y = 3;y++→y = 4;返回值:2 + 4 = 6;所以输出结果为4 5 6
12. 以下程序的输出结果是( )
#include <stdio.h>
void fun(int x, int y, int *z)
{
*z = x > y ? x : y;
}
int main()
{
int a = 3, b = 5, c = 0;
fun(a, b, &c);
printf("%d", c);
}
A. 0 B. 3 C. 5 D. 8
答案:A
解析:x、y为单向值传递,z是指针变量,指向int类型变量,传递的地址,即将变量c的地址传递给z,让指针z指向变量c,当改变了*z的值即改变了c的值。
13. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
char str[] = "ABCD", *p = str;
printf("%d
", *(p + 4));
}
A. 68 B. 0 C. 字符'D'的地址 D. 不确定的值
答案:B
解析:p+4指向str[4],即下标为4的元素。str[4] = '\0'。所以*(p + 4)就是str[4],即空字符'\0'。
14. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a[5] = { 2,4,6,8,10 }, *p = a, **k = &p;
printf("%d ", *(p++));
printf("%d ", **k);
}
A. 2 4 B. 2 2 C. 4 4 D. 4 6
答案:A
解析:变量p为指针变量,指向数组a的首地址,变量k为指向指针变量p的指针。*(p++)为后自增,所以先输出2后,p再自增为a[1]的地址,所以**k的值为4.
15. 以下程序的输出结果是( )
#include <stdio.h>
struct st
{
int x;
int *y;
} *p;
int dt[4] = { 10,20,30,40 };
struct st aa[4] = { 50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3] };
main()
{
p = aa;
printf("%d,", ++p->x);
printf("%d,", (++p)->x);
printf("%d
", ++(*p->y));
}
A.51,60,21 B. 50,60,21 C. 51,60,20 D. 50,60,20
答案:A
解析:p是全局指针,指向struct st类型,aa数组的初始值对应结构体的两个成员(x, y):
aa[0] = {50, &dt[0]};aa[1] = {60, &dt[1]};aa[2] = {70, &dt[2]};aa[3] = {80, &dt[3]}。第一个printf中,->高于++,p->x是aa[0].x,即50。++p->x等价于++(p->x),将aa[0].x从50增加到51,表达式的值是51,此时p仍然指向aa[0]。aa[0].x现在是51,aa[0].y仍然指向dt[0]。第二个printf中,(++p):先让p自增,指向aa[1],然后取这个新p的x成员。aa[1].x初始是60。此时p指向aa[1]。第三个printf中,p->y,p指向aa[1],其y成员是&dt[1](指向dt[1])。*p->y就是dt[1],当前值为20。++(*p->y)等价于++(dt[1]),将dt[1]从20增加到21,表达式的值是21。
16. 有如下程序
int func(int a,int b)
{ return(a+b);}
void main()
{ int x=2,y=5,z=8,r;
r=func(func(x,y),z);
printf(“%d
”,r);
}
该程序的输出结果是( )
A.12 B. 13 C. 14 D. 15
答案:D
解析:函数嵌套调用,先调用func(2,5),返回值7,再调用func(7,8),返回值为15。
17. 以下程序的输出结果是( )
#include <stdio.h>
#define SQR(x) x*x
main()
{
int a = 10, k = 2, m = 1;
a /= SQR(k + m) / SQR(k + m);
printf("%d
", a);
}
A. 10 B. 1 C. 9 D. 0
答案:B
解析:宏定义SQR(x)代替x*x,所以表达式可以展开为:
a/=k+m*k+m/k+m*k+m=2+1*2+1/2+1*2+1,即a/=7,最终a的值为1
18. 以下程序的输出结果是( )
#include <stdio.h>
void f(int x, int *y)
{
x = *y;
*y = x;
}
main()
{
int a = 3, b = 5;
f(a, &b);
printf("%d %d", a, b);
}
A. 3 5 B. 5 5 C. 3 3 D. 5 3
答案:A
解析:调用f( )函数,传递的是变量a的值和变量b的地址。执行函数f,将y所指向的变量b里的值赋值给x,再将x的值赋值给y所指向的变量b,所以b里的值还是5,而a只进行值传递,所以值保持不变。
19. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
int (*p)[4] = a, i, j, k = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 2; j++)
k += *(*(p + i) + j);
printf("%d", k);
}
A. 60 B. 68 C. 99 D. 108
答案:A
解析:p是指向包含4个int的数组的指针,p指向二维数组a的第一行(即a[0]),p +i指向第i行。*(*(p+i)+j)与a[i][j]等价。所以加到k中包括a[0][0]、a[0][1]、a[1][0]、a[1][1]、a[2][0、]a[2][1]的值,所以k的值为60。
20. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
char s[] = "12345";
s[2] = '\0';
printf("%d", strlen(s));
}
A. 5 B. 2 C. 1 D. 0
答案:B
解析:strlen()计算从起始地址到第一个'\0'字符的长度。字符数组中的s[2]被赋值为'\0',所以数组的长度为2。
21. 以下程序的输出结果是( )
#include <stdio.h>
void fun(int *a, int n)
{
int i, j, t;
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
if (a[i] < a[j])
{
t = a[i]; a[i] = a[j]; a[j] = t;
}
}
main()
{
int aa[10] = { 1,2,3,4,5,6,7,8,9,10 }, i;
fun(aa + 2, 5);
for (i = 0; i < 10; i++)
printf("%d,", aa[i]);
}
A. 1,2,3,4,5,6,7,8,9,10, B. 1,2,7,6,5,4,3,8,9,10,
C. 1,2,7,6,5,8,9,10,3,4, D. 1,2,9,8,7,6,5,4,3,10,
答案:B
解析:函数调用传递的是a[2]的地址,而函数fun的功能是由大到小排序,传递的长度为5,所以数组中从a[2]到a[6]开始进行大小排序。最终输出1,2,7,6,5,4,3,8,9,10,。
22. 以下程序的输出结果是( )
#include <stdio.h>
int f(int n)
{
if (n == 1) return 1;
else return f(n - 1) + 1;
}
main()
{
int i, j = 0;
for (i = 1; i < 3; i++)
j += f(i);
printf("%d
", j);
}
A. 1 B. 2 C. 3 D. 4
答案:C
解析:f()是一个递归函数:f(1) = 1;f(2) = f(1) + 1 = 1 + 1 = 2;f(3) = f(2) + 1 = 2 + 1 = 3。循环只循环2次,i=1,2。所以j=1+2=3。
23.以下程序的输出结果是( )
#include <stdio.h>
main()
{
int a = 1, b = 2, c = 3, d = 0;
if (a == 1 && b++ == 2)
if (b != 2 || c-- != 3)
printf("%d,%d,%d
", a, b, c);
else
printf("%d,%d,%d
", a, b, c);
else
printf("%d,%d,%d
", a, b, c);
}
A. 1,2,3 B. 1,3,2 C. 1,3,3 D. 1,2,2
答案:C
解析:初始:a=1, b=2, c=3,第一个if条件:a==1 → true,b++==2 → true(比较时b=2,之后b变为3)整体条件为true → 进入第二个if。第二个if条件:b!=2 → true(此时b=3)
逻辑或短路:第二个条件c--!=3不执行!整体条件为true → 执行第一个printf,输出:a=1, b=3, c=3。
24. 以下程序的输出结果是( )
#include <stdio.h>
main()
{
int x = 0, y = 5, z = 3;
while (z-- > 0 && ++x < 5)
y = y - 1;
printf("%d,%d,%d", x, y, z);
}
A. 3,2,-1 B. 3,2,0 C. 4,3,-1 D. 5,-2,-5
答案:C
解析:初始:x=0, y=5, z=3,第1次循环:z-- > 0: z=3>0 true, z变为2,++x < 5: x先增为1,1<5 true,条件为true → y=4;第2次循环:z-- > 0: z=2>0 true, z变为1,++x < 5: x先增为2, 2<5,true,条件为true → y=3;第3次循环:z-- > 0: z=1>0 true, z变为0,++x < 5: x先增为3, 3<5 true,条件为true → y=2;第4次尝试:z-- > 0: z=0>0 false, z变为-1,短路计算:++x<5不执行,条件为false → 循环结束,最终:x=3, y=2, z=-1。
25.以下程序的输出结果是( )
#include <stdio.h>
main()
{
int i, k, a[10], p[3];
k = 5;
for (i = 0; i < 10; i++)
a[i] = i;
for (i = 0; i < 3; i++)
p[i] = a[i * (i + 1)];
for (i = 0; i < 3; i++)
k += p[i] * 2;
printf("%d", k);
}
A. 20 B. 21 C. 22 D. 23
答案:C
解析:第一个循环初始化数组a,第二个循环初始化数组p。
当i=0:索引=0*(0+1)=0,所以p[0]=a[0]=0。
当i=1:索引=1*(1+1)=1*2=2,所以p[1]=a[2]=2。
当i=2:索引=2*(2+1)=2*3=6,所以p[2]=a[6]=6。
所以p数组:p[0]=0, p[1]=2, p[2]=6。
第三个循环:更新k。初始k=5
当i=0:k += p[0]*2 = 0*2 = 0,所以k保持5。
当i=1:k += p[1]*2 = 2*2 = 4,所以k=5+4=9。
当i=2:k += p[2]*2 = 6*2 = 12,所以k=9+12=21。
输出为21。
二、简答题(共3小题,每题5分,共15分)
1. 请阅读程序并写出运行结果。
#include <stdio.h>
main()
{
int i;
long s = 0, t = 1;
for (i = 1; i <= 10; i++)
{
t = t * i;
s = s + t;
}
printf("1!+2!+...+10! = %ld
", s);
}
答案:1!+2!+...+10! = 4037913
解析:求1-10的阶乘的和。
2. 以下程序的功能是:输入10个整数,将其中最小的数与第一个数交换,最大的数与最后一个数交换。请找出程序中的错误并改正。
#include <stdio.h>
main()
{
int a[10], i, max, min, t;
printf("input 10 numbers:");
for (i = 0; i < 10; i++)
scanf("%d", a[i]);
max = min = 0;
for (i = 1; i < 10; i++)
{
if (a[i] > a[max]) max = i;
if (a[i] < a[min]) min = i;
}
t = a[0]; a[0] = a[min]; a[min] = t;
t = a[9]; a[9] = a[max]; a[max] = t;
printf("after swapped:");
for (i = 0; i < 10; i++)
printf("%d ", a[i]);
}
答案:
(1)scanf("%d", a[i])应该使用地址符&a[i]
(2)先交换最小值,如果最大值在0位置,再交换最大值
if (max == 0) max = min;
3.阅读程序并写出运行结果(假设输入为"Hello World 123!@")。
#include <stdio.h>
#include <ctype.h>
main()
{
char str[100];
int i, letter = 0, digit = 0, space = 0, other = 0;
gets(str);
for (i = 0; str[i] != '\0'; i++)
{
if (isalpha(str[i])) letter++;
else if (isdigit(str[i])) digit++;
else if (isspace(str[i])) space++;
else other++;
}
printf("letter=%d,digit=%d,space=%d,other=%d
",
letter, digit, space, other);
}
答案:letter=10,digit=3,space=2,other=2
解析:字母10个,数字3个,空格2个,其他字符2个
三、案例分析题(共3小题,每题5分,共15分)
1. 以下程序的功能是:输出100以内能被3整除且个位数为6的所有整数。请将程序补充完整。
#include <stdio.h>
main()
{
int i, j;
for (i = 0; 【1】 ; i++)
{
j = i * 10 + 6;
if ( 【2】 ) continue;
printf("%d ", j);
}
}
答案:
【1】i < 10
【2】j % 3 != 0
2. 以下程序的功能是:将字符串中的数字字符删除后输出。请将程序补充完整。
#include <stdio.h>
#include <ctype.h>
main()
{
char str[80];
int i, j;
gets(str);
for (i = 0, j = 0; str[i] != '\0'; i++)
if (___【3】___)
str[j++] = str[i];
__【4】____ = '\0';
puts(str);
}
答案:
【3】!(str[i]>=’0’&&str[i]<=’9’)
【4】str[j]
解析:保留非数字字符,最后添加字符串结束符。
3. 以下程序的功能是:用递归方法计算学生的年龄。已知第一位学生年龄最小,为10岁,其余学生一个比一个大2岁,求第5位学生的年龄。请将程序补充完整。
#include <stdio.h>
int age(int n)
{
int c;
if (n == 1) c = 10;
else c = __【5】___;
return c;
}
main()
{
int n = 5;
printf("age(%d)=%d
", n, 【6】 );
}
答案:
【5】age(n-1)+2
【6】age(n)
四、综合应用题(共2小题,每题10分,共20分)
1. 编写程序,输入一个正整数n,计算并输出下列算式的值。
要求定义和调用函数total(n)计算1+1/2+1/3+...+1/n,函数返回值是double类型。
算式:sum = 1 + 1/2 + 1/3 + ... + 1/n
输入示例:
请输入n的值:5
输出示例:
sum = 2.283333
答案:
参考程序:
#include <stdio.h>
double total(int n)
{
double sum = 0.0;
int i;
for (i = 1; i <= n; i++)
sum += 1.0 / i;
return sum;
}
int main()
{
int n;
double sum;
printf("请输入n的值:");
scanf("%d", &n);
sum = total(n);
printf("sum = %lf
", sum);
return 0;
}
2. 用户密码是8537,输入一个密码,如果正确显示“欢迎你!”,若错误给出提示,错误三次则提示“三次密码错误!你不是合法用户!”
答案:
参考程序:#include <stdio.h>
main() {
int password,count=1;
while (1) {
printf("请输入密码:");
scanf("%d",&password);
if ( password==8537) {
printf("欢迎你!
");
break;
} else if(count<3) {
printf("密码错误!
");
count ++ ;
}
else {
printf("三次密码错误!你不是合法用户!
");
break;
}
}
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$