Loading

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

1. 前言

本篇我们讲解2个月搞定计算机二级C语言——真题8

真题8-程序评分

2. 程序填空题

2.1 题目要求

真题8-程序填空

2.2 提供的代码

#include <stdio.h>
#define N 3
#define M 4
/**********found**********/
void fun(int (*a)[N], int __1__) {
    int i, temp;
/**********found**********/
    for (i = 0; i < __2__; i++) {
        temp = a[0][i];
/**********found**********/
        a[0][i] = __3__;
        a[k][i] = temp;
    }
}
main() {
    int x[M][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}, i, j;
    printf("The array before moving:\n\n");
    for (i = 0; i < M; i++) {
        for (j = 0; j < N; j++)
            printf("%3d", x[i][j]);
        printf("\n\n");
    }
    fun(x, 2);
    printf("The array after moving:\n\n");
    for (i = 0; i < M; i++) {
        for (j = 0; j < N; j++)
            printf("%3d", x[i][j]);
        printf("\n\n");
    }
    getchar();
}

2.3 解题思路

第(1)处填空:

该函数的形参中留了一个空,根据题目描述我们可以得到一共有两个形参:一个是指针a,另一个是行k,所以这里直接填入k即可。

void fun(int (*a)[N], int k) {

第(2)处填空:

题目所给定得代码是想要通过循环到达第k行,然后通过temp作为临时存储变量,从而转换了第k行与第 0 行的元素,这里需要填入=k,即i<=k

for (i = 0; i <= k; i++) {

第(3)处填空:

这个空的上一条语句temp = a[0][i];已经把第 0 行的元素a[0][i]赋值给了temp,这里要做的是把a[k][i]赋值给a[0][i],再加上下一句a[k][i] = temp;从而达到交换元素的效果。

原理和交换两个变量中存储的值差不多,这里也借用了一个中间的临时存储变量来暂存某一变量的值。

a[0][i] = a[k][i];

2.4 代码实现

填写完整的代码:

#include <stdio.h>
#define N 3
#define M 4
/**********found**********/
void fun(int (*a)[N], int k) {
    int i, temp;
/**********found**********/
    for (i = 0; i <= k; i++) {
        temp = a[0][i];
/**********found**********/
        a[0][i] = a[k][i];
        a[k][i] = temp;
    }
}
main() {
    int x[M][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}, i, j;
    printf("The array before moving:\n\n");
    for (i = 0; i < M; i++) {
        for (j = 0; j < N; j++)
            printf("%3d", x[i][j]);
        printf("\n\n");
    }
    fun(x, 2);
    printf("The array after moving:\n\n");
    for (i = 0; i < M; i++) {
        for (j = 0; j < N; j++)
            printf("%3d", x[i][j]);
        printf("\n\n");
    }
    getchar();
}

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

3. 程序修改题

3.1 题目要求

真题8-程序修改

3.2 提供的代码

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

void fun(char* a, char* b, char* c) {
    int  i, j;
    char ch;
    i = 0;
    j = strlen(b) - 1;
    /************found************/
    while (i > j) {
        ch   = b[i];
        b[i] = b[j];
        b[j] = ch;
        i++;
        j--;
    }
    while (*a || *b) {
    /************found************/
        If(*a) {
            *c = *a;
            c++;
            a++;
        }
        if (*b) {
            *c = *b;
            c++;
            b++;
        }
    }
    *c = 0;
}

main() {
    char s1[100], s2[100], t[200];
    printf("\nEnter s1 string : ");
    scanf("%s", s1);
    printf("\nEnter s2 string : ");
    scanf("%s", s2);
    fun(s1, s2, t);
    printf("\nThe result is : %s\n", t);
    getchar();
}

3.3 解题思路

原题写的是i > j,我们可以看到i是 0,jb所指字符串的长度减 1,只要b所指字符串中有字符就永远不会满足这个条件,所以程序不会执行此while循环。

这里要实现的是b所指字符串中的字符逆序存放,其中ij分别代表下标的头和尾,它俩在while中会逐渐向数组中间下标移动,并且每次移动会将下标中的元素互换,从而达到字符串逆序的效果。

所以这里需要填写i < ji在小于j的时候说明还未走到数组中间,即未完成逆序,则循环。

第(1)处修改:

while (i < j) {

第(2)处修改:

这里没什么好说的,原本为小写的if写成了If,改过来即可。

if(*a) {

3.4 代码实现

修改后的代码:

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

void fun(char* a, char* b, char* c) {
    int  i, j;
    char ch;
    i = 0;
    j = strlen(b) - 1;
    /************found************/
    while (i < j) {
        ch   = b[i];
        b[i] = b[j];
        b[j] = ch;
        i++;
        j--;
    }
    while (*a || *b) {
    /************found************/
        if(*a) {
            *c = *a;
            c++;
            a++;
        }
        if (*b) {
            *c = *b;
            c++;
            b++;
        }
    }
    *c = 0;
}

main() {
    char s1[100], s2[100], t[200];
    printf("\nEnter s1 string : ");
    scanf("%s", s1);
    printf("\nEnter s2 string : ");
    scanf("%s", s2);
    fun(s1, s2, t);
    printf("\nThe result is : %s\n", t);
    getchar();
}

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

4. 程序设计题

4.1 题目要求

真题8-程序设计

4.2 提供的代码

#include <stdio.h>
#define N 50
#define M 11
void fun(int* a, int* b) {
}
double rnd() {
    static t = 29, c = 217, m = 1024, r = 0;
    r = (r * t + c) % m;
    return ((double) r / m);
}
main() {
    int  age[N], i, d[M];
    void NONO(int d[M]);
    for (i = 0; i < N; i++)
        age[i] = (int) (115 * rnd());
    printf("The original data :\n");
    for (i = 0; i < N; i++)
        printf((i + 1) % 10 == 0 ? "%4d\n" : "%4d", age[i]);
    printf("\n\n");
    fun(age, d);
    for (i = 0; i < 10; i++)
        printf("%4d---%4d  :  %4d\n", i * 10, i * 10 + 9, d[i]);
    printf("  Over  100  :  %4d\n", d[10]);
    NONO(d);
    getchar();
}
void NONO(int d[M]) { /* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
    FILE* wf;
    int   i;
    wf = fopen("out.dat", "w");
    for (i = 0; i < 10; i++)
        fprintf(wf, "%4d---%4d  :  %4d\n", i * 10, i * 10 + 9, d[i]);
    fprintf(wf, "  Over  100  :  %4d\n", d[10]);
    fclose(wf);
}

4.3 解题思路

针对这个题的解法是遍历age数组,将其中存储的年龄分别判断后,把结果传给*d

判断的方式有很多,你可以通过判断范围、或判断十位上的数字等等。

我这里采用的是先判断年龄是否>=100,是则让b[10]++;,否则说明年龄是在 0~99之间的,之间将年龄除 10 得到的经过即可作为b的下标。

例如年龄为 18,计算18 / 10 = 1,因为是整形相除所以会自动取整,而结果1正好对应题目要求的“把10至19岁年龄段的人数放在d[1]中”的下标,可以简化程序。

4.4 代码实现

填写完整的代码:

#include <stdio.h>
#define N 50
#define M 11
void fun(int* a, int* b) {
    int i = 0;
    // 初始化 *b,防止出现垃圾值
    for (i = 0; i < M; i++) {
        b[i] = 0;
    }

    // 遍历指针 *a 所指向的数组 age 的每个年龄
    for (i = 0; i < N; i++) {
        if (a[i] >= 100) {  // 年龄 >= 100
            b[10]++;
        } else {
            b[a[i] / 10]++;
        }
    }
}
double rnd() {
    static t = 29, c = 217, m = 1024, r = 0;
    r = (r * t + c) % m;
    return ((double) r / m);
}
main() {
    int  age[N], i, d[M];
    void NONO(int d[M]);
    for (i = 0; i < N; i++)
        age[i] = (int) (115 * rnd());
    printf("The original data :\n");
    for (i = 0; i < N; i++)
        printf((i + 1) % 10 == 0 ? "%4d\n" : "%4d", age[i]);
    printf("\n\n");
    fun(age, d);
    for (i = 0; i < 10; i++)
        printf("%4d---%4d  :  %4d\n", i * 10, i * 10 + 9, d[i]);
    printf("  Over  100  :  %4d\n", d[10]);
    NONO(d);
    getchar();
}
void NONO(int d[M]) { /* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
    FILE* wf;
    int   i;
    wf = fopen("out.dat", "w");
    for (i = 0; i < 10; i++)
        fprintf(wf, "%4d---%4d  :  %4d\n", i * 10, i * 10 + 9, d[i]);
    fprintf(wf, "  Over  100  :  %4d\n", d[10]);
    fclose(wf);
}

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

5. 后记

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

posted @ 2024-11-03 11:51  main工作室  阅读(23)  评论(0编辑  收藏  举报