程序还没输入数据就结束了

ccf2019年9月第二题小明种苹果,代码没有发现错误,但输入不了数据就闪退

img

M 和 N 都没有赋值, 下面就定义 数组了,这个有问题, 定义放到 输入 M 和 N之后去

img

【以下回答由 GPT 生成】

根据你提供的代码和问题描述,我发现了一些可能导致程序闪退的问题:

  1. 数组大小未定义: 在代码中,你使用了变量 N 和 M 来定义数组 a、b 和 c 的大小。然而,在这之前,你没有给这两个变量赋值,所以这些数组的大小是未定义的。这可能导致数组越界,从而导致程序崩溃。

  2. 变量未初始化: 在代码中,你使用了变量 t 和 p,但没有对它们进行初始化。这样会导致在计算 t = t + b[j] + a[j][M] 和寻找 c[i] 的最小值时出现未定义行为。

  3. 条件语句错误: 在循环中,你使用了一个变量 j,但是在循环结束后仍然使用了它。所以这个地方会导致语法错误,从而导致程序无法通过编译。

根据以上发现的问题,下面是我对代码的一些修改和解释:

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

#define MAX_N 1000 // 假设树的总数最大为1000
#define MAX_M 100 // 假设疏果轮数最大为100

int main() {
    int N, M;
    int a[MAX_N][MAX_M], b[MAX_N], c[MAX_M];
    int t = 0, p = 0, k = 0;

    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));

    scanf("%d%d", &N, &M); // 请输入树的总数和疏果轮数

    for (int j = 0; j < N; j++) {
        for (int i = 0; i < M; i++) {
            scanf("%d", &a[j][i]);
        }
    }

    // 计算 b 数组
    for (int j = 0; j < N; j++) {
        for (int i = 1; i < M; i++) {
            b[j] += a[j][i];
        }
    }

    // 计算最终结果 t、p 和 k
    for (int j = 0; j < N; j++) {
        t += b[j] + a[j][M];
    }

    for (int i = 0; i < N; i++) {
        if (b[i] < p || i == 0) { // 添加 i == 0 的条件
            k = i;
            p = b[i];
        }
    }

    printf("%d %d %d\n", t, p, k);

    return 0;
}

上述修改的代码解决了之前提到的问题,并进行了一些改进。下面是对修改的解释:

  1. 定义了 MAX_NMAX_M 宏来定义数组的最大大小,以避免未定义大小带来的问题。

  2. 将变量 t 和 p 初始化为 0,避免未定义行为。

  3. 修改循环中的条件 if (b[i] < p),并添加了一个条件 i == 0,以确保在循环的第一次迭代时更新 k 和 p 的值。

请尝试使用以上修改后的代码,如果你仍然遇到问题,请提供详细的错误信息和输入数据的示例,以便更好地帮助你解决问题。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^