C语言编程课程设计.docx
《C语言编程课程设计.docx》由会员分享,可在线阅读,更多相关《C语言编程课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
C语言编程课程设计
三江学院
SANJIANGUNIVERSITY
综合程序设计与实践
★
指导书
(2012年6-7月)
题目:
开发一个简单的学籍管理程序
所属学院:
电子信息工程学院
学号:
12010091010
姓名:
刘夫兴
班级:
110091A
指导教师:
杨丽萍老师
综合程序设计与实践
指导书
一.题目:
开发一个简单的学籍管理程序。
二.内容包括:
1.建立一个学生信息单链表
2.输出链表中的学生信息
3.在链表中查找某个学生信息
4.在链表中插入一个学生结点信息
5.在链表中删除一个学生结点
6.退出该管理系统
三.任务
1.设计一个菜单驱动程序(仿照课程设计之一),由老师提供并完成了功能1.—2.。
2.在这个管理系统中加入三个模块,即查找模块、插入模块和删除模块。
使程序能正确运行。
四.提供能使程序能正确运行的源程序清单。
源程序清单,如下:
#include
#include
#include
#include
typedefstructnode
{
intnum;
charname[20];
charsex[8];
charcla[20];
charpro[20];
charadress[10];
structnode*next;
}STD;
#defineLENsizeof(STD)
#defineNEW(STD*)malloc(LEN)
intmenu_select();
STD*head1,*head2;
intn=0;
voidcreat1(void)/*追加法建表*/
{STD*p1,*p2;
system("CLS");
head1=NULL;
p1=(STD*)malloc(LEN);
p2=p1;
printf("建表方法1追加法建表!
\n");
printf("请依次输入:
\n学号姓名性别班级专业籍贯(注:
若输入学号为0,则退出建表!
)\n");
scanf("%d%s%s%s%s%s",&p1->num,p1->name,p1->sex,p1->cla,p1->pro,p1->adress);
while(p1->num!
=0)
{n++;
if(n==1)
head1=p1;
else
p2->next=p1;
p2=p1;
p1=(STD*)malloc(LEN);
scanf("%d%s%s%s%s%s",&p1->num,p1->name,p1->sex,p1->cla,p1->pro,p1->adress);
}
free(p1);p2->next=NULL;
scanf("%*c");
printf("按回车键继续!
\n");
getchar();
system("CLS");
return;
}
voidcreat2(void)/*插入法建表*/
{STD*p1;
head2=NULL;
system("CLS");
p1=(STD*)malloc(LEN);
printf("建表方法2插入法建表!
\n");
printf("请依次输入:
学号姓名性别班级专业籍贯(注:
若输入学号为0,则退出建表!
)\n");
scanf("%d%s%s%s%s%s",&p1->num,p1->name,p1->sex,p1->cla,p1->pro,p1->adress);
while(p1->num!
=0)
{p1->next=head2;
head2=p1;
p1=(STD*)malloc(LEN);
scanf("%d%s%s%s%s%s",&p1->num,p1->name,p1->sex,p1->cla,p1->pro,p1->adress);
}
scanf("%*c");
printf("按回车键继续!
\n");
getchar();
system("CLS");
free(p1);
return;
}
voidsearch(structnode*head,char*x)/*查找函数*/
{STD*p,*q;
if(head==NULL)
printf("Thisisaemptylist.");/*空链表情况*/
else
p=head;
while(strcmp(x,p->name)!
=0&&p->next!
=NULL)
{q=p;
p=p->next;
}/*q指针尾随p指针向表尾移动*/
if(strcmp(x,p->name)==0)
{printf("查询信息:
\t学号:
%d姓名:
%s性别:
%s班级:
%s专业:
%s籍贯:
%s\n",p->num,p->name,p->sex,p->cla,p->pro,p->adress);
}
else
printf("Notfound.");
}
STD*delnode(structnode*head,char*x)/*删除函数*/
{STD*p,*q;
staticstructnode*h;
if(head==NULL)
{printf("Thisisaemptylist.");/*空链表情况*/
returnhead;
}
p=head;
while(strcmp(x,p->name)!
=0&&p->next!
=NULL)
{q=p;p=p->next;}/*q指针尾随p指针向表尾移动*/
if(strcmp(x,p->name)==0)
{if(p==head)
head=p->next;/*删除头结点*/
else
q->next=p->next;/*删除中间或尾结点*/
free(p);/*释放被删除的结点*/
}
else
printf("Notfound.");/*未找到指定的结点*/
h=head;
returnh;
}
STD*insert(structnode*head,structnode*p0,char*x)/*插入函数*/
{STD*p,*q;
staticstructnode*h;
if(head==NULL)
{head=p0;/*空表时,插入结点*/
p0->next=NULL;
}
else
{p=head;
while(strcmp(x,p->name)!
=0&&p->next!
=NULL)
{q=p;p=q->next;}
if(strcmp(x,p->name)==0)
{if(p==head)
head=p0;/*在表头插入结点*/
else
q->next=p0;/*在表中间插入结点*/
p0->next=p;
}
else
{p->next=p0;/*在表尾插入结点*/
p0->next=NULL;
}
}
h=head;
returnh;
}
voidprint(STD*head)/*输出函数*/
{STD*p;
p=head;
while(p!
=NULL)
{printf("学号:
%d姓名:
%s性别:
%s班级:
%s专业:
%s籍贯:
%s\n",p->num,p->name,p->sex,p->cla,p->pro,p->adress);
p=p->next;
}
printf("\n");
printf("链表已空!
\n");
scanf("%*c");
printf("按回车键继续!
\n");
getchar();
system("CLS");
}
voidhandle_menu1()
{inth;
STD*add,*head=NULL;
charname[20];
for(;;)
{
h=menu_select();
switch(h)
{case1:
creat1();/*进入追加法建表*/
head=head1;
break;
case2:
creat2();/*进入插入法建表*/
head=head2;
break;
case3:
printf("追加法建表的学籍信息:
\n");
print(head1);/*进入追加法链表的结果*/
break;
case4:
printf("插入法建表的学籍信息:
\n");
print(head2);/*进入插入法链表的结果*/
break;
case5:
printf("请输入查询姓名:
\t");
scanf("%s",name);
search(head,name);
printf("\n");
break;
case6:
add=NEW;
printf("***输入插入学生的信息***\n");
printf("请您依次输入:
\n学号姓名性别班级专业籍贯\n");
scanf("%d%s%s%s%s%s",&add->num,add->name,add->sex,add->cla,add->pro,add->adress);
add->next=NULL;
printf("***确定插入位置***\n");
printf("在指定学生姓名的信息前插入(注:
如未找到该学生,则默认将信息插入到尾部)\n");
printf("姓名:
\t");
scanf("%s",name);
head=insert(head,add,name);
printf("插入后的学籍信息:
\n");
print(head);
break;
case7:
printf("请您输入要删除学生信息的姓名:
\t");
scanf("%s",name);
head=delnode(head,name);
printf("删除后的学生信息:
\n");
print(head);
break;
case8:
printf("学籍管理系统的信息:
\n");
print(head);
break;
case9:
printf("亲爱的用户,感谢您的使用,再见!
\n");
return;
}
}
}
intmenu_select()/*菜单选择函数*/
{
intcn;
printf("≮≮学籍管理系统≯≯\n");
for(;;)
{
printf("\n****〈*菜单*〉****\n");
printf("\t1.追加法建表\n");
printf("\t2.插入法建表\n");
printf("\t3.输出追加法建表的信息\n");
printf("\t4.输出插入法建表的信息\n");
printf("\t5.查询学生信息\n");
printf("\t6.插入学生信息\n");
printf("\t7.删除学生信息\n");
printf("\t8.输出学籍管理系统的信息\n");
printf("\t9.退出程序\n");
printf("\n");
printf("亲爱的用户,您好!
\n请根据菜单栏,按需要选择菜单1-9:
\t");
scanf("%d",&cn);printf("\n");
if(cn<1||cn>9)
printf("\n\t输入错误,重选1-9:
");
else
break;
}
returncn;
}
voidmain()/*主函数*/
{
handle_menu1();
}
五、调试后使程序能正确运行并应使画面整齐美观。
调试运行并截图如下:
图一~图七(按照菜单栏顺序,逐一调试运行并截图,其中菜单2、4与菜单1、3类似,在此不再重复截图)
图一、菜单1.追加法建表,输入学生信息
图二、菜单3.输出追加法建表结果的学生信息
图三、菜单5.查询学生信息
图四、菜单6.插入学生信息
图五、菜单7.删除学生信息
图六、菜单8.输出现存的学籍管理系统的信息
图七、菜单9.退出程序
六.小结(收获体会)
不积跬步、无以至千里
两周的课程设计生活在不知不觉间已经结束了,真是意犹未尽呀!
整整两个多星期的日子里,我沉浸在编程的乐趣里,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
可以说,我对C语言是情有独钟,打心眼里喜欢它。
从去年一年的C语言学习中我也收获了许多快乐,并且在努力学习的情况下,顺利地通过过了全国及江苏省计算机二级考试,这更让我从中找到了自信。
因此,当得知本学期末有C语言课程设计时,当时我心里就乐了。
回顾起此次课程设计,我感慨颇多。
虽然偶尔会遇到一些伤脑筋的问题,但总的来说,这个过程充满了兴奋与喜悦!
首先,兴奋来自于第一次在充分掌握了基本理论知识后,能成功地将其运用到实践中去;而快乐来自于自己掌握了基本实践技能后,还能够帮助其他同学解决困难。
其中,在实训中让我感触最深的就是这么一个道理:
不积跬步,无以至千里!
本次课程设计的题目是:
开发一个简单的学籍管理程序,是由杨老师全程指导的。
我们的进程是按照模块化进行的,有新建链表、查询、删除、插入等模块,每次课堂上,杨老师首先对相关模块的理论知识做一个精讲,然后留给我们充足的时间进行编程调试。
当我们有不懂得地方,杨老师还会不厌其烦的讲解。
通过这种学习方式,我充分理解了理论与实际相结合的重要性,只有理论知识是远远不够的,唯有把所学的理论知识与实践相结合起来,从实践中得出结论,才算是真正的学习与应用。
同时,我也感到了想要学好C语言还有很长一段路要走,要想真正掌握好编程技术一定要付出更多的努力,当然基本的C语言知识一定要学好,而不是只知道皮毛而已。
对于今后的学习我觉得要做好以下几点:
1.加深对课堂讲授内容的理解
课堂上要老师讲授许多关于c语言的语法规则,听起来有点枯燥无味,也不容易记住,死记硬背是不可取的。
课后通过多次上机练习,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定;
2.熟悉程序开发环境
一个c语言程序从编辑、编译、连接到运行,都要在一定的外部操作环境下才能进行;
3.学会上机调试程序,学会自己找出问题的关键并解决;
因为程序编写完后,往往会出现许多意想不到的错误,这就要发挥调试的重要作用,学会从调试中找到错误,也是学习的一个重要环节!
最后,我觉得模块化的编程理念充分体现了“不积跬步,无以至千里”的哲理所在,任何一个小模块都对整个程序能否正确运行起决定性作用。
因此,从这两周的课程设计中,我深刻体会到了:
不论是编程还是做其它事情,我们都需要一定的耐心,从基本做起,一步一脚印踏实地走好每一步,只有这样才能走向成功大道。
在此,衷心地感谢杨老师在这两周给予我们的帮助,让我能在程序设计过程中走的更快、更远!