C++杂志订阅管理系统.docx
《C++杂志订阅管理系统.docx》由会员分享,可在线阅读,更多相关《C++杂志订阅管理系统.docx(22页珍藏版)》请在冰豆网上搜索。
C++杂志订阅管理系统
#include//数据流输入输出
#include//字符串操作
#include//文件输入输出
#include//时间库函数
#include//输入输出格式符
usingnamespacestd;//命名空间
intyear,month;
classOrder_infor
{
stringname;//用户姓名
stringsex;//用户性别
stringaddr;//用户地址
stringtel;//用户号码
stringmage;//杂志单位
floatprice;//杂志单价
intnum;//订阅数目
inty,m;//订阅限期
intg;
public:
Order_infor*head;//信息类头指针
Order_infor*next;//信息类next域
voidinput();//录入函数
voidinput(ifstream&infile);//读取函数
voidoutput();//输出函数
voidoutput(ofstream&outfile);//写入函数
floatgetprice();
intgetnum();
intgetyear();//获取期限时间函数
intgetmonth();
stringgetname();
voidorder();//录入信息
voidmend();//修改信息
voiddel_select();
voiddel1();//删除信息
voiddel2();
voidfound();
Order_infor*find(stringn);
boolfind(inty,intm);
voidstatistic();
voidshow();//显示信息
boolcomp(inty,intm);//判断当前订阅状况函数
voidsave();//保存信息
voidbegin();//初始信息
voidclear();//清除函数
voidsetg(intk){g=k;}//设置系统修改标志
intgetg(){returng;}//返回系统修改标志
}d;
floatOrder_infor:
:
getprice()
{
returnprice;
}
intOrder_infor:
:
getnum()
{
returnnum;
}
intOrder_infor:
:
getyear()
{
returny;
}
intOrder_infor:
:
getmonth()
{
returnm;
}
stringOrder_infor:
:
getname()
{
returnname;
}
classMenu
{
public:
voidabout();//关于
voidmainmenu();//主菜单函数
boolland();//管理员登陆
};
voidMenu:
:
about()
{
cout<<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<<<"\t1."<<<"\t2."<<<"\t3."<<<"\t4."<cout<<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<}
boolMenu:
:
land()
{
Menub;//定义菜单类对象
b.about();//输出系统说明
strings;
inti=0;//计数变量
cout<<"请输入管理员密码:
"<while
(1)
{
cin>>s;
if(s=="123456")//输入正确
returntrue;//返回正确
else//输错了
{
cout<<"输入密码错误,请重新输入:
";//输出提示信息
i++;//计数变量自加
if(i>=3)//连输三次错误
break;//跳出循环
}
}
cout<<"输入错误三次!
系统自动退出!
"<system("pause");//显示暂停
returnfalse;//返回错误
}
voidMenu:
:
mainmenu()
{
system("cls");
strings;
cout<<"********************************************************************************"<cout<<"欢迎使用杂志订阅管理软件"<cout<<"********************************************************************************"<cout<<"\t\t0.退出程序4.浏览订阅用户"<cout<<"\t\t1.增加新订户5.查找用户信息"<cout<<"\t\t2.删除用户6.修改用户信息"<cout<<"\t\t3.统计本期杂志订户数7.保存信息"<cout<<"请输入功能按钮:
";
cin>>s;
switch(s[0])
{
case'1':
d.order();break;
case'2':
d.del_select();break;
case'3':
d.statistic();break;
case'4':
d.show();break;
case'5':
d.found();break;
case'6':
d.mend();break;
case'7':
d.save();break;
default:
return;
}
}
voidOrder_infor:
:
input()
{
cout<<"请输入姓名:
";
while
(1)
{
cin>>name;//输入姓名
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n姓名输入错误,请重新输入:
";
cin.clear();//清除错误状态
cin.get();//重输
}
elsebreak;//输入正确则跳出循环
}
cout<<"请输入性别:
";
while
(1)
{
cin>>sex;//输入性别
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n性别输入错误,请重新输入:
";
cin.clear();//清除错误状态
cin.get();//重输
}
elsebreak;//输入正确则跳出循环
}
cout<<"请输入地址:
";//设置地址
while
(1)
{
cin>>addr;//输入地址
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n地址输入错误,请重新输入:
";
cin.clear();//清除错误状态
cin.get();//重输
}
elsebreak;//输入正确则跳出循环
}
cout<<"请输入电话号码:
";//设置电话号码
while
(1)
{
cin>>tel;//输入电话号码
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n号码输入错误,请重新输入:
";
cin.clear();//清除错误状态
cin.get();//重输
}
elsebreak;//输入正确则跳出循环
}
cout<<"请输入杂志单位:
";//设置杂志单位
while
(1)
{
cin>>mage;//输入杂志单位
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n杂志单位输入错误,请重新输入:
";
cin.clear();//清除错误状态
cin.get();//重输
}
elsebreak;//输入正确则跳出循环
}
cout<<"请输入单价:
";//设置单价
while
(1)
{
cin>>price;//输入单价
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n单价输入错误,请重新输入:
";
cin.clear();//清除错误状态
cin.get();//重输
}
elsebreak;//输入正确则跳出循环
}
cout<<"请输入订阅数:
";//设置订阅数
while
(1)
{
cin>>num;//输入订阅数
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n订阅数输入错误,请重新输入:
";
cin.clear();//清除错误状态
cin.get();//重输
}
elsebreak;//输入正确则跳出循环
}
cout<<"请输入订阅限期(年月):
";//设置期限
while
(1)
{
cin>>y>>m;//输入期限
if(cin.fail())//判断输入的数据类型是否有错
{
cout<<"\n订阅限期输入错误,请重新输入:
";
cin.clear();//清除错误状态
cin.get();//重输
}
elsebreak;//输入正确则跳出循环
}
}
voidOrder_infor:
:
input(ifstream&infile)//带参录入函数向链表输入
{
infile>>name>>sex>>addr>>tel>>mage>>price>>num>>y>>m;//输入至链表
}
voidOrder_infor:
:
output()//信息输出函数向显示屏输出
{
cout<(2)<}
voidOrder_infor:
:
output(ofstream&outfile)//向文件输出信息
{
outfile<<<<<<<<<<}
boolOrder_infor:
:
comp(inty,intm)//判断是否超期
{
if(year>y||(year==y&&month>m))//先比较年,若一样则比较月
returntrue;//比较当前时间与限期,获得订阅的当前状况,返回表示订阅超期
else
returnfalse;//返回表示订阅未超期
}
voidOrder_infor:
:
order()//向链表尾部录入订阅信息
{
system("cls");//清屏
Order_infor*p1,*p2=NULL;//定义对象指针
p1=head;//将头指针赋给p1
intn=1;//定义循环控制变量
while(p1->next)//当头结点后有数据时执行循环,头结点为空也不会执行循环
p1=p1->next;//使p能够指向未存放数据的内存,录入信息会存放在所有信息之后
while(n)//此循环执行在链表尾部插入录入的信息
{//通过循环不断开辟新空间录入新的数据
p2=newOrder_infor;//开辟存储空间,返回地址给p2
p2->input();//调用录入函数,为p2所指结点数据赋值
p1->next=p2;//p1的next指向新开辟空间,连接了p1和p2
p2->next=NULL;//p2的next变为空指针
p1=p1->next;//p1指向新开辟的空间,p1紧随p2之后
Order_infor:
:
setg
(1);//标记为修改
cout<<"\t\t\t按1继续,按0返回:
";//控制变量控制循环
cin>>n;//输入n
}
}
voidOrder_infor:
:
show()
{
system("cls");//清屏
cout.setf(ios:
:
left);
cout<<"订阅基本信息如下:
"<<<<Order_infor*p;//定义订阅信息类对象指针
p=head;//指向链表头部,启用链表信息
while(p->next)//只要下一结点不为空则执行循环
{//此循环功能在于输出所有订阅信息
p=p->next;//P指向下一节点
cout<name<sex<addr
<tel<mage<price<num<y<<"/"<m<}
}
voidOrder_infor:
:
found()
{
system("cls");//清屏
stringn;//定义辅助变量
cout<<"输入姓名:
";//输出提示信息
cin>>n;//输入选择
if(!
find(n))//调用find函数查找
{
cout<<"\t\t找不到你要查找的内容!
"<return;//函数调用结束
}
}
Order_infor*Order_infor:
:
find(stringn)
{
system("cls");//清屏
Order_infor*p;//定义辅助指针
p=head;//指向链表头结点
while(p->next)//当链表未至尾部时执行循环
{
if((p->next)->getname()==n)//班次匹配上则输出所查到的订阅信息
{
cout.setf(ios:
:
left);
cout<<"订阅基本信息如下:
"<<<"姓名性别地址电话单位单价定阅数期限"<(p->next)->output();//调用输出函数
returnp;//表示找到,返回的是目标结点的前一结点
}
p=p->next;//指向下一节点
}
returnNULL;
}
voidOrder_infor:
:
mend()//修改函数
{
system("cls");//清屏
Order_infor*p;//定义信息类指针变量
stringn;
cout<<"\t\t\t输入姓名方便查找:
";//输出提示信息
cin>>n;
p=find(n);//调用查找函数
if(!
p)//判断是否找到
{
cout<<"\t\t找不到你要修改的内容!
请利用程序查询功能确认!
"<return;//函数调用结束
}
(p->next)->input();//调用录入函数对目标结点数据再录入
Order_infor:
:
setg
(1);
}
voidOrder_infor:
:
del_select()
{
cout<<"请选择删除选项:
"<cout<<"1.删除过期用户;2.删除指定用户"<intc;
cin>>c;
switch(c)
{
case1:
d.del2();break;
case2:
d.del1();break;
default:
cout<<"输入错误!
";
}
}
voidOrder_infor:
:
del1()//删除车辆信息函数
{
system("cls");//清屏
Order_infor*p1,*p2,*p3;//定义两对象指针用于链表操作
stringn;
cout<<"\t\t\t输入姓名:
";//输出提示信息
cin>>n;
p1=find(n);//调用查找函数
if(!
p1)//判断函数返回值是否为NULL
{
cout<<"\t\t找不到你要删除的内容!
"<return;//函数调用结束
}
cout<<"\n\t\t\t确定删除(y/n)?
";//显示将要删除数据信息供用户核对
chara;
cin>>a;//输入指示
if(a=='y'||a=='Y')
{//因为头结点为空仅有next域所以只要考虑被删结点是中间结点和尾结点情况
if((p1->next)->next==NULL)//目标结点为尾结点时
{
p2=p1->next;//p2指向目标结点
p1->next=NULL;//p1连接目标结点的next域重新赋值为空指针
deletep2;//释放目标空间
}
else
{//目标结点为中间节点时
p2=p1->next;//p2指向目标结点
p3=(p1->next)->next;//p3指向目标结点下一结点
p1->next=p3;//连接目标结点前后结点
deletep2;//释放目标结点
}
Order_infor:
:
setg
(1);//标记为修改
}
}
voidOrder_infor:
:
del2()
{
system("cls");//清屏
Order_infor*p1,*p2,*p3;//定义两对象指针用于链表操作
intn;
charc;
p1=head;
while(p1->next)
{
n=p((p1->next)->y,(p1->next)->m);
if(n)
{
system("cls");
cout<<"订阅基本信息如下:
"<<<"姓名性别地址电话单位单价定阅数期限"<(p1->next)->output();
cout<<"是否删除(y/n)";
cin>>c;
if(c=='y'||c=='Y')
{//因为头结点为空仅有next域所以只要考虑被删结点是中间结点和尾结点情况
if((p1->next)->next==NULL)//目标结点为尾结点时
{
p2=p1->next;//p2指向目标结点
p1->next=NULL;//p1连接目标结点的next域重新赋值为空指针
deletep2;//释放目标空间
return;
}
else
{//目标结点为中间节点时
p2=p1->next;//p2指向目标结点
p3=(p1->next)->next;//p3指向目标结点下一结点
p1->next=p3;//连接目标结点前后结点
deletep2;//释放目标结点
}
Order_infor:
:
setg
(1);//标记为修改
}
}
p1=p1->next;
}
}
voidOrder_infor:
:
statistic()
{
Order_infor*p;
intn=0;
intsum=0;
p=head;
cout<<"本期订阅信息"<cout<<"用户名订阅数单价全额"<while(p->next)
{
cout<<(p->next)->getname()<<"\t"<<(p->next)->getnum()
<<"\t"<<(p->next)->getprice()<<"\t"
<<((p->next)->getnum()*(p->next)->getprice())<n=n+((p->next)->getnum());
sum+=((p->next)->getnum()*(p->next)->getprice());
p