计算机二级C语言模拟题在哪找?

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

计算机二级C语言模拟题

考试时间:120分钟

计算机二级c语言模拟题
(图片来源网络,侵删)

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

  1. 下列关于算法的描述中,错误的是。 A) 算法必须有输入 B) 算法必须有输出 C) 算法的每个步骤都必须是明确的 D) 算法必须在有限步内完成

  2. 以下选项中,不合法的C语言标识符是。 A) _total B) Num1 C) a+b D) switch

  3. 设有定义:int a; float b; double c;,若要从键盘输入数据,使a的值为10,b的值为22.5,c的值为3.51,正确的输入语句是。 A) scanf("%d%f%lf", &a, &b, &c); B) scanf("%d%f%f", &a, &b, &c); C) scanf("%d,%f,%lf", &a, &b, &c); D) scanf("%d,%f,%f", &a, &b, &c);

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

    计算机二级c语言模拟题
    (图片来源网络,侵删)
    #include <stdio.h>
    int main() {
        int x = 10, y = 20;
        printf("%d\n", x < y ? x : y);
        return 0;
    }

    A) 10 B) 20 C) 0 D) 1

  5. 以下关于switch语句的描述中,正确的是。 A) switch语句后面的表达式可以是任意类型 B) case后面的表达式可以是常量或变量 C) 每个case后面的语句序列最后都必须有break语句 D) default分支可以省略

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

    int a = 1, b = 2, c = 3;
    if (a > c)
        b = a;
    else
        c = b + a;
    printf("%d, %d, %d\n", a, b, c);

    A) 1, 2, 3 B) 1, 2, 5 C) 1, 2, 2 D) 1, 2, 4

    计算机二级c语言模拟题
    (图片来源网络,侵删)
  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. 以下程序的输出结果是。

    #include <stdio.h>
    int main() {
        int a[5] = {1, 2, 3, 4, 5};
        int *p = &a[2];
        printf("%d, %d\n", *p, *(p+2));
        return 0;
    }

    A) 2, 4 B) 3, 5 C) 2, 3 D) 3, 4

  9. 以下对结构体类型Student的定义中,正确的是。 A)

    struct Student {
        int num;
        char name[20];
    };

    B)

    struct Student {
        int num;
        char name[20];
    };
    Student s1;

    C)

    typedef struct {
        int num;
        char name[20];
    } Student;

    D)

    typedef struct Student {
        int num;
        char name[20];
    };
  10. 以下关于文件操作的描述中,错误的是。 A) 使用fopen函数打开文件时,必须指定打开方式(如"r", "w"等) B) 文件使用完毕后,必须用fclose函数关闭 C) feof函数用于检测文件指针是否指向文件末尾 D) fprintf函数可以向屏幕输出格式化数据

  11. 设有定义:int x = 10, y = 3;,则表达式x % y的值是。 A) 1 B) 3 C) 0 D) 10

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

    #include <stdio.h>
    int main() {
        int i;
        for (i = 0; i < 5; i++) {
            if (i % 2 == 0) continue;
            printf("%d ", i);
        }
        return 0;
    }

    A) 0 1 2 3 4 B) 1 3 C) 0 2 4 D) 1 2 3 4

  13. 以下函数的功能是。

    int fun(int a) {
        int b = 0;
        static int c = 3;
        b++; c++;
        return a + b + c;
    }

    A) 计算a+b+c B) 计算a+b+3 C) 每次调用,返回值都比上一次调用大1 D) 每次调用,返回值都比上一次调用大2

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

    #include <stdio.h>
    int main() {
        char str[] = "Hello";
        char *p = str;
        printf("%c\n", *(p+3));
        return 0;
    }

    A) H B) e C) l D) o

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

    #include <stdio.h>
    int main() {
        int a = 5, b = 4, c = 3, d = 2;
        if (a > b > c)
            printf("A");
        else if (c > d)
            printf("B");
        else
            printf("C");
        return 0;
    }

    A) A B) B C) C D) 无输出

  16. 为了判断两个字符串s1s2是否相等,应使用的语句是。 A) if (s1 == s2) B) if (s1 == *s2) C) if (strcmp(s1, s2) == 0) D) if (strcpy(s1, s2))

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

    #include <stdio.h>
    int f(int x) {
        return x * x;
    }
    int main() {
        int i = 2, p;
        p = f(i++);
        printf("%d\n", p);
        return 0;
    }

    A) 2 B) 3 C) 4 D) 5

  18. 以下定义数组的语句中,错误的是。 A) int a[10]; B) int n = 10; int a[n]; C) int a[] = {1, 2, 3}; D) int *a = (int*)malloc(10 * sizeof(int));

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

    #include <stdio.h>
    int main() {
        int a = 1, b = 2;
        a = a + b;
        b = a - b;
        a = a - b;
        printf("a=%d, b=%d\n", a, b);
        return 0;
    }

    A) a=1, b=2 B) a=2, b=1 C) a=3, b=2 D) a=2, b=3

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

    #include <stdio.h>
    void fun(int x) {
        x = 20;
    }
    int main() {
        int x = 10;
        fun(x);
        printf("%d\n", x);
        return 0;
    }

    A) 10 B) 20 C) 0 D) 不确定


程序填空题(共18分,每空3分)

函数说明: 以下程序的功能是:从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出转换后的字符串,输入"Hello World!",输出"HELLO WORLD!"。

请在程序的下划线处填入正确的内容,使程序得出正确的结果,并去掉下划线。

#include <stdio.h>
#include <string.h>
void to_upper(char str[]) {
    int i;
    for (i = 0; str[i] != '\0'; i++) {
        if (str[i] >= 'a' && str[i] <= 'z') {
            str[i] = str[i] - 32; // 或者 str[i] = str[i] - ('a' - 'A');
        }
    }
}
int main() {
    char s[100];
    printf("请输入一个字符串: ");
    gets(s); // 注意:在实际考试中,gets()可能被不安全警告,但题目中可能会出现
    _________________________; // 调用to_upper函数
    printf("转换后的字符串: %s\n", s);
    return 0;
}

答案:

  1. to_upper(s)

程序修改题(共18分,每处错误6分)

函数说明: 以下程序中,函数fun的功能是:计算1到n之间所有能被3整除但不能被5整除的整数之和,n=10时,和为3 + 6 + 9 = 18。

程序中有两处错误,请找出并修改,使程序能正确运行。

#include <stdio.h>
long fun(int n) {
    long sum = 0;
    int i;
    for (i = 1; i <= n; i++) {
        if (i % 3 == 0 && i % 5 != 0) { // 错误点1
            sum = sum + i;
        }
    }
    return sum;
}
int main() {
    int n;
    long s;
    printf("请输入一个正整数n: ");
    scanf("%d", &n);
    s = fun(n);
    printf("和为: %ld\n", s); // 错误点2
    return 0;
}

要求: 在修改时,不得改变程序的整体结构,不得增删行,只能修改错误处的代码。

错误点1:

  • 错误代码: if (i % 3 == 0 && i % 5 != 0);
  • 错误原因: 语句末尾多了一个分号,这使得if语句体为空,sum = sum + i;成为循环体的一部分,每次都会执行,导致结果错误。
  • 修改为: if (i % 3 == 0 && i % 5 != 0)

错误点2:

  • 错误代码: printf("和为: %ld\n", s);
  • 错误原因: long类型的变量sum(赋值给s)在printf中应该使用%ld格式说明符,而不是%d%d用于int类型,可能会导致输出不正确或警告。
  • 修改为: printf("和为: %ld\n", s);

程序设计题(共24分)

要求:** 编写一个函数fun,其功能是:将一个字符串中所有连续的数字字符转换成一个整数,并存入数组b中,最后返回转换后的整数个数,字符串中可能包含多个数字序列,数字序列之间由非数字字符分隔。

字符串为 "a12b3c456d",则转换后数组b中的元素为12, 3, 456,函数返回值为3。

注意: 部分源程序给出,请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include <stdio.h>
#include <string.h>
#include <ctype.h> // 用于 isdigit 函数
#define M 100
int fun(char *str, int b[]) {
    int i, j, k;
    int num = 0; // 用于记录转换后的整数个数
    int len = strlen(str);
    int temp[M] = {0}; // 临时存储每个数字序列的字符
    i = 0;
    while (i < len) {
        // 跳过非数字字符
        if (!isdigit(str[i])) {
            i++;
            continue;
        }
        // 找到连续的数字字符
        j = 0;
        while (i < len && isdigit(str[i])) {
            temp[j++] = str[i++];
        }
        // 将temp中的字符转换为整数并存入b数组
        k = 0;
        while (j > 0) {
            b[num] = b[num] * 10 + (temp[k++] - '0');
            j--;
        }
        num++;
    }
    return num;
}
int main() {
    char s[M];
    int a[M], n, i;
    printf("请输入一个字符串: ");
    gets(s); // 注意:在实际考试中,gets()可能被不安全警告,但题目中可能会出现
    n = fun(s, a);
    printf("转换后的整数个数为: %d\n", n);
    printf("转换后的整数为: ");
    for (i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

参考答案及解析

选择题

  1. A (算法可以没有输入,例如计算π值的算法)
  2. C (标识符不能包含运算符)
  3. C (scanf的格式字符串中,%d%f之间需要有分隔符,如逗号,与输入的10,22.5,3.51对应。%lf用于double类型)
  4. A (条件表达式x < y ? x : y,因为10 < 20为真,所以取x的值10)
  5. A (switch的表达式必须是整型、字符型或枚举类型)
  6. B (条件a > c (1 > 3) 为假,执行else分支,c = b + a,即c = 2 + 1 = 3,所以最终a=1, b=2, c=3。注:原题C选项c=2有误,根据逻辑应为c=3,此处按逻辑解析为B,但原题可能意图是考察else if,无else if时,c应为3。 重新审视原题,无else if,所以执行elsec变为3,所以答案是B。)
  7. C (A选项数组长度不够;B选项s是数组名,是常量指针,不能赋值;D选项正确,但C选项也是正确的,且更符合“赋值操作”的描述。注:在C语言中,`char s = "hello";是将字符串常量的首地址赋给指针s`,这是一种赋值操作,D选项是初始化。* 通常考试会认为C是更符合题意的答案。)
  8. B (指针p指向a[2],即值为3。*(p+2)指向a[4],即值为5)
  9. C (A只定义了结构体类型,未定义变量;B在定义结构体时直接定义变量,不符合语法;Dtypedef后缺少结构体名)
  10. D (fprintf函数是向文件输出格式化数据,向屏幕输出用printf)
  11. A (取余运算,10除以3商3余1)
  12. B (continue会跳过本次循环剩余语句,i为0时跳过,i为1时打印,i为2时跳过,以此类推)
  13. D (静态变量c在函数调用间保持其值,第一次调用b=1, c=4,返回a+b+c=10+1+4=15,第二次调用b=1, c=5,返回a+b+c=10+1+5=16,第三次调用返回17,所以每次调用返回值比上一次大1。注:原题C选项说“大1”是正确的,D选项“大2”是错误的。 根据计算,C选项正确。)
  14. C (指针p指向字符串首字符'H',p+3指向第4个字符,即'l')
  15. B (条件a > b > c等价于(a > b) > c,即(5 > 4) > 31 > 3为假,不执行printf("A"),接着判断else if (c > d)3 > 2为真,执行printf("B"))
  16. C (比较字符串内容必须使用strcmp函数)
  17. C (后缀是先使用后自增。f(i++)中,先传入i=2,然后i变为3。f(2)返回2*2=4)
  18. B (C99标准之前,数组大小不能是变量,C99支持变长数组,但很多考试环境仍不支持,视为错误)
  19. B (这是一个经典交换算法:a=a+b (a=5), b=a-b (b=3), a=a-b (a=2))
  20. A (C语言是值传递,fun函数中的xmainx的一个副本,修改副本不影响main中的原变量)

程序填空题

  1. to_upper(s)

程序修改题

  1. 错误点1: if (i % 3 == 0 && i % 5 != 0); 修改为 if (i % 3 == 0 && i % 5 != 0)
  2. 错误点2: printf("和为: %d\n", s); 修改为 printf("和为: %ld\n", s)

程序设计题

// 完整代码已在题目中给出,此处为核心算法思路
int fun(char *str, int b[]) {
    int i, num = 0;
    int temp[M] = {0};
    int len = strlen(str);
    for (i = 0; i < len; ) {
        if (isdigit(str[i])) {
            int j = 0;
            // 提取连续的数字
            while (i < len && isdigit(str[i])) {
                temp[j++] = str[i++];
            }
            // 将temp中的字符转换为整数
            int current_num = 0;
            for (int k = 0; k < j; k++) {
                current_num = current_num * 10 + (temp[k] - '0');
            }
            b[num++] = current_num;
        } else {
            i++; // 跳过非数字字符
        }
    }
    return num;
}
-- 展开阅读全文 --
头像
C语言万年历编写如何实现?
« 上一篇 今天
织梦还原数据库失败,原因究竟何在?
下一篇 » 今天

相关文章

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

目录[+]