0

問題の説明は次のとおりです。

あなたの学校の歴史の先生は、真/偽のテストを採点するのに助けが必要です。学生のIDとテストの回答はファイルに保存されます。ファイルの最初のエントリには、テストへの回答が次の形式で含まれています。

TFFTFFTTTTFFTFTFTFTT

ファイル内の他のすべてのエントリは、学生ID、空白、学生の回答の順になります。たとえば、次のエントリがあります。

ABC54301 TFTFTFTT TFTFTFFTTFT

学生IDがABC54301であり、質問1の回答がTrue、質問2の回答がFalseなどであることを示します。この生徒は質問9に答えませんでした。試験には20の質問があり、クラスには150人以上の生徒がいます。正解ごとに2ポイントが与えられ、間違った答えごとに1ポイントが差し引かれ、ゼロポイントが与えられる答えはありません。テストデータを処理するプログラムを作成します。出力は、学生のID、回答、テストスコア、テストグレードの順になります。次のグレードスケールを想定します:90%〜100%、A; 80%〜89.99%、B; 70%〜79.99%、C; 60%〜69.99%、D; および0%〜59.99%、F。

これは私が作ったプログラムです:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
//declaring variables
ifstream file("grading.txt");
char key[21];
char id[9];
char student[21];
int score = 0, i;

//initializing arrays
for(i=0; i<21; i++)
{
    key[i]=0;
    student[i]=0;
}
for(i=0; i<9; i++)
    id[i]=0;

//processing the key
file >> key;
file.ignore(100, "\n");

//processing student grades
while(file.good())
{

    file >> id;
    file.ignore();
    getline(file, student);
    file.ignore(100, "\n");

    //comparing key and student answer
    for(i=0; i<21; i++)
    {
        if(strcmp(student[i], key[i])
            score += 2;
        else
            score -= 1;
    }

    //outputing student id, score and grade
    cout << "Student ID: " << id;
    cout << "Score: " << score;
    score = (score/(40))*100;
    if(score >= 90 && score <= 100)
        cout << "Grade: A" << endl << endl;
    else if(score >= 80 && score <= 89.99)
        cout << "Grade: B" << endl << endl;
    else if(score >= 70 && score <= 79.99)
        cout << "Grade: C" << endl << endl;
    else if(score >= 60 && score <= 69.99)
        cout << "Grade: D" << endl << endl;
    else if(score >= 0 && score <= 59.99)
        cout << "Grade: F" << endl << endl;
    else
        cout << "Invalid percentage" << endl;
}

//closing file
file.close();

return 0;
}

次のコンパイルエラーが発生しているようです:http://pastebin.com/r0Y1xX8M(ここでエラーを適切に編集できませんでした。申し訳ありません)

コンパイルエラー、およびこれを解決する方法に関するその他の提案について、ヘルプをいただければ幸いです。

4

3 に答える 3

2

'\n'区切り文字として、文字列リテラルではなく文字定数を使用する必要があります"\n"

の2番目のパラメーターである区切り文字ignoreはタイプintであり、文字定数を暗黙的に変換できます。対照的に、文字列リテラルはに変換できないintため、コンパイラはそれを通知します。

于 2012-07-05T01:30:07.267 に答える
0

常にソースファイルと行番号のある場所を探してください。この場合、これらのいくつかを見ることができます:

c:\users\haxtor\desktop\projects\lab 8 part 2 prob 6\lab 8 part 2 prob 6\problem 6.cpp(34)

重要な部分は、(34)34行目に何か問題があるということです。この場合、34行目の問題は、studentがchar文字列ではなく配列であり、35行目の問題はそうある"\n"べきであるということ'\n'です。さらに問題がある可能性があります。行番号が記載されている他の場所を見つけて、自分で修正してみてください。

于 2012-07-05T01:31:07.643 に答える
0

あなたの最初の問題は

file.ignore(100, "\n");

'\n'二重引用符ではなく単一引用符で使用したいと思います。一重引用符は文字を表します。二重引用符は、配列または文字 (文字列) を表します

第二に、iostream にはstring文字配列をカプセル化するクラスが含まれていると思います。getlineその文字列クラスを使用していると思います。文字配列を使用する場合、私の個人的な好みはfscanfですが、ほとんどのコードは iostream に基づいているようです。そのため、文字配列を文字列に変更するのが最も簡単な変更かもしれません。

また、if(strcmp(student[i], key[i])行は文字配列ではなく文字を渡しています。if(student[i] == key[i])それがあなたのやりたいことだと私は信じています。

コンパイル エラーは、エラーがコードのどの行にあるかを示しているので、残りのエラーについては、コードを見て問題を自分で考えることができます。

于 2012-07-05T16:59:08.657 に答える