原题很长,就此略过了

https://vjudge.net/problem/UVA-12412#author=0

这道题看似是一道简单的家庭作业题,其实非常容易出错,且调试时间很长。主要的难点在于:

1. 增加学生成绩记录时调整好整个学生列表的排名Rank值,不用排序

2. 删除学生成绩记录后需要调整学生排名

3. 如何快速高效生成统计数据

#include<stdio.h>
#include<string.h>
#define EPS 1e-6const int max1 = 512;
const int max2 = 85;
char sid[max1][max2], name[max1][max2];
int cid[max1], score[max1][5], rank[max1], removed[max1];
int n = 0;void print_students()
{printf("Current student num: %d\n", n);for(int i = 0; i < n; i++) {printf("Student %d: sid = %s cid = %d name = %s rank = %d removed = %d score[0] = %d score[1] = %d score[2] = %d score[3] = %d\n",i, sid[i], cid[i], name[i], rank[i], removed[i], score[i][0], score[i][1], score[i][2], score[i][3]);}printf("\n");
}void print_menu()
{printf("Welcome to Student Performance Management System (SPMS).\n\n");printf("1 - Add\n");printf("2 - Remove\n");printf("3 - Query\n");printf("4 - Show ranking\n");printf("5 - Show Statistics\n");printf("0 - Exit\n\n");
}void add()
{char s[max2];bool dup;for(;;) {printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");dup = false;//print_students();scanf("%s", s);if(strcmp(s, "0") == 0) break;strcpy(sid[n], s);scanf("%d%s%d%d%d%d", &cid[n], name[n], &score[n][0], &score[n][1], &score[n][2], &score[n][3]);for(int i = 0; i < n; i++) {if(!removed[i] && strcmp(sid[i], s) == 0) {printf("Duplicated SID.\n");dup = true;break;}}if(dup) continue;score[n][4] = score[n][0] + score[n][1] + score[n][2] + score[n][3];int cnt = 0; // cnt记录成绩比score[n][4]更高的学生数量for(int i = 0; i < n; i++) {if(!removed[i]) {if(score[i][4] < score[n][4]) rank[i]++;if(score[i][4] > score[n][4]) cnt++;}}rank[n] = cnt + 1;n++;//print_students();}
}void DQ(int isq)
{char s[max2];for(;;) {printf("Please enter SID or name. Enter 0 to finish.\n");scanf("%s", s);if(strcmp(s, "0") == 0) return;int r = 0; // record the num of removed studentsfor(int i = 0; i < n; i++) {if(!removed[i]) {if(strcmp(sid[i], s) == 0 || strcmp(name[i], s) == 0) {if(isq) // For queryprintf("%d %s %d %s %d %d %d %d %d %.2f\n", rank[i], sid[i], cid[i], name[i], score[i][0],score[i][1], score[i][2], score[i][3], score[i][4], score[i][4]/4.0+EPS);else {removed[i] = 1;r++;for(int j = 0; j < n; j++)if(!removed[j] && rank[j] > rank[i]) rank[j]--;}}}}if(!isq) printf("%2d student(s) removed.\n", r);}
}void stat()
{printf("Please enter class ID, 0 for the whole statistics.\n");int c;scanf("%d", &c);int cnt = 0, pass4=0, pass3=0, pass2=0, pass1=0, pass0=0;int sum[4], pass[4];memset(sum, 0, sizeof(sum));memset(pass, 0, sizeof(pass));for(int i = 0; i < n; i++) {if(!removed[i]) {if(c == 0 || cid[i] == c) {cnt++;int pass_cnt = 0;for(int k = 0; k < 4; k++) {sum[k] += score[i][k];if(score[i][k] >= 60) { pass[k]++; pass_cnt++; }}if(pass_cnt == 4) pass4++;if(pass_cnt == 3) pass3++;if(pass_cnt == 2) pass2++;if(pass_cnt == 1) pass1++;if(pass_cnt == 0) pass0++;}    }}for(int k = 0; k < 4; k++) {// k 是课程编号if(k == 0) printf("%s\n", "Chinese");if(k == 1) printf("%s\n", "Mathematics");if(k == 2) printf("%s\n", "English");if(k == 3) printf("%s\n", "Programming");if(cnt > 0) printf("Average Score: %.2f\n", (float)sum[k]/cnt);else printf("Average Score: %.2f\n", (float)0.00);printf("Number of passed students: %d\n", pass[k]);printf("Number of failed students: %d\n\n", cnt - pass[k]);}printf("Overall:\n");printf("Number of students who passed all subjects: %d\n", pass4);printf("Number of students who passed 3 or more subjects: %d\n", pass4 + pass3);printf("Number of students who passed 2 or more subjects: %d\n", pass4 + pass3 + pass2);printf("Number of students who passed 1 or more subjects: %d\n", pass4 + pass3 + pass2 + pass1);printf("Number of students who failed all subjects: %d\n\n", pass0);
}int main()
{memset(removed, 0, sizeof(removed));for(;;) {int choice;print_menu();scanf("%d", &choice);if(choice == 0) break;if(choice == 1) add();if(choice == 2) DQ(0); // Remove student recordif(choice == 3) DQ(1); // Query student recordif(choice == 4) printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");if(choice == 5) stat();}return 0;
}

师兄帮帮忙 UVa 12412相关推荐

  1. HDU4506 小明系列故事——师兄帮帮忙

    问题链接:HDU4506 小明系列故事--师兄帮帮忙. 问题描述:参见上述链接. 问题分析:(略). 程序说明:函数powermod()是快速模幂函数. AC的C++语言程序如下: /* HDU450 ...

  2. 杭电4506小明系列故事——师兄帮帮忙

    小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  3. HDU4506 小明系列故事——师兄帮帮忙【水题】

    小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  4. 师兄帮帮忙:有困难,找师兄!

    "爱国爱家爱师妹,防火防盗防师兄"这是小编上学时非常流行的一幅对联.不过,现在一切都与时俱进了,师妹当然还是用来爱的,而师兄早已从防范对象升级为求助对象,一则"学长帮我修 ...

  5. 杭电4506-小明系列故事——师兄帮帮忙

    小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  6. 例题4-6 师兄帮帮忙 UVa12412

    例题4-6 师兄帮帮忙 UVa12412 感悟. 1.阅读书中题目,从网站下载英文原题,重点在看输出数据与格式. 2.开始编码,先搭函数框架,具体功能实现,待主体框架打好后,再进行. 3.程序测试比较 ...

  7. hdu 4506 小明系列故事——师兄帮帮忙

    小明系列故事--师兄帮帮忙 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total ...

  8. HDU 4506 小明系列故事——师兄帮帮忙

    小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  9. 例题4-6 UVA12412 师兄帮帮忙(156行AC代码)

    紫书刷题进行中,题解系列点这里 例题4-6 UVA12412 师兄帮帮忙 思路分析 只需按部就班实现各个功能,虽然繁琐,但无难点.深入思考有助于提高编程能力. 虽实现容易,但新手和老手在效率和代码长度 ...

最新文章

  1. 对“单子模式”的补充
  2. Java中传参数--值传递和引用传递
  3. 9.mybatis动态SQL标签的用法
  4. TCP/IP详解--第四章
  5. SlopOne推荐算法
  6. 高等数学上-赵立军-北京大学出版社-题解-练习2.5
  7. 飞鸽传书最新C++源码:这两个消息钩子
  8. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
  9. vue防抖和节流是什么_前端节流和防抖的区别
  10. 两大方案,只为写出更安全的代码!
  11. java day15 【Map】
  12. HID API for Linux, Mac OS X, and Windows
  13. 十进制转化成八进制(一到十六进制)
  14. 撩开云计算神秘面纱之阿里云弹性计算服务篇
  15. PeerCDN:使用WebRTC构建基于浏览器的P2P CDN
  16. 如何将手机屏幕投影到电脑电视
  17. 小天鹅全自动洗衣机的PLC控制
  18. 迪杰斯特拉算法c语言6,迪杰斯特拉算法C语言实现
  19. 用python做一个随机题目生成器
  20. 解决win10睡眠后变卡的问题

热门文章

  1. 阿里巴巴数据分析实战:超详细的母婴电商分析流程
  2. Arduino 读取 DS18B20 通过315/433 收发温度
  3. uni-app 入门之 nvue (weex) 爬坑记
  4. Android程序员为什么焦虑未来?
  5. wpsppt放映时间_怎么修改wps演示的放映时间 wps演示自定义修改放映时间的步骤方法...
  6. WPS演示 里有超链接的文字怎么改变格式
  7. webpack是用来做什么的?
  8. 矿物绝缘电缆行业调研报告 - 市场现状分析与发展前景预测
  9. JavaGUI:多功能计算器(一)--AWT框架按钮(完整代码)
  10. java bean lazy proxy_java – Hibernate @Proxy(lazy = false)注释做什么...