试图转专业的kk 2022-11-08 23:02 采纳率: 42.9%
浏览 31
已结题

排序及精度问题如何解决(C语言)

期末考试
Description
每个学期都会进行闻风丧胆的期末考试,每门功课所占权重不一样,假设成绩排序规则为:∑每门课程成绩*权值/课程总数。现在就请你写一个程序按照每个同学成绩最终生成总排名表(若最终成绩相同,则按照学号非降序排序)
Input
输入的第一行给出两个个正整数N(N≤1000)M(M≤20),依次代表学生总数、课程总数。第二行给出M个数,代表各个课程的权值,随后N行给出N个学生的各个课程成绩。格式为:考号(由13位整数字组成)和M个课程得分(为[0,100]区间内的整数),中间用空格分隔。
Output
输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终成绩。
Sample Input 1
4 2
0.1 0.9
1234567890001 95 100
1234567890005 100 98
1234567890003 95 96
1234567890002 77 88
Sample Output 1
1234567890001 99.5
1234567890005 98.2
1234567890003 95.9
1234567890002 86.9
代码能过样例,但是无法AC,望大家予以指导修改!

#include <stdio.h>
#include <stdlib.h>
typedef struct {long long id;double score;} rank;
int compare(const void* x,const void* y)
{
  rank* m=(rank*)x;
  rank* n=(rank*)y;
  if(m->score != n->score)
    return (m->score < n->score?1:-1);
  return (m->id > n->id?1:-1);
}
int main()
{
  int N,M,i,j,temp;
  double w[20];
  rank stu[1000];
  scanf("%d%d",&N,&M);
  for(i=0;i<M;++i)
    scanf("%lf",&w[i]);
  for(i=0;i<N;++i)
  {
    scanf("%lld",&stu[i].id);
    for(j=0,stu[i].score=0.0;j<M;++j)
    {
      scanf("%d",&temp);
      stu[i].score += (double)temp*w[j];//与题设中公式不一致,可能有误
    }
  }
  qsort(stu,N,sizeof(stu[0]),compare);
  for(i=0;i<N;++i)
    printf("%s%lld %.1f",i?"\n":"",stu[i].id,stu[i].score);//可能有误,保留位数可能与权重的位数有关,但是如何实现成绩保留相应位数?
  return 0;
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月16日
    • 修改了问题 11月10日
    • 创建了问题 11月8日

    悬赏问题

    • ¥15 如何解决调试dev-出++5.11不成功问题
    • ¥15 安装CentOS6时卡住
    • ¥20 关于#监控系统#的问题,如何解决?(相关搜索:系统软件)
    • ¥20 c语言写的8051单片机存储器mt29的模块程序
    • ¥60 求直线方程 使平面上n个点在直线同侧并且距离总和最小
    • ¥50 java算法,给定试题的难度数量(简单,普通,困难),和试题类型数量(单选,多选,判断),以及题库中各种类型的题有多少道,求能否随机抽题。
    • ¥50 rk3588板端推理
    • ¥250 opencv怎么去掉 数字0中间的斜杠。
    • ¥15 这种情况的伯德图和奈奎斯特曲线怎么分析?
    • ¥250 paddleocr带斜线的0很容易识别成9