C程序设计报告.docx
《C程序设计报告.docx》由会员分享,可在线阅读,更多相关《C程序设计报告.docx(27页珍藏版)》请在冰点文库上搜索。
C程序设计报告
综合程序设计与实践之二
指导书
★
学生姓名任国俊
学生学号12009095008
专业班级109095A
指导教师
完成时间2011.7.7
三江学院电子系
2011年6月
一、设计内容:
1.建立一个学生信息单链表
2.输出链表中的学生信息
3.在链表中查找某个学生信息
4.在链表中插入一个学生结点信息
5.在链表中删除一个学生结点
6.退出该管理系统
二、设计思想、流程图
1.学生信息管理系统基本的功能包括菜单模块,数据输入模块,数据插入模块,数据查找模块,数据删除模块,数据输出模块等。
菜单模块程序运行流程图如下:
输入处理:
利用链表技术输入多名学生的数据,直到输入学生的学号为“0”,则结束数据的输入。
插入处理:
利用链表技术插入某学号的学生信息,先找到插入的位置再实现插入。
删除处理:
利用链表技术删除某学号的学生信息,如果找到该学号则进行删除,否则输出“没有找到该学号”的信息。
查找处理:
利用链表技术根据学生学号查找某学号的学生信息。
三、源程序代码
#include
#include
/*谭法建立单链表和输出单链表*/
#include
#include
typedefstructnode
{intnum;
charname[20];
structnode*next;
}STD;
#defineLENsizeof(STD)
intmenu_select();
voidhandle_menu1();
voidgame4();voidgame2();
STD*insert(STD*head,STD*stud);STD*insert2(STD*head,STD*stud);
voidgame3();voidgame5();STD*delete(STD*head,longnum);voidgame1();voidgame6();
STD*search(STD*head,longnum);STD*head1,*head2;
intn=0;
/*追加法建表*/
voidcreat1(void)
{STD*p1,*p2;
system("CLS");
head1=NULL;
p1=(STD*)malloc(LEN);
p2=p1;
printf("建表方法1追加法建表!
\n");
printf("输入学号姓名,若输入学号为0则退出建表!
\n");
scanf("%d%s",&p1->num,p1->name);
while(p1->num!
=0)
{n++;
if(n==1)
head1=p1;
else
p2->next=p1;
p2=p1;
p1=(STD*)malloc(LEN);
scanf("%d%s",&p1->num,p1->name);
}
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",&p1->num,p1->name);
while(p1->num!
=0)
{p1->next=head2;
head2=p1;
p1=(STD*)malloc(LEN);
scanf("%d%s",&p1->num,p1->name);
}
scanf("%*c");
printf("按回车键继续!
\n");getchar();
system("CLS");free(p1);
return;}
/*链表输出*/
voidprint(STD*head)
{STD*p;
p=head;
while(p!
=NULL)
{printf("学号%3d姓名%s\n",p->num,p->name);p=p->next;}
printf("链表为空!
\n");
scanf("%*c");
printf("按回车键继续!
\n");getchar();
system("CLS");}
/*--------------表1插入结点函数-------*/
voidgame4()
{charch;
STD*stud,*head=head1;system("CLS");
printf("\t仅限在表1中插入!
\n");
printf("\t输入要插入结点的学号和姓名(以空格隔开):
");
stud=(STD*)malloc(LEN);
scanf("%*c");
scanf("%d%s",&stud->num,&stud->name);
if(stud->num<0)
{printf("\t输入的学号不能为负数,请重新选择插入!
\n");
return;}
while(stud->num>=0)
{head1=insert(head,stud);
printf("\t继续插入新结点吗?
(y/n):
");
ch=getchar();
if(ch=='y'||ch=='Y')
{printf("\t输入新结点学号姓名:
(输入n结束插入)");
stud=(STD*)malloc(LEN);scanf("%*c");
scanf("%d%s",&stud->num,&stud->name);
}
elsebreak;}
printf("\t输入回车键返回!
\n");
getchar();
system("CLS");
printf("\n");}
/*--------------表2插入结点函数-------*/
voidgame2()
{charch;
STD*stud,*head=head2;system("CLS");
printf("\t仅限在表2中插入!
\n");
printf("\t输入要插入结点的学号和姓名(以空格隔开):
");
stud=(STD*)malloc(LEN);
scanf("%*c");
scanf("%d%s",&stud->num,&stud->name);
if(stud->num<0)
{printf("\t输入的学号不能为负数,请重新选择插入!
\n");
return;
}
while(stud->num>=0)
{head2=insert2(head,stud);
printf("\t继续插入新结点吗?
(y/n):
");
ch=getchar();
if(ch=='y'||ch=='Y')
{printf("\t输入新结点学号姓名:
(输入n结束插入)");
stud=(STD*)malloc(LEN);
scanf("%*c");
scanf("%d%s",&stud->num,&stud->name);
}
else
break;
}
printf("\t输入回车键返回!
\n");
getchar();
system("CLS");
printf("\n");
/********插入模块********/
STD*insert(STD*head,STD*stud)
{STD*p0,*p1,*p2;
p1=head;
p0=stud;
if(head==NULL)
{head=p0;p0->next=NULL;
}
else
{while((p0->num>p1->num)&&(p1->next!
=NULL))
{p2=p1;p1=p1->next;}
if(p0->num<=p1->num)
{if(head==p1)head=p0;
elsep2->next=p0;
p0->next=p1;}
else
{p1->next=p0;p0->next=NULL;}
}n=n+1;
printf("按回车键继续!
\n");getchar();
system("CLS");
return(head);}
/*插入模块2*/
STD*insert2(STD*head,STD*stud)
{STD*p0,*p1,*p2;
p1=head;
p0=stud;
if(head==NULL)
{head=p0;p0->next=NULL;}
else{while((p0->numnum)&&(p1->next!
=NULL))
{p2=p1;p1=p1->next;}
if(p0->num>=p1->num)
{if(head==p1)head=p0;
elsep2->next=p0;
p0->next=p1;}
else
{p1->next=p0;p0->next=NULL;}
}n=n+1;
printf("按回车键继续!
\n");getchar();
system("CLS");
return(head);}
/*--------------表1删除学生信息-------*/
voidgame3()
{intnum;
charch;
STD*head=head1;
printf("\t仅限在表1中删除!
\n");
printf("\t输入要删除的学号:
");
scanf("%*c");
scanf("%ld",&num);
if(num<0)
{printf("\t输入的学号不能为负数,请重新选择删除!
\n");
return;}
while(num>=0)
{head=head1;
head1=delete(head,num);
printf("\t继续删除吗?
(y/n):
");
scanf("%*c");
ch=getchar();
if(ch=='y'||ch=='Y')
{printf("\t输入要删除的学号:
(输入n结束删除!
)");
scanf("%*c");
scanf("%ld",&num);}
elsebreak;}
printf("\t输入回车键返回!
\n");
getchar();
system("CLS");
printf("\n");}
/*--------------表2删除学生信息-------*/
voidgame5()
{intnum;
charch;
STD*head=head2;
printf("\t仅限在表2中删除!
\n");
printf("\t输入要删除的学号:
");
scanf("%*c");
scanf("%ld",&num);
if(num<0)
{printf("\t输入的学号不能为负数,请重新选择删除!
\n");
return;}
while(num>=0)
{head=head2;
head2=delete(head,num);
printf("\t继续删除吗?
(y/n):
");
scanf("%*c");ch=getchar();
if(ch=='y'||ch=='Y')
{printf("\t输入要删除的学号:
(输入n结束删除!
)");
scanf("%*c");
scanf("%ld",&num);}
else
break;}
printf("\t输入回车键返回!
\n");
getchar();system("CLS");printf("\n");}
/*删除模块*/
STD*delete(STD*head,longnum)
{STD*p1,*p2;
if(head==NULL){printf("\n没有找到该学号!
\n");returnhead;}
p1=head;
while(num!
=p1->num&&p1->next!
=NULL)
{p2=p1;p1=p1->next;}
if(num==p1->num)
{if(p1==head)head=p1->next;
elsep2->next=p1->next;
printf("\n删除:
%ld\n",num);
n=n-1;}
else
printf("\n没有发现此项!
\n",num);
system("CLS");
return(head);}
/*--------------表1查找学生信息-------*/
voidgame1()
{intnum;
charch;
STD*head=head1;
printf("\t仅限在表1中查找!
\n");
printf("\t输入要查找的学号:
");
scanf("%ld",&num);
if(num<0)
{printf("\t输入的学号不能为负数,请重新查找!
\n");
return;}
while(num>=0)
{head=head1;
head1=search(head,num);
printf("\t继续查找吗?
(y/n):
");
scanf("%d",&num);ch=getchar();
if(ch=='y'||ch=='Y')
{printf("\t输入要查找的学号:
(输入n结束查找)");
scanf("%ld",&num);}
elsebreak;}
printf("\t输入回车键返回!
\n");
getchar();system("CLS");
printf("\n");}
/*--------------表2查找学生信息-------*/
voidgame6()
{intnum;
charch;
STD*head=head2;
printf("\t仅限在表2中查找!
\n");
printf("\t输入要查找的学号:
");
scanf("%ld",&num);
if(num<0)
{printf("\t输入的学号不能为负数,请重新查找!
\n");
return;}
while(num>=0)
{head=head2;
head2=search(head,num);
printf("\t继续查找吗?
(y/n):
");
scanf("%d",&num);ch=getchar();
if(ch=='y'||ch=='Y')
{printf("\t输入要查找的学号:
(输入n结束查找)");
scanf("%ld",&num);}
else
break;}
printf("\t输入回车键返回!
\n");
getchar();system("CLS");
printf("\n");}
/*查找模块*/
STD*search(STD*head,longnum)
{STD*p1,*p2;
if(head==NULL){printf("\n没有找到该学号!
\n");returnhead;}
p1=head;
while(num!
=p1->num&&p1->next!
=NULL)
{p2=p1;p1=p1->next;}
if(num==p1->num)
printf("\n%d%s\n",p1->num,p1->name);
else
printf("\n没有发现此项!
\n",num);
return(head);}
/*voidmain()
{printf("***运行结果***\n");
printf("输入学号姓名(输入学号以0结束)!
\n");
creat1();
print(head1);
creat2();
print(head2);}*/
//*select.cpp:
主程序文件*
voidmain()
{handle_menu1();}
//*菜单处理函数*
voidhandle_menu1()
{inth;
for(;;)
{h=menu_select();
switch(h)
{case1:
/*printf("\t进入追加法建表\n");*/
creat1();break;/*调用功能模块*/
case2:
/*printf("\t进入插入法建表\n");*/
creat2();break;
case3:
/*printf("\t输出追加法链表的结果\n");*/
print(head1);break;
case4:
/*printf("\t输出插入法链表的结果\n");*/
print(head2);break;
case5:
/*printf("\t链表1插入\n");*/
game4();break;
case6:
/*printf("\t链表2插入\n");*/
game2();break;
case7:
/*printf("\t链表1删除\n");*/
game3();break;
case8:
/*printf("\t链表2删除\n");*/
game5();break;
case9:
/*printf("\t链表1查找\n");*/
game1();break;
case10:
/*printf("\t链表2查找\n");*/
game6();break;
case11:
printf("\t再见,欢迎再次使用本系统!
谢谢!
\n");
return;
}}}
//*菜单选择函数:
intmenu_select()*
intmenu_select()
{intcn;
for(;;)
{
printf("\欢迎进入学生信息管理系统!
制作人:
任国俊\n");
printf("\请选择1~11操作\n");
printf("\t1.追加法建表\n");printf("\\n");
printf("\t2.插入法建表\n");printf("\\n");
printf("\t3.输出链表1\n");printf("\\n");
printf("\t4.输出链表2\n");printf("\\n");
printf("\t5.插入链表1\n");printf("\\n");
printf("\t6.插入链表2\n");printf("\\n");
printf("\t7.删除链表1\n");printf("\\n");
printf("\t8.删除链表2\n");printf("\\n");
printf("\t9.查找链表1\n");printf("\\n");
printf("\t10.查找链表2\n");printf("\\n");
printf("\t11.退出系统\n");printf("\\n");
printf("\t请您选择1-11:
");
scanf("%d",&cn);//gets(s);
//cn=atoi(s);
if(cn<1||cn>11)
printf("\n\t输入错误,重选1-11:
");
elsebreak;}
returncn;}
四、运行结果
主菜单程序
在链表1中输入学生信息1q3e5t然后输出链表1
在表1中插入学生信息2w4r(可循环插入)
在表1中插入学生信息”2w4r”以后的输出截图
在表1中删除学生信息1q3e(可循环删除)
在表1中删除学生信息1q3e以后的输出截图
如果删除表1中没有的学生信息,比如8h则提示找不到该学号
在表1中查找学生信息5t(可循环查找)
如果查找表1中没有的学生信息,比如8h则提示找不到该学号
在链表2中输入学生信息1q3e5t然后输出链表2
在表2中插入学生信息2w4r(可循环插入)
在表2中插入学生信息”2w4r”以后的输出截图
在表2中删除学生信息1q3e(可循环删除)
在表2中删除学生信息1q3e以后的输出截图
如果删除表2中没有的学生信息,比如8h则提示找不到该学号
在表2中查找学生信息5t(可循环查找)
如果查找表2中没有的学生信息,比如8h则提示找不到该学号
退出系统截图
三、小结体会
此次C语言程序开发设计实践给我带来了许多好处,我受益匪浅!
课程设计是培养提高学生综合运用自己平时所学的知识发现问题、提出问题、分析问题和解决问题能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
回顾起此次C语言课程设计,我感慨颇多,从拿到题目到完成整个设计,从理论到实践,在整整两周的日子里,可以学到很多很多的的东西,不仅可以巩固了以前所学的知识,而且学到了很多只在书本上永远也得不到的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题很严重,这毕竟第一次做,难免会遇到过各种各样的问题,但我及时通过和同学交流,向老师提问等各种方法解决问题。
同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体…在暑假里我要把以前学过的知识全部复习一遍,巩固加强。