15-3用文件保存的学生名单

本文介绍了一个学生成绩管理系统的设计与实现过程,系统使用C++语言开发,能够读取文件中的学生成绩数据,计算总分,并筛选出总分高于平均分且没有挂科的学生名单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
* 作    者: 霍雨佳
* 完成日期: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;
}


运行结果

 

经历艰难困苦,终于弄出来了啊,哎哎,其实还是有很多地方不是很懂,

如为什么要用友元函数重载运算符“<<”函数,求高手指点迷津~~~

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值