2017-07-09 14 views
-1

指定されたファイルには、のペアが含まれています。その後、2桁の数字(Xと呼ぶ)を取り上げ、勝敗を計算します。勝敗ルールは、入力番号がXと一致した場合に勝ち、勝利合計は(金額* 70)です。それ以外の場合は、( - 量)の損失です。固定サイズの配列をベクトルに変更する

For example: [ticket.txt] 09 10 13 15 25 21

トスアップ数は、チケットの勝利/損失量は、09であれば(10 * 70から15 - = 664 21)

toss-場合チケットの勝敗は(-10 - 15 - 21 = -46)である。

ファイルを配列で読み取るのは固定サイズですが、つまり、ファイルticket.txtにサイズが指定されていないとどうなりますか?誰かが配列をベクトルに読み替えたり、サイズを固定していないものを変更したりできますか?

For example: [ticket.txt] 09 10 13 15 25 21 .. ..

#include <iostream> 
#include <fstream> 

using namespace std; 
int line1[100]; // array that can hold 100 numbers for 1st column 
int line2[100]; // array that can hold 100 numbers for 2nd column 
int main() 
{ 
    int winNum, winAmount = 0, lostAmount = 0, result = 0; 
    int num = 0; // num start at 0 
    ifstream inFile; 
    inFile.open("Ticket.txt"); //open File 
    if (inFile.fail()) 
    { 
     cout << "Fail to open the file" << endl;  
     return 1; 
    } 


    int myArray[3][2]; 
    for(int i = 0; i < 3; i++) 
     for(int j = 0; j < 2; j++) 
      inFile >> myArray[i][j]; 

    cout << "Numbers from File: " << endl; 

    for(int i = 0; i < 3; i++) 
    { 
     for(int j = 0; j < 2; j++) 
     { 
      cout << myArray[i][j] << " "; 
     } 
     cout << "\n";  
    } 

    cout << endl; 
    cout << "Enter the toss-up number: "; // enter the win number 
    cin >> winNum; 

    for(int i = 0; i< 3;i++) 
    { 
     if (myArray[i][0] == winNum) 
     { 
      winAmount = myArray[i][1] * 70; // number user choose = win number, winAmount = winAmount * 70 - lostAmount 
     } 
     else 
     { 
      lostAmount = lostAmount + myArray[i][1]; //number user choose != win number, the amount will be -lost amounts 
     } 
    } 

    result = winAmount - lostAmount; 
    cout << result; 

    cout << endl << endl; 
    system("pause"); 
    return 0; 
    } 

答えて

0

この問題にアプローチするさまざまな方法の束があります。

一つはvector

std::vector<std::vector<int>> myArray; 

vectorを作ることができるが、これはかなり無駄です。唯一の内寸は、サイズが可変であるため、迅速な改善は含めたいどのくらいの検証によっては、かなり単純なことができ

std::vector<std::array<int, 2>> myArray; 

ロードmyArrayです。ここでは、最小限の検証である:

int number,amount; 
while (inFile >> number >> amount) 
{ 
    myArray.push_back({number,amount}); 
} 

これがループ2つのint sが読み取ることができないまで、それが原因で、ファイル内のファイルやごみの終わりであること。また、壊れた列数のファイルで簡単にだまされます。より良いアプローチでは、std::getlineを使用して行全体を取得し、正確に2つの有効な数値を確認し、各行には何もないことを確認します。

残りのコードは変更されません。

しかし、決して変わらない

a)の損失量を考慮して、これを行うには良い方法があるかもしれません。それを事前に計算し、損失の際にループを排除することができます。

b)これを拡張すると、勝利でループの一部を消すことができます。損失額には、損失額から当選金額を差し引いた額が使用されます。言い換えれば、

winnings = amount * 70 - loss + amount 

または

winnings = amount * 71 - loss 

だから我々は、我々は勝利を見つけ、一つだけの計算を行うとすぐに探して停止することができます

と同じである
winnings = amount * 70 - (loss - amount) 

c)std::mapのルックアップループが不要になります。 std::map

ファイルを読み込むには似ています

std::map<int, int> myMap; 

int number,amount; 
int loss = 0; 
while (inFile >> number >> amount) 
{ 
    myMap[number] = amount; // map the amount to the number 
    loss += amount; 
} 

とルックアップを計算ループが完全に除去され、以下のコードはほとんど常により良いです

int result = 0; 
auto found = myMap.find(winNum); // look in the map for a number 

if (found != myMap.end()) // number is in the map 
{ 
    result = 71* found->second; // take the winnings plus one extra to counterbalance 
           // number's addition to the losses 
} 
result -= loss; //remove the loss 

のようなものです。そこにないコードにはバグはありません。それが存在しない限り、バグはありますが、それは別の問題です。

注:小さなファイルの場合、この方法は低速になります。 std::mapは、std::vectorを反復するよりもはるかに低い時間の複雑さを持ちますが、実行する必要がある反復のそれぞれがはるかに高価になる可能性があります。

Documentation on std::array

Documentation on std::vector

Documentation on std::map

関連する問題