{ printf(\ exit(0); }
p1=p2=(struct Drugstock *)malloc(sizeof(struct Drugstock)); head=NULL;
while(fread(p1,sizeof(struct Drugstock),1,fp)==1) { n++; if(n==1) head=p1; else p2->next=p1; p2=p1;
p1=p2=(struct Drugstock *)malloc(sizeof(struct Drugstock));
fscanf(fp,\p1->storage,&p1->indate,&p1->inprice,&p1->innum); }
p2->next=NULL; return head; fclose(fp); }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------库存查找--------------------------------------*/ struct Drugstock *search(struct Drugstock *head) //查找 {
struct Drugstock *p; int flag; while(1) { printf(\请您选择要查找的方式:\\n\ printf(\货号-------***********\\n\ printf(\名称-------***********\\n\ printf(\返回主菜单--***********\\n\\n\ printf(\ 您选择的操作序号是:\ scanf(\ if(flag==1) { long a; printf(\ 请输入您要查找的药品货号:\ scanf(\ p=head; if(p->num==a) { printf(\ 以下是您要查找的药品信息:\\n\\n\
- 15 -
printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 查找成功!\\n\ } while(p->next!=NULL) { p=p->next;//不是要找的节点,指针后移 if(p->num==a) { printf(\ 以下是您要查找的药品信息:\\n\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 查找成功!\\n\ } } } else if(flag==2) { char b[20]; printf(\ 请输入您要查找的药品名称:\ scanf(\ p=head; if(strcmp(p->name,b)==0) { printf(\ 以下是您要查找的药品信息:\\n\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
- 16 -
printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 查找成功!\\n\ } while(p->next!=NULL) { p=p->next; if(strcmp(p->name,b)==0) { printf(\ 以下是您要查找的药品信息:\\n\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 查找成功!\\n\ } } } else if(flag==0) break; }
return head; }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------库存修改--------------------------------------*/ struct Drugstock *modify(struct Drugstock *head) //修改 {
struct Drugstock *p; long a; int b;
- 17 -
printf(\ 请输入您想修改库存药品的原货号:\ scanf(\ p=head;
while(p->num!=a&&p->next!=NULL) p=p->next; if(p->num==a) { printf(\ 以下是修改后的库存药品信息:\\n\\n\ printf(\ |------|------|------------|--------|----------|----------|--------|\\n\ printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\ |------|------|------------|--------|----------|----------|--------|\\n\ printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum);
printf(\ |------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 修改成功!\\n\ while(1) { printf(\ 请选择您要修改的项目 :\\n\\n\ printf(\ **************----0---退出--------**************\\n\ printf(\ **************----1---货号--------**************\\n\ printf(\ **************----2---名称--------**************\\n\ printf(\ **************----3---生产厂家----**************\\n\
printf(\ **************----4---库存量--------************\\n\ printf(\ **************----5---进货日期------************\\n\ printf(\ **************----6---进货价格--****************\\n\ printf(\ **************----7---进货量----****************\\n\ printf(\ 您选择的操作序号是:\ scanf(\ if(b==1) { printf(\ 请输入您修改后的货号:\ scanf(\
printf(\ 以下是修改后的库存药品信息:\\n\\n\
- 18 -
printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 修改成功!\\n\ } if(b==2) { printf(\ 请输入您修改后的名称:\ scanf(\ printf(\ 以下是修改后的库存药品信息:\\n\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 修改成功!\\n\ } if(b==3) { printf(\ 请输入您修改后的生产厂家:\ scanf(\ printf(\ 以下是修改后的库存药品信息:\\n\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
- 19 -
软件课程设计报告的格式要求
1 软件课程设计报告打印的用纸要求
本科学生软件课程设计报告采用A4打印纸或复印纸印制。
2 软件课程设计报告的排版要求 2.1 页面设置
本科学生软件课程设计报告要求纵向打印,页边距的要求为: 上(T):2.5 cm 下(B):2.5 cm 左(L):2.5 cm 右(R):2.5 cm 装订线(T):0.5 cm 装订线位置(T):左 其余设置采取系统默认设置。
2.2 排式与用字
文字图形一律从左至右横写横排。 文字一律通栏编辑。
字迹必须清楚整齐,忌用异体字、复合字及一切不规范的简化字。 除非必要,不使用繁体字。
2.3 段落设置
在“格式”选项中的“段落”设置窗口中,取消“如果定义了文档网格,则与网格对齐(W)”选项,采用多倍行距,行距设置值为1.25。
其余设置采取系统默认设置。
2.4 页眉、页脚设置
本科学生软件课程设计报告的页眉自己不设置内容; 页脚需要设置页码,页码采用10.5号、宋体、居中放置。
3 软件课程设计报告各部分的编排式样
报告的打印顺序为封面、中文提要、关键词、正文、参考文献、附录(附图)、致谢。具体要求见后。
I
中南民族大学
软件课程设计报告
生物医学工程学院10级 医学信息专业
题目 药品管理系统
学生 杨宝钦 学号 10161015
指导教师 唐奇玲
2012年12月02日
I
目 录
(目录内容字体:小四 宋体)
设计题目(加粗/黑体/居中/三号字) ................................... - 3 - 1 引言(小三号宋体加粗居中) ........................................ - 3 - 2 设计依据及框图(小三号宋体加粗居中) .............................. - 3 - 2.1 设计平台(四号宋体加粗) ........................................ - 3 - 2.2 设计思想(四号宋体加粗) ........................................ - 4 - 3 各模块功能及主要模块的流程图(小三号宋体加粗居中) ............... - 4 - 3.1 各模块功能简介(四号宋体加粗) .................................. - 4 - 3.2 主要流程图(四号宋体加粗) ...................................... - 4 - 4 软件调试分析(小三号宋体加粗居中) ................................ - 8 - 5 结语(小三号宋体加粗居中) ........................................ - 8 - 参考文献(小三号 宋体 加粗 居中) .................................. - 11 - 附录(主要程序列表, 正文中不能写大段程序代码,太多就列在此处附录中;若
超过3页,注明见电子文档即可) ...................................... - 11 - 致谢 .................................................... 错误!未定义书签。
- 2 -
设计题目
摘要:用C语言建立一个药品管理系统,可对医院药品的库存和销售进行管理。
在内容上,包括库存和销售两方面。库存应包括:商品的货号、名称、生产厂家、库存量、进货日期、进货价格、进货量。销售应包括:商品的货号、名称、销售日期、销售价格、销售数量、利润。 关键字:药品管理系统;库存管理;销售管理
1 引言
背景:本次软件课程设计是在大三上学期开设的,而我们C语言课程是在大一下开设的。C语言编程的水品停留在二级的水品,因此,此次的课程设计的正好可以用来提高我们的编程水品。当今社会发展讯速,科技日新月异。作为大学生,特别是工程专业的本科生,编程能力尤为重要。
目的:本次课程设计主要是设计一个药品管理系统,通过实践来提高我的动手能力。
2 设计依据及框图
设计依据:(1)登陆系统:用户通过密码验证登陆系统;(2)药品管理系统:包括库存管理和销售管理;库存包括:商品的货号、名称、生产厂家、库存
量、进货日期、进货价格、进货量。销售:商品的货号、名称、销售日期、销售价格、销售数量、利润。(3)用结构体数组组织数据,采用链表实现系统,对已建立的结构数组,在指定位置进行插入和删除一个结构数组元素工作,数据以文件形式存放,分为库存和销售两个文件。分成六个模块:数据输入,数据输出,数据更新,查询,统计,排序。 药品管理系统 库存管理 销售管理 货 名 号称生产厂家库存量进货日期进货价格进货量
货 名 号称销售日期销售价格销售数量利 润 Visual C++ 6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++
2.1 设计平台
- 3 -
已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了 Visual C++.NET(Visual C++7.0),但它的应用有很大的局限性,只适用于Windows 2000、Windows XP和Window。
Visual C++6.0由Microsoft开发, 它不仅是一个C++ 编译器,而且是一个基于Windows操作系统的可视化集成开发环境。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。
2.2 设计思想
系统管理模块分为接受输入药品信息、查询药品信息,更新药品信息,更新库存,产生报表,来完成系统功能。通过接受输入信息信息,来查询药品信息,输入药品信息对数据库进行更新,划单触发库存自动更新。并可按用户命令产生两种报表:库存报表和销售报表来协助管理员对药品信息进行管理。并且可查询药品信息来使管理员随时了解库存信息。
2.3 用户界面
用户界面:
|**************************************************************************|
主菜单
|**************************************************************************| | ************---1---输入信息--************* | | ************---2---显示信息--************* | | ************---3---查找------************** | | ************---4---修改------************** | | ************---5---添加------************** | | ************---6---删除------************** | | ************---7---排序------************** | | ************---0---退出系统--************* | |**************************************************************************|
3各模块功能及主要模块的流程图
3.1 各模块功能简介
一、结构体的定义 药品库存信息的结构体 struct Drugstock
{ long num; //商品的货号 char name[30]; //商品的名称 char factoryname[30]; //生产厂家名 long storage; //库存量 long indate; //进货日期 long inprice; //进货价格 long innum; //进货量 struct Drug *next; };
- 4 -
药品销售信息的结构体 struct Drugsell
{ long num; //商品的货号 char name[30]; //商品的名称 long outdate; //销售日期 long outprice; //销售价格 long outnum; //销售数量 long profit; //利润 struct Drugsell *next; };
二、函数编写
1、主函数void main()
主函数void main()实现各功能的选择,分为创建、增加、删除、修改、查询,以及统计等功能,而各功能分别编写为被调函数。利用while循环实现用户的人性化操作,以达到结束程序或继续运行程序的目的。创建、增加、删除、修改、查询、统计等被调函数,都须写于主函数之上;利用switch()函数实现各功能的选择。对数据的增、删、改操作,必须返回结构退指针,而查找功能只需要输出即可。 2、创建链表struct Drugstock *creat(void) 和 struct Drugsell *creat1(void)
创建新链表函数,返回链表头指针。定义结构体指针变量“struct Drugstock *head=NULL, *p1,*p2;”。head为头指针,及数据表的表头;动态分配内存给p1,令其始终指向新节点;而p2为中间辅助指针,是链表按要求链接。在创建链表的过程中,动态分配内存给指针p1,分别输入库存药品信息和销售药品信息,进行赋值。在输入玩一个信息之后,选择退出选择货号为0。
3、增加新节点 struct Drugstock *insert(struct Drugstock *head,struct Drugsell
*head1)和struct Drugstock *insert1(struct Drugstock *head,struct Drugstock *head1)
增加过程与创建过程大致相同,唯一不同的是,增加过程需要得到形参继续增加库存和销售信息。
4、删除节点 struct Drugstock *Delete(struct Drugstock *head)
struct Drugsell *Delete1 (struct Drugsell *head)
删除库存药品信息实质就是,将链表指针所指向的地址在内存中擦除。主要分为两种情况:删除头指针所指向的节点地址是否为空和删除中间或结尾的节点地址。首先,需要判断所删除节点的地址所指的空间if(head==NULL) {printf(\链表是空的!\\n\,然后进行判断while(num!=p1->num && p1->next!=NULL),然后,进行逻辑判断,是否存在该货号的节点,以及判断是否为头指针。
5、修改节点 struct Drugstock *modify(struct Drugstock *head)
- 5 -
struct Drugsell *modify1(struct Drugsell *head)
即删除和增加过成功地结合。先进行用while(p->num!=t&&p->next!=NULL) 判断是否是所需寻找的节点,p=p->next;如果是的话,if(p->num==t),开始进行选择你想要修改的是药品的什么信息,货号、名称、生产厂家、库存量、进货日期、进货价格、进货量还是货号、名称、销售日期、销售价格、销售数量、利润,进行判断后,开始进行选择修改。
6、查找节点 void search(struct Drugstock *head)
void search2(struct Drugsell *head)
查找节点,即根据所查询的信息查找记录,需要定义结构体指针变量p,进行逻辑判断即可。查找所需节点信息,根据需要选择是销售还是库存,判断后进入函数体后进行查找所需内容,用if语句进行判断后选择。 7、统计 void statistic1(struct Drug *head)
void statistic2(struct Drugsell *head)
需要根据创建(或增加)时计算出各节点段的个数来统计。分为销售和库存信息二个部分,根据需要进行选择,用count,sum,计算统计个数,用if语句进行判断统计个数。
8、排序 struct Drugstock *sort(struct Drugstock *head)
struct Drugsell *sort1(struct Drugsell *head)
按选择进行排序需要建立新的链表。是选择升序还是降序,创建struct Drugsell *m,*f,*p,*han。struct Drugstock *m,*f,*p,*han。
9、数据的文件存储, void savetofile(struct Drugstock *head,char fname[30])
struct Drugstock * readfromfile(char fname[30])
void savetofile1(struct Drugsell *head,char fname[30]) struct Drugsell * readfromfile1(char fname[30])
分别调用这些函数进行药品库存信息数据和药品销售信息数据的存储,将数据存入指定的文档中。
3.2 主要流程图
一、用户登录
(1)功能流图
用户登录失败用户核对成功操作成功用户管理用户管理操作 用户登录功能流图
- 6 -
(2)功能描述
用户根据已知的密码登录系统,只有登录成功才能进行系列的药品库存管理、药品销售管理,入库和出库管理的操作。 二、药品管理程序流程图
(1)功能流图
用户登陆药品添加输入药品信息操作成功失败核对药品信息成功库存表 药品添加功能流图
(2)功能描述
用户进入系统以后,首先需要添加药品信息,没有药品信息就无法进行库存管理了,更做不到药品入库和出库。药品信息作为库存管理的一部分,是药品入库和出库的编号查询;还有为提供药品有效期的报警来源。 三、库存管理 (1)功能流图
用户登陆库存管理输入库存信息操作成功失败库存初始化成功库存表库存初始化功能流图
- 7 -
(2)功能描述
用户登录进入库存管理页面,进行库存初始化。库存初始化是把现有的库存添加到库存表当中去,但是首先这些库存的药品信息已经都是被录入药品表。所以在查询到这些药品信息后便可以进行库存初始化了。
4 软件调试分析
说明:整个系统分为两个模块:药品库存管理和药品销售管理,在软件调试中,先输入药品信息(库存和销售)、查看已有药品信息(库存和销售)、添加新的药品信息(库存和销售)、删除药品信息(库存和销售)、修改药品信息(库存和销售)、查询药品信息(库存和销售)、统计药品信息(库存和销售)、对药品按货号升序排序。
1.登陆
2.输入及显示信息
- 8 -
3查找信息
4修改信息
5添加信息
- 9 -
6删除信息
7排序
8统计
- 10 -
5 结语
课程设计结束了,通过实践我对学过的软件知识娱乐提高。从刚开始的不懂或者说很是模糊,开始去查找各种资料,到基本了解了整个软件设计的过程,对c语言编程的过程更加清楚,并懂得了需求分析阶段的重要性,了解现实世界中业务流程和软件想结合的需要,整个设计过程是对系统的一点点加深理解的过程,经过对问题的一步步深入的了解,对系统实现的功能进一步清楚,对模糊的功能需求通过询问,查找资料, 使之得到了充分的解决。
本次软件课程设计是在大三上学期开设的,而我们C语言课程是在大一下开设的。C语言编程的水品停留在二级的水品,因此,此次的课程设计的正好可以用来提高我们的编程水品。当今社会发展讯速,科技日新月异。作为大学生,特别是工程专业的本科生,编程能力尤为重要。本次课程设计主要是设计一个药品管理系统,通过实践提高我的实践动手能力。
参考文献
[1] [2]
谭浩强.C语言程序设计(第四版).北京:清华大学出版社,2010.6
刘振安, 孙忱,刘燕君.C语言程序设计课程设计.机械工业出版社,2004.9
附录
详细程序:
#include
struct Drugstock //药品进货 {
long num; //药品货号 char name[N]; //名称 char factory[N]; //生产厂家 long storage; //库存量 long indate; //进货日期 long inprice; //进货价格 long innum; //进货量 struct Drugstock *next; };
struct Drugsell //药品销售 {
long num; //药品的货号 char name[N]; //名称 long outdate; //销售日期
- 11 -
long outprice; //销售价格 long outnum; //销售数量 long profit; //利润 struct Drugsell *next; }; int n;
/*************************************************药品库存
/*----------------------------药品库存链表函数create---------------------------------*/ struct Drugstock *create(void) //建立药品库存的链表函数create {
struct Drugstock *head; struct Drugstock *p1,*p2; n=0;
p1=p2=(struct Drugstock *)malloc(sizeof(struct Drugstock)); //强制类型转换为指针
printf(\ 注意:\
printf(\(1)您输入的药品货号必须是唯一的;\\n\
printf(\ (2)输入药品货号为空时返回主菜单。\\n\
printf(\ 请依次输入药品的信息:货号 名称 生产厂家 库存量 进货日期 进货价格 进货量\\n\
printf(\ 请输入第一个药品的货号:\ /* 输入药品的货号*/ if(p1->num!=0)
{ printf(\ 请输入第一个药品的名称:\ //输入药品的名称
printf(\ 请输入第一个药品的生产厂家名:\ /* 输入药品的生产厂家名*/
printf(\ 请输入第一个药品的库存量:\ /* 输入药品的库存量*/
printf(\ 请输入第一个药品的进货日期:\ /* 输入药品的进货日期*/
printf(\ 请输入第一个药品的进货价格:\ //输入药品的进货价
printf(\ 请输入第一个药品的进货量:\ //输入药品的进货量 } else { printf(\ 您输入的货号为0!!!\\n\ }
head=NULL;
printf(\ 请接着输入药品的信息:货号 名称 生产厂家 库存量 进货日期 进货价格 进货量\\n\
- 12 -
while(p1->num!=0)
{ printf(\ 注意:输完信息要退出请输入货号为0\\n\ n=n+1; if(n==1) head=p1; else p2->next=p1; p2=p1; p1=(struct Drugstock *)malloc(sizeof(struct Drugstock));
printf(\ 请输入药品的货号:\ /* 输入药品的货号*/ if(p1->num!=0) { printf(\ 请输入药品的名称:\ //输入药品的名称
printf(\ 请输入药品的生产厂家名:\ /* 输入药品的生产厂家名*/
printf(\ 请输入药品的库存量:\ /* 输入药品的库存量*/
printf(\ 请输入药品的进货日期:\ /* 输入药品的进货日期*/
printf(\ 请输入药品的进货价格:\ //输入药品的进货价格
printf(\ 请输入药品的进货量:\ //输入药品的进货量 } else printf(\ 输入成功!\\n\ }
p2->next=NULL; return(head); }
/*------------------------------------------------------------------------------------------*/ /*-----------------------------------------库存显示-----------------------------------------*/ struct Drugstock *printlink(struct Drugstock *head) { struct Drugstock *p;
printf(\ 以下是%d个库存药品信息:\\n\\n\ p=head;
if(head!=NULL) /* 如果链表不是空,则打印每个结点信息*/
{ printf(\ |------|------|------------|--------|----------|----------|--------|\\n\ printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ do
{ printf(\ |------|------|------------|--------|----------|----------|--------|\\n\
- 13 -
printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); p=p->next;
}while(p!=NULL);
printf(\ |------|------|------------|--------|----------|----------|--------|\\n\ }
else printf(\链表是空的!\\n\ /* 如果链表是空表,刚提示这个链表是空表*/ return head; }
/*------------------------------------------------------------------------------------------*/
/*------------------------------------------库存存文件--------------------------------------*/ void savetofile(struct Drugstock *head,char fname[30]) {
FILE *fp;
if((fp=fopen(fname,\ { printf(\ exit(0); }
if(head==NULL) printf(\ 输入不能为空!!!\ else { while(head!=NULL) { fwrite(head,sizeof(struct Drugstock),1,fp);
fprintf(fp,\ry,head->storage,head->indate,head->inprice,head->innum); head=head->next; } }
fclose(fp); }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------库存读文件--------------------------------------*/ struct Drugstock *readfromfile(struct Drugstock *head,char fname[30]) {
FILE *fp;
struct Drugstock *p1,*p2; int n=0;
if((fp=fopen(fname,\
- 14 -
printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 修改成功!\\n\ }
if(b==4) { printf(\ 请输入您修改后的库存量:\ scanf(\ printf(\ 以下是修改后的库存药品信息:\\n\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 修改成功!\\n\ } if(b==5) { printf(\ 请输入您修改后的进货日期:\ scanf(\ printf(\ 以下是修改后的库存药品信息:\\n\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 修改成功!\\n\ } if(b==6)
- 20 -
{ printf(\ 请输入您修改后的进货价格:\ scanf(\ printf(\ 以下是修改后的库存药品信息:\\n\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 修改成功!\\n\ } if(b==7) { printf(\ 请输入您修改后的进货量:\ scanf(\ printf(\ 以下是修改后的库存药品信息:\\n\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\
printf(\ | 货号 | 名称 | 生产厂家名 | 库存量 | 进货日期 | 进货价格 | 进货量 |\\n\ printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\
|%-6ld|%-6s|%-12s|%-8ld|%-10ld|%-10ld|%-8ld|\\n\torage,p->indate,p->inprice,p->innum); printf(\
|------|------|------------|--------|----------|----------|--------|\\n\ printf(\ 修改成功!\\n\ } else if(b==0) break; } }
return head; }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------库存添加--------------------------------------*/ struct Drugstock *insert(struct Drugstock *head ,struct Drugstock *h) //添加 {
- 21 -
struct Drugstock *p1,*p2; p2=head;
if(head==NULL) //空表插入 { head=h; h->next=NULL; } else { while((h->num>p2->num)&&(p2->next!=NULL)) { p1=p2; p2=p2->next; //查找插入位置 } if(h->num<=p2->num) { if(head==p2) 在第一节点插入 head=h; else p1->next=h; h->next=p2; } else { p2->next=h; h->next=NULL; } //在表末插入 }
return head; }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------库存删除--------------------------------------*/ struct Drugstock *Delete(struct Drugstock *head) //删除 {
struct Drugstock *p1,*p2; long a;
printf(\ 请输入您要删除的药品货号: \ scanf(\ if(head==NULL) { printf(\
- 22 -
// goto end; } p2=head;
//不是要删除的节点,也不是最后一个节点,继续循环 while(p2->num!=a&&p2->next!=NULL) { p1=p2; //p1指向当前节点,p2指向下一结点 p2=p2->next; }
//找到被删除节点,且为第一个节点,使head指向第二个节点,否则p1所指节点指针指向下一结点 if(p2->num==a) { if(p2==head) head=p2->next; else p1->next=p2->next; n--; printf(\ 删除成功!\\n\ free(p2); } else printf(\ 该药品不存在!\\n\end:
return head; }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------库存排序--------------------------------------*/ struct Drugstock *sort(struct Drugstock *head) //排序 {
struct Drugstock *p1,*p2,*p;
p1=(struct Drugstock *)malloc(sizeof(struct Drugstock));//强制转换 p1->next=head;
head=p1; while(p1->next!=NULL) //选择法 { for(p=p1,p2=p1->next;p2->next!=NULL;p2=p2->next) //使最大者沉底 if(p2->next->num
- 23 -
p2->next=p1->next; p1->next=p2; } p1=p1->next; }
return head->next; }
/*------------------------------------------------------------------------------------------*/
/******************************************************************** /**********************************************药品销售************* /*-------------------------------药品销售链表函数create1---------------------------------*/ struct Drugsell *create1(void) //建立药品库存的链表函数create {
struct Drugsell *head; struct Drugsell *p1,*p2; n=0;
p1=p2=(struct Drugsell *)malloc(sizeof(struct Drugsell)); //强制类型转换为指针
printf(\ 注意:\
printf(\(1)您输入的药品货号必须是唯一的;\\n\
printf(\ (2)输入药品货号为空时返回主菜单。\\n\
printf(\ 请依次输入药品的信息:货号 名称 销售日期 销售价格 销售数量 利润\\n\
printf(\ 请输入第一个药品的货号:\ /* 输入药品的货号*/ if(p1->num!=0)
{ printf(\ 请输入第一个药品的名称:\ //输入药品的名称
printf(\ 请输入第一个药品的销售日期:\ /* 输入药品的销售日期*/
printf(\ 请输入第一个药品的销售价格:\ //输入药品的销售价格
printf(\ 请输入第一个药品的销售数量:\ //输入药品的销售量
printf(\ 请输入第一个药品的利润:\ /* 输入药品的利润量*/ } else { printf(\ 您输入的货号为0!!!\\n\ }
head=NULL;
- 24 -
printf(\ 请接着输入药品的信息:货号 名称 销售日期 销售价格 销售数量 利润\\n\
while(p1->num!=0)
{ printf(\ 注意:输完信息要退出请输入货号为0\\n\ n=n+1; if(n==1) head=p1; else p2->next=p1; p2=p1; p1=(struct Drugsell *)malloc(sizeof(struct Drugsell));
printf(\ 请输入药品的货号:\ /* 输入药品的货号*/ if(p1->num!=0) { printf(\ 请输入药品的名称:\ //输入药品的名称
printf(\ 请输入药品的销售日期:\ /* 输入销售日期*/
printf(\ 请输入药品的销售价格:\ //输入销售价格
printf(\ 请输入药品的销售数量:\ //输入销售数量 printf(\ 请输入药品的利润:\ /* 输入药品的利润量*/ } else printf(\ 输入成功!\\n\ }
p2->next=NULL; return(head); }
/*------------------------------------------------------------------------------------------*/ /*-----------------------------------------销售显示-----------------------------------------*/ struct Drugsell *printlink1(struct Drugsell *head) { struct Drugsell *p;
printf(\ 以下是%d个销售药品信息:\\n\\n\ p=head;
if(head!=NULL) /* 如果链表不是空,则打印每个结点信息*/
{ printf(\ |------|------|----------|----------|----------|------|\\n\
printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\ do
{ printf(\ |------|------|----------|----------|----------|------|\\n\
- 25 -
printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit); p=p->next;
}while(p!=NULL);
printf(\ |------|------|----------|----------|----------|------|\\n\ }
else printf(\链表是空的!\\n\ /* 如果链表是空表,刚提示这个链表是空表*/ return head; }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------销售存文件--------------------------------------*/ void savetofile1(struct Drugsell *head,char fname[30]) {
FILE *fp;
if((fp=fopen(fname,\ { printf(\ exit(0); }
if(head==NULL) printf(\ 输入不能为空!!!\ else { while(head!=NULL) { fwrite(head,sizeof(struct Drugsell),1,fp);
fprintf(fp,\ead->outprice,head->outnum,head->profit); head=head->next; } }
fclose(fp); }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------销售读文件--------------------------------------*/ struct Drugsell *readfromfile1(struct Drugsell *head,char fname[30]) {
FILE *fp;
struct Drugsell *p1,*p2; int n=0;
if((fp=fopen(fname,\ {
- 26 -
printf(\ exit(0); }
p1=p2=(struct Drugsell *)malloc(sizeof(struct Drugsell)); head=NULL;
while(fread(p1,sizeof(struct Drugsell),1,fp)==1) { n++; if(n==1) head=p1; else p2->next=p1; p2=p1;
p1=p2=(struct Drugsell *)malloc(sizeof(struct Drugsell));
fscanf(fp,\1->outprice,&p1->outnum,&p1->profit); }
p2->next=NULL; return head; fclose(fp); }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------销售查找--------------------------------------*/ struct Drugsell *search1(struct Drugsell *head) //查找 {
struct Drugsell *p; int flag; while(1) { printf(\请您选择要查找的方式:\\n\ printf(\货号-------***********\\n\ printf(\名称-------***********\\n\ printf(\返回主菜单--***********\\n\\n\ printf(\ 您选择的操作序号是:\ scanf(\ if(flag==1) { long a; printf(\ 请输入您要查找的销售药品货号:\ scanf(\ p=head; if(p->num==a) { printf(\ 以下是您要查找的销售药品信息:\\n\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\
- 27 -
printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit); printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ 查找成功!\\n\ } while(p->next!=NULL) { p=p->next;//不是要找的节点,指针后移 if(p->num==a) { printf(\ 以下是您要查找的销售药品信息:\\n\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit); printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ 查找成功!\\n\ } } } else if(flag==2) { char b[20]; printf(\ 请输入您要查找的销售药品名称:\ scanf(\ p=head; if(strcmp(p->name,b)==0) { printf(\ 以下是您要查找的销售药品信息:\\n\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\
printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit); printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ 查找成功!\\n\
- 28 -
} while(p->next!=NULL) { p=p->next; if(strcmp(p->name,b)==0) { printf(\ 以下是您要查找的销售药品信息:\\n\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit); printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ 查找成功!\\n\ } } } else if(flag==0) break; }
return head; }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------销售修改--------------------------------------*/ struct Drugsell *modify1(struct Drugsell *head) //修改 {
struct Drugsell *p; long a; int b;
printf(\ 请输入您想修改药品的原货号:\ scanf(\ p=head;
while(p->num!=a&&p->next!=NULL) p=p->next; if(p->num==a) { printf(\ 以下是修改后的销售药品信息:\\n\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\
printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\
printf(\ |------|------|----------|----------|----------|------|\\n\
- 29 -
printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit);
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ 修改成功!\\n\ while(1) { printf(\ 请选择您要修改的项目 :\\n\\n\ printf(\ **************----0---退出--------**************\\n\ printf(\ **************----1---货号--------**************\\n\ printf(\ **************----2---名称--------**************\\n\ printf(\ **************----3---销售日期----**************\\n\
printf(\ **************----4---销售价格----**************\\n\ printf(\ **************----5---销售数量----**************\\n\ printf(\ **************----6---利润--------**************\\n\ printf(\ 您选择的操作序号是:\ scanf(\ if(b==1) { printf(\ 请输入您修改后的货号:\ scanf(\
printf(\ 以下是修改后的销售药品信息:\\n\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\
printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit);
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ 修改成功!\\n\ } if(b==2) { printf(\ 请输入您修改后的名称:\ scanf(\ printf(\ 以下是修改后的销售药品信息:\\n\\n\
- 30 -
printf(\ |------|------|----------|----------|----------|------|\\n\
printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit);
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ 修改成功!\\n\ } if(b==3) { printf(\ 请输入您修改后的销售日期:\ scanf(\ printf(\ 以下是修改后的销售药品信息:\\n\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\
printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit);
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ 修改成功!\\n\ }
if(b==4) { printf(\ 请输入您修改后的销售价格:\ scanf(\ printf(\ 以下是修改后的销售药品信息:\\n\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\
printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit);
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ 修改成功!\\n\ } if(b==5) { printf(\ 请输入您修改后的销售数量:\ scanf(\
- 31 -
printf(\ 以下是修改后的销售药品信息:\\n\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\
printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit);
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ 修改成功!\\n\ } if(b==6) { printf(\ 请输入您修改后的利润:\ scanf(\ printf(\ 以下是修改后的销售药品信息:\\n\\n\ printf(\ |------|------|----------|----------|----------|------|\\n\
printf(\ | 货号 | 名称 | 销售日期 | 销售价格 | 销售数量 | 利润 |\\n\
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\
|%-6ld|%-6s|%-10ld|%-10ld|%-10ld|%-6ld%|\\n\rice,p->outnum,p->profit);
printf(\ |------|------|----------|----------|----------|------|\\n\ printf(\ 修改成功!\\n\ } else if(b==0) break; } }
return head; }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------销售添加--------------------------------------*/ struct Drugsell *insert1(struct Drugsell *head ,struct Drugsell *h) //添加 {
struct Drugsell *p1,*p2; p2=head;
if(head==NULL) //空表插入 { head=h; h->next=NULL; } else
- 32 -
{ while((h->num>p2->num)&&(p2->next!=NULL)) { p1=p2; p2=p2->next; //查找插入位置 } if(h->num<=p2->num) { if(head==p2) 在第一节点插入 head=h; else p1->next=h; h->next=p2; } else { p2->next=h; h->next=NULL; } //在表末插入 }
return head; }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------销售删除--------------------------------------*/ struct Drugsell *Delete1(struct Drugsell *head) //删除 {
struct Drugsell *p1,*p2; long a;
printf(\ 请输入您要删除的药品货号: \ scanf(\ if(head==NULL) { printf(\ goto end; } p2=head;
//不是要删除的节点,也不是最后一个节点,继续循环 while(p2->num!=a&&p2->next!=NULL) { p1=p2; //p1指向当前节点,p2指向下一结点 p2=p2->next; }
- 33 -
// //找到被删除节点,且为第一个节点,使head指向第二个节点,否则p1所指节点指针指向下一结点 if(p2->num==a) { if(p2==head) head=p2->next; else p1->next=p2->next; n--; printf(\ 删除成功!\\n\ free(p2); } else printf(\ 该药品不存在!\\n\end:
return head; }
/*------------------------------------------------------------------------------------------*/ /*------------------------------------------销售排序--------------------------------------*/ struct Drugsell *sort1(struct Drugsell *head) //排序 {
struct Drugsell *p1,*p2,*p;
p1=(struct Drugsell *)malloc(sizeof(struct Drugsell));//强制转换 p1->next=head;
head=p1; while(p1->next!=NULL) //选择法 { for(p=p1,p2=p1->next;p2->next!=NULL;p2=p2->next) //使最大者沉底 if(p2->next->num
return head->next; }
/*------------------------------------------------------------------------------------------*/
- 34 -
printf(\ 请输入销售价格:\ printf(\ 请输入销售数量:\ printf(\ 请输入利润:\ n++; } head1=insert1(head1,h1); if(h1->num==0) { printf(\ 您输入的货号为0!!!\\n\ goto loop; } savetofile1(head1,\ printlink1(head1); printf(\ 添加成功!\\n\ } else { printf(\ 输入不正确!\\n\ goto top5; } }
/*----------------------------------------------------------------------------------*/ /*-----------------------------------------修改-------------------------------------*/ else if(flag1==6) {
top6:printf(\ 请选择修改库存或销售信息:1库存 2销售?\\n\ printf(\ 您选择的操作序号是:\ if(y==1) /*选择修改库存信息*/ { head=readfromfile(head,\ head=Delete(head); savetofile(head,\ printlink(head); } else if(y==2) /*选择修改销售信息*/ { head1=readfromfile1(head1,\ head1=Delete1(head1);
- 40 -
savetofile1(head1,\ printlink1(head1); } else { printf(\ 输入不正确!\\n\ goto top6; } }
/*----------------------------------------------------------------------------------*/ /*-----------------------------------------修改-------------------------------------*/ else if(flag1==7) {
top7:printf(\ 请选择排序库存或销售信息:1库存 2销售?\\n\ printf(\ 您选择的操作序号是:\ if(y==1) /*选择排序库存信息*/ { head=sort(head); printlink(head);
printf(\ 排序成功!\\n\ } else if(y==2) /*选择排序销售信息*/ { head1=sort1(head1); printlink1(head1);
printf(\ 排序成功!\\n\ } else { printf(\ 输入不正确!\\n\ goto top7; } }
/*----------------------------------------------------------------------------------*/ } } else {
- 41 -
printf(\ ********************对不起!密码不正确!***************\\n\ printf(\ 请选择您的需求:\\n\ printf(\ *************------1---重新输入密码-----*************\\n\ printf(\ *************------2---退出系统---------*************\\n\ while(1) { int i; scanf(\ if(flag==1) { for(i=0;i<3;i++) { printf(\对不起!您的密码不正确!请重新输入:\ scanf(\ if(b==10161015) {
printf(\***********************\\n\ printf(\ ************* 恭喜您! ************* \\n\ printf(\ ************ 密码正确! ************ \\n\ printf(\ ********** 欢迎使用本系统! ******** \\n\
printf(\*********************** \\n\ goto loop; } } printf(\对不起!您已经输入3次!\\n\ exit(1); } if(flag==2) exit(1); } } }
/****************************************************************************************************/
- 42 -