计算数组元素大于后续元素的次数(差一错误)
Count how many times an array element is larger than the subsequent element (off-by-one error)
我正在用 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;
}
计数应 return 以下内容:
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
有人可以发现我的代码中的错误,或者帮助我解决这个问题吗?
当 j=i-1 超出数组 a
范围时,您正在读取 a[i]
。
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])
避免这种差一错误的方法是使用惯用的 "iterate over an array" for
循环和终止条件 j < i
但将初始循环索引从 0 更改为 1 .循环内的测试使用j
和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
更容易推理并且相信它是正确的。
我正在用 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;
}
计数应 return 以下内容:
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
有人可以发现我的代码中的错误,或者帮助我解决这个问题吗?
当 j=i-1 超出数组 a
范围时,您正在读取 a[i]
。
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])
避免这种差一错误的方法是使用惯用的 "iterate over an array" for
循环和终止条件 j < i
但将初始循环索引从 0 更改为 1 .循环内的测试使用j
和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
更容易推理并且相信它是正确的。