数据结构综合训练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;
        }
    }
}
时间: 2024-10-03 05:05:52

数据结构综合训练1的相关文章

数据结构综合训练2

掌握图的结构特点及应用,运用所学知识解决现实问题.给出校园各主要建筑的名称信息及有线路联通的建筑之间的距离,利用校园导航系统计算出输入的起点到终点之间的最近距离及线路. ①输入各建筑信息及线路信息,构建图.本项目数据结构为有向网,采用邻接矩阵为存储结构. ②计算给定起点到终点之间最近距离的进行线路.参照迪杰斯特拉算法计算给定两点之间的最短路径. ③根据输入起点和终点,输出线路及总距离. 1.上谷歌获得学校的(截了三张图,拼成一张)地图取主要几个建筑编号构成无向图,用尺子量出权值. 2.有向网的构

背单词系统 数据结构课程设计

     数据结构     课程设计说明书           题目:          轻松背单词   学生姓名:       啦啦啦 学    号:    201406060306      院 (系):    电气与信息工程 专    业:   计算机科学与技术 指导教师: 2016  年  1 月 15 日 目 录 1.设计任务 1 2. 需求分析 1 3. 概要设计 1 3.1 基本功能 1 3.2 函数说明 1 3.3 变量和结构体说明 2 3.4 单词存储简要分析 2 3.5 功能

【数据结构】之散列链表(Java语言描述)

散列链表,在JDK中的API实现是 HashMap 类. 为什么HashMap被称为"散列链表"?这与HashMap的内部存储结构有关.下面将根据源码进行分析. 首先要说的是,HashMap中维护着的是一个数组: transient Node<K,V>[] table; ,数组中的每个元素都是一个 Node 对象.这里的Node是HashMap的一个内部类,代码如下: static class Node<K,V> implements Map.Entry<

旧题新做:从idy的视角看数据结构

“今天你不写总结……!!!” 额…… 还是讲我的吧.这些考试都是idy出的题. 20170121:DFS序. ST表.线段树练习 这是第一次考数据结构. Problem 1. setsum 1 second 给你一个长度为N 的整数序列,支持两种操作: • modity l r val 将区间[l,r] 中的所有数修改为val • query l r 询问区间[l,r] 所有数的和 分析:最简单的线段树,区间更改区间求和.但注意是更改,不是添改,sum与flag需同时覆盖. Problem 2.

数据结构Set和Map

一.数据结构 Set 集合的基本概念:集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,应用在计算机的数据结构中.  特点:key 和 value 相同,没有重复的 value.ES6 提供了数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. 1. 如何创建一个 Set const s = new Set([1, 2, 3]); 2.属性 console.log(s.size); // 3 3.Set 类的方法 --set.add(v

数据结构基本概念

什么是数据结构 "数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系.这些联系可以通过定义相关的函数来给出"--Sartaj Sahni,<数据结构.算法与应用> "数据结构是ADT(抽象数据类型Abstract Data Type)的物理实现."--Clifford A.Shaffer,<数据结构与算法分析> "数据结构(data structture)是计算机中存储.组织数据的方式.通常情况下,经i想你

分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令

Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sorted Set. Redis数据类型内存结构分析 Redis内部使用一个redisObject对象来表示所有的key和value.redisObject主要的信息包括数据类型(type).编码方式(encoding).数据指针(ptr).虚拟内存(vm)等.type代表一个value对象具体是何种数

【Python&amp;数据结构】 抽象数据类型 Python类机制和异常

这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Python编程,借着本次机会仔细学习一下. 抽象数据类型 最开始的计算机语言,关注的都是如何更加有效率地计算,可以说其目的是计算层面的抽象.然而随着这个行业的不断发展,计算机不仅仅用于计算,开发也不仅只关注计算过程了,数据层面的抽象也变得同样重要.虽然计算机语言一开始就有对数据的抽象,但是那些都只是对一些最基本的

深入浅出分析MySQL索引设计背后的数据结构

在我们公司的DB规范中,明确规定: 1.建表语句必须明确指定主键 2.无特殊情况,主键必须单调递增 对于这项规定,很多研发小伙伴不理解.本文就来深入简出地分析MySQL索引设计背后的数据结构和算法,从而可以帮你释疑如下问题: 1.为什么innodb表需要主键? 2.为什么建议innodb表主键是单调递增? 3.为什么不建议innodb表主键设置过长? B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.B通常