#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "windows.h"
// 定义超市物品结构体
struct Item
{
int id; // 物品编号
char name[50]; // 物品名称
int shelf; // 物品所在货架号
int quantity; // 物品数量
float price; // 物品单价
char date[20]; // 物品进货时间
};
// 定义二叉搜索树结点
struct TreeNode
{
struct Item* item;
struct TreeNode* left; //左子树
struct TreeNode* right; //右子树
};
struct TreeNode* insert_data(struct TreeNode* root, struct Item* item); //数据插入函数
struct TreeNode* buildTreeFromFile(char* filename); //从文件中读取物品数据构建二叉搜索树
void insert(struct TreeNode* root); //插入调用函数
void idsearch(struct TreeNode* root); //编号查找调用
void searchById(struct TreeNode* root, int id); //按编号查找物品
void NameSezrch(struct TreeNode* root); //名称查找调用函数
void searchByName(struct TreeNode* root, char* name); //按名称查找物品
void DateSearch(struct TreeNode* root); //日期查找调用函数
void searchByDate(struct TreeNode* root, char* date); //按进货时间查找物品
void print(struct TreeNode* root); // 打印所有物品信息
void goodsmenu(struct TreeNode * root); //物品信息调用函数
void mainmenu(); //主菜单
void shelfManagement(struct TreeNode* root); // 货架管理
void purchase(struct TreeNode* root); // 进货
void sell(struct TreeNode* root); //出货功能
void saveTreeToFile(struct TreeNode* root,FILE *fp);//将更新的数据保存到文件中
void saveData(struct TreeNode * root);//存入更新的数据
//用于判断是否存在该货物
int tag;
char ch[]={"goods.txt"};
int main()
{
//设计背景以及字体颜色
//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_INTENSITY);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15 | 8 | 128 | 64);
HANDLE JB = GetStdHandle(STD_OUTPUT_HANDLE);
//将文件内容创建成树
struct TreeNode* root = buildTreeFromFile(ch);
printf("\n按任意键继续进入管理系统");
getchar();
while (1)
{
mainmenu();
int choice;
scanf("%d", &choice);
switch (choice)
{
//按编号查找物品
case 1:
{
idsearch(root);
break;
}
//按名称查找物品
case 2:
{
NameSezrch(root);
break;
}
//按进货时间查找物品
case 3:
{
DateSearch(root);
break;
}
//货物总览
case 4:
{
goodsmenu(root);
printf("\n按任意键返回主菜单!");
getchar();
break;
}
//货架管理
case 5:
{
shelfManagement(root);
break;
}
// 进货
case 6:
{
purchase(root);
break;
}
//出货
case 7:
{
sell(root);
break;
}
//退出系统并保存数据进文件
case 8:
{
saveData(root);
printf("数据已更新!\n");
printf("感谢使用系统,欢迎下次使用!\n");
getchar();
return 0;
}
default:
printf("无效选择!重新输入!\n");
}
}
return 0;
}
void mainmenu()
{
system("cls");
printf(" *^*^*超市物品信息管理系统*^*^* \n");
printf("*****========================*****\n");
printf("*****========================*****\n");
printf("*** 1. 按编号查询 ***\n");
printf("*** 2. 按名称查询 ***\n");
printf("*** 3. 按进货时间查询 ***\n");
printf("*** 4. 货物总览 ***\n");
printf("*** 5. 货架管理 ***\n");
printf("*** 6. 进货 ***\n");
printf("*** 7. 出货 ***\n");
printf("*** 8. 退出系统 ***\n");
printf("*****========================*****\n");
printf("*****========================*****\n");
printf("请选择功能: \n");
}
void insert(struct TreeNode* root)
{
system("cls");
struct Item* item = (struct Item*)malloc(sizeof(struct Item));
printf("输入物品编号: ");
scanf("%d", &item->id);
printf("\n输入物品名称: ");
scanf("%s", item->name);
printf("\n输入物品货架编号: ");
scanf("%d", &item->shelf);
printf("\n输入物品数量: ");
scanf("%d", &item->quantity);
printf("\n输入物品价格: ");
scanf("%f", &item->price);
printf("\n输入进货日期: ");
scanf("%s", item->date);
insert_data(root,item);
}
// 插入结点
struct TreeNode* insert_data(struct TreeNode* root, struct Item* item)
{
if (!root)
{
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->item = item;
node->left = NULL;
node->right = NULL;
return node;
}
if (item->id < root->item->id)
{
root->left = insert_data(root->left, item);
}
else
{
root->right = insert_data(root->right, item);
}
return root;
}
// 从文件中读取物品数据构建二叉搜索树
struct TreeNode* buildTreeFromFile(char* filename)
{
FILE* fp = fopen(filename, "r");
if (!fp)
{
printf("not found 404!\n", filename);
return NULL;
}
struct TreeNode* root = NULL;
// 逐行读取数据并插入二叉搜索树
char buffer[1024];
while (fgets(buffer, sizeof(buffer), fp))
{
// 去除换行符
char* pos = strchr(buffer, '\n');
if (pos)
{
*pos = '\0';
}
// 解析数据
char* token = strtok(buffer, ",");
struct Item* item = (struct Item*)malloc(sizeof(struct Item));
item->id = atoi(token);
token = strtok(NULL, ",");
strcpy(item->name, token);
token = strtok(NULL, ",");
item->shelf = atoi(token);
token = strtok(NULL, ",");
item->quantity = atoi(token);
token = strtok(NULL, ",");
item->price = atof(token);
token = strtok(NULL, ",");
strcpy(item->date, token);
// 插入二叉搜索树
root = insert_data(root, item);
}
fclose(fp);
printf("载入系统成功!\n");
return root;
}
// 删除结点
struct TreeNode* deleteNode(struct TreeNode* root, int id)
{
if (!root)
{
printf("Item not found.\n");
return NULL;
}
if (id < root->item->id)
{
root->left = deleteNode(root->left, id);
}
else
if (id > root->item->id)
{
root->right = deleteNode(root->right, id);
}
else
{
// 找到要删除的结点
// 情况1:该结点没有子结点
if (!root->left && !root->right)
{
free(root);
return NULL;
}
// 情况2:该结点只有左子结点或右子结点
if (!root->left)
{
struct TreeNode* temp = root->right;
free(root);
return temp;
}
else
if (!root->right)
{
struct TreeNode* temp = root->left;
free(root);
return temp;
}
// 情况3:该结点既有左子结点又有右子结点
struct TreeNode* temp = root->right;
//理解为找到右节点的最左子节点
while (temp->left)
{
temp = temp->left;
}
root->item = temp->item;
root->right = deleteNode(root->right, temp->item->id);
}
return root;
}
void idsearch(struct TreeNode* root)
{
system("cls");
int id;
printf("请输入物品的编号: \n");
scanf("%d", &id);
searchById(root,id);
if(tag==0)
{
printf("不存在该货物!");
printf("\n按任意键返回主菜单!");
getchar();
getchar();
}
}
//按编号查找物品
void searchById(struct TreeNode* root, int id)
{
tag=0;
if (!root)
{
printf("not found.404!\n");
return;
}
if (id == root->item->id)
{
tag=1;
printf("||物品编号||物品名称||货架编号||物品数量||物品单价|| 物品日期 ||\n");
printf(" %4d %10s %4d %4d %6.2f %s\n",
root->item->id, root->item->name, root->item->shelf, root->item->quantity, root->item->price, root->item->date);
printf("\n搜索完成!");
printf("\n按任意键返回主菜单!");
getchar();
getchar();
}
else
if (id < root->item->id)
{
searchById(root->left, id);
}
else
{
searchById(root->right, id);
}
}
void NameSezrch(struct TreeNode* root)
{
tag=0;
system("cls");
char name[50]={'\0'};
printf("请输入物品名称: \n");
scanf("%s", name);
searchByName(root, name);
if(tag==0)
{
printf("不存在该货物!");
printf("\n按任意键返回主菜单!");
getchar();
getchar();
}
}
// 按名称查找物品
void searchByName(struct TreeNode* root, char* name)
{
if (!root)
{
return;
}
if (strcmp(root->item->name,name) == 0)
{
tag=1;
printf("||物品编号||物品名称||货架编号||物品数量||物品单价|| 物品日期 ||\n");
printf(" %4d %10s %4d %4d %6.2f %s\n",
root->item->id, root->item->name, root->item->shelf, root->item->quantity, root->item->price, root->item->date);
printf("\n搜索完成!");
printf("\n按任意键返回主菜单!");
getchar();
getchar();
}
searchByName(root->left, name);
searchByName(root->right, name);
}
void DateSearch(struct TreeNode* root)
{
system("cls");
tag=0;
printf("请输入物品的进货日期: \n");
char date[20];
printf("Enter purchase date: ");
scanf("%s", date);
searchByDate(root, date);
if(tag==0)
{
printf("不存在该货物!");
printf("\n按任意键返回主菜单!");
getchar();
getchar();
}
}
// 按进货时间查找物品
void searchByDate(struct TreeNode* root, char* date)
{
if (!root)
{
return;
}
searchByDate(root->left, date);
if (strcmp(root->item->date, date) == 0)
{
tag=1;
printf("||物品编号||物品名称||货架编号||物品数量||物品单价|| 物品日期 ||\n");
printf(" %4d %10s %4d %4d %6.2f %s\n",
root->item->id, root->item->name, root->item->shelf, root->item->quantity, root->item->price, root->item->date);
printf("\n搜索完成!");
printf("\n按任意键返回主菜单!");
getchar();
getchar();
}
searchByDate(root->right, date);
}
//物品的栏框
void goodsmenu(struct TreeNode * root)
{
system("cls");
printf("||物品编号||物品名称||货架编号||物品数量||物品单价|| 物品日期 ||\n");
print(root);
getchar();
return ;
}
// 打印所有物品信息
void print(struct TreeNode* root)
{
if (!root)
{
return;
}
print(root->left);
printf(" %4d %10s %4d %4d %6.2f %s\n",
root->item->id, root->item->name, root->item->shelf, root->item->quantity, root->item->price, root->item->date);
print(root->right);
}
// 货架管理
void shelfManagement(struct TreeNode* root)
{
int id,shelf;
goodsmenu(root);
printf("\n输入需要更新货架的物品编号: ");
scanf("%d",&id);
struct TreeNode* node = NULL;
struct Item* item = NULL;
// 查找物品是否存在
node = root;
while (node)
{
if (id == node->item->id)
{
item = node->item;
break;
}
else
if (id < node->item->id)
{
node = node->left;
}
else
{
node = node->right;
}
}
if (!item)
{
printf("请仔细看看,货物上有这个吗\n");
getchar();
getchar();
return;
}
printf("请输入更换的货架: ");
scanf("%d", &shelf);
item->shelf = shelf;
printf("更换货架成功哩!\n");
getchar();
getchar();
}
// 进货
void purchase(struct TreeNode* root)
{
int id,quantity;
goodsmenu(root);
printf("输入你要购入物品的编号: ");
scanf("%d", &id);
struct TreeNode* node = NULL;
struct Item* item = NULL;
// 查找物品是否存在
node = root;
while (node)
{
if (id == node->item->id)
{
item = node->item;
break;
}
else
if (id < node->item->id)
{
node = node->left;
}
else
{
node = node->right;
}
}
if (item == NULL)
{
getchar();
printf("当前超市没有这个货物呢,是否需要购入(Y,N):\n");
char ch;
ch=getchar();
if(ch == 'Y')
{
insert(root);
printf("购入成功!\n可以去货架看看哦");
getchar();
}
else
{
printf("期待店长的购入哦!");
getchar();
}
return;
}
printf("店长需要购入多少: ");
scanf("%d", &quantity);
item->quantity += quantity;
printf("购入成功!!\n");
getchar();
}
//出货功能
void sell(struct TreeNode* root)
{
goodsmenu(root);
int id, quantity;
printf("请输入你要出货的物品编号: ");
scanf("%d", &id);
struct TreeNode* node = NULL;
struct Item* item = NULL;
// 查找物品是否存在
node = root;
while (node)
{
if (id == node->item->id)
{
item = node->item;
break;
}
else
if (id < node->item->id)
{
node = node->left;
}
else
{
node = node->right;
}
}
if (!item)
{
printf("没找到货物呢,请好好看看\n");
getchar();
return;
}
printf("请输入要出货的数量: ");
scanf("%d", &quantity);
if (item->quantity < quantity)
{
printf("库存不足,请补货在出货\n");
getchar();
getchar();
return;
}
item->quantity -= quantity;
printf("出货成功!\n");
getchar();
}
//存入更新的数据
void saveData(struct TreeNode * root)
{
//用写的方式打开
FILE* fp = fopen(ch, "w");
saveTreeToFile(root,fp);
fclose(fp);
}
//将更新的数据保存到文件中
void saveTreeToFile(struct TreeNode* root,FILE *fp)
{
// 中序遍历存放BST数据
if (root)
{
//保存结点数据
fprintf(fp,"%d,%s,%d,%d,%.2f,%s\n",
root->item->id, root->item->name, root->item->shelf, root->item->quantity, root->item->price, root->item->date);
saveTreeToFile(root->left,fp);
// 右子树
saveTreeToFile(root->right,fp);
}
}
今天将管理系统的功能都实现了,在一直找毛病并修改毛病,现在已经基本完善
初始界面:
1.编号查找界面:
2.名称查找界面:
3.按进货时间查找界面:
4.货物总览界面:
5.货架管理界面:
6.进货界面:
当购入不存在的货物时会进行创建和新插入数据:
在咨询货物总览就会出现:
7.出货界面
8.退出系统会更新文件内容,下次打开就是修改后的内容。