我的代码有点麻烦。它几乎应该打开两个文件,并比较文件的前二十行" StudentAnswers.txt" [作为char输入char数组]对照(另一个文件的每一行)中的char值" CorrectAnswers.txt"在同一位置(索引)的另一个数组中。它类似于线性搜索,但在数组中的位置相同。然后应该显示一份报告,详细说明学生错过了哪个问题,给定答案,正确答案,以及学生是否通过(得到> = 70%),如下所示:
学生X的报告: 2(A / D),3(C / D),5(D / A) 这名学生通过了考试!
然后它应该清除SAArray,并从StudentAnswers.txt中提供接下来的20行,然后重新开始这个过程。我想该程序必须确定学生人数(#And; StudentAnswers.txt' file / 20)。
我在显示报告时遇到问题,并且在程序结束后让阵列自行清除。我猜这可以用一个while循环和一个累加器来完成学生数量(由上面的等式确定)。 此外,Visual Studio似乎转到"错过__问题总共___%",然后继续循环-858993460。
任何帮助都将不胜感激。
#include <iostream>
#include <fstream>
#include <string>
#include <array>
#include <algorithm>
using namespace std;
void GradeReturn(char[], char[], int, int, int);
string PassFail(float);
int main()
{
ifstream SA("StudentAnswers.txt");
ifstream CA("CorrectAnswers.txt");char CAArray[20];
char SAArray[20];
// char SA2Array[20];
bool isCorrect;
int correct;
int incorrect;
int counter;
correct = 0;incorrect = 0;
counter = 0;
cout << endl;
if (!SA.fail())
{
cout << "'StudentAnswers.txt' file opened successfully." << endl;
cout << "'CorrectAnswers.txt' file opened successfully." << endl << endl;
int a = 0;
int b = 0;
while (a < 20)
{
CA >> CAArray[a];
a++;
} // while loop to feed char into the array
while (b < 20)
{
SA >> SAArray[b];
b++;
}
} // while loop to feed char into array
CA.close(); // closing "CorrectAnswers.txt"
SA.close(); // closing "StudentAnswers.txt"
GradeReturn(&CAArray[counter], &SAArray[counter], correct, incorrect, counter);
return 0;
}
void GradeReturn(char CAArray[], char SAArray[], int correct, int incorrect, int counter)
{
float percent;
float hundred;
int student;
int catcher[20];
int writeCatcher; int starter;
int catcher_size;
student = 0;
writeCatcher = 0;
catcher_size = ((sizeof catcher) / 4);
while (counter < 20)
{
if ((CAArray[counter]) == (SAArray[counter]))
{
correct++;
cout << "Good job!" << endl;
} // correct handling
else
{
incorrect++;
cout << "You got question " << counter << " wrong." << endl;
counter >> catcher[writeCatcher];
writeCatcher++;
} // incorrect handling
counter++;
} // while loop to determine if a student got a question right or wrong
static_cast <float> (incorrect); // float conversion
cout << endl; // for cleanliness
percent = ((static_cast <float> (correct)) / 20); // percentage
hundred = percent * 100;
PassFail(percent);
if (PassFail(percent) == "pass")
{
student++;
cout << "Report for Student " << student << ":" << endl;
cout << "-----------------------------" << endl;
cout << "Missed " << incorrect << " questions out of 20 for ";
cout << hundred << " % correct." << endl << endl;
starter = 0;
while (starter < (sizeof catcher)
{
if(1=1)
{
catcher_size
}
else
{
cout << "";
starter++;
}
}
}
else if (PassFail(percent) == "fail")
{
student++;
cout << "Missed " << incorrect << " questions out of 20 for ";
cout << hundred << " % correct." << endl << endl;
while (starter < catcher_size)
{
if ((catcher[starter]) == -858993460)
{
starter++;
}
else
{
cout << "";
starter++;
}
}
}
return;
}
string PassFail(float percent)
{
if (percent >= 0.70) // if <pass>
{
return "pass";
}
else // if <fail>
{
return "fail";
}
cout << endl;
}
答案 0 :(得分:0)
要获得循环,您应该保持流打开,而不是在读取20行后关闭它们。
作为伪代码:
a = 0;
while(streams_not_empty)
{
CA >> CAArray[a];
SA >> SAArray[a];
++a;
if (a == 20)
{
GradeReturn(&CAArray[counter], &SAArray[counter], correct, incorrect, counter);
a = 0; // Reset a
}
}
CA.close(); // closing "CorrectAnswers.txt"
SA.close(); // closing "StudentAnswers.txt"
您还需要通过引用传递correct, incorrect, counter
,以便GradeReturn
可以通过累积来更改其值及其值。
像:
void GradeReturn(char CAArray[], char SAArray[], int& correct, int& incorrect, int& counter)
此外,您不应该依赖每次都能从文件中准确读取Nx20行。一个文件可以有,例如108(5x20 + 8)行,所以你的代码应该只能处理8行。换句话说,不要在函数中硬编码20,如while (counter < 20)
。而是传递要处理的行数并执行while (counter < number_to_handle)
。
像这样的伪代码:
a = 0;
while(streams_not_empty)
{
CA >> CAArray[a];
SA >> SAArray[a];
++a;
if (a == 20)
{
GradeReturn(&CAArray[counter], &SAArray[counter], correct, incorrect, counter, a);
// ^
a = 0; // Reset a
}
}
if (a != 0)
{
// Process the rest
GradeReturn(&CAArray[counter], &SAArray[counter], correct, incorrect, counter, a);
}
CA.close(); // closing "CorrectAnswers.txt"
SA.close(); // closing "StudentAnswers.txt"
答案 1 :(得分:0)
您遇到的一个问题是您正在尝试将C风格的字符串与==
运算符进行比较。这将比较它们,就好像它们是指向char
的指针,即比较它们是否指向内存中的相同位置,而不是比较字符串的内容。我建议您查看数组衰减和c-string变量以了解更多信息。
具体来说,if (PassFail(percent) == "pass")
不会按照您的意愿行事。 strcomp
doc,strncmp
doc使用std::string
变量而不是c风格的字符串都可以正常工作,但最好只比较{{1}一个值,即percent
直接而不是调用PassFail并比较一个字符串。
此处还有许多其他问题,您一度调用PassFail但不对返回值执行任何操作。 PassFail的唯一副作用是if(percent >= 0.70
,如果这是你想要的,这是一个糟糕的决定,并且难以阅读将新行放在控制台上的方法。
尝试向编译器询问更多警告,这通常有助于查找这些类型的问题。 -Wall -Wextra为gcc工作,你可能需要阅读编译器手册......