Loading

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

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. 后记

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

posted @ 2024-07-25 16:39  main工作室  阅读(7)  评论(0编辑  收藏  举报