搜索字符串数组

Searching a array of strings

本文关键字:数组 字符串 搜索      更新时间:2023-10-16

基本上这个程序的目的是从文件中读取多达100个名字,用冒泡排序排序,然后用二进制搜索搜索输入的名字。

所有似乎都在工作,除了当我在列表中输入一个名字时,什么都没有发生,我只是提示再次输入一个名字。

说出猫王的名字。系统提示我输入一个名字。我输入猫王。猫王是你的朋友。不会发生。谢谢你的帮助。

#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;
    }
}

在您的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);
}

那么,这是不是太多作业帮助了?我应该删掉这个吗?

我发现有趣的是,你设置last的情况下,你没有找到一个匹配。

你应该做的第一件事是想想这是什么意思,轻推,轻推,眨眼,眨眼:-)

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

我想

search(friendArray, maxsize);
应该

search(friendArray, sub);

二分查找的输入条件是所搜索的数组已排序。你的数组看起来像这样:

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

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


编辑:我也刚刚注意到,你的二进制搜索算法是有缺陷的。再看一遍你的原始资料(课本、维基百科等等)。难道first不应该在你的循环中更新吗?

Operator>>从流中读取格式化的数据,即丢弃空白。当你输入cin >> name;并输入"Elvis Presley"时,只有"Elvis"被存储在name中。

需要的是getline(cin, name);

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

还建议使用更安全的数据类型,例如vector<string>,这样您就不需要关心输入文件中的太多数据。在搜索函数中,你的工作也会变得更容易,因为你可以使用迭代器,而不需要传递数组的大小。

看看人们在其他回答中是怎么说cin

这是一个do- white循环:

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

代码基本上将永远循环(friends永远不会为真,first永远不会>最后),提示您输入名称,直到您终止程序或键入"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; 
}
在循环条件为false之前(在本例中,直到您输入"END"之前),

将没有机会执行。

您说除了输入要搜索的名称外,一切似乎都在工作。事实上,是你站在了前面。二进制搜索代码中有一个错误。这个话题的第一个答案是朝这个方向。

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

例如,在一个阶段中,如果当前部分标记如下:第一-中间-最后,下一个阶段的部分将在第一-中间-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;

排序有误

问题是在函数搜索。将cin>>之后的}移动到函数的末尾,看起来像:

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;
        }
    }
}