C课程设计文档格式.docx
《C课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《C课程设计文档格式.docx(47页珍藏版)》请在冰豆网上搜索。
*3……通讯者的删除*
*4……通讯者的查询*
*0……退出*
2).编程实现通讯录单链表的建立、通讯者的插入、通讯者的删除、通讯者的查询、通讯录的输出。
工作计划与进度安排:
第1天:
1、指导教师布置课程设计题目及任务
2、查找相关资料
第2~4天:
1、根据具体设计题目进行具体分析
2、对设计题目进行编码和调试
3、指导教师进行验收
第5天:
1、指导教师针对课程设计进行答辩
2、完成课程设计报告
指导教师:
2013年月日
专业负责人:
2013年月日
学院教学副院长:
2013年月日
一、课程设计目的------------------------------------------------------------1
二、课程设计内容和要求---------------------------------------------------1
三、题目一设计过程---------------------------------------------------------2
四、题目二设计过程--------------------------------------------------------24
五、设计总结-----------------------------------------------------------------36
六、参考文献-----------------------------------------------------------------36
题目栈子系统、通讯录管理系统
一、课程设计的目的
本学期我们对《数据结构》这门课程进行了学习。
这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。
这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具备一定的C语言基础和编程能力。
(1)题目一的目的:
1.掌握栈的特点及其描述方法
2.掌握链式存储结构实现一个栈
3.掌握链栈的各种基本操作
4.掌握栈的典型应用的算法
(2)题目二的目的:
1.掌握线性表的特点
2.掌握线性表的顺序存储结构和链式存储结构的基本运算
3.掌握线性表的基本操作
二、课程设计的内容和要求
三、题目一设计过程
1、题目分析
本题要求合理地设计一个栈的结构及入栈、出栈、删除、查找等基本操作,并运用此结构实现数制转换。
2、算法描述
首先定义一个结点结构体,指针域包括两个指针,分别指向前驱结点和后继结点,数据域为一个DataType类型的变量,其中DataTYpe类型为宏定义;
在定义一个栈结构体,结构体内包括两个指针,分别为栈顶指针和栈低指针,还有一个int型记录栈的长度。
欢迎界面后,进入主菜单,主菜单用switch设计,其中调用函数NUM,该函数可返回有效的菜单号,可屏蔽并提示错误信息及重新输入,菜单下调用了其他功能函数,菜单内除退出和初始化函数外所有的功能函数均存放在FUN.c.下。
下面仅详细阐述一下各功能模块的工作原理。
入栈为栈的首次赋值,利用do{}while();
可按需求循环输入多组信息,并及时退出返回到主菜单,在实现循环多组输入时调用了函数Push,Push为机械入栈一个新元素,将参数nn,入栈到栈tt内,栈的长度加一。
出栈函数Pop中,首先判断栈是否为空,为空时,不可出栈;
非空时,输出栈顶元素及栈的长度,并删除栈顶节点,栈的长度减一。
信息输出完毕后按任意键返回主菜单。
显示函数Show中,即利用do...while循环多次调用出栈函数,每次输出时要按任意键继续一次,以保障画面整洁。
数制转换函数chang中,大体结构包括一个大的do...while允许多次使用信息转换,do中首先输入数及其进制和预期进制,然后判断是否为十进制,经费是禁止的数字转换为十进制,再将其循环除以预期进制,将其余数存在新建号的栈中,直到余数为零,停止循环,然后依次出栈,将栈顶元素依次显示出来,即转换结束。
可选N或Y,继续下一次转换,或者返回主菜单。
3、源代码
ST.h:
#ifndefST_H
#defineST_H
#include<
stdio.h>
stdlib.h>
conio.h>
windows.h>
typedefintDataType;
typedefstructNode
{
structNode*pro;
DataTypedata;
structNode*next;
}NN;
//双向链栈的结点
typedefstruct
NN*top;
NN*base;
intsize;
}ST;
//栈
//main.c:
主函数
//Menu.c:
框架界面函数和初始化退出函数
voidInitiate(ST*tt);
//栈的初始化及双向链的初始化
voidJM();
//界面
intNum();
//菜单序号选择
voidExit();
//退出
//FUN.c:
具体功能函数
voidInput(ST*tt);
//入栈
voidPush(ST*tt,DataTypenn);
//机械入栈
intPop(ST*tt);
//机械出栈
voidShow(STtt);
//显示
voidchange(STtt);
//数制转换
#endif
Menu.c:
#include"
ST.H"
voidJM()//界面函数
intch;
STtt;
Initiate(&
tt);
printf("
\n\n\n\n\n\n\n\n\t\t欢迎您使用《栈子系统》!
\n\n\n"
);
\t\t\t\t设计者:
马舒阳(1203070102)\n"
getch();
do
{
system("
cls"
printf("
\n\n\t\t\t\t栈子系统\n"
\t********************************************\n"
\t*1……入栈*\n"
\t*2……出栈*\n"
\t*3……显示*\n"
printf("
\t*4……数制转换*\n"
\t*0……返回*\n"
\t*提示:
本系统仅可用于整型数数据的储存,望谅解。
*\t\n"
ch=Num();
switch(ch)
{
case1:
Input(&
break;
case2:
Pop(&
case3:
Show(tt);
case4:
change(tt);
case0:
Exit();
case-1:
;
}
}while(ch);
}
intNum()//判断菜单号
intk;
\n\t\t请选择菜单号(0…4):
"
scanf("
%d"
&
k);
getchar();
if(k<
0||k>
5)
printf("
\n\t\t输入错误!
按任意键继续..."
getch();
return(-1);
}
else
returnk;
voidInitiate(ST*tt)
//栈空的初始化注意:
此函数内的tt为栈型指针,不同于JM内的tt
tt->
base=(NN*)malloc(sizeof(NN));
top=tt->
base;
size=0;
voidExit()//退出
system("
\n\n\n\n\n\n\t\t谢谢使用程序退出!
\n\n\n\n\n\n\t\t\t"
main.c:
intmain()
JM();
return0;
FUN.c:
voidInput(ST*tt)//栈的初始化
DataTypenn;
\n\n\t\t老师早安!
开始入栈!
\n\n"
\n\t\t请输入新栈顶数据:
"
scanf("
nn);
//%d
getchar();
Push(tt,nn);
//调用入栈函数
do
printf("
\n\t\t继续?
<
YorN>
ch=getchar();
getchar();
if(ch!
='
N'
&
&
ch!
Y'
)
printf("
\n\t\t请输入Y或N!
\n"
else
break;
}while
(1);
}while(ch=='
voidPush(ST*tt,DataTypenn)
//将nn入栈到tt所指栈(栈中top指向还未赋值的结点)
NN*p;
p=(NN*)malloc(sizeof(NN));
top->
data=nn;
p->
pro=tt->
top;
(tt->
top)->
next=p;
top=p;
size++;
intPop(ST*tt)//出栈
if(tt->
size==0)
\n\t\t对不起,此栈已空!
return0;
\n\t\t栈顶元素为%d\n"
tt->
pro->
data);
p=tt->
tt->
pro;
free(p);
next=NULL;
if(!
(tt->
next))
{
tt->
size--;
\n\t\t出栈成功!
栈中还有%d个元素!
按任意键继续...\n"
size);
getch();
return1;
voidShow(STtt)//显示全部出栈
tt.size)
else
}while
(1);
\n\t\t马舒阳汇报完毕完毕!
voidchange()//数值转换
STcc;
inti,nn,zz,yy,tem_1,tem_2,tem_3;
charch;
cc);
\n\n\t\t欢迎进入数据转换!
\n\n\t\t(请注意:
系统暂不支持十以上进制转换!
)\n"
\n\n\t\t请输入一个数字!
scanf("
\n\n\t\t请问已输入的数字是什么进制呢?
zz);
\n\n\t\t请问您想要转换到几进制的呢?
yy);
if(zz>
10||yy>
10)
\n\t\t待转换的数字进制输入不合理!
按任意键回到主菜单..."
getch();
return;
if(zz!
=10)//若不是十进制要转换成十进制
tem_3=1;
//变量含义:
进制数的n次方
tem_2=0;
暂时存放和
tem_1=1;
各项数
for(i=0;
nn;
nn/=10)
{
tem_1=(nn%10)*tem_3;
tem_2+=tem_1;
tem_3*=zz;
}
nn=tem_2;
for(;
nn/=yy)//大除法入栈
if(nn%yy<
zz)
Push(&
cc,nn%yy);
\n\n\t\t转换结果为"
cc.base!
=cc.top;
)//出栈
p=cc.top->
p->
cc.top=p;
free(p->
next);
cc.size--;
\n\n\t\t继续?
4、运行结果
欢迎界面,如图所示。
图1-1
按任意键继续后进入主菜单,选择菜单号1,进入入栈模块,如图所示。
图1-2
开始入栈,输入新的栈顶元素(整型),并输入Y或N选择是否继续,此过程中,输入错误有提示,如图所示,以1,3,5,7,9,2,4,6,8,入栈为例。
图1-3
图1-4
图1-5
选择N,输入结束,然后回到主菜单,下面选择菜单号2,进入出栈模块。
图1-6
按任意键继续后,回到主菜单,选择菜单号3,显示栈内剩余信息。
图1-7
图1-8
其间,每一次输出可按需要按任意键输出,并显示剩余信息。
图1-9
图1-10
汇报完毕后,即栈已空,按任意键返回到主函数,选择菜单号4,进入数制转换模块。
图1-11
输入被转换的数字,被转换数字的数制及预期数制,并可按需求输入Y或N选择继续或退出。
图1-12
图1-13
退出后返回主菜单,选择0,即可退出程序
。
图1-14
图1-15
四、题目二设计过程
1、题目分析
本题要求建立链表,以存储联系人信息,并设计出对其的建立,插入删除显示等基本操作即可。
首先定义一个链表结点结构体,指针域包括一个next指针,数据域包括个人姓名及联系方式。
欢迎界面后,进入主菜单,主菜单用switch设计,其中调用函数NUM,该函数可返回有效的菜单号,可屏蔽并提示错误信息及重新输入,菜单下调用了其他功能函数,菜单内除退出和初始化函数外所有的功能函数均存放在Fx.c.下。
下面仅具体阐述一下各功能模块的工作原理。
函数Build,首先判断该表是否已建立过,即表内是否有一个空结点(头结点),表未初始化时便建立一个空表,否则提示“表已存在,无需建立”。
提示后延时2
s自动跳转到主菜单。
插入函数Insert,首先输入有效信息,然后利用头插法将其插入到头指针的下一个结点,再输出提示,提示用户选择N或Y,判断是否继续,若要继续,则递归本函数,否,直接返回主菜单。
删除函数Delete,首先判断表是否为空,表为空时,不允许删除,并弹出提示,按任意键继续后后跳转到主菜单;
表非空时,输入要删除人的姓名,利用循环查找表中人的信息(暂不支持多元素的查找与删除),若查找成功则输出提示,询问是否确定删除,按需求,删除该结点(暂不支持误删恢复)或取消操作;
若查找失败,不存在该联系人,则输出提示。
最后按任意键退回到主菜单。
查询函数Search,首先判断表是否为空,表为空时,不允许查找,并弹出提示,按任意键继续后后跳转到主菜单;
表非空时,输入要查询人的姓名,利用循环查找表中人的信息(暂不支持多元素的查找),然后输出信息,按任意键退回到主菜单。
退出函数Exit,先输出表内所有信息,信息输出完毕后,按任意键结束程序。
MSY.h:
#ifndefMSY_H
#defineMSY_H
#include<
//#include<
#defineN20
charname[N];
charnum[N];
}NODE;
voidWelcome();
voidjiemian();
voidBuild(NODE**head);
voidinsert(NODE**head);
voidDelete(NODE*head);
voidFind(NODE*head);
voidExit(NODE*head);
//待改进:
多元素查询
当head没有初始化,要直接关闭,不允许进行插入和删除等操作
Fx.c:
#include"
MSY.h"
voidjiemian()
staticNODE*head=NULL;
\n\n\t\t\t\t通讯录管理系统\n"
****************************************************\n"
*1……通讯录单链表的建立*\n"
*2……通讯者的插入*\n"
*3……通讯者的删除*\n"
*4……通讯者的查询*\n"
*0……退出*\n"
\t提示:
在2,3,4