数据结构综合训练1

参加运动会有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;
        }
    }
}

 

posted @ 2015-12-16 22:55  一支小白  阅读(373)  评论(0编辑  收藏  举报