题目:简单进销存

功能要求:

  1. 实现如下的菜单(按数字选择菜单功能): 1. 显示存货列表 2. 入库 3. 出库 4. 退出程序
  2. 实现菜单对应功能(需记录货物的型号、数量等信息);
  3. 程序启动时从文件中读取当前库存数据,退出时保存库存数据;
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<windows.h> typedef struct GOOD{
char *name;
int num;
}GOOD; typedef struct Node{
GOOD good;
struct Node *pre,*next;
}Node; Node *head,*tail; void NewNode(); int main(){
char name_of_good[101];
int num_of_good;
printf("///////////////\n");
printf("ÇëÊäÈëÏàÓ¦Êý×Ö£¬²¢°´Ï»سµ¼üÀ´»ñÈ¡ÄúÏëÒªµÄ¹¦ÄÜ£¡\n");
printf("1.ÏÔʾ´æ»õÁбí\n");
printf("2.Èë¿â\n");
printf("3.³ö¿â\n");
printf("4.Í˳ö³ÌÐò\n");
printf("//////////////\n");
int op;
FILE *fp=fopen("WAREHOUSE.txt","r");
while(fscanf(fp,"%s%d",name_of_good,&num_of_good)!=EOF){
NewNode();
int len=strlen(name_of_good);
(*tail).good.name=(char*)malloc(sizeof(char)*(len+1));
strcpy((*tail).good.name,name_of_good);
(*tail).good.num=num_of_good;
}
fclose(fp);
while(1){
scanf("%d",&op);
if(op==1){
for(Node* p=head;p!=NULL;p=(*p).next){
printf("%s %d\n",(*p).good.name,(*p).good.num);
}
}
else if(op==2){
printf("Èë¿â,ÇëÊäÈë:»õÎïÃû³Æ »õÎïÊýÁ¿\n");
scanf("%s%d",name_of_good,&num_of_good);
int isFind=0;
for(Node* p=head;p!=NULL;p=(*p).next){
if(strcmp((*p).good.name,name_of_good)==0){
(*p).good.num+=num_of_good;
isFind=1;
break;
}
}
if(!isFind){
NewNode();
int len=strlen(name_of_good);
(*tail).good.name=(char*)malloc(sizeof(char)*(len+1));
strcpy((*tail).good.name,name_of_good);
(*tail).good.num=num_of_good;
}
}
else if(op==3){
printf("³ö¿â,ÇëÊäÈë:»õÎïÃû³Æ »õÎïÊýÁ¿\n");
scanf("%s%d",name_of_good,&num_of_good);
for(Node* p=head;p!=NULL;p=(*p).next){
if(strcmp((*p).good.name,name_of_good)==0){
(*p).good.num-=num_of_good;
if(!(*p).good.num){
if((*p).pre!=NULL){
(*((*p).pre)).next=(*p).next;
}
if((*p).next!=NULL){
(*((*p).next)).pre=(*p).pre;
}
if(p==head){
head=(*p).next;
}
if(p==tail){
tail=(*p).pre;
}
free(p);
}
break;
}
}
}
else{
break;
}
}
fp=fopen("WAREHOUSE.txt","w");
for(Node* p=head;p!=NULL;p=(*p).next){
fprintf(fp,"%s %d\n",(*p).good.name,(*p).good.num);
}
fclose(fp);
return 0;
} void NewNode(){
Node* Pretail=tail;
if(tail==NULL){
head=tail=(Node*)malloc(sizeof(Node));
}
else{
(*tail).next=(Node*)malloc(sizeof(Node));
tail=(*tail).next;
}
if(Pretail!=NULL){
(*Pretail).next=tail;
}
(*tail).pre=Pretail;
(*tail).next=NULL;
}

【CCpp程序设计2017】简单进销存的更多相关文章

  1. 浩瀚技术团队... 安卓智能POS移动PDA开单器 开单器 进销存系统 进销存系统

    浩瀚技术团队... 智能POS移动PDA开单器 开单器 进销存系统 进销存系统 点餐 会员管理 会员管理 深度解读 手机APP移动办公到底是什么? 快速打单POS·不仅仅是快那么简单!  

  2. PDA手持机 移动开单进销存系统 现场出打印凭据和扫码 新的亮点

    传统车销模式弊端:1.手写开单,效率低,动作慢2.现场手写开单明细不能打印,产品明细不规范3.电脑办公人员及车销人员对车上的库存情况掌握不清楚,销售人员对每种产品销售价格不清楚4.老板对员工工作的管控 ...

  3. 【.NET实战教程】北风网基于ASP.NET多层架构下的企业级进销存软件全程培训

    .Net进销存系统详细课程大纲(开发工具采用VS2008+sqlsever2005) [小编提醒:现在学习的话,可以使用vs2012+sql 2008 学习的是思路,教学环境不一定要一模一样]1.项目 ...

  4. 一秒钟看懂SaaS、CRM、OA、ERP、HR、进销存

    自2014年以来,SaaS.CRM.OA.ERP.HR.APM.进销存.财务系统等,这些名词大量出现在微信朋友圈.电视楼宇广告和千百万融资资讯中.它们到底是什么意思?相互之间又有什么区别?在这个飞速发 ...

  5. 改变传统的开单模式------手持POS终端移动销售开单 移动进销存的利器

    手持POS终端高清彩屏,清晰.美观.大方,适用于仓库.超市.服装.食品.批发零售.手机电脑等企业管理.可与管理软件灵活对接.1:员工记不住价格,产品名称,只要有PDA扫描,价格,库存,直接开销售单,打 ...

  6. SAP进销存难点分析及对策

    1.基本需求: 业务部门提出如上表格式进销存需求,并且金额要和总账中存货科目保持一致,如果要实现上表格式进校存,可以通过SAP标准程序(MC.9.MB51.MB5B)加工繁琐而成.现分析一下SAP标准 ...

  7. Odoo进销存(采购、销售、仓库)入门教程 - 上

    转载地址:http://blog.csdn.net/wangnan537/article/details/46434373 运行环境: Ubuntu14.04+Odoo8.0 作者:苏州-微尘 0. ...

  8. 文献综述十八:基于SSH框架的进销存管理系统设计与实现

    一.基本信息 标题:基于SSH框架的进销存管理系统设计与实现 时间:2017 出版源:内蒙古科技与经济 文件分类:对框架的研究 二.研究背景 进销存管理系统在各企业中广泛应用,使用SSH框架,很大程度 ...

  9. 寒冬之下,浩瀚智能开单收银打印扫描POS为何能在批发零售门店商场 车销行业 风靡!:进销存+打印扫描POS机

    是一款适用于商超.餐饮.服装鞋帽.家电专营等等具有零售行业特点的企业,供企业管理人员用于管理.监控本品牌的市场占有率.门店覆盖区域.网点分布合理性等经济地理信息的工具平台. 1,功能一:业务抄单文章来 ...

随机推荐

  1. React的单向数据流与组件间的沟通

    今天来给大家总结下React的单向数据流与组件间的沟通. 首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则. 先介绍单向数据流吧. React单向数据流: React是单向数 ...

  2. 生成应用的快捷方式action,权限

    action:"com.android.launcher.action.INSTALL_SHORTCUT" 权限:com.android.launcher.permission.I ...

  3. Django 1.10中文文档-第一个应用Part5-测试

    本教程上接教程Part4. 前面已经建立一个网页投票应用,现在将为它创建一些自动化测试. 自动化测试简介 什么是自动化测试 测试是检查你的代码是否正常运行的行为.测试也分为不同的级别.有些测试可能是用 ...

  4. fork与vfork区别

    1. 地址空间各段拷贝: fork: 内核为子进程生成新的地址空间结构,拷贝父进程的代码段,数据空间,堆,栈到自身的地址空间,但注意:子进程的代码段并不会分配物理空间,而是指向父进程的代码段物理空间, ...

  5. web.py输出中文字符串乱码问题的解决

    web.py中文字符串网页显示乱码的解决 #!/usr/bin/env python # encoding: utf-8 import weburls = ( '/', 'index')class i ...

  6. Redis错误:jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set

    原文链接:http://blog.csdn.net/rchm8519/article/details/48347797 redis.clients.util.Pool.getResource(Pool ...

  7. Tomcat debug模式下特别慢但是run正常处理方法

    转载自:http://blog.csdn.net/builderwfy/article/details/50785749 到网上查资料发现这是由eclipse和tomcat交互时,在debug模式启动 ...

  8. 虚拟存储管理中几种缺页中断算法(最佳置换法OPT)

    缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问. 在进行内存访问时,若所访问的页已在主存,则称此次访问成功: 若所访问的页不在主存,则称此次访问失败,并产生缺页中断. 最佳置换法 ...

  9. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记4——Direct3D编程基础

    第11章 Direct3D编程基础 2D游戏是贴图的艺术,3D游戏是渲染的艺术.这句话在我学过了之前的GDI编程之后,前一句算是有所体会,现在是来理解后一句的时候了. 安装DirectX SDK配置啥 ...

  10. hdu 1081(最大子矩阵)

    To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...