2018年真题解析

  1. 2018年真题解析
  2. 临时存答案
  3. 解析
  4. 填空题
    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    10. 10
  5. 判断题
    1. 11
    2. 12
    3. 13
    4. 14
    5. 15
    6. 16
    7. 17
    8. 18
    9. 19
    10. 20
  6. 程序分析题
    1. 21
    2. 22
    3. 23
  7. 编程题
    1. 24-25
    2. 26

2018年真题解析

网安的概念还有几十页要背,好好背一下好了。唉,考研是真的好痛苦啊。

临时存答案

一、单选题
1.A 2.C 3.A 4.D 5.A
6.C 7.B 8.C 9.C 10.B
//正确答案BCADA DBCCB  错两个,得16分
二、判断题
对对对错对
错错错对错
//我的就是正确答案!得20分
三、程序分析题
21.
程序功能:判断每个字母分别出现了几次,不区分大小写
程序运行结果:
A-2
E-1
G-1
H-1
I-2
K-1
M-1
O-2
P-1
R-2
S-3
T-3
//全对10分!
22.
程序功能:判断数组中成绩最高的学生和成绩最低的学生,并分别输出分数最大的学生和分数最小的学生的姓名和成绩。
程序运行结果:
Max is:Wanghai,93
Min is:Liuhong,62
//全对10分!
23.
程序功能:将一个正整数倒置
程序运行结果:result:54321
//全对10分!

四、程序设计题

24.

#include<stdio.h>
int main(){
    int i,j;
    int re;
    for(j=1;j<=9;j++){
        for(i=1;i<=j;i++){
            re=j*i;
            printf("%d*%d=%d   ",j,i,re);
        }
        printf("\n");
    }
    return 0;
}

//能完成功能,我就算25分吧

25.

#include<stdio.h>
int main() {
    struct person {
        char name[20];
        int sex;//男人为0,女人为1
        int age;
    }arr[100];
    int i = 0;
    while (i < 100) {
        printf("请输入第%d位人的姓名,性别(其中男人为0,女人为1)和年龄:\n", i+1);
        scanf("%s%d%d", &arr[i].name, &arr[i].sex, &arr[i].age);
        i++;
    }//接收

    struct person tee[100], adult[100], old[100];
    int t = 0; int a = 0; int o = 0;
    for (i = 0; i < 100; i++) {
        if (( - 1 < arr[i].age) && (arr[i].age< 30)) {
            tee[t] = arr[i];
            t++;
        }
        if ((29 < arr[i].age) && (arr[i].age < 60)) {
            adult[a] = arr[i];
            a++;
        }
        if (arr[i].age >= 60) {
            old[o] = arr[i];
            o++;
        }
    }
    printf("年轻人有%d,中年人有%d,老年人有%d", t, a, o);
    return 0;
}

//能完成功能,我就算25分吧

26.

#include<stdio.h>
#include<string.h>
int main() {
    char arr1[50];
    char arr2[50];
    int i = 0;
    int j = 0;
    printf("请输入字符串1\n");
    gets_s(arr1);

    char a = '0';
    char b = '9';
    while (arr1[i] != '\0') {
        if ((arr1[i] >= a) && (arr1[i] <= b)) {
            arr1[i] == a;
        }
        if (arr1[i] != a) {
            arr2[j] = arr1[i];
            j++;
            i++;
        }
        else {
            i++;
        }
    }

    int lenth = 0;
    lenth = strlen(arr2);
    printf("字符串2为:");
    for (i = 0; i < lenth; i++) {
        printf("%c", arr2[i]);
    }
    return 0;
}

未完成,我直接算0分好吧

这次总分116分!重点其实就是编程题,我要是最后一个编程题对了,基本上就是130分左右,但是好难啊,我两次编程题都没写对,所以要对编程题进行针对性的训练。

解析

填空题

1

image-20231004182136763

这道题我都能选错是我没想到的,脑子抽了。。

逻辑或是有一个是真的就是真的,所以选B

2

image-20231004182611730

选C

3

image-20231004182625830

选A

C语言源文件后缀名是“.c”,编译(就是将源代码转换为机器语言。编译器的输出结果成为目标代码,存放它们的文件称为目标文件)生成的文件后缀名是“.obj”,连接后可执行文件的后缀名是“.exe”。
而最后的cpp后缀,是c++的源文件。

4

image-20231004182933228

最后一个只是单纯的表达式,并不具备赋值的功能。
选D

5

image-20231004183005784

这个是老生常谈了,选A

6

image-20231004183026483

这个我还是真是触及到知识盲区了,我一直以为是3能省略,结果是全部都可以省略,但表达式之间的间隔符 ( 分号 )不能缺省。for(;;)的功能就和while(1)一样了
选D

7

image-20231004183740621

判断长度当然使用strlen函数啦
选B

8

image-20231004183848474

老生常谈的问题了,不说了,选C

9

image-20231005133809796

定义结构体,太基础啦!首先必不可少的就是struct,后面的结构体名称和变量名都是可以省略的,然后前面的结构体名称是不能使用数组的,所以最后答案就选C

10

image-20231005134540301

首先是输入,所以排除A,如果要直接接收数组的话,scanf直接用数组名即可,gets也是直接用数组名即可,但是gets里面是不能打引号的,所以这道题选B

判断题

11

image-20231005135432175

对的

12

image-20231005135448133

对的

13

image-20231005135455889

对的

14

image-20231005135511505

错的,定义数组要使用方括号,定义函数的时候才使用圆括号,且圆括号中的形参也不能以数字开头。

15

image-20231005135554642

对的

16

image-20231005135608260

错的,应该如下,p=a

image-20231005135705681

17

image-20231005135725130

错误的,viod函数不需要return的返回值

18

image-20231005135745158

错误的,是按照从上到下执行的

19

image-20231005135815722

正确的

image-20231005140832833

viod指针就能做到这一点,但是后面却无法正确间接寻址,原因是void指针必须要进行转换之后,才能进行正确的引用

#include <string.h>
#include<stdio.h>

int main() {
    char arr[5] = "arrs";
    int arr2[5] = { 1,2,3,4,5 };
    void* p;
    p = &arr[1];  // 指向字符数组的第二个元素
    printf("%c\n", *(char*)p);  // 打印字符数组的第二个元素
    p = &arr2[1];  // 指向整数数组的第二个元素
    printf("%d\n", *(int*)p);  // 打印整数数组的第二个元素
    return 0;
}

image-20231005141250833

20

image-20231005141318466

肯定是错误的啦,变量E等于1的时候才执行,而后面是变量E等于0的时候才执行.

程序分析题

21

image-20231005141535365

这些分析题我就不解释了,毕竟我都全对,直接看我之前写的答案就好了
值得注意的一点就是,程序中的printf必须要好好的看,避免漏过一些重要的输出内容。

22

image-20231005142350476

23

image-20231005142402355

编程题

不多解释了,前面两个看我的答案就可以了,现在说说第三个

24-25

image-20231005143304921

26

image-20231005143317971

我的思路是,首先接收字符串1和2,然后遍历字符串1,遇到0~9之间的元素就跳过,其他时候直接存入字符串2

#include <string.h>
#include<stdio.h>

int main() {
    // 定义两个字符数组,arr1用于接收输入,arr2用于存储非数字字符
    char arr1[50];
    char arr2[50] = {""};

    // 从用户那里获取字符串,并存入arr1
    scanf("%s", arr1);

    // 计算输入字符串的长度
    int len = strlen(arr1);

    // 初始化索引变量j
    int j = 0;

    // 遍历输入字符串中的每个字符
    for (int i = 0; i < len; i++) {
        // 如果当前字符是数字,则打印提示信息并跳过
        if (arr1[i] >= '0' && arr1[i] <= '9') {
            printf("排除%c!\n", arr1[i]);
        }
        else {
            // 如果当前字符不是数字,则将其添加到arr2,并增加索引j
            arr2[j] = arr1[i];
            j++;
        }
    }

    // 计算arr2的长度
    int len2;
    len2 = strlen(arr2);

    // 打印出arr2中的所有字符
    for (int i = 0; i < len; i++) {
        printf("%c", arr2[i]);
    }
}

image-20231005144842718


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。