基于链式存储结构的全运会径赛管理程序设计(重庆邮电大学软件基础实验报告)

作者我当时花了两天肝出来的,用于完成软件基础实验课的报告,欢迎同学们借鉴,我想只有把它发到CSDN上才会让我的付出最有价值😊如有不符合之处,烦请在评论区予以指正。(自认为算是比较完美了哈😁)

要求如下:

2.基于链式存储结构的全运会径赛管理程序设计

利用链式存储结构,为全运会100米的径赛初赛,编写一个管理程序,记录每个选手的姓名和身份证号,并通过数字化菜单为用户提供数据录入、抽签、查找和输出晋级名单的功能。需要实现的功能包括:

  1.  数据录入功能。通过键盘录入的数据包括姓名,身份证号,是否参加检录和比赛成绩。成绩录入的功能,需要在抽签完成后开放。数据录入的功能在抽签后应该关闭。
  2.  数据删除的功能。通过键盘录入选手的姓名或身份证号,然后从链表中删除对应的数据。删除的功能,在抽签后应该关闭。
  3.  抽签管理。通过抽签决定每个人的分组,以及参加检录的时间。每组的人数可以通过键盘进行修改,默认是8个人一组。完成抽签后,需要公布每个选手的组号和赛道信息,且后面的程序中不能再修改。
  4.  查找功能。通过输入身份证号,或者姓名,查询参赛选手的比赛成绩。
  5.  输出晋级名单。每组的前三名,再加上剩余的所有选手中成绩前三的选手晋级。

将上面的功能在菜单中同时列出。要求姓名和身份证号定义为字符串。为了节省数据录入的时间,可以将大部分数据存储在数组中,通过初始化程序将数据写入链表。键盘录入数据的功能,演示实现的过程就可以。要求演示功能的时候,至少要存储24名选手的数据。

完成以上程序代码的编写、调试,提供运行结果截图与相应的文字说明。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>

typedef struct race
{
    char Name[10];//姓名
    char ID[20];//身份证号
    int Judge;//标记是否检录
    char Judgetime[10];//检录时间
    int Score;//成绩
    int Team;//组别
    int Route;//赛道
    int Fi;//标记是否入榜,入榜过的不再理会
    struct race*Next;//指后指针
    struct race*Front;//指前指针
}R,*Ra;

void Ini(R A[],R*head,Ra*end,int Q);
void Draw(R*head,int e);
void Chou_show(R*head);
void Score_reg(R*head);
void Score_show(R*head);
Ra Search(R*head);
Ra Delete(R*head,Ra*end);
void AllShow(R*head);
Ra Final_racer(R*head,int e);

int main()
{
    int Q=24;
    int e=8;//默认每组的人数
    R A[Q];
    R*head=(R*)calloc(1,sizeof(R));
    Ra end=NULL;Ra F=NULL;//F是晋级榜首地址
    Ini(A,head,&end,Q);//初始化A数组,预存24组选手,并且存入链表
    int o=-1;//操作数
    int chou=0;
    int cjlr=0;//通过俩标志变量判断操作是否进行过
    while(o!=0)
    {
        printf("《--欢迎使用全运会径赛管理程序--》\n");
        printf("1.选手信息录入  2.抽签分组\n");
        printf("3.成绩录入      4.删除选手信息\n");
        printf("5.查找选手      6.打印晋级名单\n");
        printf("0.退出程序      7.展示所有(测试用)\n");
        fflush(stdin);scanf("%d",&o);
        switch(o)
        {
        case 1:if(chou==0)
        {
            printf("录入几位选手?");fflush(stdin);
            int n;scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                Register(&end);
            }
        }
        else {printf("抽签后无法录入!\n");}
        break;
            case 2:if(chou==0)
            {
                printf("是否修改每组人数?1.是  2.否\n");
                int que=2;fflush(stdin);
                scanf("%d",&que);
                if(que==1)
                {
                    printf("修改后的每组人数:");
                scanf("%d",&e);
                }
                Draw(head,e);
                chou=1;
                Chou_show(head);
            }
            else {printf("不能重复抽签!\n");}
            break;
            case 3:if(chou==1)
            {
                Score_reg(head);
                cjlr=1;
            }
            else {printf("请在抽签完成后再录入成绩!\n");}
            break;
            case 4:if(chou==0)
            {
                head=Delete(head,&end);
            }
            else printf("抽签完成后不能删除选手信息!\n");
            break;
            case 5:if(cjlr==1)
            {
                Score_show(head);
            }
            else printf("请在成绩录入后再查询!\n");
            break;
            case 6:if(cjlr==1)
            {
                if(F==NULL)//榜单出来后不能再创建,因为入榜的Fi都置一了
                {F=Final_racer(head,e);}
                AllShow(F);
            }
            else printf("请在成绩录入后再查询!\n");break;
            case 7:AllShow(head);break;
            case 0:return 0;
            default:printf("请重新选择操作!\n");
        }
    }
}
void Ini(R A[],R*head,Ra*end,int Q)
{
    char name[]="001";
    char id[]="2003001";
    srand((unsigned int)time(NULL));
    for(int j=0;j<Q;j++)//初始化数组
    {
        strcpy(A[j].Name,name);
        if(name[2]<'9') {name[2]++;}
        else {name[2]='0';name[1]++;}//进位
        strcpy(A[j].ID,id);
        if(id[6]<'9') {id[6]++;}
        else {id[6]='0';id[5]++;}
        if(rand()%11==0) A[j].Judge=0;
        //随机数求11的余使未检录的比例大大减小
        else A[j].Judge=1;//随机决定选手是否检录
    }
    R*p=head;//把数组的内容copy到链表
    int j;
    for(j=0;j<Q-1;j++)
    {
     strcpy(p->Name,A[j].Name);
     strcpy(p->ID,A[j].ID);
     p->Judge=A[j].Judge;
     p->Next=(R*)calloc(1,sizeof(R));
     p=p->Next;
     p->Next=NULL;
    }
    strcpy(p->Name,A[j].Name);
     strcpy(p->ID,A[j].ID);
     p->Judge=A[j].Judge;
     *end=p;
}
void Register(Ra*end)
{
    Ra p=*end;
    p->Next=(Ra)calloc(1,sizeof(R));
    p=p->Next;
    printf("请输入该选手的以下信息:\n");
    printf("姓名:");fflush(stdin);
    scanf("%s",p->Name);
    printf("身份证号:");fflush(stdin);
    scanf("%s",p->ID);
    printf("是否检录?1.是  0.否");fflush(stdin);
    scanf("%d",&p->Judge);
    *end=p;
}
void Draw(R*head,int e)
{
    int i=1;
    int t=1;
    char time[]="15:10";
    Ra p=head;
    while(p!=NULL)
    {
        if(i>e)
            {
                i=1;
                t++;
                time[3]++;
            }
        p->Team=t;
        p->Route=t;
        strcpy(p->Judgetime,time);
        i++;p=p->Next;
    }
}
void Chou_show(R*head)
{
   R*p=head;
    int i=1;
    while(p!=NULL)
    {
        printf("第%d位选手:\n",i);
        printf("姓名:%s\n",p->Name);
        printf("身份证号:%s\n",p->ID);
        if(p->Judge==0) printf("是否检录?否\n");
        else
        {
            printf("是否检录?是\n");
            printf("检录时间:%s\n",p->Judgetime);
        }
        printf("组号:%d\n",p->Team);
        printf("赛道信息:%d\n",p->Route);
        printf("\n");
        p=p->Next;
        i++;
    }
}
void Score_reg(R*head)
{
    Ra p=head;
    srand((unsigned int)time(NULL));
    while(p!=NULL)
    {
        if(p->Judge==1)
        {
            p->Score=rand()%(100 - 50 + 1) + 50;
            //录入50~100的随机数(上网)
        }
        p=p->Next;
    }
}
Ra Search(R*head)
{
    R*p=head;
    Ra f=NULL;
    S:printf("请输入一项该选手的基本信息:1.姓名  2.身份证号");
    int j;fflush(stdin);scanf("%d",&j);
    if(j==1)
    {
        printf("请输入姓名:");
        char name[10];fflush(stdin);
        scanf("%s",name);
        while(p!=NULL)
        {
            p->Front=f;
            f=p;//寻找的过程中建立指前的指针
            if(strcmp(name,p->Name)==0)
            {
                printf("该选手的相关信息如下:\n");
                printf("姓名:%s\n",p->Name);
                printf("身份证号:%s\n",p->ID);
                return p;
            }
            p=p->Next;
        }
        printf("未找到该选手!\n");
        return NULL;
    }
    else if(j==2)
    {
       printf("请输入身份证号:");
       char id[20];fflush(stdin);
       scanf("%s",id);
       while(p!=NULL)
        {
            p->Front=f;
            f=p;
            if(strcmp(id,p->ID)==0)
            {
                printf("该选手的相关信息如下:\n");
                printf("姓名:%s\n",p->Name);
                printf("身份证号:%s\n",p->ID);
                return p;
            }
            p=p->Next;
        }
        printf("未找到该选手!\n");
        return NULL;
    }
    else goto S;
}
void Score_show(R*head)
{
   Ra p=Search(head);
   if(p!=NULL)
   {
       if(p->Judge==1) printf("成绩:%d\n",p->Score);
       else printf("该选手未检录,无成绩!\n");
   }
}
Ra Delete(R*head,Ra*end)
{
    Ra tem=NULL;
    R*p=Search(head);
    if(p!=NULL)
    {
        Q:printf("确认要删除该选手吗?1.是  2.否");
        int j;fflush(stdin);scanf("%d",&j);
        if(j==1)
        {
            tem=p->Next;
            if(p==head)//”杀头“
            {
                free(p);
                printf("删除成功!\n");
                return tem;
            }
            p->Front->Next=tem;//缝合,用到了指前的指针(就用这一次)
            free(p);
            printf("删除成功!\n");
            return head;
        }
        else if(j==2) return head;
        else goto Q;
    }
}
Ra Final_racer(R*head,int e)
{
    Ra p=head;
    Ra H=(Ra)calloc(1,sizeof(R));//晋级榜首但是不存数据
    Ra h=H;//h指榜尾
    Ra ma=NULL;//ma存最高成绩的地址
    int i=1;
    int max=0;
    for(int j=1;j<=3;j++)
    {
        while(p!=NULL)
    {
        if(p->Score>=max&&p->Fi!=1)
    {
        max=p->Score;
        ma=p;
    }
     i++;//此话位置非常关键,决定了边界
        if(i>e)//存每组的榜一
    {
        h->Next=(Ra)calloc(1,sizeof(R));
        h=h->Next;
        ma->Fi=1;//入榜Fi置1
        strcpy(h->Name,ma->Name);
        strcpy(h->ID,ma->ID);
        strcpy(h->Judgetime,ma->Judgetime);
        h->Judge=ma->Judge;
        h->Team=ma->Team;
        h->Route=ma->Route;
        h->Score=ma->Score;
        i=1;
        max=0;
    }
    p=p->Next;
    }
    p=head;max=0;
    }
    ma=NULL;
    for(int j=1;j<=3;j++)//除开分组后的榜三
    {
        while(p!=NULL)
        {
        if(p->Score>=max&&p->Fi!=1)
        {
        max=p->Score;
        ma=p;
        }
        p=p->Next;
        }
        h->Next=(Ra)calloc(1,sizeof(R));
        h=h->Next;
        ma->Fi=1;
        strcpy(h->Name,ma->Name);
        strcpy(h->ID,ma->ID);
        strcpy(h->Judgetime,ma->Judgetime);
        h->Judge=ma->Judge;
        h->Team=ma->Team;
        h->Route=ma->Route;
        h->Score=ma->Score;
        max=0;
        p=head;
    }
    return H->Next;
}
void AllShow(R*head)
{
    R*p=head;
    int i=1;
    while(p!=NULL)
    {
        printf("第%d位选手:\n",i);
        printf("姓名:%s\n",p->Name);
        printf("身份证号:%s\n",p->ID);
        if(p->Judge==0)printf("是否检录?否\n");
        else
        {
        printf("是否检录?是\n");
        printf("检录时间:%s\n",p->Judgetime);
        printf("成绩:%d\n",p->Score);
        }
        printf("组号:%d\n",p->Team);
        printf("赛道信息:%d\n",p->Route);
        printf("\n");
        p=p->Next;
        i++;
    }
}
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值