超市管理系统

项目介绍

项目概述

本次项目为实现超市的交易系统,该系统主要包含:管理员、收银以及后勤三个主要模块。
超市管理的主要目标就是建立一个效率高、无差错、通用性好又节时的超市管理系统。通过对超市所有出入库活动的管理和控制及对仓库数据有效地统计和分析,以保证超市的物流,使决策人员及早发现问题,采取相应措施,调整库存结构缩短储备周期,加速资金周转,最大限度的降低库存占用。

需求分析

此系统必须可以用来控制合理的库存费用、适时适量的库存数量,使企业生产活动效率最大化。本库存管理系统是一套对货品入库、出库、库存进行全面管理的系统。
在管理内容上,它的主要功能包括:
管理员:主要包含后勤管理、VIP的注册、设置收款账户这三个主要功能。
收银:主要包含商品的销售和VIP的登录这两个功能。
后勤:主要包含对商品的添加、补货、 报损、下架以及修改商品信息等。

详细设计

管理员:

管理后勤:

增、删、改、遍历

注册VIP:

增、删、改、遍历

收款账户:

设置账号,查看收款记录

后勤:

添加新商品
下架
补货
报损
修改商品信息
查找商品
查看需要补货的商品

收银:

销售

输入若干条形码
输入一个扣款账号 (生成一条扣款操作记录)
VIP登录

VIP:

销售 ,积分

image.png

部分功能演示

管理员模块

image.png
image.png

管理后勤--添加/遍历后勤

image.png
image.png

后勤模块

image.png

添加新/遍历商品

image.png
image.png

销售模块

image.png
image.png

部分代码展示

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)

错误分析

删除功能错误

在测试删除功能时,出现只能删除第一条信息的情况。

image.png
image.png

原因:由于把print写在了for循环里面,导致其会不停输出。
image.png
image.png

积分付款错误

积分付款时会出现扣款为负的现象

image.png
image.png

原因:未判断积分是否足够支持本次付款。
image.png

收获总结

在这次实训中,我对c语言有了一个更深的了解认识,通过这次实训,也使我发现了许多问题,我认识到自己还有很多的知识没学好,基础知识没理清。
编写代码的过程中,一串代码的往往需要反复的测试,执行,才能完善,在编译报错的情况下,又需要反复的去检查。而也有可能在编译通过之后,执行后的结果并不是我预料和想要的结果。这就可能是代码中出了其他的错误,又需要反复的检查与改动。所以,这要求我在编写代码的过程中要更加的细心。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容