全国计算机二级C语言笔试考什么?

99ANYc3cd6
预计阅读时长 30 分钟
位置: 首页 C语言 正文

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

全国计算机等级考试二级c语言笔试试题
(图片来源网络,侵删)
  • 选择题(40分,共40题):考察C语言基础知识(语法、概念、库函数等)。
  • 程序填空题(18分,共3空):在一个不完整的程序中填写代码,使其实现指定功能。
  • 程序改错题(18分,共2处错误):在含有错误的程序中找出并修正错误,使其实现指定功能。
  • 程序设计题(24分):根据题目要求,编写完整的C语言程序,实现特定功能。

现在没有单独的“笔试试题”了,选择题部分的内容与过去的笔试知识点高度重合,下面我将为你提供一份模拟的无纸化考试试题,包含所有四种题型,并附上答案和解析,以帮助你全面备考。


全国计算机等级考试二级C语言 无纸化考试模拟试题

考试时间:120分钟 满分:100分

选择题(每小题1分,共40分)

下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项填涂在答题卡相应位置上。

  1. 下列叙述中正确的是。 A. 算法就是程序 B. 设计算法时只需要考虑数据结构的设计 C. 设计算法时只需要考虑结果的可靠性 D. 以上三种说法都不对

    全国计算机等级考试二级c语言笔试试题
    (图片来源网络,侵删)
  2. 下列关于线性表的叙述中,不正确的是。 A. 线性表可以是空表 B. 线性表是一种线性结构 C. 线性表的所有结点有且仅有一个前驱和一个后继 D. 线性表是一种顺序存储结构

  3. 下列关于栈的叙述中正确的是。 A. 栈是“先进先出”的线性表 B. 栈只能顺序存储 C. 栈具有记忆功能 D. 栈是“后进先出”的线性表

  4. 在软件设计中,不属于过程设计工具的是。 A. PDL(过程设计语言) B. PAD图 C. N-S图 D. DFD图

  5. 下列叙述中正确的是。 A. 软件交付使用后还需要维护 B. 软件一旦交付使用就不需要再改变 C. 软件交付使用后,其生命周期就结束 D. 软件维护是指修复程序中的错误

    全国计算机等级考试二级c语言笔试试题
    (图片来源网络,侵删)
  6. 下列关于数据库设计的叙述中,错误的是。 A. 数据库设计包括概念设计、逻辑设计和物理设计 B. 数据库需求分析阶段的目标是形成需求说明书 C. 数据库概念设计阶段形成全局概念模式 D. 数据库物理设计阶段建立数据库模式

  7. 有三个关系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. 选择

  1. 下列关于E-R图的叙述中,错误的是。 A. 实体可以是一张发票 B. 实体可以是学生中的一个属性 C. 联系可以是一个学生与一门课程之间的选课关系 D. 实体集之间一定要有联系

  2. 在C语言中,下列字符常量合法的是。 A. '\08' B. '\x1f' C. "a" D. 'ab'

  3. 以下不合法的用户标识符是。 A. _int B. NAT C. 5for D. sizeof

  4. 以下选项中,合法的C语言实数是。 A. .3e-2 B. E9 C. 2E0.5 D. 12E

  5. 若有定义:int a=5, b=7;,则表达式 a++ + b++ 的值是。 A. 11 B. 12 C. 13 D. 编译错误

  6. 若有定义: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

  7. 以下能正确进行字符串赋值的是。 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'};

  8. 以下关于函数的叙述中,错误的是。 A. C程序由一个或多个函数组成 B. 函数可以被其他函数调用,但不能调用自己 C. 一个函数可以定义在另一个函数的内部 D. 一个函数可以有一个或多个返回值

  9. 以下对结构体类型变量的定义中,错误的是。 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;

  10. 若有定义: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

  11. 以下程序的输出结果是。

    #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. 无输出

  12. 以下程序的输出结果是。

    #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

  13. 以下程序的输出结果是。

    #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;
}

【设计思路】

  1. 使用两个指针(或索引),一个 i 用于遍历原始字符串,另一个 j 用于指向新字符串的当前位置。
  2. 遍历字符串 str,直到遇到字符串结束符 \0
  3. 对于每个字符 str[i],判断它是否是数字字符,可以通过判断字符的ASCII码范围('0''9')来实现。
  4. str[i] 不是数字字符,就将它复制到 str[j] 的位置,j 自增。
  5. str[i] 是数字字符,则跳过它,j 不动,i 继续自增。
  6. 当遍历结束后,新字符串的长度为 j,需要在 str[j] 的位置加上字符串结束符 \0,以表示新字符串的结束。

答案与解析

选择题

  1. D,算法是解决问题的步骤,不等于程序,设计算法需考虑数据结构和结果可靠性。
  2. C,线性表的第一个结点没有前驱,最后一个结点没有后继。
  3. D,栈是“后进先出”(LIFO)的线性结构。
  4. D,DFD(数据流图)是结构化分析工具,不是过程设计工具。
  5. A,软件维护是软件生命周期的重要阶段,包括纠错、适应和完善。
  6. D,数据库物理设计阶段是建立物理模式(内模式),不是数据库模式(概念模式/逻辑模式)。
  7. B,关系T包含了R和S中公共属性B值相等的元组,这是自然连接的特征。
  8. B,实体是现实世界中客观存在并可相互区分的事物,属性是实体的特性,学生是一个实体,而学号是它的属性。
  9. B\x1f 是一个合法的十六进制转义字符。\08 超出了八进制范围,"a" 是字符串常量,'ab' 是非法的多字符常量。
  10. C,用户标识符不能以数字开头。
  11. A.3e-2 是合法的科学计数法。E9 缺少小数部分,2E0.5 指数部分不能是小数,12E 缺少指数部分。
  12. Ba++b++ 都是后置自增,表达式使用的是 ab 的原始值5和7,相加得12,之后 ab 变为6和8。
  13. Bif(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
  14. C,A选项数组空间不足,B选项中,s 是数组名,是常量,不能被赋值,D选项是字符数组初始化,不是字符串赋值(虽然效果类似,但严格来说字符串以\0这里没有)。
  15. B,函数可以递归调用(自己调用自己),C选项在C99标准前不允许,但C99标准后支持,D选项,一个函数通过 return 语句只能返回一个值。
  16. Bstruct student s1; 应该在分号 之后。
  17. Bp 指向数组首元素 a[0]p+5 指向 a[5]*(p+5) a[5] 的值,即6。
  18. Aa > b (2>3) 为假,执行 else 分支。a < c (2<4) 为真,执行 printf("%d\n", a);,输出2。
  19. Afun 函数传递的是值传递,形参 xy 的改变不会影响实参 ab
  20. Afor 循环中,当 i 为偶数时,continue 跳过本次循环的剩余部分(即 s += i; 不执行),所以循环只对奇数 i 进行累加。s = 1 + 3 + 5 + 7 + 9 = 25

程序填空题

  1. toupper(str[i]):使用 toupper 函数将小写字母转换为大写字母。
  2. to_upper(s):调用 to_upper 函数,传入字符串 s 作为实参。
  3. sto_upper 函数直接修改了 s 的内容,所以直接打印 s 即可。

程序改错题

  1. 错误点1:函数 fun 的定义,原代码为 void fun(int n),但函数计算了 sum 并希望输出,如果题目要求函数返回结果,应改为 int fun(int n),如果题目要求函数直接输出,则此处无错,但通常这类题目会要求返回值,以便 main 函数使用,修改为 int fun(int n) 并在函数末尾 return sum;
  2. 错误点2main 函数中对 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),效率很高。

-- 展开阅读全文 --
头像
dede banner幻灯广告插件模块如何安装使用?
« 上一篇 12-06
dede arclist如何调用文章内容?
下一篇 » 12-06

相关文章

取消
微信二维码
支付宝二维码

目录[+]