歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++實現按績點排名

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