C ++代码出现故障

时间:2014-10-27 10:30:05

标签: c++

我写了一个基本的线性搜索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;
}

4 个答案:

答案 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并不意味着什么。

现在,有几个本地问题的风格:

  1. 这种功能首先是冒险的

    int linearsearch (int[],int,int,int)
    

    因为它依赖于你记住最后三个整数参数的正确顺序。如果你必须这样做,你应该格外小心地给他们所有与众不同的名字,非常明确哪个是哪个,并保持各个职能系列的顺序一致。

    在可能的情况下,最好通过为参数提供不同类型(或枚举或其他)或将它们分组到结构中来帮助编译器帮助您。

    例如,使用std::vector<int>代替您的数组有效地将int A[]int n组合在一个对象中,这样它们就不会失去同步而n不能与漂浮在其周围的其他整数相混淆

  2. 您不应该首先传递z。您立即在循环中使用本地int z隐藏它,因此它无法执行任何操作。从声明和调用中删除它。这种简化足以修复您的错误。


  3. 您的第二个问题是代码丑陋。它的格式很差,难以阅读,这使得发现错误变得更加困难。尝试使您的代码简单易读:事情出错的机会较少,并且在问题发生时更容易看到问题。

    您的第三个问题是代码错误。其中大部分可以使用标准库工具(使您的代码更简单)来完成,这些工具本身经过了充分测试,并且通常具有精心设计的接口。首先使用它们,必要时更换。