2013-11-16 2 views
0

Нашел меня немного застрял в текущем проекте. Я пытаюсь прочитать файл .txt (первое и последнее имя, разделенное пробелом по 1 строке) в массив. После чтения в файле это то, что должно произойти.Массивы, сортировка и двоичный поиск

  • сортировать массив с помощью функции (я выбрал выбор рода)
  • попросить пользователя ввести имя
  • использовать функцию, чтобы сделать бинарный поиск
  • дисплей ли имя друга или нет если он найден

Для большей части я понимаю. Программа читала в файле раньше, и я даже написал ее, чтобы отображать, чтобы увидеть, даже если она не нужна. Теперь он отображает только одно имя. Ища небольшая помощь, чтобы заставить меня двигаться снова. Извиняюсь, если я болею в прикладе, или если мой код взлетел. Спасибо за любую помощь.

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <fstream> 

using namespace std; 
//Function prototypes 
void nameSort(string[], const int); 

//prototype to display the contents of the file after sorting 
//Although I do not need this I wanted to see the names were 
//read in correctly. 
void nameDisplay(string[], const int); 

void nameSearch(string[], const int); 
int index = 0; //loop counter 

int main() 
{ 
const int ARRAY_SIZE = 100; 
string nameArray[ARRAY_SIZE]; 
//file object 
ifstream fileIn; 
fileIn.open("myFriends.dat"); 

while (index < ARRAY_SIZE && getline(fileIn, nameArray[index])) 
index++; 
//function call to sort the array 
nameSort(nameArray, index); 

//Display names to screen as a test of the sort 
nameDisplay(nameArray, ARRAY_SIZE); 
//function call for search 
nameSearch(nameArray, ARRAY_SIZE); 


system("pause"); 
return 0; 
} 
//function definitions 
void nameSort(string *array, const int ARRAY_SIZE) 
{ 
bool swap; 
string temp; 

do 
{ 
    swap = false; 
    for (int count = 1; count < (ARRAY_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 nameSearch(string *array, const int ARRAY_SIZE) 
{ 
int first = 0; 
int last = ARRAY_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; 
    } 
} 


void nameDisplay(string *array, const int ARRAY_SIZE) 
{ 
for(int index = 0; index < ARRAY_SIZE; index++) 
    cout<<array[index]<<endl; 
} 
+0

Это выглядит не так: 'строка NameArray [ARRAY_SIZE] [ARRAY_SIZE];' Вы хотите использовать два измерения для того, чтобы сохранить первое и фамилиями ? Я думаю, что это было бы лучше: 'string nameArray [ARRAY_SIZE] [2];' – NicholasM

+0

В идеале да, я хотел, чтобы один одномерный массив удерживал первые и последние имена, такие как Tom Jones, затем следующую строку и другое имя. Программа должна содержать до 200 имен, поэтому я бы написал массив следующим образом: string nameArray [ARRAY_SIZE] [200]? – allendks45

+0

Традиционная интерпретация двумерного массива для любого типа (давайте использовать 'string' в этом примере): ' string nameArray [NUMBER_ROWS] [NUMBER_COLUMNS] '. Я предлагаю вам объявить 'nameArray [ARRAY_SIZE] [2]'. Тогда для человека 'i',' nameArray [i] [0] 'будет фамилия человека, а' имяArray [i] [1] 'будет именем человека. – NicholasM

ответ

0

Ваше имяПоиск кажется по меньшей мере одной ошибкой. Вместо того, чтобы:

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(!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 
     first = middle + 1; 
} 
Смежные вопросы