此程序的目的基本上是从文件中读取最多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;
}
}
答案 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;
}
}
}