//vc++6.0实现的C++版链表
//课题名称:彩票自动生成与对比系统
//主要功能:用目前社会上已经存在的22选5的彩票玩法,编写出用户购买彩票,计算机自动给出彩票,以及模拟当天彩票推出的结果,同时给出对比结果.
#include <iostream.h>
#include <windows.h>
#include <fstream.h>
#include <iomanip.h>
#include <time.h>
enum returninfo{success,fail};//用枚举类型保存各种返回信息的英语单词,以便分类处理
const int CUTTINGLINESTART=1;//定义切分线开始位置
const int CUTTINGLINELENGTH=25;//定义切分线长度
const int GETRONDMAXNUMBER=22;//定义系统自动产生数据的最大值
const int TICKETNUMSLENTH=5;//定义彩票中选取的号码个数
ofstream outdet("彩票购买清单.txt");//彩票购买清单写入文件数据流
ofstream outpro("彩票得奖细节.txt");//彩票得奖细节写入文件数据流
ofstream outres("彩票得奖统计.txt");//彩票得奖统计写入文件数据流
int number1=0,number2=0;//判断彩票是否已经购买和兑奖
/*
定义一个彩票类lotteryticket
*/
class lotteryticket
{
public:
lotteryticket(lotteryticket *initnext=NULL);//构造函数
~lotteryticket(){};//析构函数
void displaynums();//显示彩票号码串函数
void ticknumsintofile(int kinds);//将彩票号码串写入文件
void ticketnumssort();//彩票数据自动排序函数
int compticketnums(int nums[]);//彩票兑奖函数
void inputticketnums(int kinds);//获取彩票号码串函数
bool examineticketnums();//审核彩票号码串函数
int ticketnums[TICKETNUMSLENTH];//彩票5个数字
lotteryticket *next;
};
/*****************************************************************
*函数功能:类lotteryticket的构造函数
*****************************************************************/
lotteryticket::lotteryticket(lotteryticket *initnext)
{
next=initnext;
}
/*****************************************************************
*函数功能:DOS窗口显示彩票号码信息
*****************************************************************/
void lotteryticket::displaynums()
{
for(int i=0;i<TICKETNUMSLENTH;i++)
{
if(ticketnums[i]<10)//号码数字小于10则显示为:OX
cout<<"0";
cout<<ticketnums[i]<<" ";
}
}
/*****************************************************************
*函数功能:将彩票号码串写入文件
*参数说明:kinds==0时,信息写入"彩票购买清单.txt";
* kinds==1时,信息写入"彩票得奖细节.txt";
*****************************************************************/
void lotteryticket::ticknumsintofile(int kinds)
{
for(int i=0;i<TICKETNUMSLENTH;i++)
{
if(kinds==0)
{
if(ticketnums[i]<10)//号码数字小于10则写为:OX,确保总是两位
outdet<<"0";
outdet<<ticketnums[i]<<" ";
}
else
{
if(ticketnums[i]<10)
outpro<<"0";
outpro<<ticketnums[i]<<" ";
}
}
}
/*****************************************************************
*函数功能:彩票号码排序操作(小-->大)冒泡排序
*****************************************************************/
void lotteryticket::ticketnumssort()
{
int temp;
for(int i=TICKETNUMSLENTH-1;i>0;i--)
{
for(int j=1;j<=i;j++)
{
if(ticketnums[j]<ticketnums[j-1])
{
temp=ticketnums[j-1];
ticketnums[j-1]=ticketnums[j];
ticketnums[j]=temp;
}
}
}
}
/*****************************************************************
*函数功能:彩票兑奖函数
*参数说明:nums[]开奖时一等奖号码
*函数返回:本彩票与一等奖号码相同的个数
*****************************************************************/
int lotteryticket::compticketnums(int nums[])
{
int result=0;
for(int i=0;i<TICKETNUMSLENTH;i++)
{
for(int j=0;j<TICKETNUMSLENTH;j++)
{
if(ticketnums[i]==nums[j])
result++;
}
}
return result;
}
/*****************************************************************
*函数功能:输入彩票号码
*参数说明:kinds==0时,系统自动产生彩票号码串;
* kinds==1时,手动输入彩票号码串。
*****************************************************************/
void lotteryticket::inputticketnums(int kinds)
{
if(kinds==0)//系统自动产生彩票号码串
{
for(int i=0;i<TICKETNUMSLENTH;i++)
{
ticketnums[i]=rand()%GETRONDMAXNUMBER+1;//系统产生1~GETRONDMAXNUMBER之间任意数字
}
}
else//手动输入彩票号码串
{
cout<<"请输入想购买的彩票号码(限制在"<<TICKETNUMSLENTH<<"位,可以乱序)"<<endl;
for(int i=0;i<TICKETNUMSLENTH;i++)
{
cin>>ticketnums[i];
}
}
}
/*****************************************************************
*函数功能:检测彩票是否合格(检测数据大小,排除数据相等)
*返回信息:true代表此彩票合格;
* false代表此彩票不合格。
*****************************************************************/
bool lotteryticket::examineticketnums()
{
if(ticketnums[0]>GETRONDMAXNUMBER)
return false;
for(int i=1;i<TICKETNUMSLENTH;i++)
{
if(ticketnums[i]==ticketnums[i-1]||ticketnums[i]>GETRONDMAXNUMBER)
return false;
}
return true;
}
/*
定义一个彩票操作类sweepstakes
*/
class sweepstakes
{
public:
sweepstakes();//构造函数
~sweepstakes(){};//析构函数
returninfo getlotteryticket();//彩票购买通道
returninfo exchangeprizes();//彩票兑奖通道
void releaselinklist();//释放已购买彩票链表数据空间
void finishprogram();//退出程序前扫尾操作
void simulationsweepstakes(int nums[]);//模拟电视摇奖函数
lotteryticket *headp;//购买彩票指针
lotteryticket target;//中奖彩票
};
/*****************************************************************
*函数功能:类sweepstakes构造函数,完成一些基本数据初始化工作
*****************************************************************/
sweepstakes::sweepstakes()
{
headp=new lotteryticket();//申请新结点,作为头结点
headp->next=NULL;
}
/*****************************************************************
*函数功能:购买彩票函数
*****************************************************************/
returninfo sweepstakes::getlotteryticket()
{
if(number1!=0)
return fail;
char cho,icho;
int count,i=1,ticketcout=0;
lotteryticket *newtickp,*followtickp=headp;
cout<<endl<<">>>正在进入购票通道..."<<endl<<endl;
Sleep(1000);
releaselinklist();//释放上次购买彩票数据空间给系统
cout<<"购买彩票通道说明"<<endl;
cout<<"⊙购买彩票的方式有两种:手工和自动;"<<endl;
cout<<"⊙购买方式有先后区分:先手工后自动;"<<endl;
cout<<"⊙同一个用户均可参与两种购票方式。"<<endl;
cout<<"===================================="<<endl;
cout<<endl<<"一您需要手工选购彩票吗?(Y/N):";
do{
cin>>cho;
}while(cho!='Y'&&cho!='y'&&cho!='N'&&cho!='n');
if(cho=='Y'||cho=='y')
{
outdet<<"手工选购彩票信息如下:";
do{
newtickp=new lotteryticket();
followtickp->next=newtickp;
do{
newtickp->inputticketnums(1);
newtickp->ticketnumssort();
if(!newtickp->examineticketnums())
cout<<"系统提示您输入的号码不符合要求!"<<endl;
}while(!(newtickp->examineticketnums()));
ticketcout++;
cout<<"您已成功购得彩票号码:";
newtickp->displaynums();
outdet<<endl<<"手工输入的第"<<setw(3)<<i++<<"张彩票号码为:";
newtickp->ticknumsintofile(0);
newtickp->next=NULL;
followtickp=followtickp->next;
cout<<endl<<">>>还继续手工选购彩票吗?(Y/N):";
cin>>icho;
}while(icho=='Y'||icho=='y');
outdet<<endl<<endl;
}
cout<<endl<<"二您需要自动选购彩票吗?(Y/N):";
do{
cin>>cho;
}while(cho!='Y'&&cho!='y'&&cho!='N'&&cho!='n');
if(cho=='Y'||cho=='y')
{
i=0;//i的值恢复为0
cout<<">>>请输入希望计算机自动产生的彩票张数:";
cin>>count;
outdet<<"自动选购彩票信息如下:";
while(count)
{
newtickp=new lotteryticket();
followtickp->next=newtickp;
do{//自动产生彩票号码串
newtickp->inputticketnums(0);
newtickp->ticketnumssort();
if(!newtickp->examineticketnums())
cout<<""<<endl;
}while(!(newtickp->examineticketnums()));
ticketcout++;
outdet<<endl<<"系统产生第"<<setw(3)<<++i<<"张彩票号码为:";
newtickp->ticknumsintofile(0);
newtickp->next=NULL;
followtickp=followtickp->next;
count--;
}
outdet.flush();//词句很关键,要不然最后一张彩票信息无法及时写入文件中
}
if(ticketcout!=0)
{
cout<<endl<<endl<<"您已经购买"<<ticketcout<<"张彩票."<<endl;
cout<<endl<<"三您需要查看您已购得的彩票信息吗?(Y/N):";
do{
cin>>cho;
}while(cho!='Y'&&cho!='y'&&cho!='N'&&cho!='n');
if(cho=='Y'||cho=='y')
ShellExecute(NULL,"open","彩票购买清单.txt",NULL,NULL,SW_SHOWNORMAL);
cout<<endl<<"提示:您本次购买彩票工序已结束!"<<endl;
}
else
cout<<endl<<"提示:您本次没有购买彩票,此工序已结束!"<<endl;
number1++;
number2=0;
return success;
}
/*****************************************************************
*函数功能:彩票兑奖函数
*****************************************************************/
returninfo sweepstakes::exchangeprizes()
{
if(number2!=0)
return fail;
int i=0,num,count[3]={0,0,0},iticketnums[TICKETNUMSLENTH];
char prizes[3][3]={"一","二","三"},cho;
lotteryticket *followtickp=headp->next;
cout<<endl<<">>>正在进入兑奖通道..."<<endl<<endl;
Sleep(1000);
do{//自动产生中奖彩票号码串
target.inputticketnums(0);
for(int j=0;j<TICKETNUMSLENTH;j++)
iticketnums[j]=target.ticketnums[j];//保存排序前的摇奖信息
target.ticketnumssort();
}while(!target.examineticketnums());
simulationsweepstakes(iticketnums);//模拟摇奖信息
cout<<"目前正在重新排序..."<<endl;
Sleep(4000);
cout<<endl<<"本次中奖号码为:";
target.displaynums();//显示中奖号码
outpro<<"您本次所购彩票号码以及兑奖情况如下:"<<endl;
while(followtickp!=NULL)
{
outpro<<"第"<<setw(3)<<++i<<"张彩票号码:";
followtickp->ticknumsintofile(1);
num=followtickp->compticketnums(target.ticketnums);
if(num>TICKETNUMSLENTH-3)
{
outpro<<"-->"<<prizes[TICKETNUMSLENTH-num]<<"等奖!"<<endl;
count[TICKETNUMSLENTH-num]++;
}
else
cout<<"-->"<<"¤"<<endl;
followtickp=followtickp->next;
}
outpro.flush();
outres<<"小助手提示您"<<endl;
outres<<"您本次账目如下:"<<endl;
outres<<"1、中奖情况:"<<endl;
outres<<"一等奖:"<<setw(3)<<count[0]<<"注 每注奖金1000元 计"<<1000*count[0]<<"元;"<<endl;
outres<<"二等奖:"<<setw(3)<<count[1]<<"注 每注奖金50元 计"<<50*count[1]<<"元;"<<endl;
outres<<"三等奖:"<<setw(3)<<count[2]<<"注 每注奖金5元 计"<<5*count[2]<<"元."<<endl;
outres<<"奖金总计:"<<1000*count[0]+50*count[1]+5*count[2]<<"元."<<endl;
outres<<"2、选购彩票情况:"<<endl;
outres<<"购得彩票数目:"<<setw(3)<<i<<"注 每注彩票2元 计"<<2*i<<"元."<<endl;
outres<<"3、盈亏情况分析:"<<endl;
if(1000*count[0]+50*count[1]+5*count[2]>2*i)
outres<<"此次您赢得"<<1000*count[0]+50*count[1]+5*count[2]-2*i<<"元!"<<endl;
else if(1000*count[0]+50*count[1]+5*count[2]==2*i)
outres<<"此次您收支平衡!"<<endl;
else
outres<<"此次您亏损"<<2*i-1000*count[0]-50*count[1]-5*count[2]<<"元!"<<endl;
outpro.flush();
ShellExecute(NULL,"open","彩票得奖统计.txt",NULL,NULL,SW_SHOWNORMAL);
cout<<endl<<"提示:彩票兑奖结果信息文件已打开!请您查看..."<<endl;
cout<<endl<<"提示:您需要查看您的彩票兑奖详细信息吗?(Y/N)";
do{
cin>>cho;
}while(cho!='Y'&&cho!='y'&&cho!='N'&&cho!='n');
if(cho=='Y'||cho=='y')
ShellExecute(NULL,"open","彩票得奖细节.txt",NULL,NULL,SW_SHOWNORMAL);
number2++;
number1=0;
return success;
}
/*****************************************************************
*函数功能:释放已购买彩票链表数据空间
*****************************************************************/
void sweepstakes::releaselinklist()
{
lotteryticket *searchp=headp->next,*followp=headp;//初始化两个指针
while(searchp!=NULL)
{
followp=searchp;
searchp=searchp->next;
delete followp;
}
headp->next=NULL;//保留了最后一个结点,就是头结点,并且链域置为空
}
/*****************************************************************
*函数功能:退出程序前扫尾操作
*****************************************************************/
void sweepstakes::finishprogram()
{
releaselinklist();
delete headp;//把头结点也释放掉
}
/*****************************************************************
*函数功能:模拟电视摇奖函数
*****************************************************************/
void sweepstakes::simulationsweepstakes(int nums[])
{
char *location[TICKETNUMSLENTH]={"一","二","三","四","五"};
cout<<">>>现在启动开奖程序..."<<endl;
cout<<"----------------------"<<endl;
for(int i=0;i<TICKETNUMSLENTH;i++)
{
cout<<endl<<"目前正在摇第"<<location[i]<<"个数字...";
cout<<endl;
Sleep(3000);
cout<<"第"<<location[i]<<"个数字已经出现:";
if(nums[i]<10)
cout<<"0";
cout<<nums[i]<<endl;
cout<<"----------------------"<<endl;
}
}
/*
定义一个实现彩票功能的菜单处理类interfacebase
*/
class interfacebase
{
private:
sweepstakes sweepstakesonface;
public:
void clearscreen(void);//清屏
void showmenu(void);//显示菜单函数
int userchoice(void);//用户的选项
returninfo processmenu(int menuchoice);//菜单函数
};
/*****************************************************************
*函数功能:清屏
*****************************************************************/
void interfacebase::clearscreen(void)
{
system("cls");
}
/*****************************************************************
*函数功能:显示菜单函数
*****************************************************************/
void interfacebase::showmenu(void)
{
cout<<"彩票购买及兑奖基本功能菜单"<<endl;
cout<<"=========================="<<endl;
cout<<"1.彩票购买通道"<<endl;
cout<<"2.彩票兑奖通道"<<endl;
cout<<"0.退出程序"<<endl;
cout<<"=========================="<<endl;
}
/*****************************************************************
*函数功能:用户的选项
*****************************************************************/
int interfacebase::userchoice(void)
{
int menuchoice;
cout<<"请输入您的选择:";
cin>>menuchoice;
return menuchoice;
}
/*****************************************************************
*函数功能:菜单函数
*****************************************************************/
returninfo interfacebase::processmenu(int menuchoice)
{
int returnvalue;
switch(menuchoice)//根据用户的选择进行相应的操作
{
case 1:
clearscreen();
returnvalue=sweepstakesonface.getlotteryticket();
if(returnvalue==fail)
cout<<"对不起,您已经购买彩票,请兑奖后再继续购买彩票!"<<endl;
else
cout<<"彩票购买成功,请去彩票兑奖通道兑奖!"<<endl;
break;
case 2:
clearscreen();
returnvalue=sweepstakesonface.exchangeprizes();
if(returnvalue==fail)
cout<<"对不起,彩票已经兑奖,请购买彩票后再继续兑奖!"<<endl;
else
cout<<"彩票已经兑奖,欢迎再次购买!"<<endl;
break;
case 0:
sweepstakesonface.finishprogram();
exit(0);
default:
cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;
break;
}
return success;
}
/*
程序主入口
*/
void main(void)
{
int menuchoice;//定义变量,菜单选单项的选择
interfacebase interfacenow;
sweepstakes sweepstakesnow;
system("color f0");//修改屏幕的背景色和字的颜色
interfacenow.clearscreen();//清屏
while(1)//永真循环
{
interfacenow.showmenu();//显示菜单
menuchoice=interfacenow.userchoice();//获取用户的选择
interfacenow.processmenu(menuchoice);//处理用户的选择
system("pause");//暂停
interfacenow.clearscreen();//清屏
}
}//主函数结束