西安郵電學院1西安郵電學院C语言课程设计报告书(xianyoudiandaxue)系部名称电子信息与工程系学生姓名张倩专业名称电子信息工程班级电子0701班学号05071013指导教师衡霞时间2008年06月09日至2008年06月20日西安郵電學院2实验题目学生信息管理系统一、实验目的:(1)本课程设计为学生提供了一个既动手又动脑,自学,查资料,独立实践的机会。将本学期课本上的理论知识和实际有机的结合起来,锻炼学生实际分析问题和解决问题的能力,提高学生适应实际、实践编程的能力,使对C语言系统编程有一个大致的了解。(2)C语言的实践。掌握C语言函数的定义方法,函数的声明及函数的调用过程。掌握结构体类型变量的定义和使用,综合应用C语言的知识,实现一个完整的系统,提高编程能力,体会软件程序的开发过程。二、实验内容:(1)运用结构体数组编辑一个简单的学生管理系统,使之能够完成学生信息的创建、添加,查询、修改,删除、统计、排序等操作,并对文件进行保存和读取。(2)执行编译操作,并根据提示调试此程序,排除所有的错误和警告。直到编译成功为止。(3)执行运行操作,逐一对每个模块进行调试。直到全部程序运行成功为止。(4)请老师检查,向老师演练此程序,并能回答老师提出的相关问题。三、需求分析:(1)根据学生信息管理的需要,建立一个“学生信息管理系统”,系统具有输入、输出、查询、修改、删除、统计、排序等基本功能;以方便对信息的管理操作。每一条记录包括一个学生的学号、姓名、成绩、性别,年龄,出生年月日,家庭住址.系统的各个功能模块都用函数的形式来实现;可以将学生成绩信息保存在文件中,并从文件中读取出来。有一个清晰美观界面来调用各个功能。本程序是由C语言的基本单位—函数来设计实现与其功能的多次使用函数调用以及函数的嵌套调用。本程序分为7个模块,分别为创建学生资料;添加学生的资料;查询学生的成绩;修改学生的资料;删除学生的资料;统计学生的成绩;对学生的资料进行排序。本程序可以处理多个学生的成绩的输入、添加、修改、排序等问题。本程序的使用特别方便,每做完一个模块,下面都有提示信息。使用环境为Tc。(2)创建该学生成绩管理系统目的就是能够对学生基本信息进行创建、追加、查询、修改、删除、统计、排序等功能,这样可以简化许多人工做起来很复杂的问题。譬如:“排序”,有了此程序只需将信息输入,计算机就可自动执行,省时、省力。另外,它还可以重复使用,方便、快捷。(3)该学生基本信息管理系统是在WIN-TC中文简体环境下运行。该系统要测试的数据如下:输入模块:(输入5个学生的信息)西安郵電學院3添加模块:(再加1个信息)06KingA10485619malenanjing1989-9-23查询模块:(查询Jim的基本信息)A1024(按学号即可查询)或Jim(按姓名也可查询)修改模块:(修改Linda的信息)(输入)1(修改名字)(输入)2(修改学号)(输入)3(修改成绩)(输入)4(修改性别)(输入)5(修改年龄)(输入)6(修改家庭住址)(输入)7(修改出生年月日)删除模块:(删除King的基本信息)学号即可删除)统计模块:可统计男女人数,统计各分数段人数。排序模块:按成绩,学号,分别进行排序。四、概要设计(1)主函数结构图:(2)模块功能详细说明:A、输入模块:此模块可以连续输入30个学生的资料,若学生数少于30,则可以在输入序号处输入0便可退出此模块,并把输入的信息保存到c:\\students文件中。B、输出模块:此模块中先打开c:\\students文件中的学生信息,后输出要学生序号姓名学号成绩年龄性别家庭住址出生年月日01MaryA10019818femaleshandong1988-5-602LindaA10028618fameladalian1988-12-2303TomA10249519malenanshang1988-9-804JimA10258019malebeishang1988-5-2305SusanA10477818femalexishan1988-8-9主函数输入模块输出模块更新模块查询模块排序模块统计模块退出模块西安郵電學院4信息.c.更新模块:此模块包括添加,修改,删除模块.修改模块:此模块中可以修改学生的任何一个信息。修改完毕后输入y可以继续修改,输入n则退出此模块。删除模块:此模块中用到的删除原理为覆盖要删除的学生的资料。过程简述,先输入要删除的学生的学号,系统找到此学生的信息后给它复制下一个学生的信息,给下一个学生的纪录复制下下一个学生的信息,一直到最后一个学生的信息复制给倒数第二个学生的信息为止。然后文件中的学生总数减一含了三个小模块.添加模块:此模块中先打开c:\\students统计文件中的学生,后输入要添加的学生的学号,系统确认此学号在c:\\students不存在时开始纪录新学生的资料,便清楚使用者。D.查询模块:此模块中使用者可以用三种方式查询学生成绩。分别为(1)按学号查询(2)按姓名查询。在这里以按学号查询为列:先选择按学号查询,输入要查询的学生的学号,系统确认此学号在c:\\stud存在后读取信息并在屏幕上输出学生纪录。F、排序模块:此模块用的为指针。在此模块中可以按两种方法进行排序,分别为(1)按成绩排序(2)按学号排序(3)按序号排序输出时分别以从大到小和从小到大从小到大的循序进行输出。G、此模块较简单,统计文件c:\\students中的男和女的学生个数和各成绩段的人数。五、详细设计及运行结果(1)各个模块的程序流程图添加模块:.西安郵電學院5删除模块:从c:\\students文件中读取学生个数sum,i=sum,flag=0stud[i].num=++sum输入学生信息choice=’y’||choice=’Y’?i++;flag=1flag=0结束西安郵電學院6排序模块:打开c:\\students统计文件中的个数sum中学生个数counti←0输入删除的学号isumi++srcmp(stud[i].number,delete_number)==0?该学生是不存在的isum?i++stud[i]=stud[i+1];sum=sum-1该学生已经被删除了结束西安郵電學院7打开c:\\students文件统计文件中学生个数sumstructstud*p,*q[MAX]p=studi=0isumi++q[i]=p++isum?i++k=ij=k+1jsum?j++strcmp(q[k]-number,q[j]-number)0?k=jk!=ip=q[i];q[i]=q[k];q[k]=p输出结果结束西安郵電學院8打开c:\\students文件统计文件中学生个数sumstructstud*p,*q[MAX]p=studi=0isumi++q[i]=p++isum?i++k=ij=k+1jsum?j++q[k]-scoreq[j]-score?k=jk!=ip=q[i];q[i]=q[k];q[k]=p输出结果结束西安郵電學院9(2)函数之间相互调用的图示:打开c:\\students文件统计文件中学生个数sumstructstud*p,*q[MAX]p=studi=0isumi++q[i]=p++isum?i++k=ij=k+1jsum?j++q[k]-numq[j]-num?k=jk!=ip=q[i];q[i]=q[k];q[k]=p输出结果结束西安郵電學院10(3)主要函数之间相互调用如下:主函数的调用:main(){intchoice;sum=read_message();bioskey(0);printf(pressanykeytocontinue:\n);getch();do{system(cls);printf(\n\n\n**************studentmanagesystem**************\n\n);printf(1.inputmessage\n\n);printf(2.outputmessage\n\n);printf(3.renewmessage\n\n);printf(4.inquiremessage\n\n);printf(5.sortmessage\n\n);主函数调用输入函数调用输出函数调用更新函数调用查询函数调用排序函数调用统计函数结束结束结束结束结束结束调用退出函数结束西安郵電學院11printf(6.countmessage\n\n);printf(0.exitthesystem\n\n);printf(pleaseselectthechoice);scanf(%d,&choice);switch(choice){case1:input_message();break;case2:output_message();break;case3:renew_message();break;case4:inquire_message();break;case5:sort_message();break;case6:count_message();break;case0:break;}}while(choice!=0);save_message(sum);printf(\n-messagehassaved!-(filename:students.txt)\n);}西安郵電學院12删除函数的调用delete_message(){chardelete_number[10];inti;system(cls);printf(pleaseinputthenumberyouwanttodelete:);scanf(%s,delete_number);for(i=0;isum;i++){if(strcmp(stud[i].number,delete_number)==0){for(;isum;i++)stud[i]=stud[i+1];sum=sum-1;printf(themessagehasbeendeleted!);}elseprintf(thestudentisnotexist!);}}添加函数的调用insert_message(){inti=sum,j,flag=0;charchoice;system(cls);printf(\n\naddanewstudent\n);printf(--------------------------------------------------\n);do{stud[i].num=++sum;printf(\nthenewstudent'snum:%d,stud[i].num);printf(\nthenewstudent'sname:);scanf(%s,stud[i].name);printf(\nthenewstudent'snumber:);scanf(%s,stud[i].number);printf(\nthenewstudent'sscore:);scanf(%d,&stud[i].score);printf(\nthenewstudent'sage:);scanf(%d,&stud[i].age);printf(\nthenewstudent'ssex:);scanf(%s,stud[i].sex);printf(\nthenewstudent'saddress:);scanf(%s,stud[i].address);printf(\nthenewstudent'sbirthday:);scanf(%d%d%d,&stud[i].birthday.year,&stud[i].birthday.month,&stud[i].birthday.day);printf(\nDoyouwanttocontinue?(Y/N));choice=getch();if(choice=='y'||choice=='Y'){printf(\ncontinue!\n);