運動會分數統計系統開發(第一版)
阿新 • • 發佈:2018-11-18
/***************************************************
* 版權所有 (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.成績高低排列