目录一、课题设计内容与主要功能 (1)第1节.设计内容 (1)第2节.主要功能 (1)二、课题分析...................... 错误!未定义书签。
第1节.类声明表.................... 错误!未定义书签。
第2节.分析课程设计项目的实现方法 (3)三、主要功能的实现步骤 (4)四、程序测试与结论 (5)五、总结 (11)六、附件14一、课题设计内容与主要功能1、设计内容:为了满足学生档案管理的要求,通过计算机技术给档案管理人员带来便利。
使用c 语言编写了学生档案此管理系统。
本系统主要实现学生档案管理的功能,通过此系统方便对学生档案管理。
包括学号、姓名、性别、年龄、备注。
所设计的系统以菜单方式工作,为用户提供清晰的使用提示,依据用户的选择来进行各种处理。
图书信息的录入后,系统按照有一定的规范格式显示,录入的学生信息用文件形式保存,并可以对其进行修改、排序、插入、排序查询等基本操作。
整个程序实现链表操作,对学生信息的操作逐个地进行。
学生档案管理系统构建框架2、主要功能:1、本系统采用一个包含N个数据的结构体数组,每个数据的结构应当包括:学号、姓名、性别、年龄、备注。
2、本系统显示这样的菜单:请选择系统功能项:1.学生基本信息录入;2.学生基本信息显示;3.学生基本信息保存;4.学生基本信息修改;5.学生基本信息插入;6.学生基本信息删除;7.学生基本信息排序;8.学生基本信息按姓名查询;9.从文件中读入学生基本信息;10.退出系统3、执行一个具体的功能之后,程序将重新显示菜单。
4、将学生基本信息保存到文件中。
二、课题分析1、类说明表2、实现方法及核心算法实现代码:主函数: void main()录入函数:void enter()显示函数:void list()保存函数:void save()插入函数:insert()修改函数:void revise()删除函数:void delete()删除录入的学生信息排序函数:void sort()排序录入的学生信息查找函数:void qseek()查找录入的学生信息读取函数:int load()读取保存在文件中的学生信息三、主要功能的实现步骤模块一:头文件,变量定义,函数的声明对系统所使用的变量进行定义,对函数进行声明模块二:学生信息的录入int enter(STUDENT t[])录入学生的基本信息。
模块三:学生信息的显示void list(STUDENT t[],int n)就是把学生的基本信息显示在电脑上。
模块四:学生信息的保存void save(STUDENT t[],int n)就是在把学生基本信息的保存下来。
模块五:学生信息的修改void revise(STUDENT t[],int n) 插入学生信息。
模块六:学生信息的插入int insert(STUDENT t[],int n) 修改已经录入的学生信息模块七:学生信息的删除int delete(STUDENT t[],int n)删除录入的学生信息模块八:学生信息的排序void sort(STUDENT t[],int n)排序录入的学生信息模块九:学生信息按姓名查找void qseek(TSTUDENT t[],int n)查找录入的学生信息模块十:学生信息的读入int load(STUDENT t[])读取保存在文件中的学生信息模块十一:退出系统四、程序测试与结论进入系统输入学生信息显示信息保存信息修改信息修改成功插入信息显示插入成功删除信息排序信息查询信息读入信息(附加)总结:总的来说这个程序大致实现了题目的要求,但是这套程序仍然存在着很多的问题与不足。
比如,程序中主函数写的有点繁琐,有太多的嵌套,不是那么井然有序,条理清晰,程序注释也不是很完善,对信息处理功能还有些不足之处,提示信息不明确。
还有一点就是没有做到实现分类查找,分别按照姓名、学号、年龄、性别、备注等进行查找。
这个系统主要是参照老师的模版编写的,同时也得到了老师和同学的一些帮助。
我在做系统的过程中也遇到了很多问题,有的是知识不足,有的是考虑不够周全。
事实证明,只靠自己的知识面还是很窄,独立处理问题能力不是很强,以后还要加强对c语言的学习。
我认为对于C语言编写的程序来说,使用方法大致都是一样的,所以如果要改进的话,就是要改进一些算法,尽量把界面编写清楚,提示信息全面,方便易用。
五、课程设计总结C语言这学期我们开始的一门新课,早就听说上届学哥学姐说C语言是“天书”,是我们这学期最难的学科之一了。
早听说这些我就怕了。
首先我感到非常遗憾,课程设计的第一天,我还在家里,因为收到的消息比较迟所以未能及时赶到学校,也至于第一天最重要的内容没有学到,在接下来的两天上机时间也未能赶上大家的进度,自己也觉得自己做不出这个程序。
没有用心的学。
更加愚蠢的是我在答辩的时候拷贝了同学的部分程序,自己没能真正的了解这个程序。
答辩的时候,欧阳老师简单的问了我几个问题就发现我没有用心学,严厉批评了我,也认识到了我的错误。
当看到其他同学都是A,只有包括我在内的少数几个一同学得B,我感到心情有些沉闷,同时更加坚定了我要自己做好这个《学生档案管理系统》程序的决心。
自己也想到了,就算课程设计被我投机取巧完成了,但是省二、国二呢,最终自己还是要好好学的。
自己没有掌握C语言,又有什么意义呢!当我自己真正的研究这个程序的时候我感觉有点蒙了,我感觉我自己没有这个能力做好,所以我想找学长帮我,这样我就不用怕了,可是后来我想到省二、国二,我放弃了这个想法,什么还是靠自己。
一边懊悔自己平时没有好好学习,一边开始硬着头皮上阵了。
第三天下午和晚上我都泡在图书馆里,到晚上将近10点才回寝,感觉自己还是很蒙,不过也有收获,就是我知道我要做这个模块要定位函数,要用到链表。
这让我信心若狂,我感觉我已经找到了起点,有个好的开始我相信我就能做好。
晚上回到宿舍后我也不敢再耽误时间去玩手机了,急忙去看关于函数、链表的书,第四天看了一天之后我感觉原来计算机也不是什么“天书”啊,只是我们没有好好去看它,去领悟它。
我心中暗想,这次程序设计我很有收获,它让我对计算机、对C语言产生了兴趣,让我发现原来这样有实践的学习能让人产生很大的兴趣,能让人更好的领悟它。
我自己研究这个程序将近两天,看了许多资料,着手进一步改善这个程序了,困难的时候又来了,我不知道用什么语句去完成查找。
最好If语句找到后,链表来行使删除功能,可好似链表那个真的好难,在同学们的帮助下我终于把那个链表完成,在运行、检查、修改后,终于合格,程序运行成功了。
在完成自己的程序设计后,自豪的感觉充满了我的内心,是啊,我不是很笨,我只是没有用心,经过这次设计后,在学习方面我对自己有了信心,如果我用心去学,我努力去做,没有我做不到的。
突然间我很喜欢这戏C语言实训,在这一周,有欢笑,有焦急,有开心也有不开心,不过不管什么我都还算开心得度过了这一周,和同学们一起研究、一起做程序、一起检查、一起讨论对与错。
在程序完成的那一时刻,我很开心的笑了,因为那是我付出了汗水做的程序,那时我的心血!这次实训对我来说也是一次教训,让我再次深刻地明白什么事情都要靠自己,自己的事情要自己做且要做好。
这次实训也让我对学习,对C语言计算机都产生了更浓厚的兴趣,也让同学们有了更好的团队协作精神,也让我感觉在大学学习很好。
感谢老师让我们有了这次机会来体验编程的快乐,感谢老师不厌其烦的讲解。
也让我们有机会感受大学的美好时光。
纺工1291 彭旺2013年6月28日六、附件/*学生基本信息管理系统*//******头文件(.h)***********/#include "stdio.h" /*I/O函数*/#include "stdlib.h" /*标准库函数*/#include "string.h"/*字符串函数*/#define M 50 /*定义常数表示记录数*/typedef struct /*定义教师基本信息数据结构*/{char name[20];/*学生姓名*/char no[20]; /*编号*/char sex[20];/*性别*/int age;/*年龄*/char remark[20];/*备注*/}STUDENT;/******以下是函数原型*******/int enter(STUDENT t[]);/*输入记录*/void list( STUDENT t[],int n);/*显示记录*/void save(STUDENT t[],int n);/*记录保存为文件*/ int find(STUDENT t[],int n,char *s)/*查找函数*/; void print(STUDENT temp);/*显示单条记录*/void revise( STUDENT t[],int n);/*修改记录*/int insert(STUDENT t[],int n); /*插入记录*/int delete(STUDENT t[],int n)/*删除记录*/;int load(STUDENT t[]);/*从文件中读记录*/void sort(STUDENT t[],int n);/*按姓名排序*/void qseek(STUDENT t[],int n);/*快速查找记录*/ int menu_select();/*主菜单函数*/main(){STUDENT student[M];/*定义结构体数组*/int length;/*保存记录长度*/for(;;)/*无限循环*/{switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/ {case 1:length=enter(student);break;/*输入记录*/case 2:list(student,length);break; /*显示全部记录*/case 3:save (student,length);break;/*保存文件*/case 4:revise(student,length);break;/*修改记录*/case 5:length=insert(student,length);break;/*插入记录*/case 6:length=delete(student,length);break; /*删除记录*/case 7:sort(student,length);break; /*按姓名排序*/case 8:qseek(student,length);break;/*快速查找记录*/case 9:length=load(student);break;/*读文件*/case 10: exit(0); /*如返回值为10则程序结束*/}}}/*菜单函数,函数返回值为整数,代表所选的菜单项*/menu_select(){char s[80];int c;printf("press any key enter menu......\n");/*提示压任意键继续*/printf("********************MENU*********************\n\n");printf(" 1. 学生基本信息录入\n");printf(" 2. 学生基本信息显示\n");printf(" 3. 学生基本信息保存\n");printf(" 4. 学生基本信息修改\n");printf(" 5. 学生基本信息插入 \n");printf(" 6. 学生基本信息删除\n");printf(" 7. 学生基本信息排序\n");printf(" 8. 学生基本信息按姓名查询\n");printf(" 9. 从文件中读入学生基本信息\n");printf(" 10. 退出系统\n");printf("***********************************************\n");do{printf("\n Enter you choice(1~10):");/*提示输入选项*scanf("%s",s);c=atoi(s);}while(c<1||c>10);return c;}/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/ int enter(STUDENT t[]){int i,n;char *s;printf("\nplease input num \n"); /*提示信息*/scanf("%d",&n); /*输入记录数*/printf("please input record \n"); /*提示输入记录*/printf("姓名学号性别年龄备注\n");printf("-------------------------------------------------------------------\n");for(i=0;i<n;i++){scanf("%s%s%s%d%s",t[i].name,t[i].no,t[i].age,t[i].course,&t[i].remark); /*输入记录*/printf("-------------------------------------------------------------------\n");}return n; /*返回记录条数*/}/*显示记录,参数为记录数组和记录条数*/void list(STUDENT t[],int n){int i;printf("\n\n*****************************STUDENT*************************** *\n");printf("姓名学号性别年龄备注\n");printf("-------------------------------------------------------------------\n");for(i=0;i<n;i++)printf("%-20s%-20s%-20s%-10d%-10s\n",t[i].name,t[i].no,t[i].sex,t[i].age,t[i].remark);if((i+1)%10==0){printf("Press any key continue...\n");getch();}printf("*********************************end******************************* *\n");}/*显示指定的一条记录*/void print(STUDENT temp){printf("\n\n*****************************STUDENT*************************** *\n");printf("姓名学号性别年龄备注\n");printf("-------------------------------------------------------------------\n");printf("%-20s%-20s%-20s%-10d%-10s\n",,temp.no,temp.sex,temp.age,te mp.remark);printf("*******************************end********************************* \n");}int find(STUDENT t[],int n,char *s){int i;for(i=0;i<n;i++){if(strcmp(s,t[i].name)==0)return i;}return i;}/*删除函数,参数为记录数组和记录条数*/int delete(STUDENT t[],int n){char s[20]; /*要删除记录的姓名*/int ch=0;int i,j;printf("please deleted name\n"); /*提示信息*/scanf("%s",s);/*输入姓名*/i=find(t,n,s); /*调用find函数*/if(i>n-1) /*如果i>n-1超过了数组的长度*/printf("no found not deleted\n"); /*显示没找到要删除的记录*/else{print(t[i]); /*调用输出函数显示该条记录信息*/printf("Are you sure delete it(1/0)\n"); /*确认是否要删除*/scanf("%d",&ch); /*输入一个整数0或1*/if(ch==1) /*如果确认删除整数为1*/{for(j=i+1;j<n;j++) /*删除该记录,实际后续记录前移*/{strcpy(t[j-1].name,t[j].name); /*将后一条记录的学生姓名拷贝到前一条*/strcpy(t[j-1].no,t[j].no); /*将后一条记录的编号拷贝到前一条*/strcpy(t[j-1].sex,t[j].sex); /*将后一条记录的性别拷贝到前一条*/t[j-1].age=t[j].age;; /*将后一条记录的年龄拷贝到前一条*/Strcpy(t[j-1].remark,t[j].remark); /*将后一条记录的备注拷贝到前一条*/}n--; /*记录数减1*/}}return n; /*返回记录数*/}/*插入记录函数,参数为结构体数组和记录数*/int insert(STUDENT t[],int n)/*插入函数,参数为结构体数组和记录数*/{STUDENT temp; /*新插入记录信息*/int i,j;char s[20]; /*确定插入在哪个记录之前*/printf("please input record\n");printf("\n\n*****************************STUDENT*************************** *\n");printf("姓名学号性别年龄备注\n");printf("-------------------------------------------------------------------\n");scanf("%s%s%s%d%s",,temp.no,temp.sex,temp.age,temp.remark); /*输入插入信息*/printf("-------------------------------------------------------------------\n");printf("please input locate name \n");scanf("%s",s); /*输入插入位置的姓名*/i=find(t,n,s); /*调用find,确定插入位置*/for(j=n-1;j>=i;j--) /*从最后一个结点开始向后移动一条*/{strcpy(t[j+1].name,t[j].name); /*当前记录的学生姓名拷贝到后一条*/ strcpy(t[j+1].no,t[j].no); /*当前记录的编号拷贝到后一条*/strcpy(t[j+1].sex,t[j].sex); /*当前记录的性别拷贝到后一条*/t[i].age = temp.age; /*将新插入记录的年龄拷贝到第i个位置*/strcpy(t[j+1].remark,t[j].remark); /*当前记录的备注拷贝到后一条*/}strcpy(t[i].name,); /*将新插入记录的学生姓名拷贝到第i个位置*/ strcpy(t[i].no,temp.no); /*将新插入记录的编号拷贝到第i个位置*/strcpy(t[i].sex,temp.sex); /*将新插入记录的性别拷贝到第i个位置*/t[i].age = temp.age; /*将新插入记录的年龄拷贝到第i个位置*/strcpy(t[i].remark,temp.remark); /*将新插入记录的备注拷贝到第i个位置*/ n++; /*记录数加1*/return n; /*返回记录数*/}/*保存函数,参数为结构体数组和记录数*/void save(STUDENT t[],int n){int i;FILE *fp; /*指向文件的指针*/if((fp=fopen("record.txt","wb"))==NULL) /*打开文件,并判断打开是否正常*/ {printf("can not open file\n");/*没打开*/exit(1); /*退出*/}printf("\nSaving file\n"); /*输出提示信息*/fprintf(fp,"%d",n); /*将记录数写入文件*/fprintf(fp,"\r\n"); /*将换行符号写入文件*/for(i=0;i<n;i++){fprintf(fp,"%-20s%-20s%-20s%-40d%-10s",t[i].name,t[i].no,t[i].sex,t[i].age, t[i].remark);/*格式写入记录*/fprintf(fp,"\r\n"); /*将换行符号写入文件*/}fclose(fp);/*关闭文件*/printf("****save success***\n"); /*显示保存成功*/}/*按序号显示记录函数*/void display(STUDENT t[]){int id,n;FILE *fp; /*指向文件的指针*/if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/{printf("can not open file\n");exit(1);}printf("Enter order number...\n");scanf("%d",&id);/*输入序号*/fscanf(fp,"%d",&n);if(id>=0&&id<n)/*判断序号是否在记录范围内*/{fseek(fp,(id-1)*sizeof(STUDENT),1);/*移动文件指针到该记录位置*/print(t[id]); /*调用输出函数显示该记录*/printf("\r\n");}elseprintf("no %d number record!!!\n ",id); /*如果序号不合理显示信息*/ fclose(fp);/*关闭文件*/}/*排序函数,参数为结构体数组和记录数*/void sort(STUDENT t[],int n){int i,j,flag;TEACHER temp; /*临时变量做交换数据用*/for(i=0;i<n;i++){flag=0; /*设标志判断是否发生过交换*/for(j=0;j<n-1;j++)if((strcmp(t[j].name,t[j+1].name))>0) /*比较大小*/{flag=1;strcpy(,t[j].name); /*交换记录*/→ strcpy(temp.no,t[j].no);strcpy(temp.sex,t[j].sex);temp.age=t[j].age;strcpy(temp.remark,t[j].remark);strcpy(t[j].name,t[j+1].name);strcpy(t[j].no,t[j+1].no);strcpy(t[j].sex,t[j+1].sex);t[j].age=t[j+1].age;strcpy(t[j].remark,t[j+1].remark);strcpy(t[j+1].name,);strcpy(t[j+1].no,temp.no);strcpy(t[j+1].sex,temp.sex);t[j+1].age=temp.age;strcpy(t[j+1].remark,temp.remark); }if(flag==0)break; /*如果标志为0,说明没有发生过交换循环结束*/}printf("sort sucess!!!\n"); /*显示排序成功*/}/*快速查找,参数为结构体数组和记录数*/void qseek(TSTUDENT t[],int n){char s[20];int l,r,m;printf("\nPlease sort before qseek!\n"); /*提示确认在查找之前,记录是否已排序*/printf("please enter name for qseek\n"); /*提示输入*/scanf("%s",s); /*输入待查找的姓名*/l=0;r=n-1; /*设置左边界与右边界的初值*/while(l<=r) /*当左边界<=右边界时*/{m=(l+r)/2; /*计算中间位置*/if(strcmp(t[m].name,s)==0) /*与中间结点姓名字段做比较判是否相等*/{print(t[m]); /*如果相等,则调用print函数显示记录信息*/return ; /*返回*/}if(strcmp(t[m].name,s)<0) /*如果中间结点小*/l=m+1; /*修改左边界*/elser=m-1; /*否则,中间结点大,修改右边界*/}if(l>r) /*如果左边界大于右边界时*/printf("not found\n"); /*显示没找到*/}/*修改记录*/void revise(STUDENT t[],int n){STUDENT temp;char s[20];int i;printf("please enter name\n");/*要修改的名字*/scanf("%s",s);i=find(t,n,s);if(i>n-1)printf("no found\n");elseprintf("please revise a cord\n");/*要修改的记录*/printf("姓名学号性别年龄备注\n");printf("--------------------------------------------------------------\n");scanf("%s%s%s%d%s",,temp.no,temp.sex,&temp.age,&temp.remark);printf("---------------------------------------------------------------\n") ;strcpy(t[i].name,);strcpy(t[i].no,temp.no);strcpy(t[i].sex,temp.sex);t[i].age=temp.age;strcpy(t[i].remark,temp.remark);printf("success!\n");}/*从文件中读记录*/int load(STUDENT t[]){int i,n;FILE *fp;if((fp=fopen("record.txt","rb"))==NULL){printf("can not open file\n");/*不能打开文件*/exit(1);}fscanf(fp,"%d",&n);for(i=0;i<n;i++)fscanf(fp,"%20s%20s%20s%40d%10s",t[i].name,t[i].no,t[i].sex,&t[i].age,t[i]. remark);fclose(fp);printf("You have success read data from file!!!\n");/*成功读入*/return n;}计算机与通信学院课程设计评分表课程名称: C语言课程设计教师签名:日期:。