您的位置:首页 > 其它

运动会分数统计系统开发(第一版)

2015-12-25 13:14 441 查看
/***************************************************
* 版权所有 (C/C++) 2015,辛志勐
* 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:终极版.cpp
* 作者:辛志勐
* 完成日期:2015年12月24日
* 版本号:VC6.0
* 项目描述:运动会分数统计系统
****************************************************/


             

/**************************** 

*  头文件

*****************************/

#include<iostream>

using namespace std;

#include<stdlib.h>

#include<stdio.h>

#define CLEAR "cls"

#define n 2//学校数目

#define m 1//田径项目数目

#define w 1//跳高项目数目

#define null 0

#include <malloc.h>

#define MaxSize 100

typedef char ElemType;

typedef struct

{

    ElemType data[MaxSize];

    int top;                //栈指针

} SqStack;                  //顺序栈类型定义

void InitStack(SqStack *&s);    //初始化栈

void DestroyStack(SqStack *&s);  //销毁栈

bool StackEmpty(SqStack *s);     //栈是否为空

int StackLength(SqStack *s);  //返回栈中元素个数——栈长度

bool Push(SqStack *&s,ElemType e); //入栈

bool Pop(SqStack *&s,ElemType &e); //出栈

bool GetTop(SqStack *s,ElemType &e); //取栈顶数据元素

void DispStack(SqStack *s);  //输出栈

/*****************************

* 功能:初始化栈

* InitStack()

* 输入参数:无

* 输出参数:无

* 返回值: 无

*******************************/

void InitStack(SqStack *&s)

{

    s=(SqStack *)malloc(sizeof(SqStack));

    s->top=-1;

}

/****************************

* 功能:销毁栈

* DestroyStack()

* 输入参数:无

* 输出参数:无

* 返回值: 无

*****************************/

void DestroyStack(SqStack *&s)

{

    free(s);

}

/******************************

* 功能:返回栈中元素个数——栈长度

* StackLength()

* 返回栈中元素个数——栈长度

* 输入参数:无

* 输出参数:s

* 返回值: s->top+1

*******************************/

int StackLength(SqStack *s)  

{

    return(s->top+1);

}

/*****************************

* 功能:栈空的情况,即栈下溢出

* StackEmpty()

* 输入参数:无

* 输出参数:s

* 返回值: s->top==-1

******************************/

bool StackEmpty(SqStack *s)

{

    return(s->top==-1);

}

/*****************************

* 功能:入栈

* Push()

* 输入参数:s

* 输出参数:无

* 返回值: true or flase

******************************/

bool Push(SqStack *&s,ElemType e)

{

    if (s->top==MaxSize-1)    //栈满的情况,即栈上溢出

        return false;

    s->top++;

    s->data[s->top]=e;

    return true;

}

/*****************************

* 功能:出栈

* Pop()

* 输入参数:e

* 输出参数:s

* 返回值: s or 无

*******************************/

bool Pop(SqStack *&s,ElemType &e)

{

    if (s->top==-1)     //栈为空的情况,即栈下溢出

        return false;

    e=s->data[s->top];

    s->top--;

    return true;

}

/******************************

* 功能:取栈顶元素

* GetTop

* 输入参数:e

* 输出参数:s

* 返回值:s or 无   

*******************************/

bool GetTop(SqStack *s,ElemType &e)

{

    if (s->top==-1)         //栈为空的情况,即栈下溢出

        return false;

    e=s->data[s->top];

    return true;

}

/******************************

* 功能:输出栈

* DispStack()

* 输入参数:无

* 输出参数:s

* 返回值:s   

*******************************/

void DispStack(SqStack *s)  //输出栈

{

    int i;

    for (i=s->top; i>=0; i--)

        printf("%c ",s->data[i]);

    printf("\n");

}

/***********************

* 定义结构体数组

************************/

typedef struct

{

    int itemnum;//项目编号

    int top;    //取名次的数目

    int range[5]; //名次

    int mark[5];  //分数

} itemnode;  //定义项目结点的类型

typedef struct

{

    int schoolnum;   //学校编号

    int score;    //学校总分

    int mscore;   //田径体总分

    int wscore;   //跳高体总分

    itemnode c[m+w];   //项目数组

} headnode; //定义头结点类型

headnode h
;//定义一个头结点数组

/*******************************************************

* 功能:项目的输入信息

* inputinformation()

* 输入:学校编号,项目编号,获得名次,名次个数

* 输出:无

* 返回值:无

********************************************************/

void inputinformation()//输入信息,建立系统

{

    int i,j,k,s;

    for(i=0; i<n; i++)

    {

        h[i].score=0;

        h[i].mscore=0;

        h[i].wscore=0;

    }//初始化头结点

    for(i=0; i<n; i++)

    {

        printf("*****学校编号:");

        cout<<endl;

        //scanf("%d",&h[i].schoolnum);

        cout<<"请按顺序选择参与运动会的学校"<<endl;

        cout<<"1.烟台大学   2.清华大学"<<endl;

        scanf("%d",&h[i].schoolnum);

        if(h[i].schoolnum==1)

            cout<<"烟台大学"<<endl;

        else

            cout<<"清华大学"<<endl;

//输入学校的编号信息

        for(j=0; j<m+w; j++)

        {

            printf("*****请按顺序输入项目编号\n");

            printf("*****请选择项目\n");

            printf("1.田径 2.跳高:");

            scanf("%d",&h[i].c[j].itemnum);

            printf("*****取前3名or前5名:");

            scanf("%d",&h[i].c[j].top);

            while(h[i].c[j].top!=3&&h[i].c[j].top!=5)

            {

                cout<<"输入错误"<<endl;

                cout<<"请重新输入:"<<endl;

                cin>>h[i].c[j].top;

            }

            printf("*****获得几个名次:");

            scanf("%d",&k);  //输入项目信息

            for(s=0; s<5; s++)

            {

                h[i].c[j].range[s]=0;

                h[i].c[j].mark[s]=0;

            }

            //初始化排名和分数

            for(s=0; s<k; s++)

            {

                printf("*****名次:");

                scanf("%d",&h[i].c[j].range[s]);     //输入所获名次信息

                if(h[i].c[j].top==3)

                    switch(h[i].c[j].range[s])

                    {

                    case 0:

                        h[i].c[j].mark[s]=0;

                        break;

                    case 1:

                        h[i].c[j].mark[s]=5;

                        break;

                    case 2:

                        h[i].c[j].mark[s]=3;

                        break;

                    case 3:

                        h[i].c[j].mark[s]=2;

                        break;

                    }

                else

                    switch(h[i].c[j].range[s])

                    {

                    case 0:

                        h[i].c[j].mark[s]=0;

                        break;

                    case 1:

                        h[i].c[j].mark[s]=7;

                        break;

                    case 2:

                        h[i].c[j].mark[s]=5;

                        break;

                    case 3:

                        h[i].c[j].mark[s]=3;

                        break;

                    case 4:

                        h[i].c[j].mark[s]=2;

                        break;

                    case 5:

                        h[i].c[j].mark[s]=1;

                        break;

                    }

                h[i].score=h[i].score+h[i].c[j].mark[s];//按取前三名还是取前五名分别记分

                if(j<=m-1)

                    h[i].mscore=h[i].mscore+h[i].c[j].mark[s]; //是田径项目则记到田径分数里面去

                else

                    h[i].wscore=h[i].wscore+h[i].c[j].mark[s]; //是跳高项目则记到跳高项目里面去

            }

            printf("\n");

        }

    }

}

/**************************************************

* 功能:函数的输出

* output()

* 输入:1,2,3,4,0(根据用户不同的选择进行输入)

* 输出:按学校编号输出

*      按学校总分输出  

*      按田径总分输出

*      按跳高总分输出

* 返回值:无

***************************************************/

void output() //输出函数

{

    int choice,i,j,k;

    int remember
;

    int sign;

    do

    {

        printf("*******************1.按学校编号输出.*******************\n");

        printf("*******************2.按学校总分输出.*******************\n");

        printf("*******************3.按田径总分输出.*******************\n");

        printf("*******************4.按跳高总分输出.*******************\n");

        printf("\n\n*******************请选择编号*************************\n\n:");

        scanf("%d",&choice);

        system(CLEAR);

        switch(choice)

        {

        case 1:

            for(i=0; i<n; i++)

            {

                //printf("\n\n*****学校编号:%d\n",h[i].schoolnum);

                if(i==0)

                {

                    cout<<"*****1.烟台大学:"<<endl;

                    printf("*****学校总分:%d\n",h[i].score);

                    printf("*****田径总分:%d\n",h[i].mscore);

                    printf("*****跳高总分:%d\n",h[i].wscore);

                    cout<<endl;

                    cout<<endl;

                    cout<<endl;

                    cout<<endl;

                }

                else if(i==1)

                {

                    cout<<"*****2.清华大学:"<<endl;

                    printf("*****学校总分:%d\n",h[i].score);

                    printf("*****田径总分:%d\n",h[i].mscore);

                    printf("*****跳高总分:%d\n",h[i].wscore);

                    cout<<endl;

                    cout<<endl;

                    cout<<endl;

                    cout<<endl;

                }

            }//按编号顺序输出

            break;

        case 2:

            for(i=0; i<n; i++)

                remember[i]=i;

            for(i=0; i<n; i++)

            {

                for(j=i+1; j<n; j++)

                {

                    if(h[remember[i]].score<h[j].score)

                    {

                        k=remember[i];

                        remember[i]=remember[j];

                        remember[j]=k;

                    }

                }

            } // 用冒泡排序方法,用辅助数组记住头结点下标

            for(i=0; i<n; i++)

            {

                printf("\n\n*****学校编号:%d\n",h[remember[i]].schoolnum);

                printf("*****学校总分:%d\n",h[remember[i]].score);

                printf("*****田径总分:%d\n",h[remember[i]].mscore);

                printf("*****跳高总分:%d\n",h[remember[i]].wscore);//按所记下标顺序输出

                cout<<endl;

                cout<<endl;

                cout<<endl;

            }

            //按学校总分输出

            break;

        case 3:

            for(i=0; i<n; i++)

                remember[i]=i;

            for(i=0; i<n; i++)

            {

                for(j=i+1; j<n; j++)

                {

                    if(h[remember[i]].mscore<h[j].mscore)

                    {

                        k=remember[i];

                        remember[i]=remember[j];

                        remember[j]=k;

                    }

                }

            }

            for(i=0; i<n; i++)

            {

                printf("\n\n*****学校编号:%d\n",h[remember[i]].schoolnum);

                printf("*****学校总分:%d\n" ,h[remember[i]].score);

                printf("*****田径总分:%d\n",h[remember[i]].mscore);

                printf("*****跳高总分:%d\n",h[remember[i]].wscore);

                cout<<endl;

                cout<<endl;

                cout<<endl;

            } //按田径总分输出

            break;

        case 4:

            for(i=0; i<n; i++)

                remember[i]=i;

            for(i=0; i<n; i++)

            {

                for(j=i+1; j<n; j++)

                {

                    if(h[remember[i]].wscore<h[j].wscore)

                    {

                        k=remember[i];

                        remember[i]=remember[j];

                        remember[j]=k;

                    }

                }

            }

            for(i=0; i<n; i++)

            {

                printf("\n\n*****学校编号:%d\n",h[remember[i]].schoolnum);

                printf("*****学校总分:%d\n" ,h[remember[i]].score);

                printf("*****田径总分:%d\n",h[remember[i]].mscore);

                printf("*****跳高总分:%d\n",h[remember[i]].wscore);

                cout<<endl;

                cout<<endl;

                cout<<endl;

            }

            break;  //按跳高总分输出

        }

        printf("请选择2继续,0跳出\n");

        scanf("%d",&sign);

    }

    while(sign==2); //循环执行输出语句

}

/*************************************************

* 功能:调查函数

* inquiry()

* 输入:1,2,0(根据用户不同的选择进行输入)

* 输出:以每个项目的编号输出成绩

*      以每个学校的编号输出成绩

* 返回值:无

**************************************************/

void inquiry() //查询函数

{

    int choice;

    int i,j,k,s;

    printf("\n*****1:按学校编号查询\n");

    printf("\n*****2:按项目编号查询\n");

    printf("\n\n*****请选择查询方式:");//提供两种查询方式

    scanf("%d",&choice);

    switch(choice)

    {

    case 1:

        do

        {

            printf("要查询的学校编号1.烟台大学  2.清华大学:");

            scanf("%d",&i);

            if(i>n)

                printf("错误:这个学校没有参加此次运动会!\n\n\n");

            else

            {

                printf("要查询的项目编号1.田径  2.跳高:");

                scanf("%d",&j);

                if(j>m+w||j==0)

                    printf("此次运动会没有这个项目\n\n\n");//学校编号超出范围,则输出警告

                else

                {

                    printf("这个项目取前%d名,该学校的成绩如下:\n", h[0].c[j-1].top);

                    for(k=0; k<5; k++)

                    {

                        if(h[i-1].c[j-1].range[k]!=0)

                            printf("名次:%d\n",h[i-1].c[j-1].range[k]);

                    }//输出要查询学校项目的成绩

                }

            }

            printf("请选择2继续,0跳出\n");

            scanf("%d",&s);

            printf("\n\n\n");

        }

        while(s==2); //循环执行输出语句

        break;

    case 2:

        do

        {

            printf("要查询的项目编号1.田径  2.跳高:");

            scanf("%d",&s);

            if(s>m+w||s==0)

                printf("此次运动会不包括这个项目.\n\n\n"); //项目编号超出范围则输出警告

            else

            {

                printf("该项目取前 %d名,取得名次的学校\n",h[0].c[s-1].top);

                for(i=0; i<n; i++)

                {

                    for(j=0; j<5; j++)

                    {

                        if(h[i].c[s-1].range[j]!=0)

                            printf("学校编号:%d,名次:%d\n",h[i].schoolnum, h[i].c[s-1].range[j]);

                    }

                }

            }                         //输出该项目取得名次学校的成绩

            printf("\n\n\n继续 2,跳出 0\n");

            scanf("%d",&i);

            printf("\n\n\n");

        }

        while(i==2);

        break;

    }

}

/*********************************************************************

* 功能:函数的中心部分 (不可缺失的函数)包含以下几个方面:

*      1.给用户展示的程序界面

*      2.栈函数的调用

*      3.输入函数的调用

*      4.输出和查询函数的调用

*      5.main函数递归调用   

* 输入参数:根据用户需求输入

* 输出参数:按用户要求输出

* 返回参数:0

**********************************************************************/

int  main()

{

    int choice;

    cout<<endl;

    cout<<endl;

    cout<<endl;

    printf("         本次运动会分为    1.田径项目    2.跳高项目  \n");

    cout<<endl;

    printf("                 1.每个项目的第一名所得分数为7分\n");

    printf("                 2.每个项目的第二名所得分数为5分\n");

    printf("                 3.每个项目的第三名所得分数为3分\n");

    printf("                 4.每个项目的第四名所得分数为2分\n");

    printf("                 5.每个项目的第五名所得分数为1分\n");

    printf("                 6.其他名次不得分\n");

    cout<<endl;

    cout<<endl;

    cout<<endl;

    printf("                     使用请按1,结束请按其他键\n");

    int a;

    cin>>a;

    if(a==1)

        system(CLEAR);

    else

        return 0;

    printf("======================欢迎使用======================\n");

    printf("\n\n              运动会分数统计系统                   \n");

    printf("\n\n1.输入信息 \n");

    printf("2.输出信息 \n");

    printf("3.查询信息 \n");

    printf("4.各学校的名次成绩由高到低依次输出并自动输出,为保密成绩,将不公布学校编号\n");

    printf("5.退出系统 \n\n\n");

    printf("\n\n");

    printf("================================================\n\n");

    printf("********请选择要实现步骤的编号:\n\n");

    scanf("%d",&choice);

    system(CLEAR);

    if(choice==1)

    {

        inputinformation();

        main();

    }

    else if(choice==2)

    {

        output();

        main();

    }

    else if(choice==3)

    {

        inquiry();

        main();

    }

    else if(choice==5)

    {

        return 0;

    }

    else if(choice==4)

    {

        ElemType e;

        SqStack *s;

        // printf("(1)初始化成绩s\n");

        InitStack(s);

        cout<<endl;

        cout<<endl;

        printf("成绩为%s\n",(StackEmpty(s)?"空":"非空"));

        //printf("(3)依次进栈元素a,b,c,d,e\n");

        int i,j,k;

        int remember
;

        for(i=0; i<n; i++)

            remember[i]=i;

        for(i=0; i<n; i++)

        {

            for(j=i+1; j<n; j++)

            {

                if(h[remember[i]].score<h[j].score)

                {

                    k=remember[i];

                    remember[i]=remember[j];

                    remember[j]=k;

                }

            }

        } // 用冒泡排序方法,用辅助数组记住头结点下标

        for(i=0; i<n; i++)

        {

            Push(s,h[i].score);

        }

        // printf("(4)成绩%s\n",(StackEmpty(s)?"空":"非空"));

        printf("成绩长度为:%d\n",StackLength(s));

       // printf("从成绩顶到成绩底元素:");

        DispStack(s);

        printf("出成绩序列:");

        while (!StackEmpty(s))

        {

            Pop(s,e);

            printf("%d ",e);

        }

        printf("\n");

        //printf("释放成绩\n");

        //DestroyStack(s);

        //printf("成绩是否为空:%s\n",(StackEmpty(s)?
"空":"非空"));

        cout<<endl;

        cout<<endl;

        cout<<endl;

        cout<<"退出该项目请按2,任意键退出总程序"<<endl;

        cout<<endl;

        cout<<endl;

        cout<<endl;

        int l;

        cin>>l;

        if(l==2)

        {

            main();

        }

        else

        {

            return 0;

        }

    }

    else

    {

        return 0;

    }

    return 0;
}

运行结果展示:

1.初始界面



2.用户选择界面



3.用户输入界面



4.用户输出界面











5.用户查询界面



6.成绩高低排列

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: