课程设计报告.docx
《课程设计报告.docx》由会员分享,可在线阅读,更多相关《课程设计报告.docx(35页珍藏版)》请在冰豆网上搜索。
课程设计报告
合肥学院
计算机科学与技术系
课程设计报告
2010~2011学年第二学期
课程
C语言课程设计
课程设计名称
学生籍贯信息记录簿设计
学生姓名
宫文娜
学号
1004013041
专业班级
计算机科学与技术(3)班
指导教师
高玲玲何立新
2011年6月23日
一、需求分析
随着我国经济迅猛发展,国家综合国力不断增强,全国学校沐浴着改革开放东风,不断扩招和发展,进行大胆的改革尝试,而现行的学生户口管理模式是计划经济下的产物,手续繁琐,重复迁移。
另外,各学校都在不断扩招,学生的数量逐年猛增,在校学生的户籍管理工作因此面临着严峻的考验。
本次课程设计的设计内容是设计一个学生籍贯信息记录簿系统,该系统要求对学生籍贯信息进行管理和维护;任务和要求为:
编制一个学生籍贯信息记录簿,每个学生信息包括:
学号、姓名、性别、年龄、籍贯。
具体功能:
(1)创建信息链表并以磁盘文件保存;
(2)读取磁盘文件并显示输出所有学生的籍贯信息;
(3)按学号或姓名查询其籍贯;
(4)按籍贯查询并输出该籍贯的所有学生;
(5)能添加、删除和修改学生的籍贯信息(可选项);
通过这个系统操作人员可以很方便的对学生的籍贯信息进行管理和操作。
二、算法设计
1、设计思想
这个系统主要运用了链表的知识,包括链表的创建、链表中的对不同类型数据的查找、链表中的数据的删除、在链表中增加一个数据、修改链表中的某些数据和文件的创建、读取等。
结合本题目进行综合性的运用,在一定程度上做到了对所学的知识进行融会贯通。
进一步加深了对所学知识的掌握,培养了对实际问题的综合分析和解决的能力。
整个系统制造的而过程中,将这个学期涉及的大部分知识点都贯穿起来了,对于不同的数据类型、程序控制结构、数据结构作以比较和总结,结合这个题目进行综合的应用,在一定程度上做到了对所学知识融会贯通。
进一步加深、巩固了所学的专业的基本理论知识,学习理论联系实际。
培养了综合分析问题、解决问题的能力。
在做这个系统时,我仔细阅读了题目要求和程序要实现的功能,把程序需要实现的每一个功能写成子函数,最后再调用子函数,实现每一级菜单,让使用者可以很方便的操作。
流程图如下:
2、设计表示:
1)这个学生籍贯信息系统先由一个主函数main()构成;这个主函数很简短,在main()中在不断对许多子函数的调用实现各个功能的。
2)五个Menu()为实现主菜单的子函数,其中主要包括此系统主要功能:
1、添加学生信息2、查询学生信息3、增加学生信息4、删除学生信息5、修改学生信息6、退出程序。
然后在每个操作里面都会有与之相对应的子菜单共选择,在此菜单你可以选择各项操作前的序号,它可以将你选择的序号带回主函数。
3)add()和fileadd()是一个添加学生籍贯信息的子函数,add()是通过手动从键盘中录入学生的籍贯信息,fileadd()是从文件中读取已存在的学生信息。
当你选择这一操作时,它会建立一个新的节点盛放这位学生的籍贯信息,并且将这个节点插入链表中。
4)amendname();amendprovince();amendstudentnumber();deletename();deleteprovince();deletestudentnumber();findname();deletename();findprovince();findstudentnumber();这几个子菜单分别又对主菜单中的各项操作进一步细化;使主菜单各项功能可以从学号、姓名、籍贯的层次实现对学生籍贯信息的查询、删除、修改的功能。
并且同样像主菜单一样带回所选的序号。
5)menu1()、menu2()、menu3()、menu4()、这些子函数主要功能是对子菜单传回的选项进行处理,这些子函数中都用了switch语句,它可以根据传回选项的不同处理不同的情况,,其中也有直接返回上一层操作。
6)子函数menu1()、menu2()、menu3()、menu4()、menu5()、都为查找学生籍贯信息的函数,它们是从不同层面实现查找功能的。
在主函数中通过对这些菜单子函数的调用而实现了子菜单的功能。
7)deletestudentnumber()、deletename()、deleteprovince()分别为删除学生籍贯信息的子函数。
deletestudentnumber()为按学号删除学生籍贯信息;deletename()为姓名删除学生籍贯信息;deleteprovince()为按籍贯删除学生籍贯信息。
一般情况下前两个用的比较多,它们都是删除个人信息,而第三个一次性把同一籍贯的学生籍贯信息全部删除。
8)findname()、findprovince()、findstudentnumber()都是实现修改的子函数。
findstudentnumber()按学号查找修改;findname()按姓名查找修改;findprovince()按机关查找修改;
9)fileadd()是建立一个链表从磁盘文件读取已有的学生籍贯信息,然后实现头指针带回主函数功能。
10)fileoutput()是一个将链表中的数据保存到磁盘文件的函数,他是防止此程序因程序运行结束关闭以后信息丢失或重新输入等以致带来麻烦的一种较为方便的方法。
11)Free()为释放占用空间的函数,它将链表的节点一个一个的释放掉,以至于在程序结束时,不会占用太多的储存空间。
这个函数在我们现在的小程序中体现的优势不是很明显,但在一些大程序中确实十分有必要的。
12)output()是一个输出函数,可以将所有学生籍贯信息全部显示在屏幕上。
3,实现注释:
这个程序除创建信息链表并以磁盘文件保存,读取磁盘文件并显示输出所有学生的籍贯信息,按学号或姓名查询其籍贯,按籍贯查询并输出该籍贯的所有学生,能添加、删除和修改学生的籍贯信息的功能外,还增加了链表查找所有学生的籍贯信息和释放储存空间的功能。
4、算法设计中一些新的想法
在这个程序中应用到了很多链表的操作,为了避免麻烦,我又重新创造了一个了结构体,包含p、number->next、p、name->next等等,这样的话就可以直接对结构体进行操作,使程序看起来简单明了。
三、用户手册
用户开始使用时会出现一个菜单窗口,通过录入阿拉伯数字1-6来选择自己想要进行的操作,在当用户选择了之后,程序会出现里一个菜单窗口,里面包含对一种操作的不同种方法。
录入或选择时需要注意的问题都会在窗口中出现提醒用户。
例如:
=========学生籍贯信息记录簿=======");
1-添加学生信息
2-查询学生信息
3-增加一个学生信息
4-删除学生信息
5-修改学生信息
6-退出程序
请输入序号,进行选择
当输入1时,会出现另一个窗口:
1-手动添加
2-从文件中添加
3-返回主菜单
请输入序号,进行选择
这时用户可以根据自己的意愿自由选择。
如果选择1手动添加,要注意输入时按顺序学号、姓名、性别、年龄、籍贯录入,当输入为00000时停止输入。
若选择返回上一级菜单或者是退出系统,程序都会自行处理。
(具体菜单窗口见附录)
四、调试及测试
在程序的调试过程中出现了一些问题,如子函数添加、删除、修改信息时经常出现一些错误,使得程序不能正常运行。
如添加子函数:
structstudent*add(structstudent*head;structstudent*p1)
{inta;
charch;
structstudent*p0;*p2;
p0=(structstudent*)malloc(LEN);
p2=(structstudent*)malloc(LEN);
if(p1==NULL)
printf("无数据!
\n");
else{
printf("请输入要添加的信息\n");
scanf("%ld%s%s%d%s";&p0->num;p0->name;p0->sex;&p0->age;p0->jg);
n=n+1;
printf("是否保存?
Y/N\n");
scanf("%c";&ch);
scanf("%c";&ch);
if(ch=='Y'||ch=='y')
save(head);
}
free(p0);
free(p1);
free(p2);
return(head);
}
调试时我把p0和p2一块申请了动态存储空间,导致在释放p0和p2时起了冲突,经过修改程序可以运行。
期间还出现的问题有子函数的调用错误和文件的读写和保存的错误,但在老师及同学的帮助下都已经解决。
五、小结
为期一周的C语言课程设计结束了,通过这一个星期的课程设计,使我对C语言有了更深入、更全面的了解,同时的发现自己的英语水平不行,子函数都是用“汉式英语”写出来的。
但通过这次课程设计,使我对C语言有了新的认识,在这一周的时间里,经过不断的与同学之间进行探讨以及老师的指导,使我的C语言水平有了很大程度的提高。
通过课程设计我还发现C语言是一门非常实用的学科,像我的题目---学生籍贯管理系统,是与实际生活紧密相关的,在以后的工作当中都有可能会用的到。
在做这个系统时,也出现过很多错误,找了半天也没找出来,但是就十分苦恼,烦躁,当找出错误是才发现只是一个小小的错误,心里很懊悔,但同时也很高兴,毕竟吧错误找出来了。
当最终把整个系统调试完成后,一股满足感油然而生,感到这么长时间的辛苦没有白费,很值得。
我认为,开发一套系统,最重要的是细心,并不是一定要做到面面俱到,但也要充分考虑到客户的需求和现实意义,不管什么系统,只用运用到实际应用中,才具有先现实意义。
所以在准备工作中要正确分析社会需求了解现实应用,画出流程图,把大体框架做好,然后再逐一细化。
我们不可能做到面面俱到,但一定要做到步步扎实,作为一个程序编程人员,要保持清醒的头脑,以现实为依据,让自己的每一行代码都能实现自己的意义。
总之经过这一周的课程设计我付出了许多,但收获了更多,它教会我们细心、仔细、严谨的工作态度,它也教会了我们互帮互助,相互学习的团队精神。
我还会专心学习C语言,争取把它搞透,这也是给我们以后学习别的语言打下了坚实的基础。
六、参考文献
[1]黄明等编著《C语言课程设计》北京:
电子工业出版社
[2]郭翠英编著《C语言课程设计案例精编》北京:
中国水利水电出版社
[3]宁正元《数据结构(c语言)》南京:
东南大学出版社。
2000年6月第1版
[4]严蔚敏等《数据结构(c语言版)》北京:
清华大学出版社,1997年4月第1版
[5]谭浩强编著《C程序设计题解与上机指导(第3版)》北京:
清华大学出版社
[6]谭浩强编著《C程序设计(第3版)》北京:
清华大学出版社。
附录:
1、源代码
#include"stdio、h"
#include"stdlib、h"
#include"string、h"
structstudent//定义结构体
{
intstudentnumber;//学号
charname[10];//姓名
charsex[5];//性别
intage;//年龄
charprovince[10];//籍贯
};
structLink
{
structstudentdata;
structLink*next;
};
//==================菜单========================
voidmenu1()
{
puts("=========学生籍贯信息记录簿=======");
puts("1-添加学生信息");
puts("2-查询学生信息");
puts("3-增加一个学生信息");
puts("4-删除学生信息");
puts("5-修改学生信息");
puts("6-退出程序");
puts("请输入序号,进行选择");
}
voidmenu2()
{
puts("1-手动添加");
puts("2-从文件中添加");
puts("3-返回主菜单");
puts("请输入序号,进行选择");
}
voidmenu3()
{
puts("1-按学号查询信息");
puts("2-按姓名查找信息");
puts("3-按籍贯查询信息");
puts("4-查询所有学生信息");
puts("5-保存到文件中");
puts("6-返回主菜单");
puts("请输入序号,进行选择");
}
voidmenu4()
{
puts("1-按学号删除信息");
puts("2-按姓名删除信息");
puts("3-按籍贯删除信息");
puts("4-返回主菜单");
puts("请输入序号,进行选择");
}
voidmenu5()
{
puts("1-按学号修改个人信息");
puts("2-按姓名修改个人信息");
puts("3-按籍贯修改个人信息");
puts("4-返回主菜单");
puts("请输入序号,进行选择");
}
structLink*add(structLink*head);//子函数:
手动录入学生信息
structLink*amendname(structLink*head);//子函数:
按姓名修改信息
structLink*amendprovince(structLink*head);//子函数:
按籍贯修改信息
structLink*amendstudentnumber(structLink*head);//子函数:
按学号修改信息
structLink*deletename(structLink*head);//子函数:
按姓名删除信息
structLink*deleteprovince(structLink*head);//子函数:
按籍贯删除信息
structLink*deletestudentnumber(structLink*head);//子函数:
按学号删除信息
structLink*fileadd(structLink*head);//子函数:
从文件中录入信息
structLink*fileoutput(structLink*head);//子函数:
输出所有信息到文件
structLink*findname(structLink*head);//子函数:
按姓名查询学生信息
structLink*findprovince(structLink*head);//子函数:
按籍贯查询学生信息
structLink*findstudentnumber(structLink*head);//子函数:
按学号查询学生信息
voidoutput(structLink*head);//子函数:
输出学生信息
structLink*addone(structLink*head);//子函数:
添加学生信息
//========================主函数==============
voidmain()
{
inta;b;c;d;e;
structLink*head;
while
(1)
{
menu1();
scanf("%d";&a);
switch(a)
{
case1:
system("cls");
menu2();
scanf("%d";&b);
switch(b)
{
case1:
head=add(head);
break;
case2:
head=fileadd(head);
system("cls");
puts("文件输入成功,请继续");
break;
case3:
system("cls");
break;
default:
system("cls");
puts("您的输入有误,请重新输入正确的序号");
}
break;
case2:
system("cls");
menu3();
scanf("%d";&c);
switch(c)
{
case1:
system("cls");
head=findstudentnumber(head);//按学号查询
break;
case2:
system("cls");
head=findname(head);//按姓名查询
break;
case3:
system("cls");
head=findprovince(head);//按籍贯查询
break;
case4:
system("cls");
output(head);
break;
case5:
system("cls");
head=fileoutput(head);
puts("信息已保存到文件(籍贯信息(输出)、txt)中");
break;
case6:
system("cls");
break;
default:
system("cls");
puts("您的输入有误,请重新输入正确的序号");
}
break;
case3:
system("cls");
head=addone(head);//添加信息
break;
case4:
system("cls");
menu4();
scanf("%d";&d);
switch(d)
{
case1:
system("cls");
head=deletestudentnumber(head);//按学号删除
break;
case2:
system("cls");
head=deletename(head);//按姓名删除
break;
case3:
system("cls");
head=deleteprovince(head);//按籍贯删除
break;
case4:
system("cls");
break;
default:
system("cls");
puts("您的输入有误,请重新输入正确的序号");
}
break;
case5:
system("cls");
menu5();
scanf("%d";&e);
switch(e)
{
case1:
system("cls");
head=amendstudentnumber(head);//按学号修改
break;
case2:
system("cls");
head=amendname(head);//按姓名修改
break;
case3:
system("cls");
head=amendprovince(head);//按籍贯修改
break;
case4:
system("cls");
break;
default:
system("cls");
puts("您的输入有误,请重新输入正确的序号");
}
break;
case6:
exit
(1);
break;
default:
system("cls");
puts("您的输入有误,请重新输入正确的序号");
}
}
}
//===================手动添加信息============
structLink*add(structLink*head)
{
structLink*p;*q;
intn=0;
head=NULL;
p=head;
puts("请按顺序学号姓名性别年龄籍贯输入学生的信息:
(输入00000结束)");
p=(structLink*)malloc(sizeof(structLink));
scanf("%d%s%s%d%s";
&p->data、studentnumber;
&p->data、name;
&p->data、sex;
&p->data、age;
&p->data、province);
while(p->data、studentnumber!
=0)
{
n++;
if(n==1)
{
head=p;
}
else
{
q->next=p;
}
q=p;
p=(structLink*)malloc(sizeof(structLink));
scanf("%d%s%s%d%s";
&p->data、studentnumber;
&p->data、name;
&p->data、sex;
&p->data、age;
&p->data、province);
}
q->next=NULL;
returnhead;
}
//============从文件读取信息==========
structLink*fileadd(structLink*head)
{
structLink*p;*q;
intn=0;
FILE*x;
x=fopen("籍贯信息、txt";"r+");
head=NULL;
p=head;
p=(structLink*)malloc(sizeof(structLink));
fscanf(x;"%d%s%s%d%s";
&p->data、studentnumber;
&p->data、name;
&p->data、sex;
&p->data、age;
&p->data、province);
while(p->data、studentnumber!
=0)
{
n++;
if(n==1)
{
head=p;
}
else
{
q->next=p;
}
q=p;
p=(structLink*)malloc(sizeof(structLink));
fscanf(x;"%d%s%s%d%s";
&p->data、studentnumber;
&p->data、name;
&p->