自2025年3月考试起,NCRE二级C语言已取消传统的笔试,全面实行无纸化考试。 考试时长120分钟,满分100分,题型包括:

- 选择题(40分,共40题):考察C语言基础知识(语法、概念、库函数等)。
- 程序填空题(18分,共3空):在一个不完整的程序中填写代码,使其实现指定功能。
- 程序改错题(18分,共2处错误):在含有错误的程序中找出并修正错误,使其实现指定功能。
- 程序设计题(24分):根据题目要求,编写完整的C语言程序,实现特定功能。
现在没有单独的“笔试试题”了,选择题部分的内容与过去的笔试知识点高度重合,下面我将为你提供一份模拟的无纸化考试试题,包含所有四种题型,并附上答案和解析,以帮助你全面备考。
全国计算机等级考试二级C语言 无纸化考试模拟试题
考试时间:120分钟 满分:100分
选择题(每小题1分,共40分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项填涂在答题卡相应位置上。
-
下列叙述中正确的是。 A. 算法就是程序 B. 设计算法时只需要考虑数据结构的设计 C. 设计算法时只需要考虑结果的可靠性 D. 以上三种说法都不对
(图片来源网络,侵删) -
下列关于线性表的叙述中,不正确的是。 A. 线性表可以是空表 B. 线性表是一种线性结构 C. 线性表的所有结点有且仅有一个前驱和一个后继 D. 线性表是一种顺序存储结构
-
下列关于栈的叙述中正确的是。 A. 栈是“先进先出”的线性表 B. 栈只能顺序存储 C. 栈具有记忆功能 D. 栈是“后进先出”的线性表
-
在软件设计中,不属于过程设计工具的是。 A. PDL(过程设计语言) B. PAD图 C. N-S图 D. DFD图
-
下列叙述中正确的是。 A. 软件交付使用后还需要维护 B. 软件一旦交付使用就不需要再改变 C. 软件交付使用后,其生命周期就结束 D. 软件维护是指修复程序中的错误
(图片来源网络,侵删) -
下列关于数据库设计的叙述中,错误的是。 A. 数据库设计包括概念设计、逻辑设计和物理设计 B. 数据库需求分析阶段的目标是形成需求说明书 C. 数据库概念设计阶段形成全局概念模式 D. 数据库物理设计阶段建立数据库模式
-
有三个关系R, S, T如下:
| R | S | T | ||
|---|---|---|---|---|
| A | B | B | C | A |
| m | 1 | 1 | 3 | m |
| n | 2 | 3 | 5 | n |
由关系R和S通过运算得到关系T,则所使用的运算为。 A. 笛卡尔积 B. 自然连接 C. 关系代数 D. 选择
-
下列关于E-R图的叙述中,错误的是。 A. 实体可以是一张发票 B. 实体可以是学生中的一个属性 C. 联系可以是一个学生与一门课程之间的选课关系 D. 实体集之间一定要有联系
-
在C语言中,下列字符常量合法的是。 A.
'\08'B.'\x1f'C."a"D.'ab' -
以下不合法的用户标识符是。 A.
_intB.NATC.5forD.sizeof -
以下选项中,合法的C语言实数是。 A.
.3e-2B.E9C.2E0.5D.12E -
若有定义:
int a=5, b=7;,则表达式a++ + b++的值是。 A. 11 B. 12 C. 13 D. 编译错误 -
若有定义:
int x=10, y=20, z=30;,则执行if(x>y) z=x; x=y; y=z;后,变量x, y, z的值分别是。 A. 10, 20, 30 B. 20, 30, 20 C. 20, 30, 10 D. 20, 30, 30 -
以下能正确进行字符串赋值的是。 A.
char s[5] = "hello";B.char s[5]; s = "hello";C.char *s; s = "hello";D.char s[5] = {'h', 'e', 'l', 'l', 'o'}; -
以下关于函数的叙述中,错误的是。 A. C程序由一个或多个函数组成 B. 函数可以被其他函数调用,但不能调用自己 C. 一个函数可以定义在另一个函数的内部 D. 一个函数可以有一个或多个返回值
-
以下对结构体类型变量的定义中,错误的是。 A.
struct student { int num; char name[10]; }; struct student s1;B.struct student { int num; char name[10]; } s1;C.struct { int num; char name[10]; } s1;D.typedef struct { int num; char name[10]; } STUDENT; STUDENT s1; -
若有定义:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *p = a;,则表达式*(p+5)的值是。 A. 5 B. 6 C. 7 D. 8 -
以下程序的输出结果是。
#include <stdio.h> int main() { int a = 2, b = 3, c = 4; if (a > b) if (b < c) printf("%d\n", c); else printf("%d\n", b); else if (a < c) printf("%d\n", a); else printf("%d\n", c); return 0; }A. 2 B. 3 C. 4 D. 无输出
-
以下程序的输出结果是。
#include <stdio.h> void fun(int x, int y) { int t = x; x = y; y = t; } int main() { int a = 1, b = 2; fun(a, b); printf("%d, %d\n", a, b); return 0; }A. 1, 2 B. 2, 1 C. 1, 1 D. 2, 2
-
以下程序的输出结果是。
#include <stdio.h> int main() { int s = 0, i; for (i = 1; i <= 10; i++) { if (i % 2 == 0) continue; s += i; } printf("%d\n", s); return 0; }A. 25 B. 30 C. 1+3+5+7+9 D. 2+4+6+8+10
... (选择题共40题,此处省略21-40题,其内容会涵盖指针、数组、文件操作、宏定义、位运算等更多知识点) ...
程序填空题(共18分)
给定程序的功能是:将一个字符串中的所有小写字母转换成大写字母,并输出转换后的字符串,输入 hello world,输出 HELLO WORLD。
请在程序的下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
#include <stdio.h>
#include <string.h>
#include <ctype.h> // 提供islower和toupper函数
void to_upper(char str[]) {
int i;
for (i = 0; str[i] != '\0'; i++) {
if (islower(str[i])) { // 判断是否为小写字母
str[i] = __1__; // 将小写字母转换为大写字母
}
}
}
int main() {
char s[100];
printf("请输入一个字符串: ");
gets(s); // 注意:gets()函数不安全,但考试中可能会出现
__2__; // 调用to_upper函数
printf("转换后的字符串: %s\n", __3__);
return 0;
}
【填空1】 toupper(str[i])
【填空2】 to_upper(s)
【填空3】 s
程序改错题(共18分)
给定程序中,函数 fun 的功能是:计算并输出 n 以内(不包括 n)能被3整除的所有自然数之和,若 n 的值为10,则输出18(3+6+9)。
请修改程序中的错误,使其能得出正确的结果。
#include <stdio.h>
/**********found**********/
void fun(int n) {
int i, sum = 0;
for (i = 1; i < n; i++) {
if (i % 3 == 0) {
sum += i;
}
}
/**********found**********/
printf("sum=%d\n", sum);
}
int main() {
int num;
printf("请输入一个整数n: ");
scanf("%d", &num);
fun(num);
return 0;
}
【错误1】 函数 fun 的返回值类型应为 int,因为 sum 是一个整数值,通常需要返回,或者,如果不需要返回,可以保持 void,但为了通用性,修改为 int 并返回 sum 更好,但根据题目要求“计算并输出”,直接输出也是可以的,这里假设题目要求函数返回结果,则错误在于函数定义。
【错误1修改】 将 void fun(int n) 改为 int fun(int n),并在函数末尾 return sum;。
【错误2】 程序逻辑本身没有错误,如果严格按照题目要求,可能不存在第二个错误,但在实际考试中,第二个错误可能隐藏在别处,考虑到 gets 的不安全性,这里 scanf 的使用是正确的,我们假设第二个错误是 printf 的格式字符串不完整,或者题目要求返回结果。
【错误2修改】 如果修改了函数返回值,main 函数中应接收并打印返回值,将 fun(num); 改为 printf("sum=%d\n", fun(num));。
修改后的完整程序:
#include <stdio.h>
int fun(int n) {
int i, sum = 0;
for (i = 1; i < n; i++) {
if (i % 3 == 0) {
sum += i;
}
}
return sum;
}
int main() {
int num;
printf("请输入一个整数n: ");
scanf("%d", &num);
printf("sum=%d\n", fun(num));
return 0;
}
程序设计题(共24分)
请编写一个函数 fun,其功能是:将一个字符串中的所有数字字符('0'到'9')删除。
输入字符串 a1b2c3d4e5f,删除后应输出 abcdef。
注意:部分源程序给出如下,请勿改动 main 函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。
#include <stdio.h>
#include <string.h>
void fun(char *str) {
// 在此编写代码
int i, j = 0;
for (i = 0; str[i] != '\0'; i++) {
if (str[i] < '0' || str[i] > '9') { // 如果不是数字字符
str[j++] = str[i]; // 将非数字字符前移
}
}
str[j] = '\0'; // 在新字符串末尾添加字符串结束符
}
int main() {
char s[100];
printf("请输入一个字符串: ");
gets(s); // 注意:gets()函数不安全,但考试中可能会出现
fun(s);
printf("删除数字后的字符串: %s\n", s);
return 0;
}
【设计思路】
- 使用两个指针(或索引),一个
i用于遍历原始字符串,另一个j用于指向新字符串的当前位置。 - 遍历字符串
str,直到遇到字符串结束符\0。 - 对于每个字符
str[i],判断它是否是数字字符,可以通过判断字符的ASCII码范围('0'到'9')来实现。 str[i]不是数字字符,就将它复制到str[j]的位置,j自增。str[i]是数字字符,则跳过它,j不动,i继续自增。- 当遍历结束后,新字符串的长度为
j,需要在str[j]的位置加上字符串结束符\0,以表示新字符串的结束。
答案与解析
选择题
- D,算法是解决问题的步骤,不等于程序,设计算法需考虑数据结构和结果可靠性。
- C,线性表的第一个结点没有前驱,最后一个结点没有后继。
- D,栈是“后进先出”(LIFO)的线性结构。
- D,DFD(数据流图)是结构化分析工具,不是过程设计工具。
- A,软件维护是软件生命周期的重要阶段,包括纠错、适应和完善。
- D,数据库物理设计阶段是建立物理模式(内模式),不是数据库模式(概念模式/逻辑模式)。
- B,关系T包含了R和S中公共属性B值相等的元组,这是自然连接的特征。
- B,实体是现实世界中客观存在并可相互区分的事物,属性是实体的特性,学生是一个实体,而学号是它的属性。
- B。
\x1f是一个合法的十六进制转义字符。\08超出了八进制范围,"a"是字符串常量,'ab'是非法的多字符常量。 - C,用户标识符不能以数字开头。
- A。
.3e-2是合法的科学计数法。E9缺少小数部分,2E0.5指数部分不能是小数,12E缺少指数部分。 - B。
a++和b++都是后置自增,表达式使用的是a和b的原始值5和7,相加得12,之后a和b变为6和8。 - B。
if(x>y)条件为假(10>20为假),执行else分支。if(a<c)条件为真(10<30为真),执行printf("%d\n", a);即输出10,但注意,x=y; y=z;这两句代码无论if真假都会执行。x被赋值为y的值20,y被赋值为z的值30。x=20, y=30, z=30。 - C,A选项数组空间不足,B选项中,
s是数组名,是常量,不能被赋值,D选项是字符数组初始化,不是字符串赋值(虽然效果类似,但严格来说字符串以\0这里没有)。 - B,函数可以递归调用(自己调用自己),C选项在C99标准前不允许,但C99标准后支持,D选项,一个函数通过
return语句只能返回一个值。 - B。
struct student s1;应该在分号 之后。 - B。
p指向数组首元素a[0]。p+5指向a[5]。*(p+5)a[5]的值,即6。 - A。
a > b(2>3) 为假,执行else分支。a < c(2<4) 为真,执行printf("%d\n", a);,输出2。 - A。
fun函数传递的是值传递,形参x和y的改变不会影响实参a和b。 - A。
for循环中,当i为偶数时,continue跳过本次循环的剩余部分(即s += i;不执行),所以循环只对奇数i进行累加。s = 1 + 3 + 5 + 7 + 9 = 25。
程序填空题
toupper(str[i]):使用toupper函数将小写字母转换为大写字母。to_upper(s):调用to_upper函数,传入字符串s作为实参。s:to_upper函数直接修改了s的内容,所以直接打印s即可。
程序改错题
- 错误点1:函数
fun的定义,原代码为void fun(int n),但函数计算了sum并希望输出,如果题目要求函数返回结果,应改为int fun(int n),如果题目要求函数直接输出,则此处无错,但通常这类题目会要求返回值,以便main函数使用,修改为int fun(int n)并在函数末尾return sum;。 - 错误点2:
main函数中对fun的调用。fun的返回值类型改为int,则fun(num)应作为printf的参数,以打印返回值,修改为printf("sum=%d\n", fun(num));。
程序设计题
void fun(char *str) {
int i, j = 0;
for (i = 0; str[i] != '\0'; i++) {
if (str[i] < '0' || str[i] > '9') { // 判断当前字符是否为数字
str[j] = str[i]; // 如果不是数字,则将其移动到新位置
j++;
}
}
str[j] = '\0'; // 添加字符串结束符
}
这个解法是经典的“原地删除”算法,通过双指针技术,空间复杂度为O(1),效率很高。
