数据结构之——运动会成绩管理

发布时间 2023-06-26 16:00:55作者: 王庆园

 

#include<stdio.h>
#include<math.h>
#include<process.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;

#define N 20 //学校最大数目
#define M 20 //男子项目最大数
#define W 20 //女子项目最大数

//存放个人信息的结构体
typedef struct people
{    
    char sname[20];//所属学校
    char name[10];//姓名
    char sex[10];//性别
    char iname[20];//参加项目名称
    int  type;//项目类型(团体/个人0/1)
    int competition;//个人名次
    int   score; //项目得分    
};
people p[N];////存放项目信息
typedef struct item
{
    char iname[10];//项目名称
    int  competition;//项目名次
    int  count;//参赛人数

};
item it[N];//项目


//存放学校信息的结构体
typedef struct school
{
    char sname[20];//学校名称
    char iname[10];//参加项目
    
    
};
school s[N];//学校
//存放分数信息
typedef struct score
{
    char sname[20];//学校名称
    int score1;//团体分数
    int scorem;//男子分数
    int scorew;//女子分数

};
score sc[N];//分数

void input();
//解释:为啥这里要先声明一下这个函数
//因为cpp文件有点病他必须按顺编译,也就是说我下面某个函数如果需要调用其他函数那这个其他函数必须在这个函数前面
//简单来说1调用2的话 ,2必须在1前面
//这里菜单函数在每一个函数后面都需要调用,所以就很迷惑把哪个放在前面都出错-- 。--! 
//所以找出在前面先声明一下函数,告诉编译器我有这么一个函数!
/*函数声明*/
void output();//统计输出的函数
void searchschool();//查询学校
void schoolname();//这里用来产生学校名称
void allscore();//计算团体分数,男子分数,女子分数
void outputall();//输出所有学校
void outputperson();//输出个人
void search();//查询
void searchperson();//查询个人成绩
void searchitem();//查询项目
void sortput();//排序输出
void sortgroup();//按照团体分数输出
bool cmp(score a,score b);//排序方式
void sortman();//男子成绩输出
bool cmpm(score a,score b);
bool cmpw(score a,score b);
void sortwoman();//女子
void sortpeople();//输出个人成绩
bool cmpp(people a,people b);
void outputitem();//按照项目输出


void menu()
{
    int c;
   
   
  
    printf("\n运动会分数统计系统\n\n");
    printf("1.信息录入(文件录入)\n");
    printf("2.统计输出\n");
    printf("3.排序输出\n");
    printf("4.信息查询\n");
    printf("5.退出系统\n\n");
    printf("=======================================================\n\n");
    printf("请输入您想要实现的功能(0--4):");
    scanf("%d",&c);
    switch(c){
    case 1:
        input();
        break;
    case 2:
        output();
        break;
    case 3:
        sortput();
    case 4:
        search();
        break;
    default:
        printf("您输入有误,请重新输入!");
        menu();
    }
}

void input()
{
    
    FILE *fp1=fopen("D:\\sport_data\\school.txt","r");
    FILE *fp2=fopen("D:\\sport_data\\item.txt","r");
    FILE *fp3=fopen("D:\\sport_data\\people.txt","r");
    char row1[80],row2[80],row3[80];
    int i=0,j=0,k=0,h=0;
    while(fgets(row1,80,fp1)!=NULL)//录入学校结构体
    {
        sscanf(row1,"%s %s ",s[i].sname,s[i].iname);
        printf("%s\t%s\n",s[i].sname,s[i].iname);
        i++;
    }
    printf("学校信息录入成功!\n");
    while(fgets(row2,80,fp2)!=NULL)//录入项目结构体
    {
        sscanf(row2,"%s %d %d  ",it[j].iname,&it[j].competition,&it[j].count);
        printf("%s\t%d\t%d\n",it[j].iname,it[j].competition,it[j].count);
        j++;
    }
        printf("项目信息录入成功!\n");
    while(fgets(row3,80,fp3)!=NULL)//录入个人信息结构体
    {
        sscanf(row3,"%s %s %s %s %d %d %d ",p[k].sname,p[k].name,p[k].sex,p[k].iname,&p[k].type,&p[k].competition,&p[k].score);
        printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",p[k].sname,p[k].name,p[k].sex,p[k].iname,p[k].type,p[k].competition,p[k].score);
        k++;
    }
        printf("个人信息录入成功!\n");
        schoolname();//这里直接将学校名称存入
        allscore();
    
    menu();
}
void output()
{
     int c;
   
   
    printf("\n\t\t\t欢迎使用\t\t\t\t\t\n");
    printf("运动会分数统计系统\n\n");
  //  printf("1.按学校名称输出\n");
    printf("1.统计输出\n");
    printf("2.输出个人成绩\n");
    
    printf("3.返回主菜单\n\n");
    printf("=======================================================\n\n");
    printf("请输入您想要实现的功能(1--4):");
    scanf("%d",&c);
    switch(c){
   /* case 0:
        outputschool();//学校
        break;*/
    case 1:
        outputall();//全部
        break;
    case 2:
        outputperson();//输出个人
        break;

    case 3:
        menu();
    default:
        printf("您输入有误,请重新输入!");
        output();
    }
}
void outputitem()
{

}
void search()
{
        int c;
   
   
    printf("\t\t\t欢迎使用\t\t\t\t\t\n");
    printf("运动会分数统计系统\n\n");
    printf("1.查询学校名称\n");
    printf("2.查询个人成绩\n");
    printf("3.查询项目\n");
    printf("4.返回主菜单\n\n");
    printf("=======================================================\n\n");
    printf("请输入您想要实现的功能(1--4):");
    scanf("%d",&c);
    switch(c){
    case 1:
        searchschool();//学校
        break;
    case 2:
        searchperson();//全部
        break;
    case 3:
        searchitem();//输出个人
    case 4:
        menu();
    default:
        printf("您输入有误,请重新输入!");
       search();
    }
}
void searchschool()
{
    
    printf("请输入学校名称:");
    char sname[20];
    scanf("%s",sname);

    //schoolname();
    //allscore();
    int i=0;
    int sum=0;
    
    for(i=0;i<20;i++)
    {
        if(strcmp(sc[i].sname,sname)==0)
        {
            sum=sc[i].score1+sc[i].scorem+sc[i].scorew;
            printf("学校名称:%s\t 总分数:%d\t 团体分数:%d\t 男子总分:%d\t 女子总分:%d\n  ",sc[i].sname,sum,sc[i].score1,sc[i].scorem,sc[i].scorew);
        }
        
    }
    if(i==19)
    {
        printf("该学校不存在!");
    }
    search();
    
}
void searchperson()
{
    printf("请输入姓名:");
    char name[20];
    scanf("%s",name);
    int i=0;
    for(i=0;i<20;i++)
    {
        if(strcmp(p[i].name,name)==0)
        {
            
            printf("学校名称:%-10s\t姓名:%-10s\t性别:%-10s\t项目名称:%-10s\t名次:%-10d\t得分:%-10d\n ",p[i].sname,p[i].name,p[i].sex,p[i].iname,p[i].competition,p[i].score);
        
        }
        
    }
    if(i==19)
    {
        printf("该学生不存在!");
    }
    search();


}
void searchitem()
{
    printf("请输入项目名称:");
    char iname[20];
    scanf("%s",iname);
    int i=0;
    for(i=0;i<20;i++)
    {
        if(strcmp(p[i].iname,iname)==0)
        {
            
            printf("学校名称:%-10s\t姓名:%-10s\t性别:%-10s\t项目名称:%-10s\t名次:%-10d\t得分:%-10d\n ",p[i].sname,p[i].name,p[i].sex,p[i].iname,p[i].competition,p[i].score);
        
        }
        
    }
    if(i==19)
    {
        printf("该项目不存在!");
    }
    printf("是否输出该项目成绩单(是/否)0/1:");
    int a;
    scanf("%d",&a);
    if(a==0)
    {
        search();
    }else 
    {
        FILE *fp;
        
        char sname[20]={0};
    fopen_s(&fp,"D:\\sport_data\\item1.txt","wt+");//打开文件
        
        for(i=0;i<20;i++)
        {
            if(strcmp(p[i].iname,sname)!=0)
            {
                fprintf(fp,"%s\t %s\t %s\t %s\t %d\t %d\n",p[i].sname,p[i].name,p[i].sex,p[i].iname,p[i].competition,p[i].score);
            }
        }
        printf("文件已保存到D:\\sport_data\\item1.txt\n");
        fclose(fp);
        
        search();
    }
    
}
void outputall()
{
    
    int i=0;
    int sum=0;
    char sname[20]={0};
    for(i=0;i<20;i++)
    {
        if(strcmp(sc[i].sname,sname)!=0)
        {
            sum=sc[i].score1+sc[i].scorem+sc[i].scorew;
            printf("学校名称:%-5s\t 总分数:%-5d\t 团体分数:%-5d\t 男子总分:%-5d\t 女子总分:%-5d\n  ",sc[i].sname,sum,sc[i].score1,sc[i].scorem,sc[i].scorew);
        }
    }
    output();
}
bool cp(people a,people b)
{
    return a.score>b.score;
}
void outputperson()
{
    int i=0;
    int sum=0;
    char sname[20]={0};
    sort(p,p+20,cp);
    for(i=0;i<20;i++)
    {
        if(strcmp(p[i].sname,sname)!=0)
        {
            
            printf("学校名称:%-15s\t姓名:%s\t性别:%-10s\t项目名称:%-10s\t名次:%-10d\t得分:%-10d\n ",p[i].sname,p[i].name,p[i].sex,p[i].iname,p[i].competition,p[i].score);
        }
    }
    output();
}
void allscore()//计算各个分数
{
    int k=0;
    //int len=(sizeof(p)/sizeof(p[0]));//计算结构体数组长度
    char content[20]={0};//定义一个空char数组来判断是否为空
    for(k=0;k<20;k++)
    {
        if(strcmp(sc[k].sname,content)!=0)//分数中的名称不为空时
        {
        //printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",p[k].sname,p[k].name,p[k].sex,p[k].iname,p[k].type,p[k].competition,p[k].score);
        
            for(int i=0;i<20;i++)
            {
                if(strcmp(sc[k].sname,p[i].sname)==0)
                {
                    //0代表团体
                    //1代表个人
                    if(p[i].type==0)
                    {
                        sc[k].score1+=p[i].score;
                    }
                    else if(p[i].type==1)
                    {
                        char s[10]={""};
                        if(strcmp(p[i].sex,s)==0)
                        {
                            sc[k].scorem+=p[i].score;

                        }else {sc[k].scorew+=p[i].score;}
                        
                    }
                }
           }
        }
        
    }
        
    
}
void schoolname()//给sc中添加学校名称
{
    int order=0;
    strcpy(sc[order].sname,s[0].sname);
    for(int i=0;i<20;i++)
    {
        if(strcmp(sc[order].sname,s[i].sname)!=0)/*这里非常重要我们的两个char数组比较是否相等是不可以用==的因为==比较的是两个的地址是否相等    */                
        {        
            //printf("%s\n",sc[order].sname);                                    /*这里我们采用c++中的一个函数strcmp(s1,s2)在这里有*/        
            order+=1;                                //s1<s2返回负值  //s1>s2返回正值  /*s1=s2 返回值为0*/
            strcpy(sc[order].sname,s[i].sname);            //和上面同理这里char数组结构体和常量之间的赋值必须这样写
            
        }
    }
}
void sortput()
{
    int c;
   
   
    printf("\n\t\t\t欢迎使用\t\t\t\t\t\n");
    printf("运动会分数统计系统\n\n");
    printf("1.按照团体总分输出\n");
    printf("2.按照男子总分输出\n");
    printf("3.按照女子总分数出\n\n");
    printf("4.按照个人成绩出\n\n");
    printf("5.退出系统\n\n");
    printf("=======================================================\n\n");
    printf("请输入您想要实现的功能(1--4):");
    scanf("%d",&c);
    switch(c){
    case 1:
        sortgroup();//全部
        break;
    case 2:
        sortman();//输出男子成绩
    case 3:
        sortwoman();//输出女子
    case 4:
        sortpeople();//按照个人成绩输出
    case 5:
        menu();
    default:
        printf("您输入有误,请重新输入!");
        sortput();
    }
}
bool cmp(score a,score b)
{
    return a.score1>b.score1;
}
bool cmpm(score a,score b)
{
    return  a.scorem>b.scorem;
}
bool cmpw(score a,score b)
{
    return  a.scorew>b.scorew;
}
bool cmpp(people a,people b)
{
    return a.score>b.score;
}
void sortgroup()
{
    sort(sc,sc+20,cmp);
    int i=0;
    char sname[20]={0};

    for(i=0;i<20;i++)
    {
        if(strcmp(sc[i].sname,sname)!=0)
            printf("学校名称:%-5s\t 团体分数:%-5d\t 男子总分:%-5d\t 女子总分:%-5d\n  ",sc[i].sname,sc[i].score1,sc[i].scorem,sc[i].scorew);
        
    }
    //结构体数据保存到文件中去
    FILE *fp;
    fopen_s(&fp,"D:\\sport_data\\score.txt","wt+");//打开文件
    for(i=0;i<20;i++)
    {
        if(strcmp(sc[i].sname,sname)!=0)
        fprintf(fp,"%s\t %d\t  %d\t %d\n ",sc[i].sname,sc[i].score1,sc[i].scorem,sc[i].scorew);
    }
    printf("文件已保存到D:\\sport_data\\score.txt\n");
    fclose(fp);
        sortput();
}
void sortman()
{
    sort(sc,sc+20,cmpm);
    int i=0;
    char sname[20]={0};

    for(i=0;i<20;i++)
    {
        if(strcmp(sc[i].sname,sname)!=0)
            printf("学校名称:%-5s\t 团体分数:%-5d\t 男子总分:%-5d\t 女子总分:%-5d\n  ",sc[i].sname,sc[i].score1,sc[i].scorem,sc[i].scorew);
        
    }
    FILE *fp;
    fopen_s(&fp,"D:\\sport_data\\scoreman.txt","wt+");//打开文件
    for(i=0;i<20;i++)
    {
        if(strcmp(sc[i].sname,sname)!=0)
        fprintf(fp,"%s\t %d\t  %d\t %d\n ",sc[i].sname,sc[i].score1,sc[i].scorem,sc[i].scorew);
    }
    printf("文件已保存到D:\\sport_data\\scoreman.txt\n");
    fclose(fp);
        sortput();
}
void sortwoman()
{
    sort(sc,sc+20,cmpw);
    int i=0;
    char sname[20]={0};

    for(i=0;i<20;i++)
    {
        if(strcmp(sc[i].sname,sname)!=0)
            printf("学校名称:%-10s\t 团体分数:%-10d\t 男子总分:%-10d\t 女子总分:%-10d\n  ",sc[i].sname,sc[i].score1,sc[i].scorem,sc[i].scorew);
        
    }
    FILE *fp;
    fopen_s(&fp,"D:\\sport_data\\scorewoman.txt","wt+");//打开文件
    for(i=0;i<20;i++)
    {
        if(strcmp(sc[i].sname,sname)!=0)
        fprintf(fp,"%s\t %d\t  %d\t %d\n ",sc[i].sname,sc[i].score1,sc[i].scorem,sc[i].scorew);
    }
    printf("文件已保存到D:\\sport_data\\scorewoman.txt\n");
    fclose(fp);
    sortput();
}

void sortpeople()
{
    int i=0;
    sort(p,p+20,cmpp);
    char sname[20]={0};
    sort(p,p+20,cp);
    for(i=0;i<20;i++)
    {
        if(strcmp(p[i].sname,sname)!=0)
        {
            
            printf("学校名称:%-15s\t姓名:%s\t性别:%-10s\t项目名称:%-10s\t名次:%-10d\t得分:%-10d\n ",p[i].sname,p[i].name,p[i].sex,p[i].iname,p[i].competition,p[i].score);
        }
    }
    FILE *fp;
    fopen_s(&fp,"D:\\sport_data\\scorepeople.txt","wt+");//打开文件
    for(i=0;i<20;i++)
    {
        if(strcmp(p[i].sname,sname)!=0)
        fprintf(fp,"%s\t %s\t %s\t %s\t %d\t %d\n ",p[i].sname,p[i].name,p[i].sex,p[i].iname,p[i].competition,p[i].score);
    }
    printf("文件已保存到D:\\sport_data\\scorepeople.txt\n");
    fclose(fp);
    sortput();

}



//主函数
int main()
{
   
   
    printf("\t***********运动会分数统计系统***********\n\n");
    menu();
}