2016-04-24 96 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