歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++實現按績點排名

C++實現按績點排名

日期:2017/3/1 9:51:49   编辑:Linux編程

題目內容:有一些班級的學生需要按績點計算並排名。每門課的成績只有在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;

}

運行結果:

Copyright © Linux教程網 All Rights Reserved