祝余呀 2024-03-11 23:04 采纳率: 100%
浏览 2
已结题

能看一下代码哪里出错了吗

程序是删除数组中多余的元素,但是结果却没有输出,我想问一下是什么原因?

img

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-11 23:04
    关注

    引自免费微信小程序:皆我百晓生

    首先,我们来分析一下代码中的错误和需要修改的地方。在你提供的C语言程序中,有多处语法错误、逻辑错误以及数组下标越界问题。以下是逐行检查后的错误与修正建议:

    1. 第9行的输入循环条件应该是i < k而不是i <= k,防止数组越界。
    2. 同理,第15行、第21行的内层循环条件也应改为j < k
    3. 第17行的判断条件应该是arr[i] == arr[j],使用双等号进行相等判断而非赋值操作。
    4. 第19行,移除重复元素时,应该将arr[j]赋值给arr[n+1]而不是直接赋值给arr[i],同时更新数组元素的位置。
    5. 第20行的自增操作符应放在括号内,即n++

    基于以上修改,下面是修复后的代码:

    #include<stdio.h>
    #define A 999
    
    int main() {
        int arr[A];
        int i, j, n;
        int k; //数组元素的个数
    
        printf("请输入数组的大小:");
        scanf("%d", &k);
    
        printf("请在数组中输入元素:");
        for(i = 0; i < k; i++) { // 修改循环条件为 i < k
            scanf("%d", &arr[i]); // 输入时使用 arr[i] 而不是 arr[A]
        }
    
        for(i = 0; i < k - 1; i++) { // 外层循环到 k-1 即可
            for(j = i + 1; j < k; j++) { // 内层循环条件改为 j < k
                if(arr[i] == arr[j]) { // 使用双等号进行相等判断
                    for(n = j; n < k - 1; n++) { // 移除重复元素并移动数组元素
                        arr[n] = arr[n + 1];
                    }
                    k--; // 数组有效元素个数减一
                    j--; // 回溯一位以重新检查当前项(因为后面的元素已经向前移动)
                }
            }
        }
    
        for(i = 0; i < k; i++) { // 输出循环条件改为 i < k
            printf("%d ", arr[i]);
        }
        
        return 0;
    }
    

    现在这段代码应该能正确删除数组中多余的元素,并输出结果。但请注意,这种方法的时间复杂度较高,在处理大量数据时效率较低,可以考虑使用哈希表或排序后相邻比较的方法优化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月20日
  • 已采纳回答 3月12日
  • 创建了问题 3月11日