C课程设计2.docx
《C课程设计2.docx》由会员分享,可在线阅读,更多相关《C课程设计2.docx(40页珍藏版)》请在冰豆网上搜索。
C课程设计2
沈阳理工大学课程设计专用纸
NO.
成绩评定表
学生姓名马舒阳班级学号1203070102
专业电子信息科学课程设计题目编程技术基础实训
与技术
评
语
组长签字:
成绩
日期2013年月日
沈阳理工大学课程设计专用纸
NO.1
课程设计任务书
学院
信息科学与工程学院
专业
电子信息科学与技术
学生姓名
马舒阳
班级学号
1203070102
课程设计题目编程技术基础实训
实践教学要求与任务:
利用C语言编写下题的代码。
题目名称:
设计求两数之差的绝对值的函数和学生成绩统计程序
内容及要求:
(1)题目一的内容和要求:
1).设计一个选择式菜单。
栈子系统
******************************************************
*
1
,入栈
*
*
2
,出栈
*
*
3
,显示
*
*
4
,数制转换
*
*
0
,返回
*
******************************************************
请选择菜单号(0,4):
2).设计一个整型数据元素的链栈。
3).编写入栈、出栈和显示栈中全部元素的程序。
4).编写一个把十进制数转换成八进制数的应用程序。
(2)题目二的内容和要求:
通讯录实质上是一个线性表,由于通讯录长度不确定,且插入或删除操作比较频
繁,因此,采用单链式存储结构。
要求实现如下功能:
1).设计一个选择式菜单。
沈阳理工大学课程设计专用纸
NO.2
通讯录管理系统
******************************************************
*
1
,通讯录单链表的建立
*
*
2
,通讯者的插入
*
*
3
,通讯者的删除
*
*
4
,通讯者的查询
*
*
0
,退出
*
******************************************************
请选择菜单号(0,4):
2).编程实现通讯录单链表的建立、通讯者的插入、通讯者的删除、通讯者的查
询、通讯录的输出。
工作计划与进度安排:
第1天:
1、指导教师布置课程设计题目及任务
2、查找相关资料
第2~4天:
1、根据具体设计题目进行具体分析
2、对设计题目进行编码和调试
3、指导教师进行验收
第5天:
1、指导教师针对课程设计进行答辩
2、完成课程设计报告
指导教师:
专业负责人:
学院教学副院长:
2013年月日2013年月日2013年月日
沈阳理工大学课程设计专用纸
NO.3
一、课程设计目的------------------------------------------------------------1
二、课程设计内容和要求---------------------------------------------------1
三、题目一设计过程---------------------------------------------------------2
四、题目二设计过程--------------------------------------------------------24
五、设计总结-----------------------------------------------------------------36
六、参考文献-----------------------------------------------------------------36
沈阳理工大学课程设计专用纸
NO.4
题目栈子系统、通讯录管理系统
一、课程设计的目的
本学期我们对《数据结构》这门课程进行了学习。
这门课程是一门实践性非
常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。
这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具备一定的C语言基础和编程能力。
(1)题目一的目的:
1.掌握栈的特点及其描述方法
2.掌握链式存储结构实现一个栈
3.掌握链栈的各种基本操作
4.掌握栈的典型应用的算法
(2)题目二的目的:
1.掌握线性表的特点
2.掌握线性表的顺序存储结构和链式存储结构的基本运算
3.掌握线性表的基本操作
二、课程设计的内容和要求
(1)题目一的内容和要求:
1).设计一个选择式菜单。
栈子系统
******************************************************
*
1
,
入栈
*
*
2
,
出栈
*
*
3
,
显示
*
*
4
,
数制转换
*
沈阳理工大学课程设计专用纸
NO.5
*0,,返回*
******************************************************
请选择菜单号(0,4):
2).设计一个整型数据元素的链栈。
3).编写入栈、出栈和显示栈中全部元素的程序。
4).编写一个把十进制数转换成八进制数的应用程序。
(2)题目二的内容和要求:
通讯录实质上是一个线性表,由于通讯录长度不确定,且插入或删除操作比
较频繁,因此,采用单链式存储结构。
要求实现如下功能:
1).设计一个选择式菜单。
通讯录管理系统
******************************************************
*
1
,通讯录单链表的建立
*
*
2
,通讯者的插入
*
*
3
,通讯者的删除
*
*
4
,通讯者的查询
*
*
0
,退出
*
******************************************************
请选择菜单号(0,4):
2).编程实现通讯录单链表的建立、通讯者的插入、通讯者的删除、通讯者
的查询、通讯录的输出。
三、题目一设计过程
1、题目分析
本题要求合理地设计一个栈的结构及入栈、出栈、删除、查找等基本操
作,并运用此结构实现数制转换。
2、算法描述
沈阳理工大学课程设计专用纸
NO.6
首先定义一个结点结构体,指针域包括两个指针,分别指向前驱结点和
后继结点,数据域为一个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
沈阳理工大学课程设计专用纸
NO.7
#include
#include
#include
#include
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();//退出
栈的初始化及双向链的初始化
沈阳理工大学课程设计专用纸
NO.8
//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
");
printf("\t\t\t\t
设计者:
马舒阳(1203070102)\n");
getch();
do
{
system("cls");
printf("\n\n\t\t\t\t栈子系统\n");
printf
("\t********************************************\n");
printf("\t*1,,入栈
*\n");
printf("\t*
2
,出栈
沈阳理工大学课程设计专用纸
NO.9
*\n");
printf("\t*
3
,显示
*\n");
printf("\t*
4
,数制转换
*\n");
printf("\t*
0
,返回
*\n");
printf
("\t********************************************\n");
printf("\t*
谅解。
*\t\n");
提示:
本系统仅可用于整型数数据的储存,望
printf
("\t********************************************\n");
ch=Num();
switch(ch)
{
case1:
Input(&tt);
break;
case2:
Pop(&tt);
break;
case3:
Show(tt);
break;
case4:
change(tt);
break;
case0:
Exit();
case-1:
沈阳理工大学课程设计专用纸
NO.10
;
}
}while(ch);
}
intNum()//判断菜单号
{
intk;
printf("\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));
tt->top=tt->base;
tt->size=0;
}
沈阳理工大学课程设计专用纸
NO.11
voidExit()//退出
{
system("cls");
printf("\n\n\n\n\n\n\t\t谢谢使用程序退出!
");
printf("\n\n\n\n\n\n\t\t\t");
printf("按任意键继续...");
getch();
}
main.c:
#include"ST.H"
intmain()
{
JM();
return0;
}
FUN.c:
#include"ST.H"
voidInput(ST*tt)//栈的初始化
{
DataTypenn;
intch;
system("cls");
printf("\n\n\t\t老师早安!
开始入栈!
\n\n");
do
{
沈阳理工大学课程设计专用纸
NO.12
printf("\n\t\t请输入新栈顶数据:
");
scanf("%d",&nn);//%d
getchar();
Push(tt,nn);//调用入栈函数
do
{
printf("\n\t\t继续?
");
ch=getchar();
getchar();
if(ch!
='N'&&ch!
='Y')
printf("\n\t\t请输入Y或N!
\n");
else
break;
}while
(1);
}while(ch=='Y');
}
voidPush(ST*tt,DataTypenn)
//将nn入栈到tt所指栈(栈中top指向还未赋值的结点)
{
NN*p;
p=(NN*)malloc(sizeof(NN));
tt->top->data=nn;
p->pro=tt->top;
(tt->top)->next=p;
tt->top=p;
tt->size++;
}
intPop(ST*tt)//出栈
沈阳理工大学课程设计专用纸
NO.13
{
NN*p;
if(tt->size==0)
{
printf("\n\t\t
对不起,此栈已空!
\n");
getch();
return0;
}
else
{
printf("\n\t\t
栈顶元素为
%d
\n",tt->top->pro->data);//%d
p=tt->top;
tt->top=tt->top->pro;
free(p);
tt->top->next=NULL;
if(!
(tt->top->next))
{
tt->size--;
printf("\n\t\t出栈成功!
栈中还有%d个元素!
按任意键继
续...\n",tt->size);
getch();
}
return1;
}
}
voidShow(STtt)//显示全部出栈
{
system("cls");
沈阳理工大学课程设计专用纸
NO.14
do
{
if(!
tt.size)
break;
else
Pop(&tt);
}while
(1);
printf("\n\t\t马舒阳汇报完毕完毕!
按任意键继续...\n");getch();
}
voidchange()//数值转换
{
STcc;
NN*p;
inti,nn,zz,yy,tem_1,tem_2,tem_3;
charch;
Initiate(&cc);
do
{
system("cls");
printf("\n\n\t\t欢迎进入数据转换!
\n\n\t\t(请注意:
系统
暂不支持十以上进制转换!
)\n");
printf("\n\n\t\t请输入一个数字!
");
scanf("%d",&nn);//%d
getchar();
printf("\n\n\t\t请问已输入的数字是什么进制呢?
");
scanf("%d",&zz);//%d
getchar();
printf("\n\n\t\t请问您想要转换到几进制的呢?
");
沈阳理工大学课程设计专用纸
NO.15
scanf("%d",&yy);//%d
getchar();
if(zz>10||yy>10)
{
printf("\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;nn/=yy)//大除法入栈
{
if(nn%yyPush(&cc,nn%yy);
else
{
printf("\n\t\t待转换的数字进制输入不合理!
按任意
键回到主菜单...");
沈阳理工大学课程设计专用纸
NO.16
getch();
return;
}
}
printf("\n\n\t\t
转换结果为
");
for(;cc.base!
=cc.top;)//出栈
{
p=cc.top->pro;
printf("%d",p->data);//%d
cc.top=p;
free(p->next);
cc.size--;
}
do
{
printf("\n\n\t\t继续?
");
ch=getchar();
getchar();
if(ch!
='N'&&ch!
='Y')
printf("\n\t\t请输入Y或N!
\n");
else
break;
}while
(1);
}while(ch=='Y');
}
4、运行结果
欢迎界面,如图所示。
沈阳理工大学课程设计专用纸
NO.17
图1-1
按任意键继续后进入主菜单,选择菜单号1,进入入栈模块,如图所示。
图1-2
开始入栈,输入新的栈顶元素(整型),并输入Y或
输入错误有提示,如图所示,以1,3,5,7,9,2,4,6,8,入栈为例。
N选择是否继续,此过程中,
沈阳理工大学课程设计专用纸
NO.18
图1-3
图1-4
沈阳理工大学课程设计专用纸
NO.19
图1-5
选择N,输入结束,然后回到主菜单,下面选择菜单号2,进入出栈模块。
图1-6
按任意键继续后,回到主菜单,选择菜单号3,显示栈内剩余信息。
沈阳理工大学课程设计专用纸
NO.20
图1-7
图1-8
沈阳理工大学课程设计专用纸
NO.21
其间,每一次输出可按需要按任意键输出,并显示剩余信息。
图1-9
图1-10
沈阳理工大学课程设计专用纸
NO.22
汇报完毕后,即栈已空,按任意键返回到主函数,选择菜单号4,进入数制转换
模块。
图1-11
输入被转换的数字,被转换数字的数制及预期数制,并可按需求输入Y或N选择继续
或退出。
图1-12
沈阳理工大学课程设计专用纸
NO.23
图1-13
退出后返回主菜单,选择0,即可退出程序
。
图1-14
沈阳理工大学课程设计专用纸
NO.24
图1-15
四、题目二设计过程
1、题目分析
本题要求建立链表,以存储联系人信息,并设计出对其的建立,插入删
除显示等基本操作即可。
2、算法描述
首先定义一个链表结点结构体,指针域包括一个next指针,数据域包括
个人姓名及联系方式。
欢迎界面后,进入主菜单,主菜单用switch设计,其中调用函数NUM,
该函数可返回有效的菜单号,可屏蔽并提示错误信息及重新输入,菜单下调
用了其他功能函数,菜单内除退出和初始化函数外所有的功能函数均存放在
Fx.c.下。
下面仅具体阐述一下各功能模块的工作原理。
函数Build,首先判断该表是否已建立过,即表内是否有一个空结点(头
结点),表未初始化时便建立一个空表,否则提示“表已存在,无需建立”。
提示后延时2
s自动跳转到主菜单。
插入函数Insert,首先输入有效信息,然后利用头插法将其插入到头指针
的下一个结点,再输出提示,提示用户选择N或Y,判断是否继续,若要继
续,则递归本函数,否,直接返回主菜单。
沈阳理工大学课程设计专用纸
NO.25
删除函数Delete,首先判断表是否为空,表为空时,不允许删除,并弹
出提示,按任意键继续后后跳转到主菜单;表非空时,输入要删除人的姓名,利用循环查找表中人的信息(暂不支持多元素的查找与删除),若查找成功则输出提示,询问是否确定删除,按需求,删除该结点(暂不支持误删恢复)或取消操作;若查找失败,不存在该联系人,则输出提示。
最后按任意键退
回到主菜单。
查询函数Search,首先判断表是否为空,表为空时,不允许查找,并弹
出提示,按任意键继续后后跳转到主菜单;表非空时,输入要查询人的姓名,
利用循环查找表中人的信息(暂不支持多元素的查找),