0

我正在用 C 编程。我必须创建一个名为 的函数count,它计算比同一数组中的后续元素大多少倍。例如,如果我们有一个如下所示的主代码:

int main() {
    int a1[] = { 5 };
    int a2[] = { 1, 2, 3, 4, 5 };
    int a3[] = { 5, 4, 3, 2, 1 };
    int a4[] = { 1, 9, 3, 7, 5 };
    int a5[] = { 7, 5, 6 };
    printf("%d\n", count(a1, sizeof a1 / sizeof a1[0]));
    printf("%d\n", count(a2, sizeof a2 / sizeof a2[0]));
    printf("%d\n", count(a3, sizeof a3 / sizeof a3[0]));
    printf("%d\n", count(a4, sizeof a4 / sizeof a4[0]));
    printf("%d\n", count(a5, sizeof a5 / sizeof a5[0]));
    return 0;
}

计数应返回以下内容:

0
0
4
2
1

我已经尝试过自己,但似乎我遇到了一个我不知道如何解决的错误。

int count(int a[], int i){
    int k=0;
    int j;
    for (j=0; j<=i-1; j++){
        if(a[j] > a[j+1])
            k++;
    }
    return k;
}

但这给出了错误的输出:

0
1
5
3
2

有人可以在我的代码中发现错误,或者帮助我解决这个问题吗?

4

2 回答 2

2

a[i]当 j=i-1 时,您正在阅读,这超出了数组范围a

for (j=0; j<=i-1; j++){
  if(a[j] > a[j+1])

它应该是

for (j=0; j<i-1; j++){
  if(a[j] > a[j+1])
于 2020-05-12T10:35:42.133 回答
0

避免这种错误的一种方法是使用惯用的“迭代数组”for循环和终止条件j < i,但将初始循环索引从 0 更改为 1。循环内的测试使用jand j - 1

int count(const int *a, int i)
{
    int k = 0;
    for (int j = 1; j < i; j++) {
        if (a[j - 1] > a[j])
            k++;
    }
    return k;
}

我认为j < i推理比j <= i - 1相信它是正确的更容易。

于 2020-05-12T16:55:41.923 回答