没有排序和搜索数组的输出

时间:2011-12-06 01:40:02

标签: c++ arrays sorting binary-search

我一直在研究我在第一学期编程中遇到的所有事情。我有一个最后的决定,所以我一直在努力编写示例程序,结合我所学到的一切准备。下面的程序应该从文件中读取名称,通过气泡搜索对它们进行排序,然后提示用户输入二进制搜索将查找的名称,并告诉您该人是否是朋友。

我的问题是,当我输入名称时,系统只会提示我再次输入名称。没有输出。

请记住,这里的所有内容大部分都是我到目前为止所学到的(所以我不知道如何使用向量,指针等)。

#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;
    }
 }

2 个答案:

答案 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循环之后,它无法连接。您需要两个循环,一个提示输入名称的外部循环,以及一个在列表中查找该名称的内部循环。

在要求用户输入其他名称后,您还没有重置friendslast。一个简单的解决方法是在第一个循环中移动声明(包含初始化)。

这是您的代码在重新排列并应用上述更改后的样子:

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就会失败,你就会摆脱循环......