追忆~似水年华 2019-07-27 13:14 采纳率: 0%
浏览 276

函数releaselinklist()和finishprogram()的具体代码是不是这样写的?有什么其他错误请指教一下?

//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();//清屏
    }
}//主函数结束

  • 写回答

1条回答

  • dabocaiqq 2019-07-30 09:07
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示