我写了一个基本的线性搜索C ++代码。每当我运行它时,我得到的结果总是与预期结果相反 例如,我想搜索4.在存在它的数组中,它会说没有找到数字,但是在搜索缺少的元素时,它会说该元素位于0位。
即使经过一个小时左右的不断查看代码,我也找不到任何解决方案。
#include <iostream>
using namespace std;
//scanning program
int linearsearch (int A[] , int z, int n, int srchElement) {
for (int z = 0; z < n; z++) {
if (A[z] == srchElement) {
return z;
}
}
return -1;
}
//main program
int main () {
int i, n, A[1000], z;
//asking for size of array
cout << "give size of the array needed to be scanned: ";
cin >> n;
cout << endl;
if (n > 999) {
cout << "invalid value";
return -1;
}
//making sure of the size of the array
cout << "enter " << n << " integers: ";
//asking for the array
for (i = 0; i < n; i++) {
cin >> A[i];
}
int srchElement, index;
do {
cout << endl << "enter element to search (-1 to exit ): ";
//srchElement is defined here
cin >> srchElement;
if (srchElement == -1) break;
index = linearsearch(A, n, srchElement, z);
//calling thscanning function
if (index == -1) {
cout << srchElement << " not present" << endl;
}
//outputting the results of the scan
else {
cout << srchElement << " present " << index << endl;
}
} while (true);
return 0;
}
答案 0 :(得分:1)
linearsearch
的参数输入顺序不正确 - 您将n
传递给未使用的z
参数。使用当前功能,您应该将其称为:
index=linearsearch(A, 8675309, n, srchElement);
我建议您删除z
作为参数,然后您不需要传递值。
另请注意:空格和缩进不会使您的程序运行速度变慢,但它们确实使它更容易阅读。
答案 1 :(得分:1)
函数定义中的参数顺序与函数调用中的不同。 它应该像(第4行):
int linearsearch (int A[] , int n, int srchElement, int z)
答案 2 :(得分:0)
这是您正确格式化的搜索功能:
int linearsearch (int A[] , int z, int n, int srchElement)
{
for (int z = 0; z < n; z++)
{
if(A[z] == srchElement)
{return z;}
}
return -1;
}
以下是您的称呼方式:
index=linearsearch(A, n, srchElement, z);
z
。它在main()
或函数中是单元化的,不执行任何操作。n
(从main()
)传递到未使用的z
值z
(来自main()
)n
(数组大小)。 (这很可能导致越界错误,例如,如果搜索-1
)试试这个:
int linearsearch (int A[], int n, int srchElement)
{
for (int z = 0; z < n; z++)
{
if(A[z] == srchElement)
{return z;}
}
return -1;
}
以下是您的称呼方式:
index=linearsearch(A, n, srchElement);
答案 3 :(得分:0)
你当前的问题:正如The Dark发现的那样,这个电话:
index=linearsearch(A, n, srchElement, z);
与声明
不符int linearsearch (int A[] , int z, int n, int srchElement)
C ++中的函数参数是位置的:只是因为最后一个调用参数和第二个声明参数都是被称为 z
并不意味着什么。
现在,有几个本地问题的风格:
这种功能首先是冒险的
int linearsearch (int[],int,int,int)
因为它依赖于你记住最后三个整数参数的正确顺序。如果你必须这样做,你应该格外小心地给他们所有与众不同的名字,非常明确哪个是哪个,并保持各个职能系列的顺序一致。
在可能的情况下,最好通过为参数提供不同类型(或枚举或其他)或将它们分组到结构中来帮助编译器帮助您。
例如,使用std::vector<int>
代替您的数组有效地将int A[]
和int n
组合在一个对象中,这样它们就不会失去同步而n
不能与漂浮在其周围的其他整数相混淆
您不应该首先传递z
。您立即在循环中使用本地int z
隐藏它,因此它无法执行任何操作。从声明和调用中删除它。这种简化足以修复您的错误。
您的第二个问题是代码丑陋。它的格式很差,难以阅读,这使得发现错误变得更加困难。尝试使您的代码简单易读:事情出错的机会较少,并且在问题发生时更容易看到问题。
您的第三个问题是代码错误。其中大部分可以使用标准库工具(使您的代码更简单)来完成,这些工具本身经过了充分测试,并且通常具有精心设计的接口。首先使用它们,必要时更换。