C语言实训报告_c语言实训报告
C语言实训报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c语言实训报告”。
湖北汽车工业学院电气与信息工程学院
《C语言程序设计》
实训报告
实训题目: 学生信息管理系统
专业: 汽车电子工程专业 班级:
姓名: 成绩:
一、需求分析
1、问题
根据需求,该系统所应包含的信息有以下一些: 学生的基本信息:
学号,班级,姓名,年龄,出生日期。
根据需求,该系统所应实现的功能有以下一些:
各种基本信息数据的录入:a由键盘输入学号,班级等基本信息。B由文件录入学生信息。对学生信息的查询:a按学号查询指定学生信息。
b按班级查询指定班级内学生的信息。
学生基本信息数据的删除:按学生学号来删除指定学号的学生信息。学生基本信息的保存:将录入的学生信息保存到文件中。
2、系统
采用C语言实现,开发环境为VC,可以运行在操作系统windows98及以上皆可。
3、运行要求
能连续录入任意个数学生的基本信息。
界面简洁,操作方便,提示人性化,例如删除前需要提示用户是否删除
容错性强,例如输入的学生出生日期格式不对或日期不符合时提示输入错误,并可重新输入。
二、总体设计
1、系统流程设计
根据系统要求,设计如下的系统流程
菜单显示用户输入操作判断用户选择的操作执行相应的操作退出
+
2、系统模块设计
根据系统的功能设计,如下模块
学生信息管理系统主界面显示功能选择键盘输入学生信息文件录入学生信息按学号查学生信息按班级查学生信息删除指定学号信息保存学生信息
主界面模块:完成系统菜单的显示
功能选择模块:根据用户的选择,完成其相应的功能
键盘输入学生信息:从键盘输入任意个数学生的基本信息,并保存到结构体链表中。
文件录入学生信息:从指定的文件中录入学生的基本信息,并保存到结构体链表中。
按学号查学生信息:输入要查找的学生的学号,可查询并显示该学号对应学生的基本信息。
按班级查学生信息:输入要查找的班级,可查询并显示该班级内学生的基本信息。
删除指定学号信息:输入要删除的学生的学号,可找到并显示该学号对应学生的信息并删除其信息。
保存学生信息:可将已录入的学生信息保存到指定的文件中。
三、详细设计
1、数据结构设计
根据系统要求,系统中需要保存的数据有通讯录的信息,其结构如下: 数据项 数据项名称 数据类型 数据长度 备注 学号 xh_number 整形变量 2 班级 bj_number 整形变量 2 姓名 name 字符串变量 20 年龄 nl_number 整形变量 2
指向日期结构指向日期结构体类型的指针体的指针 born_day*q 变量
应题目要求另加一个存放日期的结构体: 数据项 数据项名称 数据类型 数据长度 备注 年份 y 整形变量 2 月份 m 整形变量 2 号 d 整形变量 2
为了能实现可连续输入任意个数的学生信息,我采用链表的结构保存学生的基本信息,在增加学生的基本信息时,创建一个学生信息的节点,将其插入到链表中,示意图如下。
学生基本信息1学生基本信息2学生基本信息3学生基本信息4
使用C语言创建的结构体如下: struct student { int xh_number;学号 int bj_number;班级 char name[20];姓名 int nl_number;年龄
struct born_day*q;指向日期结构体类型的指针
struct student *next;指向学生信息结构体类型的指针 };
2、界面设计 主界面:
根据系统要求,设计一个字符界面,显示系统的菜单,为了体现友好性,将在每个菜单前显示该菜单项对应的数字
用户输入菜单项前面的数字,主菜单消失,进入该模块的相应界面,进行相应的操作,完成后,回到主界面。
输入界面:
a通过键盘输入录入学生信息:
根据提示语句可连续输入多个学生的学生信息
b通过文件录入学生信息:
查询界面: a按学号查询:
b按班级查询:
删除界面:
输入要删除的学生的学号,确认删除收即可删除.导出界面:
3、模块实现
主界面实现:调用printf()函数,在屏幕上打印需要显示的字符信息,需要在显示之前调用system(“cls”)函数将前面的界面清空。
对应的实现函数ml();功能选择模块实现:
接受从键盘输入的菜单选择,判断并调用相应的功能函数,完成其对应的功能。实现功能选择。
对应的语句:switch();学生信息录入模块实现:
模块说明:从键盘接收输入的学生信息,在动态存储区中创建学生信息的节点,遍历链表,将其插入到学生信息链表的最后位置。
模块流程:
清屏遍历链表找到最后一个节点创建一个新节点从键盘给新节点赋值将新节点连接到链表的最后一个节点上 对应函数:struct student *creat()
学生信息导入模块实现:
模块说明:进入功能后先对屏幕清屏,再从键盘输入要导入的文件名,及要录入的学生的个数。根据学生个数创建含有对应个学生信息结构体的链表。判断打开文件是否成功,从文件中依次将学生信息录入到链表中的对应结构体内,录入完毕后,判断文件是否关闭成功,模块结束。
模块流程:
清屏输入导入的文件名和要记录学生的个数建立含有相应个数结构体的链表判断链表是否结束从文件读入学生信息录入到结构体移动指针到下一结构体显示文件录入成功
对应函数:struct student *duru()学生信息按学号与按班级查询模块实现:
模块说明:先清屏,然后输入要查询的学生的学号或班级,建立一个指针从学生信息链表的首地址看是逐个判断其结构体内的学生学号或班级是否相等,如果相等就显示并跳出循环。如果循环到最后都没有相等的就显示没有此学号或班级的学生信息,并结束功能。
模块流程 输入要查询的学号或班级判断循环是否结束否如果本结构体内学号与要查询的一样就显示器信息并将-1赋给num同时跳出循环不一样就移动指针到下一个结构体是判断num是不是-1否显示此学号或班级无对应的学生信息是显示查询功能结束
对应函数:xhcx(struct student *p)和bjcx(struct student *p)
学生信息删除模块实现:
模块说明:先清屏,然后输入要删除的学生学号,循环判断链表中的结构体是否为要删除的学生信息结构体,如果是就提示是否删除,若要删除就将此结构体的前一个和后一个结构体连接起来,然后对出功能。
模块流程: 输入要删除的学号判断循环是否结束否判断是否是要删除的结构体是提问是否删除是将前一结构体与后一结构体连接,并且令x为-1否否是移动指针到下一个结构体令x为-2,并跳出循环判断x是否大于零是显示次学号无对应的学生信息是判断x是不是-1是删除成功,并退出功能否不进行删除,并退出功能 对应函数:delete(struct phone * head)通讯录信息导出模块实现:
模块说明:先清屏,然后打开一个文件,并且令文件指针指向此文件,进行循环依次将结构体里的信息输入到文件中,最后关闭文件,并对出功能。
模块流程:
创建文件指针判断打开文件是否成功否关闭程序是判断循环是否结束否将指针所指的结构信息体输入到文件中是将指针移动到下一个结构体保存文件并退出功能
对应函数:save(struct student *p)
四、测试结果
1、输入学生信息测试
测试数据:
输入 001 1 王天祺 19 1992-03-05
测试结果: 程序运行出现错误
原因 sanf()中没有加取址符&。经过修改再次输入数据 运行成功,结果:
2、从文件录入测试 已知有一文件:
又将此文件内的信息录入到系统中 测试结果:
3、查询学生信息测试
测试数据:在系统中存在一个学号为001的学生。
测试成功,结果:
此为按学号查询
此为按班级查询
4、删除测试
测试数据:已有三个数据:001 1 wtq 19 1992-03-05
002 2 zdy 19 1991-02-19
003 1 sdf 20 1992-01-12 删除学号为2的学生信息 测试结果:
5保存学生信息的测试:
测试数据:将测试4中删除后的学生信息保存起来: 测试结果:
此为保存的文件内容。
五、实训总结
实训感想
对系统开发的总结(设计亮点,存在的不足,需要改进的地方)
本学生信息管理系统程序的编辑的整体思路并不复杂,主要就是通过建立由储存有学生基本信息的结构体构成的链表以及对链表的一些技术运用,来达到
1.各种基本信息数据的录入如:a由键盘输入学号,班级等基本信息。b由文件录入学生信息。2.对学生信息的查询:a按学号查询指定学生信息。
b按班级查询指定班级内学生的信息。
3.学生基本信息数据的删除:按学生学号来删除指定学号的学生信息。4.学生基本信息的保存:将录入的学生信息保存到文件中。等功能的实现的目的。
在此次的编程过程,我对c语言的程序设计有了更深的理解,在设计的程序中有我自己的设计亮点,也有存在的不足,以及需要改进的地方。
例如在学生信息的录入功能的编程过程中,就有一个要求是要能够判断所输入的学生出生日期的格式以及日期是否符合要求。在做到这一点的功能的时候,我花了很多的时间,首先是定义了一个全局的字符数组变量用来以字符的形式存放输入的日期,然后通过一个函数来讲起对应的年份、月份、号等信息从字符变量转换成了整形变量,以便对其日期进行检测。通过判断其是否为闰年,二月是否有29天,2、4、6、9、11月份是否在30天以内等等来判断其日期是否符合要求。最后把通过的日期以整形的形式保存到一个日期结构体中,再把结构体连接到每一个学生信息结构体中。以这种方式来达到判断日期的目的。而且我并没有把学生出生日期的信息直接存放到学生信息的大结构体中,而是又另建立了一个专门存放日期的结构体数组,并将存放日期信息的结构体数组中的结构体变量分别连接到了存放学生信息的大结构体中,用一个指向存放日期的结构体类型的指针来接收。这样,学生的出生日期的信息就可以和每一个学生的其他信息联系到一起。这些是我设计的程序当中的亮点。
当然也有一些不足之处,在整个系统运行的过程中,存在着一个很大的问题,那就是,输入学生信息的时候只能一次性的输入,而不能间断的,回到菜单后在此进入然后接着上次的学生信息再次往下输入,从文件中录入学生信息也是一样,不能间断的从文件中录入,而且从文件录入学生信息时也要提前输入要从文件中录入学生信息的学生个数,而不能自动的检测文件中就多少个学生的信息。同时被录入学生信息的文件的文件名以及地址都是定死的,不能从键盘输入,虽然调试过很多次,但还是无法解决这一问题。这些也都是需要我在以后的时间里去慢慢改进,慢慢体会的地方。
总之,此次的c语言程序设计课设让我看到了我设计c语言程序的亮点与不足之处,对于我的亮点,我需要保留并继续下去。而对于我的不足之处,我会花时间去理解,弥补,去完善。虽然此处程序并不是非常简洁,但是确是我自己设计出来的,相信有了这一次设计的经历,以后对其它程序的设计我会更加的得心应手。
六、附录 程序源代码
/*
1、学生信息管理 问题描述:
已知程序要求管理的学生信息包括:学号(不重复),班级,姓名,年龄,性别,出生日期,地址,电话,E-mail等。设计一程序,完成以下功能: 1)能从键盘输入学生的信息(增加,输入时需要能检查该学号的学生的记录是否已经存在,出生日期格式是否合法(格式为:YYYY-MM-DD,如2009-01-02))2)能从指定的文件中读入学生的信息 3)能按学号查询学生的信息 4)能按班级查询学生信息
5)能删除指定学号的学生信息 6)能将学生信息保存在指定的文件中 提示:
从文件读入学生信息时,需要先设计好文件的格式,从文件中读取数据后,按照预先设计的格式分析数据,提取学生的信息,读入程序
定义一个日期结构体保存日期,具体信息为:年、月、日
判断出生日期的格式是否合法时,需要判断长度是否为10,第5位和第8位是否为'-',字符,将1-4位表示的年份,6-7位表示的月份,9-10位表示的日期分别转换成整数。判断是否满足构成日期的条件闰年月份只能是1-12之间的数,如果是闰年,二月可以是29天否则不能大于28,1,3,5,7,8,10,12月可以是31天,其余只能小于等于30(建议写成函数)。*/
#include #include #include #include #define LEN sizeof(struct student)int m=1;int n;char rq[15];int fun(int y,int m,int d){ if(y%(y%100?4:400)?0:1==1){ if(m==2){ if(d0&&d>0){ if(fun(y,m,d)==1)return 1;else return 0;} else return 0;} else return 0;} struct born_day { int y;int m;int d;}born[9999999];struct student { int xh_number;int bj_number;char name[20];int nl_number;struct born_day*q;struct student *next;};int ml(){ printf(“***********************学生信息管理系统*************************n”);printf(“ 1 *****输入学生信息*****n”);printf(“ 2 **从文件读入学生信息**n”);printf(“ 3 **按学号查询学生信息**n”);printf(“ 4 **按班级查询学生信息**n”);printf(“ 5 *删除指定学号学生信息*n”);printf(“ 6 *****保存学生信息*****n”);printf(“ 7 *******推出系统*******n”);printf(“n***************************************************************n”);} struct student *creat(){ struct student *head,*p1,*p2;system(“cls”);p1=p2=(struct student *)malloc(LEN);printf(“学号 班级 姓名 年龄 性别n”);
printf(“请输入第1个学生的学号:”);scanf(“%d”,&p1->xh_number);printf(“n”);printf(“请输入第1个学生的班级:”);scanf(“%d”,&p1->bj_number);printf(“n”);printf(“请输入第1个学生的姓名:”);scanf(“%s”,p1->name);printf(“n”);printf(“请输入第1个学生的年龄:”);scanf(“%d”,&p1->nl_number);printf(“n”);while(1){ printf(“请输入第1个学生的出生日期:(按yyyy-mm-dd格式输入,形如1992-03-05)”);scanf(“%s”,rq);printf(“n”);if(pdrq(rq)!=1)printf(“输入的日期格式错误,请重新输入:n”);else break;} born[0].y=(rq[0]-48)*1000+(rq[1]-48)*100+(rq[2]-48)*10+rq[3]-48;born[0].m=(rq[5]-48)*10+rq[6]-48;born[0].d=(rq[8]-48)*10+rq[9]-48;p1->q=&born[0];head=p1;p1->next=p1;
while(p1->xh_number!=-1){ m++;p1=(struct student *)malloc(LEN);
printf(“请输入第%d个学生的学号(若要停止输入请输入-1):”,m);scanf(“%d”,&p1->xh_number);printf(“n”);if(p1->xh_number==-1){ p1->next=NULL;break;} printf(“请输入第%d个学生的班级:”,m);scanf(“%d”,&p1->bj_number);printf(“n”);printf(“请输入第%d个学生的姓名:”,m);scanf(“%s”,p1->name);printf(“n”);printf(“请输入第%d个学生的年龄:”,m);scanf(“%d”,&p1->nl_number);printf(“n”);while(1){ printf(“请输入第%d个学生的出生日期:(按yyyy-mm-dd格式输入,形如1992-03-05)”,m);scanf(“%s”,&rq);printf(“n”);if(pdrq(rq)!=1)printf(“输入的日期格式错误,请重新输入:(形如1992-03-05)”);else break;} born[m-1].y=(rq[0]-48)*1000+(rq[1]-48)*100+(rq[2]-48)*10+rq[3]-48;born[m-1].m=(rq[5]-48)*10+rq[6]-48;born[m-1].d=(rq[8]-48)*10+rq[9]-48;p1->q=&born[m-1];head=p1;
p2->next=p1;p2=p1;}
printf(“已退出该功能!n”);printf(“按回车返回菜单:”);getchar();getchar();system(“cls”);ml();printf(“请输入其他功能的代号:”);scanf(“%d”,&n);return head;} struct student *duru(){
int i=1,x;struct student *head,*p1,*p2;char fileName[20];FILE * fp;system(“cls”);printf(“请输入读取文件的文件名:n”);scanf(“%s”,fileName);printf(“请输入要录入的学生的个数:”);scanf(“%d”,&x);if((fp = fopen(“student.txt”, “r”))== NULL){ printf(“文件打开失败!”);exit(0);} p1=p2=(struct student *)malloc(LEN);head=p1;while(inext=p1;p2=p1;} p1=(struct student *)malloc(LEN);p2->next=p1;p1->next=NULL;p1=head;for(i = 0;i xh_number,&p1->bj_number,p1->name,&p1->nl_number,&born[i].y,&born[i].m,&born[i].d);p1->q=&born[i];p1=p1->next;} printf(“文件读入已完成!n”);printf(“按回车返回菜单:”);getchar();getchar();system(“cls”);ml();printf(“请输入其他功能的代号:n”);scanf(“%d”,&n);return head;} int xhcx(struct student *p){ int num;system(“cls”);printf(“请输入要查询的学生的学号:n”);scanf(“%d”,&num);printf(“学号 班级 姓名 年龄 出生日期n”);while(p->next!=NULL){ if(p->xh_number==num){
printf(“%-5d%-4d%-10s%-4d%d-%d-%dn”,p->xh_number,p->bj_number,p->name,p->nl_number,p->q->y,p->q->m,p->q->d);num=-1;break;} p=p->next;} if(num!=-1)printf(“此学号无对应的学生信息!”);printf(“查询功能结束!n”);printf(“按回车返回菜单:”);getchar();getchar();system(“cls”);ml();printf(“请输入其他功能代号:n”);scanf(“%d”,&n);} int bjcx(struct student *p){ int bj,count=0;system(“cls”);printf(“请输入要查询的班级的班级号:n”);scanf(“%d”,&bj);printf(“学号 班级 姓名 年龄 出生日期n”);while(p->next!=NULL){ if(p->bj_number==bj){
printf(“%-5d%-4d%-10s%-4d%d-%d-%dn”,p->xh_number,p->bj_number,p->name,p->nl_number,p->q->y,p->q->m,p->q->d);count++;} p=p->next;} if(count==0)printf(“此班级号无对应的班级信息!n”);printf(“查询功能结束!n”);printf(“按回车返回菜单:”);getchar();getchar();system(“cls”);ml();printf(“请输入其他功能代号:n”);scanf(“%d”,&n);} int scxx(struct student *p){ struct student *q;int x;char ch[1];system(“cls”);printf(“请输入要删除的学生的学号:n”);scanf(“%d”,&x);while(p->next!=NULL){ if(p->xh_number==x){ printf(“学号 班级 姓名 年龄 出生日期n”);
printf(“%-5d%-4d%-10s%-4d%d-%d-%dn”,p->xh_number,p->bj_number,p->name,p->nl_number,p->q->y,p->q->m,p->q->d);printf(“您确定要删除此学生的信息么?(y/n)”);scanf(“%s”,ch);if(ch[0]=='y'){ q->next=p->next;x=-1;break;} else { x=-2;break;} } q=p;p=p->next;} if(x>0)printf(“此学号无对应的学生信息!”);if(x==-1)printf(“删除成功!n”);if(x==-2)printf(“您取消了删除此学生的命令!”);printf(“按回车返回菜单:”);getchar();getchar();system(“cls”);ml();printf(“请输入其他功能代号:n”);scanf(“%d”,&n);} int save(struct student *p){
FILE *fp;
system(“cls”);
if((fp=fopen(“xuesheng.txt”,“w”))==NULL){ printf(“文件打开失败!n”);exit(0);} fprintf(fp,“学号 班级 姓名 年龄 出生日期n”);while(p->next!=NULL){
fprintf(fp,“%-5d%-4d%-10s%-4d%d-%d-%dn”,p->xh_number,p->bj_number,p->name,p->nl_number,p->q->y,p->q->m,p->q->d);p=p->next;} if(fclose(fp)){ printf(“文件关闭失败!”);exit(0);} printf(“文件已保存到C盘,文件名为xuesheng.txt!n”);printf(“按回车返回菜单:”);getchar();getchar();system(“cls”);ml();printf(“请输入其他功能代号:n”);scanf(“%d”,&n);} void main(){ struct student *s;
ml();printf(“请输入功能代号:n”);scanf(“%d”,&n);while(1){ switch(n){ case 1 :s=creat();break;case 2 :s=duru();break;case 3 :xhcx(s);break;case 4 :bjcx(s);break;case 5 :scxx(s);break;case 6 :save(s);break;case 7 :{printf(“感谢使用本程序,欢迎下次使用!n”);}exit(0);} } }