主要的是for循环每一次的输入都只是覆盖前一次输入的s变量的各个成员变量的值而已,所以循环结束后只得到最后一个输入的值。如果要保留这个for循环的话,可以动态的定义一个student数组,把每一次的输入都依次保存到数组中。input函数我觉得作为友元函数比较适合。下面对代码做了一些修改:
#include
#include
#include
#include
using namespace std;
class student{
public:
student(){}
friend void input();//录入学生课程信息
protected:
int num;//学号
string course_num;//课程编号
string course_name;//课程名称
int credits;//定义学分
double regular_score;//平时成绩
double exper_score;//实验成绩
double supper_score;//卷面成绩
double average_score;//综合成绩
};
void input(){
system("cls");
int n;
cout << "/********输入需要录入成绩信息的课程数********/" << endl;
cin >> n;
student*p = new student[n];
for (int i = 0; i < n; i++){
cout << "学号:";
cin >> p[i].num;
cout << "课程编号:";
cin >> p[i].course_num;
cout << "课程名称:";
cin >> p[i].course_name;
cout << "平时成绩:";
cin >> p[i].regular_score;
cout << "实验成绩:";
cin >> p[i].exper_score;
cout << "卷面成绩:";
cin >> p[i].supper_score;
if (p[i].exper_score == -1)
p[i].average_score = p[i].regular_score*0.3 + p[i].supper_score*0.7;
else
p[i].average_score = p[i].regular_score*0.15 + p[i].exper_score*0.15 + p[i].supper_score*0.7;
cout << "综合成绩:";
cout << p[i].average_score << endl;
}
ofstream outfile("B.txt", ios::app);
ifstream infile("B.txt");
string s;
infile >> s;
if (s.empty())
outfile << "学号" << " \t" << "课程编号" << "\t" << "课程名称" << "\t" << "平时成绩" << "\t" << "卷面成绩" << "\t" << "综合成绩" << endl;
if (!outfile)
{
cerr << "open B.txt error!" << endl;
exit(1);
}
for (int i=0; i < n; i++)
{
outfile << p[i].num << "\t\t" << p[i].course_num << "\t\t" << p[i].course_name << "\t\t" << p[i].regular_score << "\t\t" << p[i].supper_score
<< "\t\t" << p[i].average_score << "\t\t" << endl;
}
delete[]p;
outfile.close();
}
int main(){
input();
return 0;
}
你for循环输入的时候 存储的变量是同一个变量,当然以最后一次为准了。
其实你直接把输出的这个for循环内容放到输入的 for循环内部就行了。
这样应该就能得到你想要的结果。