第13周-專案2-用檔案儲存的學生名單

kewlgrl發表於2015-06-08
問題及程式碼:

/*   
*Copyright (c)2015,煙臺大學計算機與控制工程學院   
*All rights reserved.   
*檔名稱:File.cpp   
*作    者:單昕昕   
*完成日期:2015年6月8日   
*版 本 號:v1.0   
*問題描述:
檔案score.dat中儲存的是若干名學生的姓名和C++課、高數和英語成績。
(1)定義學生類,其中包含姓名、C++課、高數和英語成績及總分資料成員。 
(2)用物件陣列進行儲存學生的成績,讀入成績並計算總分;將總分高於平均總分且沒掛科的同學的資訊儲存到檔案pass_score.dat中。
*程式輸入:檔案讀取。
*程式輸出:將總分高於平均總分且沒掛科的同學的資訊儲存到檔案pass_score.dat中。
*/ 
#include <iostream>
#include <cstdio>
#include <cstdlib>//為了使用exit()
#include <fstream>
using namespace std;
//定義學生類
class Student
{
public:
    //宣告必要的成員函式
    Student() {};
    double get_total();
    static int get_stu_num();
    static double get_total_sum();
    bool pass();
    friend istream& operator>>(istream &input, Student &s);
    friend ostream& operator<<(ostream &output, Student &s);
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;
}
int Student::get_stu_num()
{
    return stu_num;
}

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

bool Student::pass()
{
    return cpp>=60&&math>=60&&english>=60;
}
istream& operator>>(istream &input,Student &s)
{
    input>>s.name>>s.cpp>>s.math>>s.english;
    s.total=s.cpp+s.math+s.english;
    s.stu_num++;
    s.total_sum+=s.total;
    return input;
}

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

int main( )
{
    Student stud[200],t; //stud[200]為儲存資料的物件陣列
    string sname;
    double total_avg;
    int i=0,count=0;
    //從檔案score.dat中讀入資料,儲存到物件陣列中
    ifstream infile("score.dat",ios::in);
    if(!infile)
    {
        cout<<"Can’t open the file."<<endl;
        abort();
    }
    ofstream outfile("pass_score.dat",ios::out);//定義檔案流物件,開啟磁碟檔案"pass_score.dat"
    if(!outfile)
    {
        cout<<"Can’t open the file."<<endl;
        abort();
    }
    while(!infile.eof())
    {
        infile>>stud[count];
        count++;
    }
    infile.close();
    total_avg=Student::get_total_sum()/Student::get_stu_num();
    //總分高於平均總分且沒掛科的同學的資訊儲存到檔案pass_score.dat中
    for(i=0; i<count; i++)
    {
        if(stud[i].get_total()>total_avg&&stud[i].pass())
        {
            outfile<<stud[i]<<endl;
        }
    }
    outfile.close();
    cout<<"The datas have been writen to file. "<<endl;
    return 0;
}


執行結果:






知識點總結:

用檔案儲存的學生名單。

靜態資料成員。


學習心得:

靜態資料成員。。又。。忘。。了。。

成員函式很碎找不到頭緒,還是參考賀老師的才有思路然後做出來的。。

相關文章