C++第16周项目2 -挂科的不进新名单

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/9078413

【项目2】挂科的不进新名单
   文件score.dat中保存的是若干名学生的姓名和C++课、高数和英语成绩。
   (1)定义学生类,其中包含姓名、C++课、高数和英语成绩及总分数据成员,成员函数根据需要确定。
   (2)读入学生的成绩,计算总分,用对象数组进行存储。
   (3)将总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中。
【项目2-拓展】将读入的数据用链表处理如何做(可以不必完成排序功能)?

参考解答:

#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);
    friend ostream& operator<<(ostream &out, Student &s);
    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);
        }
        cout<<"请到文件pass_score.dat中查看名单:"<<endl;
        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();
    }
    return 0;
}
时间: 2024-08-01 10:02:30

C++第16周项目2 -挂科的不进新名单的相关文章

2013-C++第16周项目参考解答链接集

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目2-指来指去]设计一个程序,利用指针完成下面的工作(1)下面的程序,输入10 100和100 10,均可以输出max=100 min=10,请补充完整程序 #include <iostream> using namespace std; int main( ) { int *p1,*p2,a,b,t; cin>>a>>b; p1=&

C++第16周项目2——带姓名的成绩单(字符数组版)

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目2-带姓名的成绩单(字符数组版)](参考15周项目3)设score数组中存储同学们的C++成绩,增加一个数组char name[][20]并赋初值,表示同学们的姓名(注意:本周不使用更方便的string类).这两个数组中,同学的姓名与成绩的下标保持一致(例如name[1]和score[1]表示同一位同学的姓名和C++成绩).请(1)输出按成绩排序后的同学的名单:(2

2014秋C++第16周 项目 指针和数组、函数

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目1-数组的排序]按给定部分程序的要求,用指向数组的指针变量作为形式参数编写函数,完成排序.重点体会:(1)排序算法,可以是冒泡,也可以是选择:(2)用指向数组的指针变量作为形式参数,用数组名(即数组的地址)作为实际参数,函数中对于形参的改变实质上也就是对实参对应内存单元的改变:(3)形

2014秋C++第16周 项目1参考 数组的排序

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目1-数组的排序]按给定部分程序的要求,用指向数组的指针变量作为形式参数编写函数,完成排序.重点体会:(1)排序算法,可以是冒泡,也可以是选择:(2)用指向数组的指针变量作为形式参数,用数组名(即数组的地址)作为实际参数,函数中对于形参的改变实质上也就是对实参对应内存单元的改变:(3)形

C++第15周项目4——多科成绩单

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目4-多科成绩单]用二维数组score[][4]保存同学们的高数.英语.C++成绩及总成绩(在此假设学生的学号为整型的连续值,用数组的行下标作学号).在此基础上,完成下面的操作:(1)设计输入成绩的函数,输入3科成绩后可以自动求出总分,并将数据全保存到数组中:(2)输出各门课及总分的最高成绩.最低成绩.平均成绩和成绩的标准偏差:(3)输出考得总分最高.最低同学的人数及

C++第16周项目5——填空学指针

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目5-填空学指针]采用指针访问方式从键盘给数组a[N]输入数据,然后对元素值重新按逆序存放并输出.请补充完整下面的程序. #include <iostream> using namespace std; const int N=8; int main() { int a[N],*p,*q; for(p=a; p<a+N; p++) ___(1)___; p=a

2014秋C++第16周 项目2参考 用指针玩字符串

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目2-用指针玩字符串] 指针是神奇的,指向整型的指针int *p1,可以操作整型数组int a[]:指向字符型的指针char *p2,可以操作字符数组(字符串)char str[]:更灵活的是,在函数的传递中,指针.数组名在一定程度上可以互换.请编制函数,对字符串的进行各种操作. 序 功

2014秋C++第16周 项目3参考 用函数指针调用函数

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目3-用函数指针调用函数] 将下面的程序补充完整(包括定义函数),使其能够完成图示的功能.请使用已有程序的风格. void eat(); void sleep(); void hitdoudou(); void run(void (*f)()); int main() { int iCh

C++第16周项目4——指来指去

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目4-指来指去]设计一个程序,利用指针完成下面的工作(1)下面的程序,输入10 100和100 10,均可以输出max=100 min=10,请补充完整 #include <iostream> using namespace std; int main( ) { int *p1,*p2,a,b,t; cin>>a>>b; p1=&a;