C++语言实践参考——用文件保存的学生名单

【项目-用文件保存的学生名单】

文件score.dat中保存的是若干名学生的姓名和C++课、高数和英语成绩。
(1)定义学生类,其中包含姓名、C++课、高数和英语成绩及总分数据成员。

//定义学生类
class Student{
public:
    //声明必要的成员函数
private:
    string name;
    double cpp;
    double math;
    double english;
    double total;
    static int stu_num;  //学生人数,处理为类的静态成员合适
    static double total_sum; //学生总分和
};

(2)用对象数组进行存储学生的成绩,读入成绩并计算总分;将总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中。

int main( )
{
    Student stud[200],t; //stud[200]为保存数据的对象数组
    string sname;
    double total_avg;
    int i=0;
    //从文件score.dat中读入数据,保存到对象数组中

    //总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中
    return 0;
}

讨论:学生人数和总分的另外一种解决方法是用全局变量。但这两种信息与学生有关,是学生类的“属性”,成为学生类的数据成员合适;这两种信息由学生整体决定,用作静态数据成员合适。如不理解这样设计的理由,复习课程前面的相关内容。

[参考解答]

#include <fstream>
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;

//定义学生类
class Student
{
public:
    Student() {};
    ~Student();
    double get_total();
    static int get_stu_num();
    static double get_total_sum();
    friend istream& operator>>(istream &in, Student &s);  //可以定义input函数替代
    friend ostream& operator<<(ostream &out, Student &s); //可以定义display函数替代
    bool pass();
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;
Student::~Student()
{
    total_sum-=total;
    stu_num--;
}

double Student::get_total()
{
    return total;
}

int Student::get_stu_num()
{
    return stu_num;
}

double Student::get_total_sum()
{
    return total_sum;
}

istream& operator>>(istream &in, Student &s)
{
    in>>s.name>>s.cpp>>s.math>>s.english;
    s.total=s.cpp+s.math+s.english;
    Student::stu_num++;   //在读入数据过程中,用静态成员记录下来具体的学生人数和总分和
    Student::total_sum+=s.total;
    return in;
}

ostream &operator<<(ostream &out, Student &s)
{
    out<<s.name<<"\t";
    out<<s.cpp<<"\t";
    out<<s.math<<"\t";
    out<<s.english<<"\t";
    out<<s.total;
    return out;
}

//返回是否所有课程全过了
bool Student::pass()
{
    return cpp>=60 && math>=60 && english>=60;
}

int main( )
{
    Student stud[200],t; //stud[200]为保存数据的对象数组
    string sname;
    double total_avg;
    int i=0;

    //将文件中的数据读入到对象数组中
    ifstream infile("score.dat",ios::in);  //以输入的方式打开文件
    if(!infile)       //测试是否成功打开
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    while(!infile.eof())
    {
        infile>>stud[i++];   //读数据中,人数等信息自动地记录到静态成员中,见运算符重载的实现
    }
    infile.close();

    //求总分平均并输出
    if(Student::get_stu_num()>0)
    {
        total_avg = Student::get_total_sum() / Student::get_stu_num();
        ofstream outfile("pass_score.dat",ios::out);
        if(!outfile)
        {
            cerr<<"open error!"<<endl;
            exit(1);
        }

        for(i=0; i<Student::get_stu_num(); i++)
        {
            if(stud[i].get_total()>total_avg&&stud[i].pass())
            {
                outfile<<stud[i]<<endl;
            }
        }
        outfile.close();
        cout<<"请到文件pass_score.dat中查看名单:"<<endl;
    }
    return 0;
}
时间: 2024-07-29 07:30:07

C++语言实践参考——用文件保存的学生名单的相关文章

《C语言及程序设计》实践参考——用文本文件保存的学生名单

返回:贺老师课程教学链接 [项目2-用文本文件保存的学生名单] 文件score.dat中保存的是若干名学生的姓名和C语言课.高数和英语成绩. (1)定义学生结构体,其中包含姓名.C++课.高数和英语成绩及总分数据成员. //定义学生结构体 typedef struct { string name; double cpp; double math; double english; double total; }Student (2)用对象数组进行存储学生的成绩,读入成绩并计算总分:将总分高于平均总

C++实践参考——存储班长信息的学生类

[项目 - 存储班长信息的学生类] class Stu //声明基类 { public: Stu(int n, string nam ); //基类构造函数 void display( ); //成员函数,输出基类数据成员 protected: //(*)访问权限为保护型的数据成员 int num; //学生学号 string name; //学生姓名 }; class StuDetail: public Stu //声明派生类StuDetail { public: //学生nam,学号n,a岁

《C语言及程序设计》实践参考——多科成绩单

返回:贺老师课程教学链接 [项目2-多科成绩单]某班不超过100名同学.用二维数组score[][4]保存同学们的高数.英语.C语言成绩及总成绩(在此假设学生的学号为整型的连续值,用数组的行下标作学号).在此基础上,完成下面的操作:(1)输入学生的实际人数num,在输入各科的成绩时,输入3科成绩后可以自动求出总分,并将数据全保存到数组中:(2)输出各门课及总分的最高成绩.最低成绩.平均成绩. #include <stdio.h> void input(double s[][4],int n);

在C#中如何将C语言编写的cpp文件编译为exe可执行文件

问题描述 由于老师的要求,在C语言编完主程序后需要c#搭建个界面.现在我有一个cpp源程序代码,请教在c#中如何实现点击一个按钮将其编译链接为exe.方便利用System.Diagnostics.Process.Start直接调用.初学c#,希望大家能具体讲讲.值的注意的是,我的C#平台仅为了实现功能的整合,所以把c转换为dll调用的方法不考虑 解决方案 解决方案二:功能的整合为什么要编译C的源码呢?难道你想做C的编译器吗?如果只是做界面的话把C编译成动态链接库用C#调用就可以了解决方案三:引用

通用 文件保存至数据库,从数据库写入磁盘 程序代码

程序|数据|数据库 通用 文件保存至数据库,从数据库写入磁盘 程序代码 ----20040809这几天我休假中,正好有时间继续编写mycodelibrary 1.5版,今天晚上刚好写到文件与数据库存入取出模块,在论坛上此问题见的也较多,所以特此公开此部分代码,供有需者参考使用.代码虽然可以完整的正常使用,但还是需要做些错误方面的处理. '欢迎你下载使用本代码,本份代码由程序太平洋提供下载学习之用'声明:'1.本站所有代码的版权归原作者所有,如果你使用了在本站下载的源代码' 引起的一切纠纷(后果)

java 下载 断点续传-用java语言从web下载文件到本地指定路径下

问题描述 用java语言从web下载文件到本地指定路径下 java语言实现从外部网站下载文件到我们公司的服务器上,支持断点续传并且用一个线程下载一个文件,请问哪位有什么思路或者源码参考.麻烦大家给我出出主意. 网上都是从服务器上下载到本地的案例.这种可以应用到我这种需求上吗? 顺便问下http协议和ftp协议下载文件是否支持下载到本地指定路径,对文件大小类型有没有限制. 解决方案 1.先用代码解析外部网站下载页面获取下载地址 2.代码实现http协议请求解析得到的下载地址,下载文件到本地 3.代

数据库-C#winfrom窗体程序怎么使用文件保存数据?

问题描述 C#winfrom窗体程序怎么使用文件保存数据? 5C 大神们我是一个刚学编程的小菜鸟现在想做一个可以给别人使用的C#窗体程序但现在使用的数据库是SQL2012考虑到给别人使用的话别人也需要安装SQL2012但SQL太大了不现实怎样才可以不适用数据库保存数据?或者使用文件来保存数据? 知道的大神可以加下我的QQ:1026644711 解决方案 百度:sqlite.这个是不需要安装就能操作的数据库 解决方案二: 推荐使用sql server localdb,它几乎和sql server完

代码-C语言 怎么播放音频文件

问题描述 C语言 怎么播放音频文件 求大神 刚学了C语言 想尝试播放音频 求助 求代码 解决方案 Windows文件夹下有一个Media文件夹,里面有很多这种波形文件,比如提示声.警报声.开机音乐等等. 解决方案二: 如果是wav那样的波形文件(Windows自带的录音机可以录制) 用PlaySound() API就可以播放. 解决方案三: 刚学了C语言,你是在什么系统下学习的?开发环境又是什么呢? Windows 系统,可以使用系统提供的 API 来完成播放:Linux 系统应该也类似吧! 如

让你提前认识软件开发(18):C语言中常用的文件操作函数总结及使用方法演示代码

第1部分 重新认识C语言 C语言中常用的文件操作函数总结及使用方法演示代码           在C语言中,有关文件操作的函数多达数十种,但并非每个函数都经常会被用到.        本文对实际软件开发项目中常用的C文件操作函数的用法进行了总结,并用实际的C代码来演示了它们的用法.   1. C语言中常用的文件操作函数总结 (1) fopen 作用:打开文件. 表头文件:#include <stdio.h> 定义函数:FILE *fopen(const char *path, const ch