-1

私が以下にコーディングするプログラムは、各学生が行ったすべての支払いをリストし、支払った金額と未払いの金額を表示する必要があります

次のセクションについて助けが必要です。

void payment()
{
    // Display message asking for the user input
    std::cout << "List all payment made by each student, show amount paid and outstanding." << std::endl;

    // Read from text file and Display list of payment

    std::ifstream infile;               // enable to open, read in and close a text file
    float StudentCode;                  // to store the student enrolment number
    float Amount;                       // to store the amount of money
    float Type;                         // to store information on type of payment made
    float Outstanding;                  // to store amount of money is due

    infile.open("Payment.txt");         // open a text file called Payment

    if (!infile)                 
    {
        std::cout << "Item list is empty" << std::endl;     // if the file is empty it output the message
    } 
    else 
    {
        std::cout << "List of Payment: " << std::endl;
        std::cout << "" << std::endl;
        std::cout << "Enrolment No." << "Amount" << "Outstanding" << std::endl;

        // If there is Student Code that has the same number, it need to combined the amount it paid 
        // For an example 
        // Student Code: 12 Amount: 25
        // Student Code: 12 Amount: 50
        // so it should display the following when the program runs:
        // Student Code: 12 Amount: 75

        while(!infile.eof())            // output the description of the text file onto the screen
        {
            getline(infile,StudentCode,Amount);

            Outstanding = Amount - 100;

            std::cout << StudentCode << Amount << "$" << Outstanding << std::endl;
            //iter++;
        }
        std::cout << "End of list\n" << std::endl;
    }

    infile.close();         // close the text file  
}

getline 部分の何が問題になっていますか:

getline(infile,StudentCode, Amount);

また、プログラムは学生コードを繰り返し表示するのではなく、支払った金額を合算する必要があります。コメント欄で説明するところ

// If there is Student Code that has the same number .....

どうすればいいですか?

4

3 に答える 3

1

getlineストリームから文字列に行を読み取ります。あなたがやろうとしていることは、もっとこのようなものです

while (infile >> StudentCode >> Amount) {
    // process values
}

すべての金額を合計したい場合は、最初に累積し、その後収集した値をループして出力する必要があります

std::map<int, float> amountsPaid;
int studentCode;
float amount;
// accumulate amounts
while (infile >> studentCode >> amount) {
    amountsPaid[studentCode] += amount;
}

// loop through map and print all entries
for (auto i = amountsPaid.begin(); i != amountsPaid.end(); ++i) {
    float outstanding = i->second - 100;
    std::cout << i->first << ": " << i->second << "$, " << outstanding << '\n';
}
于 2012-12-11T22:13:00.120 に答える
1

ここにはいくつかの問題があります。1 つは、getline1 行のテキストを複数のフィールドstd::stringではなく、1 つの変数に読み込むことです。float

そのためにあなたは試すかもしれません

infile >> StudentCode >> Amount;

第二の問題は、

while(!infile.eof())

次の入力が機能するかどうかはチェックしませんが、の入力試行がファイルの終わりに達したために失敗した場合はチェックしません。

標準的な方法は、これらを組み合わせることです

while (infile >> StudentCode >> Amount)
{
    // do something with the code and amount
}
于 2012-12-11T22:16:17.713 に答える
0

getline への呼び出しが正しくないようです。

ドキュメントの状態

istream& getline ( istream& is, string& str, char delim );

しかし、あなたはそれを与える

getline(istream&, float, float);

行を文字列として読み取ってから、2 つのフロートを解析する必要があります。

あなたはC++を使用しているので、ファイルが適切にフォーマットされていれば、cinをリダイレクトするだけで簡単になります。あなたはただのようなことをすることができます

while (infile >> StudentCode) {
  infile >> Amount;
} 
于 2012-12-11T22:15:34.200 に答える