/*************************************************************************
> 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");
}