有n个学校参加运动会,学校名对应的编号为1……n。比赛分成m个男子项目,和w个女子项目。每个项目取前三名积分,前三名的积分分别为:5、3、2;数据可以存储在一个数据文件中,数据结构、具体数据自定。
具体功能有:
(1)从键盘输入学校、项目、项目得分信息;
(2)能统计各学校总分;
(3)能统计各个项目的前三名;
(4)可以按学校编号或名称、学校总分、男女团体总分排序输出;
(5)可以按学校编号查询学校某个项目的情况;
(6)可以按项目编号查询取得前三名的学校。
(7)数据存入文件并能随时查询。
zb大学 2018到2019年数据结构课设 17级 lzx 留,过去的祖传代码已经不适合当前需求了,学长在此留下代码,供后面的做些许参考,不希望写完的代码仅仅放在磁盘里。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define N 20 //男子,女子项目的最大个数
int n; //学校的个数
int m; //男子项目的个数
int w; //女子项目的个数
FILE *fp;
typedef struct {
int num;
int score;
int rank;
}Woman;
typedef struct {
int num;
int score;
int rank;
}Man;
typedef struct Item {
int num; //学校编号
char schoolName[N]; //学校名字
int score; //该学校所有成绩的综合
int Mscore; //男子所有项目的成绩和
int Wscore; //女子所有项目的成绩和
Man manItem[N];
Woman womanItem[N];
struct Item *next;
}Item,*ItemNode;
//链表的创建
void ListCreat(ItemNode &I){
ItemNode p,q,temp;
printf("请问此次有多少学校参加运动会?\n");
scanf("%d",&n);
printf("请问此次活动有多少男子项目?\n");
scanf("%d",&m);
printf("请问此次活动有多少女子项目?\n");
scanf("%d",&w);
p=I;
if((fp=fopen("sports.txt","w"))==NULL){
printf("文件打开失败\n");
getchar();
exit(1);
} else {
for(int i=1;i<=n;i++){
q = (ItemNode)malloc(sizeof(Item));
printf("第%d所学校的名字为:",i);
scanf("%s",q->schoolName);
fprintf(fp,"第%d所学校的名字为:",i);
fprintf(fp,"%s\n",q->schoolName);
printf("第%d所学校的编号为:",i);
scanf("%d",&q->num);
fprintf(fp,"第%d所学校的编号为:",i);
fprintf(fp,"%d\n",q->num);
fprintf(fp,"第%d所学校男子信息录入\n",i);
//男子项目信息的录入
for(int j=1;j<=m;j++){
printf("第%d所学校的第%d个男子项目的编号是:\n",i,j);
scanf("%d",&q->manItem[j].num);
printf("该学校该项目获得第几名?\n");
scanf("%d",&q->manItem[j].rank);
fprintf(fp,"编号:%d\t",j);
fprintf(fp,"名次:%d\n",q->manItem[j].rank);
}
fprintf(fp,"第%d所学校女子信息录入\n",i);
//女子项目信息的录入
for(int k=1;k<=w;k++){
printf("第%d所学校的第%d个女子项目的编号是:\n",i,k);
scanf("%d",&q->womanItem[k].num);
printf("该学校该项目获得第几名?\n");
scanf("%d",&q->womanItem[k].rank);
fprintf(fp,"编号:%d\t",k);
fprintf(fp,"名次:%d\n",q->womanItem[k].rank);
}
p->next = q;
p = q;
printf("\n******************************************\n\n");
fprintf(fp,"\n");
}
q->next = NULL;
fclose(fp);
}
}
//对于得分情况的计算
void calculate(ItemNode &I){
ItemNode p;
int i,j,k;
int Wresult=0;
int Mresult=0;
p=I;
//对获得名次的项目赋值
for(i=1;i<=n;i++){
p=p->next;
//给男子项目计算分数
for(j=1;j<=m;j++){
switch(p->manItem[j].rank){
case 1:p->manItem[j].score = 5; continue;
case 2:p->manItem[j].score = 3; continue;
case 3:p->manItem[j].score = 2; continue;
default :p->manItem[j].score = 0;continue;
}
}
//给女子项目计算分数
for(k=1;k<=w;k++){
switch(p->womanItem[k].rank){
case 1:p->womanItem[k].score = 5; continue;
case 2:p->womanItem[k].score = 3; continue;
case 3:p->womanItem[k].score = 2; continue;
default :p->womanItem[k].score = 0;continue;
}
}
// for(j=1;j<=m;j++){
// p->Mscore += p->manItem[j].score;
// }
printf("学校编号:%d\t",p->num);
printf("学校名字:%s\n",p->schoolName);
for (j=1;j<=m;j++){
printf("男子等级:%d\t",p->manItem[j].rank);
printf("男子分数:%d\n",p->manItem[j].score);
Mresult += p->manItem[j].score;
}
p->Mscore = Mresult;
for(k=1;k<=w;k++){
printf("女子等级:%d\t",p->womanItem[k].rank);
printf("女子分数:%d\n",p->womanItem[k].score);
Wresult += p->womanItem[k].score;
}
p->Wscore = Wresult;
p->score = p->Mscore + p->Wscore;
printf("男子分数是:%d\t",p->Mscore);
printf("女子分数是:%d\t",p->Wscore);
printf("分数和:%d\n\n",p->score);
printf("\n-----------------------------------------------------------------------\n");
printf("\n");
Mresult = 0;
Wresult = 0;
}
}
//创建头指针
ItemNode creat_head(){
ItemNode p;
p = (ItemNode)malloc(sizeof(Item));
p->next = NULL;
return(p);
}
//给学校的总分排名
void school_rank(ItemNode &I){
ItemNode p;
ItemNode school_rank[n];
p=I;
for(int i=1;i<=n;i++){
p=p->next;
school_rank[i] = p;
}
for (int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++){
if(school_rank[j]->score<school_rank[j+1]->score){
ItemNode temp = school_rank[j];
school_rank[j] = school_rank[j+1];
school_rank[j+1] = temp;
}
}
}
printf("\t\t【运动会学校排名】\n\n");
printf("\t学校编号\t名称学校\t学校总分数\n");
for(int i=1;i<=n;i++){
printf("\t%d\t\t%s\t\t%d\n",school_rank[i]->num,school_rank[i]->schoolName,school_rank[i]->score);
}
printf("\n**********************************************************************\n");
}
//给男子团体排序
void m_rank(ItemNode &I){
ItemNode p;
ItemNode m_rank[n];
p=I;
for (int i=1;i<=n;i++){
p=p->next;
m_rank[i] = p;
}
//给男子团体排序
for(int i=1;i<=n;i++){
for (int j=1;j<=n-i;j++){
if(m_rank[j]->Mscore < m_rank[j+1]->Mscore){
ItemNode temp = m_rank[j];
m_rank[j] = m_rank[j+1];
m_rank[j+1] = temp;
}
}
}
//输出男子团体成绩的排名
printf("\t\t\t【运动会男子团体排名】\n\n");
printf("学校编号\t\t学校名称\t\t学校男子团体的成绩\n");
for(int i=1;i<=n;i++){
printf("%d\t\t\t%s\t\t\t%d\n",m_rank[i]->num,m_rank[i]->schoolName,m_rank[i]->Mscore);
}
printf("\n**********************************************************************\n");
}
//给女子团体排序
void w_rank(ItemNode &I){
ItemNode p;
ItemNode w_rank[n];
p=I;
for (int i=1;i<=n;i++){
p=p->next;
w_rank[i] = p;
}
//给女子团体排序
for(int i=1;i<=n;i++){
for (int j=1;j<=n-i;j++){
if(w_rank[j]->Wscore<w_rank[j+1]->Wscore){
ItemNode temp = w_rank[j];
w_rank[j] = w_rank[j+1];
w_rank[j+1] = temp;
}
}
}
//输出女子团体成绩的排名
printf("\t\t\t【运动会女子团体排名】\n\n");
printf("学校编号\t\t学校名称\t\t学校女子团体的成绩\n");
for(int i=1;i<=n;i++){
printf("%d\t\t\t%s\t\t\t%d\n",w_rank[i]->num,w_rank[i]->schoolName,w_rank[i]->Wscore);
}
printf("\n-----------------------------------------------------------------------\n");
}
//按照学校编号查询某个项目的具体情况
void quety_item(ItemNode &I){
system("cls");
printf("\n\n\n");
printf("\t\t\t【查询项目详情】\n\n");
printf("\t\t\t[1]查询全部项目\n");
printf("\t\t\t[2]查询单个项目\n");
printf("\t\t\t[0]返回上一单元\n");
printf("\t\t\t您要进行的操作1/2/0.....\n");
ItemNode p;
p=I;
int q1;
scanf("%d",&q1);
system("cls");
if(q1==0){
printf("点击任意键返回!!!\n");
return;
}
if(q1==1){
int q2;
int flag = 1;
printf("您要查询的学校的编号?\n");
scanf("%d",&q2);
printf("\n********************************************************************\n");
for(int i=1;i<=n;i++){
p=p->next;
if(p->num==q2)
{
flag = 0;
printf("该学校男子项目\n");
for (int j=1;j<=m;j++){
printf("男子项目[%d]排名%d\t",j,p->manItem[j].rank);
printf("男子项目[%d]得分%d\n",j,p->manItem[j].score);
}
printf("男子项目 总得分是%d\n\n",p->Mscore);
printf("该学校女子项目\n");
for (int k=1;k<=w;k++){
printf("女子项目[%d]排名%d\t",k,p->womanItem[k].rank);
printf("女子项目[%d]得分%d\n",k,p->womanItem[k].score);
}
printf("女子项目 总得分是%d\n\n",p->Wscore);
}
}
if(flag){
printf("查无此校。请输入正确在查询\n");
}
} else if(q1==2){
int q2;
int q3;
int q4;
int isNum = 0;
printf("请输入您要查询的学校的编号\n");
scanf("%d",&q2);
//查询是否拥有该学校
for(int i=1;i<=n;i++){
p=p->next;
if(p->num==q2){
isNum = 1;
}
}
if(isNum){
p=I;
printf("\n*****************************************************************************\n\n");
printf("[1]男子项目\n");
printf("[2]女子项目\n");
printf("[0]返回上一单元\n");
printf("您要进行的操作1/2.....\n");
scanf("%d",&q3);
if(q3==0){
printf("点击任意键,返回上一单元\n");
return;
}
if(q3<0||q3>2){
printf("请输入正确操作!!1\n");
printf("顶级任意键返回\n");
return;
}
printf("您要查询的项目的编号是?\n");
scanf("%d",&q4);
if(q3==1){
int flag =1;
for (int i=1;i<=m;i++){
flag = 0;
p=p->next;
if(q4==p->manItem[i].num){
printf("该学校男子项目[%d]\n等级是%d\t",q4,p->manItem[i].rank);
printf("得分%d",p->manItem[i].score);
}
}
if(flag){
printf("该学校并没有参加该项运动");
}
}
else if(q3==2){
int flag = 1;
for (int i=1;i<=w;i++){
p=p->next;
if(q4==p->womanItem[i].num){
flag = 0;
printf("该学校女子项目[%d]\n等级是%d\t",q4,p->womanItem[i].rank);
printf("得分%d\n",p->womanItem[i].score);
}
}
if(flag){
printf("该学校并没有参加该项运动");
}
}else {
printf("请输入正确的操作\n");
}
} else {
printf("查无此校!!!\n");
}
} else {
printf("请输入正确的操作\n");
}
}
//按照编号查询前三名的学校
void quety_num(ItemNode &I){
ItemNode p;
p=I;
int q1;
int q2;
int flag = 0;
ItemNode quety_num[n];
system("cls");
printf("\n\n\n");
printf("\t\t\t【查询女子/男子男子项目】\n\n");
printf("\t\t\t[1]男子项目\n");
printf("\t\t\t[2]女子项目\n");
printf("\t\t\t[0]返回上一单元\n");
printf("\t\t\t您要进行的操作1/2/0.....\n");
scanf("%d",&q1);
if(q1==0){
printf("\t\t\t按任意键返回上一单元\n");
return;
}
if(q1<0||q1>2){
printf("输入错误!!!\n");
printf("按任意键返回\n");
return;
}
printf("您想要查询的项目?\n");
scanf("%d",&q2);
if(q1==1){
for (int i=1;i<=n;i++){
p=p->next;
for(int j=1;j<=m;j++){
if(p->manItem[j].num == q2){
quety_num[i] = p;
flag = j;
}
}
}
//对输出的前三进行排序
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++){
if(quety_num[j]->manItem[flag].score<quety_num[j+1]->manItem[flag].score){
ItemNode temp = quety_num[j];
quety_num[j] = quety_num[j+1];
quety_num[j+1] = temp;
}
}
}
if(flag){
printf("学校编号\t\t学校名字\t\t项目编号\t\t项目名次\t\t项目分数\n");
if(n<3){
for(int i=1;i<=n;i++){
printf("%d\t\t\t%s\t\t\t%d\t\t\t%d\t\t\t%d\t\t\t\n",quety_num[i]->num,quety_num[i]->schoolName,quety_num[i]->manItem[flag].num,quety_num[i]->manItem[flag].rank,quety_num[i]->manItem[flag].score);
}
printf("\n-----------------------------------------------------------------------------------------------------------\n");
} else {
for(int i=1;i<=3;i++){
printf("%d\t\t\t%s\t\t\t%d\t\t\t%d\t\t\t%d\t\t\t\n",quety_num[i]->num,quety_num[i]->schoolName,quety_num[i]->manItem[flag].num,quety_num[i]->manItem[flag].rank,quety_num[i]->manItem[flag].score);
}
printf("\n------------------------------------------------------------------------------------------------------------\n");
}
} else {
printf("对不起,查无此项目!!!\n");
}
}else if(q1==2){
for(int i=1;i<=n;i++){
p=p->next;
for(int j=1;j<=m;j++){
if(p->womanItem[j].num == q2){
quety_num[i] = p;
flag = j;
}
}
}
//对输出的前三个项目排序
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++){
if(quety_num[j]->womanItem[flag].score<quety_num[j+1]->womanItem[flag].score){
ItemNode temp = quety_num[j];
quety_num[j] = quety_num[j+1];
quety_num[j+1] = temp;
}
}
}
if(flag){
printf("学校编号\t\t学校名字\t\t项目编号\t\t项目名次\t\t项目分数\n");
if(n<3){
for(int i=1;i<=n;i++){
printf("%d\t\t\t%s\t\t\t%d\t\t\t%d\t\t\t%d\t\t\t\n",quety_num[i]->num,quety_num[i]->schoolName,quety_num[i]->womanItem[flag].num,quety_num[i]->womanItem[flag].rank,quety_num[i]->womanItem[flag].score);
}
printf("\n-----------------------------------------------------------------------\n");
} else {
for(int i=1;i<=3;i++){
printf("%d\t\t\t%s\t\t\t%d\t\t\t%d\t\t\t%d\t\t\t\n",quety_num[i]->num,quety_num[i]->schoolName,quety_num[i]->womanItem[flag].num,quety_num[i]->womanItem[flag].rank,quety_num[i]->womanItem[flag].score);
}
printf("\n-----------------------------------------------------------------------\n");
}
} else {
printf("对不起,查无此项目!!!\n");
}
} else{
printf("请选着正确的操作\n");
}
}
void menu_quety(){
//system("color 30");
printf("\n\n\n");
printf("\t\t\t\t【运动会查询】\n");
printf("\n");
printf("\t\t\t[1]查询项目详情\n");
printf("\t\t\t[2]查询前三学校\n");
printf("\t\t\t[3退出\n");
}
void menu_rank(){
// system("color 30");
printf("\n\n\n");
printf("\t\t\t\t【运动会排名】\n");
printf("\n");
printf("\t\t\t[1]学校排名\n");
printf("\t\t\t[2]男子团体排名\n");
printf("\t\t\t[3]女子团体排名\n");
printf("\t\t\t[4]退出\n");
printf("\t\t\t请选择你要进行的操作1/2/3/4.....\n");
}
void menu(){
//system("color 30");
printf("\n\n\n");
printf("\t\t\t\t欢迎使用运动会分数统计系统\n");
printf("\n");
printf("\t\t\t[1]运动会信息录入\n");
printf("\t\t\t[2]运动会排名\n");
printf("\t\t\t[3]参赛学校信息查询\n");
printf("\t\t\t[4]退出\n");
printf("\t\t\t请选择你要进行的操作1/2/3/4.....\n");
}
int main(){
ItemNode I;
menu();
int handle;
scanf("%d",&handle);
while(handle!=4){
switch(handle){
case 1:
I = creat_head(); //创建头指针
ListCreat(I); //创建链表
calculate(I); //对于最后分数的计算
system("pause");
system("cls");
menu();
//printf("\n\t\t\t信息录入成功\n");
break;
case 2:
int rank;
system("cls");
menu_rank();
scanf("%d",&rank);
while(rank!=4){
system("cls");
switch(rank){
case 1:
//学校排名
school_rank(I);
getchar();
getchar();
system("pause");
system("cls");
menu_rank();
break;
case 2:
//给男子团体排序
m_rank(I);
getchar();
getchar();
system("pause");
system("cls");
menu_rank();
break;
case 3:
//给女子团体排序
w_rank(I);
getchar();
getchar();
system("pause");
system("cls");
menu_rank();
break;
}
scanf("%d",&rank);
}
system("cls");
menu();
break;
case 3:
int quety;
system("cls");
menu_quety();
scanf("%d",&quety);
while(quety!=3){
switch(quety){
case 1:
//按照学校编号查询某个项目的具体情况
quety_item(I);
getchar();
getchar();
system("pause");
system("cls");
menu_quety();
break;
case 2:
//按照编号查询前三名的学校
quety_num(I);
getchar();
getchar();
system("pause");
system("cls");
menu_quety();
break;
}
scanf("%d",&quety);
}
system("cls");
menu();
break;
default:
system("cls");
menu();
printf("\n\t\t\t请输入正确操作!!!\n");
break;
}
scanf("%d",&handle);
}
return 0;
}
如果感觉这篇文章对你有帮助,加个关注吧!!!
也可关注我的公众号,我们一起交流。
版权声明:本文为qq_43238599原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。