浙江传媒学院
课程设计(实训)报告
学 院 ______新媒体_________
专 业 ___信息管理与信息系统__________
班 级 ____信管一班___________
学 号__120806125__________
姓 名 ___于莹____________
课 题 ___运动会报名及查询系统__________
指导教师 __贾晓雯_____________
报告成绩______________
日 期:2012年 5 月 30 日
目 录
一、 课程设计目的…………………………………………………3
二、 课程设计要求…………………………………………………3
三、 设计题目分析…………………………………………………3
3.1题目简介………………………………………………………3
3.2设计要求………………………………………………………3
四、 课程设计内容………………………………………………3
4.1 总体设计……………………………………………………3
4.2 详细设计……………………………………………………4
4. 3调试与测试…………………………………………………17
五、 设计心得与总结……………………………………………17
1.课程设计目的
统过进行计算机实践,更加系统地理解和掌握C语言的基本概念、语言特点和编程技巧。利用系统提供的标准函数和自定义函数进行程序设计,培养利用C语言设计综合程序的能力。
2.课程设计要求
(1)小组成员自主选题,在规定时间内完成课程设计任务;
(2)组内成员,分工明确,相互协作;
(3)利用文件的读写对数据进行操作;
(4)利用C语言实现数据库的管理,包括数据的增加、删除、修改、查询等功能;
3.设计题目分析
3.1 题目简介
基于对传统运动会逐级报名的诸多弊端的考虑,我组成员有志于设计一个可供广大学生进行运动会报名的系统,本系统首先可公布实时、准确的赛程信息,有意报名者可通过系统进行报名,在运动会之前,运动员课随时进入我们的系统报名,修改信息,退保等,还可查询相关赛事的运动员报名情况。
3.2 设计要求
系统包括填写个人信息报名并将个人信息保存到文件中、可以根据姓名或项目查询报名情况、取消报名、修改自己的报名信息以及再次报名等功能。
4.课程设计内容
4.1 总体设计:包括系统总体设计框架和系统功能模块图
1、报名及保存报名信息
2、读取所有报名信息
3、信息查询
(1)按姓名查询
(2)按项目查询
4、取消报名(删除)
5、修改报名信息
6、再次报名
7、退出
4.2 详细设计:包括主要功能模块说明(如函数功能、函数参数说明、函数调用关系描述)和对应的工作流程图;
(1)结构体数组的定义
定义一个类型为struct studennt的结构体数组stu[1000], 包括运动员报名时所需填写的信息项。
struct student
{char name[20];
char gender[5];
char xueyuan[50];
char zhuanye[50];
int banji;
int xiangmu;}stu[1000];
(2)进入报名并保存报名信息函数
功能:通过对结构体数组的引用,及对文件的读取,将成功报名的运动员的信息保存在文件中。
源代码:
write()
{FILE *fp,*fh;
int j=0;
charcRes='y';
if((fh=fopen("member.txt","w+"))==NULL)//打开文件写入报名人数
{printf("can not open");
exit(0);}
fscanf(fh,"%d",&j);
fclose(fh);
fp=fopen("d:\\design1.txt","w+");//打开文件写入报名信息
do
{if(cRes == 'n')
{break;}
printf("姓名\t\t性别\t 学院\t 专业\t 班级\t 项目\n");
printf("(班级和项目请输入数字)\n");
scanf("%s%s%s%s%d%d",stu[j].name,stu[j].gender,stu[j].xueyuan,stu[j].zhuanye,&stu[j].banji,&stu[j].xiangmu);
fprintf(fp,"%s\t%s\t%s\t%s\t%d\t%d\n",stu[j].name,stu[j].gender,stu[j].xueyuan,stu[j].zhuanye,stu[j].banji,stu[j].xiangmu);//将报名信息写入文件
j++;
if((fh=fopen("member.txt","w"))==NULL)
{printf("can not open");
exit(0);}
fprintf(fh,"%d",j);//将报名人数写入文件
fclose(fh);
printf("\tY(^o^)Y 报名已成功,是否继续报名?(y/n):");
scanf("%s",&cRes);//判断是否继续输入
}while((strcmp(stu[j].name,"ok"))!=0);
fclose(fp);
printf("\t( ^_^ ) 恭喜您报名成功!请按回车键返回主菜单");
getch();system("cls");
return 0;
}
(3)从文件中读取所有报名信息并输出
将文件中的信息全部读出到结构体数组中,再将其输出到屏幕。
源代码:
Print()
{
system("cls");
FILE *fp,*fh; int i; int j=0;
struct student mao;
if((fh=fopen("member.txt","r+"))==NULL)
{printf("can not open");
exit(0);}
fp=fopen("d:\\design1.txt","r");
fscanf(fh,"%d",&j);
printf("姓名\t 性别\t学院\t 专业\t班级 项目\n");
for(i=0;i<j;i++)
{printf("\n※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n\n");
fscanf(fp,"%s%s%s%s%d%d",stu[i].name,stu[i].gender,stu[i].xueyuan,stu[i].zhuanye,&stu[i].banji,&stu[i].xiangmu);//将报名信息赋给结构体数组
printf("%s\t %s\t %s\t %s\t%d %d\n",stu[i].name,stu[i].gender,stu[i].xueyuan,stu[i].zhuanye,stu[i].banji,stu[i].xiangmu);}
fclose(fp);
printf("\n\t(*^__^*) 请按回车键返回主界面 (*^__^*)");
getch();system("cls");
fclose(fh); return 0; }
(4)查询函数
可通过按姓名查询和按项目查询两种方式。
Sarch函数中调用Name和Xiangmu两个函数。
Sarch()
{
intk;
do
{
printf("\t↖(^ω^)↗ 请输入你要查询的方式:\n");
printf("\t \t\t ╭︿︿︿╮\n");
printf("\t*****1.按姓名查询*****\t\t {/-⊙⊙-/}\n");
printf("\t*****2.按项目查询*****\t\t ( (oo) )\n");
printf("\t=====3.返回主菜单=====\t\t ︶︶︶ \n");
scanf("%d",&k);
switch(k)//查询方式的选择
{
case1:name();break;
case2:xiangmu();break;
case3:break;
}
printf("\t(*^__^*) 请按回车键返回主界面! (*^__^*)\n");
getch();
system("cls");
return0;
}while(k!=3);
}
1) 按姓名查找函数
从键盘输入需要查找的名字,通过strcmp进行判断,如文件中有与输入的名字相同的名字,则输出该运动员的所有信息;如一人报多项,则可将多条信息依次输出;如输入的名字不能与文件中的数据相匹配,则可给出错误提示。
源代码:
name()
{system("cls");
FILE *fp,*fh;
struct student mao;
intj=0;
if((fh=fopen("member.txt","r+"))==NULL)
{printf("can not open");
exit(0);}
fp=fopen("d:\\design1.txt","r");
char c;
inti,f,k;
fscanf(fh,"%d",&j);//从文件中读取报名总人数
fclose(fh);
do
{
k=0;
printf("\t(*^__^*) 请输入您要查询的运动员的名字: (*^__^*)\n");
scanf("%s",&mao.name );
for(i=0;i<=j;i++)
{
if(strcmp(stu[i].name,mao.name )==0)//用函数进行名字的匹配
{
printf("姓名\t 性别\t学院\t 专业\t班级 项目\n");
printf("\n☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
printf("%s\t %s\t %s\t %s\t%d %d\n",stu[i].name,stu[i].gender,stu[i].xueyuan,stu[i].zhuanye,stu[i].banji,stu[i].xiangmu);
}
if(strcmp(stu[i].name,mao.name )!=0) k++;
}
if(k>=j)
printf("对不起,您输入的名字有误或此人未报名!");
printf("\n\tY(^o^)Y 是否继续查询?y/n:\n");
c=getch();
if(c=='y'||c=='Y') f=0;//判断是否继续查询
else f=1;
}while(f==0);
printf("\t(*^__^*) 请按回车键返回主界面! (*^__^*)\n");
getch();
system("cls");
return 0;
}
2) 按项目查询函数
从键盘输入需要查找的项目编号,引用结构体数组,与文件中的数据相比较,输出填报该项目的所有运动员的信息,如果该项目没有人报名,则给出提示。
源代码:
xiangmu()
{ system("cls");
FILE *fp,*fh;
struct student mao;
int j=0; int i,f,k; char c;
if((fh=fopen("member.txt","r+"))==NULL)
{printf("can not open"); exit(0);}
fp=fopen("d:\\design1.txt","r");
fscanf(fh,"%d",&j);
fclose(fh);
do
{k=0;
printf("\t(*^__^*) 请输入您要查询的项目编号(*^__^*):\n");
scanf("%d",&mao.xiangmu);
for(i=0;i<j;i++)
{if(stu[i].xiangmu==mao.xiangmu)//进行项目的匹配
{printf("\n姓名\t 性别\t学院\t 专业\t班级 项目\n");
printf("\n‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥\n\n");
printf("%s\t %s\t %s\t %s\t%d %d\n",stu[i].name,stu[i].gender,stu[i].xueyuan,stu[i].zhuanye,stu[i].banji,stu[i].xiangmu); }
if(stu[i].xiangmu!=mao.xiangmu) k++;}
if(k>=j)
printf("对不起,此项目未有人报名!");
printf("\n\tY(^o^)Y 是否继续查询?y/n:\n");
c=getch();
if(c=='y'||c=='Y') f=0;
else f=1;
}while(f==0);
printf("\t(*^__^*) 请按回车键返回主界面! (*^__^*)\n");
getch(); system("cls"); return0;}
(5) 取消报名(删除函数)
从键盘输入要删除的名字 ,通过strcmp函数与结构体数组中的名字相比较,找到该运动员的信息,通过用后面一条信息依次覆盖前面一条信息的方式进行删除,将删除该运动员的结构体数组再次写入文件中。
源代码:
Delete()
{
int ch;
do
{
printf("\t请选择:\t ╭﹌╮╭ ∽╮ oοО○\n");
printf("\t1.删除\t (o-.-o)(o-.-o) \n");
printf("\t2.返回\t (~~﹊︸ ̄︸ ̄︸)\n");
printf(" ( ◆ ◆ ◆ ◆ )\n");
printf(" ( ◆ ◆ ◆ ◆ ) \n");
printf(" ( ◆ ◆ ◆ ◆ ) \n");
scanf("%d",&ch);
switch(ch)
{ case 1:del_name();break;
case 2:break;}
}while(ch!=2);
printf("\t(*^__^*) 请按回车键返回 (*^__^*)");
getch();system("cls");
return 0;
}
del_name()//按姓名删除函数
{
system("cls");
FILE *fp;
struct student mao;
int j=0;
fp=fopen("d:\\design1.txt","r+");
int i,m=0,flag;
char choice;
FILE *fh;
if((fh=fopen("member.txt","r+"))==NULL)
{printf("can not open");
exit(0);}
fscanf(fh,"%d",&j);
char de_name[12];
do{
FILE *fp;
printf("\n输入您的的姓名:(请注意一次只能删除一次,若能您报了两项或两项以上请删除两次!~\(≧▽≦)/~)");
scanf("%s",de_name);
for(i=0;i<j;i++)
{
if(strcmp(stu[i].name,de_name)==0)//通过覆盖删除报名信息
{ for(;i<j;i++)
stu[i]=stu[i+1];
}
}
j=j-1;//改变报名总数
fh=fopen("member.txt","w+");
fprintf(fh,"%d",j);//将改变后的报名总数写入文件
fp=fopen("d:\\design1.txt","w+");
for(i=0;i<j;i++)
fprintf(fp,"%s\t%s\t%s\t%s\t%d\t%d\n",stu[i].name,stu[i].gender,stu[i].xueyuan,stu[i].zhuanye,stu[i].banji,stu[i].xiangmu);//删除后的信息再次写入文件
fclose(fp);
printf("请稍等,正在删除中:");
printf("▁");Sleep(1000);
printf("▂▃");Sleep(600);
printf("▄▅▆");Sleep(400);
printf("▇");Sleep(200);
printf("█ 100%%");Sleep(100);
printf("\n 此报名信息已被删除~~~~(>_<)~~~~ \n");Sleep(200);
printf("\n\tY(^o^)Y 要继续删除吗?(y/n)\n");
choice=getch();
if(choice=='y'||choice=='Y')
{printf("\n ~~o(>_<)o ~~继续!\n");
flag=1;}
else flag=0; }while(flag==1);
fclose(fh);
printf("\t(*^__^*) 请按回车键返回! (*^__^*)\n");
getch();system("cls");
return 0;
}
(6) 修改函数
从键盘输入需要修改信息的运动员的名字,通过strcmp函数与结构体数组中的名字相比较,找到该运动员的信息后,可对多项信息选择性修改,最后将修改后的信息再次写入文件。
源代码:
Modify()
{ system("cls");
FILE *fp,*fh;
struct student mao;
int j=0; int k,flag,i,n,c=0;
if((fh=fopen("member.txt","r+"))==NULL)
{printf("can not open"); exit(0);}
fscanf(fh,"%d",&j);
fp=fopen("d:\\design1.txt","r+");
char ch;
do
{printf("\tO(∩_∩)O 输入您要修改的运动员的名字: O(∩_∩)O:\n");
scanf("%s",mao.name);
printf("姓名\t\t性别\t 学院\t 专业\t 班级\t 项目\n");
for(i=0;i<j;i++)
{fscanf(fp,"%s%s%s%s%d%d",stu[i].name,stu[i].gender,stu[i].xueyuan,stu[i].zhuanye,&stu[i].banji,&stu[i].xiangmu);
if(strcmp(stu[i].name,mao.name)==0)
{ c=1;
printf("%s\t %s\t %s\t %s\t %d\t %d\n",stu[i].name,stu[i].gender,stu[i].xueyuan,stu[i].zhuanye,stu[i].banji,stu[i].xiangmu);
printf("\t(*@ο@*) 请选择您要修改的项目 (*@ο@*):\n");
printf("1.运动员姓名~~~^_^~~~ \n");
printf("2.运动员性别~~~^_^~~~ \n");
printf("3.运动员学院~~~^_^~~~ \n");
printf("4.运动员专业~~~^_^~~~ \n");
printf("5.运动员班级~~~^_^~~~ \n");
printf("6.项目的编号~~~^_^~~~ \n");
scanf("%d",&k);
switch(k)//选择修改项目,进行重新输入并赋值
{ case1:printf("请输入要修改的名字T^T\n");scanf("%s",stu[i].name);break;
case 2:printf("请输入要修改的性别T^T\n");scanf("%s",stu[i].gender);break;
case 3:printf("请输入要修改的学院T^T\n");scanf("%s",stu[i].xueyuan);break;
case4:printf("请输入要修改的专业T^T\n");scanf("%s",stu[i].zhuanye);break;
case 5:printf("请输入要修改的班级T^T\n");scanf("%d",&stu[i].banji);break;
case6:printf("请输入要修改的项目T^T\n");scanf("%d",&stu[i].xiangmu);break; }
}
}if(c==0)
printf("对不起,查无此人-_-|||-_-|||\n");
fp=fopen("d:\\design1.txt","w+");
for(i=0;i<j;i++)//将修改后的信息写入文件
{fprintf(fp,"%s\t%s\t%s\t%s\t%d\t%d\n",stu[i].name,stu[i].gender,stu[i].xueyuan,stu[i].zhuanye,stu[i].banji,stu[i].xiangmu);}
fclose(fp);
printf("\tY(^o^)Y 是否继续输入?Y/N\n");
ch=getch();
if(ch=='Y'||ch=='y') {printf("\t继续(@﹏@)~ \n");
flag=1; system("cls");}
elseflag=0;
}while(flag==1);
printf("\t(*^__^*) 按回车键返回主菜单 (*^__^*)\n");
getch();
system("cls");
return 0;
}
(7) 再次添加报名信息函数
以读和追加的方式打开文件,将再次报名的信息存储在原信息之后。
源代码:
writeagain()
{
FILE *fp,*fh;
int j;
char cRes='y';
if((fh=fopen("member.txt","w+"))==NULL)
{printf("can not open");
exit(0);
}
fclose(fh);
fp=fopen("d:\\design1.txt","a+");
printf("请输入您刚才成功报名的人数:");//知道已报名的人数,以便添加在之后,避免覆盖
scanf("%d",&j);
do
{
if(cRes == 'n')
{break;}
printf("姓名\t\t性别\t 学院\t 专业\t 班级\t 项目\n");
printf("(班级和项目请输入数字)\n");
scanf("%s%s%s%s%d%d",stu[j].name,stu[j].gender,stu[j].xueyuan,stu[j].zhuanye,&stu[j].banji,&stu[j].xiangmu);
fprintf(fp,"%s\t%s\t%s\t%s\t%d\t%d\n",stu[j].name,stu[j].gender,stu[j].xueyuan,stu[j].zhuanye,stu[j].banji,stu[j].xiangmu);
j++;
if((fh=fopen("member.txt","w+"))==NULL)
{ printf("can not open");
exit(0);}
fprintf(fh,"%d",j);
fclose(fh);
printf("\tY(^o^)Y 报名已成功,是否继续报名?(y/n):");
scanf("%s",&cRes);}while((strcmp(stu[j].name,"ok"))!=0);
fclose(fp);
printf("\t( ^_^ ) 恭喜您报名成功!请按回车键返回主菜单");
getch();system("cls");
return 0;
}
4.3 调试与测试:包括程序调试过程、数据测试结果分析,测试过程中遇到的主要问题及采取的解决措施;
(1)最初文件的读写存在问题,将输入的运动员信息保存在结构体数组中后,可以对其修改、删除、查询等,所进行的操作都是针对结构体数组,但不能将其写入文件,关闭系统后再次进入时,一切为空。
(2)令成功报名的运动员总数为j,开始写的程序不能有效的控制j的变化对其它函数功能的影响,后定义一个新文件fh,用于存储j的变化。
(3)文件的打开与关闭要放在循环之外。
(4)再次报名时,以读和追加的方式打开文件,将新报名的信息加在原文件数据之后。
(5)删除数据时,用要删除的数据后一条数据依次覆盖前一条,开始因为输出的循环变量的控制不对,而使最后一条数据会重复输出;删除功能得以完善。
(6)在修改时,因为对文件的读写存在问题,导致修改的只是结构体数组,而不能对文件修改,经过对文件使用的研究,使该问题得到解决。
(7)在查询和修改之后都对应设置错误提示语句,但因对循环变量的控制存在问题,导致在有两项运动员名字相同时,只能查询或修改第一条,如果多条都可查询,又不能显示错误提示语句,经反复的思考和调试,新定义一个变量来控制循环,最终使两个功能都能实现。
(8)文件打开后,一定要关闭。
(9)if的判断语句一定要注意“=”和“==”的区别,我曾因将“==”写为“=”而不能实现预期的函数功能,废了好长的时间有换了种方法才实现的函数功能,后来经同学提醒才意识到这个问题的严重性,这样的错误以后不会再犯了。
5.设计心得与总结:包括课题的完成情况、系统存在的不足、可改进的地方以及课程设计过程中的学习体会和收获等内容。
完成情况:预期功能都得到实现和完善。
学习体会:
我在这一周的课程设计过程中学到了很多东西,在这之前,我只是编写小程序,感觉学得还挺扎实的,但并未像实践课这样将C语言的知识整合加以运用,所以课程设计的前两天,会感觉有劲不知道往哪用,后来几天才清晰自己该做什么,使系统的设计有较大进展。
我对文件的读写使用就像丈二的和尚——摸不着头,在小组成员的帮助及老师的指导下,我现在已经能对文件进行熟练的操作。
对循环的控制也是我小组最初存在的较严重的问题,如for语句后加分号,判断体中加break,这样只能使在查询时相同名字的运动员信息只显示第一条,经多次调试,找到了两全其美的方法,新增一个变量来控制循环。