C课程设计

本报告介绍了一个基于C语言实现的运动会报名及查询系统的设计与实现过程。系统支持学生在线报名、信息修改、取消报名等功能,并能对报名信息进行查询。通过文件读写实现了数据持久化。

浙江传媒学院

课程设计(实训)报告

 

 

 

学    院 ______新媒体_________

专    业 ___信息管理与信息系统__________

班    级 ____信管一班___________

学    号__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,这样只能使在查询时相同名字的运动员信息只显示第一条,经多次调试,找到了两全其美的方法,新增一个变量来控制循环。

 

   

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值