参加运动会有n个院系,编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1~m,女子m+1~m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些项目取前五名或前三名由学生自己设定。(m<=20,n<=20)
①假设姓名长度不超过20个字符。每个项目结束时,将其编号、类型符(区分取前五名还是取前三名)输入,并按名次顺序输入运动员姓名、院系编号和成绩。
②产生各院系的成绩单,内容包括各院系取得的每项成绩的项目号、名次(成绩)、姓名和得分;
③产生团体总分报表,内容包括院系编号、男子团体总分、女子团体总分和团体总分。
④程序运行后有相应功能的选择菜单界面。
#include <stdio.h> #include <stdlib.h> #include <conio.h> //积分方式 int score1[5] = {7, 5, 3, 2, 1}; #define M 5 int score2[3] = {5, 3, 2}; #define N 3 //项目 typedef struct item { int id; //项目编号 char type; //积分类型 struct athlete *athlete_sqlist; //运动员顺序表 容量有type控制 空或满两种状态 } item; //运动员 typedef struct athlete { char name[20]; //姓名 int faculty_id; //学院编号 int score; //分数 } athlete; //项目信息 typedef struct item_info { struct item *item_sqlist; //项目顺序表 int length; //长度 int m; //男子项目 int w; //女子项目//二者之和m+w作为容量 } item_info; //初始化项目,学院数的信息 int item_init(item_info *info, int *n) { puts("参加比赛的院系有多少个?"); scanf("%d", n); puts("比赛项目中男子项目有?"); scanf("%d", &info->m); puts("比赛项目中女子项目有?"); scanf("%d", &info->w); info->item_sqlist = (item *)malloc((info->m + info->w) * sizeof(item)); //申请项目顺序表空间 if (!info->item_sqlist) return -1; info->length = 0; printf("\n注意: 项目编号1到%d为男子项目, %d到%d为女子项目\n", info->m, info->m + 1, info->m + info->w); return 1; } //每项目结束添加成绩 int item_input(item_info *info, int i, int n) { int j, k; int m = 0; if (info->length >= info->m + info->w) { //判断项目顺序表是否满 puts("超出预计项目数"); return -2; } printf("\n注意: 1到%d为男子项目, %d到%d为女子项目\n", info->m, info->m + 1, info->m + info->w); printf("请输入项目编号"); scanf("%d", &(info->item_sqlist)[i].id); for (k = 0; k < info->length; k++) { if ((info->item_sqlist)[i].id == (info->item_sqlist)[k].id) { printf("请重新输入项目编号"); scanf("%d", &(info->item_sqlist)[i].id); k = 0; } } puts("1. 前5名制: 积分取值 7.5.3.2.1"); puts("2. 前3名值: 积分取值 5.3.2"); puts("请输入该项目的类型"); fflush(stdin); while (m == 0) { //输入检测 scanf("%c", &(info->item_sqlist)[i].type); switch ((info->item_sqlist)[i].type) { case ‘1‘: m = M; break; case ‘2‘: m = N; break; default: break; } } (info->item_sqlist)[i].athlete_sqlist = (athlete *)malloc(sizeof(athlete) * m); //对应类型的运动员顺序表,m为M或N if (!(info->item_sqlist)[i].athlete_sqlist) return -1; for (j = 0; j < m; j++) { printf("请输入第%d名运动员的信息\n", j + 1); printf("得 分:%d\n", m == M ? score1[j] : score2[j]); (info->item_sqlist)[i].athlete_sqlist[j].score = (m == M ? score1[j] : score2[j]); printf("姓 名:"); scanf("%s", (info->item_sqlist)[i].athlete_sqlist[j].name); printf("院系编号(1至%d):", n); scanf("%d", &(info->item_sqlist)[i].athlete_sqlist[j].faculty_id); } info->length++; //项目表长度加1 } //院系成绩单 void faculty_score(item_info *info, int n) { //通过匹配学院id,n为学院号 int i, j, k, m; int flag; for (i = 1; i <= n; i++) { //循环学院编号 flag = 0; printf(" 学院编号:%d\n\n", i); printf("项目号 姓 名 得 分 名 次\n"); for (j = 0; j < info->length; j++) { //循环项目 m = (info->item_sqlist)[j].type == ‘1‘ ? M : N; for (k = 0; k < m; k++) { //循环运动运信息 if ((info->item_sqlist)[j].athlete_sqlist[k].faculty_id == i) { flag = 1; printf(" %-12d %-20s%2d%14d\n", info->item_sqlist[j].id, info->item_sqlist[j].athlete_sqlist[k].name, info->item_sqlist[j].athlete_sqlist[k].score, k + 1); } } } if (!flag) //是否查到获奖信息 puts("无获奖信息"); puts("\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); } } //团体总分报表 void group_score(item_info *info, int n) { int i, j, k, m; int m_scores; int w_scores; printf("学院编号 男子团体总分 女子团体总分 男女团体总分\n"); for (i = 1; i <= n; i++) { m_scores = 0; w_scores = 0; for (j = 0; j < info->length; j++) { m = (info->item_sqlist)[j].type == ‘1‘ ? M : N; for (k = 0; k < m; k++) { if ((info->item_sqlist)[j].athlete_sqlist[k].faculty_id == i) { m_scores += (info->item_sqlist)[j].id <= info->m ? (info->item_sqlist)[j].athlete_sqlist[k].score : 0; w_scores += (info->item_sqlist)[j].id > info->m ? (info->item_sqlist)[j].athlete_sqlist[k].score : 0; } } } printf(" %-13d%-14d%-14d%-d\n", i, m_scores, w_scores, m_scores + w_scores); } } void menu() { puts(" ************************************************"); puts("* 主菜单 *"); puts("* 1. 逐项目录入成绩 *"); puts("* 2. 院系成绩单 *"); puts("* 3. 团体总分报表 *"); puts("* 0. 退出 *"); puts(" ************************************************"); } int main(void) { int n; int i = 0; item_info info; puts("请先输入一些必要信息!\n"); item_init(&info, &n); printf("任意键进入菜单\n"); fflush(stdin); getch(); while (1) { system("cls"); menu(); fflush(stdin); switch (getchar()) { case ‘1‘: system("cls"); puts("******************逐项目录入成绩*****************\n"); printf("Enter输入信息,其他键退出\n"); fflush(stdin); while (getch() == ‘\r‘) { item_input(&info, i++, n); printf("Enter继续,其他键退出\n"); fflush(stdin); } break; case ‘2‘: system("cls"); puts("******************院系成绩单*****************\n"); faculty_score(&info, n); printf("任意键退出\n"); fflush(stdin); getch(); break; case ‘3‘: system("cls"); puts("*******************团体总分报表*****************\n"); group_score(&info, n); printf("任意键退出\n"); fflush(stdin); getch(); break; case ‘0‘: system("pause"); return 0;//结束程序 default: break; } } }
时间: 2024-10-03 05:05:52