2017-12-04 6 views
-2

大きなスイッチケースを含むファイルが入力として与えられます。ケースは0からnまでインクリメントされます。各ケースにはいくつかの特定の要素(a、bなど)があります。テキストファイルからパターンを抽出するためのアルゴリズム/ C++コード

出力は、すべての固有の要素を含むベクトル、要素が使用される最初の位置(大文字)、最後に要素の周期性を含む第3のベクトルを含むベクトルです。

入力は、このようなテキストファイルであろう:

//standard comment useful for parsing file 
switch something 
{ 

case 0: 
    a; 
    b; 
    c; 
    break; 

case 1: 
    break; 

case 2: 
    a; 
    break; 

case 3: 
    d; 
    break; 

case 4: 
    a; 
    d; 
    break; 

} 

出力:

ベクトル1になります{A、B、C、D}

ベクトル2は、{0になり0、0,3}

注:0は非周期要素であり、2は要素の連続した2つの外観の間の場合の差である2は です。 (ケース4 - ケース2 =ケース2 - ケース0 = 2)。この違いは を繰り返すので、連続する2つの出現を比較する必要があります。

また、このアルゴリズムは、数十万行のコード行番号を付ける非常に大きなファイルに対しても有効です。

+0

HTTPSを:/ /meta.stackoverflow.com/questions/334822 –

+0

通常、努力しても結果は得られません。 – user4581301

+0

この問題には、ファイルの読み込み、ケースの検索、要素の検索、データ構造の構築、および結果の計算といういくつかの部分があります。どの部分に問題がありますか?問題を解消して段階的にやってみることをお勧めします。 –

答えて

1

テキストファイルのフォーマットが一致しており、それは問題で説明されて正確にどのようにであることを考慮すると、あなたが行くように、それを行うための一つの方法は、行を読み取り、解析することによってでしょう。私はそれを行うためのより良い方法があると確信しているが、あまりにも巻き込まずに、ここで私が持っているものである:サンプルファイルの

#include <fstream> 
#include <sstream> 
#include <string> 
#include <vector> 

int main() 
{ 
    std::ifstream inputFile("cases.txt"); 

    std::vector<char> uniqueChars; 
    std::vector<int> firstCase; 
    std::vector<int> periodicity; 

    std::string inputLine; 
    while (std::getline(inputFile, inputLine, '\n')) 
    { 
     if (inputLine.compare(0, 5, "case ") == 0) 
     { 
      int caseN = std::stoi(inputLine.substr(5)); 
      while (std::getline(inputFile, inputLine, '\n') && inputLine != " break;") 
      { 
       std::istringstream iss(inputLine); 
       char c, semi; 
       while (iss >> c >> semi) 
       { 
        auto found = std::find(uniqueChars.begin(), uniqueChars.end(), c); 
        if (found == uniqueChars.end()) 
        { 
         uniqueChars.push_back(c); 
         firstCase.push_back(caseN); 
         periodicity.push_back(0); 
        } 
        else 
        { 
         size_t charPos = std::distance(uniqueChars.begin(), found); 
         if (periodicity[charPos] == 0) 
         { 
          periodicity[charPos] = std::abs(caseN - firstCase[charPos]); 
         } 
        } 
       } 
      } 
     } 
    } 

    // print 

    for (auto c : uniqueChars) 
     std::cout << c << " "; 
    std::cout << std::endl; 

    for (auto i : firstCase) 
     std::cout << i << " "; 
    std::cout << std::endl; 

    for (auto p : periodicity) 
     std::cout << p << " "; 
    std::cout << std::endl; 

    return 0; 
} 

出力:

enter image description here

関連する問題