第十四周 【项目2-用文件保存的学生名单】若干名学生的学号 姓名和C++课、高数和英语成绩

运行代码:

/*
*Copyright (c)2014,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:d.cpp
*作    者:张旺华
*完成日期:2015年6月3日
*版 本 号:v1.0
*/
/*
*【项目2-用文件保存的学生名单】
 * 文件score.dat中保存的是若干名学生的学号 姓名和C++课、高数和英语成绩。
 */
#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 num,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.num>>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.num<<"\t";
    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.txt",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;
}

测试数据:

201152501104 田程 65 69 68

201152501114 杨金龙 94 89 63

201152501115 周琳霄 92 84 60

201152501138 张强 67 62 84

201152501140 郑好 80 60 86

201152501145 曹为尚 88 56 67

201152501201 倪婷 80 92 71

201152501202 李奥 59 80 55

201152501203 张佳怡 62 62 95

201152501204 邓臣冬 100 65 91

201152501205 汪美娟 73 90 94

201152501206 赵格君 96 80 58

201152501207 张文韬 91 63 91

201152501208 车宜霖 88 84 79

201152501209 刘正 61 79 99

201152501210 李东航 62 58 66

201152501211 李华 96 96 83

201152501212 李晓鹏 73 88 93

201152501213 姜君孝 69 64 62

201152501214 董越 74 59 69

201152501215 赵浚源 63 58 96

201152501216 宫凡奇 89 82 60

201152501217 张咏晖 94 89 77

201152501218 丁梦瑶 78 93 58

201152501219 金婷 75 87 84

201152501220 张娟 90 65 62

201152501221 姜莉 76 78 81

201152501222 孙亚雯 90 87 73

201152501223 郭重 88 68 63

201152501224 王潇哲 85 94 97

201152501225 宋心洁 99 69 82

201152501226 杜婧霏 91 80 98

201152501227 于晓霞 69 72 99

201152501228 王莉莉 84 95 94

201152501229 万雅璐 98 95 64

201152501230 曲淑霞 67 100 83

201152501231 高晶 98 81 67

201152501232 于泽莹 67 64 77

201152501233 李婧怡 84 72 90

201152501234 姚宇 92 78 95

201152501235 于超 87 82 86

201152501236 李剑 78 86 95

201152501237 孟雨薇 66 64 58

201152501238 孙华泽 98 98 74

201152501239 朱绮梦 73 83 96

201152501240 周易 56 69 84

201152501241 蔡庆 60 78 71

201152501242 姜懿宸 86 94 59

201152501243 孙雪梅 64 92 66

201152501244 李芊潭 97 100 55

201152501245 周祥 100 86 74

201152501246 吐鲁洪江 73 94 75

201153503240 王婷婷 68 73 69

201153503242 宗雪燕 60 82 61

201153503243 于小涵 79 60 78

201153503245 钟艺 82 91 97

201153503246 耿清敏 67 77 60

201153503248 耿梦启 79 100 57

201153503249 刘轩辰 59 86 90

201153503251 贺巧霞 56 87 88

201153503254 张丽芳 57 81 87

201154503207 刘蕊 57 89 69

201158501330 李涛 96 89 73

201158501332 张新明 68 59 64

201158501334 曹文战 82 89 73

201160602108 孔令涛 63 86 80

201160602124 刘大伟 96 69 98

201163501101 孟站 58 100 70

201163501102 王超奇 75 63 89

201163501104 周涛 68 95 84

201163501105 贾治国 86 84 100

201163501106 杨磊 92 66 88

201163501107 万建新 71 56 83

201163501108 李宁 70 95 73

201163501110 赵江彦 58 63 79

201163501111 杜俊一 61 75 70

201163501113 邢士峰 56 70 66

201163501114 李传良 95 90 86

pass 数据

201152501114 杨金龙
94 89
63 246

201152501115 周琳霄
92 84
60 236

201152501201 倪婷
80 92
71 243

201152501204 邓臣冬
100 65
91 256

201152501205 汪美娟
73 90
94 257

201152501207 张文韬
91 63
91 245

201152501208 车宜霖
88 84
79 251

201152501209 刘正
61 79
99 239

201152501211 李华
96 96
83 275

201152501212 李晓鹏
73 88
93 254

201152501217 张咏晖
94 89
77 260

201152501219 金婷
75 87
84 246

201152501221 姜莉
76 78
81 235

201152501222 孙亚雯
90 87
73 250

201152501224 王潇哲
85 94
97 276

201152501225 宋心洁
99 69
82 250

201152501226 杜婧霏
91 80
98 269

201152501227 于晓霞
69 72
99 240

201152501228 王莉莉
84 95
94 273

201152501229 万雅璐
98 95
64 257

201152501230 曲淑霞
67 100
83 250

201152501231 高晶
98 81
67 246

201152501233 李婧怡
84 72
90 246

201152501234 姚宇
92 78
95 265

201152501235 于超
87 82
86 255

201152501236 李剑
78 86
95 259

201152501238 孙华泽
98 98
74 270

201152501239 朱绮梦
73 83
96 252

201152501245 周祥
100 86
74 260

201152501246 吐鲁洪江
73 94
75 242

201153503245 钟艺
82 91
97 270

201158501330 李涛
96 89
73 258

201158501334 曹文战
82 89
73 244

201160602124 刘大伟
96 69
98 263

201163501104 周涛
68 95
84 247

201163501105 贾治国
86 84
100 270

201163501106 杨磊
92 66
88 246

201163501108 李宁
70 95
73 238

201163501114 李传良
95 90
86 271

学习心得:

一开始一直无法存入数据,后发现是因为数据太大,超出double 的范围

float       32            6-7               -3.4*10(-38)~3.4*10(38)
double      64           15-16            -1.7*10(-308)~1.7*10(308)
long double 128          18-19         -1.2*10(-4932)~1.2*10(4932)

后修改了数据!和减少数据!

最终代码:

/*
*Copyright (c)2014,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:d.cpp
*作    者:张旺华
*完成日期:2015年6月3日
*版 本 号:v1.0
*/
/*
*【项目2-用文件保存的学生名单】
 * 文件score.dat中保存的是若干名学生的学号 姓名和C++课、高数和英语成绩。
 */
#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    int get_total_sum();
    friend istream& operator>>(istream &in, Student &s);  //可以定义input函数替代
    friend ostream& operator<<(ostream &out, Student &s); //可以定义display函数替代
    bool pass();
private:
    string num,name;
    double cpp;
    double math;
    double english;
    double total;
    static int stu_num;  //学生人数,处理为类的静态成员合适
    static  int  total_sum; //学生总分和
};

int Student::stu_num = 0;
int  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;
}

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

istream& operator>>(istream &in, Student &s)
{
    in>>s.num>>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.num<<"\t";
    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.txt",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-09-03 16:08:01

第十四周 【项目2-用文件保存的学生名单】若干名学生的学号 姓名和C++课、高数和英语成绩的相关文章

第十四周项目1-小玩文件

(1)下面程序的功能是统计文本文件abc.txt中的字符个数,请填空将程序补充完整. #include <iostream> #include <cstdlib> #include <fstream> // (1) using namespace std; int main() { fstream file; file.open("abc.txt", ios::in); // (2) if(!file) { cout<<"abc

第十四周项目2:用文件保存的学生名单

问题及代码: /* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:project.cpp *作 者:陈文青 *完成日期:2015年6月16日 *版 本 号:v1.0 * *问题描述: (1)定义学生类,其中包含姓名.C++课.高数和英语成绩及总分数据成员. (2)用对象数组进行存储学生的成绩,读入成绩并计算总分:将总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中. *程序输入: *程序输出:

第十四周项目2-用文件保存的学生名单

文件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 t

第14周上机实践项目2——用文件保存的学生名单

(1)定义学生类,其中包含姓名.C++课.高数和英语成绩及总分数据成员. (2)用对象数组进行存储学生的成绩,读入成绩并计算总分:将总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中. 代码 #include <iostream> #include <fstream> #include <cstdlib> using namespace std; //定义学生类 class Student { public: //声明必要的成员函数 Stude

第14周 项目二-用文件保存学生名单

文件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 t

十四周 项目 1 动物这样叫

#include <iostream> #include <string> using namespace std; class Animal { public: virtual void cry() { cout<<"不知哪种动物,让我如何学叫?"<<endl; } }; class Mouse:public Animal { public: Mouse(string nam,char s):name(nam),sex(s) {} vo

第十四周(小玩文件)

*/ copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:第十四周(小玩文件) *作者:王忠 *完成日期:2015.6.09 版本号:v1.0 * *问题描述:下面程序的功能是将文本文件abc.txt中的所有行加上行号后写到newabc.txt文件中,请填空将程序补充完整. *输入描述: *程序输出: #include <iostream> #include <cstdlib> #include <fstream&g

第十四周 项目一 小玩文件

<span style="font-size:18px;">[项目1 - 小玩文件] (1)下面程序的功能是统计文本文件abc.txt中的字符个数,</span> <span style="font-size:18px;">#include <iostream> #include <cstdlib> #include <fstream>// //fstream提供了三个类,用来实现c++对文件的

第十四周 项目三 电子词典

/* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:d.cpp *作 者:张旺华 *完成日期:2015年6月3日 *版 本 号:v1.0 */ /*项目3-OOP版电子词典] 做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个, 英文.中文释义与词性间用'\t'隔开. (1)编程序,由用户输入英文词,显示词性和中文释义. 提示1:如果要用OOP完成这个词典(当然也