zoukankan      html  css  js  c++  java
  • 数据结构综合训练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("
    注意: 项目编号1到%d为男子项目, %d到%d为女子项目
    ", 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("
    注意: 1到%d为男子项目, %d到%d为女子项目
    ", 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名运动员的信息
    ", j + 1);
        printf("得          分:%d
    ", 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
    
    ", i);
        printf("项目号        姓  名             得 分         名 次
    ");
        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
    ", 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("
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ");
      }
    }
    //团体总分报表
    void group_score(item_info *info, int n) {
      int i, j, k, m;
      int m_scores;
      int w_scores;
      printf("学院编号 男子团体总分 女子团体总分 男女团体总分
    ");
      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
    ", 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("请先输入一些必要信息!
    ");
      item_init(&info, &n);
      printf("任意键进入菜单
    ");
      fflush(stdin);
      getch();
    
      while (1) {
        system("cls");
        menu();
        fflush(stdin);
        switch (getchar()) {
        case '1':
          system("cls");
          puts("******************逐项目录入成绩*****************
    ");
          printf("Enter输入信息,其他键退出
    ");
          fflush(stdin);
          while (getch() == '
    ') {
            item_input(&info, i++, n);
                        printf("Enter继续,其他键退出
    ");
                        fflush(stdin);
                    }
                    break;
                case '2':
                    system("cls");
                    puts("******************院系成绩单*****************
    ");
                    faculty_score(&info, n);
                    printf("任意键退出
    ");
                    fflush(stdin);
                    getch();
                    break;
                case '3':
                    system("cls");
                    puts("*******************团体总分报表*****************
    ");
                    group_score(&info, n);
                    printf("任意键退出
    ");
                    fflush(stdin);
                    getch();
                    break;
                case '0':
                    system("pause");
                    return 0;//结束程序
                default:
                    break;
            }
        }
    }

     

  • 相关阅读:
    bzoj3427:[POI2013]BAJ-Bytecomputer
    bzoj3417:[POI2013]MOR-Tales of seafaring
    bzoj1100:[POI2007]对称轴osi
    bzoj3295:[CQOI2011]动态逆序对
    bzoj2286:[SDOI2011]消耗战
    CF1110F Nearest Leaf
    CF1110E Magic Stones
    CF1110D Jongmah
    matlab基础向9:动画
    CF1102D-Balanced Ternary String-(贪心)
  • 原文地址:https://www.cnblogs.com/startnow/p/5052652.html
Copyright © 2011-2022 走看看