C++:检查数组的顺序

c++: check array's order

本文关键字:顺序 数组 检查 C++      更新时间:2023-10-16

我试着写了一个bool函数,接受了一个数组和一个bool-dec。如果dec为true,函数会检查它是递减的,如果是递减的则返回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");
}

您有一个off-by-one错误:当您到达最后一个元素,并且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;

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

如果访问超出数组边界,请将循环更改为

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

因此,当你进入size - 2时,你可以比较最后两个元素,就完成了。

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