数据结构设计性实验有理数四则运算.docx
《数据结构设计性实验有理数四则运算.docx》由会员分享,可在线阅读,更多相关《数据结构设计性实验有理数四则运算.docx(21页珍藏版)》请在冰豆网上搜索。
![数据结构设计性实验有理数四则运算.docx](https://file1.bdocx.com/fileroot1/2023-5/19/d5921020-5b46-495c-ba2c-94e19ecc55e2/d5921020-5b46-495c-ba2c-94e19ecc55e21.gif)
数据结构设计性实验有理数四则运算
<<数据结构>>
抽象数据类型实验报告
题目有理数四则运算
学院____计算机学院_____
专业_网络工程
年级班别____2007级三班___
学号3107007033
学生_____江振辉__
辅导教师_______小妹________
2009年6月25日
1、实验概要
实验项目名称:
抽象数据类型的实现
实验项目性质:
设计性实验
所属课程名称:
数据结构
实验计划学时:
6
2、实验目的
对某个具体的抽象数据类型,运用课程所学的知识和方法,设计合理的数据结构,并在此基础上实现该抽象数据类型的全部基本操作。
通过本设计性实验,检验所学知识和能力,发现学习中存在的问题。
进而达到熟练地运用本课程中的基础知识及技术的目的。
实验要求如下:
1.参加实验的学生应首先了解设计的任务,然后根据自己的基础和能力从中选择一题。
一般来说,选择题目应以在规定的时间能完成,并能得到应有的锻炼为原则。
若学生对教材以外的相关题目较感兴趣,希望选作实验的题目时,应征得指导教师的认可,并写出明确的抽象数据类型定义及说明。
2.实验前要作好充分准备,包括:
理解实验要求,掌握辅助工具的使用,了解该抽象数据类型的定义及意义,以及其基本操作的算法并设计合理的存储结构。
3.实验时严肃认真,要严格按照要求独立进行设计,不能随意更改。
注意观察并记录各种错误现象,纠正错误,使程序满足预定的要求,实验记录应作为实验报告的一部分。
4.实验后要及时总结,写出实验报告,并附所打印的问题解答、程序清单,所输入的数据及相应的运行结果。
所用软件环境或工具:
Dev-C++
3.抽象数据类型
ADT抽象数据类型名{
数据对象:
<数据对象的定义>
数据关系:
<数据关系的定义>
基本操作:
<基本操作的定义>
}ADT抽象数据类型名
例:
线性表的表示
名称
线性表
数据对象
D={ai|ai(-ElemSet,i=1,2,...,n,n>=0}
任意数据元素的集合
数据关系
R1={|ai-1,ai(-D,i=2,...,n}
除第一个和最后一个外,每个元素有唯一的直接前趋和唯一的直接后继
基本操作
ListInsert(&L,i,e)
L为线性表,i为位置,e为数据元素。
ListDelete(&L,i,e)
...
二、类C语言语法
类C语言语法示例
1、预定义常量和类型
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefinStatus;//Status是函数的类型,其值是函数结果状态代码。
2、数据结构的存储结构
typedefElemTypefirst;
3、基本操作的算法
函数类型函数名(函数参数表){
//算法说明
语句序列
}//函数名
4、赋值语句
简单赋值:
变量名=表达式;
串联赋值:
变量名1=变量名2=...=变量名k=表达式;
成组赋值:
(变量名1,...,变量名k)=(表达式1,...,表达式k);
结构名=结构名;
结构名=(值1,...,值k);
变量名[]=表达式;
变量名[起始下标..终止下标]=变量名[起始下标..终止下标];
交换赋值:
变量名<-->变量名;
条件赋值:
变量名=条件表达式?
表达式?
表达式T:
表达式F
5、选择语句
1、if(表达式)语句;
2、if(表达式)语句;
else语句;
3、switch(表达式){
case值1:
语句序列1;break;
...
case值n:
语句序列n;break;
default:
语句序列n+1;break;
}
4、switch{
case条件1:
语句序列1;break;
...
case条件n:
语句序列n;break;
default:
语句序列n+1;break;
}
6、循环语句
for(赋初值表达式;条件;修改表达式序列)语句;
while(条件)语句;
do{语句序列}while(条件);
7、结束语句
return[表达式];
return;//函数结束语句
break;//case结束语句
exit(异常代码);//异常结束语句
8、输入和输出语句
scanf([格式串],变量1,...,变量n);
9、注释
//文字序列
10、基本函数
max(表达式1,...,表达式n)
min,abs,floor,ceil,eof,eoln
11、逻辑运算
&&与运算;||或运算
5.课程算法设计
#include
#include
#include
intGONGYUESHU(intm,intn)//*求最大公约数*//
{
intx,y,z;
if(m{z=m;m=n;n=z;}
x=m;y=n;
while(y!
=0)
{
z=x%y;
x=y;
y=z;
}
return(x);
}
Exit()//*退出*//
{
printf("\n使用!
制作者:
计算机学院07级网络工程3班江振辉学号:
3107007033");
getchar();
getchar();
}
intfen_Add(intq,intw,intv,inth)//*分数加法*//
{
into,i,l,k,j;
o=w*h;
i=q*h+w*v;
l=GONGYUESHU(o,i);
k=o/l;
j=i/l;
printf("分数之和为%d/%d\n",j,k);
}
floatAdd(floata,floatb)///*有理数加法*/
{
floatsum;
intq,w,v,h,j,x;
charm;
loop1:
printf("*******************************加法运算************************************\n");
printf("1、整数、小数加法2、分数加法3、退出\n");
printf("********************************************************************************\n");
printf("请选择1、2或3:
");
scanf("%d",&x);
if(x!
=1&&x!
=2&&x!
=3)printf("非法输入,请重新输入!
");
switch(x)
{
case1:
{
printf("请输入第一个数据:
");
scanf("%f",&a);
printf("请输入第二个数据:
");
scanf("%f",&b);
sum=a+b;
printf("a+b=%f",sum);
getchar();
getchar();
break;
}
case2:
{
printf("输入第一个数的分子:
");
scanf("%d",&q);
printf("输入第一个数的分母:
");
scanf("%d",&w);
printf("输入第二个数的分子:
");
scanf("%d",&v);
printf("输入第二个数的分母:
");
scanf("%d",&h);
fen_Add(q,w,v,h);
break;
}
case3:
{
Exit();
break;
}
default:
{
printf("输入有误!
\n");
gotoloop1;
break;
}
}
if(x!
=3)gotoloop1;
}
intfen_Sub(intq,intw,intv,inth)///*分数减法*/
{
into,i,l,k,j;
o=w*h;
i=q*h-w*v;
l=GONGYUESHU(o,i);
k=o/l;
j=i/l;
printf("分数之差为%d/%d\n",j,k);
}
floatSub(floata,floatb)//*有理数减法*//
{
floatresult;
intq,w,v,h,j,x;
charm;
loop1:
printf("*******************************减法运算************************************\n");
printf("1、整数、小数减法2、分数减法3、退出\n");
printf("********************************************************************************\n");
printf("请选择1、2或3:
");
scanf("%d",&x);
if(x!
=1&&x!
=2&&x!
=3)printf("非法输入,请重新输入!
");
switch(x)
{
case1:
{
printf("请输入第一个数据:
");
scanf("%f",&a);
printf("请输入第二个数据:
");
scanf("%f",&b);
result=a-b;
printf("a-b=%f",result);
getchar();
getchar();
break;
}
case2:
{
printf("输入第一个数的分子:
");
scanf("%d",&q);
printf("输入第一个数的分母:
");
scanf("%d",&w);
printf("输入第二个数的分子:
");
scanf("%d",&v);
printf("输入第二个数的分母:
");
scanf("%d",&h);
fen_Sub(q,w,v,h);
break;
}
case3:
{
Exit();
break;
}
default:
{
printf("输入有误!
\n");
gotoloop1;
break;
}
}
if(x!
=3)gotoloop1;
}
intfen_Mul(intq,intw,intv,inth)//*分数乘法*//
{
into,i,l,k,j;
o=w*h;
i=q*v;
l=GONGYUESHU(o,i);
k=o/l;
j=i/l;
printf("分数之积为%d/%d\n",j,k);
}
floatMul(floata,floatb)//*有理数乘法*//
{
floatresult;
intq,w,v,h,j,x;
charm;
loop1:
printf("*******************************乘法运算************************************\n");
printf("1、整数/小数乘法2、分数乘法3、退出\n");
printf("********************************************************************************\n");
printf("请选择1、2或3:
");
scanf("%d",&x);
if(x!
=1&&x!
=2&&x!
=3)printf("非法输入,请重新输入!
");
switch(x)
{
case1:
{
printf("请输入第一个数据:
");
scanf("%f",&a);
printf("请输入第二个数据:
");
scanf("%f",&b);
result=a*b;
printf("a*b=%f",result);
getchar();
getchar();
break;
}
case2:
{
printf("输入第一个数的分子:
");
scanf("%d",&q);
printf("输入第一个数的分母:
");
scanf("%d",&w);
printf("输入第二个数的分子:
");
scanf("%d",&v);
printf("输入第二个数的分母:
");
scanf("%d",&h);
fen_Mul(q,w,v,h);
break;
}
case3:
{
Exit();
break;
}
default:
{
printf("输入有误!
\n");
gotoloop1;
break;
}
}
if(x!
=3)gotoloop1;
}
intfen_Div(intq,intw,intv,inth)//*分数除法*//
{
into,i,l,k,j;
o=w*v;
i=q*h;
l=GONGYUESHU(o,i);
k=o/l;
j=i/l;
printf("分数之积为%d/%d\n",j,k);
}
floatDiv(floata,floatb)///*有理数除法*/
{
floatresult;
intq,w,v,h,j,x;
charm;
loop1:
printf("*******************************除法运算************************************\n");
printf("1、整数/小数除法2、分数除法3、退出\n");
printf("********************************************************************************\n");
printf("请选择1、2或3:
");
scanf("%d",&x);
if(x!
=1&&x!
=2&&x!
=3)printf("非法输入,请重新输入!
");
switch(x)
{
case1:
{
printf("请输入第一个数据:
");
scanf("%f",&a);
printf("请输入第二个数据:
");
scanf("%f",&b);
result=a/b;
printf("a/b=%f",result);
getchar();
getchar();
break;
}
case2:
{
printf("输入第一个数的分子:
");
scanf("%d",&q);
printf("输入第一个数的分母:
");
scanf("%d",&w);
printf("输入第二个数的分子:
");
scanf("%d",&v);
printf("输入第二个数的分母:
");
scanf("%d",&h);
fen_Div(q,w,v,h);
break;
}
case3:
{
Exit();
break;
}
default:
{
printf("输入有误!
\n");
gotoloop1;
break;
}
}
if(x!
=3)gotoloop1;
}
floatfeng(floatz)//*求分子分母运算*//
{
intf,k,j,x;
floatelem=1000000;
loop1:
printf("*****************************求分子分母运算*****************************\n");
printf("1、输入数据2、退出\n");
printf("********************************************************************************\n");
printf("请选择1或2:
");
scanf("%d",&x);
if(x!
=1&&x!
=2)printf("非法输入,请重新输入!
");
if(x==1)
{
printf("请输入一个有理数:
");
scanf("%f",&z);
z=z*elem;
f=GONGYUESHU(z,elem);
j=elem/f;
k=(int)z/f;
printf("分子是%d,分母是%d\n",k,j);
gotoloop1;
}
if(x==2)Exit();
}
main()//*主程序*//
{
intx;
floata,b,z;
printf("\n****************************有理数四则运算******************************\n");
printf("1、加法运算2、减法运算\n");
printf("3、乘法运算4、除法运算\n");
printf("5、求分子分母运算6、退出\n");
printf("********************************************************************************\n");
loop3:
printf("请选择运算类型:
");
scanf("%d",&x);
printf("\n");
switch(x)
{
case1:
{
Add(a,b);
break;
}
case2:
{
Sub(a,b);
break;
}
case3:
{
Mul(a,b);
break;
}
case4:
{
Div(a,b);
break;
}
case5:
{
feng(z);
break;
}
case6:
{
Exit();
break;
}
default:
{
printf("输入有误!
请重新选择:
\n");
gotoloop3;
break;
}
}
}
5.测试及调试
主函数调用图解:
6.执行过程:
测试两个有理数相除的运算,实现10除以5
主菜单显示:
做除法运算,选择4,ENTER。
由于现在实现整数的除法,所以选择1,ENTER。
然后分别输入数据分子10,ENTER,和分母5,ENTER
测试成功通过。
7.实验总结
通过这次课程设计我意识到数据类型的多样性与灵活性。
通过如此简单的组合使用边可以实现丰富而实用的功能。
但同时,不同的数据类型之间的差异也十分的大,是用时必须小心谨慎,注意区分。
有的功能只需要简单的赋值然后和选择语句结合使用便能实现,有的却要使用多种语句才能实现。
通过本设计,使我对多种数据类型的使用有了一个更深刻的认识。