2024大作业

1. (起评分 80)请使用线性表编写程序,实现一在线商城对商品进行管理,商 城客户可以查询商品信息,商城的商家可以添加、删除、查询、修改自己发布的 商品信息。 要求: 商品用户分为客户和商家。 客户可以在程序中查询商家发布的商品信息。 商家可以在程序中对自己发布的商品进行添加、删除、查询、修改操作。 代码符合规范,正确、易读、易操作。 提交材料包括:

(1) 对数据结构的分析,其逻辑结构、存储结构;

(2) 系统实现思路,可用流程图表示;

(3) 编码实现系统(包括代码和运行结果的截图);

(4) 分析代码的运行效率,如时间复杂度和空间复杂度


  1. 对数据结构的分析,其逻辑结构、存储结构

在这里用了顺序表,先对单个商品的数量和价格构造一个结构,

再用了另一个结构构造了以单个商品组成的数组顺序表,并对这个顺序表给了一个length来记录顺序表的长度,这样表的每个下标可以对应该单品的数量价格和位置,其中表的下标为商品位置。

  1. 系统实现思路,可用流程图表示

3.编码实现系统

下面是函数包(初始化,添加,删除,查询,修改,输出等)

(1)初始化

int InitList(SqList &L)//顺序表初始化 
{
	L.elem = (Good*)malloc(MAX_SIZE*sizeof(Good));
	if(!L.elem)
	{
		printf("创建位置失败!\n");
		return FALSE;
	}
	printf("创建位置成功!\n");
	L.elem[1].num = 452; L.elem[1].price = 23.14;
	L.elem[2].num =  78; L.elem[2].price = 65.10;
	L.elem[3].num = 452; L.elem[3].price = 23.14;
	L.elem[4].num =  46; L.elem[4].price = 56.00;
	L.elem[5].num =  95; L.elem[5].price = 24.36;
	L.elem[6].num =  14; L.elem[6].price = 47.29;
	L.elem[7].num = 786; L.elem[7].price = 45.99;
	L.elem[8].num =  37; L.elem[8].price = 99.99;
	L.length = 8;
	return OK;
}

(2)添加

int ListInsert(SqList &L,int i,int num,float price)//添加商品信息
{
	if((i<1)||(i>L.length+1))
	{
		printf("不在正确位置,添加失败!\n");
		return FALSE;
	} 
	if(L.length == MAX_SIZE) 
	{
		printf("位置已满,添加失败!\n");
		return FALSE;
	}
	for(int j = L.length+1;j >= i;j--)
	{
		L.elem[j] = L.elem[j-1];
	}
	L.elem[i].num = num;
	L.elem[i].price = price;
	L.length++;
	printf("添加成功!"); 
	return OK;
}

(3)删除

int ListDelete(SqList &L,int i)//删除商品
{
	if((i<1)||(i>L.length)) {
		printf("删除失败!\n");
		return FALSE;
	}
	for(int j = i;j<=L.length-1;j++)
	{
		L.elem[j] = L.elem[j+1];
	}
	L.length--;
	printf("删除成功!\n");
	return OK;
}

(4)查询

void ListSearch(SqList &L,int i)//查询商品信息
{
	if(L.length == 0)
	{
		printf("无商品!"); 
	}
	if((i<1)||(i>L.length)){
		printf("搜索失败,请重新输入\n");
		return; 
	}
	printf("查询结果为:\n"); 
	printf("第%d个商品:商品数量%d;商品价格%.3f\n",i,L.elem[i].num,L.elem[i].price);
}

(5)修改

void ListChange(SqList &L,int i,int num,float price)//修改商品的数量和价格 
{
	if((i<1) || (i > L.length))
	{
		printf("修改失败!");
		return; 
	}
	L.elem[i].num = num;
	L.elem[i].price = price;
	printf("修改成功!"); 
}

(6)输出 

void ListPrint(SqList &L)
{
	int i;
	for(i = 1; i <= L.length;i++)
	{
		printf("第%d个商品的数量为%d,价格为%.3f\n",i,L.elem[i].num,L.elem[i].price);
	}
}

主函数 

int main()
{
	int user,select,i,j,k,number;
	float price;
	SqList L;
	InitList(L); 
	printf("请输入数字1或2来进行操作:1表示商家,2表示客户:\n"); 
	scanf("%d",&user);
	int flag = 1;
	int newflag = 1;
	if(user == 1)
	{
		while(flag != 0)
		{
			printf("请输入要进行的操作;添加按1;删除按2;查询按3;修改按4\n");
			scanf("%d",&select);
			switch(select)
			{
				case 1:
					printf("依次输入添加位置,商品数量,商品价格\n");
					scanf("%d%d%f",&i,&number,&price);
					ListInsert(L,i,number,price);
					break;
				case 2:
					printf("请输入要删除的商品位置\n");
					scanf("%d",&i);
					ListDelete(L,i);
					break;
				case 3:
					printf("请输入要查询的商品位置\n");
					scanf("%d",&i);
					ListSearch(L,i);
					break;
				case 4:
					printf("请依次输入要修改的商品位置和该商品的新数量和新价格\n");
					int newnum;float newprice;
					scanf("%d%d%f",&i,&newnum,&newprice);
					ListChange(L,i,newnum,newprice);
					break; 
			}
			printf("输入0停止操作;输入1继续操作");//可自行选择停止和进行操作 
			scanf("%d",&flag);
		}
	}
	else if(user == 2)
	{
		while(newflag!=0)
		{
			printf("请输入要查询的商品位置\n");
			scanf("%d",&i);
			ListSearch(L,i);
		    printf("输入0停止操作;输入1继续操作\n");
			scanf("%d",&newflag);
		}
	}
	else{
		printf("操作失败!"); 
	}
	ListPrint(L);//输出已知的所有商品信息 
	
	return 0;
}

 完整代码

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE 0
#define MAX_SIZE 100
typedef struct
{
	int num;
	float price;
}Good;//对单个商品的信息结构 
typedef struct
{
	Good *elem;
	int length;
}SqList;//关于Good数组类型的顺序表 
int InitList(SqList &L)//顺序表初始化 
{
	L.elem = (Good*)malloc(MAX_SIZE*sizeof(Good));
	if(!L.elem)
	{
		printf("创建位置失败!\n");
		return FALSE;
	}
	printf("创建位置成功!\n");
	L.elem[1].num = 452; L.elem[1].price = 23.14;
	L.elem[2].num =  78; L.elem[2].price = 65.10;
	L.elem[3].num = 452; L.elem[3].price = 23.14;
	L.elem[4].num =  46; L.elem[4].price = 56.00;
	L.elem[5].num =  95; L.elem[5].price = 24.36;
	L.elem[6].num =  14; L.elem[6].price = 47.29;
	L.elem[7].num = 786; L.elem[7].price = 45.99;
	L.elem[8].num =  37; L.elem[8].price = 99.99;
	L.length = 8;
	return OK;
}
int ListInsert(SqList &L,int i,int num,float price)//添加商品信息
{
	if((i<1)||(i>L.length+1))
	{
		printf("不在正确位置,添加失败!\n");
		return FALSE;
	} 
	if(L.length == MAX_SIZE) 
	{
		printf("位置已满,添加失败!\n");
		return FALSE;
	}
	for(int j = L.length+1;j >= i;j--)
	{
		L.elem[j] = L.elem[j-1];
	}
	L.elem[i].num = num;
	L.elem[i].price = price;
	L.length++;
	printf("添加成功!"); 
	return OK;
}
int ListDelete(SqList &L,int i)//删除商品
{
	if((i<1)||(i>L.length)) {
		printf("删除失败!\n");
		return FALSE;
	}
	for(int j = i;j<=L.length-1;j++)
	{
		L.elem[j] = L.elem[j+1];
	}
	L.length--;
	printf("删除成功!\n");
	return OK;
}
void ListSearch(SqList &L,int i)//查询商品信息
{
	if(L.length == 0)
	{
		printf("无商品!"); 
	}
	if((i<1)||(i>L.length)){
		printf("搜索失败,请重新输入\n");
		return; 
	}
	printf("查询结果为:\n"); 
	printf("第%d个商品:商品数量%d;商品价格%.3f\n",i,L.elem[i].num,L.elem[i].price);
}
void ListChange(SqList &L,int i,int num,float price)//修改商品的数量和价格 
{
	if((i<1) || (i > L.length))
	{
		printf("修改失败!");
		return; 
	}
	L.elem[i].num = num;
	L.elem[i].price = price;
	printf("修改成功!"); 
}
void ListPrint(SqList &L)
{
	int i;
	for(i = 1; i <= L.length;i++)
	{
		printf("第%d个商品的数量为%d,价格为%.3f\n",i,L.elem[i].num,L.elem[i].price);
	}
}
int main()
{
	int user,select,i,j,k,number;
	float price;
	SqList L;
	InitList(L); 
	printf("请输入数字1或2来进行操作:1表示商家,2表示客户:\n"); 
	scanf("%d",&user);
	int flag = 1;
	int newflag = 1;
	if(user == 1)
	{
		while(flag != 0)
		{
			printf("请输入要进行的操作;添加按1;删除按2;查询按3;修改按4\n");
			scanf("%d",&select);
			switch(select)
			{
				case 1:
					printf("依次输入添加位置,商品数量,商品价格\n");
					scanf("%d%d%f",&i,&number,&price);
					ListInsert(L,i,number,price);
					break;
				case 2:
					printf("请输入要删除的商品位置\n");
					scanf("%d",&i);
					ListDelete(L,i);
					break;
				case 3:
					printf("请输入要查询的商品位置\n");
					scanf("%d",&i);
					ListSearch(L,i);
					break;
				case 4:
					printf("请依次输入要修改的商品位置和该商品的新数量和新价格\n");
					int newnum;float newprice;
					scanf("%d%d%f",&i,&newnum,&newprice);
					ListChange(L,i,newnum,newprice);
					break; 
			}
			printf("输入0停止操作;输入1继续操作");//可自行选择停止和进行操作 
			scanf("%d",&flag);
		}
	}
	else if(user == 2)
	{
		while(newflag!=0)
		{
			printf("请输入要查询的商品位置\n");
			scanf("%d",&i);
			ListSearch(L,i);
		    printf("输入0停止操作;输入1继续操作\n");
			scanf("%d",&newflag);
		}
	}
	else{
		printf("操作失败!"); 
	}
	ListPrint(L);//输出已知的所有商品信息 
	
	return 0;
}

4.运行结果

如果为客户(查询)

若为商家(添加,删除,查询,修改各一遍)

 

5.时间复杂度和空间复杂度

对于我这个代码刚开始就已经初始化了一个100个元素的顺序表,就像一个超市,它所可以容纳的空间有限,可以根据实际情况改变这个数值,但是如果是大型的线上平台购物的类似空间的话,如果商品的种类的变化很快,这里就会浪费很多空间。所以大致来说,空间的利用率还有待提高

对于时间复杂度,在这里时间复杂度为O(1),因为在这里每一步都需要去操作,因为是顺序表,可以直接的找到商品,并可以对该商品进行操作

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值