搜索字符串数组

时间:2011-12-06 00:57:11

标签: c++ arrays search binary-search

此程序的目的基本上是从文件中读取最多100个名称,使用bubblesort排序,然后通过二分查找搜索输入的名称。

所有似乎都在工作,除非我输入列表中的名称,没有任何反应,我只是提示再次输入名称。

在Elvis Presley的名单中说出一个名字。我被提示输入一个名字。我输入埃尔维斯普雷斯利。我应该接受埃尔维斯普雷斯利是你的朋友。没有发生。任何帮助表示赞赏。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void bubblesort(string[], const int);
void search(string[], const int);
int sub = 0;

int main()
{
 const int maxsize = 100;
 string friendArray[maxsize];

 ifstream friends;
 friends.open("myFriends.dat");

 while (sub < maxsize && getline(friends, friendArray[sub]))
   sub++;


 bubblesort(friendArray, sub);
 search(friendArray, maxsize);


 system("pause");
 return 0;
}



void bubblesort(string *array, const int size)
{
    bool swap;
    string temp;

    do
    {
        swap = false;
        for (int count = 1; count < (size - 1); count++)
        {
            if(array[count-1] >array[count])
            {
                temp = array[count-1];
                array[count-1] = array[count];
                array[count] = temp;
                swap = true;
            }
        }
    }
    while(swap);

}

void search(string *array, int size)
{
    int first = 0;
    int last = size - 1;
    int middle;
    string name;
    bool friends = false;

    do
    {
     cout<<"Please enter a name or END to terminate:";
     cin>>name;
    }
    while(!friends && first <= last && name != "END");
    {
        middle = (first + last) / 2;
        if (array[middle] == name)
            {
                friends = true;
                cout<<array[middle]<<" is my friend."<<endl;
            }
        else if (array[middle] > name)
            last = middle - 1;
        else
            last = middle + 1;
    }
}

9 个答案:

答案 0 :(得分:2)

我觉得有趣的是,在两个中找不到匹配项的情况下设置last

第一个你应该做的事情是考虑这意味着什么,轻推,轻推,眨眼,眨眼: - )

您还应该将使用的元素的数量传递给search,而不是数组的大小(因为您可能没有使用完整的数组)。

答案 1 :(得分:2)

search()函数中,do { } while; { }结构存在缺陷。它会编译,但它没有做你想要的。我做了一些更改并重新安排了代码,因此更有意义。

void search(string *array, int size)
{
    string name;

    for (;;)
    {
        cout<<"Please enter a name or END to terminate:";
        getline(cin, name);
        if (name == "END") break;

        int first = 0;
        int last = size - 1;
        bool friends = false;

        while (!friends && first <= last)
        {
            int middle = (first + last) / 2;
            if (array[middle] == name)
            {
                friends = true;
                cout<<array[middle]<<" is my friend."<<endl;
            }
            else if (array[middle] > name)
                last = middle - 1;
            else
                first = middle + 1;
        }
    }
}

int main () // test the search() function
{
    string array[] = { "bird", "cat", "dog", "horse", "loon", "zebra" };
    search(array, 6);
}
是的,这是太多的功课帮助吗?我应该删除吗?

答案 2 :(得分:1)

我想那个

search(friendArray, maxsize);

应该是

search(friendArray, sub);

二进制搜索的输入条件是搜索到的数组已排序。你的数组看起来像这样:

Aaron Burr
Bill Cosby
Celine Dion
...
Zachary Taylor
""
""
""
""

etc.

由于空字符串不小于非空字符串,friendArray[0..maxsize]未排序,而数组friendArray[0..sub]为。

<小时/> 编辑:我还注意到您的二进制搜索算法存在缺陷。再看一下你的源材料(教科书,维基百科,等等)。是否应该在循环中更新first

答案 3 :(得分:1)

如果friends数组的长度为3,请考虑会发生什么。如果我没弄错的话会有问题。

此外,建议使用更安全的数据类型,例如vector<string>,然后您不需要关心输入文件中的太多数据。在搜索功能中你的生活也会变得更容易,因为你可以使用迭代器而不需要传递数组的大小。

看看人们在cin的其他答案中所说的内容。

答案 4 :(得分:1)

运营商&gt;&gt;从流中读取格式化数据,即丢弃空格。当您说cin >> name;并输入“Elvis Presley”时,只有“猫王”会被存储在name中。

您需要的是getline(cin, name);

答案 5 :(得分:1)

这是一个循环:

do
{
 cout<<"Please enter a name or END to terminate:";
 cin>>name;
}
while(!friends && first <= last && name != "END");

代码将基本上永远循环(朋友永远不会是真的,第一个永远不会是&gt;最后),提示你输入一个名字,直到你要么杀了程序或输入&#34; END&#34;。

此:

{
    middle = (first + last) / 2;
    if (array[middle] == name)
        {
            friends = true;
            cout<<array[middle]<<" is my friend."<<endl;
        }
    else if (array[middle] > name)
        last = middle - 1;
    else
        last = middle + 1; 
}
在循环条件为假之前,

将无法执行(在这种情况下,直到您输入&#34; END&#34;)。

答案 6 :(得分:0)

除非您输入要搜索的名称,否则您说所有内容似乎都有效。实际上,你进入了一步。你的二进制搜索代码中有一个错误。本主题的第一个答案就是这样。

如果在二进制搜索中使用数组,则必须在搜索的每个阶段将其拆分为两部分。

例如,在一个阶段,如果当前部分标记如下:第一个 - 中间 - 在下一个阶段的最后一个部分将在第一个 - 中间1或中间+ 1 - 最后一个之间。

所以

    else if (array[middle] > name)
      last = middle - 1;
    else 
      last = middle + 1;

必须是

  else if (array[middle] > name)
      last = middle - 1;
  else 
      first = middle + 1;

答案 7 :(得分:0)

您的排序中存在一个错误。

答案 8 :(得分:-1)

问题在于功能搜索。将cin&gt;&gt;名称后的}移动到函数的末尾,如下所示:

void search(string *array, int size)
{
    int first = 0;
    int last = size - 1;
    int middle;
    string name;
    bool friends = false;

    do
    {
        cout<<"Please enter a name or END to terminate:";
        cin>>name;

        while(!friends && first <= last && name != "END");
        {
            middle = (first + last) / 2;
            if (array[middle] == name)
            {
                friends = true;
                cout<<array[middle]<<" is my friend."<<endl;
            }
            else if (array[middle] > name)
                last = middle - 1;
            else 
                last = middle + 1;
        }
    }
}