求一道C语言编程题目:急!!非常急!求大神帮助

某大学用学分绩点(GPA)评定学生的学业成绩。学分绩点计算公式为:GPA=∑(课程绩点X课程学分)/∑课程学分,其中课程绩点是从课程的百分制成绩转换得到的,转换方法见下表... 某大学用学分绩点(GPA)评定学生的学业成绩。学分绩点计算公式为:GPA=∑(课程绩点X课程学分)/ ∑课程学分,其中课程绩点是从课程的百分制成绩转换得到的,转换方法见下表。试编程统计某班n个同学在m门必修课上的学分绩点,并按从高到低排序。

百分制课程成绩对应的绩点

课程绩点
4 3.7 3.3 3 2.7 2.3 2 1.7 1.5 1 0
课程成绩
≥90 ≥85 ≥82 ≥78 ≥75 ≥72 ≥68 ≥66 ≥62 ≥60 <60

对有余力的同学,可加入以下功能(选做):
(1)GPA保留3位小数(四舍五入),输出时显示名次,GPA相同的排名相同,如2人并列第一,则没有第二名;
(2)学生学号、姓名用字符串表示,其中姓名可有空格;
(3)输入学分、成绩时,显示课程名称(可有空格)。
展开
 我来答
xoaxa
2014-05-31 · TA获得超过8608个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3430万
展开全部
#include <stdio.h>
#include <math.h>

const int N = 5; // 学生人数
const int M = 5; // 课程数目

typedef struct student {
int id; // 学号
char name[20];
double grades[M + 1][2]; // 第一列课程成绩,第二列课程绩点
double GPA; // 学分绩点
}students;

double GradePoint(double score) {
if(score >= 90) return 4;
if(score >= 85) return 3.7;
if(score >= 82) return 3.3;
if(score >= 78) return 3;
if(score >= 75) return 2.7;
if(score >= 72) return 2.3;
if(score >= 68) return 2;
if(score >= 66) return 1.7;
if(score >= 62) return 1.5;
if(score >= 60) return 1;
return 0;
}

void Input(students a[], int n) {
int i,j;
double ta,tb;
for(i = 0; i < n; ++i) {
printf("第 %d/%d 位学生信息:\n",i + 1,n);
printf("学号 : ");
scanf("%d",&a[i].id);
fflush(stdin);
printf("姓名 : ");
gets(a[i].name);
printf("%d门课程成绩 : ",M);
a[i].grades[M][0] = 0;
a[i].grades[M][1] = 0;
for(j = 0; j < M; ++j) {
scanf("%lf",&a[i].grades[j][0]);
a[i].grades[j][1] = GradePoint(a[i].grades[j][0]);
a[i].grades[M][0] += a[i].grades[j][0];
a[i].grades[M][1] += a[i].grades[j][1];
}
ta = 0;
tb = 0;
for(j = 0; j < M; ++j) {
ta += a[i].grades[j][0] * a[i].grades[j][1];
tb += a[i].grades[j][0];
}
a[i].GPA = ta/tb;
}
}

void Sort(students a[], int n) {
int i,j,k;
students t;
for(i = 0; i < n - 1; ++i) {
k = i;
for(j = i + 1; j < n; ++j) {
if(a[k].GPA < a[j].GPA)
k = j;
}
if(k != i) {
t = a[i];
a[i] = a[k];
a[k] = t;
}
}
}

void Show(students a[], int n) {
int i,j,rank = 1;
printf(" 1 %6d%10s",a[0].id,a[0].name);
for(j = 0; j < M; ++j)
printf("%7.2lf",a[0].grades[j][0]);
printf("%10.2lf\n",a[0].GPA);
for(i = 1; i < n; ++i) {
if(fabs(a[i].GPA - a[i - 1].GPA) <= 0.0005)
printf("   %6d%10s",a[i].id,a[i].name);
else printf("%2d %6d%10s",i + 1,a[i].id,a[i].name);
for(j = 0; j < M; ++j)
printf("%7.2lf",a[i].grades[j][0]);
printf("%10.3lf\n",a[i].GPA);
}
}

int main() {
students a[N];
Input(a,N);
Sort(a,N);
Show(a,N);
return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式