第十六周项目三 用文件保存学生的名单 ( 不用函数重载 历经千辛万苦终于出来了)

/*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;
}

感想:对于这段代码,虽然在许多地方不如用重载安全简洁,但是最起码还是自己写的,内心还是比较欣喜的。

评价:在往类数组里面读取数据的时候需要提前知道文件中有多少名学生的信息,再用循环来操作,所以操作时还是不是特别方便的。另外类中的函数成员也全部用成了公有                 的,所以有时候还是不是特别安全的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值