具体要求如下:
(1)应定义学生类Student,成员数据包括学号、姓名和成绩等;
(2)建议用友元函数为学生类重载输入输出流的<<和>>运算符,实现学生信息的整体输入输出功能;例如:
friend istream& operator >> (istream&, Student&);
friend ostream& operator << (ostream&, Student&);
(3) 要求在主函数中,从键盘输入多个学生的信息
(4) 要求将全部学生信息存入文本文件中;
(5) 最后从文件中读出全部学生信息显示到屏幕上,并求平均成绩。
完整代码:
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
class Student
{
string ID;
string Name;
int Score;
static float sum;
static int Count; //static 静态数据成员(不是常数据成员const):如果将一个类的一个数据成员定义成静态的,则该类的所有对象的该成员共用同一存储空间。
//是用来解决对象之间的数据共享问题,一个对象给静态数据成员赋值后,另一个对象可以读取该值。
public:
Student(string id = "0", string name = "null", int score = 0)
{
ID = id;
Name = name;
Score = score;
Count++;
sum = sum + score;
}
static float getsum()
{
return sum;
}
static float getCount()
{
return Count;
}
static void print()
{
cout << Count << "名学生平均成绩为" << sum / Count << endl;
}
friend istream& operator>>(istream& is, Student& s);
friend ostream& operator<<(ostream& os, Student& s);
};
int Student::Count = 0;
float Student::sum = 0;
//初始化静态数据成员 静态数据成员的初始化与非静态成员的初始化不同,必须在类外进行
//变量名前应加类名限定,指定它的所属类,但不需要加关键字static
istream& operator>>(istream& is, Student& s)
{
cout << "请依次输入学生的学号,姓名和成绩" << endl;
is >> s.ID >> s.Name >> s.Score;
return is;
}
ostream& operator<<(ostream& os, Student& s)
{
os << s.ID << "\t" << s.Name << "\t" << s.Score << endl;
return os;
}
int main()
{
ofstream out("students"); //定义文件输出流对象
if (!out)
{
cout << "错误,未找到文件" << endl;
return 0;
}
int n;
cout << "请输入要添加的学生人数" << endl;
cin >> n;
for (int i = 0;i < n;i++)
{
string id, name;
int score;
cout << "请依次输入学生的学号,姓名和成绩" << endl;
cin >> id >> name >> score;
Student stu(id, name, score);
out << stu;
}
out.close();
cout << "成绩总分:" << Student::getsum() << endl;
cout << "总人数:" << Student::getCount() << endl;
ifstream in("students"); //定义文件输入流对象
if (!in)
{
cout << "错误,未找到文件" << endl;
return 0;
}
string id, name;
int score;
for (int k = 0;k < n;k++)
{
in >> id >> name >> score;
cout << id << "\t" << name << "\t" << score << endl;
}
Student::print();
system("pause");
return 0;
}