以下是问题描述:
您学校的历史老师需要帮助对真/假测试进行评分。 学生的ID和考试答案存储在一个文件中。第一个条目 文件包含以下形式的测试答案:
TFFTFFTTTTFFTFTFTFTT
文件中的每个其他条目都是学生ID,后面跟一个空白 根据学生的回答。例如,条目:
ABC54301 TFTFTFTT TFTFTFFTTFT
表示学生ID为ABC54301,问题1的答案为 没错,问题2的答案是假的,依此类推。这个学生没有 回答问题9.考试有20个问题,班级有以上 150名学生。每个正确答案都会获得两分,每个答案都是错误的 扣除一分,没有答案获得零分。写一个程序 处理测试数据。输出应该是学生的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(无法在此处正确编辑错误,抱歉)
有关编译错误以及有关如何解决此问题的任何其他建议,将不胜感激。
答案 0 :(得分:2)
您应该使用'\n'
作为分隔符 - 字符常量,而不是字符串文字"\n"
。
分隔符,ignore
的第二个参数,类型为int
,可以隐式转换字符常量;相反,字符串文字无法转换为int
,因此编译器会告诉您。
答案 1 :(得分: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行的问题是学生是char
数组而不是字符串而问题是第35行是"\n"
应为'\n'
。可能会有更多问题。尝试找到提及行号的其他地方并自行修复。
答案 2 :(得分:0)
你的第一个问题是
file.ignore(100, "\n");
我认为您希望'\n'
使用单引号而不是双引号。单引号代表一个字符。双引号表示一个或多个字符(字符串)
其次,我相信iostream包含一个string
类,它封装了字符数组。我相信getline
使用该字符串类。对于使用字符数组,我的个人偏好是fscanf,但是大多数代码似乎都是基于iostream,因此将字符数组更改为字符串可能是最简单的更改。
另外,您的if(strcmp(student[i], key[i])
行传入的是字符而不是字符数组。我相信if(student[i] == key[i])
是您想要做的。
您的编译错误会告诉您错误所在的代码行,因此对于其余的代码,您可以查看代码并自己思考问题。