簡體   English   中英

沒有排序和搜索數組的輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM