首页 > 其他分享 >2个月搞定计算机二级C语言——真题(2)解析

2个月搞定计算机二级C语言——真题(2)解析

时间:2024-07-25 16:40:35浏览次数:17  
标签:搞定 真题 int C语言 ++ printf fun found dt0

1. 前言

大家好,我是梁国庆。

本篇博客讲解真题2,其中的填空题用到了指向结构体的指针访问被指结构体的成员的知识,我在下文做了讲解。

其他的主要还是对数组的考察,没什么难度,搞清楚思路写程序就可以。

2. 程序填空题

2.1 题目要求

2.2 提供的代码

#include <stdio.h>
#include <string.h>
struct student {
    long  sno;
    char  name[10];
    float score[3];
};
void fun(struct student* b) {
    /**********found**********/
    b__1__ = 10004;
    /**********found**********/
    strcpy(b__2__, "LiJie");
}
main() {
    struct student t = {10002, "ZhangQi", 93, 85, 87};
    int            i;
    printf("\n\nThe original data :\n");
    printf("\nNo: %ld  Name: %s\nScores:  ", t.sno, t.name);
    for (i = 0; i < 3; i++)
        printf("%6.2f ", t.score[i]);
    printf("\n");
    /**********found**********/
    fun(__3__);
    printf("\nThe data after modified :\n");
    printf("\nNo: %ld  Name: %s\nScores:  ", t.sno, t.name);
    for (i = 0; i < 3; i++)
        printf("%6.2f ", t.score[i]);
    printf("\n");
    getchar();
}

2.3 解题思路

在开始之前先补充一下知识:

在C语言中,主要有两种方式来访问结构体成员:点操作符(.)和箭头操作符(->)。

点操作符 (.): 当有一个结构体变量本身时,使用点操作符来访问其成员。

箭头操作符 (->): 当有一个指向结构体的指针时,使用箭头操作符来访问结构体的成员。指针是一个存储地址的变量,它指向结构体在内存中的位置。箭头操作符是一个简化的语法,等价于(*pointer).member

(1)处填空:因为 fun 函数的形参 b 是一个指向struct student的指针,所以使用箭头操作符->来访问和修改结构体的成员。

b->sno = 10004;

(2)处填空:同上

strcpy(b->name, "LiJie");

(3)处填空:根据题目“b所指变量t中的……”,再结合提供的代码可以得出结构体变量 t 是作为实参被 fun 函数调用的,则需要传入结构体变量 t 的地址,即在 fun() 中填入 &t

fun(&t);

2.4 代码实现

填写完整的代码:

#include <stdio.h>
#include <string.h>
struct student {
    long  sno;
    char  name[10];
    float score[3];
};
void fun(struct student* b) {
    /**********found**********/
    b->sno = 10004;  // 使用 -> 来访问和修改结构体的成员
    /**********found**********/
    strcpy(b->name, "LiJie");  // 同上
}
main() {
    struct student t = {10002, "ZhangQi", 93, 85, 87};
    int            i;
    printf("\n\nThe original data :\n");
    printf("\nNo: %ld  Name: %s\nScores:  ", t.sno, t.name);
    for (i = 0; i < 3; i++)
        printf("%6.2f ", t.score[i]);
    printf("\n");
    /**********found**********/
    fun(&t);  // 传入结构体变量 t 的地址
    printf("\nThe data after modified :\n");
    printf("\nNo: %ld  Name: %s\nScores:  ", t.sno, t.name);
    for (i = 0; i < 3; i++)
        printf("%6.2f ", t.score[i]);
    printf("\n");
    getchar();
}

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

3. 程序修改题

3.1 题目要求

3.2 提供的代码

#include <stdio.h>
#pragma warning(disable : 4996)
void fun(int* dt0, int* n0, int x) {
    int i, j;
    /**********************found***********************/
    i = 1;
    j = 1;
    do {
        /**********************found***********************/
        if (dt0[i] = x) {
            dt0[j] = dt0[i];
            j++;
        }
        i++;
    } while (i < *n0);
    /**********************found***********************/
    return j;
}
main() {
    int d[10] = {2, 5, 6, 7, 2, 4, 5, 2, 2, 6}, n = 10, i;
    fun(d, &n, 2);
    for (i = 0; i < n; i++)
        printf("%d ", d[i]);
    printf("\n");
}

3.3 解题思路

(1)处修改:此处原均赋值为 1,更改原因见注释。

i = 0;  // 改为 0,用于遍历数组 dt0
j = 0;  // 改为 0,用于记录不等于形参 x 的数据的个数

(2)处修改:这个也不难,题目要求不等于形参 x 的数据重新保留并返回个数。

原来是 dt0[i] = x ,改为 dt0[i] != x,即不等于时执行 if 内的程序。

if (dt0[i] != x) {

(3)处修改:题目要求通过形参 n0 返回数据的个数,其中变量 j 用于记录不等于形参 x 的数据的个数。

使用 *n0 = j;j的值赋给n0所指向的变量,即修改了n的值,完成了通过形参 n0 返回数据个数的要求。

*n0 = j;

3.4 代码实现

修改后的代码:

#include <stdio.h>
#pragma warning(disable : 4996)
void fun(int* dt0, int* n0, int x) {
    int i, j;
    /**********************found***********************/
    i = 0;  // 改为 0,用于遍历数组 dt0
    j = 0;  // 改为 0,用于记录不等于形参 x 的数据的个数
    do {
        /**********************found***********************/
        if (dt0[i] != x) {  // 改为 !=,题目要求不等于形参 x 的数据
            dt0[j] = dt0[i];
            j++;
        }
        i++;
    } while (i < *n0);
    /**********************found***********************/
    *n0 = j;  // 题目要求通过形参 n0 返回数据的个数
}
main() {
    int d[10] = {2, 5, 6, 7, 2, 4, 5, 2, 2, 6}, n = 10, i;
    fun(d, &n, 2);
    for (i = 0; i < n; i++)
        printf("%d ", d[i]);
    printf("\n");
}

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

4. 程序设计题

4.1 题目要求

4.2 提供的代码

#include <stdio.h>
#define N 80
void fun(int* w, int p, int n) {
}
main() {
    int  a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
    int  i, p, n = 15;
    void NONO();
    printf("The original data:\n");
    for (i = 0; i < n; i++)
        printf("%3d", a[i]);
    printf("\n\nEnter  p:  ");
    scanf("%d", &p);
    fun(a, p, n);
    printf("\nThe data after moving:\n");
    for (i = 0; i < n; i++)
        printf("%3d", a[i]);
    printf("\n\n");
    NONO();
    getchar();
}
void NONO() { /* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
    FILE *rf, *wf;
    int   a[N], i, j, p, n;
    rf = fopen("in.dat", "r");
    wf = fopen("out.dat", "w");
    for (i = 0; i < 5; i++) {
        fscanf(rf, "%d %d", &n, &p);
        for (j = 0; j < n; j++)
            fscanf(rf, "%d", &a[j]);
        fun(a, p, n);
        for (j = 0; j < n; j++)
            fprintf(wf, "%3d", a[j]);
        fprintf(wf, "\n");
    }
    fclose(rf);
    fclose(wf);
}

4.3 解题思路

操作数组的题,在这里只提供解题的思路,对于控制下标变量 i, j 的操作不做解释,不明白的朋友可以跟着程序走一遍,依旧不明白在文章底部留言,我看到会进行解答。

这个题我们可以创建一个临时数组来存储要移动的元素,首先将数组 w 中下标从 0 到 p 的元素复制到临时数组,然后将数组 w 剩余的元素前移,最后将临时数组中的元素追加到原数组 w 的末尾,即可实现题目要求的数组元素平移。

4.4 代码实现

填写完整的代码:

#include <stdio.h>
#define N 80
void fun(int* w, int p, int n) {
    int temp[N];
    int i = 0, j = 0;

    // 将数组 w 中下标从 0 到 p 的元素复制到临时数组
    for (i = 0; i <= p; i++)
        temp[i] = w[i];

    // 将数组 w 剩余的元素前移
    i = p + 1;
    while (i < n) {
        w[j] = w[i];
        i++;
        j++;
    }

    // 将临时数组中的元素追加到原数组 w 的末尾
    for (i = 0; i <= p; i++) {
        w[j] = temp[i];
        j++;
    }
}
main() {
    int  a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
    int  i, p, n = 15;
    void NONO();
    printf("The original data:\n");
    for (i = 0; i < n; i++)
        printf("%3d", a[i]);
    printf("\n\nEnter  p:  ");
    scanf("%d", &p);
    fun(a, p, n);
    printf("\nThe data after moving:\n");
    for (i = 0; i < n; i++)
        printf("%3d", a[i]);
    printf("\n\n");
    NONO();
    getchar();
}
void NONO() { /* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
    FILE *rf, *wf;
    int   a[N], i, j, p, n;
    rf = fopen("in.dat", "r");
    wf = fopen("out.dat", "w");
    for (i = 0; i < 5; i++) {
        fscanf(rf, "%d %d", &n, &p);
        for (j = 0; j < n; j++)
            fscanf(rf, "%d", &a[j]);
        fun(a, p, n);
        for (j = 0; j < n; j++)
            fprintf(wf, "%3d", a[j]);
        fprintf(wf, "\n");
    }
    fclose(rf);
    fclose(wf);
}

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

5. 后记

本篇博客到这就结束了,如果您有疑问或建议欢迎您在留言区留言。

标签:搞定,真题,int,C语言,++,printf,fun,found,dt0
From: https://www.cnblogs.com/main-studio/p/18323559

相关文章

  • C语言【面试】常用知识点总结之常用易错易混点解析
    第二部分:程序代码评价或者找错有符号整型和无符号整型混合运算时,有符号型自动转换成无符号型,运算的结果是无符号的。如果参与运算的数据类型不同,会自动转化为同一类再运算,这就是自动转换自动转换的规则如下:1.当参与运算的数据的类型不同时,编译系统会自动先将他们转换成......
  • 油管视频《编程思维》中的题目,使用C语言编写出来,第二集,反抗
    题目,假设要在人群中找一位领袖,领袖的相关信息有,他的眼睛是绿色的,如果他长着红头发,名字至少两个连续字母相同,如果戴眼镜的话,名字中有且仅有2个元音,否则名字中会有三个元音,只有一人附和以上条件,请下达指令涉及编程的基础原理1,结构体的使用,用于存储每个人的信息2,字符串的处理,......
  • C语言:指针1(详细讲解)
     目录指针变量和地址取地址操作符指针变量的大小指针变量类型意义指针解引⽤指针的+-整数const修饰指针const修饰变量const修饰指针变量指针的运算指针+-整数 指针的关系运算野指针指针未初始化 指针越界访问指针指向的空间被释放了避免野指针assert......
  • C语言---二维数组
    1.1概念        从逻辑上有行有列的数组,成为二维数组,相对来讲,只有行这种单一线性结构的数组称为一维数组。二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。定义由行和列组成的二维表格形式元素,二维数组其实也就是矩阵基本格式。访问二维数组需要两个值......
  • 油管视频《编程思维》中的题目,使用C语言编写出来,第三集,炉膛机器人
    题目:假设起初只有一个机器人,他的炉膛里有一个数字0,和另一个未知的任意生成的编码,随着推移,原始机器人自我复制,制造出更多一样的炉膛机器人,被原始机器人自我复制制造出的每一个子机器人的熔炉内,都继承了原始机器人未知的编码,并且有一个属于自己,独一无二的编码刻在外壳,第二代炉膛......
  • 队列及其C语言实现
    2.3队列2.3.1什么是队列队尾入队,队头出队,一个受限制性的线性表。队列(Queue):具有一定操作约束的线性表•插入和删除操作:只能在一端插入,而在另一端删除。•数据插入:入队列(AddQ)•数据删除:出队列(DeleteQ)•先来先服务•先进先出:FIFO 2.3.2队列的抽象数据类型描述 ......
  • C语言面向对象风格编程解惑-全局变量性能分析
    C语言面向对象风格编程解惑-全局变量性能分析如果你是CPP老手,但在软件开发过程中要求采用C语言作为主要语言,首先遇到的是各种设计模式不方便应用了,感到非常困扰,然后就是认命之后走向另外一个极端,常常会有过度使用全局变量和goto语句的问题。CPP既然是CWithClass,自然不会排斥面......
  • Tower Of Hanoi - 汉诺塔问题(C语言)
    ☆WelcometoHouse'sblog!☆本人主页:神王豪斯(重拾基础期)-CSDN博客所属专栏:重拾C语言——神王降世的第一步!_神王豪斯(重拾基础期)的博客-CSDN博客1.游戏规则-有三根柱子(通常分别命名为A、B、C)和若干大小不同的圆盘。-最初,所有圆盘按照从大到小的顺序堆叠在一根柱子(比如......
  • 【 C语言 】 C语言设计模式
    一、C语言和设计模式(继承、封装、多态)C++有三个最重要的特点,即继承、封装、多态。我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。(1)继承性[cpp]viewplaincopytypedefstruct_parent{intdata_parent;......
  • C语言程序设计练习(三)
    1.整型数据类型存储空间大小#include<stdio.h>intmain(){printf("Sizeofint:%zubytes\n",sizeof(int));printf("Sizeofshort:%zubytes\n",sizeof(short));printf("Sizeoflong:%zubytes\n",sizeof(l......