资源描述
目录
1.需求分析: 2
功能要求: 2
性能需求: 2
2.概要设计: 2
1.存储结构设计: 3
2.流程图设计: 4
3.详细设计: 11
4.菜单窗口: 20
1.主菜单窗口 20
2. 输入各个项目成绩并存储文件 20
3. 统计各学校总分 21
4. 按学校编号排序输出 21
5. 按学校总分排序输出 21
6. 按男团体总分排序输出 22
7. 按女团体总分排序输出 22
8. 按学校编号查询学校某个项目情况 23
9. 按项目编号查询取得名次的学校 23
5.课程设计总结与体会: 23
1.需求分析:
任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前前三名积分;前三名的积分分别为:5、3、2。(m、w<=20,n<=10)
功能要求:
1.可以输入各个学校、各项目、以及各项目前三名的数据信息;
2.能统计各学校总分、男子项目和女子项目总分;
3.可以按学校编号(或学校名称)、学校总分、男女团体总分排序输出;
4.可以按学校编号(或学校名称)查询学校某个项目的情况;可以按项目编号查询取得前三的学校。
性能需求
规定:输入数据形式和范围:10以内的整数(如果做得更好可以输入学校的名称和运动项目的名称)
输出形式:有中文提示,各学校分数为整形
界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:学生自己根据系统功能要求自己设计。请在最后的上交资料中指明你用到的存储结构;
测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;
2.概要设计:
1. 存储结构设计:
主菜单
1
2
3
4
5
6
7
8
0
输入各个项目成绩并存储文件
统计各学校总分
按学校编号排序输出
按学校总分排序输出
按男团体总分排序输出
按女团体总分排序输出
按学校编号查询学校某个项目情况
按项目编号查询取得名次的学校
退出
1输入各个项目成绩并存储文件
输入男子项目总数m
输入女子项目总数w
输入参加运动会的学校总数n
男子项目
女子项目
输入项目:0返回主菜单界面
输入项目编号(如1)
输入项目编号(如m)
输入项目编号(如m+1)
输入项目编号(如m+n)
2.统计各学校的总分
显示:各学校的总分
退出:按enter键
3.按学校编号排序输出
输入学校编号
退出(返回菜单主界面):按enter
显示按学校排序输出结果
返回到主界面
4.按学校总分排序输出
输入学校编号
退出(返回菜单主界面):按enter
显示按学校总分排序结果
返回到主界面
5.按男团体总分排序输出
输入学校编号
退出(返回菜单主界面):按enter
显示按学校编号排序结果
返回到主界面
6.按女团体总分排序输出
输入学校编号
退出(返回菜单主界面):按enter
显示按女团体总分排序结果
返回到主界面
7.按学校编号查询学校某个项目情况
输入要查询的学校编号
输入要查询的项目编号
退出(返回菜单主界面):按enter
显示要查询学校的某个项目的获奖情况
返回到主界面
8.按项目编号查询取得名次的学校(前三名或前五名)
输入要查询的项目编号
退出(返回菜单主界面):按enter
显示某个项目编号的学校名次(前三或前五)
返回到主界面
0.退出
按任意键可以推出
2.流程程图设计:
Main()函数流程图
开始
int t
!g2||!g1
exit(1);
system("cls");
选择操作编号
1
2
3
4
5
6
7
8
9
Funct1()函数流程图
School *p1和Items *p2
!p1||!p2
exit(1);
Y
Printf();
w<0||w>20
N
Y
Y
Y
Printf(“输入有误”)
Printf(“输入有误”)
Printf(“输入有误”)
N
N
N
n<0||n>20
m<0||m>20
输入前三名学校名称
结束
开始
Save()函数流程图
Funct2()函数流程图
Funct3()函数流程图
开始
int k;
k<=g2->n
printf("\t\t\t\t\t\t%d\t",k);
p2=g2->b[k].firstitem;
p2!=NULL
printf("项目%d:得%d分 ",p2->item,p2->record);
p2=p2->next;
printf("\n");
k++;
printf("\n");
结束
Y
Y
N
N
Funct4()函数流程图
开始
int i=2,j,k;
i<=g2->n
printf("%d\t",k);
system("pause");
结束
Y
N
multiplex
i++
k=1
k<=g2->n
printf("%d \t\t%d\n",g2->b[k].school,g2->b[k].score);
k++
N
Y
Funct5()函数流程图
开始
int i=2,j,k;
i<=g2->n
printf("%d\t",k);
system("pause");
结束
Y
N
multiplex
i++
k=1
k<=g2->n
printf("%d\t\t %d\n",g2->b[k].school,g2->b[k].boys);
k++
N
Y
Funct6()函数流程图
Funct7()函数流程图
Funct8()函数流程图
开始
int i
P2!=NULL;
结束
N
printf("\n");
printf(" 学校%d:得%d分 ",p1->school,p1->record);
Y
3.详细设计:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
//#include <conio.h> 屏幕操作函数
#define MAX 50
//#define NULL 0
typedef struct node1{
int school; 学校编号
int record; 项目成绩
struct node1 *next; 链域
}Schools;
typedef struct {
int item; 项目编号
Schools *firstschool; 链域指向链表中第一个结点
}ITEM;
typedef struct {
int z; 项目总数
ITEM a[MAX];
}ALLitems;
typedef struct node2 {
int item; 该学校获奖的项目
int record; 项目成绩
struct node2 *next; 链域
}Items;
typedef struct {
int school; /*学校编号*/
int score; /*学校总分*/
int boys; /*男团体总分*/
int girls; /*女团体总分*/
Items *firstitem; 链域指向链表中第一个获奖项目的结点
}SCHNode;
typedef struct {
int n; /* 学校总数 */
SCHNode b[MAX];
}ALLNode;
ALLitems *g1;
ALLNode *g2;
void funct1(ALLitems *g1,ALLNode *g2) 输入各个项目成绩
{ Schools *p1;
Items *p2;
int i,k,m,w,h,x;
p1=(Schools *)malloc(sizeof(Schools));
p2=(Items *)malloc(sizeof(Items));
if(!p1||!p2)
exit(1);
printf("\n ");
printf("\n \n\n");
printf("\n ******输入各个项目信息 ****** \n\n");
printf(" 输入男子项目总数m:");
scanf("%d",&m);
while(m<0||m>10)
{ printf(" 输入有误,m是10以内的整数,请重新输入:");
scanf("%d",&m);
}
printf(" 输入女子项目总数w:");
scanf("%d",&w);
while(w<0||w>10)
{ printf(" 输入有误,w是10以内的整数,请重新输入:");
scanf("%d",&w);
}
printf(" 输入参加运动会的学校总数n:");
scanf("%d",&g2->n);
while(g2->n<0||g2->n>10)
{ printf(" 输入有误,n是10以内的整数,请重新输入:");
scanf("%d",&g2->n);
}
g1->z=m+w;
printf(" 则项目编号为男子1-%d,女子%d-%d",m,m+1,g1->z);
printf("\n\n ****记录运动会成绩****");
printf("\n\n (输入0标志结束)\n");
for(k=1;k<=g1->z;k++) /* 对两个邻接表置初态 */
{ g1->a[k].item=k;
g1->a[k].firstschool=NULL;
}
for(k=1;k<=g2->n;k++)
{ g2->b[k].school=k;
g2->b[k].firstitem=0;
g2->b[k].score=0;
g2->b[k].boys=0;
g2->b[k].girls=0;
}
g2->b[0].score=0;
g2->b[0].boys=0;
g2->b[0].girls=0;
while(i!=0)
{ printf("\n 项目:");
scanf("%d",&i);
while(i<0||i>m+w)
{ printf(" 输入有误,无此项目编号,请重新输入数字:");
scanf("%d",&i);
}
{
{
}
if(i!=0)
{ h=3;
do{ printf(" 第%d名:学校(学校编号为数字)",h);
scanf("%d",&x);
while(x<0||x>g2->n)
{ printf(" 输入有误,无此学校编号,请重新输入数字:");
scanf("%d",&x);
}
p1=(Schools *)malloc(sizeof(Schools));
p1->school=x;
p2=(Items *)malloc(sizeof(Items));
p2->item=i;
if(h==3) p2->record=p1->record=2;
if(h==2) p2->record=p1->record=3;
if(h==1) p2->record=p1->record=5;
p1->next=g1->a[i].firstschool;
g1->a[i].firstschool=p1;
p2->next=g2->b[x].firstitem;
g2->b[x].firstitem=p2;
g2->b[x].score=g2->b[x].score+p2->record; 累计总分
if(i<=m) g2->b[x].boys=g2->b[x].boys+p2->record; 累计男团体总分
else g2->b[x].girls=g2->b[x].girls+p2->record; 累计女团体总分
h--;
}while(x!=0&&h!=0);
}
}
}
}
void save() 存储数据文件
{ FILE *fp1,*fp2;
fp1=(FILE *)malloc(sizeof(FILE));
fp2=(FILE *)malloc(sizeof(FILE));
if((fp1=fopen("sports1","wb"))==NULL)
{ printf("cannot open file.\n");
return;
}
if(fwrite(g1,sizeof(ALLitems),1,fp1)!=1)
printf("file write error.\n");
fclose(fp1);
if((fp2=fopen("sports2","wb"))==NULL)
{ printf("cannot open file.\n");
return;
}
if(fwrite(g2,sizeof(ALLNode),1,fp2)!=1)
printf("file write error.\n");
fclose(fp2);
}
void funct2(ALLNode *g2) 输出各学校总分
{ int k;
printf(" 学校编号\t 总分 \n");
for(k=1;k<=g2->n;k++)
printf(" %d\t\t\t %d\n",k,g2->b[k].score);
printf("\n");
system("pause");
printf(" 按任意键返回主菜单......");
getchar();
}
void funct3(ALLNode *g2) 按学校编号排序输出
{
int k;
Items *p2;
p2=(Items *)malloc(sizeof(Items));
printf("\n ");
printf("\n \n");
printf("\n\n ****** 按学校编号排序输出 ******\n");
printf(" 学校编号\t\t\t获奖情况 \n");
for(k=1;k<=g2->n;k++)
{ printf("\t\t\t\t\t\t%d\t",k);
p2=g2->b[k].firstitem;
while(p2!=NULL)
{ printf("项目%d:得%d分 ",p2->item,p2->record);
p2=p2->next;
}
printf("\n");
}
printf("\n");
system("pause");
printf("按任意键返回主菜单......");
getchar();
}
void funct4(ALLNode *g2) 按学校总分排序输出
{ int i,j,k;
Items *p2;
printf("\n ");
printf("\n \n");
printf("\n\n ****** 按学校总分排序输出 ******\n");
printf(" 学校编号\t\t总分 \n");
printf("按1继续 \n ");
scanf("%d",&k);
//printf("输入要查询的项目编号:");
for(i=2;i<=g2->n;i++)
{
printf("%d\t",k);
p2=g2->b[k].firstitem;
while(p2!=NULL)
{ printf("%d \t\t%d\n",g2->b[k].school,g2->b[k].score);
p2=p2->next;
}
printf("\n");
g2->b[0].score=g2->b[i].score;
g2->b[0].boys=g2->b[i].boys;
g2->b[0].girls=g2->b[i].girls;
g2->b[0].school=g2->b[i].school;
j=i-1;
while(g2->b[0].score<g2->b[j].score&&j>0)
{ g2->b[j+1].score=g2->b[j].score;
g2->b[j+1].boys=g2->b[j].boys;
g2->b[j+1].girls=g2->b[j].girls;
g2->b[j+1].school=g2->b[j].school;
j--;
}
g2->b[j+1].score=g2->b[0].score;
g2->b[j+1].boys=g2->b[0].boys;
g2->b[j+1].girls=g2->b[0].girls;
g2->b[j+1].school=g2->b[0].school;
}
for(k=1;k<=g2->n;k++)
printf("%d \t\t%d\n",g2->b[k].school,g2->b[k].score);
system("pause");
printf("按任意键返回主菜单......");
getchar();
}
void funct5(ALLNode *g2) 按男团体总分排序输出
{ int i,j,k;
Items *p2;
p2=(Items *)malloc(sizeof(Items));
printf("\n ");
printf("\n \n");
printf("\n\n ****** 按男团体总分排序输出 ******\n");
printf("学校编号\t\t男团体总分 \n");
printf("按1继续 \n ");
scanf("%d",&k);
//printf("输入要查询的学校编号:");
for(i=2;i<=g2->n;i++)
{
printf("%d\t",k);
p2=g2->b[k].firstitem;
while(p2!=NULL)
{ printf("%d\t\t %d\n",g2->b[k].school,g2->b[k].boys);
p2=p2->next;
}
printf("\n");
g2->b[0].score=g2->b[i].score;
g2->b[0].boys=g2->b[i].boys;
g2->b[0].girls=g2->b[i].girls;
g2->b[0].school=g2->b[i].school;
j=i-1;
while(g2->b[0].boys<g2->b[j].boys&&j>0)
{ g2->b[j+1].score=g2->b[j].score;
g2->b[j+1].boys=g2->b[j].boys;
g2->b[j+1].girls=g2->b[j].girls;
g2->b[j+1].school=g2->b[j].school;
j--;
}
g2->b[j+1].score=g2->b[0].score;
g2->b[j+1].boys=g2->b[0].boys;
g2->b[j+1].girls=g2->b[0].girls;
g2->b[j+1].school=g2->b[0].school;
}
for(k=1;k<=g2->n;k++)
printf("%d\t\t %d\n",g2->b[k].school,g2->b[k].boys);
system("pause"); // 暂停等待
printf("按任意键返回主菜单......");
getchar();
}
void funct6(ALLNode *g2) 按女团体总分排序输出
{ int i,j,k;
Items *p2;
p2=(Items *)malloc(sizeof(Items));
printf("\n ");
printf("\n \n");
printf("\n\n ****** 按女团体总分排序输出 ******\n");
printf("学校编号\t\t女团体总分 \n");
printf("按1继续 \n ");
scanf("%d",&k);
for(i=2;i<=g2->n;i++)
{
printf("%d\t",k);
p2=g2->b[k].firstitem;
while(p2!=NULL)
{ printf("%d\t\t %d\n",g2->b[k].school,g2->b[k].girls);
p2=p2->next;
}
printf("\n");
g2->b[0].score=g2->b[i].score;
g2->b[0].boys=g2->b[i].boys;
g2->b[0].girls=g2->b[i].girls;
g2->b[0].school=g2->b[i].school;
j=i-1;
while(g2->b[0].girls<g2->b[j].girls&&j>0)
{ g2->b[j+1].score=g2->b[j].score;
g2->b[j+1].boys=g2->b[j].boys;
g2->b[j+1].girls=g2->b[j].girls;
g2->b[j+1].school=g2->b[j].school;
j--;
}
g2->b[j+1].score=g2->b[0].score;
g2->b[j+1].boys=g2->b[0].boys;
g2->b[j+1].girls=g2->b[0].girls;
g2->b[j+1].school=g2->b[0].school;
}
for(k=1;k<=g2->n;k++)
printf("%d\t\t %d\n",g2->b[k].school,g2->b[k].girls);
system("pause");
printf("按任意键返回主菜单......");
getchar();
}
void funct7(ALLNode *g2) 按学校编号查询学校某个项目情况
{ int i,j;
Items *p2;
printf("\n ");
printf("\n \n");
printf("\n ****** 按学校编号查询学校某个项目情况 ******\n");
printf(" 输入要查询的学校编号:");
scanf("%d",&i);
printf(" 输入要查询的项目编号:");
scanf("%d",&j);
p2=g2->b[i].firstitem;
while(p2!=NULL)
{ if(p2->item==j)
printf(" 学校编号:%d\t项目%d:得%d分\n",i,p2->item,p2->record);
p2=p2->next;
}
printf("\n");
system("pause");
printf(" 按任意键返回主菜单......");
getchar();
}
void funct8(ALLitems *g1) 按项目编号查询取得名次的学校
{ int i;
Schools *p1;
printf("\n*** 按项目编号查询取得名次的学校 ***\n");
printf("输入要查询的项目编号:");
scanf("%d",&i);
printf("项目编号\t\t\t取得名次的学校\n");
printf("%d\t",i);
p1=g1->a[i].firstschool;
while(p1!=NULL)
{ printf(" 学校%d:得%d分 ",p1->school,p1->record);
p1=p1->next;
}
printf("\n\n");
system("pause");
printf("按任意键返回主菜单......");
getchar();
}
void main()
{ int t;
g2=(ALLNode*)malloc(sizeof(ALLNode));
g1=(ALLitems*)malloc(sizeof(ALLitems));
if(!g2||!g1)
exit(1);
system("cls");
for(;;)
{
printf("\t\t \n");
printf("\t\t \n");
printf("\t\t \n");
printf("\t\t 运动会分数统计系统 \n");
printf("\t\t \n");
printf("\t\t 1.输入各个项目成绩并存储文件 \t \n");
printf("\t\t 2.统计各学校总分 \t \n");
printf("\t\t 3.按学校编号排序输出 \t \n");
printf("\t\t 4.按学校总分排序输出 \t \n")
展开阅读全文