課程首頁在:http://blog.csdn.net/sxhelijian/article/details/11890759。內有完整教學方案及資源鏈接
本程序中須要的相關文件。請到http://pan.baidu.com/s/1qW59HTi下載。
【項目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 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 <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 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);}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;
}
=================== 迂者 賀利堅 CSDN博客專欄================= |== IT學子成長指導專欄 專欄文章的分類文件夾(不定期更新) ==| |== C++ 課堂在線專欄 賀利堅課程教學鏈接(分課程年級) ==| |== 我寫的書——《逆襲大學——傳給IT學子的正能量》 ==| =====?為IT菜鳥起飛鋪跑道。和學生一起享受快樂和激情的大學 ===== |