医药系统

article/2025/8/21 1:45:51

3.1、设计任务与目标
3.1.1

分析论证:设计一系统,实现医药公司定期对销售各药品的记录进行统计,可按药品的编号、单价、销售量或销售额做出排名。

3.1.2目的意义:在本设计中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。各药品的信息包括:药品编号、药名、药品单价、销出数量、销售额。药品编号共4位,采用字母和数字混合编号,如:A125,前一位为大写字母,后三位为数字,按药品编号进行排序时,可采用基数排序法。对各药品的单价、销售量或销售额进行排序时,可采用多种排序方法,如直接插入排序、冒泡排序、快速排序,直接选择排序等方法。在本设计中,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。
3.1.3达到目标:
(1)设计外部储存药品信息文件txt
(2)建立顺序表
(3)结合多种排序方法
3.2、数据结构和算法说明
3.2.1总体设计与分析和设计:
(1)要设计一个txt文档,把各个药品详细信息储存进去。
(2)代码中需要设计一个顺序表,用来储存外部文件拷贝进来的药品信息。
(3)采用多种排序方法,题目规定,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。

3.2.2采用的数据结构:
(1)多种排序方法:对单价的排序采用冒泡排序法。
冒泡排序
冒泡的基本思想是:
两个数比较大小,较大的数下沉,较小的数冒起来。
趟数
1 21 32 43 98 54 45 23 4 66 9
2 21 32 43 54 45 23 4 66 9 98
3 21 32 43 54 45 23 4 9 66 98
4 21 32 43 45 23 4 9 54 66 98
5 21 32 43 23 4 9 45 54 66 98
6 21 32 23 4 9 43 45 54 66 98
7 21 23 4 9 32 43 45 54 66 98
8 21 4 9 23 32 43 45 54 66 98
9 4 9 21 23 32 43 45 54 66 98
总结:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
(2)对销售量的排序采用快速排序法。
快速排序
快速排序的基本思想是:
先从数列中取出一个数作为基准数;分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边;再对左右区间重复第二步,直到各区间只有一个数
概括来说为 挖坑填数+分治法
下面随机选取数字举例来进行说明,主要有三个参数,low为区间的开始地址,high为区间的结束地址,X为当前的开始的值
第一步,选取第一个值划分,low=0,high=9,X=21
在这里插入图片描述
总结:
1.low =L; high= R; 将基准数挖出形成第一个坑a[low]。
2.High-–由后向前找比它小的数,找到后挖出此数填前一个坑a[low]中。
3.low++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[high]中。
4. 再重复执行2,3二步,直到low==high,将基准数填入a[low]中。
(3)对销售额的排序采用堆排序法。
堆排序
堆排序的基本思想是:
1.将长度为n的待排序的数组进行堆有序化构造成一个大顶堆
2.将根节点与尾节点交换并输出此时的尾节点
3.将剩余的n -1个节点重新进行堆有序化
4.重复步骤2,步骤3直至构造成一个有序序列
假设待排序数组为[20,50,10,30,70,20,80]
构造堆
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结:
在构造有序堆时,我们开始只需要扫描一半的元素(n/2-1 ~ 0)即可,为什么?
因为(n/2-1)~0的节点才有子节点,如图1,n=8,(n/2-1) = 3 即3 2 1 0这个四个节点才有子节点
3.2.3算法思想:
先定义好储存药品信息的顺序表(sequnenlist)
,在从外部文件drug.txt中导入药品清单,其中txt中要设置好间隔及行数
还有题目要求:采用字母和数字混合编号,如:A125。然后建立输出函数show(),读文件函数read(),写文件函数write()。
最后结合各种排序方法进行调用。在快速排序法中,定义函数partition(),在销售量那部分进行快排。在冒号排序法中,定义函数bubbling_sort()和交换函数swap(),两者结合用作单价排序。在堆排序法中,定义函数heapadjust(),head_sort()用作销售额排序。

3.2.4遇到的问题:
(1)在外部文件txt中,一开始设计的行列没有对齐,结果不能读取出来。
(2)在冒号排序法中,一开始直接赋值,需要借助另一个变量进行赋值。3.2.5解决方法
(1)规定外部文件txt的格式,设置好行数和列数,具体格式。
(2)冒号排序法中,定义好另一个变量,利用它来进行交换。
3.3、全部源程序清单
代码清单及主要注释:
源文件下的main.cpp如下:

#define MAXSIZE 100  
int N = 0;
typedef struct node   /*药品信息的元素定义*/
{string num;       /*药品编号*/string name;      /*药品名称*/float price;      /*药品单价*/int count;       /*销售数量*/float sale;       /*本药品销售额*/
}Datatype;
typedef struct        /*存储药品信息的顺序表的定义*/
{Datatype r[MAXSIZE + 1];int length;
}Sequnenlist;
Sequnenlist *l = new Sequnenlist;
int line()
{//获取文件中的药品种数  int len = 0;string str;ifstream file1("drug.txt");while (file1){getline(file1, str);//每次读取一行  if (str.length()>4) //长度4是随便写的,代表本行有数据  len++; //记录药品种类数  }return len;
}
void show()
{//输出  cout << "====序号=====编号=====名称=====单价=====销售量=====销售额====" << endl;for (int i = 1; i <= N; i++)cout << "    [" << i << "]   "<< setw(7) << l->r[i].num<< setw(10) << l->r[i].name<< setw(8) << l->r[i].price<< setw(9) << l->r[i].count<< setw(12) << l->r[i].sale<< endl;
}
void read()
{//读文件  ifstream ofile;string nu;string na;float pr;int co;float sa;ofile.open("drug.txt", ios::in);if (ofile.is_open()){for (int i = 1; i <= N; i++){ofile >> nu >> na >> pr >> co >> sa;l->r[i].num = nu;l->r[i].name = na;l->r[i].price = pr;l->r[i].count = co;l->r[i].sale = sa;if (i == N){cout << "文件导入成功。=^_^=" << endl;cout << "药品种类数:" << i << endl;show();}}}elsecout << "文件打开失败" << endl;
}
void write()
{//写文件  ofstream ifile("drug_1.txt");for (int i = 1; i <= N; i++){ifile << l->r[i].num << "   "<< l->r[i].name << "   "<< l->r[i].price << "   "<< l->r[i].count << "   "<< l->r[i].sale << endl;}show();cout << "药品全部导出到文件 “drug_1.txt”" << endl;
}
int Partition(int low, int high)//快排
{//一趟比较,返回枢纽所在位置  l->r[0] = l->r[low];//将枢纽key暂存在r[0]  int pivotkey = l->r[0].count;while (low<high){while (low<high&&l->r[high].count >= pivotkey)--high;l->r[low] = l->r[high];//将比枢纽小的移到低端  while (low<high&&l->r[low].count <= pivotkey)++low;l->r[high] = l->r[low];//将比枢纽大的移到高端  }l->r[low] = l->r[0];return low;//返回枢纽位置  
}
void QSort(int low, int high)
{if (low<high){int pivotloc = Partition(low, high);//将序列一分为二QSort(low, pivotloc - 1);//对低子表进行递归排序QSort(pivotloc + 1, high);//对高子表进行递归排序}
}
void quick_sort()
{//销售量快排  cout << "按销售量从小到大(快排):" << endl << endl;QSort(1, l->length);//书上276 对顺序表整体排序show();
}
void Swap(int i, int j)
{//交换第i和第j个药品  l->r[MAXSIZE].count = l->r[i].count;l->r[MAXSIZE].name = l->r[i].name;l->r[MAXSIZE].num = l->r[i].num;l->r[MAXSIZE].price = l->r[i].price;l->r[MAXSIZE].sale = l->r[i].sale;l->r[i].count = l->r[j].count;l->r[i].name = l->r[j].name;l->r[i].num = l->r[j].num;l->r[i].price = l->r[j].price;l->r[i].sale = l->r[j].sale;l->r[j].count = l->r[MAXSIZE].count;l->r[j].name = l->r[MAXSIZE].name;l->r[j].num = l->r[MAXSIZE].num;l->r[j].price = l->r[MAXSIZE].price;l->r[j].sale = l->r[MAXSIZE].sale;
}
void bubbling_sort()
{//单价排序冒泡排序法  cout << "按单价从小到大(冒泡排序):" << endl << endl;for (int i = 1; i <= N - 1; i++)//从第一个开始相邻的两个比较  价格从小到大排序for (int j = i + 1; j <= N; j++)if (l->r[i].price>l->r[j].price)Swap(i, j);show();
}
void HeapAdjust(int s, int m)
{//堆排序筛选算法  Datatype rc;rc.count = l->r[s].count;rc.name = l->r[s].name;rc.num = l->r[s].num;rc.price = l->r[s].price;rc.sale = l->r[s].sale;for (int j = 2 * s; j <= m; j *= 2){//沿key较大的孩子节点向下筛选  if ((j<m) && l->r[j].sale<l->r[j + 1].sale) ++j;//j为key较大的记录的下标  if (rc.sale >= l->r[j].sale) break;//rc应插入在位置s上  l->r[s].count = l->r[j].count;l->r[s].name = l->r[j].name;l->r[s].num = l->r[j].num;l->r[s].price = l->r[j].price;l->r[s].sale = l->r[j].sale;s = j;}l->r[s].count = rc.count;l->r[s].name = rc.name;l->r[s].num = rc.num;l->r[s].price = rc.price;l->r[s].sale = rc.sale;
}
void Heap_sort()
{//销售额的排序堆排序法  cout << "按销售额从小到大(堆排序):" << endl << endl;for (int i = l->length / 2; i >= 1; i--)HeapAdjust(i, l->length);for (int i = l->length; i>1; i--){Swap(1, i);//将堆顶记录和当前未经排序子序列中  //的最后一个记录交换  HeapAdjust(1, i - 1);//将l->r[1~i-1]重新调整为大顶堆  }show();
}
void menu()
{//菜单  cout << endl;cout << "                       药品信息管理系统               " << endl;cout << "           ◇                                      ◇" << endl;cout << "                       1、导入药品信息               " << endl;cout << "           ◇          2、导出药品信息             ◇" << endl;cout << "                       3、单价排序                   " << endl;cout << "           ◇          4、销售额排序               ◇" << endl;cout << "                       5、销售量排序                 " << endl;cout << "           ◇          6、退出管理系统             ◇" << endl;cout << endl << endl << "请选择功能:";
}
void exit()
{//退出  cout << endl;cout << "           ◆-------◆---------◆---------◆-------◆" << endl;cout << endl;cout << "           ◇           感谢您的使用!=^_^=        ◇" << endl;cout << endl;cout << "           ◆-------◆---------◆---------◆-------◆" << endl;cout << endl;
}
int main()
{int n;system("color 37");l->length = N = line() - 1;while (1){system("cls");menu();cin >> n;switch (n){case 1:{system("cls");read();system("pause");break;}case 2:{system("cls");write();system("pause");break;}case 3:{system("cls");bubbling_sort();system("pause");break;}case 4:{system("cls");Heap_sort();system("pause");break;}case 5:{system("cls");quick_sort();system("pause");break;}case 6:{system("cls");exit();return 0;}default:{cin.clear();cin.sync();cout << "输入有误,请重新输入!" << endl;system("pause");break;}}}return 0;
}

3.4、程序运行、测试与分析
运行结果:

在这里插入图片描述


http://chatgpt.dhexx.cn/article/ci4fcqrf.shtml

相关文章

什么是医疗健康管理系统?

健康管理系统是通过物联网、云计算等技术为基础&#xff0c;省时省力&#xff0c;开源节流&#xff0c;在工作中大量就医繁琐程序。通过医疗健康管理系统&#xff0c;就可以省去之间繁琐的程序。随着药品监督制度的完善&#xff0c;国家药监部门针对各医药零售企业推出了严格的…

医药进销存管理系统

医药进销存管理系统 分析部分 药品基本情况表:药品编号,药品条码,药品名称,通用码,拼音码,单位,规格码,剂型,产地,包装数量,有效期,质量标准,经营方式,批号,零售价格,进货价格,批发价格,药品类别,医疗编号客户基本情况表:客户编号,客户名称,拼音码,客户地址,所属地区,邮政编码…

(附源码)ssm医药销售管理系统 毕业设计 042322

SSM医药销售管理系统 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采SSM技术和mysql数据库来完成对系统的…

医院药品管理系统开源项目-04 【药品管理】

一、创建药品数据 大致上和之前供货商一样&#xff0c;CtrlC复制粘贴修改 1.1 创建pojo实体类 package com.dh.pojo;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotat…

数据库设计——医药销售管理系统

开发环境和开发工具 操作系统&#xff1a;win8.1 开发环境&#xff1a;Mysql、Web 开发工具&#xff1a;Workbench、Eclipse、JDBC 功能需求分析 员工有权查看、添加会员&#xff0c;查看、添加供应商&#xff0c;查询药品&#xff08;输入药品编号或名称、类别等查询该药…

医院管理系统/医院药品管理系统

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

基于SSM实现的医院医药药品管理系统-JAVA【毕业设计定制、快速开发、源码、开题报告】

功能介绍 登录系统&#xff1a;管理员需要输入正确的用户名和密码来登录系统&#xff0c;从而完成各类信息的管理工作&#xff1b; 信息查询&#xff1a;查询客户信息、查询经办人信息、查询药品信息&#xff1b; 信息录入&#xff1a;录入顾客信息、录入经办人信息、录入药…

ec java sm2证书_国密算法SM2证书制作

前段时间将系统的RSA算法全部升级为SM2国密算法&#xff0c;密码机和UKey硬件设备大都同时支持RSA和SM2算法&#xff0c;只是应用系统的加解密签名验证需要修改&#xff0c;这个更改底层调用的加密动态库来&#xff0c;原来RSA用的对称加密算法DES(AES)和摘要MD5(SHA1)也相应改…

SM2椭圆曲线

文章目录 题目环境方案设计背景原理算法步骤 方案实现流程图加密解密 主要函数C代码测试数据结果 注意问题 说明 题目 实现SM2椭圆曲线公钥密码算法&#xff0c;对给出的英文消息进行加密得到密文&#xff0c;并能通过密文解密出明文。 环境 Windows10&#xff0c;MinGW-W64…

JAVA集成国密SM2

JAVA集成国密SM2加解密 一、pom配置二、代码集成2.1、目录结构2.2、源码2.3、测试 三、相关链接 国密算法概述&#xff1a;https://blog.csdn.net/qq_38254635/article/details/131801527 SM2椭圆曲线公钥密码算法 为非对称加密&#xff0c;基于ECC。该算法已公开。由于该算法…

Java SM2

pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http…

ECCSM2

ECC&SM2 ECC 基本内容 概念 ECC 全称为椭圆曲线加密&#xff0c;EllipseCurve Cryptography&#xff0c;是一种基于椭圆曲线数学的公钥密码。与传统的基于大质数因子分解困难性的加密方法(RSA)不同&#xff0c;ECC 依赖于解决椭圆曲线离散对数问题的困难性。它的优势主要…

C# SM2

Cipher using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.Math.EC;namespace SM2Test {/// <summary>/// 密码计算/// </summary>public…

Springboot整合SM2加密的笔记

首先要明白公钥是加密&#xff0c;私钥用来解密。 国密公钥格式&#xff1a;公钥为64位&#xff0c;前后各32位&#xff0c;对应椭圆算法中BigInteger X 和 BigInteger X &#xff0c;私钥为32位&#xff0c;对应算法中的BigInteger d。 工具类&#xff1a; 可以参考https:/…

SM2加解密、签名验签

导论 SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法&#xff0c;在我们国家商用密码体系中被用来替换RSA算法。 国产SM2算法&#xff0c;是基于ECC的&#xff0c;但二者在签名验签、加密解密过程中或许有些许区别&#xff0c;目前鄙人还不太清楚&#xff0c…

sm2和sm4加密算法浅析

sm2和sm4加密算法浅析 一: SM2 简介&#xff1a;SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法 &#xff0c;SM2为非对称加密&#xff0c;基于ECC。该算法已公开。由于该算法基于ECC&#xff0c;故其签名速度与秘钥生成速度都快于RSA。ECC 256位&#xff0…

国密算法(SM2)简介及SM2生成秘钥

国密算法&#xff08;SM2&#xff09;生成秘钥 一、国密算法介绍二、SM2算法和RSA算法比较三、生成SM2秘钥1、openssl生成SM2秘钥1.1、安装openssl1.2、生成SM2私钥1.3、生成SM2公钥 2、nodejs:使用sm-crypto包生成SM2秘钥3、c生成秘钥 参考 一、国密算法介绍 国密即国家密码局…

向量积(叉积)

a和b叉积可表示为ab&#xff0c;结果是一个和这两个向量都垂直的伪向量 ab absinθ*n &#xff0c;ab为两向量的模长&#xff0c;θ是两向量的夹角&#xff0c;n是垂直二者的单位向量。 叉积的长度可以理解为以ab为邻边的平行四边形面积 叉积的运算 反交换律 ab-ba 分配律…

向量的点乘(内积)和叉乘(外积)

向量点乘&#xff1a;a * b&#xff08;常被写为a b&#xff09; 点乘,也叫向量的内积、数量积.顾名思义,求下来的结果是一个数. 向量a向量b|a||b|cos 在物理学中,已知力与位移求功,实际上就是求向量F与向量s的内积,即要用点乘. 向量叉乘&#xff1a;a ∧ b&#xff08;常被…

向量的内积(点乘)与外积(叉乘)

向量的内积&#xff08;点乘&#xff09;与外积&#xff08;叉乘&#xff09; 向量的内积点乘 向量的外积叉乘 向量的内积&#xff08;点乘&#xff09; 内积的几何意义&#xff1a; 用来表征或计算两个向量之间的夹角在b向量在a向量方向上的投影。 向量的外积&#xff08;叉…