[源代碼] [東南大學]學分績點計算器gpa 1.0.2 升級版

//////////////////////////////////////////////////////////////////////////////////////////////////
//                            CopyRight 2011                                                    //
//////////////////////////////////////////////////////////////////////////////////////////////////
//                            By 張哲                                                           //
//////////////////////////////////////////////////////////////////////////////////////////////////
//                            東南大學--儀器科學與工程學院                                       //
/////////////////////////////////////////////////////////////////////////////////////////////////



#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<iomanip>
#include<vector>
#include<algorithm>
#include<numeric>
#include<functional>

using namespace std;




class Course{
private:
	int no;//序號
	string year;//學年學期
	int code;//課程代碼
	string name;//課程名稱
	float credit;//學分
	int score;//成績
	string quality;//成績性質
	string courseQua;//課程性質
	float gpa;//績點,(非績點和)


public:
	//構造與析構 及賦值運算符
	Course(){}
	Course(int noV,string yearV,int codeV,string nameV,float creditV,int scoreV,string qualityV,string courseQuaV="#")
		:no(noV),year(yearV),code(codeV),name(nameV),credit(creditV),score(scoreV),quality(qualityV),courseQua(courseQuaV){}
	Course(const Course& temp)
	{
		no = temp.no;
		year = temp.year;
		code = temp.code;
		name = temp.name;
		credit = temp.credit;
		score = temp.score;
		quality = temp.quality;
		courseQua = temp.courseQua;
		gpa = temp.gpa;
	}
	~Course(){}
	Course& operator = (const Course& temp)
	{
		no = temp.no;
		year = temp.year;
		code = temp.code;
		name = temp.name;
		credit = temp.credit;
		score = temp.score;
		quality = temp.quality;
		courseQua = temp.courseQua;
		gpa = temp.gpa;
		return *this;
	}
	
	//訪問器成員函數
	string getYear() const {return year;}
	string getName() const {return name;}
	float getCredit() const {return credit;}
	float getGpa() const {return gpa;}
	int getScore() const {return score;}


	//mutator 函數
	void set(int noV,string yearV,int codeV,string nameV,float creditV,int scoreV,string qualityV,string courseQuaV="#")
	{
		no=noV;
		year=yearV;
		code=codeV;
		name=nameV;
		credit=creditV;
		score=scoreV;
		quality=qualityV;
		courseQua=courseQuaV;
	}
	void setGpa()
	{
		if(score<60) gpa = 0;
		if(score>=60&&score<=62) gpa = 1.0;
		if(score>=63&&score<=65) gpa = 1.5;
		if(score>=66&&score<=69) gpa = 1.8;
		if(score>=70&&score<=72) gpa = 2.0;
		if(score>=73&&score<=75) gpa = 2.5;
		if(score>=76&&score<=79) gpa = 2.8;
		if(score>=80&&score<=82) gpa = 3.0;
		if(score>=83&&score<=85) gpa = 3.5;
		if(score>=86&&score<=89) gpa = 3.8;
		if(score>=90&&score<=92) gpa = 4.0;
		if(score>=93&&score<=95) gpa = 4.5;
		if(score>=96&&score<=100) gpa = 4.8;
	}

	void show()
	{
	cout<<left<<setw(10)<<year<<setw(36)<<name;
	cout<<setw(5)<<credit<<setw(5)<<score;
	cout<<setw(6)<<quality<<setw(6)<<gpa<<endl;
	}

	//運算符重載
	bool operator < (const Course& temp) const
	{
		if(score < temp.score) return true;
		else return false;
	}

	bool operator > (const Course& temp) const
	{
		if(score > temp.score) return true;
		else return false;
	}


friend class List;
	
};


class CourseSigma: public Course
{
private:
	float creditPlusGpa;
public:
	CourseSigma(const Course& temp):Course(temp),creditPlusGpa(temp.getCredit() * temp.getGpa()){}
	bool operator < (const CourseSigma& temp) const
	{
		return creditPlusGpa < temp.creditPlusGpa? true : false ;
	}

	bool operator > (const CourseSigma& temp) const
	{
		return creditPlusGpa > temp.creditPlusGpa? true : false ;
	}

	void show()
	{
	cout<<left<<setw(10)<<getYear()<<setw(36)<<getName();
	cout<<setw(5)<<getCredit()<<setw(5)<<getScore();
	cout<<setw(6)<<getGpa()<<setw(5)<<creditPlusGpa<<endl;
	}
};


class List{
public:
	vector<Course> data;
	
public:
	List(){}
	~List(){}

	//
	void add(const Course& temp){data.push_back(temp);}//在矢量尾添加一個元素
	void sort_des(){sort( data.begin() , data.end() , less<Course>() );}//升序排序
	void sort_asc(){sort( data.begin() , data.end() , greater<Course>() );}//降序排序
	void clear_list(){ data.clear(); }

	int getAmount()
	{
		int count = 0 ;
		vector<Course>::iterator iter = data.begin();
		while( iter != data.end() )
		{
			count++;
			iter++;
		}
		return count;		
	}

	void show()
	{	int i=0;
		vector<Course>::iterator iter = data.begin();
		while( iter != data.end() )
		{cout<<left<<setw(3)<<i++;		iter++->show();}
	}

	//用於輸出運算後的內容

	float getCreditSum()//獲得學分和
	{
		float sum = 0;
		vector<Course>::iterator iter = data.begin();
		while( iter != data.end() )
		{
			sum += iter->getCredit();
			iter ++;
		}
		return sum;
	}
	float getGpaSum()//獲得績點和(Σ學分*績點)
	{
		float sum = 0;
		vector<Course>::iterator iter = data.begin();
		while( iter != data.end() )
		{
			sum += ( (iter->getCredit()) * (iter->getGpa()) );
			iter++;
		}

		return sum;
	}

	float getAverageGpa(){return getGpaSum()/getCreditSum(); }
	

};


void declaration();//用於在程序之前輸出內容聲明
void stat_a();
void stat_b();
void stat_c();
void stat_d();
void stat_e();


List list;//數據矢量作爲全局對象
float gpa_sum = 0;
float credit_sum = 0;
float average_gpa = 0;
List list2;
void function1_b();
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////

int main()
{	
	declaration();

	//功能實現
	//打開文件,載入數據,生成數據庫, 顯示數據
	ifstream infile;
	infile.open("1.txt");
	if(!infile) cout<<"文件打開失敗! @_@# 請確認您的工作目錄下包含文件\"1.txt\" !"<<endl;
	else
	{
		cout<<"\a數據開始載入!"<<endl<<endl;
		int no;//序號 0
		string year;//學年學期 1
		int code;//課程代碼 2
		string name;//課程名稱 3
		float credit;//學分 4
		int score;//成績 5
		string quality;//成績性質 6
		string courseQua;//課程性質 7

		Course courseTemp;
		string::size_type pos[10]={0};
		string data[8];
		string buf;//存儲從文件中讀來的一行數據
		

		while( getline( infile , buf ) )
		{
			istringstream inStr;
			istringstream inStr2,inStr4,inStr5;

			pos[0] = buf.find_first_not_of(" ");
			pos[1] = buf.find_first_of(" " , pos[0] );
			data[0] = buf.substr(pos[0] , pos[1]-pos[0]);					
			//cout<<data[0]<<"x"<<endl;
			if(data[0] != "序號") {inStr.str(data[0]); inStr>>no;inStr.sync();}
			else continue;
			
			for(int i = 1 ; i <= 6 ; i ++ )
			{	
				pos[i] = buf.find_first_not_of(" ", pos[i] );
				pos[i+1] = buf.find_first_of(" " , pos[i] );
				data[i] = buf.substr(pos[i] , pos[i+1]-pos[i]);
				
				//cout<<data[i]<<endl;
				/*switch(i)
				{
				case 1:year = data[1]; break;
				case 2:{istringstream inStr2(data[2]); inStr>>code; break;}
				case 3:name = data[3]; break;
				case 4:{istringstream inStr4(data[4]); inStr>>credit; break;}
				case 5:{istringstream inStr5(data[5]); inStr>>score; break;}
				case 6:quality = data[6]; break;
				}*/
			}
			year = data[1];
			inStr2.str( data[2] ); inStr2>>code;//cout<<inStr2.str()<<"  "<<code<<endl;
			name = data[3];
			inStr4.str( data[4] ); inStr4>>credit;//cout<<inStr4.str()<<"  "<<credit<<endl;
			if( data[5] == "優" ) score = 95;
			else if( data[5] == "良" ) score = 85;
			else if( data[5] == "中" ) score = 75;
			else if( data[5] == "及格" ) score = 65;
			else if( data[5] == "不及格" ) score = 0;
			else
			{inStr5.str( data[5] ); inStr5>>score;}//cout<<inStr5.str()<<"  "<<score<<endl;}
			quality = data[6];

			//cout<<left<<setw(2)<<no<<left<<setw(10)<<year<<left<<setw(30)<<name<<left<<setw(5)<<credit<<left<<setw(5)<<score<<left<<setw(6)<<quality<<endl;
			courseTemp.set(no , year , code , name , credit , score , quality);
			courseTemp.setGpa();
			list.add(courseTemp);
		}
	
	}

	//進行各門課程績點的計算與設置




	cout<<endl<<"數據載入成功!可以進行運算了。"<<endl<<endl;
	
	list.show();cout<<endl;
	system("pause");
	cout<<"--------------------------------\a我是華麗的分割線------------------------------"<<endl<<endl;

	


	//進入功能菜單
	cout<<"請選擇:"<<endl;
	cout<<"  a.我要查看 降序排列的成績;\n\n  b.我要查看 降序排列的 學科總績點(= 學分 x 績點);\n\n  c.我要查看 平均績點。\n"<<endl<<endl;
	cout<<"請選擇 (不區分大小寫): ";
	char choice = '0';
	cin>>choice;
	cout<<endl;
	bool end=false;
	while( 1 )
	{
		switch(choice)
		{
		case 'a': case 'A': cout<<"-----------------------------------------------------------------------------\n"<<endl;cout<<"\a按成績從高到低: \n"<<endl; list.sort_asc();list.show();cout<<endl;break;
		case 'b': case 'B': cout<<"-----------------------------------------------------------------------------\n"<<endl;function1_b();cout<<'\a'<<endl;break;
		case 'c': case 'C': 
			{
				cout<<"-----------------------------------------------------------------------------\n"<<endl;
				cout<<"\a您的 "<<list.getAmount()<<" 門成績:  總學分爲: "<<list.getCreditSum()<<" ; 平均績點爲: "<<list.getAverageGpa()<<" 。"<<endl;
				end=true;cout<<endl;break;
			}
		default: cout<<"對不起,您的輸入有誤!"<<endl<<endl;cout<<"\a-----------------------------------------------------------------------------\n"<<endl;
		}
	system("pause");
	cin.sync();//【】刷新cin緩衝區??
	if( end == true ) 	{cout<<"--------------------------------\a我是華麗的分割線------------------------------"<<endl;break;}
	cout<<"--------------------------------\a我是華麗的分割線------------------------------\n"<<endl;
	cout<<"  a.我要查看 降序排列的成績;\n\n  b.我要查看 降序排列的 學科總績點(= 學分 x 績點);\n\n  c.我要查看 平均績點。\n"<<endl<<endl;
	cout<<"請選擇 (不區分大小寫): ";
	cin>>choice;
	cout<<endl;
	}
	

	::gpa_sum = list.getGpaSum();
	::credit_sum = list.getCreditSum();
	::average_gpa = list.getAverageGpa();

	ofstream out;
	out.open("成績結果輸出.txt");
	out<<"您的總學分爲: "<< credit_sum <<endl;
	out<<"您的所有課程的平均績點爲:"<< average_gpa <<endl;
	out<<"\n"<< endl <<endl;
	//out.close();
	


	//統計功能
	/*
	1.按學期。學年 統計學分和績點
	2.低於平均績點的學科,對績點貢獻
	3.高於平均績點的學科,
	4.最不淡定的成績,高一分則增加多少績點
	*/
	
	end=false;
	while(true)
	{
		cout<<endl<<endl;
		cout<<"【統計功能菜單】\n"<<endl;
		cout<<"請 選 擇 :\n"<<endl;
		cout<<"a.查看【低於平均績點】的學科;\n"<<endl;
		cout<<"b.查看【高於平均績點】的學科;\n"<<endl;
		cout<<"c.查看各【學期】獲得的學分、績點;\n"<<endl;
		cout<<"d.查看各【學年】獲得的學分、績點;\n"<<endl;
		cout<<"e.查看讓你【不淡定】的學科。\n"<<endl;
		cout<<"f.退出。\n"<<endl;
		cout<<"請 選 擇 :";

		cin>>choice;
		cout<<"\n"<<endl;
		cin.sync();
		cout<<endl;
		switch(choice)
		{
		case 'a': case 'A': stat_a(); break;
		case 'b': case 'B': stat_b(); break;
		case 'c': case 'C': stat_c(); break;
		case 'd': case 'D': stat_d(); break;
		case 'e': case 'E': stat_e(); break;
		case 'f': case 'F': cout<<"感謝您的使用!\n"<<endl; end=true; break;
		default: 
			cout<<"對不起,您的輸入有誤!"<<endl<<endl;
			cout<<"\a-----------------------------------------------------------------------------\n"<<endl;
		}

		if( end ) break;
	
	}






cout<<"\a\a\a\a\aBy 張哲 [儀器科學與工程學院] 2010級\n"<<endl;
cout<<"程序終止。\n"<<endl;
system("pause");
system("pause");
return 0;
}



///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


void function1_b()
{
	vector<CourseSigma> list3;
	vector<Course>::iterator iter = ::list.data.begin();
	while( iter != ::list.data.end() )
	{
		//(*iter).show();
		list3.push_back(CourseSigma(*iter));
		iter++;
	}

	sort(list3.begin(), list3.end(), greater<CourseSigma>() );

	cout<<left<<setw(10)<<"學年:"<<setw(36)<<"學科:"<<setw(5)<<"學分:"<<setw(5)<<"成績:"<<setw(6)<<"績點:"<<setw(5)<<"學分 x 績點"<<endl;

	vector<CourseSigma>::iterator iter2 = list3.begin();
	while( iter2 != list3.end())
		(*iter2++).show();

	cout<<endl<<endl;
}



void stat_a()//【低於平均績點】
{
	cout<<"-----------------------------------------------------------------------------\n"<<endl;
	list2.clear_list();
	for(vector<Course>::iterator iter = list.data.begin() ; iter < list.data.end() ; iter ++ )
	{
		if( iter->getGpa() < ::average_gpa ) list2.add(*iter);
	}
	
	cout<<"您的【低於】平均績點的課程如下:"<<endl<<endl;
	list2.show();
	cout<<endl<<endl;

	cout<<"--------------------------------\a我是華麗的分割線------------------------------"<<endl<<endl;
	system("pause");
}
void stat_b()//【高於平均績點】
{
	cout<<"-----------------------------------------------------------------------------\n"<<endl;
	list2.clear_list();
	for(vector<Course>::iterator iter = list.data.begin() ; iter < list.data.end() ; iter ++ )
	{
		if( iter->getGpa() > ::average_gpa ) list2.add(*iter);
	}
	
	cout<<"您的【高於】平均績點的課程如下:"<<endl<<endl;
	list2.show();
	cout<<endl<<endl;

	cout<<"--------------------------------\a我是華麗的分割線------------------------------"<<endl<<endl;
	system("pause");
}
void stat_c()//【學期】
{
	cout<<"-----------------------------------------------------------------------------"<<endl;
	vector<string> semester_list;
	semester_list.push_back(list.data.front().getYear());
	bool is_inList = false;
	for(vector<Course>::iterator iter = list.data.begin()+1; iter != list.data.end(); iter++)
	{
		for(vector<string>::iterator iter2 = semester_list.begin(); iter2 != semester_list.end(); iter2++)
		{
			if((*iter).getYear() == *iter2) { is_inList = true ; break;}
		}

		if(is_inList == false) 
		{
			//cout<<(*iter).getYear()<<endl;
			semester_list.push_back((*iter).getYear());
			
		}
	is_inList = false ;
	}

	int count_years = semester_list.size();
	vector< vector<Course> > list_by_year(count_years);
	vector< vector<Course> >::iterator iter_complex = list_by_year.begin();
	vector<Course>::iterator iter_Course;
	vector<string>::iterator iter_string;
	for(iter_string = semester_list.begin(); iter_string != semester_list.end(); iter_string++)
	{
		for(iter_Course = ::list.data.begin(); iter_Course != ::list.data.end(); iter_Course++)
		{
			if((*iter_string) == (*iter_Course).getYear() ) (*iter_complex).push_back(*iter_Course);
		}
		iter_complex++;
	}

	for(iter_complex = list_by_year.begin(); iter_complex != list_by_year.end(); iter_complex++)
	{
		cout<<endl;
		cout<<(*iter_complex).front().getYear()<<"學期 :\n "<<endl;
		/*
		for(iter_Course = (*iter_complex).begin(); iter_Course != (*iter_complex).end(); iter_Course++)
		{
			(*iter_Course).show();
		}
		*/

		List list_temp;
		list_temp.data.assign((*iter_complex).begin(),(*iter_complex).end());
		list_temp.show();
		cout<<endl;
		cout<<"該學期您取得的總學分爲:"<<list_temp.getCreditSum() <<"		平均績點爲:"<<list_temp.getAverageGpa() <<endl;
		cout<<endl;
		cout<<"-----------------------------------------------------------------------------"<<endl;
	
	}

	cout<<'\a'<<endl;
system("pause");
}
void stat_d()//【學年】
{
	cout<<"-----------------------------------------------------------------------------"<<endl;
	vector<string> semester_list;
	semester_list.push_back(list.data.front().getYear().substr(0,5));
	bool is_inList = false;
	for(vector<Course>::iterator iter = list.data.begin()+1; iter != list.data.end(); iter++)
	{
		for(vector<string>::iterator iter2 = semester_list.begin(); iter2 != semester_list.end(); iter2++)
		{
			if((*iter).getYear().substr(0,5) == *iter2) { is_inList = true ; break;}
		}

		if(is_inList == false) 
		{
			//cout<<(*iter).getYear()<<endl;
			semester_list.push_back((*iter).getYear().substr(0,5));
			
		}
	is_inList = false ;
	}

	int count_years = semester_list.size();
	vector< vector<Course> > list_by_year(count_years);
	vector< vector<Course> >::iterator iter_complex = list_by_year.begin();
	vector<Course>::iterator iter_Course;
	vector<string>::iterator iter_string;
	for(iter_string = semester_list.begin(); iter_string != semester_list.end(); iter_string++)
	{
		for(iter_Course = ::list.data.begin(); iter_Course != ::list.data.end(); iter_Course++)
		{
			if((*iter_string) == (*iter_Course).getYear().substr(0,5) ) (*iter_complex).push_back(*iter_Course);
		}
		iter_complex++;
	}

	for(iter_complex = list_by_year.begin(); iter_complex != list_by_year.end(); iter_complex++)
	{
		cout<<endl;
		cout<<(*iter_complex).front().getYear().substr(0,5)<<"學年 :\n "<<endl;
		/*
		for(iter_Course = (*iter_complex).begin(); iter_Course != (*iter_complex).end(); iter_Course++)
		{
			(*iter_Course).show();
		}
		*/

		List list_temp;
		list_temp.data.assign((*iter_complex).begin(),(*iter_complex).end());
		list_temp.show();
		cout<<endl;
		cout<<"該學年您取得的總學分爲:"<<list_temp.getCreditSum() <<"		平均績點爲:"<<list_temp.getAverageGpa() <<endl;
		cout<<endl;
		cout<<"-----------------------------------------------------------------------------"<<endl;
	
	}

	cout<<'\a'<<endl;

system("pause");
}
void stat_e()//【不淡定】2,5,9
{
	cout<<"-----------------------------------------------------------------------------\n"<<endl;
	cout<<"功能簡介:\n"<<endl;
	cout<<"此功能將統計您的成績的個位爲[2,5,9]的學科\n\n在此情況下,當您的成績再增加1分,您的績點會相應的上升一個等級.\n\n"<<endl;
	cout<<"友情提示:\n\n  老師必定也不會故意將您的成績績點降低等級的,要相信老師已經努力幫您提分了\n\n  所以當您看到結果時,就請不要在心中默默問候老師了.....囧rz\n\n"<<endl;
	vector<Course> list_NotCalm;
	int mod = 0;
	for(vector<Course>::iterator iter = list.data.begin(); iter != list.data.end(); iter++)
	{
		mod = (*iter).getScore()%10;
		if(mod == 2 || mod == 5 || mod == 9)
			list_NotCalm.push_back(*iter);
	}
	
	if(list_NotCalm.size() == 0) cout<<"恭喜您!老師都很給力啊!"<<endl;
	else
	{
		cout<<left<<setw(10)<<"學年:"<<setw(36)<<"學科:"<<setw(5)<<"學分:"<<setw(5)<<"成績:"<<setw(6)<<"性質:"<<setw(6)<<"績點:"<<endl;
		for(vector<Course>::iterator iter2 = list_NotCalm.begin(); iter2 != list_NotCalm.end(); iter2++)
			(*iter2).show();
	}
	cout<<endl;
	cout<<"-----------------------------------------------------------------------------"<<endl;
	cout<<'\a'<<endl;

system("pause");
}




void declaration()//用於在程序之前輸出內容聲明
{	//cout<<""<<endl;   cout<<endl;  

	cout<<"********************************************"<<endl;//再版聲明
	cout<<"*【東南大學】 學分績點計算器  1.0.2 升級版 *"<<endl;
	cout<<"********************************************"<<endl;
	cout<<"                                 -----By 張哲  "<<endl;
	cout<<"                    -----From 【220儀科學院】"<<endl;
	cout<<"                                2011/7/5 發佈"<<endl;
	cout<<""<<endl;//程序使用說明
	cout<<"What's NEW !(新版本更新了什麼功能)"<<endl;//what's  new
	cout<<"1.美化輸出格式;\n\n2.使用STL庫,優化內存管理;\n\n3.新增計算總學分功能;\n\n4.新增多種績點分析功能;\n\n5.優化了數據讀入,無需手動修改\"優良中及格\"形式的成績。\n"<<endl;

	cout<<"請按任意鍵,進入 “使用說明” 界面。\n"<<endl;
	system("pause");
	cout<<"--------------------------------\a我是華麗的分割線------------------------------"<<endl;

	cout<<"\n\n【使 用 說 明 :】"<<endl<<endl;
	cout<<"1.打開校園網的【學生登錄】網頁,並登入【成績服務】--【成績查詢】;\n"<<endl;
	cout<<"2.將成績表格全部複製下來(【注意】:最下面的【學年】和【總學分】兩行不要!);\n"<<endl;
	cout<<"3.將剛剛複製的表格粘貼在 ”1.txt“。【 請保證文件與該程序在【同一目錄下】 】;\n"<<endl;
	cout<<"4.請自行刪去【不計算績點】的諸如人文,經管,自然科學等課程;\n"<<endl;
	cout<<"5.如果您確保以上操作已經正確執行,\n"<<endl;
	system("pause");
	//cout<<"\n"<<endl;
	//cout<<"\n"<<endl;


	
	cout<<endl;  
	cout<<endl;  
	cout<<"--------------------------------\a我是華麗的分割線------------------------------"<<endl;
}



第一版 源碼 地址:

http://blog.csdn.net/zz457887107/article/details/6565364

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章