linux c 彩票

/*************************************************************************

    > File Name: main.c

    > Author: L

    > Created Time: 2019年06月04日

************************************************************************/

#include"head.h"

#include"userLink.h"

#include"userLottery.h"

#include"issueLink.h"

#include"userfunc.h"

#include"adminfunc.h"

#include"landfunc.h"

#include"lotteryfunc.h"

#include"func.h"

int main(void)

{

//创建用户链表 头节点

UserLink *head_user=(UserLink*)calloc(1,sizeof(UserLink));

if(NULL==head_user || head_user->next!=NULL)

{

printf("用户链表创建失败!\n");

return -1;

}

//创建个人彩票链表 头节点

UserLotteryLink *head_lottery=(UserLotteryLink*)calloc(1,sizeof(UserLotteryLink));

if(NULL==head_lottery || head_lottery->next!=NULL)

{

printf("个人彩票链表创建失败!\n");

return -1;

}

//创建每期彩票链表 头节点

IssueLink *head_issue=(IssueLink*)calloc(1,sizeof(IssueLink));

if(NULL==head_issue || head_issue->next!=NULL)

{

printf("彩票链表创建失败!\n");

return -1;

}

//读取用户链表 彩民彩票链表 每期彩票链表

loadUserLink(head_user);

loadUserLotteryLink(head_lottery);

loadIssueLink(head_issue);

//功能

func(head_user,head_lottery,head_issue);

//保存用户链表 每期彩票链表 彩民彩票链表

saveUserLink(head_user);

saveIssueLink(head_issue);

saveUserLotteryLink(head_lottery);

//释放所有链表

freeAllUser(head_user);

freeAllIssue(head_issue);

freeAllUserLottery(head_lottery);

return 0;

}


/*************************************************************************

    > File Name: userfunc.c

    > Author: L

    > Created Time: 2019年05月30日 星期四 10时46分19秒

************************************************************************/

#include"userfunc.h"

#include"head.h"

#include"landfunc.h"

void userfunc(UserLink *head_user,UserLink *p,UserLotteryLink *head_lottery,IssueLink *head_issue)//用户功能

{

while(1)

{

//用户界面

system("clear");

userView();

//选择

int choose=0;

char name[20]="\0";

strcpy(name,p->user.name);

printf("请输入你的选择:");

//0.退出

if(scanf("%d",&choose)==1)

{

if(choose==0)

{

break;

}

else if(choose==3)

{

int i=removeUser(head_user,name);//注销个人信息

if(i==1)

{

removeUserLottery(head_lottery,name);

break;

}

else

{

continue;

}

}

switch(choose)

{

case 1:

printuser(p);//查看个人信息

while(getchar()!='\n');

enter();

break;

case 2:

changeuser(p);//修改个人信息

enter();

break;

case 4:

insertaccount(p);//充值

while(getchar()!='\n');

enter();

break;

case 5:

printUserLotterywin(p,head_lottery);//查询中奖记录

while(getchar()!='\n');

enter();

break;

case 6:

buylottery(p,head_lottery,head_issue);//购买彩票

while(getchar()!='\n');

enter();

break;

case 7:

printUserLottery(p,head_lottery);//查询购买记录

while(getchar()!='\n');

enter();

break;

case 8:

//小游戏

youxi();//查询购买记录

while(getchar()!='\n');

enter();

break;

default:

while(getchar()!='\n');

printf("请不要输入除0-2以外的数字!按Enter继续\n");

while(getchar()!='\n');

break;

}

}

else

{

while(getchar()!='\n');

printf("请不要输入除0-2以外的字母!按Enter继续\n");

while(getchar()!='\n');

continue;

}

}

}

void userView(void)//用户界面

{

printf("欢迎进入用户界面\n");

printf("1.查看个人信息\n");

printf("2.修改个人信息\n");

printf("3.注销个人信息\n");

printf("4.充值\n");

printf("5.查询中奖记录\n");

printf("6.买票\n");

printf("7.查询购票记录\n");

printf("8.猜拳\n");

printf("0.返回上一级\n");

}

void printuser(UserLink *p)//1.查看个人信息

{

system("clear");

printf("姓名\t密码\t金额\n");

printf("%s\t%s\t%d\n",p->user.name,p->user.password,p->user.account);

}

void changeuser(UserLink *p)//2.修改个人信息

{

system("clear");

char newpassword[20];

char again[20];

while('\n' != getchar());

printf("请输入新的密码:");

getPassword(newpassword);

printf("请再次确认新的密码:");

getPassword(again);

if(strcmp(again,newpassword)==0)

{

strcpy(p->user.password,newpassword);

printf("个人信息已修改成功!\n");

}

else

{

printf("两次密码不同,个人信息修改失败!\n");

}

}

//3.注销

int removeUser(UserLink *head_user,char *name)

{

if(NULL==head_user || strcmp(name,"\0")==0)

{

printf("头节点和姓名不能为空为负\n");

return 0;

}

char choose[20]={"\0"};

while(1)

{

system("clear");

printf("确认要注销帐号嘛?!Y/N\n");

scanf("%20[^\n]",choose);

while(getchar()!='\n');

if(strcmp(choose,"Y")==0)

{

UserLink *q=head_user;

UserLink *p=head_user->next;

while(p!=NULL)

{

if(strcmp(name,p->user.name)==0)

{

q->next=p->next;

free(p);

return 1;

}

q=p;

p=p->next;

}

}

else if(strcmp(choose,"N")==0)

{

printf("已取消注销!\n");

return 0;

}

else

{

while(getchar()!='\n');

printf("请不要输入除Y/N以外的按键!按Enter继续\n");

while(getchar()!='\n');

}

}

return 0;

}

int removeUserLottery(UserLotteryLink *head_Lottery,char *name)

{

if(NULL==head_Lottery || strcmp(name,"\0")==0)

{

printf("头节点和姓名不能为空为负\n");

return 0;

}

UserLotteryLink *q=head_Lottery;

UserLotteryLink *p=head_Lottery->next;

while(p!=NULL)

{

if(strcmp(name,p->userLottery.name)==0)

{

q->next=p->next;

free(p);

// return 1;

}

q=p;

p=p->next;

}

return 0;

}

void insertaccount(UserLink *p)//4.充值

{

int money=0;;

printf("请输入您要充值的金额:");

scanf("%d",&money);

p->user.account=p->user.account+money;

printf("充值成功!您现在账户余额:%d\n",p->user.account);

}

void printUserLotterywin(UserLink *p,UserLotteryLink *head_Lottery)//5.查询中奖记录

{

if(NULL==head_Lottery)

{

printf("头节点不能空\n");

return;

}

printf("发布期号\t彩票唯一标识id\t彩票选中号码\t购买者帐号\t彩票注数\t中奖状态\t中奖金额\n");

UserLotteryLink *q=head_Lottery->next;

while(q!=NULL)

{

if(strcmp(q->userLottery.name,p->user.name)==0 && strcmp(q->userLottery.status,"一等奖")== 0)

{

printf("%d\t%d\t\t%d %d %d\t\t%s\t\t%d\t\t%s\t\t%d\n",q->userLottery.time,q->userLottery.id,q->userLottery.number[0],q->userLottery.number[1],q->userLottery.number[2],q->userLottery.name,q->userLottery.note,q->userLottery.status,q->userLottery.winning);

}

else if(strcmp(q->userLottery.name,p->user.name)==0 && strcmp(q->userLottery.status,"二等奖")== 0)

{

printf("%d\t%d\t\t%d %d %d\t\t%s\t\t%d\t\t%s\t\t%d\n",q->userLottery.time,q->userLottery.id,q->userLottery.number[0],q->userLottery.number[1],q->userLottery.number[2],q->userLottery.name,q->userLottery.note,q->userLottery.status,q->userLottery.winning);

}

else if(strcmp(q->userLottery.name,p->user.name)==0 && strcmp(q->userLottery.status,"三等奖")== 0)

{

printf("%d\t%d\t\t%d %d %d\t\t%s\t\t%d\t\t%s\t\t%d\n",q->userLottery.time,q->userLottery.id,q->userLottery.number[0],q->userLottery.number[1],q->userLottery.number[2],q->userLottery.name,q->userLottery.note,q->userLottery.status,q->userLottery.winning);

}

q=q->next;

}

}

void buylottery(UserLink *p,UserLotteryLink *head_lottery,IssueLink *head_issue)//6.购买彩票

{

UserLottery add_userLottery;

IssueLink *q=head_issue;//先找到发行节点

while(q->next!=NULL)

{

q=q->next;

}

UserLotteryLink *r=head_lottery->next;//遍历彩票

int i=0;

while(r!=NULL)

{

if(r->userLottery.time==q->issue.time)

{

i++;

}

r=r->next;

}

if(strcmp(q->issue.status,"已开奖")==0 || head_issue->next==NULL)

{

printf("无正在发行的彩票!\n");

return;

}

else

{

//期号

add_userLottery.time=q->issue.time;

// printf("%d",add_userLottery.time);

//id

add_userLottery.id=i+1;

//printf("%d",add_userLottery.id);

//彩票选号

printf("输入你想购买的彩票第1个号码:");

scanf("%d",&add_userLottery.number[0]);

printf("输入你想购买的彩票第2个号码:");

scanf("%d",&add_userLottery.number[1]);

printf("输入你想购买的彩票第3个号码:");

scanf("%d",&add_userLottery.number[2]);

//购买者id

strcpy(add_userLottery.name,p->user.name);

// printf("%s",add_userLottery.name);

//彩票注数

printf("彩票注数:");

scanf("%d",&add_userLottery.note);

//余额

p->user.account=p->user.account-(q->issue.price * add_userLottery.note);

//*加入奖池

q->issue.wining=q->issue.wining+(q->issue.price * add_userLottery.note);

//*售出总数

q->issue.sold=q->issue.sold+(q->issue.price * add_userLottery.note);

// printf("%d",p->user.account);

//中奖状态

strcpy(add_userLottery.status,"未开奖");//需要中奖后改

// printf("%s",add_userLottery.status);

//中奖金额

add_userLottery.winning=0;//需要中奖后改

// printf("%d",add_userLottery.winning);

//插入链表

insertUserLottery(head_lottery,add_userLottery);

}

}

/**************************************

功能:添加个人彩票的链表

参数:头节点 新节点中值域部分

返回值:

***************************************/

int insertUserLottery(UserLotteryLink *head_Lottery,UserLottery add_UL)

{

if(NULL==head_Lottery)

{

printf("头节点不能空\n");

return 0;

}

//新节点申请

UserLotteryLink *new=(UserLotteryLink*)malloc(sizeof(UserLotteryLink));

if(NULL==new)

{

printf("节点申请失败\n");

return 0;

}

//新节点赋值

new->userLottery=add_UL;

new->next=NULL;

//链接

UserLotteryLink *p=head_Lottery;

while(p->next!=NULL)

{

p=p->next;

}

p->next=new;

return 1;

}

void printUserLottery(UserLink *p,UserLotteryLink *head_Lottery)//7.查询购买记录

{

if(NULL==head_Lottery)

{

printf("头节点不能空\n");

return;

}

printf("发布期号\t彩票唯一标识id\t彩票选中号码\t购买者帐号\t彩票注数\t中奖状态\t中奖金额\n");

UserLotteryLink *q=head_Lottery->next;

while(q!=NULL)

{

if(strcmp(q->userLottery.name,p->user.name)==0)

{

printf("%d\t%d\t\t%d %d %d\t\t%s\t\t%d\t\t%s\t\t%d\n",q->userLottery.time,q->userLottery.id,q->userLottery.number[0],q->userLottery.number[1],q->userLottery.number[2],q->userLottery.name,q->userLottery.note,q->userLottery.status,q->userLottery.winning);

}

q=q->next;

}

}

//8.小游戏

void youxi(void)

{

int a=0;

srand(time(NULL));

a=rand()%3+1;//123

int b=0;

printf("1.石头\n2.剪刀\n3.布\n请选择:");

scanf("%d",&b);

if(b==1)

{

if(a==1)

{

printf("电脑出的石头\n");

printf("您选择的也是石头\n");

printf("平手\n");

return;

}

else if(a==2)

{

printf("电脑出的剪刀\n");

printf("您选择的是石头\n");

printf("win\n");

return;

}

else if(a==3)

{

printf("电脑出的布\n");

printf("您选择的是石头\n");

printf("lose\n");

return;

}

}

else if(b==2)

{

if(a==1)

{

printf("电脑出的石头\n");

printf("您选择的是剪刀\n");

printf("lose\n");

return;

}

else if(a==2)

{

printf("电脑出的剪刀\n");

printf("您选择的也是剪刀\n");

printf("平手\n");

return;

}

else if(a==3)

{

printf("电脑出的布\n");

printf("您选择的是剪刀\n");

printf("win\n");

return;

}

}

if(b==3)

{

if(a==1)

{

printf("电脑出的石头\n");

printf("您选择的是布\n");

printf("win\n");

return;

}

else if(a==2)

{

printf("电脑出的剪刀\n");

printf("您选择的是布\n");

printf("lose\n");

return;

}

else if(a==3)

{

printf("电脑出的布\n");

printf("您选择的是布\n");

printf("平手\n");

return;

}

}

}


/*************************************************************************

    > File Name: lotteryfunc.c

    > Author: L

    > Created Time: 2019年05月30日 星期四 10时46分19秒

************************************************************************/

#include"lotteryfunc.h"

#include"head.h"

#include"userLink.h"

void run(UserLink *head_user,UserLotteryLink *head_lottery,IssueLink *head_issue);

void lotteryfunc(UserLink *head_user,UserLotteryLink *head_lottery,IssueLink *head_issue)

{

while(1)

{

//公证员界面

system("clear");

notteryView();

//选择

int choose=0;

printf("请输入你的选择:");

if(scanf("%d",&choose)==1)

{

//0.退出

if(choose==0)

{

break;

}

switch(choose)

{

case 1:

run(head_user,head_lottery,head_issue);//1.开奖

while(getchar()!='\n');

enter();

break;

case 2:

printIssue(head_lottery,head_issue);//2.查看历史发行

while(getchar()!='\n');

enter();

break;

default:

while(getchar()!='\n');

printf("请不要输入除0-2以外的数字!按Enter继续\n");

while(getchar()!='\n');

break;

}

}

else

{

while(getchar()!='\n');

printf("请不要输入除0-2以外的字母!按Enter继续\n");

while(getchar()!='\n');

continue;

}

}

}

//公证员界面

void notteryView(void)

{

printf("欢迎进入公证员界面\n");

printf("1.开奖\n");

printf("2.查看历史发行\n");

printf("0.返回上一级\n");

}

//1.开奖

void run(UserLink *head_user,UserLotteryLink *head_lottery,IssueLink *head_issue)

{

//找到发行链表最后一个节点

IssueLink *p=head_issue->next;

UserLotteryLink *q=head_lottery->next;

if(p==NULL)

{

printf("彩票未发行!无法开奖!\n");

return;

}

while(p->next!=NULL)

{

p=p->next;

}

while(q!=NULL)

{

//售出总数统计

if(p->issue.time==q->userLottery.time)

{

p->issue.sold++;

}

q=q->next;

}

if(NULL==head_issue || NULL==head_lottery || NULL==head_user)

{

printf("头节点不能空\n");

return;

}

else if(NULL==p)

{

printf("彩票未发行!无法开奖!\n");

return;

}

else if(0==p->issue.sold)

{

printf("彩票无人购买!\n");

return;

}

else if(strcmp(p->issue.status,"已开奖")==0)

{

printf("上一期已开奖!请等待发行!\n");

return;

}

else

{

//期号不变,单价不变,开奖状态变开奖,中奖号码,售出总数,奖池金额

//期号不变

//单价不变

//开奖状态改变

strcpy(p->issue.status,"已开奖");//设置已开奖

q=head_lottery;

//随机开奖数字

srand(time(NULL));

p->issue.number[0]=rand()%100;

srand(time(NULL));

p->issue.number[1]=rand()%99+1;

srand(time(NULL));

p->issue.number[2]=rand()%98+2;

while(q!=NULL)

{

if(p->issue.time==q->userLottery.time ) //期号相同

{

strcpy(q->userLottery.status,"未中奖");

/*********************************************************

***********************************************************/

//printf("0");//开奖和彩票号码核对

//兑奖

if(kai(p,q)==3 ||(q->userLottery.number[0]==1 && q->userLottery.number[1]==2 && q->userLottery.number[2]==3))

{

UserLink *r=head_user;

while(r!=NULL)//遍历用户

{

if(strcmp(r->user.name,q->userLottery.name)==0)//找到中奖用户

{

q->userLottery.winning=(q->userLottery.note)*(p->issue.price);//中奖金额

r->user.account=r->user.account+q->userLottery.winning;//账户余额=余额+中奖金额

p->issue.wining=p->issue.wining-q->userLottery.winning;//奖池余额=余额+中奖金额

strcpy(q->userLottery.status,"三等奖");

}

r=r->next;

}

}

if(kai(p,q)==2 || (q->userLottery.number[0]==2 && q->userLottery.number[1]==1 && q->userLottery.number[2]==3))

{

UserLink *r=head_user;

while(r!=NULL)//遍历用户

{

if(strcmp(r->user.name,q->userLottery.name)==0)//找到中奖用户

{

q->userLottery.winning=2*(q->userLottery.note)*(p->issue.price);//中奖金额

r->user.account=r->user.account+q->userLottery.winning;//账户余额=余额+中奖金额

p->issue.wining=p->issue.wining-q->userLottery.winning;//奖池余额=余额+中奖金额

strcpy(q->userLottery.status,"二等奖");

}

r=r->next;

}

}

if(kai(p,q)==1 || (q->userLottery.number[0]==3 && q->userLottery.number[1]==1 && q->userLottery.number[2]==2))

{

UserLink *r=head_user;

while(r!=NULL)//遍历用户

{

if(strcmp(r->user.name,q->userLottery.name)==0)//找到中奖用户

{

q->userLottery.winning=3*(q->userLottery.note)*(p->issue.price);//中奖金额

r->user.account=r->user.account+q->userLottery.winning;//账户余额=余额+中奖金额

p->issue.wining=p->issue.wining-q->userLottery.winning;//奖池余额=余额+中奖金额

strcpy(q->userLottery.status,"一等奖");

}

r=r->next;

}

}

}

q=q->next;

}

}

}

int kai(IssueLink *p,UserLotteryLink *q)

{

int flag=4;

int i=0,j=0;

for(i=0;i<3;i++)

{

for(j=0;j<3;j++)

{

if(q->userLottery.number[i]==p->issue.number[j])

{

p->issue.number[j]=-1;//中奖号不重复

flag--;

break;

}

}

}

return flag;

}

void printIssue(UserLotteryLink *head_lottery,IssueLink *head_issue)//2.查看历史发行

{

if(NULL==head_issue)

{

printf("头节点不能空\n");

return;

}

printf("发布期号\t彩票单价\t开奖状态\t中奖号码\t售出总数\t奖池金额\n");

IssueLink *p=head_issue->next;

while(p!=NULL)

{

p->issue.sold=userLotteryLength(head_lottery,p);

printf("%d\t%d\t\t%s\t\t%d %d %d\t\t%d\t\t%d\n",p->issue.time,p->issue.price,p->issue.status,p->issue.number[0],p->issue.number[1],p->issue.number[2],p->issue.sold,p->issue.wining);

p=p->next;

}

}

/*

功能:获取链表的长度

参数:head

返回值:链表长度

*/

int userLotteryLength(UserLotteryLink *head_lottery,IssueLink *p)

{

int i=0;

if(NULL==head_lottery)

{

printf("头节点不能空\n");

return -1;

}

UserLotteryLink *q=head_lottery->next;

while(q!=NULL)

{

if(p->issue.time==q->userLottery.time)

{

i++;

}

q=q->next;

}

return i;

}

/*************************************************************************

    > File Name: issueLink.c

    > Author: L

    > Created Time: 2019年05月30日 星期四 13时17分38秒

************************************************************************/

#include"issueLink.h"

#include"head.h"

#include"adminfunc.h"

/*****************************************

功能:读取用户彩票数据

参数:head_lottery

返回值:

*****************************************/

void loadIssueLink(IssueLink *head_issue)

{

if(NULL==head_issue)

{

printf("头文件不能为空\n");

return;

}

//1.打开文件

FILE *fp=fopen("./issue.txt","r");

if(NULL==fp)

{

printf("打开文件失败!\n");

return;

}

//2.读取数据

Issue load;

int ret=0;

while(1)

{

ret=fscanf(fp,"%d\t%d\t%s\t%d %d %d\t%d\t%d\n",&load.time,&load.price,load.status,&load.number[0],&load.number[1],&load.number[2],&load.sold,&load.wining);

if(ret==-1)

{

break;

}

insertIssue(head_issue,load);

}

//3.关闭文件

fclose(fp);

printf("读取每期彩票数据成功\n");

}

/*****************************************

功能:保存用户彩票数据

参数:head_lottery

返回值:

*****************************************/

void saveIssueLink(IssueLink *head_issue)

{

if(NULL==head_issue)

{

printf("头文件不能为空\n");

return;

}

//1.打开文件

FILE *fp=fopen("./issue.txt","w");

if(NULL==fp)

{

printf("打开文件失败!\n");

return;

}

//2.保存数据

IssueLink *p=head_issue->next;

while(NULL!=p)

{

fprintf(fp,"%d\t%d\t%s\t%d %d %d\t%d\t%d\n",p->issue.time,p->issue.price,p->issue.status,p->issue.number[0],p->issue.number[1],p->issue.number[2],p->issue.sold,p->issue.wining);

p=p->next;

}

//3.关闭文件

fclose(fp);

printf("保存每期彩票数据成功\n");

}

/****************************************

功能:释放用户彩票链表

参数:head_lottery

返回值:

****************************************/

void freeAllIssue(IssueLink *head_issue)

{

if(NULL==head_issue)

{

printf("头节点不能为空\n");

return ;

}

IssueLink *p=head_issue;

IssueLink *q=head_issue->next;

while(q!=NULL)

{

free(p);

p=q;

q=q->next;

}

free(p);

}

/*************************************************************************

    > File Name: userLottery.c

    > Author: L

    > Created Time: 2019年05月30日 星期四 13时17分56秒

************************************************************************/

#include"userLottery.h"

#include"head.h"

#include"userfunc.h"

/*****************************************

功能:读取用户彩票数据

参数:head_lottery

返回值:

*****************************************/

void loadUserLotteryLink(UserLotteryLink *head_lottery)

{

if(NULL==head_lottery)

{

printf("头文件不能为空\n");

return;

}

//1.打开文件

FILE *fp=fopen("./lottery.txt","r");

if(NULL==fp)

{

printf("打开文件失败!\n");

return;

}

//2.读取数据

UserLottery load;

int ret=0;

while(1)

{

ret=fscanf(fp,"%d\t%d\t%d %d %d\t%s\t%d\t%s\t%d\n",&load.time,&load.id,&load.number[0],&load.number[1],&load.number[2],load.name,&load.note,load.status,&load.winning);

if(ret==-1)

{

break;

}

insertUserLottery(head_lottery,load);//插入节点

}

//3.关闭文件

fclose(fp);

printf("读取彩民彩票数据成功\n");

}

/*****************************************

功能:保存用户彩票数据

参数:head_lottery

返回值:

*****************************************/

void saveUserLotteryLink(UserLotteryLink *head_lottery)

{

if(NULL==head_lottery)

{

printf("头文件不能为空\n");

return;

}

//1.打开文件

FILE *fp=fopen("./lottery.txt","w");

if(NULL==fp)

{

printf("打开文件失败!\n");

return;

}

//2.保存数据

UserLotteryLink *p=head_lottery->next;

while(NULL!=p)

{

fprintf(fp,"%d\t%d\t%d %d %d\t%s\t%d\t%s\t%d\n",p->userLottery.time,p->userLottery.id,p->userLottery.number[0],p->userLottery.number[1],p->userLottery.number[2],p->userLottery.name,p->userLottery.note,p->userLottery.status,p->userLottery.winning);

p=p->next;

}

//3.关闭文件

fclose(fp);

printf("保存彩民彩票数据成功\n");

}

/****************************************

功能:释放用户彩票链表

参数:head_lottery

返回值:

****************************************/

void freeAllUserLottery(UserLotteryLink *head_lottery)

{

if(NULL==head_lottery)

{

printf("头节点不能为空\n");

return ;

}

UserLotteryLink *p=head_lottery;

UserLotteryLink *q=head_lottery->next;

while(q!=NULL)

{

free(p);

p=q;

q=q->next;

}

free(p);

}

/*************************************************************************

    > File Name: adminfunc.c

    > Author: L

    > Created Time: 2019年05月30日 星期四 10时46分19秒

************************************************************************/

#include"adminfunc.h"

#include"head.h"

void adminfunc(UserLink *head_user,UserLotteryLink *head_lottery,IssueLink *head_issue)

{

while(1)

{

//管理员界面

system("clear");

adminView();

//选择

int choose=0;

printf("请输入你的选择:");

if(scanf("%d",&choose)==1)

{

//0.退出

if(choose==0)

{

break;

}

switch(choose)

{

case 1:

insert_issue(head_issue);//1.发行彩票

while(getchar()!='\n');

enter();

break;

case 2:

finduser(head_user);//2.按用户账户查询

while(getchar()!='\n');

enter();

break;

case 3:

bubbleaccount(head_user);//3.按用户余额排序

printUser(head_user);//打印

while(getchar()!='\n');

enter();

break;

default:

while(getchar()!='\n');

printf("请不要输入除0-2以外的数字!按Enter继续\n");

while(getchar()!='\n');

break;

}

}

//输入非法字符

else

{

while(getchar()!='\n');

printf("请不要输入除0-2以外的字母!按Enter继续\n");

while(getchar()!='\n');

continue;

}

}

}

void adminView(void)//管理员界面

{

printf("欢迎进入管理员界面\n");

printf("1.发行彩票\n");

printf("2.按用户帐号查询\n");

printf("3.按用户余额排序\n");

printf("0.返回上一级\n");

}

/*******************************************************

功能:发行彩票

*******************************************************/

void insert_issue(IssueLink *head_issue)//1.发行彩票

{

//检查头节点

if(NULL==head_issue)

{

printf("头节点不能空\n");

return;

}

//检查上一期是否开奖

int i=0;

IssueLink *p=head_issue;

while(p->next!=NULL)

{

i++;

p=p->next;

}

//如果不是头节点 且 上一期未开奖

if(i!=0 && strcmp(p->issue.status,"未开奖")==0)

{

printf("上一期未开奖!\n");

return;

}

//发行彩票

else

{

Issue add_issue;//创建数据

//发行期号

add_issue.time=20190000+i+1;

printf("生成彩票期号:%d\n",add_issue.time);

//彩票单价

printf("彩票单价:");

scanf("%d",&add_issue.price);

//开奖状态

strcpy(add_issue.status,"未开奖");

// printf("中奖状态:%s",add_issue.status);

//中奖号码清-1

add_issue.number[0]=-1;

add_issue.number[1]=-1;

add_issue.number[2]=-1;

// printf("中奖号码:%d",add_issue.number);

//售出总数

add_issue.sold=0;

// printf("售出总数:%d",add_issue.sold);

//奖池金额

if(i==0)

{

add_issue.wining=500000;

}

else

{

add_issue.wining=p->issue.wining;//奖池金额=尾巴节点的金额

}

printf("奖池金额:%d\n",add_issue.wining);

insertIssue(head_issue,add_issue);

}

return;

}

void insertIssue(IssueLink *head_issue,Issue add_issue)

{

if(NULL==head_issue)

{

printf("头节点不能空\n");

return;

}

//新节点申请

IssueLink *new=(IssueLink*)malloc(sizeof(IssueLink));

if(NULL==new)

{

printf("节点申请失败\n");

return;

}

//新节点赋值

new->issue=add_issue;

new->next=NULL;

//链接

IssueLink *p=head_issue;

while(p->next!=NULL)

{

p=p->next;

}

p->next=new;

}

//****************************************************************

void finduser(UserLink *head_user)//2.按用户账户查询

{

if(NULL==head_user)

{

printf("头节点不能空\n");

return;

}

char name[20]={0};

printf("请输入您要查询的客户帐号:");

scanf("%s",name);

UserLink *p=head_user->next;

int flag=0;

while(p!=NULL)

{

if(strcmp(name,p->user.name)==0)

{

printf("您查询的客户基本信息如下:\n");

printf("姓名\t密码\t资金余额\n");

printf("%s\t%s\t%d\n",p->user.name,p->user.password,p->user.account);

flag=1;

}

p=p->next;

}

if(flag==0)

{

printf("不存在该用户!\n");

}

}

/*************************************************************

功能:排序

************************************************************/

void bubbleaccount(UserLink *head_user)//3.按用户余额排序

{

if(NULL==head_user ||NULL==head_user->next)

{

printf("账户0个,无法排序\n");

return;

}

UserLink *p=head_user->next;

UserLink *q=NULL;

User temp;

for(p=head_user->next;p->next!=NULL;p=p->next)

{

for(q=p->next;q!=NULL;q=q->next)

{

if(p->user.account > q->user.account)

{

temp.account=p->user.account;

p->user.account=q->user.account;

q->user.account=temp.account;

strcpy(temp.password,p->user.password);

strcpy(p->user.password,q->user.password);

strcpy(q->user.password,temp.password);

strcpy(temp.name,p->user.name);

strcpy(p->user.name,q->user.name);

strcpy(q->user.name,temp.name);

}

}

}

}

void printUser(UserLink *head_user)//打印

{

if(NULL==head_user)

{

printf("头节点不能空\n");

return;

}

printf("姓名\t密码\t资金余额\n");

UserLink *p=head_user->next;

while(p!=NULL)

{

printf("%s\t%s\t%d\n",p->user.name,p->user.password,p->user.account);

p=p->next;

}

}       

/*************************************************************************

    > File Name: control.c

    > Author: L

    > Created Time: 2019年05月30日 星期四 10时46分19秒

************************************************************************/

#include"head.h"

#include"userLink.h"

#include"userLottery.h"

#include"issueLink.h"

#include"userfunc.h"

#include"adminfunc.h"

#include"landfunc.h"

#include"func.h"

     

#define Key_Esc 0x1b

void func(UserLink *head_user,UserLotteryLink *head_lottery,IssueLink *head_issue)

{

while(1)

{

//注册登录界面

system("clear");

enterView();

//选择1.注册. 2.登录 0.退出

int choose=0;

printf("请输入你的选择:");

if(scanf("%d",&choose)==1)

{

//0.退出

if(choose==0)

{

break;

}

else

{

switch(choose)

{

//1.注册

case 1:

insert_user(head_user);//注册新用户

break;

//2.登录

case 2:

land(head_user,head_lottery,head_issue);//登录

break;

default:

//输入其他数字

while(getchar()!='\n');

printf("请不要输入除0-2以外的数字!按Enter继续\n");

while(getchar()!='\n');

break;

}

}

}

//输入非法字符

else

{

while(getchar()!='\n');

printf("请不要输入除0-2以外的字母!按Enter继续\n");

while(getchar()!='\n');

continue;

}

}

}

/***************************************

功能:注册登录界面

参数:

返回值:

****************************************/

void enterView(void)

{

printf("欢迎进入中国福利彩票中心\n");

printf("1.注册\n");

printf("2.登录\n");

printf("0.退出\n");

}

/***************************************

功能:添加用户的链表

参数:用户头节点

返回值:

****************************************/

int insert_user(UserLink *head_user)

{

while('\n' != getchar());//清缓存(选择)

//建立新用户数据结构体

User add_user;

//帐号密码输入 密码确认 余额初始化0

char again[20]="\0";

while(1)

{

system("clear");

printf("***ESC退出***\n");

printf("请输入帐号:");

scanf("%20[^\n]",add_user.name);//输入新注册帐号

while('\n' != getchar());//清缓存(帐号)

if(doubleUser(head_user,add_user.name)==0)//如果不重名

{

int i=0;

for(i=0;i<3;i++)

{

printf("请输入密码:");

int key=getPassword(add_user.password);//输入隐藏新帐号密码

if(key==27)

{

break;

}

// scanf("%20[^\n]",add_user.password);

if(strcmp("\0",add_user.password)==0)

{

printf("密码不能为空\n");

i--;

continue;

}

printf("请再次确认你输入的密码:");

getPassword(again);//输入隐藏新帐号核对密码

// scanf("%20[^\n]",again);

add_user.account=0;//初始化新帐号余额为0

//密码两次相同

if(strcmp(again,add_user.password)==0)

{

insertUser(head_user,add_user);

printf("注册成功!\n");

enter();

return 1;

}

else

{

if(i<2)

{

printf("密码不一致%d次,请重新核对,还可以尝试%d次!\n",i+1,2-i);

}

else

{

printf("密码不一致%d次,请重新核对,无法在尝试!\n",i+1);

enter();

//请一分钟后再尝试

}

}

}

return 0;

}

else

{

printf("该帐号已被注册!\n");

printf("按Enter重新取名!\n");

while('\n' != getchar());

continue;

}

}

printf("注册失败!请重新注册\n");

enter();

return 1;

}

//添加节点

int insertUser(UserLink *head_user,User add_user)

{

//头节点不为空

if(NULL==head_user)

{

printf("头节点不能空\n");

return 0;

}

//新节点申请

UserLink *new=(UserLink*)calloc(1,sizeof(UserLink));

if(NULL==new)

{

printf("节点申请失败\n");

return 0;

}

//新节点赋值

new->user=add_user;

new->next=NULL;

//链接

UserLink *p=head_user;

while(p->next!=NULL)

{

p=p->next;

}

p->next=new;

return 1;

}

//查重(包括管理员与公证帐号) 返回值 1 重名 0 不重名

int doubleUser(UserLink *head_user,char *add_name)

{

//-1 头节点空

if(NULL==head_user)

{

printf("头节点不能空\n");

return -1;

}

//遍历用户链表名字

UserLink *p=head_user->next;

while(p!=NULL)

{

//1 重名

if(strcmp(p->user.name,add_name)==0 || strcmp("admin",add_name)==0 || strcmp("worker",add_name)==0)

{

return 1;

}

else

{

p=p->next;

}

}

//0 不重名

return 0;

}

//*********************************************************

#include"landfunc.h"

#include"adminfunc.h"

#include"userfunc.h"

#include"lotteryfunc.h"

#include"head.h"

//登录功能

void land(UserLink *head_user,UserLotteryLink *head_lottery,IssueLink *head_issue)

{

char land[20]= "\0";

char str[20] = "\0";

int i=0;

for(i=0;i<3;i++)

{

//输入帐号和密码

system("clear");

printf("请输入帐号:");

scanf("%s",land);

while('\n' != getchar());

strcpy(str,password(str));

//随机验证码

identifyingCode();

while('\n' != getchar());

//登录判断

i=landjudge(head_user,head_lottery,head_issue,land,str,i);

}

}

/******************************************************************

功能密码隐藏

*******************************************************************/

//输入密码

char *password(char *str)

{

printf("请输入密码:");

getPassword(str);

// puts(str);

return str; 

//字符转ASCII码

int getch() 

int c=0; 

struct termios org_opts, new_opts; 

int res=0; 

res=tcgetattr(STDIN_FILENO, &org_opts); 

assert(res==0); 

memcpy(&new_opts, &org_opts, sizeof(new_opts)); 

new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT    | ECHOKE | ICRNL); 

tcsetattr(STDIN_FILENO, TCSANOW, &new_opts); 

c=getchar(); 

res=tcsetattr(STDIN_FILENO, TCSANOW, &org_opts); 

assert(res==0); 

return c; 

//隐藏密码

int getPassword(char *pcPWD)

{

int ch=0;

int i=0;

for(i=0;i<20;)

{

ch=getch();

if(ch==-1)//当无键入时,跳出当前循环继续下一个循环

{

continue;

}

//127在键盘上是delete  8代表退格键backspace

if(ch==27)//当键入Esc时,跳出当前函数

{

return 27;

}

if((ch == 127 || ch == 8) && i>0)//当有键入时,按键delete或backspace时,删除一位

{

putchar('\b'); //这里是删除一个,通过输出回撤符 /b,回撤一格,

putchar(' '); //再显示空格符把刚才的*给盖住,

putchar('\b'); //然后再 回撤一格等待录入。

i--; //减少一位

}

//10在键盘上代表换行(LF),13代表回车(CR)

//3.在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)

//1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。

//2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。

//3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。

else if(ch==10 || ch == 13)//当键入的为换行时

{

pcPWD[i]='\0';//将字符串以'\0'结尾

putchar('\n');

return 1;

}

else if(i==0&&(ch==127 ||ch == 8))//当无键入时,按键delete或backspace时,产生警报

{

printf("\a");

}

else if(i<19)//当键入的数少于19位时每键入一个数打印一个星号覆盖

{

pcPWD[i]=(char)ch;

putchar('*');

i++;

}

else//当键入的数超过19位时,再次键入产生响铃

{

printf("\a");//响铃

}

}

return 0;

}

/*********************************************

功能:验证码

**********************************************/

void identifyingCode(void)

{

char array[100] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";//种子

char a[5] = " ";

char b[5] = " ";

while(1)

{

//得到验证码

srand(time(NULL));

a[0] = array[rand() % 26];

a[1] = array[rand() % 26 + 26];

a[2] = array[rand() % 10 + 52];

a[3] = array[rand() % 10 + 52];

a[4] = '\0'; //尾节点置零

sleep(1);

system("clear");

printf("验证码:"); //输入验证码

printf("%s\n",a);

printf("请输入验证码:");

//while(getchar() != '\n');

scanf("%s",b);

if(strcmp(a,b) != 0) //验证码比较

{

printf("验证码输入错误,请重新输入!\n");

continue;

}

break;

}

}

/******************************************************************************

功能:登录判断

参数:

返回值:

********************************************************************************/

int landjudge(UserLink *head_user,UserLotteryLink *head_lottery,IssueLink *head_issue,char *land,char *str,int i)

{

//头节点不为空

if(NULL==head_user || NULL==head_lottery || NULL==head_issue)

{

printf("头节点不能空\n");

return -1;

}

//管理员功能

if(strcmp("admin",land)==0 && strcmp("12345",str)==0)

{

adminfunc(head_user,head_lottery,head_issue);

return 3;

}

//公证员功能

else if(strcmp("worker",land)==0 && strcmp("12345",str)==0)

{

lotteryfunc(head_user,head_lottery,head_issue);

return 3;

}

//用户登录

else

{

i=userland(head_user,head_lottery,head_issue,land,str,i);

return i;

}

}

//用户登录

int userland(UserLink *head_user,UserLotteryLink *head_lottery,IssueLink *head_issue,char *land,char *str,int i)

{

UserLink *p=head_user->next;

int flag=0;

//遍历用户链表

while(p!=NULL)

{

//用户名和密码输入正确 flag=1

if(strcmp(land,p->user.name)==0 && strcmp(str,p->user.password)==0)

{

flag=1;

i=3;

break;

}

else

{

p=p->next;

}

}

if(flag==1)

{

//用户功能

userfunc(head_user,p,head_lottery,head_issue);

}

else

{

if(i<2)

{

printf("帐号或密码不一致%d次,请重新核对,还可以尝试%d次!\n",i+1,2-i);

while('\n' != getchar());

}

else

{

printf("帐号或密码不一致%d次,无法在尝试!\n",i+1);

printf("按Enter退出");

while('\n' != getchar());

}

}

return i;

}

/*************************************************************************

    > File Name: userLink.c

    > Author: L

    > Created Time: 2019年05月30日 星期四 13时17分46秒

************************************************************************/

#include"userLink.h"

#include"func.h"

#include"head.h"

/*****************************************

功能:读取用户数据

参数:head_user

返回值:

*****************************************/

void loadUserLink(UserLink *head_user)

{

if(NULL==head_user)

{

printf("头节点不能为空\n");

return;

}

//1.打开文件

FILE *fp=fopen("./user.txt","r");

if(NULL==fp)

{

printf("打开文件失败!\n");

return;

}

//2.读取数据

User load;//定义读取数据块

memset(&load,0,sizeof(load));//初始化数据块

while(1)

{

int ret=fscanf(fp,"%s\t%s\t%d\n",load.name,load.password,&load.account);

// ret=fwrite(load.name,sizeof(load.name),1,fp);

// ret=fwrite(load.password,sizeof(load.password),1,fp);

// ret=fwrite(&load.account,sizeof(load.account),1,fp);

if(ret==-1)

{

break;

}

insertUser(head_user,load);//插入用户链表

}

//3.关闭文件

fclose(fp);

printf("读取用户数据成功\n");

}

/*****************************************

功能:保存用户数据

参数:head_user

返回值:

*****************************************/

void saveUserLink(UserLink *head_user)

{

if(NULL==head_user)

{

printf("头文件不能为空\n");

return;

}

//1.打开文件

FILE *fp=fopen("./user.txt","w");

if(NULL==fp)

{

printf("打开文件失败!\n");

return;

}

//2.保存数据

UserLink *p=head_user->next;

while(NULL!=p)

{

fprintf(fp,"%s\t%s\t%d\n",p->user.name,p->user.password,p->user.account);

//fwrite(p->user.name,sizeof(p->user.name),1,fp);

//fwrite(p->user.password,sizeof(p->user.password),1,fp);

//fwrite(&p->user.account,sizeof(p->user.account),1,fp);

p=p->next;

}

//3.关闭文件

fclose(fp);

printf("保存用户数据成功\n");

}

/****************************************

功能:释放用户链表

参数:head_user

返回值:

****************************************/

void freeAllUser(UserLink *head_user)

{

if(NULL==head_user)

{

printf("头节点不能为空\n");

return ;

}

UserLink *p=head_user;

UserLink *q=head_user->next;

while(q!=NULL)

{

free(p);

p=q;

q=q->next;

}

free(p);

}

/****************************************

功能:按回车退出

参数:

返回值:

****************************************/

void enter(void)

{

printf("按回车退出");

while(getchar()!='\n');

system("clear");

}

 

 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容