/*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; }
运行结果: