項目要求
文件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即使沒被定義這兩項的值也是固定的