题目描述
  超市中商品分为四类,分别是食品、化妆品、日用品和饮料。每种商品都包含商品名称、价格、库存量和生产厂家、品牌等信息。
  主要完成对商品的销售、统计和简单管理。

功能要求
1.销售功能(客户):购买商品时,先输入类别,然后输入商品名称,并在库存中查找该商品的相关信息。如果有库存量,输入购买的数量,进行相应计算。如果库存量不够,给出提示信息,结束购买。
2.商品简单管理功能(管理员):
(1)添加功能:主要完成商品信息的添加。
(2)查询功能:可按商品类别、商品名称、生产厂家进行查询。若存在相应信息,输出所查询的信息,若不存在该记录,则提示“该记录不存在!”。
(3)修改功能:可根据查询结果对相应的记录进行修改。
(4)删除功能:主要完成商品信息的删除。先输入商品类别,再输入要删除的商品名称,根据查询结果删除该物品的记录,如果该商品不在物品库中,则提示“该商品不存在”。
(5)统计功能:输出当前库存中所有商品的总数及详细信息;可按商品的价格、库存量、生产厂家进行统计,输出统计信息时,要按从大到小进行排序。
(6)商品信息存盘:将当前程序中的商品信息存入文件中。
(7)读出信息:从文件中将商品信息读入程序。

设计思路
  通过各种自定义函数实现程序模块化思想,将大问题转换为小问题,再逐个解决问题,主要利用自定义函数,结构体和、指针和链表。

调用函数
ITEM *Build(); //超市商品初始化
int Choice(void); //第一个选择菜单
void Purchase(ITEM *items); //实现“客户”功能
void Contents(ITEM *items, char cc[20]); //实现“客户”菜单功能
ITEM *Find(char ca[20], char name[], ITEM *head); //按照用户输入的“商品名称”查询并返回对应查询结果,否则返回NULL
int Menu(void); //实现“管理员”功能
void Add(ITEM *items); //实现“添加”功能
void Inquire(ITEM *items); //实现“查询”的框架功能
ITEM *Seek(ITEM *items); //实现“查询”的核心功能,类似于上Find函数
void Modify(ITEM *items); //实现“修改”功能
ITEM *Delete(ITEM *items); //实现“删除”功能
ITEM *Statistics(ITEM *items); //实现“统计”的框架功能
ITEM *GetMid(ITEM *items);
ITEM *LinkBy(ITEM *x, ITEM *y, float a, int b);
ITEM *StatisticsBy(ITEM *items, float a, int b); //利用归并排序
void Print(ITEM *items); //实现“输出”功能
void Storage(ITEM *items); //实现“文件存盘”功能
ITEM *Open(); //实现“文件读取”功能
(其中归并排序函数功能本人并未详细注释,可见另一帖子《归并排序》—>传送门)

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct item     //建立一个结构体储存超市商品
{char category[20];char name[20];float price;int stock;char manufacturer[20];char brand[20];struct item *next;
}ITEM;
ITEM *Build();      //超市商品初始化
int Choice(void);        //第一个选择菜单
void Purchase(ITEM *items);     //实现“客户”功能
void Contents(ITEM *items, char cc[20]);     //实现“客户”菜单功能
ITEM *Find(char ca[20], char name[], ITEM *head);        //按照用户输入的“商品名称”查询并返回对应查询结果,否则返回NULL
int Menu(void);     //实现“管理员”功能
void Add(ITEM *items);      //实现“添加”功能
void Inquire(ITEM *items);      //实现“查询”的框架功能
ITEM *Seek(ITEM *items);      //实现“查询”的核心功能,类似于上Find函数
void Modify(ITEM *items);       //实现“修改”功能
ITEM *Delete(ITEM *items);       //实现“删除”功能
ITEM *Statistics(ITEM *items);       //实现“统计”的框架功能
ITEM *GetMid(ITEM *items);
ITEM *LinkBy(ITEM *x, ITEM *y, float a, int b);
ITEM *StatisticsBy(ITEM *items, float a, int b);
void Print(ITEM *items);        //实现“输出”功能
void Storage(ITEM *items);      //实现“文件存盘”功能
ITEM *Open();        //实现“文件读取”功能
int main()
{ITEM *items;int c, n;items = Build();while(1){c = Choice();switch(c){case 1:Purchase(items);break;case 2:n = Menu();switch(n){case 1:Add(items);break;case 2:Inquire(items);break;case 3:Modify(items);break;case 4:items = Delete(items);break;case 5:items = Statistics(items);break;case 6:Storage(items);break;case 7:items = Open();break;case 0:printf("\n已退出!\n\n");break;default :printf("\n输入错误!\n\n");break;}break;case 0:printf("\n已退出!\n");exit(0);default :printf("\n输入错误!\n\n");break;}}return 0;
}ITEM *Build()           //超市商品初始化
{ITEM *head, *it1, *it2, *it3, *it4;it1 = (ITEM *)malloc(sizeof(ITEM));if(it1!=NULL){strcpy(it1->category, "食品");strcpy(it1->name, "红烧牛肉面");it1->price = 3.5;it1->stock = 48;strcpy(it1->manufacturer, "河南斯美特");strcpy(it1->brand, "思源");}it2 = (ITEM *)malloc(sizeof(ITEM));if(it2!=NULL){strcpy(it2->category, "化妆品");strcpy(it2->name, "男士润肤霜");it2->price = 69.9;it2->stock = 23;strcpy(it2->manufacturer, "德国进口");strcpy(it2->brand, "妮维雅");}it3 = (ITEM *)malloc(sizeof(ITEM));if(it3!=NULL){strcpy(it3->category, "日用品");strcpy(it3->name, "洗发露");it3->price = 23.5;it3->stock = 13;strcpy(it3->manufacturer, "广州宝洁");strcpy(it3->brand, "海飞丝");}it4 = (ITEM *)malloc(sizeof(ITEM));if(it4!=NULL){strcpy(it4->category, "饮料");strcpy(it4->name, "脉动");it4->price = 4.0;it4->stock = 35;strcpy(it4->manufacturer, "湖北达能");strcpy(it4->brand, "脉动");}head = it1;it1->next = it2;it2->next = it3;it3->next = it4;it4->next = NULL;return head;
}
int Choice(void)        //第一个选择菜单
{int c;printf("请选择功能:\n\1:销售功能(客户)\n\2:商品简单管理功能(管理员)\n\0:退出\n");scanf("%d", &c);return c;
}
void Purchase(ITEM *items)     //实现“客户”功能
{int c, m;ITEM *j;char name[20], ca[20];printf("\n当前商品有:\n");Contents(items, "食品");Contents(items, "化妆品");Contents(items, "日用品");Contents(items, "饮料");printf("\n请输入商品类别:\n\1:食品\n\2:化妆品\n\3:日用品\n\4:饮料\n\0:退出\n");scanf("%d", &c);if(c == 0)goto E;if(c == 1)strcpy(ca, "食品");else if(c == 2)strcpy(ca, "化妆品");else if(c == 3)strcpy(ca, "日用品");elsestrcpy(ca, "饮料");       //通过数字选择简化用户输入printf("\n请输入商品名称:\n");scanf("%s", name);j = Find(ca, name, items);if(j == NULL)printf("\n对不起,无此商品!\n");else{printf("\n请输入您要购买的数量:\n");scanf("%d", &m);if(m > j->stock)printf("\n对不起,库存不足!\n\n");else{j->stock -= m;printf("\n您共需付款%.2f元!\n谢谢购买,祝您购物愉快!\n\n", j->price*m);}}E:printf("\n已退出\n\n");}
void Contents(ITEM *items, char cc[20])     //实现“客户”菜单功能
{ITEM *it = items;printf("%s:\n\t", cc);while(it != NULL){if(strcmp(it->category, cc) == 0){printf("%s\t", it->name);}it = it->next;}printf("\n");
}
ITEM *Find(char ca[20], char name[], ITEM *head)        //按照用户输入的“商品名称”查询并返回对应链表节点,否则返回NULL
{ITEM *p = head;while(p != NULL){if(strcmp(p->category, ca) == 0 && strcmp(p->name, name) == 0){printf("\n该商品的信息:\n\价格:%.2f\n\生产厂家:%s\n\品牌:%s\n", p->price, p->manufacturer, p->brand);return p;}p = p->next;}return NULL;
}
int Menu(void)     //实现“管理员”功能
{int n;printf("\n请选择您需要的功能:\n\1:添加功能\n\2:查询功能\n\3:修改功能\n\4:删除功能\n\5:统计功能\n\6:商品信息存盘\n\7:读出商品信息\n\0:退出\n");scanf("%d", &n);return n;
}
void Add(ITEM *items)      //实现“添加”功能
{ITEM *p, *pr;p = (ITEM *)malloc(sizeof(ITEM));if(p != NULL){printf("\n请输入待添加商品的类别、名称、价格、库存量、生产厂家、品牌:\n");scanf("%s %s %f %d %s %s", p->category, p->name, &p->price, &p->stock, p->manufacturer, p->brand);}else{printf("\n申请内存失败!\n");exit(0);}pr = items;while(pr->next != NULL)     //寻找链表尾节点{pr = pr->next;}pr->next = p;p->next = NULL;printf("\n已添加!\n\n");
}
void Inquire(ITEM *items)      //实现“查询”的框架功能
{ITEM *p = Seek(items);if(p != NULL)printf("\n该商品的详细信息为:\n\类别:%s\n\名称:%s\n\价格:%.2f\n\库存量:%d\n\生产厂家:%s\n\品牌:%s\n\n", p->category, p->name, p->price, p->stock, p->manufacturer, p->brand);elseprintf("\n该记录不存在!\n\n");
}
ITEM *Seek(ITEM *items)      //实现“查询”的核心功能,类似于上Find函数
{ITEM *p = items, *ca;ca = (ITEM *)malloc(sizeof(ITEM));if(ca != NULL){printf("\n请输入待查商品的类别、名称、生产厂家:\n");scanf("%s %s %s", ca->category, ca->name, ca->manufacturer);}else{printf("\n申请内存失败!\n");exit(0);}while(p != NULL)        //不断往链表尾节点靠近,寻找待查节点{if(strcmp(p->category, ca->category) == 0 && strcmp(p->name, ca->name) == 0 && strcmp(p->manufacturer, ca->manufacturer) == 0){return p;}p = p->next;}return NULL;
}
void Modify(ITEM *items)       //实现“修改”功能
{ITEM *p = Seek(items);if(p != NULL){printf("\n请依次输入修改后的信息:类别、名称、价格、库存量、生产厂家、品牌:\n");scanf("%s %s %f %d %s %s", p->category, p->name, &p->price, &p->stock, p->manufacturer, p->brand);printf("\n已修改!\n\n");}else{printf("\n对不起,您输入有误!\n\n");}
}
ITEM *Delete(ITEM *items)       //实现“删除”功能
{ITEM *p = items, *d = items;char ca[20], na[20];printf("\n请输入待删除商品的类别:\n");scanf("%s", ca);printf("\n请输入待删除商品的名称:\n");scanf("%s", na);while(p!=NULL){if(strcmp(p->category, ca) == 0 && strcmp(p->name, na) == 0)        //寻找待操作节点break;p = p->next;}/*这里分为待删除节点为头结点和非头结点两种,分别做处理,本质都为将待删除节点next域传给其上一节点(头结点除外),但是并不用考虑尾节点的问题,因为如果是尾节点其next域为NULL传给其上一节点正对*/if(p == NULL){printf("\n对不起,您输入有误!\n\n");return items;}else if(p == items){free(p);printf("\n已删除!\n\n");return items->next;}else{while(d != NULL){if(d->next == p){free(p);printf("\n已删除!\n\n");d->next = p->next;return items;}d = d->next;}}return items;
}
ITEM *Statistics(ITEM *items)       //实现“统计”的框架功能
{int n;ITEM *Pt;printf("\n请选择统计方式:\n\1:按价格统计\n\2:按库存量统计\n\3:直接统计\n\0:退出\n");scanf("%d", &n);if(n == 0){printf("\n已退出!\n\n");return items;}else if(n == 1){Pt = StatisticsBy(items, items->price, 0);Print(Pt);return Pt;}else if(n == 2){Pt = StatisticsBy(items, 0, items->stock);Print(Pt);return Pt;}else{Print(items);return items;}
}
/*下面三个函数为实现“统计”的核心功能,主要利用“归并排序”思想,为本码最大的闪光点(手动滑稽),此处不做详谈*/
ITEM *GetMid(ITEM *items)
{if(items->next == NULL)return items;ITEM *q = items, *s = items, *p;while(q->next != NULL && q->next->next != NULL){q = q->next->next;s = s->next;}p = s->next;s->next = NULL;return p;
}
/*下面两函数有一巧妙之处,即自定义函数参数中有float与int型可以用来区别是按何种方式统计,省的定义两个极其相似的函数统计,提高可读性*/
ITEM *LinkBy(ITEM *x, ITEM *y, float a, int b)
{ITEM *ret = NULL, *tail = NULL;while(x!=NULL && y!=NULL){if((x->stock > y->stock && a == 0) ||(x->price > y->price && b == 0)){ITEM *temp = x->next;if(ret == NULL){ret = tail = x;ret->next = NULL;}else{tail->next = x;tail = tail->next;tail->next = NULL;}x = temp;}else{ITEM *temp = y->next;if(ret == NULL){ret = tail = y;ret->next = NULL;}else{tail->next = y;tail = tail->next;tail->next = NULL;}y = temp;}}if(x == NULL)tail->next = y;elsetail->next = x;return ret;
}
ITEM *StatisticsBy(ITEM *items, float a, int b)
{if(items->next == NULL)return items;ITEM *p1, *p2, *mid;mid = GetMid(items);p1 = StatisticsBy(items, a, b);p2 = StatisticsBy(mid, a, b);return LinkBy(p1,p2, a, b);
}
void Print(ITEM *items)        //实现“输出”功能
{int i=1;ITEM *p = items;printf("\n统计商品为:\n");while(p != NULL){printf("\t%d:\n\类别:%s\n\名称:%s\n\价格:%.2f\n\库存量:%d\n\生产厂家:%s\n\品牌:%s\n", i , p->category, p->name, p->price, p->stock, p->manufacturer, p->brand);p = p->next;i++;}printf("\n");
}
void Storage(ITEM *items)      //实现“文件存盘”功能
{FILE *fp = fopen("Shop.txt", "w+");if(fp == NULL){printf("\n操作失败!\n");exit(0);}else{ITEM *p = items;while(p != NULL){fprintf(fp, "%s\t%s\t%.2f\t%d\t%s\t%s", p->category, p->name, p->price, p->stock, p->manufacturer, p->brand);if(p->next != NULL){fprintf(fp, "\n");}p = p->next;}printf("\n储存成功! \n\n");fclose(fp);}
}
/*此处着实为难我很久,储存很简单,但是再按原样读取出来就非常难了,但是最后我还是找到方法了,利用\t就能完美的解决此问题,使储存的文件既有可读性又能使读取操作简单*/
ITEM *Open()        //实现“文件读取”功能
{FILE *fp = fopen("Shop.txt","r");if (fp == NULL){printf("\n打开失败,请检查该文件!\n");exit(0);}else{ITEM *p = NULL, *pt = NULL;while (!feof(fp)){pt = (ITEM*)malloc(sizeof(ITEM));fscanf(fp, "%s%s%f%d%s%s", pt->category, pt->name, &pt->price, &pt->stock, pt->manufacturer, pt->brand);pt->next = p;p = pt;}pt = NULL;printf("\n读取成功!\n\n");fclose(fp);return p;}
}

如果觉得本码足够规整而又不清楚规范,可查看另一帖子《C语言代码规范》–>传送门

感谢师傅来访,技术不精,请勿吐槽,如有问题请留言。

深析超市商品管理系统设计相关推荐

  1. 基于Mysql+JavaSwing的超市商品管理系统设计与实现

    文章来源: 学习通http://www.bdgxy.com/ 目录 1.功能介绍 2.关键代码 2.1 主页功能 2.2 添加商品信息 2.3 数据库设计 商品表 前言: 随着小超市规模的发展不断扩大 ...

  2. JAVA编写学校超市选址问题_中小型超市商品管理系统设计与实现【开题报告+文献综述+毕业论文】.docx...

    本科毕业论文开题报告信息管理与信息系统中 小 型 超 市 商 品 管 理 系 统 设 计 与 实 现一.立论依据 1.研究意义.预期目标随着中国经济的不断发展,计算机的普及率越来越高,超市的管理手段发 ...

  3. C++超市商品管理系统设计最新版

    超市商品管理系统 一.问题描述及功能要求 1.提供商品系统的添加.删除.编辑.显示等功能. 2.同类系统多数使用结构体数组来操作数据,本系统使用链表结构操作数据,提高了数据处理的效率. 二.代码实现 ...

  4. 超市商品管理系统设计

    1.问题描述 超市中商品分为四类,分别是食品.化妆品.日用品和饮料.每种商品都包含商品名称.价格.库存量和生产厂家.品牌等信息. 主要完成对商品的销售.统计和简单管理. 2.功能要求 (1)销售功能( ...

  5. 【java毕业设计】基于javaEE+SSH+mysql+strust2的超市积分管理系统设计与实现(毕业论文+程序源码)——超市积分管理系统

    基于javaEE+SSH+mysql+strust2的超市积分管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+SSH+mysql+strust2的超市积分管理系统设计 ...

  6. c语言商店自动销售,c语言商店商品管理系统设计报告与源代码.doc

    c语言商店商品管理系统设计报告与源代码.doc 1目录1系统分析21.1课程设计内容21.2系统功能需求分析21.3数据结构设计32系统设计32.1总体设计32.2详细设计42.2.1界面设计42.2 ...

  7. [计算机毕设]基于java的超市积分管理系统设计与实现(项目报告+答辩PPT+源代码+数据库)

    项目说明报告 基于java的超市积分管理系统 随着计算机和网络的不断革新,世界已经进入了前所未有的电子时代.作为实用性强.应用范围广泛的会员管理系统也正在被越来越多的各类企业用于消费管理领域.然而,那 ...

  8. 录入商品信息的c语言,超市商品信息系统设计报告及程序C语言.doc

    PAGE PAGE 22 苏州科技学院 二○一三 -二○一四学年第一学期 电子与信息工程系 课程设计报告书 课程名称: 程序设计基础实践 班 级: 学 号: 姓 名: 指导教师: 二○一三年十二月 1 ...

  9. 基于Springboot的超市订单管理系统设计与实现

    目录 摘要 I Abstract II 1 系统需求分析 1 1.1 系统功能分析 1 1.2 系统功能需求 2 1.3 系统性能需求 2 2 可行性分析 3 2.1 研究前提 3 2.2 设计要求 ...

最新文章

  1. ajax通讯原理,ajax通讯原理以及自己封装一个ajax函数
  2. Lotus的书买回来了
  3. 用友 服务器位置,用友的云服务器在哪里
  4. caffe-win10-cifar10另
  5. BZOJ1977: [BeiJing2010组队]次小生成树 Tree
  6. 表修改语法之列的增删改
  7. Akka应用模式:分布式应用程序设计实践指南pdf
  8. AsyncTask知识整理笔记
  9. 作者:刘阳(1988-),男,军事医学科学院放射与辐射医学研究所博士生
  10. PHP 处理execl的数据
  11. 字符串转数组的几种方法和字符串的截取
  12. 2018年程序员考试大纲
  13. nginx ajax 504,django+uwsgi+nginx ajax post 504 Gateway Time-out
  14. 【蓝桥杯题目分析】2014年第五届——第二题:切面条
  15. 基于LCD1602的多功能万年历,温湿度计,非RTC时钟芯片单片机技术
  16. Springboot餐饮点餐系统毕业设计源码301749
  17. API-fox 接口神器
  18. 解决chrome您的连接不是私密连接
  19. Unity 3D 脚本参考
  20. JZ2440分区表梳理

热门文章

  1. 交易中的 “道“ 与 “术“
  2. a55计算机主板,高性价比APU主板!AMD A55主板对比评测
  3. Github 上的个人项目开源心得
  4. ndows 资源管理器,windows资源管理器如何打开
  5. solidworks中加入参考图纸图片
  6. 如何在论文中画出漂亮的插图
  7. DINE: Domain Adaptation from Single and Multiple Black-box Predictors
  8. Spark性能调优系列:Spark参数配置大全(官网资料)
  9. [Unity Mirror] Network Discovery
  10. php的AES-128 EBC加密、解密