我的数组收到错误,因为它被定义为单数整数



该程序的重点是输出一系列数字(未定义的位数)是否排序(从大到小或从小到大)。
我已经在我的函数参数中定义了我的数组,并且我正在尝试使用 for 循环将用户的输入存储在所述数组中,只要它高于 0。
但是,我收到错误argument of type int is incompatible with parameter of type int*.
确切的错误是the argument of type int is incompatible with parameter of type int*.
它指的是第 22 行和第 23 行,这两个;
isSorted(list[2000]);
bool is = isSorted(list[2000]);.
我知道这意味着我的 for 循环通过阅读类似问题反复为我的变量分配单个值,但我无法弄清楚如何解决这个问题。

#include <iostream>
using namespace std;
bool isSorted(int list[]);
int main()
{    
int i;
int list[2000];
int k = 0;
for (i = 0; i < 2000; i++)
{
int j;
while (j > 0)
{
cin >> j;
list[i] = j;
}
}
isSorted(list[2000]);
bool is = isSorted(list[2000]);
if (is == true)
cout << "sorted";
else
cout << "unsorted";
return 0;
}
bool isSorted(int list[])
{
int i = 0;
for (i = 0; i < 2000; i++)
{
if (list[i] > list[i + 1] || list[i] < list[i - 1])
{
return false;
}
else
return true;
}
}
  • 我删除了未使用的变量k
  • 使 2000 参数化(并设置为 5 进行测试)。
  • isSorted不允许返回trueelse,就好像你的第一个元素测试会以否则你会返回true立即不测试其他元素一样。但是那些后面的元素也可以不排序。
  • isSorted中,你不允许以for(i = 0; i < 2000; i++)的方式运行循环,因为你在 for 循环 1 中添加i并最终查询i == 1999list[2000],这是元素编号 2001 而不是在你的数组中。这是正确的:for (i = 0; i < 1999; i++).您也不需要检查两个方向。

  • 您不能调用isSorted(list[2000])因为这将调用使用 int 而不是 int 数组作为参数进行排序。

  • 你写int j而不初始化它,然后在cin << j之前查询while j > 0。这是未定义的行为,虽然 j 很可能为零,但无法保证。但很可能你永远不会进入 while 循环,也永远不会做cin

  • 我重命名了isSorted,因为您只是检查示例中的升序。如果您想检查降序,欢迎您训练您的编程技能并自行实现。

以下是带有修复程序的代码:

#include <iostream>
using namespace std;
bool isSortedInAscendingOrder(int list[]);
const int size = 5; // Set this to 2000 again if you want
int main()
{
int i;
int list[size];
for (i = 0; i < size; i++)
{
int j = 0;
while(j <= 0)
{
cin >> j;
if(j <= 0)
cout << "rejected as equal or smaller zero" << endl;
}
list[i] = j;
}
if (isSortedInAscendingOrder(list))
cout << "sorted" << endl;
else
cout << "unsorted" << endl;
return 0;
}
bool isSortedInAscendingOrder(int list[])
{
for (int i = 0; i < size -1; i++)
{
if (list[i] > list[i + 1])
{
return false;
}
}
return true;
}

这是 2000 个整数数组的定义。

int list[2000];

这是读取该数组中的第 2000 个条目且未定义,因为要访问的最高合法索引是 1999。请记住,第一个法定索引为 0。

list[2000]

所以是的,从编译器的角度来看,以下内容只给出了一个整数,而不是未定义的行为(即"邪恶")。

isSorted(list[2000]);

您可能应该更改为此,以解决眼前的问题 - 并非常接近您可能想要的。它将整个数组命名为参数。它将衰减到指向 int 的指针(除其他外,丢失大小信息,但您在函数中对其进行硬编码;顺便说一下,最好更改它)。

isSorted(list);

删除被忽略的第一个匹配项(单独在一行上),保留第二个匹配项(分配给布尔变量的那个)。

另一方面,排序检查的逻辑是有缺陷的,它通常会在数组外部访问索引 0 和 1999。 即在循环的开始和结束时。您需要遍历略少于整个数组的遍历,并且仅使用两个条件之一。

即做

for (i = 1; i < 2000; i++)
{
if (list[i] < list[i - 1])
/* ... */

检查升序或降序排序的逻辑必须更加复杂。问题不是要求修复该逻辑,因此我坚持根据原始版本(未提及双向排序)修复问题。
您实际上并没有询问如何修复逻辑。但这里有一个提示:
要么使用两个循环,一旦发现冲突,就可以中断,但不要立即从功能中返回。
或者使用一个循环并保留一个标志,表明升序或降序是否已被打破。如果其中一个标志仍然清晰,则返回 true(或者,在所有值相同的情况下,则返回两者),如果两者都设置,则返回 false。

最新更新