//////////////////////////////////////////////////////////////////////////////////////////////////
// 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