实验报告 抽象数据类型的表示和实现 (三元组) 实现对三元组的基本操作 动态分配 (更新)增加菜单功能

1.实验名称
抽象数据类型的表示和实现
2.实验目的
(1)复习巩固C语言的结构体、指针、函数、动态分配内存等知识点。
(2)掌握抽象数据类型的定义、表示和实现,为后续实验打好基础。
3.实验内容
基本要求:
设计实现抽象数据类型“三元组”,要求动态分配内存。每个三元组由任意三个实数的序列构成,基本操作包括:创建一个三元组,取三元组的任意一个分量,置三元组的任意一个分量,求三元组的最大分量,求三元组的最小分量,显示三元组,销毁三元组等。
选作内容:
实现两个三元组的对应分量相加或相减,给三元组的各分量同乘一个比例因子等操作。
4.数据类型描述(此处写清楚三元组的抽象数据类型描述)
三元组Triplet的定义:
ADT Triplet{
数据对象:D={e1,e2,e3|e1,e2,e3属于ElemType}
数据关系:R={<e1,e2>,<e2,e3>}
基本操作:
InitTrip(&L,v0,v1,v2)
{
初始条件:无
操作结果:构造三元组T,元素e1,e2,e3分别被赋予参数 v0,v1,v2的值。
}

DestroyTriplet(&L)
{
初始条件:三元组T已经存在;
操作结果:销毁三元组T;
}
GetElem(L,i)
{
初始条件:三元组T已经存在,1<=i<=3
操作结果:用e返回三元组的第i个元素。
}
PutElem(&T,i,e)
{
初始条件:三元组T已经存在,1<=i<=3
操作结果:将T的第i个元素的位置置为e
}
IsAscending(T)
{
初始条件:三元组T已经存在
操作结果:如果三元组T的三个元素按升序排序,则返回TRUE,否则返回FALSE
}

IsDescending(T)
{
初始条件:三元组T已经存在
操作结果:如果三元组T的三个元素按降序排序,则返回TRUE,否则返回FALSE
}

max(T)
{
初始条件:三元组已存在
操作结果:用e返回三元组中的最大值
}
min(T)
{
初始条件:三元组已存在
操作结果:用e返回三元组中的最小值
}
CoRide(L)
{
初始条件:三元组已存在
操作结果:给三元组的各分量同乘一个比例因子
}
DifferenceVaule(L)
{
初始条件:三元组已存在
操作结果:实现两个三元组的对应分量相减
}
Sum(L)
{
初始条件:三元组已存在
操作结果:实现两个三元组的对应分量相加
}
print(L)
{
初始条件:三元组已存在
操作结果:打印三元组的值
}
}ADT Triplet
代码:

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE 0
#define LIST_INIT_SIZE 200
typedef int Status;
typedef float ElemType;
typedef struct
{
	ElemType *elem;
}Triplet;
ElemType e;
Status i;
//创建一个三元组 
void initTriplet(Triplet &L,ElemType v0,ElemType v1,ElemType v2)
{
	L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	L.elem[0]=v0;
	L.elem[1]=v1;
	L.elem[2]=v2;
} 
//打印三元组 
void print(Triplet &L)
{
	for(i=0;i<3;i++)
	{
		printf("%f ",L.elem[i]);
	}
}
//取三元组的任意一个分量
ElemType Getelem(Triplet L,Status i)
{
	if(i<1||i>3)
	{
		return FALSE;
	}
	ElemType e=L.elem[i-1];
	return e;
}
//置三元组的任意一个分量 
ElemType Putelem(Triplet &L)
{
	printf("请输入需要置换元素的位置:");
    scanf("%d",&i); 
    printf("请输入置换的元素:");
	scanf("%f",&e); 
	if(i<1||i>3)
	{
		return FALSE;
	}
	L.elem[i-1]=e;
	printf("置换后的三元组为:");
    print(L);
	return OK;
}
//求三元组的最大分量 
ElemType max(Triplet L)
{
	Status temp;
	if(L.elem[0]>L.elem[1])
	{
		temp=L.elem[0];
	}else
	{
		temp=L.elem[1];
	}
	if(temp>L.elem[2])
	{
		e=temp;
	}else
	{
		e=L.elem[2];
	}
	printf("%f",e);
}
//求三元组的最小分量
ElemType min(Triplet L)
{
	Status temp;
	if(L.elem[0]<L.elem[1])
	{
		temp=L.elem[0];
	}
	else
	{
		temp=L.elem[1];
	}
	if(temp<L.elem[2])
	{
		e=temp;
	}else
	{
		e=L.elem[2];
	}
	printf("%f",e);
}
//实现两个三元组的对应分量相加
ElemType Sum(Triplet L)
{
	Status a,b;
	printf("请输入三元组的两个位置:");
	scanf("%d",&a);
	scanf("%d",&b);
	if(a<1||a>3)
	{
		return FALSE;
	}
	if(b<1||b>3)
	{
		return FALSE;
	}
	ElemType sum=0;
	sum+=Getelem(L,a);
	sum+=Getelem(L,b);
	printf("%f",sum);
	return OK;
}
//实现两个三元组的对应分量相减
ElemType DifferenceVaule(Triplet L)
{
	Status a,b;
	ElemType c,d;
	printf("请输入三元组的位置:");
	scanf("%d %d",&a,&b);
	if(a<1||a>3)
	{
		return FALSE;
	}
	if(b<1||b>3)
	{
		return FALSE;
	}
	c=Getelem(L,a);
	d=Getelem(L,b);
	printf("%f",c-d);
	return OK;
	
}
//给三元组的各分量同乘一个比例因子(2)
ElemType CoRide(Triplet &L)
{   
    ElemType a;
    printf("请输入需要同乘的值:");
	scanf("%f",&a);
	int i;
	for(i=0;i<3;i++)
	{
		L.elem[i]=L.elem[i]*a;
	}
	print(L);
}
Status isAscending(Triplet T)
{
	return (T.elem[0]<=T.elem[1])&&(T.elem[1]<=T.elem[2]);
}
Status isDecending(Triplet T)
{
	return (T.elem[0]>=T.elem[1])&&(T.elem[1]>=T.elem[2]);
}
//销毁三元组 
DestroyTriplet(Triplet &L)
{
	free(L.elem);
	printf("三元组已销毁"); 
	return OK;
}
ElemType menu(Triplet &T)
{
	Status i,val;
	printf("**********************************\n");
	printf("|            欢迎使用            |\n");
	printf("1:显示三元组的值                  \n");
	printf("2:获取三元组中第n个值             \n");
	printf("3:三元组中最大值                  \n");
	printf("4:三元组中最小值                  \n");
	printf("5:置三元组的任意一个分量          \n");
	printf("6:两个三元组的对应分量相加        \n");
	printf("7:两个三元组的对应分量相减        \n");
	printf("8:给三元组的各分量同乘一个比例因子\n");
	printf("9:销毁三元组                      \n");
	printf("10:判断是否升序(如果T的三个元素按升序排序,则返回1,否则返回0)                     \n");
    printf("11:判断是否升序(如果T的三个元素按降序排序,则返回1,否则返回0)                     \n");	 
	printf("**********************************\n");
	printf("输入数字选取您所需要的功能        \n");
	scanf("%d",&val); 
	switch(val)
	{
		case 1:print(T);break;
		case 2:
		       printf("请输入需要获取元素的位置:");
	           scanf("%d",&i);
	           printf("%f",Getelem(T,i));
			   break;
		case 3:max(T);break; 
		case 4:min(T);break;
		case 5:Putelem(T);break;
		case 6:Sum(T);break;
	 	case 7:DifferenceVaule(T);break;
		case 8:CoRide(T);break;
		case 9:DestroyTriplet(T);break;
		case 10:printf("%d",isAscending(T));break;
		case 11:printf("%d",isDecending(T));break;       
	} 
}
int main()
{
	Status j,k;
	Triplet T;
	ElemType v0,v1,v2;
	printf("请输入三元组的值:\n");
	scanf("%f %f %f",&v0,&v1,&v2);
	initTriplet(T,v0,v1,v2);
	for(j=0;j<100;j++)
	{
		printf("是否执行程序?(1代表继续执行,0代表终止程序)\n");
		scanf("%d",&k);
		if(k!=1)
		{
			break;
		}
		if(k==0)
		{
			break;
		}else
		{
			menu(T);
		    printf("\n");
		}
		
	}	
}

控制台:
显示三元组的值
获取三元组的值
三元组中的最大值
三元组中的最小值
置三元组中的值
三元组中的两个分量对应相加
三元组中的两个分量对应相减
给三元组各分量同乘一个比例因子
判断是否升序或者降序
销毁三元组

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花花叔叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值