数据结构课程设计c语言运动会管理系统

2023-11-04

参加运动会的有n个学院,学校编号为1……n,比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前八名积分,且前八名的积分分别为:9、7、6、5、4、3、2、1(m<=20,n<=20)。

功能要求:(1)可以输入各个项目的前八名的成绩;(2)能统计各学院的总分并排序;(3)可以按学院编号、学院总分、男女团体总分排序输出;(4)可以按学院编号查询学院某个项目的情况;可以按项目编号查询取得前八名的学院。(5)可以查找汇总某名选手参加的项目和获取的名次和积分。
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计,要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容可以参考c语言程序设计的教材)请在最后的上交资料中指明使用的存储结构。
测试数据:
要求使用(1)全部合法数据;(2)整体非法数据;(3)局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明。

该代码使用Visual C++ 6.0 编译运行,如果使用其他版本可能输出scanf_s之类的错误
由于要求简单,没有删除等功能,没有设立尾指针

在这里插入图片描述

数据说明

在这里插入图片描述
数字 3 代表有三个学院
数字 2 代表有两个项目

在这里插入图片描述
字段 分别是 姓名,性别(0是女生,1是男生),学院,项目 ,名次 ,得分

运行截图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下载地址

https://gitee.com/xiaoweidumpb/dscourese-design/tree/master/

头文件

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>

#define N 10
typedef int ElemType;

typedef struct Node
{
    ElemType score;   //分数
    ElemType rank;    //排名
    ElemType sex;     //性别
    char name[20];    //姓名
    char college[20]; //学院
    char item[20];    //项目
    struct Node *next;
} LinkNode, *LinkList;

void Init(LinkList &Head);
int  GetScore(int rank);
void Input(LinkList &Head, int &CollegeNum, int &ItemNum, char Colleges[][20], char Items[][20]);
void Create(LinkList &Head, int score, int rank, int sex, char name[], char college[], char item[]);
void Show(LinkList Head);
void Save(LinkList Head, char Colleges[][20], int CollegeNum, char Items[][20], int ItemNum);
void Read(LinkList Head, char Colleges[][20], int &CollegeNum, char Items[][20], int &ItemNum);
void Collegescore(LinkList Head, char Colleges[][20], int CollegeNum);
void SexScore(LinkList Head, char Colleges[][20], int CollegeNum);
void QueryCollege(LinkList Head);
void QueryName(LinkList Head);
void QueryItem(LinkList Head);
void Insert(LinkList &Head, int score, int rank, int sex, char name[], char college[], char item[]);
void Print(Node *p);
void Free(LinkList &Head);

main函数

#include "sports.h"

int main()
{
    LinkList Head;                    //选手数据链表
    Init(Head);

    int CollegeNum=0;                  //学院数量
    int ItemNum=0;                     //项目数量 
    char Colleges[N][20]={'\0'};               //学院
    char Items[N][20]={'\0'};                  //运动会项目
    int select=0;
    while (true)
    {
        printf("********************************************\n");
        printf("[1]初始化程序	         [2]读取数据         \n");
        printf("[3]打印数据             [4]保存数据          \n");
        printf("[5]统计学院的总分       [6]男女团体总分       \n");
        printf("[7]查询学院项目         [8]查找选手           \n");
        printf("[9]查询项目获奖                              \n");
        printf("[0]退出系统			                        \n");
        printf("*******************************************\n");
        printf("请选择: >\n");
        scanf("%d", &select);
        switch (select)
        {
        case 1:
        {   
            Input(Head,CollegeNum,ItemNum,Colleges,Items);
            break;
        }
        case 2:
            Read(Head,Colleges,CollegeNum,Items,ItemNum);
            Show(Head);
            break;
        case 3:
            Show(Head);
            break;
        case 4:
            Save(Head,Colleges,CollegeNum,Items,ItemNum);
            break;
        case 5:
            Collegescore(Head,Colleges,CollegeNum);
            break;
        case 6:
            SexScore(Head,Colleges,CollegeNum);
            break;
        case 7:
            QueryCollege(Head);
            break;
        case 8:
            QueryName(Head);
            break;
        case 9:
            QueryItem(Head);
            break;
        case 0:
            Free(Head);
            return 0;
        default:
            printf("输入的数据有误,请重新输入\n");
            break;
        }
    }

}

实现函数

#include "sports.h"

//初始化头指针
void Init(LinkList &Head)
{

    Head = (LinkNode *)malloc(sizeof(LinkNode)); //申请头结点
    Head->rank = 0;
    Head->score = 0;
    Head->sex = -1;
    strcpy(Head->name, "");
    strcpy(Head->college, "");
    strcpy(Head->item, "");
    Head->next = NULL;
}

//根据排名得到相应的分数
int GetScore(int rank)
{
    if (rank == 1)
        return 9;
    else if (rank == 2)
        return 7;
    else if (rank == 3)
        return 6;
    else if (rank == 4)
        return 5;
    else if (rank == 5)
        return 4;
    else if (rank == 6)
        return 3;
    else if (rank == 7)
        return 2;
    else if (rank == 8)
        return 1;
    else
        return 0;
}

//初始化程序,输入学院名,项目名和选手成绩
void Input(LinkList &Head, int &CollegeNum, int &ItemNum, char Colleges[][20], char Items[][20])
{
    int i, r, flag = 0;
    int score = 0, rank = 0, sex = 0;                                // 存储输入变量;
    char name[20] = {'\0'}, college[20] = {'\0'}, item[20] = {'\0'}; // 存储输入变量存储;
    int count = 1;                                                   // 计数器

    printf("请输入学院个数 n<10 \n");

    while (r = scanf("%d", &CollegeNum) != 1 || CollegeNum > 10 || CollegeNum < 0)
    {
        printf(" 您的输入有误,请重新输入!  \n");
        fflush(stdin); /*清空输入缓冲区,也可以使用rewind(stdin);*/
    }

    for (i = 0; i < CollegeNum; i++)
    {
        printf("请输入第%d学院名\n", i + 1);
        scanf("%s", &Colleges[i]);
        fflush(stdin);
    }

    printf("请输入项目个数 n<10 \n");
    while (r = scanf("%d", &ItemNum) != 1 || ItemNum > 10 || ItemNum < 0)
    {
        printf(" 您的输入有误,请重新输入!  \n");
        fflush(stdin);
    }

    for (i = 0; i < ItemNum; i++)
    {
        printf("请输入第%d项目名\n", i + 1);
        scanf("%s", &Items[i]);
    }

    while (true)
    {
        fflush(stdin);

        printf("请输入第%d个选手数据\n", count);
        printf("请输入姓名\n");
        r = scanf("%s", &name);
        if (r == 0)
        {
            printf(" 您的输入有误,请重新输入!  \n");
            break;
        }
        printf("请输入性别  0代表女性 1代表男性\n");
        r = scanf("%d", &sex);
        if (r == 0)
        {
            printf(" 您的输入有误,请重新输入!  \n");
            break;
        }
        printf("请输入学院\n");
        r = scanf("%s", &college);
        if (r == 0)
        {
            printf(" 您的输入有误,请重新输入!  \n");
            break;
        }

        printf("请输入项目\n");
        r = scanf("%s", &item);
        if (r == 0)
        {
            printf(" 您的输入有误,请重新输入!  \n");
            break;
        }
        printf("请输入名次 1-8\n");

        r = scanf("%d", &rank);
        if (r == 0 && rank < 0 && rank > 8)
        {
            printf(" 您的输入有误,请重新输入!  \n");
            break;
        }
        score = GetScore(rank);

        Create(Head, score, rank, sex, name, college, item);
        count++;
        printf("0 结束输入数据 , 1 输入数据\n");
        scanf("%d", &flag);
        if (flag == 0)
            break;
    }
}

//创建链表
void Create(LinkList &Head, int score, int rank, int sex, char name[], char college[], char item[])
{
    LinkNode *p = Head->next, *s;
    //如果链表为空,则做初始化链表
    if (p == NULL)
    {
        s = (LinkNode *)malloc(sizeof(LinkNode));
        assert(s != NULL);
        s->score = score;
        s->rank = rank;
        s->sex = sex;
        strcpy(s->name, name);
        strcpy(s->college, college);
        strcpy(s->item, item);
        s->next = NULL;
        Head->next = s;
    }
    else
    {
        while (p->next != NULL)
        {
            p = p->next;
        }
        s = (LinkNode *)malloc(sizeof(LinkNode));
        assert(s != NULL);
        s->score = score;
        s->rank = rank;
        s->sex = sex;
        strcpy(s->name, name);
        strcpy(s->college, college);
        strcpy(s->item, item);
        s->next = NULL;
        p->next = s;
    }
}

//打印所有的数据
void Show(LinkList Head)
{
    int count = 1;
    Node *p = Head->next;
    while (p != NULL)
    {
        printf("打印第%d个成绩\n", count);
        Print(p);
        p = p->next;
        count++;
    }
}

//保存数据为.txt文件
void Save(LinkList Head, char Colleges[][20], int CollegesNum, char Items[][20], int ItemNum)
{
    int i;
    //保存选手数据
    FILE *file;
    file = fopen("sports_data.txt", "w");
    if (file == NULL)
    {
        printf("文件创建失败请检查!\n");
        exit(0);
    }

    Node *p = Head->next;
    while (p != NULL)
    {

        fprintf(file, "%s\t", p->name);

        fprintf(file, "%d\t", p->sex);

        fprintf(file, "%s\t", p->college);

        fprintf(file, "%s\t", p->item);

        fprintf(file, "%d\t", p->rank);

        fprintf(file, "%d\n", p->score);
        p = p->next;
    }
    fclose(file);
    file = NULL; //将指针置为NULL ,打开另一个文件

    file = fopen("Colleges_Items.txt", "w");
    if (file == NULL)
    {
        printf("文件创建失败请检查!\n");
        exit(0);
    }
    //保存项目数和学院数
    fprintf(file, "%d\t", CollegesNum);
    fprintf(file, "%d\t", ItemNum);

    //保存项目名字和学院名字
    for (i = 0; i < CollegesNum; i++)
    {
        fprintf(file, "%s\t", Colleges[i]);
    }
    for (i = 0; i < ItemNum; i++)
    {
        fprintf(file, "%s\t", Items[i]);
    }

    fclose(file);
}
//读取txt文件中的数据
void Read(LinkList Head, char Colleges[][20], int &CollegesNum, char Items[][20], int &ItemNum)
{
    if (Head->next != NULL)
    {
        printf("已读取数据!\n");
        return;
    }

    FILE *file;
    int i = 0;

    file = fopen("sports_data.txt", "r");
    if (file == NULL)
    {
        printf("文件读取失败请初始化!\n");
        exit(0);
    }

    int score, rank, sex;                 // 作为输入变量存储;
    char name[20], college[20], item[20]; // 作为输入变量存储;
    //当指针不为结束符,一直++
    //读入所有的选手成绩
    while (!feof(file))
    {
        fscanf(file, "%s", &name);

        fscanf(file, "%d\t", &sex);

        fscanf(file, "%s\t", &college);

        fscanf(file, "%s\t", &item);

        fscanf(file, "%d\t", &rank);

        fscanf(file, "%d\n", &score);
        Create(Head, score, rank, sex, name, college, item);
    }
    fclose(file);

    //读取学院名字和项目名字
    file = NULL;
    file = fopen("colleges_items.txt", "r");
    if (file == NULL)
    {
        printf("文件读取失败请初始化!\n");
        exit(0);
    }

    while (!feof(file))
    {
        fscanf(file, "%d\t", &CollegesNum);

        fscanf(file, "%d\t", &ItemNum);

        for (i = 0; i < CollegesNum; i++)
        {
            fscanf(file, "%s\t", &Colleges[i]);
        }

        for (i = 0; i < CollegesNum; i++)
        {
            fscanf(file, "%s\t", &Items[i]);
        }
    }

    fclose(file);
}

//学院分数
void Collegescore(LinkList Head, char Colleges[][20], int CollegesNum)
{
    int score[N] = {0}; //
    int i;
    LinkList list;
    Node *p = NULL;
    //计算每个学院的分数
    Init(list);
    for (i = 0; i < CollegesNum; i++)
    {

        p = Head->next;

        while (p != NULL)
        {
            if (strcmp(Colleges[i], p->college) == 0)
            {
                score[i] += p->score;
            }
            p = p->next;
        }
    }

    //按分数大小建立一个链表
    for (i = 0; i < CollegesNum; i++)
    {
        Insert(list, score[i], 0, 0, "", Colleges[i], "");
    }

    //打印学院成绩

    p = NULL;
    p = list->next;
    while (p != NULL)
    {
        printf("%s学院得分为%8d\n", p->college, p->score);
        p = p->next;
    }

    Free(list);
}

//释放链表
void Free(LinkList &Head)
{
    Node *p = NULL, *q = NULL;
    p = Head->next;
    //链表为空直接返回
    if (p == NULL)
    {
        free(Head);
        return;
    }
    while (p != NULL)
    {
        q = p;
        p = p->next;
        free(q);
    }
    free(Head);
}

//按男女统计得分
void SexScore(LinkList Head, char Colleges[][20], int CollegesNum)
{
    LinkList man_score, woman_score;
    Init(man_score);
    Init(woman_score);
    int i;

    for (i = 0; i < CollegesNum; i++)
    {
        int a[N] = {0};
        Node *p = Head->next;

        LinkList man, womon;
        Init(man);
        Init(womon);

        while (p != NULL)
        { //统计某学院男生,女生成绩
            if (strcmp(Colleges[i], p->college) == 0 && p->sex == 0)
            {
                Insert(womon, p->score, p->rank, p->sex, p->name, p->college, p->item);
            }

            if (strcmp(Colleges[i], p->college) == 0 && p->sex == 1)
            {
                Insert(man, p->score, p->rank, p->sex, p->name, p->college, p->item);
            }
            p = p->next;
        }

        p = man->next;

        while (p != NULL)
        {
            a[i] += p->score;
            p = p->next;
        }

        Insert(man_score, a[i], 0, 0, "", Colleges[i], "");

        p = NULL;
        a[i] = 0;
        p = womon->next;
        while (p != NULL)
        {
            a[i] += p->score;
            p = p->next;
        }
        Insert(woman_score, a[i], 0, 0, "", Colleges[i], "");
        Free(man);
        Free(womon);
    }

    Node *q;
    q = man_score->next;
    printf("学院男生团体的前八名为\n");
    while (q != NULL)
    {
        printf("%s男生团体得分为:   %d\n", q->college, q->score);
        q = q->next;
    }
    q = NULL;
    q = woman_score->next;
    printf("学院女生团体的前八名为\n");
    while (q != NULL)
    {
        printf("%s女生团体得分为:   %d\n", q->college, q->score);
        q = q->next;
    }

    Free(man_score);
    Free(woman_score);
}
//查询某学院某个项目获奖情况
void QueryCollege(LinkList Head)
{

    char item[20], college[20];

    printf("请输入您要查询的学院名:\n");
    scanf("%s", &college);

    printf("请输入您要查询的项目名:\n");
    scanf("%s", &item);

    Node *p = Head->next;

    while (p != NULL)
    {
        if (strcmp(college, p->college) == 0 && strcmp(item, p->item) == 0)
        {
            Print(p);
        }
        p = p->next;
    }
}
//查询选手成绩
void QueryName(LinkList Head)
{
    char name[20];

    printf("请输入您要查询的选手姓名:\n");
    scanf("%s", &name);

    Node *p = Head->next;

    while (p != NULL)
    {
        if (strcmp(name, p->name) == 0)
        {
            Print(p);
        }
        p = p->next;
    }
}

// 按大小顺序插入建立一个链表
void Insert(LinkList &Head, int score, int rank, int sex, char name[], char college[], char item[])
{
    LinkNode *p = Head->next, *s = NULL;
    LinkNode *q = Head;
    //如果链表为空,则做初始化链表
    if (p == NULL)
    {
        s = (LinkNode *)malloc(sizeof(LinkNode));
        assert(s != NULL);
        s->score = score;
        s->rank = rank;
        s->sex = sex;
        strcpy(s->name, name);
        strcpy(s->college, college);
        strcpy(s->item, item);
        s->next = NULL;
        Head->next = s;
    }
    else
    {
        while (p != NULL && score <= p->score)
        {
            q = p;
            p = p->next;
        }
        s = (LinkNode *)malloc(sizeof(LinkNode));
        assert(s != NULL);
        s->score = score;
        s->rank = rank;
        s->sex = sex;
        strcpy(s->name, name);
        strcpy(s->college, college);
        strcpy(s->item, item);

        s->next = p;
        q->next = s;
    }
}

//查询项目得分情况
void QueryItem(LinkList Head)
{
    char item[20];
    LinkList t;
    Init(t);

    printf("请输入您要查询的项目名:\n");
    scanf("%s", &item);

    Node *p = Head->next;

    while (p != NULL)
    {
        if (strcmp(item, p->item) == 0)
        {
            Insert(t, p->score, p->rank, p->sex, p->name, p->college, p->item);
        }
        p = p->next;
    }

    p = t->next;
    printf("%s项目前八名为\n", item);

    while (p != NULL)
    {
        Print(p);
        p = p->next;
    }
}

//打印指针内的数据
void Print(Node *p)
{
    printf("\n\n\n\n");
    printf("*************************\n");
    printf("姓名为          ");
    printf("%s\n", p->name);

    printf("性别为          ");
    printf("%d\n", p->sex);

    printf("学院为          ");
    printf("%s\n", p->college);

    printf("项目为          ");
    printf("%s\n", p->item);

    printf("名次为          ");

    printf("%d\n", p->rank);

    printf("分数为          ");
    printf("%d\n", p->score);
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构课程设计c语言运动会管理系统 的相关文章

随机推荐

  • STL中的所有算法(70个)

    STL中的所有算法 70个 参考自 http www cppblog com mzty archive 2007 03 14 19819 htmlhttp hi baidu com dinglinbin blog item 887e7c30
  • CSS实现三角形的四种方法

    方法一 使用 border 常见 解释 不设置宽高 用边框大小控制三角型大小 分解步骤 设置一个div不设宽高 示例 2 设置透明 留下想要指向方向相反的边框设定 其他方向的边框设为transparent透明 示例 实现指向向上的三角形
  • 源码安装nginx到指定目录

    首先是全部步骤概括 yum install libaio ncurses gcc gcc c cmake ncurses devel wget yum install pcre devel zlib devel wget http ngin
  • 【Vue基本指令】一.什么是Vue;二.Vue开发的方式;三.Vue的基本指令(重点)

    目录 一 什么是Vue 1 前端技术的发展 html CSS JavaScript 1 JQuery 是对JavaScript进行了封装 使得操作DOM 事件处理 动画处理 Ajax交互变得非常简洁 方便 是JavaScript的库 Vue
  • centos 6 找不到Systemctl命令的解决办法

    CentOS 无法找到 Systemctl 命令的解决办法 没事 您可以使用 service 比如想要启动 NGINX 可以这样 service nginx start 使用 service 命令替代 参考资料 1 Systemctl无法找
  • PyCharm软件破解使用方法

    背景 PyCharm的破解方法有很多种 第一种是 授权服务器激活 第二种是 激活码激活 第三种是 破解补丁激活 本文针对第三种 破解补丁激活 给出有效的破解方法 准备工具 PyCharm破解补丁这个肯定是需要的 下载链接 PyCharm破解
  • mysql设置用户权限

    1 创建用户 CREATE USER username host IDENTIFIED BY password 2 程序中使用的mysql账号应该遵循最小权限原则 不允许夸库查询 故设置专门的账号供程序使用 grant select upd
  • 攻防兼备:中国蚁剑使用指南及特征流量

    中国蚁剑是菜刀的升级版本 线现下主流的Webshell连接工具之一 有着较广泛的使用 本篇文章会教给大家蚁剑的使用方法以及不同加密方式的流量特征 兼顾攻防两端 蚁剑下载安装参考 中国蚁剑 antSword 下载 安装 使用教程 蚁剑下载 攀
  • 微信开放平台【第三方平台】java开发总结:第三方平台授权流程说明(authorization_code)(四)

    第三方平台授权流程说明 全网最详细的微信第三方平台授权公众号 小程序开发说明 参考文档地址 ttps developers weixin qq com doc oplatform Third party Platforms Authoriz
  • 没有产品说明书时使用的测试——探索测试

    探索测试 Exploratory Testing 通常用于没有产品说明书的测试 这需要把软件当作产品说明书来看待 分步骤逐项探索软件特性 记录软件执行情况 详细描述功能 综合利用静态和动态技术来进行测试 探索测试人员只靠智能 洞察力和经验来
  • 3D游戏编程与设计作业5——简易打飞碟游戏

    一 作业要求 1 编写一个简单的自定义 Component 用自定义组件定义几种飞碟 做成预制 2 编写一个简单的鼠标打飞碟游戏 内容要求 游戏有多个轮次 每个轮次都包括10个轨迹 每个轨迹的飞碟的色彩 大小 发射位置 速度 角度 同时出现
  • 永洪BI助力矿产行业数智化转型

    北路智控携手永洪BI 助力矿产行业数智化转型 南京北路智控科技股份有限公司 301195 SZ 成立于2007年 总部位于南京市江宁滨江经济技术开发区 是一家专业从事矿山自动化 信息化 智能化等产品的设计 研发 生产 销售及服务为一体的高新
  • 主动扫描系列文章(3):nmap与masscan的配合使用

    20201103 目录 主动扫描系列文章 1 nmap的基础使用 主动扫描系列文章 2 masscan zmap扫描主机与端口 主动扫描系列文章 3 nmap与masscan的配合使用 0 引言 注 本篇文章中的工具并未实际测试 只是前期工
  • MySQL必知必会——第十六章创建高级联结

    创建高级联结 本章将讲解另外一些联结类型 包括它们的含义和使用方法 介绍如何对被联结的表使用表别名和聚集函数 使用表别名 第十章 MySQL必知必会 第十章创建计算字段 介绍了如何使用别名引用表列 mysql gt SELECT Conca
  • 股市股票基金市场研报合集(2022年,共195份)

    合集名称 股市股票基金市场研报合集 数量 195份 具体内容 股票基金市场 2021Q4公募基金及陆股通持仓分析 内外资加仓成长 减持消费 周期 20220125 华安证券 42页 pdf 股票基金市场 2021Q4公募基金持股分析 风险偏
  • php 微信分享好友朋友圈自定义标题 描述和图片 报错 63002,invalid signature

    之前搞过一次一直没有记录 导致这次操作的时候有点吃力报错 一直给我报错63002 invalid signature 记得第一次搞的时候很快啊 这次卡了几个小时时间去排查 首先我们要根据微信官方文档排查 确定不是自己参数问题 进入官方文档
  • C#笔记2——如何实现treeview的单击功能

    C 笔记2 如何实现treeview的单击功能 近来做了一个课设 需要使用treeview 并且实现treeview的单击效果 翻了几本教材 都没有具体说如何实现该功能 于是乎各种问度娘 在多次的尝试之下终于实现类单击功能 下面来详细讲解一
  • 乌班图linux分辨率不能调,ubuntu18.04 分辨率设置(双屏幕显示,添加没有的分辨率)...

    时间 2019 03 13 作者 魏文应 要解决什么问题 通过本文 你能够实现类似于以下的效果 给电脑接两个显示器 分别是独立显卡 nvidia 和集成显卡 独立显卡通过 DVI 接口和显示器连接 选择 拼接显示器 选项 扩展显示 ubun
  • mate30升级鸿蒙系数据会被清空吗,145直接升级鸿蒙会不会掉资料

    分享交流 145直接升级鸿蒙会不会掉资料 18919 电梯直达 中二的灵魂 略有小成 发表于 2020 12 19 06 58 28 来自 HUAWEI Mate 30 5G 最新回复 2020 12 19 10 59 19 如题 有升了的
  • 数据结构课程设计c语言运动会管理系统

    参加运动会的有n个学院 学校编号为1 n 比赛分成m个男子项目 和w个女子项目 项目编号为男子1 m 女子m 1 m w 不同的项目取前八名积分 且前八名的积分分别为 9 7 6 5 4 3 2 1 m lt 20 n lt 20 功能要求