第十四周項目二 用文件保存的學生名單

項目要求

文件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 <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;

//定義學生類
class Student
    {
public:
    //聲明必要的成員函數
    Student () {};
    double get_total();
    static int get_stu_num();
    static double get_total_sum();
    bool pass();
    friend ostream& operator <<(ostream&,Student&);
    friend istream& operator >>(istream&,Student&);
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::get_total()
    {
    return total;
    }
double Student::get_total_sum()
    {
    return total_sum;
    }
int Student::get_stu_num()
    {
    return stu_num;
    }
bool Student::pass()
    {

    if (math>59&&english>59&&cpp>59)
        return true;
    return false;
    }
istream& operator >>(istream& in,Student &s)
    {
    in>>s.name>>s.cpp>>s.math>>s.english;
    s.total=s.cpp+s.math+s.english;
    s.total_sum+=s.total;
    s.stu_num++;
    return in;
    }
ostream& operator <<(ostream& out,Student &s)
    {
    out<<s.name<<'\t'<<s.cpp<<'\t'<<s.math<<'\t'<<s.english<<'\t'<<s.total<<endl;
    return out;
    }


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)       //測試是否成功打開
        {
        cerr<<"open error!"<<endl;
        exit(1);
        }
    while(!infile.eof())
        {
        infile>>stud[i++];
        //讀數據中,人數等信息自動地記錄到靜態成員中,見運算符重載的實現
        }
    infile.close();

    if(t.get_stu_num()>0)
        {
        total_avg=t.get_total_sum()*1.0/t.get_stu_num();

        ofstream outfile("pass_score.dat",ios::out);
        outfile<<"本次考試平均分:"<<total_avg<<endl;
        for (i=0; i<t.get_stu_num(); i++)
            {
            if ((stud[i].pass()==true)&&(stud[i].get_total()>=total_avg))
                {
                outfile<<stud[i];

                }
            }
        cout<<"數據處理完畢,請到pass_score.dat查看總分高於平均總分且沒掛科的同學的信息。"<<endl;
        outfile.close();
        }


    //總分高於平均總分且沒掛科的同學的信息保存到文件pass_score.dat中
    return 0;
    }



運行結果




學習心得

1.重載運算符istream& operator >>(istream& in,Student &s)

一定要寫成Student &s而非Student s

2.之所以 if(t.get_stu_num()>0) 以及 total_avg=t.get_total_sum()*1.0/t.get_stu_num();

用Student類的t是因爲 stu_num和stu_num都是靜態函數 t即使沒被定義這兩項的值也是固定的

發佈了227 篇原創文章 · 獲贊 26 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章