/*
* 作 者: 霍雨佳
* 完成日期:2014 年6月3日
* 版 本 号:v1.0
* 问题描述:用文件保存的学生名单(文件score.dat中保存的是若干名学生的姓名和C++课、高数和英语成绩)
* 样例输入:
* 样例输出:
* 问题分析:
*(1)定义学生类,其中包含姓名、C++课、高数和英语成绩及总分数据成员,成员函数根据需要确定。
*(2)用对象数组进行存储学生的成绩,读入成绩并计算总分;将总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中。
*/
#include<iostream>
#include<cstdio> //支持freopen的头文件
#include<cstdlib>
#include<fstream>
using namespace std;
//定义学生类
class Student
{
public:
//声明必要的成员函数
double gettotal();
static double get_total_sum();
static int get_stu_num();
bool panduan();
friend ostream& operator <<(ostream& output,Student&t); //声明友元函数重载运算符“<<”函数
friend istream& operator >>(istream& output,Student&t);
private:
string name;
double cpp;
double math;
double english;
double total;
static int stu_num; //学生人数,处理为类的静态成员合适,【静态成员函数不能被赋值】
static double total_sum; //学生总分和
};
int Student::stu_num = 0;
double Student::total_sum = 0;
double Student::gettotal()
{
return total;
}
double Student::get_total_sum()
{
return total_sum;
}
int Student::get_stu_num()
{
return stu_num;
}
bool Student::panduan()
{
if(cpp>=60&&math>=60&&english>=60&&total-total_sum>=0)
return true;
else
return false;
}
istream& operator >>(istream& input,Student&t)
{
input>>t.name>>t.cpp>>t.math>>t.english;
t.total=t.cpp+t.math+t.english;
return input;
}
ostream& operator <<(ostream& output,Student&t) //声明友元函数重载运算符“<<”函数
{
output<<t.name<<" "<<t.cpp<<" "<<t.math<<" "<<t.english<<" "<<t.total<<endl;
return output;
}
int main( )
{
Student stud[200],t; //stud[200]为保存数据的对象数组
string sname;
double total_ave=0;
int i=0;
//从文件score.dat中读入数据,保存到对象数组中
freopen("score.dat","r",stdin); //以输入的方式打开文件 r=read
freopen("pass_score.dat","w",stdout); //输出结果 w=write
while(cin>>stud[i])
{
i++; //从cin流读取数据
}
for(int j=0; j<=i; j++)
{
total_ave=stud[j].gettotal()+total_ave;
}
total_ave=Student::get_total_sum()/Student::get_stu_num();
for(int h=0; h<=i; h++)
{
if(stud[h].panduan()==true)
{
cout<<stud[h]<<endl;
}
else {}
}
//总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中
fclose(stdin);
fclose(stdout);//关闭文件。用完了必须关闭,否则会丢失数据
return 0;
}
运行结果
经历艰难困苦,终于弄出来了啊,哎哎,其实还是有很多地方不是很懂,
如为什么要用友元函数重载运算符“<<”函数,求高手指点迷津~~~
。