[英]How do I filter or output within an array if the number I searched for was not found?
[英]No output for sorted and searched array
我一直在研究我在第一學期編程時遇到的一切。 我有一個最后的決定,所以我一直在努力編寫示例程序,結合我所學到的一切准備。 下面的程序應該從文件中讀取名稱,通過氣泡搜索對它們進行排序,然后提示用戶輸入二進制搜索將查找的名稱,並告訴您該人是否是朋友。
我的問題是,當我輸入名稱時,我只會再次提示輸入名稱。 沒有輸出。
請記住,這里的所有內容大部分都是我到目前為止所學到的(所以我不知道如何使用向量,指針等)。
#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;
}
}
你的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");
我不想放棄太多,因為它是家庭作業,所以我會移動你的一些代碼,保持盡可能接近,並告訴你為什么它目前不起作用。
目前你正在考慮do...while
循環是某種雙重阻止,但事實並非如此。 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
是數組中有效項的計數, maxsize
是數組的容量。
注意:如果列表中不存在該名稱,則會導致無限循環。 我會讓你解決這個問題,因為它是家庭作業,我不想改變你的任何實際邏輯。 一個提示,雖然是思考所發生的情況-如果值不存在,你就繼續遞增和遞減last
圍繞其中的值應該是,如果它存在的區域。
也許如果你的邏輯first
在某個地方被修改,那么first <= last
的條件會失敗,你就會擺脫循環......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.