C语言 --- 商品信息管理系统

要求

问题描述
设计一个简单商品分类管理系统,对商品进行分类管理.
基本要求
1、浏览当前商品分类目录的所有内容(子分类和当前目录下的商品)
2、切换当前分类目录到上一级分类目录或下一级子分类目录(扩展,切换到任何一个目录)或直接切换到根目录
3、在当前分类目录下添加新商品目录,或者添加新商品信息。
4、在当前目录下删除某个子商品分类或某个商品信息
5、在当前目录下修改某个商品或分类目录的信息
6、根据某个商品编号(或名称)在整个系统中查找某个商品并显示全部信息
7、设计合适的交互界面
8、管理系统数据的永久性保存。(选作)
基本要求
a) 数据描述:设计合适的数据信息,比如商品,分类目录等等
b) 设计合适的数据结构组织数据,以及设计算法实现需求

结构体设计

树形结构体

在这里插入图片描述

代码

struct list {//商品类别目录
	int num;//类别编号
	char name[20];//名称
	int sum;//类别种数
	int log;//读入标记
	struct List* next;
	struct Node* child;
};

struct node {//子目录
	int num;//类别编号
	char id[20];//商品编号
	char name[20];//商品或分类的名称
	double price;//商品价格
	struct node* next;//用单链表记录当前结点的所有不为空的子结点
};

功能设计

在这里插入图片描述

部分源代码

创建树代码

struct list* input()  {//获取商品类别目录
	struct list* head = NULL, * p1, * p2 = NULL;
	FILE* fp;  //文件指针变量fp
	logo = 0;//页数重置
	if ((fp = fopen(filename_list, "a+")) == NULL) {
		printf("1不能打开该文件!\n");
		exit(0);
	}
	if ((p1 = (struct list*)malloc(sizeof(struct list))) == NULL) {
		printf("分类1不能成功分配内存储块!");
		exit(0);
	}
	p1->next = NULL;
	p1->child = NULL;
	while ((fscanf(fp, "%d %s", &p1->num, p1->name)) != EOF) {//读取文件内容
		p1->sum = 0;
		p1->log = ++logo;//页数标记
		if (head == NULL)head = p1;
		else p2->next = p1;
		p2 = p1;
		if ((p1 = (struct list*)malloc(sizeof(struct list))) == NULL) {
			printf("分类2不能成功分配内存储块!");
			exit(0);
		}
		p1->next = NULL;
		p1->child = NULL;//类别下面的商品的链表头
	}
	input_Goods(head);//将商品信息添加到商品类别目录中
	fclose(fp);
	return head;
}

void input_Goods(struct list* h) {//从文件获取商品
	struct list* i = NULL;
	struct node* head = NULL, * p1, * p2 = NULL;
	FILE* fp;
	if ((fp = fopen(filename_goods, "a+")) == NULL) {
		printf("2不能打开该文件!\n");
		exit(0);
	}
	if ((p1 = (struct node*)malloc(sizeof(struct node))) == NULL) {
		printf("商品不能成功分配内存储块!");
		exit(0);
	}
	p1->next = NULL;
	for (i = h; i != NULL; i = i->next) {
		while ((fscanf(fp, "%d %s %s %lf", &p1->num, &p1->id, p1->name, &p1->price)) != EOF) {
			if (i->num == p1->num) {
				i->sum++;
				if (i->child == NULL)i->child = p1;
				else p2->next = p1;
				p2 = p1;
				if ((p1 = (struct node*)malloc(sizeof(struct node))) == NULL) {
					printf("商品不能成功分配内存储块!");
					exit(0);
				}
				p1->next = NULL;
			}
		} 
		rewind(fp);
	}
	fclose(fp);
}

循环遍历代码

//基本所有功能的遍历方法,第一个循环则可以改变类别信息,需要修改商品信息则可以增加第二个循环
 for (i = h; i != NULL; i = i->next) {
		if (i->num == num) {//先循环找到商品类别
				for (j = i->child; j != NULL; j = j->next) {
//输出类别下所有商品
					printf("%-7d%-8s%-16s%-8.2lf\n", j->num, j->id, j->name, j->price);
			break;
		}
	}
	for (j = i->child; j != NULL; j = j->next) {//根据需求改变商品
		if () {
		}
		else printf("");
		k = j;
	}

商品名称查重代码

//当调用完查重并修改相同的信息后将会递归重新调用这两个函数再次查重
void check_ALL(struct list* h, struct list* t,int *num,char *name) {
//检查修改的类别号或名称有无重复
	struct list* i = NULL;
//h为商品类别的头指针,t为当前修改的类别的指针
	int choice;
	if (num != NULL && name == NULL) {//修改的内容是类别号
		for (i = h; i != NULL; i = i->next) {
			if (i->num == *num && i != t ) {//寻找是否有相同类别号的商品类别
				while (*num == i->num) {//找到则提醒是否修改
					
			}
		}
	}//修改内容为名称
	if (num == NULL && name != NULL) {//寻找是否有相同名称的商品类别
		for (i = h; i != NULL; i = i->next) {
			if (strcmp(i->name,name) == 0 && i != t) {
				
			}
		}
	}
}


//类别下的商品的名称查重
void check_ONE(struct list* t, struct node* m, char* s) {
//t为当前修改的商品的类别指针,m为当前修改商品的指针
	struct node* i = NULL;
	int choice = 1;
	for (i = t->child; i != NULL; i = i->next) {
		if ((strcmp(i->id, s) == 0 || strcmp(i->name, s) == 0) && i != m)  {
			if (strcmp(i->id, s) == 0) {//商品编号存在
			......
			}
			if (strcmp(i->name, s) == 0) {//商品名称存在
			......
			}
		}
	}
}

实现效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

报告

在这里插入图片描述
详细设计

void get_filename(char *name);//获取文件所在路径
struct list* input();//读取商品类别目录
void input_Goods(struct list* h);//读取商品信息函数
void add(struct list* h);//添加商品函数
void add_ALL(struct list* h);//添加一个商品类别信息函数
void add_ONE(struct list* h);//添加一个商品信息函数
struct list* delete(struct list* h);//删除商品函数
struct list* delete_ALL(struct list* h);//删除一个商品类别
void delete_ONE(struct list* h);//删除目录里的单个商品
void search (struct list* h);//查找商品函数
void change(struct list* h);//修改功能函数
void change_ALL(struct list* h);//修改目录
void change_ONE(struct list* h);//修改商品
struct list* display(struct list* h);//查阅商品函数
struct list* display_ALL(struct list* h);//查阅全部
struct list* display_ONE(struct list* h);//翻页查阅
struct list* display_BOOK(struct list* h);//目录式查阅
void display_Goods(struct list* h, int num);//展示一个商品函数
void check_ALL(struct list* h, struct list* t,int *m,char *s);//检查修改时数据有没有重复函数
void check_ONE(struct list* t, struct node* m, char* s);//检查修改商品时商品数据有误冲突
void close(struct list* h);//关掉系统

在这里插入图片描述
报告+全部源代码+可执行文件+数据文件

设计一个商品销售管理程序。该程序应该具有以下功能: (1)录入、修改、删除某商品信息; (2)显示所有商品信息; (3)按商品编号由小到大的顺序显示商品信息; (4)按商品销售数量从大到小的顺序显示商品信息; (5)按商品名称、商品编号、供货商等信息进行查询,若查询信息不存在,输出没找到的信息; (6)商品的销售; (7)统计缺货商品(可设定一个边界范围,如数量小于5,以便及时订货),并产生订货信息; (8)商品销售统计。 题目要求: (1)按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序,即在程序中加入异常处理,检查用户输入数据的有效性,以保证程序的健壮性; (2)商品信息应该包括商品编号、名称、规格、进货数量、销售数量、价格、供货商名称等; (3)为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单选项选则所需进行的操作项目,菜单要界面友好、清晰; (4)将所有商品信息存储在一个文件中,并实现文件的读写操作,即将输入的数据以文件的形式存盘,将原来已经存盘的文件读入内存,进行管理; (5)应保证测试用例测试程序的各种边缘情况。 输入要求: 应用程序运行后,在屏幕上显示一个菜单。用户可以根据需要,选定相应的操作项目。进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。 输出要求: (1)应用程序运行后,在屏幕上显示一个菜单。 (2)要求用户输入数据时,要给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值