运动会分数统计系统开发

/***************************************************
* 版权所有 (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[n];//定义一个头结点数组

/*******************************************************
* 功能:项目的输入信息
* 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[n];
    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[n];
        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.成绩高低输出



猜你喜欢

转载自blog.csdn.net/E_miss/article/details/50402660