原题很长,就此略过了

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. VMware View是如何帮助企业省钱的
  3. No identifier specified for entity
  4. 用户界面改变图片锚点
  5. java 按钮键盘,java中关于键盘代替按钮的一些有关问题(是代替)~
  6. 计算机术语new一个,微机原理第一章计算机基础知识(new)
  7. 配置syslog发送_nginx简单配置优化概述
  8. oracle100个常见问题,Oracle初学者必知的100个问题(三)
  9. python自动点击脚本_[Python] 【Python3】教你写页游自动化Python脚本 3.取色,大漠识别和后台点击...
  10. Android 6.0 超级简单的权限申请2 (Permission)
  11. ORACLE---Unit04: SQL(高级查询)
  12. 如何使用安装光盘为本机创建yum repository
  13. search has not been saved
  14. WPS关于尾注的细节
  15. Linux环境编译动态库和静态库总结
  16. IOS 学习笔记(2) 视图UINavigationController
  17. 斐讯盒子刷android tv,【TV】斐讯盒子T1_YYFROM语音助手实用版(191129)
  18. Jetpack DataStore 你总要了解一下吧?
  19. Bro脚本语法4-声明和语句(Declarations and Statements)
  20. 苹果5越狱教程_iOS13.5越狱教程

热门文章

  1. 证券从业资格准考证可以打印啦
  2. 按照频率将数组升序排序
  3. android程序如何加密软件,如何在Android手机上隐藏(加密)文件夹(软件)
  4. android 主屏幕,如何重置Android主屏幕返回到默认启动
  5. Flash制作网页广告的并添加点击统计事件
  6. php全词查询,PHP制作百度词典查词采集器
  7. JavaGUI:多功能计算器(一)--AWT框架按钮(完整代码)
  8. 什么是 Object Tracking - SOT MOT
  9. digitalocean云服务器,最快55秒 DigitalOcean Droplet虚拟服务器搭建
  10. HTML+CSS简单实现小米商城