项目实习的管理系统都可以用,不啰嗦,直接上干货。有原代码,注释清晰,附带实习报告。
题目要求:
药品信息包括:药品编号、药品名称、生产厂家、保质日期、药品类型、药品数量(已售数量和库存数量)、价格等。试设计药品销售系统,使之具有以下功能:
存储数据方式不限,系统以菜单方式工作
药品信息录入功能--输入
药品信息浏览功能--输出
药品信息查询功能--算法
查询方式:按药品编号、药品名称、生产厂家等查询
药品信息的删除与修改
包括药品的销售、进货、撤架等操作
新需求:药品即将过期提醒功能。
系统原代码及其注释:
实验报告链接:https://pan.baidu.com/s/1Pfr9p8mMZWYpj4eDm9VXGg
提取码:1226
#include<iostream>
#include<fstream>
//#include<cstring>
//#include<conio.h>
//#include<string>
#pragma warning(disable:4996)
using namespace std;
//-------------------medicine类-------------------//
class medicine
{
public:
int snumber;//药品已售数量
int rnumber;//药品库存数量
int price;//药品价格
int year;//保质日期,年
int month;//保质日期,月
int day;//保质日期,日
char name[10];//药品名字
char PD[5];//生产厂商
char ID[20];//药品编号
char type;//药品类型
medicine* Next;
void Input(); //Input( )函数输入药品信息
void ReadFile(istream& in); //ReadFile( )函数读取文件内容
void Show1();
};
void medicine::Input()
{
cout << "\t\t 请输入药品名字: "; cin >> name;
cout << "\t\t 请输入药品编号: "; cin >> ID;
cout << "\t\t 请输入生产厂商: "; cin >> PD;
cout << "\t\t 请输入药品类型: "; cin >> type;
cout << "\t\t 请输入已售数量: "; cin >> snumber; //与用户交互药品信息
cout << "\t\t 请输入库存数量: "; cin >> rnumber;
cout << "\t\t 请输入药品价格: "; cin >> price;
cout << "\t\t 请输入保质年份: "; cin >> year;
cout << "\t\t 请输入保质月份: "; cin >> month;
cout << "\t\t 请输入保质日份: "; cin >> day;
}
void medicine::ReadFile(istream& in)
{
in >> name >> ID >> PD >> type >> snumber >> rnumber >> price >> year >> month >> day; //按照此顺序依次读取药品文档信息
}
void medicine::Show1()
{
cout << name << "\t" << ID << "\t" //药品信息的展示
<< PD << "\t" << type << "\t" << snumber << "\t" << rnumber << "\t" << price << "\t"
<< year << "\t" << month << "\t" << day << "\n";
}
//-------------------medicinemessage类-------------------//
class medicinemassage
{
public:
medicinemassage();
void ShowMenu();
void Find();
void Save();
void findgq(); //药店药品信息管理系统功能实现函数
void findjgq();
void ModifyItem();
void RemoveItem();
void Display1();
void AddItem();
private:
medicine* head, * end;
ifstream in;
ofstream out;
medicine* FindItem(char* name) //通过药品名字查找
{
for (medicine* p = head; p->Next != end; p = p->Next) //遍历链表,查找是否链表节点药品名字信息是否与要查找的药品名字信息一致
if (!strcmp(p->Next->name, name)) return p; //如果有返回该链表节点
return NULL;
}
medicine* FindID(char* ID) //通过药品编号查找
{
for (medicine* p = head; p->Next != end; p = p->Next) //遍历链表,查找是否链表节点药品编号信息是否与要查找的药品编号信息一致
if (!strcmp(p->Next->ID, ID)) return p; //如果有返回该链表节点
return NULL;
}
medicine* FindPD(char* PD) //通过生产厂商查找
{
for (medicine* p = head; p->Next != end; p = p->Next) //遍历链表,查找是否链表节点药品生产厂商信息是否与要查找的药品生产厂商信息一致
if (!strcmp(p->Next->PD, PD)) return p; //如果有返回该链表节点
return NULL;
}
};
//--------------------------------------------------------------------------------菜 单-------------------------------------------------------------------------------------//
void medicinemassage::ShowMenu()
{
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 << "**************************** 7.销售或进货药品 *****************************" << endl;
cout << "**************************** 8.查询已经过期药品 *****************************" << endl;
cout << "**************************** 9.查询即将过期药品 *****************************" << endl;
cout << "**************************** 0.安全退出系统 *****************************" << endl;
cout << "**************************************************************************************" << endl;
}
// 读入药品信息
medicinemassage::medicinemassage()
{
head = new medicine;
head->Next = new medicine; //建立一个空链表
end = head->Next;
in.open("sort5.txt"); //打开文档
if (!in) cout << "这是一个新系统,无药品信息,请先输入。" << endl; //空
else
{
while (!in.eof()) //药品信息读取完成退出
{
end->ReadFile(in);
if (end->name[0] == '\0') break;
end->Next = new medicine; //将文档中药品信息存放到链表当中
end = end->Next;
}
in.close(); //读取完成关闭文档
cout << "\t\t 读取药品信息成功!" << endl;
}
}
// 保存药品信息
void medicinemassage::Save()
{
out.open("sort5.txt"); //打开文档准备写入
for (medicine* p = head->Next; p != end; p = p->Next) //遍历储存药品信息的链表
{
out << p->name << "\t\t" << p->ID << "\t\t" << p->PD << "\t\t" << p->type << "\t\t" << p->snumber << "\t\t" << p->rnumber << "\t\t" << p->price
<< "\t\t" << p->year << "\t\t" << p->month << "\t\t" << p->day << "\t\t" << endl; //将链表各个节点药品信息写入文档
}
cout << "保存成功" << endl;
out.close(); //写入药品信息关闭文档
}
// 添加药品信息
void medicinemassage::AddItem()
{
end->Input(); //调取与用户间交互药品信息的函数
end->Next = new medicine;
end = end->Next; //储存交互的药品信息于链表中
cout << "添加成功!" << endl;
cout << "请不要忘记保存哦" << endl;
}
// 浏览药品信息
void medicinemassage::Display1()
{
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n\n";
for (medicine* p = head->Next; p != end; p = p->Next) //遍历链表并输出链表各个节点的药品的所有信息
p->Show1();
}
// 药店药品查找
void medicinemassage::Find()
{
char c = 'n';
do
{
char name[10], ID[20], PD[5];
medicine* p = NULL;
cout << "\n\t\t*********************************\n";
cout << "\t\t※ 1.按药品名字查找 \n\t\t※ 2.按药品编号查找 \n\t\t※ 3.按生产厂商查找 "; //三个方式供用户选择进行查找药品信息,根据用户输入不同的数字选项,实现其选项的查找
cout << "\n\t\t*********************************\n ";
cout << "\t\t请选择: ";
int x;
cin >> x;
switch (x)
{
case 1:
{int flag = 1; //以flag作为标注,flag为1表示查不到药品信息,flag为0表示查到了药品信息
int flag0 = 1; //以flag0为标注,保持表头只输出一次
cout << "\t\t请输入要查找药品名字: ";
cin >> name;
for (medicine* p = head; p->Next != end; p = p->Next) //遍历链表
{
if (!strcmp(p->Next->name, name))
{
if (flag0)
{
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n\n";
flag0 = 0;
}
p->Next->Show1(); //如果某一链表节点药品信息与用户输入的药品某一信息一致,则输出该链表节点的所有药品信息
flag = 0; //将flag置为0,表示找到
}
}
if (flag) //flag为1,提示用户未找到
{
cout << "\t\t没有找到相匹配的药品! " << "\n\n";
}
} break;
case 2:
{int flag = 1; //以flag作为标注,flag为1表示查不到药品信息,flag为0表示查到了药品信息
int flag0 = 1; //以flag0为标注,保持表头只输出一次
cout << "\t\t请输入要查找药品编号: ";
cin >> ID;
for (medicine* p = head; p->Next != end; p = p->Next) //遍历链表
{
if (!strcmp(p->Next->ID, ID)) //如果某一链表节点药品信息与用户输入的药品某一信息一致,则输出该链表节点的所有药品信息
{
if (flag0)
{
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n\n";
flag0 = 0;
}
p->Next->Show1();
flag = 0; //将flag置为0,表示找到
}
}
if (flag)
{ //flag为1,提示用户未找到
cout << "\t\t没有找到相匹配的药品! " << "\n\n";
}
} break;
case 3:
{int flag = 1; //以flag作为标注,flag为1表示查不到药品信息,flag为0表示查到了药品信息
int flag0 = 1; //以flag0为标注,保持表头只输出一次
cout << "\t\t请输入要查找生产厂商: ";
cin >> PD;
for (medicine* p = head; p->Next != end; p = p->Next) //遍历链表
{
if (!strcmp(p->Next->PD, PD)) //如果某一链表节点药品信息与用户输入的药品某一信息一致,则输出该链表节点的所有药品信息
{
if (flag0)
{
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n\n";
flag0 = 0;
}
p->Next->Show1();
flag = 0; //将flag置为0,表示找到
}
}
if (flag)
{
cout << "\t\t没有找到相匹配的药品! " << "\n\n"; //flag为1,提示用户未找到
}
} break;
}
cout << "\t\t请问是否要继续查找?(y/n) : "; //提醒用户是否继续查找
cin >> c;
} while (c == 'y'); //当用户输入“y”视为继续查找,“n”视为关闭查找功能
}
// 药店药品撤架
void medicinemassage::RemoveItem()
{
char c = 'n';
do
{
char name[20]; char ID[20];
medicine* p = NULL, * temp = NULL;
cout << "\n\t\t*********************************\n";
cout << "\t\t※ 1.按药品名字撤架\n\t\t※ 2.按药品编号撤架 "; //提供给用户两种方式以撤架药品
cout << "\n\t\t*********************************\n ";
int x;
cout << "\t\t请选择:";
cin >> x;
switch (x)
{
case 1:
{cout << "\t\t请输入要撤架的药品名字 :"; cin >> name;
if (p = FindItem(name)) //首先确认是否存在该药品信息,使用信息查找功能函数FindTtem查找此药品,如果有则进行下一步撤架工作
{
temp = p->Next;
p->Next = p->Next->Next; //将所含此药品信息的节点的上一节点和下一节点进行连接以此去除该节点的所有药品信息视为撤架药品
delete temp;
cout << "\t\t撤架成功!" << endl;
// cout << "输入任意字符!继续······";
// getchar();
}
else //如果未找到该药品信息不再进行下一部撤架工作并提醒用户
{
cout << "\t\t没有找到!" << endl;
// cout << "输入任意字符!继续······";
// getchar();
}
}break;
case 2:
{cout << "\t\t请输入要撤架的药品编号 :"; cin >> ID;
if (p = FindID(ID)) //首先确认是否存在该药品信息,使用编号查找功能函数 FindID查找此药品,如果有则进行下一步撤架工作
{
temp = p->Next;
p->Next = p->Next->Next; //将所含此药品信息的节点的上一节点和下一节点进行连接以此去除该节点的所有药品信息视为撤架药品
delete temp;
cout << "\t\t撤架成功!" << endl;
// cout << "输入任意字符!继续······";
// getchar();
}
else
{
cout << "\t\t没有找到!" << endl; //如果未找到该药品信息不再进行下一部撤架工作并提醒用户
// cout << "输入任意字符!继续······";
// getchar();
}
}break;
default:
break;
}
cout << "\t\t请问是否要继续撤架?(y/n) : "; //提醒用户是否继续撤架
cin >> c;
} while (c == 'y'); //当用户输入“y”视为继续,“n”视为关闭
}
// 销售进货
void medicinemassage::ModifyItem()
{
int n;
char c = 'n';
do
{
char name[10];
medicine* p = NULL;
//cout << "\t\t请输入需要销售或者进货的药品名字 :"; cin >> name;
cout << "\n\t\t*********************************\n";
cout << "\t\t※ 1.药品销售\n\t\t※ 2.药品进货 ";
cout << "\n\t\t*********************************\n ";
int x;
cout << "\t\t请选择:";
cin >> x;
switch (x)
{
case 1: {cout << "\t\t请输入需要销售的药品名字 :"; cin >> name;
if (p = FindItem(name)) //首先确认是否存在该药品信息,使用信息查找功能函数FindTtem查找此药品,如果有则进行下一步销售工作
{
cout << "销售前药品信息:" << "\n"; //打印销售前药品信息,供用户酌情销售
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n\n";
p->Next->Show1();
cout << "\t\t本次销售" << name << "的药品数量: "; cin >> n;
if (p->Next->rnumber >= n)
{
p->Next->snumber += n; p->Next->rnumber -= n; //销售完毕,对该药品已售和库存数量进行修改
cout << "本次销售后此药品信息: " << "\n";
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n";
p->Next->Show1(); //修改后展示该药品信息
}
else
cout << "库存不够" << endl;
}
else
cout << "无此药品信息,请重新录入" << endl;
}break;
case 2: {cout << "\t\t请输入需要进货的药品名字 :"; cin >> name; //首先确认是否存在该药品信息,使用信息查找功能函数FindTtem查找此药品,如果有则进行下一步销售工作
if (p = FindItem(name))
{
cout << "进货前药品信息:" << "\n"; //打印进货前药品信息,供用户酌情进货
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n\n";
p->Next->Show1();
cout << "\t\t本次进货" << name << "的药品数量: "; cin >> n;
p->Next->rnumber += n; //进货完毕,对该药品库存数量进行修改
cout << "本次销售后此药品信息: " << "\n";
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n";
p->Next->Show1(); //修改后展示该药品信息
}
else
cout << "无此药品信息,请重新录入" << endl;
}break;
default:
break;
}
cout << "\t\t请问是否要继续销售或进货?(y/n) : "; //提醒用户是否继续销售或补货
cin >> c;
} while (c == 'y'); //当用户输入“y”视为继续,“n”视为关闭
}
// 提醒已经过期药品
void medicinemassage::findgq()
{
medicine* q = NULL;
int flag = 1; //以flag作为标注,flag为1视为药品过期,flag为0视为药品保质
int year, month, day;
time_t timep;
struct tm* p;
time(&timep);
p = gmtime(&timep);
day = p->tm_mday; //获取当前月份日数,范围是1-31
month = 1 + p->tm_mon; //获取当前月份,范围是0-11,所以要加
year = 1900 + p->tm_year; //获取当前年份,从1900开始,所以要加1900
for (medicine* p = head; p->Next != end; p = p->Next)//遍历链表,输出该节点所含药品保质日期信息
{
if (p->Next->year < year) { //该节点药品保质年期小于现今年期视为药品过期
{cout << p->Next->name << "已过期 " << " 其保质日期为 " << p->Next->year << "." << p->Next->month << "." << p->Next->day << endl;//提醒用户保质时间已到,
flag = 0; //将flag置为0表示药品过期
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n";
p->Next->Show1(); cout << endl; } //输出该节点过期药品的全部信息
}
else if (p->Next->year == year && p->Next->month < month) { //该节点药品保质年期与现今年期相等且该节点药品保质月期小于现今月期视为过期
{cout << p->Next->name << "已过期 " << " 其保质日期为 " << p->Next->year << "." << p->Next->month << "." << p->Next->day << endl;//提醒用户保质时间已到,
flag = 0; //将flag置为0表示药品过期
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n";
p->Next->Show1(); cout << endl; } //输出该节点过期药品的全部信息
}
else if (p->Next->year == year && p->Next->month == month && p->Next->day < day) {//该节点药品保质年月期数与现今年月期数相等且小于该节点药品保质日期数现今日期的视为即将过期
{cout << p->Next->name << "已过期 " << " 其保质日期为 " << p->Next->year << "." << p->Next->month << "." << p->Next->day << endl;//提醒用户保质时间将到,
flag = 0; //将flag置为0表示药品过期
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n";
p->Next->Show1(); cout << endl; } //输出该节点过期药品的全部信息
}
}
if (flag) //flag为1视为药品还处于保质时间中
{
cout << "无过期产品,输入数字9即可查询是否有即将过期药品" << endl;
}
}
// 提醒即将过期药品
void medicinemassage::findjgq()
{
cout << endl;
cout << "******************************* 注 意 *******************************" << endl;
cout << "*******************************本系统将距离保质日期还有两个月内的时间认定为药品将要过期*******************************" << endl;
cout << endl;
medicine* q = NULL;
int flag = 1; //以flag作为标注,flag为1视为药品过期,flag为0视为药品保质
int year, month, day;
time_t timep;
struct tm* p;
time(&timep);
p = gmtime(&timep);
day = p->tm_mday; //获取当前月份日数,范围是1-31
month = 1 + p->tm_mon; //获取当前月份,范围是0-11,所以要加
year = 1900 + p->tm_year; //获取当前年份,从1900开始,所以要加1900
for (medicine* p = head; p->Next != end; p = p->Next)//遍历链表,输出该节点所含药品保质日期信息
{
//距离保质日期还有两个月内的时间视为药品将要过期
if (p->Next->year == year + 1 && p->Next->month == 1 && month == 12) {
{cout << p->Next->name << "即将过期 " << " 其保质日期为 " << p->Next->year << "." << p->Next->month << "." << p->Next->day << endl;//提醒用户保质时间已到,
flag = 0; //将flag置为0表示药品过期
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n";
p->Next->Show1(); cout << endl; } //输出该节点过期药品的全部信息
}
else if (p->Next->year == year && p->Next->month == month && p->Next->day > day) {
{cout << p->Next->name << "即将过期 " << " 其保质日期为 " << p->Next->year << "." << p->Next->month << "." << p->Next->day << endl;//提醒用户保质时间已到,
flag = 0; //将flag置为0表示药品过期
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n";
p->Next->Show1(); cout << endl; } //输出该节点过期药品的全部信息
}
else if (p->Next->year == year && p->Next->month == month + 1) {
{cout << p->Next->name << "即将过期 " << " 其保质日期为 " << p->Next->year << "." << p->Next->month << "." << p->Next->day << endl;//提醒用户保质时间将到,
flag = 0; //将flag置为0表示药品过期
cout << "|名 字|" << "编 号|\t" << "厂 商|\t"
<< "类 型|\t" << "已 售|\t" << "库 存|\t" << "价 格|\t"
<< "年 份|\t" << "月 份|\t" << "日 份|\t" << "\n";
p->Next->Show1(); cout << endl; } //输出该节点过期药品的全部信息
}
}
if (flag) //flag为1视为药品还处于较长保质时间中
{
cout << "无即将过期药品,可以输入数字8即可查询是否有已经过期的药品" << endl;
}
}
int main()//主函数,根据用户不同的操作要求,调用不同的功能函数实现工作要求
{
int x, i = 0;
int zh, key;
bool quit = false;
cout << "\t\t************************************************************ \n" << endl;
medicinemassage YAO;
cout << endl;
cout << "\t\t************************************************************\n" << endl;
cout << "请输入账号" << endl;
cin >> zh;
cout << "请输入密码" << endl;
cin >> key;
if (zh == 123 && key == 666)
{
while (!quit)
{
system("pause"); system("cls");
YAO.ShowMenu();
cout << "\t\t\n\t\t →请选择相应的数字进行操作: ";
cin >> x;
cout << endl;
switch (x)
{
case 1:YAO.medicinemassage::medicinemassage();
break;
case 2:YAO.Save(); break;
case 3:YAO.AddItem(); break;
case 4:YAO.Display1(); break;
case 5:YAO.Find(); break;
case 6:YAO.RemoveItem(); break;
case 7:YAO.ModifyItem(); break;
case 8:YAO.findgq(); break;
case 9:YAO.findjgq(); break;
case 0:exit(0); break;
}
}
}
else
{
cout << "信息不匹配,无权访问" << endl;
exit(0);
}
return 0;
}