Appearance
《C语言程序设计》期末试卷 (精选10)
一、单项选择题(每小题 1 分,共 14 分)
要求: 根据题目从 A、B、C、D 中选择一个正确的选项
- C 语言规定:在一个源程序中,main 的位置( )
- A. 必须在最开始
- B. 必须在系统调用的库函数后面
- C. 可以任意
- D. 必须在最后
查看答案与解析
答案:C
解析: main 函数可以放在源程序的任何位置,编译器通过函数名定位入口点,而非物理位置。
难度: ⭐ 考点: #main函数 #程序结构
💡 学习锦囊
📖 相关公式与知识点:
- C 程序有且仅有一个
main函数作为入口。 - main 函数的物理位置不影响程序执行。
思路分析
区分"逻辑入口"与"物理位置"——执行从 main 开始是逻辑上的,代码书写顺序是物理上的。
🔄 举一反三
- 一个 C 程序可以有多个 main 函数吗?
查看练习答案与解析
答案:不可以。 解析:main 是程序的唯一入口,定义多个会导致"重定义"编译错误。
- C 语言中的标识符只能由字母、数字和下划线三种字符组成,且第一个字符( )
- A. 必须为字母
- B. 必须为下划线
- C. 必须为字母或下划线
- D. 可以是字母、数字和下划线中的任意一种
查看答案与解析
答案:C
解析: 标识符的第一个字符必须是字母或下划线,不能是数字。
难度: ⭐ 考点: #标识符 #命名规则
💡 学习锦囊
📖 相关公式与知识点:
- 合法标识符:以字母或下划线开头,后跟字母、数字或下划线。
- 关键字(如
int,if,while)不能作为标识符。
易错点
数字可以出现在标识符中,但不能作为第一个字符。
🔄 举一反三
- 以下哪个是合法的 C 语言标识符?
- A.
2name - B.
_count - C.
float
查看练习答案与解析
答案:B 解析:A 以数字开头不合法,C 是关键字不合法。
- A.
- 已有如下定义和输入语句,若要求 a1, a2, c1, c2 的值分别为 10, 20, A 和 B,当从第一列开始输入数据时,正确的数据输入方式是( )。
int a1, a2;
char c1, c2;
scanf("%d%c%d%c", &a1, &c1, &a2, &c2);2
3
- A. 10A20B
- B. 10 A 20 B
- C. 10A 20B
- D. 10A20 B
查看答案与解析
答案:A
解析:%c 会读取任何字符包括空格和换行符。如果输入中有空格,空格会被 %c 读取,导致 c1 获得空格而非 'A'。
难度: ⭐⭐ 考点: #scanf #格式符%c
💡 学习锦囊
📖 相关公式与知识点:
%d会跳过前导空白字符,%c不会跳过。%c读取任意一个字符,包括空格、换行符。
易错点
在 %d 和 %c 混用时,注意 %c 可能读取到残留的空白字符。
🔄 举一反三
- 若输入
10 A 20 B,c1 的值是什么?查看练习答案与解析
答案:空格字符 解析:
%d读取 10 后,%c读取紧随的空格。
- C 语言对嵌套 if 语句的规定是:else 总是与( )。
- A. 其之前最近的 if 配对
- B. 第一个 if 配对
- C. 缩进位置相同的 if 配对
- D. 其之前最近的且尚未配对的 if 配对
查看答案与解析
答案:D
解析: else 总是与最近的尚未配对的 if 配对,这是 C 语言的"就近配对"原则。
难度: ⭐ 考点: #if-else #嵌套
💡 学习锦囊
📖 相关公式与知识点:
- else 的配对规则:向上找最近的、尚未与 else 配对的 if。
- 使用大括号
{}可以明确改变配对关系。
易错点
缩进不影响配对关系,C 语言只看语法结构不看缩进。
🔄 举一反三
- 以下代码中 else 与哪个 if 配对?
if (a>0)
if (b>0) x=1;
else x=2;2
3
查看练习答案与解析
答案:与 if (b>0) 配对 解析:else 与最近的未配对 if 配对。
- 当 a=1, b=3, c=5, d=4 时,执行完下面一段程序后 x 的值是( )。
if (a<b)
if (c<d) x=1;
else
if (a<c)
if (b<d) x=2;
else x=3;
else x=6;
else x=7;2
3
4
5
6
7
8
- A. 1
- B. 2
- C. 3
- D. 4
查看答案与解析
答案:C
解析:
- a<b (1<3) 为真,进入外层 if
- c<d (5<4) 为假,进入 else
- a<c (1<5) 为真,进入内层 if
- b<d (3<4) 为假,执行 else x=3
难度: ⭐⭐ 考点: #if-else嵌套 #逻辑追踪
💡 学习锦囊
📖 相关公式与知识点:
- 逐层追踪 if-else 的执行路径。
- 画出决策树有助于理解嵌套结构。
思路分析
从最外层条件开始,逐步向内追踪,记录每一步的真假判断。
🔄 举一反三
- 若 a=1, b=3, c=2, d=4,x 的值是多少?
查看练习答案与解析
答案:1 解析:a<b 为真,c<d (2<4) 为真,执行 x=1。
- 下述语句执行后,变量 k 的值是( )。
int k=1;
while (k++<10);2
- A. 10
- B. 11
- C. 9
- D. 无限循环,值不定
查看答案与解析
答案:B
解析: 后缀自增 k++ 先用后增。当 k=10 时,先用 10 与 10 比较(结果为假),然后 k 自增为 11,循环结束。
难度: ⭐⭐ 考点: #后缀自增 #while循环
💡 学习锦囊
📖 相关公式与知识点:
k++:先使用 k 的当前值,再自增。++k:先自增,再使用新值。
易错点
注意区分 k++<10 和 ++k<10 的区别。
🔄 举一反三
- 若改为
while (++k<10);,k 最终值是多少?查看练习答案与解析
答案:10 解析:当 k=9 时,++k 变为 10,10<10 为假,循环结束。
- 引用数组元素时,其下标表达式的值类型一定是( )。
- A. char
- B. int
- C. double
- D. bool
查看答案与解析
答案:B
解析: C 语言规定数组下标必须是整型表达式。
难度: ⭐ 考点: #数组下标
💡 学习锦囊
📖 相关公式与知识点:
- 数组下标从 0 开始,必须是整型(或可隐式转换为整型)。
- 下标越界不会引发编译错误,但会导致未定义行为。
思路分析
下标本质是内存偏移量,必须是整数才有意义。
🔄 举一反三
a[2.5]是否合法?查看练习答案与解析
答案:不合法 解析:下标必须是整型,浮点数不能直接作为数组下标。
- 若对两个数组 a 和 b 进行初始化:
char a[]="ABCDEF";
char b[]={'A', 'B', 'C', 'D', 'E', 'F'};2
则下列叙述正确的是( )。
- A. a 与 b 数组完全相同
- B. a 与 b 数组占用内存相同
- C. a 与 b 数组都存放字符串
- D. 数组 a 比数组 b 占用内存大
查看答案与解析
答案:D
解析:
- a 用字符串初始化,自动添加
'\0',占用 7 字节。 - b 用字符列表初始化,不自动添加
'\0',占用 6 字节。
难度: ⭐⭐ 考点: #字符串初始化 #sizeof
💡 学习锦囊
📖 相关公式与知识点:
- 字符串字面量
"..."自动包含结尾的'\0'。 - 字符数组用
{}初始化时不会自动添加'\0'。
易错点
b 不是合法的 C 字符串,因为缺少 '\0' 结束符。
🔄 举一反三
char c[10]="ABC";占用多少字节?查看练习答案与解析
答案:10 字节 解析:数组大小由定义决定,内容只占前 4 字节(含 '\0')。
- 若调用一个函数,且此函数中没有 return 语句,关于该函数返回值的说法正确的是( )。
- A. 该函数没有返回值
- B. 该函数返回若干系统默认值
- C. 能返回一个用户所希望的函数值
- D. 返回一个不确定的值
查看答案与解析
答案:D
解析: 如果函数声明为非 void 返回类型但没有 return 语句,函数会返回一个不确定的值(未定义行为)。如果函数声明为 void 类型,则明确无返回值,此时没有 return 语句是合法的。题目未指明函数返回类型,按传统 C 语言考试惯例,默认返回类型为 int,因此返回不确定的值,选 D。
难度: ⭐⭐ 考点: #函数返回值 #void
💡 学习锦囊
📖 相关公式与知识点:
void类型函数不需要 return 语句(也可以使用return;),明确无返回值。- 非 void 函数必须有 return 语句返回对应类型的值。
- 非 void 函数缺少 return 语句时,返回值不确定(未定义行为)。
易错点
- 误以为没有 return 语句就等于没有返回值(只有 void 函数才是真正无返回值)。
- C89 标准中函数默认返回 int,缺少 return 时返回不确定的值。
🔄 举一反三
- 以下函数定义是否正确?
int func() { }查看练习答案与解析
答案:不正确(或产生警告) 解析:声明为 int 返回类型但没有 return 语句,返回值不确定,属于未定义行为。
- 以下函数定义是否正确?
void func() { }查看练习答案与解析
答案:正确 解析:void 函数不需要返回值,没有 return 语句是合法的。
- 若用数组名作为函数调用的实参,传递给形参的是( )。
- A. 数组的首地址
- B. 数组中第一个元素的值
- C. 数组中的全部元素的值
- D. 数组元素的个数
查看答案与解析
答案:A
解析: 数组名作为参数传递时,传递的是数组的首地址(指针),而非数组的副本。
难度: ⭐ 考点: #数组传参 #指针
💡 学习锦囊
📖 相关公式与知识点:
- 数组名在作为函数参数时会退化为指针。
- 形参数组声明
int a[]等价于int *a。
思路分析
C 语言中数组传参是"传地址"而非"传值",函数内修改数组会影响原数组。
🔄 举一反三
- 如何在函数内获取传入数组的长度?
查看练习答案与解析
答案:无法直接获取,需要额外传递长度参数。 解析:数组退化为指针后,sizeof 只能得到指针大小。
- 设有程序段:
char s[]="china"; char *p; p=s;则下面叙述正确的是( )。- A. s 和 p 完全相同
- B. 数组 s 中的内容和指针变量 p 中的内容相等
- C. s 数组长度和 p 所指向的字符串长度相等
- D. *p 与 s[0]相等
查看答案与解析
答案:D
解析: p 指向 s 的首地址,*p 等价于 s[0],都是字符 'c'。
难度: ⭐ 考点: #指针与数组 #解引用
💡 学习锦囊
📖 相关公式与知识点:
*p等价于p[0],等价于s[0]。- s 是数组名(常量),p 是指针变量(可修改)。
易错点
s 和 p 不完全相同:s 是常量地址不能自增,p 是变量可以自增。
🔄 举一反三
p++和s++哪个合法?查看练习答案与解析
答案:
p++合法,s++不合法 解析:s 是数组名(常量),不能修改。
- 若已定义
char s[10];则在下面表达式中不表示 s[1]的地址是( )。- A. s+1
- B. s++
- C. &s[0]+1
- D. &s[1]
查看答案与解析
答案:B
解析: s 是数组名,是常量指针,不能进行自增操作。s++ 试图修改常量,编译错误。
难度: ⭐ 考点: #数组名常量 #指针运算
💡 学习锦囊
📖 相关公式与知识点:
- 数组名是地址常量,不能作为左值。
s+1、&s[0]+1、&s[1]都表示 s[1] 的地址。
易错点
数组名可以参与加法运算(如 s+1),但不能被赋值或自增。
🔄 举一反三
char *p = s; p++;是否合法?查看练习答案与解析
答案:合法 解析:p 是指针变量,可以自增。
- 若有定义:
int a[2][3];则对 a 数组的第 i 行第 j 列元素的正确引用是( )。- A.
*(a[i]+j) - B.
(a+i) - C.
*(a+j) - D.
a[i]+j
- A.
查看答案与解析
答案:A
解析:a[i] 是第 i 行的首地址,a[i]+j 是第 i 行第 j 列的地址,*(a[i]+j) 是该位置的值。
难度: ⭐⭐ 考点: #二维数组 #指针引用
💡 学习锦囊
📖 相关公式与知识点:
a[i][j]等价于*(a[i]+j)等价于*(*(a+i)+j)。a[i]+j是地址,不是值。
思路分析
二维数组元素有多种等价表示方式,理解指针与数组的关系是关键。
🔄 举一反三
*(*(a+i)+j)表示什么?查看练习答案与解析
答案:
a[i][j]解析:*(a+i)是第 i 行首地址,再加 j 偏移后解引用。
- 已知学生记录描述为:
struct student
{
int no;
char name[20];
char sex;
struct {
int year;
int month;
int day;
} birth;
} s;2
3
4
5
6
7
8
9
10
11
设结构变量 s 中的"birth"为"1985 年 10 月 1 日",则下面正确的赋值方式是( )。
- A. year=1985; month=10; day=1;
- B. birth.year=1985; birth.month=10; birth.day=1;
- C. s.year=1985; s.month=10; s.day=1;
- D. s.birth.year=1985; s.birth.month=10; s.birth.day=1;
查看答案与解析
答案:D
解析: 需要通过结构体变量 s 逐层访问嵌套的 birth 结构体成员:s.birth.year。
难度: ⭐ 考点: #结构体 #嵌套访问
💡 学习锦囊
📖 相关公式与知识点:
- 结构体成员访问:
变量名.成员名。 - 嵌套结构体需要逐层使用
.运算符。
易错点
不能跳过中间层直接访问嵌套结构体的成员。
🔄 举一反三
- 若定义
struct student *p = &s;,如何访问 birth.year?查看练习答案与解析
答案:
p->birth.year解析:指针用->,成员用.。
二、基础知识填空(每空 2 分,共 22 分)
- C 源程序的基本单位是____________________。
查看答案与解析
答案: 函数
解析: C 语言是函数式语言,程序由函数组成,函数是 C 程序的基本组成单位。
难度: ⭐ 考点: #程序结构 #函数
💡 学习锦囊
📖 相关公式与知识点:
- 一个 C 程序由一个或多个函数组成。
- 必须有且仅有一个 main 函数。
🔄 举一反三
- C 程序的最小执行单位是什么?
查看练习答案与解析
答案:语句 解析:函数由语句组成,语句是最小执行单位。
- 按照计算机科学家沃思(Wirth)的提法,一个计算机程序应包括数据结构和____________________两部分。
查看答案与解析
答案: 算法
解析: 沃思提出著名公式:程序 = 数据结构 + 算法。
难度: ⭐ 考点: #程序概念 #算法
💡 学习锦囊
📖 相关公式与知识点:
- 数据结构:数据的组织和存储方式。
- 算法:解决问题的步骤和方法。
🔄 举一反三
- 沃思是哪本经典教材的作者?
查看练习答案与解析
答案:《Algorithms + Data Structures = Programs》 解析:沃思也是 Pascal 语言的发明者。
- 数学表达式 $y = \frac{a^2 + b^2}{x + y}$ 的 C 语言表达式是________________________________________。
查看答案与解析
答案: (a*a+b*b)/(x+y)
解析:
- 平方用乘法表示:
a*a、b*b - 分子加括号:
(a*a+b*b) - 分母加括号:
(x+y)
难度: ⭐ 考点: #表达式转换 #运算符
💡 学习锦囊
📖 相关公式与知识点:
- C 语言没有平方运算符,使用
a*a或pow(a,2)。 - 除法
/的优先级高于加法,需要用括号控制运算顺序。
易错点
如果写成 a*a+b*b/x+y,由于优先级问题,结果完全不同。
🔄 举一反三
- $\sqrt{a+b}$ 的 C 语言表达式是什么?
查看练习答案与解析
答案:
sqrt(a+b)解析:需要#include <math.h>。
- 若 s 是 int 型变量,s=6;则表达式
s%2+(s+1)%2的值为____________________。
查看答案与解析
答案: 1
解析:
s%2= 6%2 = 0(s+1)%2= 7%2 = 1- 0 + 1 = 1
难度: ⭐ 考点: #取模运算
💡 学习锦囊
📖 相关公式与知识点:
%是取模(求余)运算符。n%2可用于判断奇偶:结果为 0 是偶数,1 是奇数。
🔄 举一反三
- 若 s=5,表达式
s%2+(s+1)%2的值是多少?查看练习答案与解析
答案:1 解析:5%2=1,6%2=0,1+0=1。对于任意整数 s,该表达式恒为 1。
- C 语言本身不提供输入输出语句,其输入输出操作是由____________________来实现的。
查看答案与解析
答案: 函数(或库函数)
解析: C 语言的输入输出通过标准库函数实现,如 printf、scanf、getchar、putchar 等。
难度: ⭐ 考点: #输入输出 #库函数
💡 学习锦囊
📖 相关公式与知识点:
- 常用 I/O 函数:
printf、scanf、getchar、putchar、gets、puts。 - 需要
#include <stdio.h>。
🔄 举一反三
printf是 C 语言的关键字吗?查看练习答案与解析
答案:不是 解析:printf 是标准库函数,不是关键字。
- 已知 A=7.5, B=2, C=3.6, 表达式
A>B && C>A || A<B && !C>B的值是____________________。
查看答案与解析
答案: 0
解析:
A>B= 7.5>2 = 真(1)C>A= 3.6>7.5 = 假(0)A>B && C>A= 1 && 0 = 0A<B= 7.5<2 = 假(0)!C>B= !(3.6>2) = !1 = 0A<B && !C>B= 0 && 0 = 00 || 0= 0
难度: ⭐⭐ 考点: #逻辑运算 #优先级
💡 学习锦囊
📖 相关公式与知识点:
- 运算符优先级:
!>><>&&>||。 - 注意
!C>B等价于(!C)>B,而非!(C>B)。
易错点
! 优先级高于 >,!C>B 先计算 !C(C 非零则为 0),再与 B 比较。
🔄 举一反三
!0的值是多少?查看练习答案与解析
答案:1 解析:逻辑非将假(0)变为真(1)。
- 设有以下定义语句:
int a[3][2]={10,20,30,40,50,60}, (*p)[2];
p=a;2
则表达式 *(*(p+2)+1)的值为____________________。
查看答案与解析
答案: 60
解析: p 是指向含 2 个 int 元素数组的指针。p+2 指向第 3 行,*(p+2) 是第 3 行首地址,*(p+2)+1 是第 3 行第 2 列地址,*(*(p+2)+1) = a[2][1] = 60。
难度: ⭐⭐⭐ 考点: #数组指针 #二维数组
💡 学习锦囊
📖 相关公式与知识点:
int (*p)[2]是数组指针,指向含 2 个 int 的数组。p+1跳过一整行(2 个 int)。
思路分析
数组指针的步长是一整行,p+i 指向第 i 行。
🔄 举一反三
int *p[2]和int (*p)[2]有什么区别?查看练习答案与解析
答案:前者是指针数组(2 个指针),后者是数组指针(指向含 2 个 int 的数组)。 解析:
[]优先级高于*,所以*p[2]是数组,(*p)[2]是指针。
- 设 i,j,k 均为 int 型变量,则执行完下面的 for 循环后,k 的值为____________________。
for(i=0, j=10; i<=j; i++, j--)
k=i+j;2
查看答案与解析
答案: 10
解析: 每次循环 i+j 恒等于 10。最后一次循环 i=5, j=5 时,k=10,然后 i++ 变为 6,j-- 变为 4,i<=j 不成立,循环结束。
难度: ⭐⭐ 考点: #for循环 #变量追踪
💡 学习锦囊
📖 相关公式与知识点:
- for 循环执行顺序:初始化 → 条件判断 → 循环体 → 增量 → 条件判断...
- 逗号表达式允许多个初始化或增量语句。
思路分析
观察 i+j 恒为 10,最后一次满足条件时 i=j=5。
🔄 举一反三
- 若改为
for(i=0, j=10; i<j; i++, j--),k 的值是多少?查看练习答案与解析
答案:10 解析:最后一次 i=4, j=6 时 k=10,之后 i=5, j=5 不满足 i<j。
- 在一个 C 程序中,若要定义一个只允许本源程序文件中所有函数使用的全局变量,则该变量需要定义的存储类别为____________________。
查看答案与解析
答案: static(静态)
解析:static 修饰的全局变量只在定义它的源文件内可见,其他文件无法访问。
难度: ⭐ 考点: #static #作用域
💡 学习锦囊
📖 相关公式与知识点:
static全局变量:文件作用域,限制在本文件内。static局部变量:保持值在函数调用间不丢失。extern:声明外部变量,扩展作用域。
🔄 举一反三
static修饰的局部变量有什么特点?查看练习答案与解析
答案:只初始化一次,值在函数调用间保持。 解析:存储在静态存储区,生命周期为整个程序运行期。
- C 程序中,文件可以用____________________和二进制两种代码形式存放。
查看答案与解析
答案: 文本(或 ASCII)
解析: C 语言文件分为文本文件(ASCII 文件)和二进制文件两种。
难度: ⭐ 考点: #文件类型
💡 学习锦囊
📖 相关公式与知识点:
- 文本文件:以 ASCII 码存储,可读性强。
- 二进制文件:以内存中的二进制形式存储,节省空间。
fopen模式:"r"/"w"为文本,"rb"/"wb"为二进制。
🔄 举一反三
fopen("test.txt", "w")打开的是什么类型的文件?查看练习答案与解析
答案:文本文件 解析:不加
b的模式默认为文本模式。
- 下面程序的运行结果是____________________
#include<stdio.h>
#define S(x) 4*x*x+1
void main ( )
{
int m=6,n=8;
printf("%d\n",S(m+n));
}2
3
4
5
6
7
查看答案与解析
答案: 81
解析: 宏是文本替换:S(m+n) → 4*m+n*m+n+1 = 4*6+8*6+8+1 = 24+48+8+1 = 81。
难度: ⭐⭐ 考点: #宏定义 #文本替换
💡 学习锦囊
📖 相关公式与知识点:
- 宏是预处理阶段的纯文本替换,不做计算。
- 带参数宏应给每个参数加括号:
#define S(x) 4*(x)*(x)+1。
易错点
宏替换不遵循数学运算优先级,S(m+n) 展开后不是 4*(m+n)*(m+n)+1。
🔄 举一反三
- 若宏定义为
#define S(x) 4*(x)*(x)+1,S(m+n)的值是多少?查看练习答案与解析
答案:
4*(6+8)*(6+8)+1= 4×14×14+1 = 785 解析:加了括号后按数学预期展开。
三、程序阅读题(每题 3 分,共 24 分)
1. 程序阅读
#include<stdio.h>
int main( )
{
int a[4][4]={{1,2,3,4},{5,6,7,8},{11,12,13,14},{15,16,17,18}};
int i=0,j=0,s=0;
while (i++<4)
{
if (i==2 || i==4)
continue;
j=0;
do {
s+=a[i][j];
j++;
} while (j<4);
}
printf("%d\n", s);
return 0;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
题目: 写出程序的运行结果。
查看答案与解析
答案: 92
解析:
- i++<4:i 先比较后自增
- i=1 时(i++后 i=1,1<4 成立):i!=2 且 i!=4,累加 a[1][0..3] = 5+6+7+8 = 26
- i=2 时(i++后 i=2,2<4 成立):i==2,continue 跳过
- i=3 时(i++后 i=3,3<4 成立):累加 a[3][0..3] = 15+16+17+18 = 66
- i=4 时(i++后 i=4,4<4 不成立):循环结束
- s = 26+66 = 92
难度: ⭐⭐⭐ 考点: #循环控制 #continue
💡 学习锦囊
📖 相关公式与知识点:
continue跳过本次循环剩余部分,进入下一次条件判断。i++<4先比较后自增,注意 i 在比较后立即变化。
思路分析
逐轮追踪 i 的值变化,注意 i++ 的时机和 continue 的跳过效果。
🔄 举一反三
- 若将
i++<4改为++i<4,结果如何?查看练习答案与解析
答案:循环次数减少 解析:前缀自增先增后用,i 从 1 开始比较。
2. 程序阅读
#include<stdio.h>
void copy_string(char *,char *);
int main()
{
char a[]="I am a top man.";
char b[]="You are teachers.";
copy_string(a,b);
printf("\nstring_a=%s\nstring_b=%s\n",a,b);
return 0;
}
void copy_string(char *from,char *to)
{
for(;*from!='\0';from++,to++)
*to=*from;
*to='\0';
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
题目: 写出程序的运行结果。
查看答案与解析
答案:
string_a=I am a top man.
string_b=I am a top man.2
解析: copy_string 函数将 from 指向的字符串逐字符复制到 to 指向的位置,b 被 a 的内容完全覆盖。
难度: ⭐⭐ 考点: #字符串复制 #指针操作
💡 学习锦囊
📖 相关公式与知识点:
- 字符串复制需要逐个字符操作,直到遇到
'\0'。 - 复制完成后必须手动添加
'\0'。
易错点
目标数组必须有足够空间容纳源字符串(含 '\0')。
🔄 举一反三
- 标准库中哪个函数实现相同功能?
查看练习答案与解析
答案:
strcpy解析:strcpy(to, from)将 from 复制到 to。
3. 程序阅读
#include<stdio.h>
int main ( )
{
int k=1,n=463;
do
{
k*= n%10;
n/=10;
} while (n);
printf("%d\n",k);
return 0;
}2
3
4
5
6
7
8
9
10
11
12
题目: 写出程序的运行结果。
查看答案与解析
答案: 72
解析: 计算 463 各位数字之积:
- 第 1 轮:k = 1×(463%10) = 3,n = 46
- 第 2 轮:k = 3×(46%10) = 18,n = 4
- 第 3 轮:k = 18×(4%10) = 72,n = 0
- n=0,循环结束,输出 72
难度: ⭐⭐ 考点: #数字分解 #do-while
💡 学习锦囊
📖 相关公式与知识点:
n%10获取个位数字。n/10去掉个位数字。do-while至少执行一次循环体。
🔄 举一反三
- 若 n=12345,输出结果是多少?
查看练习答案与解析
答案:120 解析:1×2×3×4×5 = 120。
4. 程序阅读
#include <stdio.h>
int main()
{
char c;
printf("Enter a character:");
c=getchar();
if(c<0x20)
printf("The character is a control character\n");
else if(c>='0'&&c<='9')
printf("The character is a digit\n");
else if(c>='A'&&c<='Z')
printf("The character is a capital letter\n");
else if(c>='a'&&c<='z')
printf("The character is a lower letter\n");
else
printf("The character is other character\n");
return 0;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
问题 4: 按键盘上的 Ctrl 键回车后,写出程序执行结果。
查看答案与解析
答案: The character is a control character
解析: Ctrl 组合键产生的字符 ASCII 码小于 0x20(32),属于控制字符。
难度: ⭐ 考点: #ASCII码 #字符分类
💡 学习锦囊
📖 相关公式与知识点:
- 控制字符:ASCII 码 0~31(0x00~0x1F)。
- 数字字符:'0'~'9'(ASCII 48~57)。
- 大写字母:'A'~'Z'(ASCII 65~90)。
- 小写字母:'a'~'z'(ASCII 97~122)。
🔄 举一反三
- 输入字符 '5',程序输出什么?
查看练习答案与解析
答案:
The character is a digit解析:'5' 在 '0'~'9' 范围内。
5. 程序阅读
#include <math.h>
#include <stdio.h>
void fun(int);
int main ( )
{
int n;
scanf("%d",&n);
printf("%d=",n);
if (n<0) printf("-");
n = fabs(n);
fun(n);
return 0;
}
void fun (int n)
{
int k,r;
for (k=2; k<=sqrt(n); k++) {
r = n % k;
while (!r) {
printf("%d",k);
n=n/k;
if (n>1) printf("*");
r = n % k;
}
}
if (n!=1) printf("%d\n",n);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
题目: 若输入的值是 32,写出下面程序的运行结果。
查看答案与解析
答案: 32=2*2*2*2*2
解析: 这是质因数分解程序。32 不断除以 2:32÷2=16,16÷2=8,8÷2=4,4÷2=2,2÷2=1。输出 5 个 2。
难度: ⭐⭐ 考点: #质因数分解 #循环嵌套
💡 学习锦囊
📖 相关公式与知识点:
- 质因数分解:不断用最小的质数去除 n,直到 n=1。
fabs(n)取绝对值。sqrt(n)只需检查到平方根。
思路分析
外层 for 遍历可能的因数,内层 while 反复除以当前因数。
🔄 举一反三
- 输入 12,输出结果是什么?
查看练习答案与解析
答案:
12=2*2*3解析:12÷2=6,6÷2=3,3 是质数。
6. 程序阅读
#include <stdio.h>
int main()
{
char *s="1221";
int k=0,a=0,b=0;
do
{
if(k%2==0)
{
a=a+s[k]-'0';
continue;
}
b=b+s[k]-'0';
} while(s[++k]);
printf("k=%d\n a=%d \nb=%d\n",k,a,b);
return 0;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
题目: 写出程序的运行结果。
查看答案与解析
答案:
k=4
a=3
b=32
3
解析:
- k=0(偶数):a = 0+'1'-'0' = 1,continue,s[++k]=s[1]='2'≠'\0' 继续
- k=1(奇数):b = 0+'2'-'0' = 2,s[++k]=s[2]='2'≠'\0' 继续
- k=2(偶数):a = 1+'2'-'0' = 3,continue,s[++k]=s[3]='1'≠'\0' 继续
- k=3(奇数):b = 2+'1'-'0' = 3,s[++k]=s[4]='\0' 循环结束
- 最终 k=4, a=3, b=3
难度: ⭐⭐⭐ 考点: #字符转数字 #do-while
💡 学习锦囊
📖 相关公式与知识点:
s[k]-'0'将数字字符转换为对应的整数值。s[++k]先自增 k,再取 s[k] 的值。
思路分析
偶数下标累加到 a,奇数下标累加到 b。注意 s[++k] 在 while 条件中的自增时机。
🔄 举一反三
- 若 s="1234",a 和 b 的值分别是多少?
查看练习答案与解析
答案:a=4(1+3),b=6(2+4) 解析:偶数下标 0,2 累加到 a,奇数下标 1,3 累加到 b。
7. 程序阅读
#include <stdio.h>
int main( )
{
FILE *fp;
int i,k=0,n=0;
fp=fopen("d1.dat","w");
for(i=1;i<4;i++)
fprintf(fp, "%3d",i);
fclose(fp);
fp=fopen("d1.dat","r");
fscanf(fp, "%d%d",&k, &n);
printf("%d,%d\n",k, n);
fclose(fp);
return 0;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
题目: 写出程序执行后输出的结果。
查看答案与解析
答案: 1,2
解析: 写入文件的是 " 1 2 3"(每个数字占 3 个字符宽度)。读取时 %d%d 跳过空白读取前两个整数 1 和 2。
难度: ⭐⭐ 考点: #文件操作 #fprintf/fscanf
💡 学习锦囊
📖 相关公式与知识点:
fprintf格式化写入文件,%3d占 3 个字符宽度。fscanf格式化读取,%d自动跳过空白字符。
易错点
写入格式和读取格式要匹配,否则可能读取到错误数据。
🔄 举一反三
- 若
fprintf(fp, "%d", i)不加宽度,写入内容是什么?查看练习答案与解析
答案:
"123"解析:三个数字紧密排列,读取时%d%d会把 "123" 整体读给 k。
8. 程序阅读
#include<stdio.h>
int fun (char *);
int main ( )
{
char *a="abcdef";
printf("%d\n",fun(a));
return 0;
}
int fun (char *s)
{
char *p=s;
while (*p) p++;
return (p-s);
}2
3
4
5
6
7
8
9
10
11
12
13
14
题目: 写出程序的运行结果。
查看答案与解析
答案: 6
解析: fun 函数计算字符串长度。p 从 s 开始移动到 '\0',p-s 即为字符个数。"abcdef" 长度为 6。
难度: ⭐ 考点: #字符串长度 #指针运算
💡 学习锦囊
📖 相关公式与知识点:
- 指针相减得到两个地址之间的元素个数。
- 等价于标准库函数
strlen。
思路分析
p 遍历到字符串末尾,p-s 计算遍历了多少个字符。
🔄 举一反三
- 若 a="hello world",fun(a) 返回值是多少?
查看练习答案与解析
答案:11 解析:包含空格共 11 个字符。
四、程序填空题(每空 2 分,共 20 分)
1. 找闰年
程序功能: 找出 2009 年到 2050 年的所有闰年。
#include<stdio.h>
int main()
{
int year,leap;
for(year=2009;year<=2050;year++)
{
if( _____[1]_____ )
{
if(year%100==0)
{
if(______[2]______)
leap=1;
else
leap=0;
}
else
leap=1;
}
else
leap=0;
if(leap==1)
printf("%d 是闰年!\n",year);
}
return 0;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
查看答案与解析
答案:
(1) year%4==0 (2) year%400==0
解析: 闰年规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。
难度: ⭐⭐ 考点: #闰年判断 #条件嵌套
💡 学习锦囊
📖 相关公式与知识点:
- 闰年条件:
(year%4==0 && year%100!=0) || year%400==0。 - 先判断能否被 4 整除,再区分世纪年。
易错点
世纪年(如 2100)能被 4 整除但不是闰年,必须能被 400 整除才是。
🔄 举一反三
- 2100 年是闰年吗?
查看练习答案与解析
答案:不是 解析:2100 能被 100 整除但不能被 400 整除。
2. 求和
程序功能: 按公式 $\sum_{k=1}^{100} k + \sum_{k=1}^{50} k^2 + \sum_{k=1}^{10} \frac{1}{k}$ 求和并输出结果。
#include<stdio.h>
int main ( )
{
__________[3]__________;
int k;
for (k=1; k<=100; k++)
s+=k;
for (k=1; k<=50; k++)
s+=k*k;
for (k=1; k<=10; k++)
s=s+__________[4]__________;
printf("sum=%f",s);
return 0;
}2
3
4
5
6
7
8
9
10
11
12
13
14
查看答案与解析
答案:
(3) double s=0 或 float s=0 (4) 1.0/k
解析:
- s 需要是浮点类型,因为第三项求和涉及小数。
1.0/k确保浮点除法,1/k在 k>1 时整数除法结果为 0。
难度: ⭐⭐ 考点: #累加求和 #类型转换
💡 学习锦囊
📖 相关公式与知识点:
- 整数除法
/:两个整数相除结果仍为整数(截断)。 - 浮点除法:至少一个操作数为浮点数。
易错点
1/k 当 k>1 时结果为 0,必须写成 1.0/k。
🔄 举一反三
5/2和5.0/2的结果分别是什么?查看练习答案与解析
答案:2 和 2.5 解析:整数除法截断小数,浮点除法保留小数。
3. 数组复制
程序功能: 使数组 a[] 的内容复制到数组 b[] 中,当 a[i]=-999 时结束。
#include <stdio.h>
int arraycopy(int a[],int b[]);
int main()
{
static int a[]={1,2,3,4,5,6,7,8,9,10,-999};
int b[100], i = 0;
arraycopy(a,b);
while(b[i]!=-999)
printf("%d ", b[i++]);
return 0;
}
int arraycopy(int a[],int b[])
{
int i=0;
while(a[i]!=-999)
{
_____[5]_____;
i++;
}
b[i]= _____[6]_____;
return 0;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
查看答案与解析
答案:
(5) b[i]=a[i] (6) -999
解析:
- 逐元素复制直到遇到结束标记 -999。
- 复制结束后在 b 数组末尾也添加 -999 作为结束标记。
难度: ⭐ 考点: #数组复制 #哨兵值
💡 学习锦囊
📖 相关公式与知识点:
- 哨兵值(Sentinel):用特殊值标记数组结束。
- 数组复制需要逐个元素操作。
🔄 举一反三
- 如果 a 数组中没有 -999,程序会怎样?
查看练习答案与解析
答案:数组越界,行为未定义 解析:while 循环会一直读取超出数组范围的内存。
4. 字符串倒置
程序功能: 通过递归的方法将字符串倒置。
void fun(char s[ ],int l,int h)
{
if (_____[7]_____) return;
else {
char t;
fun(_____[8]_____);
t = s[l], s[l]=s[h], s[h]=t;
}
}2
3
4
5
6
7
8
9
查看答案与解析
答案:
(7) l>=h (8) s,l+1,h-1
解析:
- 递归终止条件:左下标 >= 右下标,说明已完成或无需交换。
- 递归调用:缩小范围,l+1, h-1 处理内层字符。
难度: ⭐⭐⭐ 考点: #递归 #字符串倒置
💡 学习锦囊
📖 相关公式与知识点:
- 递归三要素:终止条件、缩小规模、组合结果。
- 字符串倒置:首尾交换,中间部分递归处理。
思路分析
先递归到最内层,返回时逐层交换首尾字符。
🔄 举一反三
- 用迭代法如何实现字符串倒置?
查看练习答案与解析
答案:用 while(l<h) 循环交换 s[l] 和 s[h]。 解析:迭代法通常比递归法更高效。
5. 查找链表最小值
程序功能: 查找带头结点的单向链表中结点数据域的最小值。
struct node
{
int data;
struct node *next;
};
int min(struct node *head)
{
struct node *p;
int n;
p=head;
n=p->data;
for(p=p->next;p; _____[9]_____)
if(_____[10]_____) n=p->data;
return n;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
查看答案与解析
答案:
(9) p=p->next (10) p->data<n
解析:
- 遍历链表:每次将 p 移动到下一个节点。
- 更新最小值:当发现更小的数据时更新 n。
难度: ⭐⭐ 考点: #链表遍历 #查找最值
💡 学习锦囊
📖 相关公式与知识点:
- 链表遍历:
for(p=head; p!=NULL; p=p->next)。 - 带头结点链表:头结点的 data 域通常不使用或存储特殊值。
易错点
注意头结点的 data 是否参与比较,本题中 n 初始化为 head->data。
🔄 举一反三
- 如何查找链表中的最大值?
查看练习答案与解析
答案:将
p->data<n改为p->data>n解析:只需修改比较条件。