/*copyright(c)2016.烟台大学计算机学院
* All rights reserved,
* 文件名称:text.Cpp
* 作者:舒文超
* 完成日期:2016年6月14日
* 版本号:vc++6.0
* 问题描述:(1)定义学生类,其中包含姓名、C++课、高
数和英语成绩及总分数据成员。
(2)用对象数组进行存储学生的成绩,读入成
绩并计算总分;将总分高于平均总分且没
挂科的同学的信息保存到文件pass_score.dat中。
*/
#include <fstream>
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
//定义学生类
class Student
{
public:
//声明必要的成员函数
Student() {};
~Student();
static int get_StuNum();
static double get_TotalSum();
bool ifpass();
public:
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;
Student::~Student()
{
total_sum-=total;
stu_num--;
}
bool Student::ifpass()
{
return cpp>=60&&math>=60&&english>=60;
}
int main( )
{
Student stud[200],t; //stud[200]为保存数据的对象数组
string sname;
double total_avg;
int i=0;
//从文件score.dat中读入数据,保存到对象数组中
ifstream infile("score.dat",ios::in); //以输入的方式打开文件
if(!infile) //测试是否成功打开
{
cout<<"open error!"<<endl;
exit(0);
}
for(i=0;i<5;i++)
{
infile>>stud[i].name>>stud[i].cpp>>stud[i].math>>stud[i].english;
stud[i].total=stud[i].english+stud[i].math+stud[i].cpp;
Student::stu_num++;
Student::total_sum+=stud[i].total;
}
/*infile>>stud[i++]; //读数据中,人数等信息自动地记录到静态成员中,见运算符重载的实现
infile.close();*/
//总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中
if(Student::stu_num>0)
{
total_avg=Student::total_sum/Student::stu_num;
ofstream outfile("pass_score.dat",ios::out);
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(i=0; i<Student::stu_num; i++)
{
if(stud[i].total>total_avg&&stud[i].ifpass())
{
outfile<<stud[i].name<<" "<<stud[i].cpp<<" "<<stud[i].math<<" "<<stud[i].english<<" "<<stud[i].total<<endl;
}
}
outfile.close();
cout<<"请到文件pass_score.dat中查看名单:"<<endl;
}
return 0;
}
感想:对于这段代码,虽然在许多地方不如用重载安全简洁,但是最起码还是自己写的,内心还是比较欣喜的。
评价:在往类数组里面读取数据的时候需要提前知道文件中有多少名学生的信息,再用循环来操作,所以操作时还是不是特别方便的。另外类中的函数成员也全部用成了公有 的,所以有时候还是不是特别安全的。