搜索字符串数组
Searching a array of strings
基本上这个程序的目的是从文件中读取多达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;
}
}
}
- 使用 jsoncpp 解析 json 数组字符串
- C++ 对象数组字符串输入在控制台上不起作用
- 插入了 C++ 数组字符串数据,但在显示输出时不显示
- 无法区分 JSON 对象/数组/字符串
- 为什么数组(字符串类型)的大小是 24 字节,带有单个空格元素
- 如何使用数组字符串进行输入验证
- (C++) 打印字符数组字符串的单词时出现问题
- 使用Back_inserter从任何位置的输入字符中使用Back_inserter进行过滤数组字符串
- C 函数反转字符数组字符串
- 如何在 c++ 中创建数组(字符串 [] )的向量
- 如何返回数组字符串的指针
- char数组字符串混淆
- 如何从字符数组字符串中提取空格
- 是否可以将 Bitset<8> 的值复制到数组字符串而不转换它们?
- C++数组字符串函数
- 如何在函数中操作字符数组(字符串)的指针,该指针在C / C ++中作为参数传递
- visual将音频文件存储到数组/字符串流C++中
- c++在char数组(字符串)上将what替换为
- 将数组字符串转换为intger c++(初学者)
- 需要设置数组字符串长度,使其恰好为13