Нет вывода для отсортированного и найденного массива - PullRequest
0 голосов
/ 06 декабря 2011

Я изучал все, что я пережил в моем первом семестре программирования. Я готовлюсь к финалу, поэтому я пытаюсь написать примеры программ, объединяющих все, чему я научилась готовиться. Предполагается, что приведенная ниже программа считывает имена из файла, сортирует их с помощью пузырькового поиска, а затем предлагает пользователю ввести имя, которое будет искать двоичный поиск, и сообщит вам, является ли этот человек другом или нет.

Моя проблема в том, что когда я набираю имя, мне предлагается только ввести имя еще раз. Нет вывода.

Пожалуйста, имейте в виду, что здесь все в основном то, чему я научился (поэтому я не знаю, как использовать векторы, указатели и т. Д.).

#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 ]

1 голос
/ 06 декабря 2011

Я не хочу отдавать слишком много, так как это домашняя работа, поэтому я перенесу часть вашего кода, держу его как можно ближе и покажу вам, почему он в настоящее время не работает.

В данный момент вы как бы думаете, что цикл 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 - это число допустимых элементов в массиве, maxsize - это емкость массив.

ПРИМЕЧАНИЕ: Если имя не существует в вашем списке, это вызовет бесконечный цикл. Я позволю тебе разобраться с этим, потому что это домашнее задание, и я не хочу менять твою настоящую логику. Однако намек следует подумать о том, что на самом деле происходит - если значение не существует, вы просто будете увеличивать и уменьшать last вокруг области, где должно быть значение, если оно существует.

Возможно, если бы ваша логика включала first, где-то изменяясь, так что условие first <= last не выполнится, и вы выйдете из цикла ...

1 голос
/ 06 декабря 2011

Ваш оператор 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;
}

Изменить it:

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");
...