我正在编写一个程序,该程序读取一个值列表以及3个值a,b,elem。我写了一个函数来查找元素是否是位置a和b之间的数组的一部分。当我运行程序时,有时我得到正确的结果,有时我得到错误的结果。我找不到错误。任何帮助都将受到欢迎。
int binary_search(int *v, int elem, int a, int b);
int main()
{
printf("Inserire la lunghexza di N:\n");
int N;
scanf("%d", &N);
printf("Inserire i valori dell'array:\n");
int arr[N];
for (int i = 0; i < N; i++) {
scanf("%d", &arr[i]);
}
int a,b,elem;
printf("Inserire i valori di a, b, elem:\n");
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &elem);
printf("%d", binary_search(arr,elem,a,b));
return 0;
}
int binary_search(int *v, int elem, int a, int b)
{
for (int i = 0; i < i < b - a; i++) {
if (*(v + a - 1 + i) == elem) {
return a + i;
}
}
return -1;
}
答案 0 :(得分:2)
就像阿德里安已经指出的那样,这行看起来很奇怪:
for (int i = 0; i < i < b - a; i++)
您的意思是:
for (int i = 0; i < b - a; i++)
答案 1 :(得分:1)
正如另一个答案已经指出的那样,i < i < b - a
循环条件下的表达式for
很奇怪,但是不能解释为什么?
for (int i = 0; i < i < b - a; i++)
^^^^^^^^^^^^^
您是否在此表达式上收到任何编译器警告?如果是,则有一个建议-警告由于某种原因存在,请不要忽略它们。
在表达式i < i < b - a
中,假设b - a
的结果为x
。因此,表达式i < i < x
将被评估为(i < i) < x
(因为运算符<
的关联性从左到右),其中(i < i)
将始终结果为false
,对于true
和a
的所有有效 ** 值,满足条件{{ 1}},并且如果b
值在数组中不存在,则由于这种情况
b > a
您的程序最终无法访问数组,这是未定义的行为。
因此,首先通过删除多余的elem
来纠正if (*(v + a - 1 + i) == elem) {
^^^^^^^^^^^^^^^^
循环条件:
for
现在,使用此方法,循环将检查从数组中的第i <
个元素到第for (int i = 0; i < b - a; i++)
th 个元素的值。< / p>
此外,与您当前的a
版本相比,以下内容更具可读性:
b - 1
您的程序中还有另一个问题- ** 您的程序未检查用户输入binary_search()
和int binary_search(int *v, int elem, int a, int b)
{
for (int i = a - 1; i < b; i++) {
if (v[i] == elem) {
return i;
}
}
return -1;
}
的有效性。用户可能不小心输入了a
和/或b
的值,该值不在数组范围内,也不是负值,或者a
的值大于b
等等。您还应该检查用户输入的有效性。
PS:我假设您非常了解以下事实:在您的程序中,a
函数正在执行线性搜索,而二进制搜索需要按排序顺序输入数组。