项目介绍
项目概述
本次项目为实现超市的交易系统,该系统主要包含:管理员、收银以及后勤三个主要模块。
超市管理的主要目标就是建立一个效率高、无差错、通用性好又节时的超市管理系统。通过对超市所有出入库活动的管理和控制及对仓库数据有效地统计和分析,以保证超市的物流,使决策人员及早发现问题,采取相应措施,调整库存结构缩短储备周期,加速资金周转,最大限度的降低库存占用。
需求分析
此系统必须可以用来控制合理的库存费用、适时适量的库存数量,使企业生产活动效率最大化。本库存管理系统是一套对货品入库、出库、库存进行全面管理的系统。
在管理内容上,它的主要功能包括:
管理员:主要包含后勤管理、VIP的注册、设置收款账户这三个主要功能。
收银:主要包含商品的销售和VIP的登录这两个功能。
后勤:主要包含对商品的添加、补货、 报损、下架以及修改商品信息等。
详细设计
管理员:
管理后勤:
增、删、改、遍历
注册VIP:
增、删、改、遍历
收款账户:
设置账号,查看收款记录
后勤:
添加新商品
下架
补货
报损
修改商品信息
查找商品
查看需要补货的商品
收银:
销售
输入若干条形码
输入一个扣款账号 (生成一条扣款操作记录)
VIP登录
VIP:
销售 ,积分
部分功能演示
管理员模块
管理后勤--添加/遍历后勤
后勤模块
添加新/遍历商品
销售模块
部分代码展示
Makefile文件展示
CC=gcc
STD=-std=gnu99
FLAG=-Wall -Werror
TARGE=supermarket
OBJECT=main.o tools.o Administrator.o logistics.o cashier.o
$(TARGE):$(OBJECT)
$(CC) $(OBJECT) -o $(TARGE) && ./$(TARGE)
main.o:%.o:%.c Administrator.h logistics.h cashier.h
$(CC) $(STD) $(FLAG) -c $<
tools.o:%.o:%.c tools.c tools.h
$(CC) $(STD) $(FLAG) -c $<
Administrator.o:Administrator.c Administrator.h
$(CC) $(STD) $(FLAG) -c $<
logistics.o:logistics.c logistics.h Administrator.h tools.h
$(CC) $(STD) $(FLAG) -c $<
cashier.o:cashier.c cashier.h Administrator.h logistics.h
$(CC) $(STD) $(FLAG) -c $<
clean:
rm -rf $(OBJECT) $(TARGE)
rm -rf *.h.gch
tools.c文件展示
#include "tools.h"
//获取按键
char get_cmd(char start,char end)
{
assert(start <= end);
puts("----------------------");
printf("请输入指令:");
for(;;)
{
char cmd = getch();
if(start <= cmd && cmd <= end)
{
printf("%c\n",cmd);
return cmd;
}
}
}
//显示信息
void print_sec(const char* msg,float sec)
{
printf("\33[01;32m %s \33[00m\n",msg);
usleep(1000000*sec);
}
//任意键继续
void anykey_continue(void)
{
stdin->_IO_read_ptr = stdin->_IO_read_end;
puts("按任意键继续...");
getch();
}
//获取字符串
char* get_str(char* str,size_t size)
{
assert(NULL!=str && size>1);
// 计算fgets读取了多少个字符
size_t len = strlen(fgets(str,size,stdin));
// 如果最后一个字符是'\n',则把它改为'\0'
if('\n' == str[len-1])
str[len-1] = '\0';
else
// 如果最后一个字符不是'\n',则说明缓冲区中有垃圾数据,则需要清理输入缓冲区
while('\n' != getchar());
return str;
}
//获取密码
char* get_passwd(char* passwd,size_t size)
{
int i = 0;
while(i < size-1)
{
passwd[i] = getch();
// 读取到退格键
if(127 == passwd[i])
{
// 数组中有已输入密码
if(i > 0)
{
// 删除一位密码
i--;
printf("\b \b");
}
continue;
}
i++;
printf("*");
}
passwd[size-1] = '\0';
printf("\n");
return passwd;
}
//二次确定
bool yes_or_no(void)
{
printf("是否确认此操作(y/n)?");
for(;;)
{
char cmd = getch();
if('y' == cmd || 'Y' == cmd || 'n' == cmd || 'N' == cmd)
{
printf("%c\n",cmd);
return 'y'==cmd || 'Y'==cmd;
}
}
}
// 通用的二进制保存数据
int save_data(void* base,size_t size,const char* path)
{
assert(NULL!=base && 0!=size && NULL!=path);
FILE* wfp = fopen(path,"w");
if(NULL == wfp)
{
printf("无法打开文件,无法保存数据!\n");
return 0;
}
int ret = fwrite(base,1,size,wfp);
fclose(wfp);
return ret;
}
// 通用的二进制加载数据
int load_data(void* base,size_t size,const char* path)
{
assert(NULL!=base && 0!=size && NULL!=path);
FILE* rfp = fopen(path,"r");
if(NULL == rfp)
{
printf("无法打开文件,加载数据失败!\n");
return 0;
}
int ret = fread(base,1,size,rfp);
fclose(rfp);
return ret;
}
全部代码详见gitee:
超市管理系统 · WUCHUANQI/WUCHUANQI - 码云 - 开源中国 (gitee.com)
错误分析
删除功能错误
在测试删除功能时,出现只能删除第一条信息的情况。
原因:由于把print写在了for循环里面,导致其会不停输出。
积分付款错误
积分付款时会出现扣款为负的现象
原因:未判断积分是否足够支持本次付款。
收获总结
在这次实训中,我对c语言有了一个更深的了解认识,通过这次实训,也使我发现了许多问题,我认识到自己还有很多的知识没学好,基础知识没理清。
编写代码的过程中,一串代码的往往需要反复的测试,执行,才能完善,在编译报错的情况下,又需要反复的去检查。而也有可能在编译通过之后,执行后的结果并不是我预料和想要的结果。这就可能是代码中出了其他的错误,又需要反复的检查与改动。所以,这要求我在编写代码的过程中要更加的细心。