⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 match.c

📁 拿“优”的数据结构课程设计:运动会分数统计。 里头包括源代码、exe文件、课程设计报告
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<malloc.h>
#include"Status.h"

//定义存储类型
#define MAX_NUM 20
typedef struct item
{
    int id;          //项目id
    int type;        //项目名次类型
    int schoolid[5]; //各名次学校id
    char name[6];    //项目名称
}item[MAX_NUM];
typedef struct school
{
    int id;        //学校id
    int score;     //学校总分
    int mscore;    //男子团体总分
    int wscore;    //女子团体总分
    char name[10]; //学校名称
}school[MAX_NUM];

//函数声明
Status Init(item **Item, school **School);
Status ReadDat(item *Item, school *School);
Status WriteDat(item *Item, school *School);
Status InPutData(item *Item, school *School);
Status SumScore(item *Item, school *School);
Status PrintAsSchoolid(school *School);
Status PrintAsScore(school *School);
Status PrintAsMScore(school *School);
Status PrintAsWScore(school *School);
Status SearchAsSchool(item *Item, school *School);
Status SearchAsItem(item *Item, school *School);
Status PrintMenu();
Status Chose(item *Item, school *School, int i);

//初始化存储空间
Status Init(item **Item, school **School)
{
    int i;
    //为项目的存储分配空间
    *Item = (item *)malloc(sizeof(item));
    if (!(*Item))  return FALSE;
    //初始化项目id
    for (i=0; i<MAX_NUM; i++)
    {
        (**Item)[i].id = 0;  //初始项目id为零
    }//for
    //为学校信息的存储分配空间
    *School = (school *)malloc(sizeof(school));
    if (!(*School))  return FALSE;
    //初始化学校信息
    for (i=0; i<MAX_NUM; i++)
    {
        (**School)[i].id = 0;      //学校id为零
        (**School)[i].score = 0;   //学校分数为零
        (**School)[i].mscore = 0;  //学校男子团体分数为零
        (**School)[i].wscore = 0;  //学校女子团体分数为零
    }//for
    return OK;
}//初始化存储空间

//从文件读取数据
Status ReadDat(item *Item, school *School)
{
    FILE *fp;
    int i, j;
    int maxSchool=0;
    int maxItem, manItem;
    if((fp=fopen("match.dat","r"))==NULL) return FALSE;
    //读取学校数量,初始化学校id
    fscanf(fp, "%d,", &maxSchool);
    for (i=0; i<maxSchool; i++)
    {
        (*School)[i].id = i+1;
    }//for
	//读取项目的数量和男子项目的数量,初始化项目id
    fscanf(fp, "%d,",&maxItem);
    fscanf(fp, "%d,",&manItem);
    for (i=0; i<manItem; i++)
    {
        (*Item)[i].id = i+1;
    }//for
    for (; i<maxItem; i++)
    {
        (*Item)[i].id = 0-i-1;
    }//for
    //读取各个项目的信息
    for (i=0; i<maxItem; i++)
    {
        fscanf(fp, "%d,", &(*Item)[i].type); //项目名次类型
        for (j=0; j<(*Item)[i].type; j++)
        {
            fscanf(fp, "%d,", &(*Item)[i].schoolid[j]); //项目各名次学校id
        }//for
        fgets((*Item)[i].name, 5, fp); //项目名称
    }//for
    //读取学校名称
    fgets((*School)[0].name, 2,  fp);
    for (i=0; i<maxSchool; i++)
    {
        fgets((*School)[i].name, 9, fp);
    }//for
    fclose(fp);
    return OK;
}//从文件读取数据

//将数据写入文件
Status WriteDat(item *Item, school *School)
{
    FILE *fp;
    int i, j;
    int maxSchool, maxItem, manItem;
    if((fp=fopen("match2.dat","w"))==NULL) return FALSE;
	//将学校数量、总项目数量、男子项目数量写入到文件
    for (maxSchool=0; (*School)[maxSchool].id; maxSchool++);//for
    for (maxItem=0,manItem=0; (*Item)[maxItem].id>0; maxItem++,manItem++);//for
    for (; (*Item)[maxItem].id; maxItem++);//for
    fprintf(fp, "%d,%d,%d,\n", maxSchool,maxItem,manItem);
    //将项目信息写入到文件
    for (i=0; (*Item)[i].id; i++)
    {
        fprintf(fp, "%d,", (*Item)[i].type); //项目名次类型
        for (j=0; j<(*Item)[i].type; j++)
        {
            fprintf(fp, "%d,", (*Item)[i].schoolid[j]); //项目各名次学校id
        }//for
        fputs((*Item)[i].name, fp); //项目名称
        fprintf(fp, "\n");
    }//for
    //将学校名称写入到文件
    for (i=0; i<maxSchool; i++)
    {
        fputs((*School)[i].name, fp);
    }//for
    fclose(fp);
    return OK;
}//将数据写入文件

//依次输入所有信息
Status InPutData(item *Item, school *School)
{
    int i, j;
    int maxItem, manItem, maxSchool;
    //输入参赛学校的数量
    printf("请输入参赛学校的数量:");
    scanf("%d",&maxSchool);
    while(maxSchool<1 || maxSchool>MAX_NUM)
    {
        printf("您输入学校的数量超出范围,请重新输入:");
        scanf("%d",&maxSchool);
    }//while
    //初始化学校id
    for (i=0; i<maxSchool; i++)
    {
        (*School)[i].id = i+1;
        printf("请输入编号为%d的学校的名称:",i+1);
        scanf("%s",(*School)[i].name);
    }//for
    //输入项目的数量
    printf("请输入项目的数量:");
    scanf("%d",&maxItem);
    while (maxItem<1 || maxItem>MAX_NUM)
    {
        printf("您输入项目的数量超出范围,请重新输入:");
        scanf("%d",&maxItem);
    }//while
    //输入男子项目的数量
    printf("请输入男子项目的数量:");
    scanf("%d",&manItem);
    while (manItem<1 || manItem>maxItem)
    {
        printf("您输入项目的数量超出范围,请重新输入:");
        scanf("%d",&manItem);
    }//while
    for (i=0; i<manItem; i++)
    {
        (*Item)[i].id = i+1;
    }//for
    for (; i<maxItem; i++)
    {
        (*Item)[i].id = 0-i-1;
    }//for
    //输入每个项目的相关信息
    for (i=0; i<maxItem; i++)
    {
        printf("\n现在开始输入第%d个项目的信息:\n",i+1);
        printf("该项目的取的名次范围是:");
        scanf("%d", &(*Item)[i].type);
        while((*Item)[i].type!=3 && (*Item)[i].type!=5)
        {
            printf("您输入名次取项超出范围,请重新输入:");
            scanf("%d", &(*Item)[i].type);
        }//while
        for (j=0; j<(*Item)[i].type; j++)
        {
            printf("第%d名学校的编号为:",j+1);
            scanf("%d,", &(*Item)[i].schoolid[j]);
            while((*Item)[i].schoolid[j]<1 || (*Item)[i].schoolid[j]>maxSchool)
            {
                printf("您输入的学校编号超出范围,请重新输入:");
                scanf("%d,", &(*Item)[i].schoolid[j]);
            }//while
        }//for
        printf("该项目的名称为:");
        scanf("%s",(*Item)[i].name);
    }//for
	return OK;
}//依次输入所有信息

//统计各学校分数
Status SumScore(item *Item, school *School)
{
    int i;
    for (i=0; (*Item)[i].id; i++)
    {
        if ((*Item)[i].type==3) //项目取前三名
        {
            (*School)[(*Item)[i].schoolid[0]-1].score += 5;  //第一名学校分数
            (*School)[(*Item)[i].schoolid[1]-1].score += 3;  //第二名学校分数
            (*School)[(*Item)[i].schoolid[2]-1].score += 2;  //第三名学校分数
            if((*Item)[i].id > 0)
            {
                (*School)[(*Item)[i].schoolid[0]-1].mscore += 5;  //第一名男子团体分数
                (*School)[(*Item)[i].schoolid[1]-1].mscore += 3;  //第二名男子团体分数
                (*School)[(*Item)[i].schoolid[2]-1].mscore += 2;  //第三名男子团体分数
            }//if
            else if((*Item)[i].id < 0)
            {
                (*School)[(*Item)[i].schoolid[0]-1].wscore += 5;  //第一名女子团体分数
                (*School)[(*Item)[i].schoolid[1]-1].wscore += 3;  //第二名女子团体分数
                (*School)[(*Item)[i].schoolid[2]-1].wscore += 2;  //第三名女子团体分数
            }//if
        }//if
        else if ((*Item)[i].type==5)//项目取前五名
        {
            (*School)[(*Item)[i].schoolid[0]-1].score += 7;  //第一名学校分数
            (*School)[(*Item)[i].schoolid[1]-1].score += 5;  //第二名学校分数
            (*School)[(*Item)[i].schoolid[2]-1].score += 3;  //第三名学校分数
            (*School)[(*Item)[i].schoolid[3]-1].score += 2;  //第四名学校分数
            (*School)[(*Item)[i].schoolid[4]-1].score += 1;  //第五名学校分数
            if((*Item)[i].id > 0)
            {
                (*School)[(*Item)[i].schoolid[0]-1].mscore += 7;  //第一名男子团体分数
                (*School)[(*Item)[i].schoolid[1]-1].mscore += 5;  //第二名男子团体分数
                (*School)[(*Item)[i].schoolid[2]-1].mscore += 3;  //第三名男子团体分数
                (*School)[(*Item)[i].schoolid[3]-1].mscore += 2;  //第四名学校分数
                (*School)[(*Item)[i].schoolid[4]-1].mscore += 1;  //第五名学校分数
            }//if
            else if((*Item)[i].id < 0)
            {
                (*School)[(*Item)[i].schoolid[0]-1].wscore += 7;  //第一名女子团体分数
                (*School)[(*Item)[i].schoolid[1]-1].wscore += 5;  //第二名女子团体分数
                (*School)[(*Item)[i].schoolid[2]-1].wscore += 3;  //第三名女子团体分数
                (*School)[(*Item)[i].schoolid[3]-1].wscore += 2;  //第四名女子分数
                (*School)[(*Item)[i].schoolid[4]-1].wscore += 1;  //第五名女子分数
            }//if
        }//if
    }//for
	return OK;
}//统计各学校分数

//按学校编号顺序排名
Status PrintAsSchoolid(school *School)
{
    int i;
    printf("按学校编号顺序排名\n\n");
    printf("│学校编号/名称 │ 团体总分 │ 男子总分 │ 女子总分 │\n");
    for (i=0; (*School)[i].id; i++)
    {
        printf("│%3d %s  ",i+1,(*School)[i].name);
        printf("│   %3d    ",(*School)[i].score);
        printf("│   %3d    ",(*School)[i].mscore);
        printf("│   %3d    │\n",(*School)[i].wscore);
    }
    printf("\n\n");
    system("pause");
    system("cls");
    return OK;
}//按学校编号顺序排名

//按学校总分顺序排名
Status PrintAsScore(school *School)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -