要求
问题描述
设计一个简单商品分类管理系统,对商品进行分类管理.
基本要求
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);//关掉系统