2016-04-24 2 views
0

Это программа, над которой я работаю, чтобы изучить C++. Он вставляет файл в два разных массива (строка, 2d double), чем сортировки, средние значения, добавляет средние значения в концы 2d двойной массива, чем выходы. Я пытаюсь реализовать поиск (желательно двоичный), который находит совпадение имени с переменной searchItem, чем получает оценки, связанные с этим именем для вывода. У меня есть идея, как реализовать захват баллов. Храните в переменной позицию элемента, имя которой было найдено, и используйте это для ссылки на строку, в которой будут правые оценки. Проблемы с бинарным поиском, как в нем, не дают ошибок компиляции и ничего не делают. Насколько я понимаю, алгоритм, который я использую, такой же, как и другие, которые я видел. Также я на правильном пути с идеей, которую у меня был или есть лучший метод? Мне казалось, что это самый простой способ, но мой опыт с этим языком ограничен. Заранее спасибо.Бинарный поиск по массиву строк и дополнительной функции

#include <stdlib.h> 
#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <string> 

using namespace std; 

const int ROWS = 11; 
const int COLS = 4; 

void ArrayManip (string x[], double y[][COLS], int length); 

int main() 
{ 
    ifstream inFile; 

    inFile.open("bowlers2.txt"); 

    const int SIZE = 10;  

    double scores[ROWS][COLS]; 
    string names[SIZE]; 
    string mystring; 

    if (!inFile) 
    { 
     cout << "Can not open the input file" 
      << " This program will end."<< "\n"; 
     return 1; 

    } 

    for(int r = 0; r < SIZE; r++) 
    { 
     getline(inFile, names[r]); 
     for(int c = 0; c < (COLS - 1); c++) 
     { 
      getline(inFile, mystring); 
      scores[r][c] = atoi(mystring.c_str()); 
     } 
    } 

    inFile.close(); 

    ArrayManip (names, scores, SIZE); 

    return 0; 
} 

void ArrayManip (string x[], double y[][COLS], int LENGTH) 
{ 
    int i,j,k, 
     first = 0, 
     last = LENGTH - 1, 
     middle, 
     position = -1;  
    bool found = false; 
    string searchItem = "keith"; 
    string sValue; 
    double dValue; 
    double dArray[COLS - 1]; 
    double sum = 0; 
    double avr; 

    //Sort names and scores 
    for(i = 1; i < LENGTH; i++) 
    { 
     sValue = x[i]; 
     for (k = 0; k < (COLS - 1); k++) 
     { 
      dArray[k] = y[i][k]; 
     } 
     for(j = i - 1; j >= 0 && x[j] > sValue; j--) 
     { 
      x[j + 1] = x[j]; 
      for (k = 0; k < (COLS - 1); k++) 
      { 
       y[j + 1][k] = y[j][k]; 
      } 
     } 
     x[j + 1] = sValue; 
     for (k = 0; k < (COLS - 1); k++) 
     { 
      y[j + 1][k] = dArray[k]; 
     } 
    } 

    for(k = 0; k < LENGTH; k++) 
     for(i = 1; i < (COLS - 1); i++) 
     { 
      dValue = y[k][i]; 
      for(j = i - 1; j >= 0 && y[k][j] > dValue; j--) 
      { 
       y[k][j + 1] = y[k][j]; 
      } 
      y[k][j + 1] = dValue; 
     } 

    //average and store rows 
    for(i=0;i<LENGTH;i++) 
    { 
     for(j = 0; j < (COLS - 1); j++) 
     { 
      sum += y[i][j];    
     } 
     avr = sum/(COLS -1); 
     y[i][j++] = avr; 
     sum = 0;   
    } 

    //average and store columns 
    for(j=0;j<(COLS - 1);j++) 
    { 
     for(i=0;i<LENGTH;i++) 
     { 
      sum += y[i][j]; 
     } 
     avr = sum/LENGTH; 
     y[i++][j] = avr; 
     sum = 0; 
    } 

    cout << fixed << showpoint << setprecision(2); 
    cout << "Averages for all Players:\n"; 
    for(i=0;i<(COLS - 1);i++) 
    { 
     cout << "Score " << (i+1) << " average: " << y[LENGTH][i] << "\n"; 
    } 

    cout << "\n"; 

    for(i=0;i<LENGTH;i++) 
    { 
     cout << "player " << (i+1) << ": " << x[i] << "\n"; 
     for(j=0;j<COLS;j++) 
     { 
      if(j < (COLS - 1)) 
      { 
      cout << "score " << (j+1) << ": " << y[i][j] << "\n";    
      } 
      else 
      cout << "player average: " << y[i][j] << "\n\n";    
     } 
    }  

    while(!found && first <= last) 
    { 
     middle = (first + last)/2; 
     if(x[middle] == searchItem) 
     { 
      found = true; 
      cout << x[middle] << "\n"; 
     } 
     else if (x[middle] > searchItem) 
      last = middle - 1; 
     else 
      first = middle + 1; 
    } 
} 

входного файла: bowlers2.txt

Linus too good 
100 
23 
210 
Charlie brown 
1 
2 
12 
Snoopy 
300 
300 
100 
Peperment Patty 
223 
300 
221 
Pig Pen 
234 
123 
212 
Red Headed Girl 
123 
222 
111 
Marcey 
1 
2 
3 
keith hallmark 
222 
300 
180 
anna hallmark 
222 
111 
211 
roxie hallmark 
100 
100 
2 

ответ

1

При сравнении двух std::string объектов с помощью оператора равенства, он сравнивает целые строки. Если вы ищете "keith" и сравниваете его со строкой "keith hallmark", тогда она не будет соответствовать.

Вы можете использовать std::string::find, чтобы найти подстроку в строке.

Как

if (x[middle].find(searchItem) != std::string::npos) 
{ 
    // Sub-string found 
} 
+0

я вижу. Я пропустил, что у меня не было всей строки в качестве переменной поиска. Спасибо за ссылку на поиск подстроки. – mrbw

Смежные вопросы