運動會分數統計系統開發
阿新 • • 發佈:2018-11-18
1.初始介面/*************************************************** * 版權所有 (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; }
2.使用者選擇介面
3.輸入介面
4.輸出介面
5.查詢介面
6.成績高低輸出