/***************************************************
* 版权所有 (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.成绩高低排列