1. 程式人生 > >運動會計分系統(試執行版)

運動會計分系統(試執行版)


/*Copyright (c) 2015, 煙臺大學計算機與控制工程學院
* All rights reserved.
* 檔名稱:終極版.cpp
* 作者:辛志勐
* 完成日期:2015年12月24日
* 版本號:VC6.0
* 專案描述:運動會統計系統
*/
</pre><pre name="code" class="csharp">/* 
   標頭檔案
*/
#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);  //輸出棧


/*
* 檔名稱:終極版.cpp
* 作者:辛志勐
* InitStack()
* 初始化棧
*/


void InitStack(SqStack *&s)
{
    s=(SqStack *)malloc(sizeof(SqStack));
    s->top=-1;
}
/*
* 檔名稱:終極版.cpp
* 作者:辛志勐
* DestroyStack()
* 銷燬棧
*/
void DestroyStack(SqStack *&s)
{
    free(s);
}
/*
*StackLength()
*返回棧中元素個數——棧長度
*/
int StackLength(SqStack *s)  
{
    return(s->top+1);
}
/*
*StackEmpty()
*棧空的情況,即棧下溢位
*/
bool StackEmpty(SqStack *s)
{
    return(s->top==-1);
}
/*
*Push()
*入棧
*/
bool Push(SqStack *&s,ElemType e)
{
    if (s->top==MaxSize-1)    //棧滿的情況,即棧上溢位
        return false;
    s->top++;
    s->data[s->top]=e;
    return true;
}
/*
*Pop()
*出棧
*/
bool Pop(SqStack *&s,ElemType &e)
{
    if (s->top==-1)     //棧為空的情況,即棧下溢位
        return false;
    e=s->data[s->top];
    s->top--;
    return true;
}
/*
*GetTop
*取棧頂元素
*/
bool GetTop(SqStack *s,ElemType &e)
{
    if (s->top==-1)         //棧為空的情況,即棧下溢位
        return false;
    e=s->data[s->top];
    return true;
}
/*
*DispStack()
*輸出棧
*/
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;
    }
}
/*
*main()
*函式的中心部分 (不可缺失的函式)
*有函式遞迴呼叫
*其他檔案呼叫
*/
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)?<span style="white-space:pre">	</span>"空":"非空"));
        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;
}






執行結果: