【问题标题】:C Program isn't returning anythingC程序没有返回任何东西
【发布时间】:2019-03-03 17:42:36
【问题描述】:

我编写了一个 C 程序来对数组进行排序,但该程序没有返回任何内容——它只是运行并停留在那里,就好像它在等待输入一样。下面是代码:

#include<stdio.h>

bool unsorted(int ar[],int x){
    int c;
    for(int i=1;i<=x;i++){
        if(ar[0]>ar[i]){
            return true;
        } else {
            return false;
        }
    }
}   

void sort(int arr[],int s){
    int h,b;
    while(unsorted(arr,s)){
        h=arr[0];
        for(int i=0;i<=s;i++){
            if(arr[i]>h){
                b=arr[i];
                arr[i]=h;
                h=b;
            }
        }
     }
     for(int i=0;i<=s;i++){
       printf("%d",arr[i]);
    }
}
int main(){
    int arr[3]={ 2,1,3 };
    sort(arr,3);
    return 0;
}

【问题讨论】:

  • 旁注:thts c++ not c edit tag
  • 您使用 for(int i=0; i&lt;=s; i++) 之类的循环超出了数组的边界,该循环应为 for(int i=0; i&lt;s; i++)
  • if(ar[0]&gt;ar[i]) 是打算改成if(ar[i-1]&gt;ar[i]) 吗?
  • 您应该开始使用调试器。它可以向您显示程序中的执行流程,并且您可以将变量的实际值与预期值进行比较。您可能会发现您的函数 unsortedsort 中的 for 循环并没有真正对齐“排序”的含义。
  • 不,这个函数只是检查数组是否排序。

标签: c algorithm sorting


【解决方案1】:

如果第一个元素不是最小的,您的函数 unsorted 将返回 true。不检查是否有任何其他 2 个元素的顺序错误。这会导致错误的结果,但不是当前问题的原因。

在您的排序循环中,您检查是否有任何元素大于第一个元素,然后交换它们。 这意味着升序更改为降序。 这将导致 unsorted 函数一直返回 true 并且您的循环永远不会终止。

要修复它改变条件:

void sort(int arr[],int s) {
    int h,b;
    while (unsorted(arr,s)) {
        h=arr[0];
        for (int i = 1; i < s; i++) {
            if (h > arr[i]) {
                b = arr[i];
                arr[i] = h;
                h = b;
            }
        }
    }
    for (int i=0; i < s; i++) {
            printf("%d",arr[i]);
    }
}

索引范围也是固定的。

这至少应该让你的循环终止。 由于您过早终止,它不会生成排序列表。

首先你的unsorted 函数需要一些更新:

bool unsorted(int ar[], int x) {
    int c;
    for (int i = 1; i < x; i++) {
        if (ar[i-1] > ar[i]) {
            return true;
        }
    }
    return false;
}   

如果第一个元素最低但其他元素不适合 {1, 4, 3, 6},这也应该返回 true。还要注意固定的索引范围。

您需要对排序部分应用类似的修复,以处理第一个元素之后的元素中的乱序值。

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 2015-02-11
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2019-04-22
    • 1970-01-01
    相关资源
    最近更新 更多