【问题标题】:c++: check array's orderc++:检查数组的顺序
【发布时间】:2015-04-07 13:26:13
【问题描述】:

我尝试编写一个 bool 函数,接受一个数组和一个 bool dec。如果 dec 为真,则该函数将检查它是否下降,如果下降则返回 true。如果 dec 为 false,则函数将在升序时返回 true。

如果我用这个函数测试数组,它应该返回 false,但它返回 true,我不知道为什么。 任何人都可以帮忙吗?谢谢。

#include <iostream>
#include <cstring>
#include <cmath>

#include <iomanip>

using namespace std;

bool isSorted(int array[], int size, bool dec) //false decending
{
    bool check = true;

    if (dec == false)
        for (int i = 0; i<size; i++)
            if (array[i]>array[i + 1])
            {
                check = false;
                cout << "false";
            }

    else
        for (int i = 0; i<size; i++)
            if (array[i]<array[i + 1])
                check = false;

    return check;
}


int main() {
    int n;
    bool asc=true;
    bool result;
    int arr[] = { 1, 2, 4, 3, 0 };
    n = 5;

    result = isSorted(arr, n, asc);
    cout << result;
    system("pause");
}

【问题讨论】:

  • 对于真正的代码,这将是对std::is_sorted的调用。
  • 请注意使用此索引保持在界限内:array[i + 1]

标签: c++ arrays sorting


【解决方案1】:

您遇到了一个非一的错误:当您到达最后一个元素并且isize 小一时,arrat[i+1] 正在引用一个超出数组末尾的元素。

由于将check 更改为false 是“单行道”,因此您可以通过在检测到错误订单时立即返回false 来简化您的功能;到达函数末尾时返回true

您还可以在循环内移动升序/降序检查,以使代码更加统一:

for (int i = 0; i < size-1 ; i++) {
    if (des && (array[i]<array[i + 1])
    || !des && (array[i]>array[i + 1])) {
        return false;
    }
}
return true;

【讨论】:

    【解决方案2】:

    你传递给函数的值被命名为asc,而它的参数是dec。再次检查你是否真的做了你想做的事。

    【讨论】:

      【解决方案3】:

      您正在访问超出数组的边界,将循环更改为

        for (int i = 0; i < size-1; i++)
      

      所以当你到达size - 2 时,你比较最后两个元素就完成了。

      您也可以在发现异常后立即返回,而不是完成迭代。

      【讨论】:

        猜你喜欢
        • 2022-01-02
        • 2013-04-27
        • 2014-04-12
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        相关资源
        最近更新 更多