我一直在研究我在第一学期编程中遇到的所有事情。我有一个最后的决定,所以我一直在努力编写示例程序,结合我所学到的一切准备。下面的程序应该从文件中读取名称,通过气泡搜索对它们进行排序,然后提示用户输入二进制搜索将查找的名称,并告诉您该人是否是朋友。
我的问题是,当我输入名称时,系统只会提示我再次输入名称。没有输出。
请记住,这里的所有内容大部分都是我到目前为止所学到的(所以我不知道如何使用向量,指针等)。
#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 :(得分:1)
你的do while语句错误,它按此顺序运行:
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;
}
修改:
do
{
cout<<"Please enter a name or END to terminate:";
cin>>name;
first = 0;
last = size - 1;
middle=0;
friends = false;
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;
}
}
while(name != "END");
答案 1 :(得分:1)
我不想放弃太多,因为它的作业,所以我会移动你的一些代码,保持尽可能接近,并告诉你为什么它当前不会工作。
目前你认为do...while
循环是某种双重阻碍,但事实并非如此。代码中while(...);
之后的代码只会执行一次,在您突破do...while
循环之后,它无法连接。您需要两个循环,一个提示输入名称的外部循环,以及一个在列表中查找该名称的内部循环。
在要求用户输入其他名称后,您还没有重置friends
和last
。一个简单的解决方法是在第一个循环中移动声明(包含初始化)。
这是您的代码在重新排列并应用上述更改后的样子:
void search(string *array, int size)
{
string name;
cout<<"Please enter a name or END to terminate:";
cin>>name;
while (name != "END")
{
bool friends = false;
int first = 0;
int last = size - 1;
int middle;
while(!friends && first <= last)
{
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;
}
cout<<"Please enter another name or END to terminate:";
cin>>name;
}
}
这次有两个不同的提示,因此如果用户输入"END"
,外部循环会立即终止,而不必在循环内添加额外的检查。
另外,与您的其他问题一样,search(friendArray, maxsize);
应该是search(friendArray, sub);
,因为我上次告诉您的原因 - sub
是数组中有效项的计数,{{ 1}}是数组的容量。
注意:如果您的列表中没有该名称,则会导致无限循环。我会让你解决这个问题,因为它的作业,我不想改变你的任何实际逻辑。但暗示是要考虑实际发生了什么 - 如果某个值不存在,那么只要在值存在的区域周围继续递增和递减maxsize
,如果它存在的话
也许如果你的逻辑合并last
被某个地方修改,那么条件first
就会失败,你就会摆脱循环......