題目內容:有一些班級的學生需要按績點計算並排名。每門課的成績只有在60分以上(含),才予以計算績點。課程績點的計算公式為:(課程成績-50)÷10×學分數。一個學生的總績點為其所有課程績點總和除以10.
輸入描述:輸入數據中含有一些班級(數量≤20)。第一行為班級數量。每個班級的第一行數據為n(≤10),表示該班級共有n門課程。每個班級的第二行數據為a1,a2,a3,……,an,表示每門課程的學分。班級數據中的第三行數據為一個整數m(≤50),表示本班級有m個學生;班級數據接下去有m行對應m個學生數據;每行學生數據中的第一個為字串s1(s1中間沒有空格),表示學生姓名,後面跟有n個整數s1,s2,s3,……sn,表示該學生各門課程的成績(0≤si ≤100).
輸出描述:以班級為單位輸出各個學生按績點分從大到小的排名。如果績點分相同,則按學生名字的ASCII串值從小到大排名。每個班級的排名輸出之前應先給出一行,描述班級序號“class #:”(#表示班級序號),班級之間應空出一行。排名時,每個學生占一行,列出名字和總績點。學生輸出寬度為10個字符,左對齊,在空出一格後列出總績點。
題目分析:
(1)定義一個正整數作為班級數;定義一個正整數作為課程數量;定義一個double變量作為學分;定義一個double型向量容器存儲學分;定義一個正整數作為班級人數;定義一個結構體存儲學生的名稱和總績點;定義一個字符串變量作為學生名稱;定義一個元素為結構體的向量容器存儲最終學生名稱和總績點
(2)從鍵盤讀入班級數
(3)對每個班級,從鍵盤讀入課程數量,再讀入每門課程的學分,並將每個學分插入到向量容器中
(4)對每個班級中的每個學生,從鍵盤讀入學生名稱,存儲在結構體中
(5)對每個班級中的每個學生的每門課程,讀入成績,若成績小於60,則繼續讀入下一門課程的成績,否則計算該課程的績點
(6)對每個班級中的每個學生,計算其總績點,存儲在結構體中,並插入向量容器
(7)編寫比較函數,若總績點不相等則按總績點從大到小的順序返回,若總績點相等則按學生名字從小到大的順序返回
(8)將向量容器中的元素按比較函數排序
(9)對向量容器中的每個元素,格式化輸出其信息
參考代碼:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
struct student
{
string s;
double d;
};
bool myComp(const student &s1,const student &s2)
{
if(s1.d!=s2.d) return s1.d>s2.d;
if(s1.s!=s2.s) return s1.s<s2.s;
}
int main(int argc,char * argv[])
{
int n;
int c;
double xf;
vector<double> vxf;
int p;
string name;
double score;
student xs;
vector<student> vxs;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>c;
for(int j=0;j<c;j++)
{
cin>>xf;
vxf.push_back(xf);
}
cin>>p;
for(int k=0;k<p;k++)
{
cin>>name;
xs.s=name;
xf=0.0;
for(int m=0;m<c;m++)
{
cin>>score;
if(score<60) continue;
xf=xf+(score-50)/10*vxf[m];
}
xs.d=xf/10;
vxs.push_back(xs);
}
cout<<(i?"\n":"");
cout<<"Class "<<i+1<<":"<<endl;
sort(vxs.begin(),vxs.end(),myComp);
for(vector<student>::iterator it=vxs.begin();it<vxs.end();it++)
{
cout<<fixed<<setprecision(2);
cout<<left<<setw(11);
cout<<(*it).s<<(*it).d<<endl;
}
vxf.clear();
vxs.clear();
}
system("pause");
return 0;
}
運行結果: