The calculation of GPA HDU--1202 注意细节

每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对于评奖学金是直接有关的。国外大学都是计算GPA(grade point average) 又称GPR(grade point ratio),即成绩点数与学分的加权平均值来代表一个学生的成绩的。那么如何来计算GPA呢?
一般大学采用之计分法

A 90 - 100 4 点
B 80 - 89 3 点
C 70 - 79 2 点
D 60 - 69 1 点
E 0 - 59 0 点

例如:某位学生修习三门课,其课目、学分及成绩分别为: 英文:三学分、92 分;化学:五学分、80 分;数学:二学分、60分,则GPA的算法如下:
科目 学分 分数 点数 分数×点数
英文 3 92 4 12
化学 5 80 3 15
数学 2 60 1 2
合计 10 29 29/10=2.9
2.9即为某生的GPA 下面有请你写一个用于计算GPA的程序。
Input包含多组数据,每组数据的第一行有一个数N,接下来N行每行表示一门成绩。每行有两个实型的数 s,p,s表示这门课的学分,p表示该学生的成绩(百分制)。如果p=-1则说明该学生这门课缺考,是不应该计算在内的。
Output对每组数据输出一行,表示该学生的GPA,保留两位小数。如果GPA不存在,输出-1。
Sample Input3
3 92
5 80
2 60
Sample Output
2.90
这个题中要求输出结果保留两位小数
首先加上头文件
#include//头文件
在输出代码行加入
cout<<setiosflags(ios::fixed)<<setprecision(2)<<d<<endl;
其中setiosflags(ios::fixed)<
如果输出行中没有setiosflags(ios::fixed)也就是下一行代码
cout<<setprecision(2)<<d<<endl;
意思为输出两位有效数字。而如果参数数字小于整数位数,则输出指数形式结果。(注意输出的结果均为四舍五入后的结果)
解决了输出,这个题还有一个值得关注的就是分数与点数转换的过程,题目中给的数据如80—89点数为4其实是不严谨的,因为输入的成绩为实型成绩,这样的话89.5就没有相应的点数了。错误代码如下:
double idian(double p)
{
 double dian;
 if(p>=90&&p<=100)
 dian=4.0;
 else if(p>=80&&p<89)
 dian=3.0;
 else if(p>=70&&p<=79)
 dian=2.0;
 else if(p>=60&&p<=69)
 dian=1.0;
 else
 dian=0;
 return dian;
}
这样的结果必然WA。所以函数部分我们要注意判断条件的严谨。

题目代码如下:

#include
#include
using namespace std;
double idian(double p)
{
 	double dian;
 	if(p>=90&&p<=100)
 	dian=4.0;
 	else if(p>=80&&p<90)
 	dian=3.0;
 	else if(p>=70&&p<80)
 	dian=2.0;
 	else if(p>=60&&p<70)
 	dian=1.0;
 	else
 	dian=0;
 	return dian;
}
int main()
{
 	int n;
 	while(cin>>n)
 	{
  		double xuesum=0;
  		double chengsum=0;
  		double s,p;
  		while(n--)
  		{
   			cin>>s>>p;//s是学分,p是成绩 
   			if(p!=-1)
   			{
   			 	xuesum+=s;
    				chengsum+=(idian(p)*s);
   			}
  		}
  		if(xuesum==0)
  		cout<<"-1"<<endl;
  		else
  		{
   			double d=chengsum/xuesum;
   			if(d==0)
   			cout<<"-1"<<endl;
   			else
   			cout<<setiosflags(ios::fixed)<<setprecision(2)<<d<<endl;
  		}
 	}
 	return 0;
} 

你可能感兴趣的:(The calculation of GPA HDU--1202 注意细节)