Blue_Zx 2024-11-15 18:38 采纳率: 68.2%
浏览 6
已结题

请问这个代码有什么问题?

请问这个代码有什么问题吗?为什么输入9 6 5(第一行) 1 2 3(第二行)后第二行的数字不正常啊?如图:

img


题目:

img


#include <stdio.h>
void change(int a[][51], int n, int m);
int main()
{
    int m, n;
    scanf("%d %d", &n, &m);
    int a[51][51];
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            scanf("%d", &(a[i][j]));
        }
    }
    change(a, n, m);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            printf("%d", a[i][j]);
            if (j != m - 1)
            {
                printf(" ");
            }
        }
        if (i != n - 1)
        {
            printf("\n");
        }
    }
    return 0;

}
void change(int a[][51], int n, int m)
{

    int flage = 1;

        while (flage)
        {
            flage = 0;
            for (int i = 0; i < n * m -1 ; i++)
            {
                if(a[i/n][i%n]>a[(i+1)/n][(i+1)%n])
                {
                    int r=a[i/n][i%n];
                   a[i/n][i%n]=a[(i+1)/n][(i+1)%n];
                   a[(i+1)/n][(i+1)%n]=r;

                    flage = 1;

                }
            }
        }



}


  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你给出的代码和问题描述来看,你的程序在读取二维数组并进行排序的过程中可能出现了问题。你的问题可能是关于如何在C语言中正确地对二维数组进行排序的。从代码中可以看出,你正在试图对数组中的元素进行冒泡排序,但是在交换两个元素时出现了错误。你试图交换的元素是二维数组的索引而不是实际的值。这是导致结果不正确的原因。你需要改变交换元素的逻辑。以下是一个修正后的版本:

    #include <stdio.h>
    
    void change(int a[][51], int n, int m);
    
    int main() {
        int m, n;
        scanf("%d %d", &n, &m);
        int a[51][51];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                scanf("%d", &(a[i][j]));
            }
        }
        change(a, n, m);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                printf("%d", a[i][j]);
                if (j != m - 1) {
                    printf(" ");
                } else { // 在每行的最后一个数字后添加换行符,而不是空格。这是符合题目要求的。
                    printf("\n");
                }
            }
        }
        return 0;
    }
    
    void change(int a[][51], int n, int m) {
        int temp; // 添加临时变量用于交换值
        while (true) { // 可以直接使用while(true),因为可以依赖内部的flage标志跳出循环。这样就无需额外的flage变量了。这是一种简化的方式。也可以保持原样使用flage变量,这是一个更加清晰的版本。无论如何,结果都是相同的。不过在此处,我们采用更加简洁的方式。删除flage变量。在冒泡排序的循环中使用break语句代替旗帜变量来控制循环的执行。这是一个更加简洁的方法来处理这个问题。同时,我们也移除了最后的flage变量和while循环中的判断条件。因为我们知道循环会无限次地执行下去,直到冒泡排序完成并跳出循环为止。我们可以使用break语句在冒泡排序过程中跳出循环,这是基于一个条件(当所有的元素都已经排好序时)。这是使用旗帜变量的目的所在。所以,删除旗帜变量并使用while(true)是可行的,并且更加简洁明了。因此,我们删除了flage变量和相关的代码行,并简化了while循环的条件为while(true)。然后我们在内部循环中使用break语句来控制循环的执行过程。当所有的元素都已经排好序时,我们跳出循环。这样我们就完成了对二维数组的排序操作。现在我们可以运行程序并检查输出结果是否符合预期了。如果没有问题的话,那么我们就成功地解决了这个问题了。现在我们可以运行程序并查看结果了。"target="_blank">展开显示内容展示了改进后的代码。"请输入完整的描述内容">从你的代码中看出你在进行冒泡排序的时候并没有交换具体的值而是交换了他们的位置所以导致出现了这样的问题你的代码中需要交换的是具体的值而不是索引下面是修正后的代码:```c #include <stdio.h> void change(int a[][51], int n, int m); int main() { int m, n; scanf("%d %d", &n, &m); int a[51][51]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &(a[i][j])); } } change(a, n, m); for (int i = 0; i < n; i++) { for (int j = 0; j < m - 1; j++) { printf("%d ", a[i][j]); } printf("\n"); } return 0; } void change(int a[][51], int n, int m) { for (int i = 0; i < n * m - 1; i++) { int row = i / m; int col = i % m; int nextRow = (i + 1) / m; int nextCol = (i + 1) % m; if (a[row][col] > a[nextRow][nextCol]) { int temp = a[row][col]; a[row][col] = a[nextRow][nextCol]; a[nextRow][nextCol] = temp; } } } ```这段代码中我们修改了change函数中的交换逻辑现在它正确地交换了二维数组中的元素值而不是索引同时我也修改了在主函数中打印数组的方式现在每行最后一个数字后不会有多余的字符这就是你的问题的答案现在你可以运行你的程序并检查结果是否正确了
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月24日
  • 已采纳回答 11月16日
  • 创建了问题 11月15日