C语言课程设计
院系:
姓名:
学号:
班号:
指导教师:
日期:2007年9月
一、 题目要求
设计校际运动会管理系统,实现学校、运动员信息和运动项目的录入,比赛结果的输入,各个学校比赛结果的查询,生成团体总分报表,查看参赛学校信息和比赛项目信息。要求功能选择用菜单实现。 二、 需求分析
根据题目要求应提供键盘式菜单实现功能选择,还应提供信息的输入操作,由于在程序中提供查询功能所以应有显示、查找等操作。 三、 总体设计
根据上面的需求分析,可以将这个系统的设计分为1、信息输入模块 2、比赛结果录入模块 3、查询模块。具体校际运动会管理系统分为 信息的输入、结果的输入、学校各个项目的得分的查寻、总体报表的生成。 四、 详细设计 1、主函数
主函数一般设计的比较简洁,只提供输入,处理和输出部分的函数调用。其中功能模块用菜单方式选择。 流程图
↓
↓
[程序]
main() {
menu();/*menu 是菜单函数*/ }
菜单函数程序如下: menu() { int o,n; do
{ puts("\t\t*****************MENU********************"); puts("\n\n\t\t 1.The information to writein\n"); puts("\t\t 2.The race result records to writein\n"); puts("\t\t 3.Search the information\n"); puts("\t\t 4.Exit\n");
显示一系列功能选项 输入n ,判断n 是否是0——9 根据n 的值调用各功能模块函数 Y N
puts("\n\t\t*****************************************");
puts("\n\nChoice you number:");
scanf("%d",&n);
if(n<1||n>4){o=1;getchar();} /*对选择的数字进行判断*/
else o=0;
}while(o==1); /*选择功能*/
switch(n)
{ case 1:writein();break; /*信息输入模块*/
case 2:resultin();break; /*比赛结果输入模块*/
case 3:search();break; /*查询模块*/
case 4:exit(0); /*退出*/
}
}
各个模块的设计
1、信息输入
[数据结构]
数据结构采用结构体的形式,包括学校、项目、运动员三个结构体。
比如学校结构体成员包括学校校名、竞赛项目、得分;项目结构体成员包括项目名、权值。
struct student
{ char shool[10];
char name[10];
char item[10];
char sex;
int position;
int mark;
}stu[C]; /*stu[N]中每个数组元素对应一个学生*/
struct item
{ char name[10];
char sex;
int mark;
}it[C]; /*it[C]中每个数组元素对应一个项目*/
struct shool
{ char name[10];
char item[10];
int mark;
}sho[C] /* sho[C]每个数组元素对应一个学校;*/
[信息输入模块]
根据题意把与运动员的学校、名字、项目、性别、名次、分数作为结构体成员,如果要存放若干个运动员的信息就用结构体数组。
struct student
{ char shool[10];
char name[10];
char item[10];
char sex;
int position;
int mark;
}stu[C]; /*stu[C]中每个数组元素对应一个运动员*/
stu[C]中的C为运动员的个数,程序中采用宏定义的方式定义C=100,C的值可随时在源程序中改变。
输入运动员的学校、名字、项目、性别
输入运动员的名次并进入选择模式
if(t==2)
返回主函数
图2 输入模块流程图
/******************输入模块*****************/
writein() /*输入模块*/
{ int t,r,i=0;extern j;char F,M;y=1;
printf("\nPlease writein the student's name:\t");scanf("%s",&stu[i].name); /*输入名字*/
printf("\nPlease writein the student's shool:\t");scanf("%s",&stu[i].shool); /*输入学校*/
printf("\nPlease writein the student's item:\t");scanf("%s",&stu[i].item); /*输
loop_1: printf("\nPlease writein the student's sex(W or M):\t");scanf("%s",&stu[i].sex); /*输入性别*/
if(stu[i].sex!='W'&&stu[i].sex!='M')goto loop_1; /*选择函数*/ printf("\nPleasewritein the student's position:\t");scanf("%d",&stu[i].position);
mark(j,i);
loop_2:printf("\n\nDo again?\t1).Yes\t2).No\t");
scanf("%d",&t);
if(t!=2&&t!=1)goto loop_2; /*调用goto结构
*/
if(t==2)menu();
i++;
if(t==1);f=1;
printf("Success!!!\nPress any key+enter to menu..");scanf("%d",&r); /*返回主函数
*/
menu();
}
[结果录入模块]
该模块的功能是输入男女运动员的成绩,并由用户选择或定义各名次的
分数。
[流程图]
提醒用户先输入运动员信息
输入学校的代号、男女运动项目的代号
用户选择或定义各名次的分数
输入成绩并反回主函数
[程序]
/**********************结果录入模块*********************/
resultin() /******结果录入模块*****/
{ int h,r; extern N,M,W,y;
{ printf("Please establish system first!!\nPress any key +enter to menu.. ");
scanf("%d",&r); /******提醒用户输入运动员的基本信息*******/
menu();
}
printf("\nThe number of shool attended is:");
scanf("%d",&N);
printf("\nThe number of men item is:");
scanf("%d",&M);
printf("\nThe number of women item is:");
scanf("%d",&W); /****输入学校的代号、男女运动项目的代号****/
printf("\nThere are three form of marked you can choice:");
printf("\n\n\t1).1th--7,2th--5,3th--3,4th--2,5th--1.");
printf("\n\n\t2).1th--5,2th--3,3th--1.");
printf("\n\n\t3).Define by youself."); /*****用户自定义********/
loop: printf("\n\nChoice the number(1--3):");
scanf("%d",&h);
if(h>0&&h<4)
switch(h)
{case 1:j=1;break;
case 2:j=2;break;
case 3:define_mark();
} /*******选择积分模式*********/
else goto loop; /*******输入错误重新选择*******/
printf("Success!!!\nPress any key+enter to menu..");scanf("%d",&r);
menu(); /*******返回主函数*******/
}
[查询模块]
该模块的功能是所有信息记录完毕后用户可以查询学校比赛成绩,查看参赛学校信息和比赛项目信息等。
[流程图]
选择查询模式并选择查询项目
学校查询程序
项目查询程序
返回主菜单
[程序]
/*****************查询模块*****************/
search()
{ int e;char c;extern f;
loop:printf("\nThe form of searching you want to choice:\n\t1).By school\n\t2).Bt item\n\t3).To menu\t"); /************选择查询模式**************/
scanf("%d",&e);
switch(e)
{ case 1:search_school();break;
case 2:search_item();break;
case 3:menu();
}
if(e>4||e<1)goto loop;
printf("Press any key+enter to menu..");scanf("%s",&c);menu();
}
search_school() /**********学校查询程序***********/
{ int x,sum=0,w=0;
struct student s;
printf("\nPlease enter the name of the school that you want to search:");
scanf("%s",&s.shool);
printf_face();
for(x=0;x if(strcmp(s.shool,stu[x].shool)==0) /***********调用stu结构体************/ { sum+=stu[x].mark; printf_one(x);w=1; } /***********读出结构体的数据*********/ printf_sum(sum); if(w==0) {printf("\n\n*The name is wrong,press again!");search_school();} } search_item() /*********项目查询程序********/ { int x,sum=0,w=0; struct student s; printf("\nPlease enter the name of the item that you want to search:"); scanf("%s",&s.item); printf_face(); /********数据输入*********/ for(x=0;x if(strcmp(s.item,stu[x].item)==0) / ********调用stu数组******/ { sum+=stu[x].mark; printf_one(x);w=1; } printf_sum(sum); /*******数据输出*********/ if(w==0) { printf("\n\n*The name is wrong,press again!");search_item();} } [程序中调用的函数] 记分的函数即用来确定不同的名次所得的不同分数。 mark(int j,int i) { int g; extern p[15],q[15]; if(j==1) {if(stu[i].position==1)stu[i].mark=7; else if(stu[i].position==2)stu[i].mark=5; else if(stu[i].position==3)stu[i].mark=3; else if(stu[i].position==4)stu[i].mark=2; else if(stu[i].position==5)stu[i].mark=1; } if(j==2) { if(stu[i].position==1)stu[i].mark=5; else if(stu[i].position==2)stu[i].mark=3; else if(stu[i].position==3)stu[i].mark=1; } if(j==3) { for(g=0;g<15;g++)if(stu[i].position==p[g])stu[i].mark=q[g];} } define_mark() /*自定义名次分数的子函数*/ { static int p[15],q[15],a,b,j; for(a=0;a<15;a++) { printf("\nThe position(1--15):");scanf("%d",&p[a]); printf("\nThe mark you want to define(Integral):");scanf("%d",&q[a]);/*自定义*/ loop:printf("\nDo you want define more:\t1).Yes\t2).No");scanf("%d",&b); if(b==2)break; if(b!=1)goto loop; } j=3; } printf_one(int x) /*运动员个人信息的输出函数*/ { printf("\n%-20s%-20s%-20s%-5c%-9d%-5d",stu[x].shool,stu[x].name,stu[x].item,st u[x].sex,stu[x].position,stu[x].mark); } printf_sum(int sum) /*团体成绩的输出函数*/ { printf("\n\nThe sum of mark is:\t %d",sum); printf("\nThe shool number is: \t%d",N); printf("\nThe item number is: \t%d\n",W+M); } printf_face() /**学校成绩输出函数*/ { printf("\n\nSchool name student name item sex position mark"); } [原程序] #include #define C 100 int y=0,f=0,j,W,M,N,p[15],q[15]; struct student { char shool[10]; char name[10]; char item[10]; char sex; int position; int mark; }stu[C]; struct item { char name[10]; char sex; int mark; }it[C]; struct shool { char name[10]; char item[10]; int mark; }sho[C]; main() { menu(); } menu() { int o,n; do { puts("\t\t*****************MENU********************"); puts("\n\n\t\t 1.The information to writein\n"); puts("\t\t 2.The race result records to writein\n"); puts("\t\t 3.Search the information\n"); puts("\t\t 4.Exit\n"); puts("\n\t\t*****************************************"); puts("\n\nChoice you number:"); scanf("%d",&n); if(n<1||n>4){o=1;getchar();} else o=0; }while(o==1); switch(n) { case 1:writein();break; case 2:resultin();break; case 3:search();break; case 4:exit(0); } } writein() { int t,r,i=0;extern j;char F,M;y=1; printf("\nPlease writein the student's name:\t");scanf("%s",&stu[i].name); printf("\nPlease writein the student's shool:\t");scanf("%s",&stu[i].shool); printf("\nPlease writein the student's item:\t");scanf("%s",&stu[i].item); loop_1: printf("\nPlease writein the student's sex(W or M):\t");scanf("%s",&stu[i].sex); if(stu[i].sex!='W'&&stu[i].sex!='M')goto loop_1; printf("\nPleasewritein the student's position:\t");scanf("%d",&stu[i].position); mark(j,i); loop_2:printf("\n\nDo again?\t1).Yes\t2).No\t"); scanf("%d",&t); if(t!=2&&t!=1)goto loop_2; if(t==2)menu(); i++; if(t==1);f=1; printf("Success!!!\nPress any key+enter to menu..");scanf("%d",&r); menu(); } resultin() { int h,r; extern N,M,W,y; if(y==0) { printf("Please establish system first!!\nPress any key +enter to menu.. "); scanf("%d",&r); menu(); } printf("\nThe number of shool attended is:"); scanf("%d",&N); printf("\nThe number of men item is:"); scanf("%d",&M); printf("\nThe number of women item is:"); scanf("%d",&W); printf("\nThere are three form of marked you can choice:"); printf("\n\n\t1).1th--7,2th--5,3th--3,4th--2,5th--1."); printf("\n\n\t2).1th--5,2th--3,3th--1."); printf("\n\n\t3).Define by youself."); loop: printf("\n\nChoice the number(1--3):"); scanf("%d",&h); if(h>0&&h<4) switch(h) {case 1:j=1;break; case 2:j=2;break; case 3:define_mark(); } else goto loop; printf("Success!!!\nPress any key+enter to menu..");scanf("%d",&r); menu(); } search() { int e;char c;extern f; loop:printf("\nThe form of searching you want to choice:\n\t1).By school\n\t2).Bt item\n\t3).To menu\t"); scanf("%d",&e); switch(e) { case 1:search_school();break; case 2:search_item();break; case 3:menu(); } if(e>4||e<1)goto loop; printf("Press any key+enter to menu..");scanf("%s",&c);menu(); } search_school() { int x,sum=0,w=0; struct student s; printf("\nPlease enter the name of the school that you want to search:"); scanf("%s",&s.shool); printf_face(); for(x=0;x if(strcmp(s.shool,stu[x].shool)==0) { sum+=stu[x].mark; printf_one(x);w=1; } printf_sum(sum); if(w==0) {printf("\n\n*The name is wrong,press again!");search_school();} } search_item() { int x,sum=0,w=0; struct student s; printf("\nPlease enter the name of the item that you want to search:"); scanf("%s",&s.item); printf_face(); for(x=0;x if(strcmp(s.item,stu[x].item)==0) { sum+=stu[x].mark; printf_one(x);w=1; } printf_sum(sum); if(w==0) { printf("\n\n*The name is wrong,press again!");search_item();} } mark(int j,int i) { int g; extern p[15],q[15]; if(j==1) {if(stu[i].position==1)stu[i].mark=7; else if(stu[i].position==2)stu[i].mark=5; else if(stu[i].position==3)stu[i].mark=3; else if(stu[i].position==4)stu[i].mark=2; else if(stu[i].position==5)stu[i].mark=1; } if(j==2) { if(stu[i].position==1)stu[i].mark=5; else if(stu[i].position==2)stu[i].mark=3; else if(stu[i].position==3)stu[i].mark=1; } if(j==3) { for(g=0;g<15;g++)if(stu[i].position==p[g])stu[i].mark=q[g];} } define_mark() { static int p[15],q[15],a,b,j; for(a=0;a<15;a++) { printf("\nThe position(1--15):");scanf("%d",&p[a]); printf("\nThe mark you want to define(Integral):");scanf("%d",&q[a]); loop:printf("\nDo you want define more:\t1).Yes\t2).No");scanf("%d",&b); if(b==2)break; if(b!=1)goto loop; } j=3; } printf_one(int x) { printf("\n%-20s%-20s%-20s%-5c%-9d%-5d",stu[x].shool,stu[x].name,stu[x].item,st u[x].sex,stu[x].position,stu[x].mark); } printf_sum(int sum) { printf("\n\nThe sum of mark is:\t %d",sum); printf("\nThe shool number is: \t%d",N); printf("\nThe item number is: \t%d\n",W+M); } printf_face() { printf("\n\nSchool name student name item sex position mark"); } 主函数菜单 信息输入模块 结果录入模块 查询模块 总结: 通过此次C语言课程设计实习,我收获颇多。以前只是为了考试去学习,而这次实习是将所学知识运用到实际中。 此次实习中,我成功做出了这道题:建立校际运动会管理系统的文件题。本题看起来很烦琐,但理清思路后,就很简单了,一定程度上来说,复杂性决定了程序的使用性和功能性较高。指导书中有关文件的题目差不多都大同小异,只要一题会做,其他题目也就迎刃而解,只要将各功能模块融会贯通并加以适当调整即可,但前提还是必须对指导书里的例题熟练掌握。然而,这同时又成为了指导书的一个弊端,我相信有关文件题目的多样化会更能提高学生的编程能力。因为题目较简单,完全可以独立编程,但程序的先进性还有待进一步提高。程序的简单性和题目的局限性从而也决定了程序的实用性和功能性较差,在编程过程中还是应该特别注意充分理解题目要求和各循环语句的充分调用和理解。 我知道,这只是一个小小的开端,以后的路还很长,还要继续坚持下去,才能具备一定的编程能力。 附:原程序 #include #define A 100 int y=0,f=0,j,W,M,N,p[15],q[15]; struct student { char shool[20]; char name[20]; char item[20]; char sex; int position; int mark; }stu[A]; struct item { char name[20]; char sex; int mark; }it[A]; struct shool { char name[20]; char item[20]; int mark; }sho[A]; main() { menu(); } menu() { int w1,n; do { puts("\t\t*****************MENU********************"); puts("\n\n\t\t 1.The information to writein\n"); puts("\t\t 2.The race result records to writein\n"); puts("\t\t 3.Search the information\n"); puts("\t\t 4.Exit\n"); puts("\n\t\t*****************************************"); puts("\n\nChoice you number:"); scanf("%d",&n); if(n<1||n>4){w1=1;getchar();} else w1=0; }while(w1==1); switch(n) { case 1:establish();break; case 2:enter();break; case 3:search();break; case 4:exit(0); } } establish() { int h,r; extern N,M,W; y=1; printf("\nThe number of shool attended is:"); scanf("%d",&N); printf("\nThe number of men item is:"); scanf("%d",&M); printf("\nThe number of women item is:"); scanf("%d",&W); printf("\nThere are three form of marked you can choice:"); printf("\n\n\t1).1th--7,2th--5,3th--3,4th--2,5th--1."); printf("\n\n\t2).1th--5,2th--3,3th--1."); printf("\n\n\t3).Define by youself."); loop: printf("\n\nChoice the number(1--3):"); scanf("%d",&h); if(h>0&&h<4) switch(h) {case 1:j=1;break; case 2:j=2;break; case 3:define_mark(); } else goto loop; printf("Success!!!\nPress any key+Enter to menu..");scanf("%d",&r); menu(); } enter() { int t,r,i=0;extern j,y;char F,M; if(y==0) { printf("Please establish system first!!\nPress any key+Enter to menu.. "); scanf("%d",&r); menu(); } do { printf("\nPlease enter the student's name:\t");scanf("%s",&stu[i].name); printf("\nPlease enter the student's shool:\t");scanf("%s",&stu[i].shool); printf("\nPlease enter the student's item:\t");scanf("%s",&stu[i].item); loop_1: printf("\nPlease enter the student's sex(W or M):\t");scanf("%s",&stu[i].sex); if(stu[i].sex!='W'&&stu[i].sex!='M')goto loop_1; printf("\nPlease enter the student's position:\t");scanf("%d",&stu[i].position); mark(j,i); loop_2:printf("\n\nDo again?\t1).Yes\t2).No\t"); scanf("%d",&t); if(t!=2&&t!=1)goto loop_2; if(t==2)break; i++; }while(t==1);f=1; printf("Success!!!\nPress any key+Enter to menu..");scanf("%d",&r); menu(); } search() { int e;char c;extern f; if(f==0) { printf("Please enter the data first!!\nPress any key+Enter to menu..\n "); scanf("%s",&c); menu(); } loop:printf("\nThe form of searching you want to choice:\n\t1).By school\n\t2).Bt item\n\t3).To menu\t"); scanf("%d",&e); switch(e) { case 1:search_school();break; case 2:search_item();break; case 3:menu(); } if(e>4||e<1)goto loop; printf("Press any key+Enter to menu..");scanf("%s",&c);menu(); } search_school() { int x,sum=0,w=0; struct student s; printf("\nPlease enter the name of the school that you want to search:"); scanf("%s",&s.shool); printf_face();