第一个文件:主控文件(control.h/.c)
#ifndef CONTROL_H_
#define CONTROL_H_
#include"link.h"
/*
功能:主界面控制函数
参数:head 链表头节点
返回值:无
*/
void mainControl(User* head1,Per* head2,Cp* head3);
/*
功能:实现管理员、公正员注册检测
参数:空
返回值:成功注册返回1,失败返回0
*/
void login(User* head1,Per* head2,Cp* head3);
/*
功能:管理员控制函数
参数:空
返回值:无
*/
void adminControl(User* head1,Per* head2,Cp* head3);
/*
功能:用户控制函数
参数:空
返回值:无
*/
void userControl(User* head1,Per* head2,Cp* head3,char*name);
/*
功能:公正员控制函数
参数:空
返回值:无
*/
void workerControl(User* head1,Per* head2,Cp* head3,char* name);
#endif
第二个文件(功能函数文件)
#ifndef FUNC_H_
#define FUNC_H_
#include"link.h"
/*
功能:在链表尾部插入一个用户的信息
参数:head 头节点
返回值:1 成功 0 失败
*/
int insert(User* head1);
/*
功能:密码隐藏
参数:空
返回值:空
*/
void invisualPassWord(char* p);
/*
功能:去除回车输入
参数:空
返回值:字符char(输入的字符)
*/
char getch(void);
/*
功能:生成验证码
参数:空
返回值:空
*/
int verificationCode(void);
/*
功能:在第三张链表尾部插入一个彩票节点
参数:head3 头节点
返回值:1 成功 0 失败
*/
int insert3(Cp* head3);
/*
功能:在第二张链表尾部插入一个个人彩票节点
参数:head2 头节点
返回值:1 成功 0 失败
*/
int insert2(User* head1,Per* head2,Cp* head3,char* name);
/*
功能:查看用户链表中的信息
参数:head头文件
返回值:空
*/
void chatInf(User* head1,char* name);
void printUserLink(User* head1);
void printUserLink2(Per* head2);
void printUserLink3(Cp* head3);
void printUserLink31(Cp* head3,int num);
/*
功能:修改彩民信息
参数:头节点、字符串
返回值:空
*/
void userModifyInf(User* head1,char* name);
/*
功能:注销当前用户
参数:用户链表的头节点,用户的姓名
返回值:空
*/
int deleteUserInf(User* head1,char* name);
/*
功能:查找用户
参数:头节点,字符串
返回值:
*/
int checkInf(User* head1,char* name);
/*
功能:充值函数
参数:头节点,字符串
返回值:1成功充值,0充值失败
*/
int recharge(User* head1,char* name);
/*
功能:查询奖金
参数:头节点,字符串
返回值:1充值成功,0充值失败
*/
int askforPriceInf(Per* head2,char* name);
/*
功能:购买彩票
参数:链表二的头节点
返回值:空
*/
void buyLottary(User* head1,Per* head2,Cp* head3,char* name);
/*
功能:查询用户信息
参数:头节点
返回值:1查到0未查到
*/
int ChatUserInf(User* head1);
/*
功能:按用户余额进行排序
参数:头节点
返回值:空
*/
void sortUserInf(User* head1);
/*
功能:发布彩票
参数:链表三的头节点
返回值:空
*/
void publishLottary(Cp* head3);
/*
功能:开奖
参数:彩票发行记录链表头节点
返回值:空
*/
void openLotarry(User* head1,Per* head2,Cp* head3,char* name);
/*
功能:查询历史发行记录
参数:头节点
返回值:空
*/
void lookforHistoryInf(Cp* head3);
/*
功能:查询用户购买的彩票信息
参数:头节点,姓名
返回值:空
*/
void lookforBuyHistory(Per* head2,char* name);
/*
功能:小游戏
参数:空
返回值:空
*/
void game(void);
#endif
第三个文件(链表文件,及数据保存函数等)
#ifndef LINK_H_
#define LINK_H_
typedef struct user{ //用户
char usrname[1000]; //用户名
char usrpwd[1000]; //密码
int yue; //余额
}Usr;
typedef struct userlink{
Usr user;
struct userlink* next;
}User;
typedef struct personalCp{ //个人彩票
int cpIssue; //发布期号
int cpId; //彩票唯一标识ID
int choiceNum[7]; //彩票选中号码
char usrname[1000]; //购买者帐号
int zhushu; //注数
int zhongjiangzhuangtai;//中奖状态,1中奖,0未中奖
int amount; //中奖金额
}Pcp;
typedef struct personallink{
Pcp people;
struct personallink* next;
}Per;
typedef struct cplottay{ //每期彩票
int cpIssue1; //发布期号
int cost; //彩票单价
int kaijiangzhuangtai; //开奖状态
int winLottaryNum[7]; //中奖号码
int sum; //售出总数
int sumMoney; //奖池金额
}Cpl;
typedef struct cplottaryLink{
Cpl cpl;
struct cplottaryLink* next;
}Cp;
/*
功能:创建用户链表头节点
参数:空
返回值:用户链表的指针类型
*/
User* createLink1(void);
/*
功能:创建用户链表头节点
参数:空
返回值:管理员链表的指针类型
*/
Per* creatLink2(void);
/*
功能:创建公正员链表头节点
参数:空
返回值:公正员量表指针类型
*/
Cp* creatLink3(void);
/*
功能:读取所有的链表
参数:User*、Per*、Cp*
返回值:空
*/
/*void loadAllInf(User* head1,Per* head2,Cp* head3);*/
/*
功能:读取用户登录到内存中
参数:head 头节点
返回值:无
*/
void loadUser(User* head1);
/*
功能:读取学生信息到内存中
参数:head 头节点
返回值:无
*/
void loadPerson(Per* head2);
/*
功能:读取学生信息到内存中
参数:head 头节点
返回值:无
*/
void load(Cp* head3);
/*
功能:添加新节点
参数:head 头节点 stu 新节点的值域
返回值:1 成功 0 失败
*/
int insertNewNode1(User* head1,Usr user);
/*
功能:尾插法,新节点插入第二张表中
参数:头节点
返回值:空
*/
void insertNewNode2(Per* head2,Pcp people);
/*
功能:尾插法,新节点插入第三张表中
参数:头节点
返回值:空
*/
int insertNewNode3(Cp* head3,Cpl cpl);
/*
功能:查询链表中是否存在该节点
参数:传入字符串,头节点
返回值:1 成功 0 失败
*/
int check(User* head1, char* name);
/*
功能:查询链表中是否存在该节点
参数:head 头节点 id 查找的节点
返回值:1 成功 0 失败
*/
int checkUserLogin(User* head1, char* name,char* pwd);
/*
功能:写入用户登录到内存中
参数:head 头节点
返回值:无
*/
void saveUser(User* head1);
/*
功能:写入个人彩票信息到内存中
参数:head 头节点
返回值:无
*/
void saveUser2(Per* head2);
/*
功能:写入彩票发行记录到内存中
参数:head3 头节点
返回值:无
*/
void saveUser3(Cp* head3);
/*
功能:释放所有节点
参数:表1头节点
返回值:空
*/
void freeUserLink(User* head1);
/*
功能:释放所有节点
参数:表1头节点
返回值:空
*/
void freePerLink(Per* head2);
/*
功能:释放所有节点
参数:表1头节点
返回值:空
*/
void freeCpLink(Cp* head3);
/*
功能:释放所有节点
参数:三张链表的头节点
返回值:空
*/
void freeAllLink(User* head1,Per* head2,Cp* head3);
#endif
第四个文件(界面文件):
#ifndef VIEW_H_
#define VIEW_H_
/*
功能:打印登录注册界面
参数:空
返回值:空
*/
void mainMenu(void);
/*
功能:打印管理员界面
参数:空
返回值:空
*/
void adminMenu(void);
/*
功能:打印用户使用界面
参数:空
返回值:空
*/
void userMenu(void);
/*
功能:打印公正员使用界面
参数:空
返回值:空
*/
void workerMenu(void);
#endif
以上均为函数的头文件,对应的.c文件下边自己找(makefile自选):
#include "control.h"
#include "view.h"
#include "func.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define ADMIN "admin"
#define WORKER "worker"
#define PWD "12345"
#define FFLUSH() { while(getchar () != '\n'); } //缓存清理
#define CONTINUE(X) { while(getchar() != '\n'); printf(X); getchar (); } //屏幕暂停
/*
功能:主界面控制函数
参数:head 链表头节点
返回值:无
*/
void mainControl(User* head1,Per* head2,Cp* head3)
{
int choice = 0;
assert(head1 && head2 && head3);
while(1){
system("clear");
mainMenu();
scanf("%d",&choice);
while(getchar() != '\n');
switch(choice){
case 1:
insert(head1);
printUserLink(head1);
printUserLink2(head2);
CONTINUE("回车继续!");
choice = 0;
break;
case 2:
login(head1,head2,head3);
choice = 0;
CONTINUE("回车继续!");
break;
case 3:
printf("期待您的下次光临!\n");
return;
default:
printf("请输入正确的选择!\n");
break;
}
}
}
/*
功能:实现登录功能
参数:空
返回值:成功注册返回1,失败返回0
*/
void login(User* head1,Per* head2,Cp* head3)
{
assert(head1);
char name[1000] = {'\0'};
char pwd[1000] = {'\0'};
char key[1000] = {'\0'};
int count = 0;
printf("请输入帐号(账户设置请勿超过16个字母):\n");
fgets(name,20,stdin);
name[strlen(name) - 1] = '\0';
if((strlen(name) - 1) > 16){
printf("输入帐号长度超过限制,退出!\n");
return;
}
if(check(head1,name) || !strcmp(name,ADMIN) || !strcmp(name,WORKER)){
while(1){
printf("请输入密码(输入字符请勿超出16个):\n");
invisualPassWord(pwd);
printf("请再次输入密码:\n");
invisualPassWord(key);
if(strlen(pwd) >= 16 || strlen(key) >= 16 || strcmp(key,pwd)){
printf("输入长度超过限制或密码不统一!!!退出!\n");
break;
}
if(!strcmp(name,ADMIN) && !strcmp(pwd,PWD)){
adminControl(head1,head2,head3);
return ;
}else if(!strcmp(name,WORKER) && !strcmp(pwd,PWD)){
workerControl(head1,head2,head3,name);
return ;
}else if(checkUserLogin(head1,name,pwd)){
userControl(head1,head2,head3,name);
return ;
}else{
printf("帐号不存在或密码错误!请先注册或重新输入!\n");
count++;
}
if(count == 3){
printf("密码输入错误三次!退出!\n");
break;
}
}
}else{
printf("账户不存在,请先注册!\n");
return;
}
return;
}
/*
功能:管理员控制函数
参数:空
返回值:无
*/
void adminControl(User* head1,Per* head2,Cp* head3)
{
int choice = 0;
while(1){
system("clear");
adminMenu();
scanf("%d",&choice);
switch(choice){
case 1:
//开奖
publishLottary(head3);
printUserLink3(head3);
CONTINUE("回车继续!");
break;
case 2:
if(!ChatUserInf(head1)){
printf("未查到该用户信息!\n");
}
CONTINUE("回车继续!");
break;
case 3:
sortUserInf(head1);
CONTINUE("回车继续!");
break;
case 0:
return;
}
}
}
/*
功能:用户控制函数
参数:空
返回值:无
*/
void userControl(User* head1,Per* head2,Cp* head3,char* name)
{
int choice = 0;
assert(head1 && name && head2);
while(1){
system("clear");
userMenu();
scanf("%d",&choice);
switch(choice){
case 1:
chatInf(head1,name);
choice = 0;
CONTINUE("回车继续!");
break;
case 2:
userModifyInf(head1,name);
printUserLink(head1);
choice = 0;
CONTINUE("回车继续!");
break;
case 3:
if(!deleteUserInf(head1,name)){
printf("注销失败!\n");
printUserLink(head1);
}else{
printf("注销成功!\n");
printUserLink(head1);
return;
}
choice = 0;
CONTINUE("回车继续!");
break;
case 4:
//4: 充值
if(recharge(head1,name) == 1){
printf("充值成功,且行别珍惜!\n");
}else{
printf("充值失败,且行且珍惜!\n");
}
choice = 0;
CONTINUE("回车继续!");
break;
case 5:
//5: 查询中奖记录
askforPriceInf(head2,name);
choice = 0;
CONTINUE("回车继续!");
break;
case 6:
insert2(head1,head2, head3,name);
choice = 0;
CONTINUE("回车继续!");
break;
case 7:
lookforBuyHistory(head2,name);
choice = 0;
CONTINUE("回车继续!");
break;
case 8:
game();
CONTINUE("回车继续!");
break;
case 0:
choice = 0;
return;
default:
printf("请输入有效选项的数字!!\n");
choice = 0;
CONTINUE("回车继续!");
break;
}
}
}
/*
功能:公正员控制函数
参数:空
返回值:无
*/
void workerControl(User* head1,Per* head2,Cp* head3,char* name)
{
int choice = 0;
while(1){
system("clear");
workerMenu();
scanf("%d",&choice);
switch(choice){
case 1:
openLotarry(head1,head2,head3,name);
CONTINUE("回车继续!");
break;
case 2:
lookforHistoryInf(head3);
CONTINUE("回车继续!");
break;
case 0:
return;
default:
printf("请输入有效选项的数字!!\n");
CONTINUE("回车继续!");
break;
}
}
}
#include"link.h"
#include"func.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<time.h>
#define ADMIN "admin"
#define WORKER "worker"
#define PWD "12345"
/*
功能:插入节点至链表1的头节点后,注册
参数:表一头节点
返回值:整型
*/
int insert(User* head1)
{
assert(head1);
Usr user;
memset(&user,0, sizeof(Usr));
int count = 0;
while(1){
printf("请输入真实姓名(输入字符请勿超出16个):\n");
fgets(user.usrname,30,stdin);
user.usrname[strlen(user.usrname) - 1] = '\0';
while(getchar() != '\n');
if((strlen(user.usrname) - 1)>16){
printf("输入姓名长度超过限制,重新输入!\n");
count++;
}else{
break;
}
if(count ==3){
printf("输入错误三次!退出!请重新注册!\n");
return 0;
}
}
printf("请输入要设置的密码(数字、字符均可,个数小于16个): \n");
fgets(user.usrpwd,30,stdin);
user.usrpwd[strlen(user.usrpwd) - 1] = '\0';
if((strlen(user.usrpwd) - 1)>16){
printf("输入密码长度超过限制,退出!\n");
return 0;
}
if(!verificationCode()){
printf("验证失败!\n");
return 0;
}else{
printf("验证成功!\n");
}
if(!strcmp(user.usrname,ADMIN) || !strcmp(user.usrname,WORKER)){
printf("注册失败!\n");
return 0;
}
if(check(head1,user.usrname)){
printf("账户重名!\n");
return 0;
}else{
insertNewNode1(head1,user);
}
return 0;
}
/*
功能:密码隐藏
参数:空
返回值:空
*/
void invisualPassWord(char* p)
{
int i = 0;
char c = '\0';
while(1){
c = getch();
if(c == '\n'){
*(p + i) = '\0';
break;
}else if(c == 127){
if(i > 0){
i--;
printf("\b \b");
}
}else{
*(p + i) = c;
i++;
printf("*");
}
}
printf("\n");
}
/*
功能:去除回车输入
参数:空
返回值:字符char(输入的字符)
*/
char getch(void)
{
system("stty -icanon");
system("stty -echo");
char ch = getchar();
system("stty icanon");
system("stty echo");
return ch;
}
/*
功能:生成验证码
参数:空
返回值:空
*/
int verificationCode(void)
{
char arr[37] = {"abcdefghijklmnopqrstuvwxyz0123456789"};
char code[5] = {'\0'};
int i = 0;
srand(time(NULL));
for(;i < 4;i++){
code[i] = arr[rand() % 36];
}
printf("请按照显示的验证码进行输入:");
puts(code);
char ary[5] = {'\0'};
printf("请输入验证码:\n");
scanf("%s",ary);
if(!strcasecmp(ary,code)){
return 1;
}else{
return 0;
}
}
/*
功能:在第二张链表尾部插入一个个人彩票节点,买彩票
参数:head2 个人彩票头节点、head1信息、head2发行记录
返回值:1 成功 0 失败
*/
int insert2(User* head1,Per* head2,Cp* head3,char* name)
{
assert(head1);
Pcp people;
memset(&people,0, sizeof(Pcp));
User* p1 = head1->next;
assert(p1);
Per* p2 = head2;
assert(p2);
Cp* p = head3;
assert(p);
int i = 0;
//记着是给表二创建节点!!!!!!!!!!!!!!!!!!!!!!表1表3找表二资源!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(p->next == NULL){
printf("第一次未发行!\n");
return 1;
}
while(p->next != NULL){
p = p-> next;
}
while(p2->next != NULL){
p2 = p2 -> next;
}
if(p->cpl.kaijiangzhuangtai == 1){
printf("本期已经开奖,无法继续购买!请等待下次发行!\n");
return 0;
}else{
printf("请输入要购买的彩票号码(7个100以内的数字,数字之间用回车或空格隔开):\n(申明:购买彩票的注数必须小于5注)\n");
printf("选择号码时每个号码限选一次!重复选择无效!\n");
for(i = 0;i < 7;){
printf("第%d个号码:",i+1);
int ret = scanf("%d",&(people.choiceNum[i]));
while(getchar() != '\n');
if(ret == 1){
i++;
}else{
printf("输入有误!重新选号\n");
return 0;
}
}
printf("请输入要购买的注数:");
scanf("%d",&(people.zhushu));
if(people.zhushu > 5){
printf("购买单张彩票的投注注数应小于5注!购买失败!请重新购买!");
return 0;
}
strcpy(people.usrname,name);
while(p1 != NULL){//求余额
if(!strcmp(name,p1->user.usrname)){
p1->user.yue = p1->user.yue - people.zhushu*(p->cpl.cost);
if(p1->user.yue < 0){
printf("余额不足,请先充值后再来购买!\n");
putchar(10);
p1->user.yue = 0;
return 0;
}
}
p1 = p1->next;
}
people.cpIssue = p->cpl.cpIssue1;
p->cpl.sum = p->cpl.sum + people.zhushu;
p->cpl.sumMoney += people.zhushu * p->cpl.cost;
srand(time(NULL));//设置随机数种子
people.cpId = rand() % 100000;//取一个随机数赋值给变量a(0~9)
insertNewNode2(head2,people);
}
printUserLink2(head2);
return 1;
}
/*
功能:在第三张链表尾部插入一个彩票节点,管理员对彩票的发行
参数:head3 彩票发行记录头节点
返回值:1 成功 0 失败
*/
int insert3(Cp* head3)
{
assert(head3);
Cp* p = head3;
assert(p);
while(p->next != NULL){
p = p->next;
}
if(head3->next != NULL && p->cpl.kaijiangzhuangtai == 0){
printf("该期未开奖,不可继续发行\n");
return 0;
}
Cpl cpl;
memset(&cpl,0,sizeof(Cpl));
if(p == head3){
cpl.cpIssue1 = 21001;
}else{
cpl.cpIssue1 = p->cpl.cpIssue1 + 1;
}
printf("请输入本次彩票的单价:");
scanf("%d",&cpl.cost);
if(p == head3){
cpl.sumMoney = 10000;
}else{
cpl.sumMoney = p->cpl.sumMoney;
}
insertNewNode3(head3,cpl);
return 1;
}
/*
功能:查看用户链表中的信息
参数:head头文件
返回值:空
*/
void chatInf(User* head1,char* name)
{
assert(head1 && name);
User* p = head1->next;
assert(p);
int flag = 1;
while(p->next!= NULL){
if(!strcmp(p->user.usrname,name)){
flag++;
break;
}
p = p->next;
}
if(flag){
printf("您的基本信息为:\n");
printf("姓名:%s\n密码:%s\n余额:%d\n",p->user.usrname,p->user.usrpwd,p->user.yue);
}
}
void printUserLink(User* head1)
{
User* p = head1->next;
while(p != NULL){
printf("%10s %10s %10d\n",p->user.usrname,p->user.usrpwd,p->user.yue);
p = p->next;
}
}
void printUserLink2(Per* head2)
{
/*表er:
typedef struct personalCp{ //个人彩票
int cpIssue; //发布期号
int cpId; //彩票唯一标识ID
int choiceNum[7]; //彩票选中号码
char usrname[30]; //购买者帐号
int zhushu; //注数
int zhongjiangzhuangtai;//中奖状态,1中奖,0未中奖
int amount; //中奖金额
}Pcp;*/
Per* p = head2->next;
int i = 0;
printf("姓名\t\t彩票验证码\t\t中奖状态\t\t期号\t\t注数\t\t中奖金额\t\t\n");
while(p != NULL){
printf("%s\t\t\t%d\t\t\t%d\t\t%d\t\t\t%d\t\t\t%d\n",
p->people.usrname,p->people.cpId,p->people.zhongjiangzhuangtai,
p->people.cpIssue,p->people.zhushu,p->people.amount);
for(i =0 ;i<7;i++){
printf("%d",p->people.choiceNum[i]);
}
putchar(10);
p = p->next;
}
}
void printUserLink3(Cp* head3)
{
Cp* p = head3->next;
assert(head3);
while(p != NULL){
/*int cpIssue1; //发布期号
int cost; //彩票单价
int kaijiangzhuangtai; //开奖状态
int winLottaryNum[7]; //中奖号码
int sum; //售出总数
int sumMoney; //奖池金额*/
printf("期号\t\t单价\t\t开奖状态\t售出总数\t奖池金额\t\t开奖号码\t\n");
printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t"
,p->cpl.cpIssue1,p->cpl.cost,p->cpl.kaijiangzhuangtai,p->cpl.sum,p->cpl.sumMoney);
int i = 0;
for(i = 0;i < 7;i++){
printf("%-5d",p->cpl.winLottaryNum[i]);
}
printf("\n");
p = p-> next;
}
}
void printUserLink31(Cp* head3,int num)
{
Cp* p = head3->next;
assert(head3);
while(p != NULL){
if(p->cpl.cpIssue1 == num){
printf("期号\t\t单价\t\t开奖状态\t售出总数\t奖池金额\t\t开奖号码\t\n");
printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t"
,p->cpl.cpIssue1,p->cpl.cost,p->cpl.kaijiangzhuangtai,p->cpl.sum,p->cpl.sumMoney);
int i = 0;
for(i = 0;i < 7;i++){
printf("%-5d",p->cpl.winLottaryNum[i]);
}
printf("\n");
break;
}else{
printf("查询信息不存在!\n");
return;
}
p = p-> next;
}
}
/*
功能:修改彩民信息
参数:头节点、字符串
返回值:空
*/
void userModifyInf(User* head1,char* name)
{
assert(head1 && name);
User* p = head1->next;
assert(p);
char pwd[30] = {'\0'};
char pwd1[30] = {'\0'};
int count = 0;
while(p->next != NULL){
if(!strcmp(name,p->user.usrname)){
break;
}
p = p->next;
}
while(1){
printf("请输入旧密码:");
scanf("%s",pwd);
if(!strcmp(pwd,p->user.usrpwd)){
printf("输入正确!\n");
break;
}else{
printf("输入错误!请重新输入旧密码!\n");
count++;
if(count == 3){
printf("错误三次,退出登录,返回主界面!\n");
return;
}
}
}
while(p!= NULL){
if(!strcmp(p->user.usrname,name)){
printf("请输入新密码:\n");
scanf("%s",pwd1);
if(!strcmp(pwd1,pwd)){
printf("新旧密码重复!\n");
break;
}
strcpy(p->user.usrpwd,pwd1);
printf("修改成功!\n");
break;
}
p = p->next;
}
}
/*
功能:注销当前用户
参数:用户链表的头节点,用户的姓名
返回值:空
*/
int deleteUserInf(User* head1,char* name)
{
assert(head1 && name);
if(checkInf(head1,name)){
int choice = 0;
printf("确定要注销吗?如果注销,将无法退还账户余额!\n请您慎重考虑,谢谢\n");
printf("******1.注销********\n");
printf("******2.取消********\n");
printf("请按数字键进行选择:");
scanf("%d",&choice);
if(choice == 1){
User* p = head1;//指向头节点的指针p
assert(p);
User* delNode = NULL;//空指针
while(p->next != NULL){
if(!strcmp(p->next->user.usrname,name)){//从头节点的下一个节点开始检查姓名
delNode = p->next;//指针指向要删除的节点
p->next = p->next->next;//节点指针域指向要删除的节点的下一个节点的地址
free(delNode);
delNode = NULL;
return 1;
}
p = p->next;
}
return 1;
}else{
return 0;
}
}
return 0;
}
/*
功能:查找用户
参数:头节点,字符串
返回值:
*/
int checkInf(User* head1,char* name)
{
printUserLink(head1);
assert(head1 && name);
User* p = head1->next;
assert(p);
while(p != NULL){
if(!strcmp(name,p->user.usrname)){
return 1;
}
p = p->next;
}
return 0;
}
/*
功能:充值函数
参数:头节点,字符串
返回值:1成功充值,0充值失败
*/
int recharge(User* head1,char* name)
{
assert(head1 && name);
User* p = head1->next;
assert(p);
int money = 0;
int sum = 0;
while(p != NULL){
if(!strcmp(p->user.usrname,name)){
printf("请输入要充值的金额:");
scanf("%d",&money);
if(money < 0){
printf("充值失败,充值负数不合法!\n");
return 0;
}else if(money == 0){
printf("充值金额不得为0!\n");
return 0;
}else{
sum = p->user.yue + money;
p->user.yue = sum;
return 1;
}
}
p = p ->next;
}
return 0;
}
/*
功能:查询中奖记录
参数:头节点,字符串顾客姓名
返回值:1中奖,0未中奖
*/
int askforPriceInf(Per* head2,char* name)
{
assert(head2 && name);
Per* p = head2;
assert(p);
printf("姓名\t\t彩票验证码\t\t中奖状态\t\t期号\n");
while(p != NULL){
if(!strcmp(p->people.usrname,name)){
printf("%s\t\t\t%d\t\t\t%d\t\t%d\t\t\n",
p->people.usrname,p->people.cpId,p->people.zhongjiangzhuangtai,
p->people.cpIssue);
putchar(10);
}
p = p->next;
}
return 1;
}
/*
功能:查询用户信息
参数:头节点
返回值:1查到,0未查到
*/
int ChatUserInf(User* head1)
{
assert(head1);
printf("请输入要查询的用户的账户(姓名):");
char name[30] = {'\0'};
scanf("%s",name);
User* p = head1->next;
if(p == NULL){
return 0;
}
while(p != NULL){
if(!strcmp(p->user.usrname,name)){
printf("姓名:%s\n密码:******\n余额:%d\n",
p->user.usrname,p->user.yue);
return 1;
}
p = p->next;
}
return 0;
}
/*
功能:按用户余额进行排序
参数:头节点
返回值:空
*/
void sortUserInf(User* head1)
{
assert(head1);
if(NULL == head1->next || NULL == head1->next->next){
printf("大哥!一个人怎么排?没东西排个锤子!!!\n");
return;
}
User* p = head1->next;
assert(p);
User* q = p;
assert(q);
Usr tmp;
memset(&tmp,0,sizeof(Usr));
for(p = head1->next;p->next != NULL;p = p->next){
for(q = p->next;q != NULL;q = q->next){
if(p->user.yue > q->user.yue){
tmp = p->user;
p->user = q->user;
q->user = tmp;
}
}
}
printf("恭喜你,排序完成啦!\n");
printUserLink(head1);
}
/*
功能:发布彩票//管理员的发行彩票
参数:链表三的头节点
返回值:空
*/
void publishLottary(Cp* head3)
{
printf("发布彩票前请确认您的密码!\n");
char pwd[30] = {'\0'};
scanf("%s",pwd);
if(!strcmp(pwd,"12345")){
printf("密码正确!\n");
insert3(head3);
}else{
printf("密码不正确!退出!\n");
return;
}
}
/*
功能:开奖
参数:彩票发行记录链表头节点
返回值:空
*/
void openLotarry(User* head1,Per* head2,Cp* head3,char* name)
{
Cp* p = head3;
User* p1 = head1->next;
Per* p2 = head2->next;
char pwd[30] = {'\0'};
int count = 0;
int i = 0;
while(1){
printf("请输入公正员开奖授权密码:");
scanf("%s",pwd);
if(!strcmp(pwd,PWD)){//和宏比较
printf("输入正确!\n");
break;
}else{
printf("输入错误!请重新输入密码!\n");
count++;
if(count == 3){
printf("密码错误三次,请重新确认后再进行操作!\n");
return;
}
}
}
printf("是否确认开奖?开奖后彩民将无法购买!是否继续?(继续请扣1,退出扣0)\n");
int choice = 0;
scanf("%d",&choice);
switch(choice){
case 1:
if(p->next == NULL){
printf("第一期都未发行,你开个毛线!\n");
return;
}
while(p->next != NULL){//遍历第三张链表找到最后一个节点(最新的一期)
p = p-> next;
}
if(p->cpl.kaijiangzhuangtai == 1){
printf("本期已经开奖,切勿重复开奖!\n");
return;
}
if(p2 == NULL){
p->cpl.kaijiangzhuangtai = 1;
printf("开奖成功了,但是没人买,大兄弟!\n");
return;
}
while((p2 != NULL) && (p->cpl.cpIssue1 != p2->people.cpIssue)){//判定期号相等时,移动指针到期号的第一个节点
p2 = p2->next;
}
if(p2 == NULL){
p->cpl.kaijiangzhuangtai = 1;
printf("开奖成功了,但是没人买,大兄弟!\n");
return;
}
/*srand(time(NULL));//设置随机数种子
for(i = 0;i < 7;i++){//外层控制循环的次数,也就是要产生的随机数个数
while(1){
a = rand() % 10;//取一个随机数赋值给变量a(0~9)
for(j = 0;j < i;j++){//内层检查是否重复
if(p->cpl.winLottaryNum[j] == a){//如果对应数组中的元素等于该变量a
break;//跳出内层的for循环,继续死循环
}
}
if(j == i){//当位值数等于查重数时
p->cpl.winLottaryNum[i] = a;
break;
}
}
}*/
for(i = 0;i <7;i++){
p->cpl.winLottaryNum[i] = 1;
}
while(p2 != NULL){
int flag = 0;
p1 = head1->next;
for(i = 0;i < 7;i++){
if(p->cpl.winLottaryNum[i] == p2->people.choiceNum[i]){
flag++;
}
}
while(p1 != NULL){
if(!strcmp(p1->user.usrname,p2->people.usrname)){
if(flag == 7){
p2->people.zhongjiangzhuangtai = 1;
p1->user.yue += 100*(p2->people.zhushu);
p->cpl.sumMoney -= 100*(p2->people.zhushu);
p2->people.amount = 100*(p2->people.zhushu);
}else if(flag == 6){
p2->people.zhongjiangzhuangtai = 2;
p1->user.yue += 50*(p2->people.zhushu);
p->cpl.sumMoney -= 50*(p2->people.zhushu);
p2->people.amount = 50*(p2->people.zhushu);
}else if(flag == 5){
p2->people.zhongjiangzhuangtai = 3;
p1->user.yue += 25*(p2->people.zhushu);
p->cpl.sumMoney -= 25*(p2->people.zhushu);
p2->people.amount = 25*(p2->people.zhushu);
}else if(flag > 0 && flag < 5){
p2->people.zhongjiangzhuangtai = 4;
p1->user.yue += 1*(p2->people.zhushu);
p->cpl.sumMoney -= 1*(p2->people.zhushu);
p2->people.amount = 1*(p2->people.zhushu);
}else{
p2->people.zhongjiangzhuangtai = 0;
}
}
p1 = p1 -> next;
}
p2 = p2->next;
}
printf("开奖已经完成!!可以进行下一次彩票的发售!\n");
printf("======================================\n");
p->cpl.kaijiangzhuangtai = 1;//改变节点状态
break;
case 0:
return;
}
}
/*
功能:查询历史发行记录
参数:头节点
返回值:空
*/
void lookforHistoryInf(Cp* head3)
{
printf("请按序号选择查询方式:\n");
printf("*********************\n");
printf("*1.查询全部历史记录*\n");
printf("*2.按期号进行查询 *\n");
printf("*0.退出 *\n");
printf("*********************\n");
int choice = 0;
scanf("%d",&choice);
int num = 0;
switch(choice){
case 1:
printUserLink3(head3);
break;
case 2:
printf("请输入要查询的期号!\n");
scanf("%d",&num);
printUserLink31(head3,num);
break;
case 0:
return;
}
}
/*
功能:查询用户购买的彩票信息
参数:头节点,姓名
返回值:空
*/
void lookforBuyHistory(Per* head2,char* name)
{
assert(head2 && name);
Per* p = head2->next;
int i = 0;
if(p == NULL){
printf("第一期未发行无法查询!\n");
return;
}
printf("姓名\t\t彩票验证码\t\t中奖状态\t\t期号\t\t注数\t\t中奖金额\t\t\n");
while(p != NULL){
if(!strcmp(p->people.usrname,name)){
printf("%s\t\t\t%d\t\t\t%d\t\t%d\t\t\t%d\t\t\t%d\n",
p->people.usrname,p->people.cpId,p->people.zhongjiangzhuangtai,
p->people.cpIssue,p->people.zhushu,p->people.amount);
for(i =0 ;i<7;i++){
printf("第%d个号码:%d\n",i+1,p->people.choiceNum[i]);
}
putchar(10);
}
p = p->next;
}
}
/*
功能:小游戏
参数:空
返回值:空
*/
void game(void)
{
int a = 0;
int b = 0;
int count = 0;
int flag = 0;
printf("欢迎来到陈大饼猜拳小游戏!\n");
while(1){
printf("请输入一个数字(0~9):");
scanf("%d",&a);
srand(time(NULL));
b = rand() % 10;
printf("%d\n",b);
if(a > b){
flag++;
}else if(a < b){
count++;
}else{
printf("平!\n");
}
if(flag == 3){
printf("你赢了!\n");
return;
}
if(count == 3){
printf("对不起,你输了!\n");
return;
}
}
}
#include"link.h"
#include"func.h"
#include"view.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
功能:创建用户链表头节点
参数:空
返回值:用户链表的指针类型
*/
User* createLink1(void)
{
User* head1 = (User*)calloc(1, sizeof(User));
assert(head1);
head1->next = NULL;
return head1;
}
/*
功能:创建用户链表头节点
参数:空
返回值:管理员链表的指针类型
*/
Per* creatLink2(void)
{
Per* head2 = (Per*)calloc(1, sizeof(Per));
assert(head2);
head2->next = NULL;
return head2;
}
/*
功能:创建公正员链表头节点
参数:空
返回值:公正员量表指针类型
*/
Cp* creatLink3(void)
{
Cp* head3 = (Cp*)calloc(1, sizeof(Cp));
assert(head3);
head3->next = NULL;
return head3;
}
void loadUser(User* head1)
{
assert(head1);
//打开文件
FILE* fp = fopen("./bin/user.bin", "rb");
if(fp == NULL){
system("touch ./bin/user.bin");
fp = fopen("./bin/user.bin", "rb");
}
assert(fp);
//读取文件
Usr usr;
memset(&usr, 0 ,sizeof(Usr));
while(fread(&usr, sizeof(Usr), 1, fp)){
insertNewNode1(head1, usr);
}
//关闭文件
fclose(fp);
fp = NULL;
}
/*
功能:从文件读取信息到存储区
参数:head 头节点
返回值:无
*/
void loadPerson(Per* head2)
{
assert(head2);
//打开文件
FILE* fp = fopen("./bin/person.bin", "rb");
if(fp == NULL){
system("touch ./bin/person.bin");
fp = fopen("./bin/person.bin", "rb");
assert(fp);
}
//读取文件
Pcp people;
memset(&people, 0 ,sizeof(Pcp));
while(fread(&people, sizeof(Pcp), 1, fp)){
insertNewNode2(head2,people);
}
//关闭文件
fclose(fp);
fp = NULL;
}
/*
功能:从文件读取学生发行记录到内存中
参数:head 头节点
返回值:无
*/
void load(Cp* head3)
{
assert(head3);
//打开文件
FILE* fp = fopen("./bin/cp.bin", "rb");
if(fp == NULL){
system("touch ./bin/cp.bin");
fp = fopen("./bin/cp.bin", "rb");
assert(fp);
}
//读取文件
Cpl cpl;
memset(&cpl, 0 ,sizeof(Cpl));
while(fread(&cpl, sizeof(Cpl), 1, fp)){
insertNewNode3(head3,cpl);
}
//关闭文件
fclose(fp);
fp = NULL;
}
/*
功能:写入用户登录到内存中
参数:head 头节点
返回值:无
*/
void saveUser(User* head1)
{
assert(head1);
//打开文件
FILE* fp = fopen("./bin/user.bin", "wb");
assert(fp);
//操作文件
User* p = head1->next;
while(p != NULL){
fwrite(&(p->user),sizeof(Usr),1,fp);
p = p->next;
}
//关闭文件
fclose(fp);
fp = NULL;
}
/*
功能:写入个人彩票信息到内存中
参数:head 头节点
返回值:无
*/
void saveUser2(Per* head2)
{
assert(head2);
//打开文件
FILE* fp = fopen("./bin/person.bin", "wb");
assert(fp);
//操作文件
Per* p = head2->next;
while(p != NULL){
fwrite(&(p->people),sizeof(Pcp),1,fp);
p = p->next;
}
//关闭文件
fclose(fp);
fp = NULL;
}
/*
功能:写入发行记录到内存中
参数:head 头节点
返回值:无
*/
void saveUser3(Cp* head3)
{
assert(head3);
//打开文件
FILE* fp = fopen("./bin/cp.bin", "wb");
assert(fp);
//操作文件
Cp* p = head3->next;
while(p != NULL){
fwrite(&(p->cpl),sizeof(Cpl),1,fp);
p = p->next;
}
//关闭文件
fclose(fp);
fp = NULL;
}
/*
功能:尾插法,新节点插入第一张表中
参数:头节点,结构体变量
返回值:1插入成功
*/
int insertNewNode1(User* head1,Usr user)
{
assert(head1);
//新节点的申请
User* newNode1 = (User*)calloc(1, sizeof(User));
assert(newNode1);
newNode1->user = user;
newNode1->next = NULL;
User* p = head1;
while(p->next != NULL){
p = p->next;
}
//链接新节点
p->next = newNode1;
return 1;
}
/*
功能:尾插法,新节点插入第二张表中
参数:头节点
返回值:空
*/
void insertNewNode2(Per* head2,Pcp people)
{
assert(head2);
//新节点的申请
Per* newNode2 = (Per*)calloc(1, sizeof(Per));
assert(newNode2);
newNode2->people = people;
newNode2->next = NULL;
//找到尾节点
Per* p = head2;
//链接新节点
while(p->next != NULL){
p = p->next;
}
p->next = newNode2;
}
/*
功能:尾插法,新节点插入第三张表中
参数:头节点,结构体变量
返回值:1插入成功
*/
int insertNewNode3(Cp* head3,Cpl cpl)
{
assert(head3);
//新节点的申请
Cp* newNode1 = (Cp*)calloc(1, sizeof(Cp));
assert(newNode1);
newNode1->cpl = cpl;
newNode1->next = NULL;
Cp* p = head3;
while(p->next != NULL){
p = p->next;
}
p->next = newNode1;
return 1;
}
/*
功能:查询链表中是否存在该节点
参数:head 头节点 id 查找的节点
返回值:1 成功 0 失败
*/
int check(User* head1, char* name)
{
assert(head1);
User* p = head1->next;
while(p != NULL){
if(!strcmp(name,p->user.usrname)){
return 1;
}
p = p->next;
}
return 0;
}
/*
功能:查询链表中是否存在该节点
参数:head 头节点 id 查找的节点
返回值:1 成功 0 失败
*/
int checkUserLogin(User* head1, char* name,char* pwd)
{
assert(head1);
User* p = head1->next;
while(p != NULL){
if(!strcmp(name,p->user.usrname)&&!strcmp(pwd,p->user.usrpwd)){
return 1;
}
p = p->next;
}
return 0;
}
/*
功能:释放所有节点
参数:表1头节点
返回值:空
*/
void freeUserLink(User* head1)
{
assert(head1);
User* p = head1->next;
User* q = p;
while(p != NULL){
q = p->next;
free(p);
p = q;
}
free(head1);
}
/*
功能:释放所有节点
参数:表1头节点
返回值:空
*/
void freePerLink(Per* head2)
{
assert(head2);
Per* p = head2->next;
Per* q = p;
while(p != NULL){
q = p->next;
free(p);
p = q;
}
free(head2);
}
/*
功能:释放所有节点
参数:表1头节点
返回值:空
*/
void freeCpLink(Cp* head3)
{
assert(head3);
Cp* p = head3->next;
Cp* q = p;
while(p != NULL){
q = p->next;
free(p);
p = q;
}
free(head3);
}
/*
功能:释放所有节点
参数:三张链表的头节点
返回值:空
*/
void freeAllLink(User* head1,Per* head2,Cp* head3)
{
freeUserLink(head1);
freePerLink(head2);
freeCpLink(head3);
}
#include"link.h"
#include"func.h"
#include"control.h"
#include"view.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
//链表的创建
User* head1 = createLink1();
assert(head1);
Per* head2 = creatLink2();
assert(head2);
Cp* head3 = creatLink3();
assert(head3);
//读取文件
loadUser(head1);
printUserLink(head1);
loadPerson(head2);
printUserLink2(head2);
load(head3);
printUserLink3(head3);
//主要逻辑控制
mainControl(head1,head2,head3);
//保存文件
saveUser(head1);
saveUser2(head2);
saveUser3(head3);
//释放所有节点
freeAllLink(head1,head2,head3);
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include"view.h"
/*
功能:打印登录注册界面
参数:空
返回值:空
*/
void mainMenu(void)
{
printf("\033[;35m***欢迎进入“最坑爹”黑彩票中心***\033[4m\n");
printf("\033[;31m===============================\033[0m\n");
putchar(10);
printf("\033[;32m1: 注册 \033[0m\n");
putchar(10);
printf("\033[;33m2: 登录 \033[0m\n");
putchar(10);
printf("\033[;34m3: 退出 \033[0m\n");
putchar(10);
printf("\033[;35m===============================\033[0m\n");
printf("\033[;35m*******************************\033[0m\n");
putchar(10);
printf("\033[;36m根据系统提示,选择,新用户请先注册:\033[0m\n");
}
/*
功能:打印管理员界面
参数:空
返回值:空
*/
void adminMenu(void)
{
printf("\033[;35m*****欢迎进入“坑爹的”管理员界面****\033[3m\n");
printf("===============================\n");
putchar(10);
printf("1: 发行彩票 \n");
putchar(10);
printf("2: 按用户帐号查询 \n");
putchar(10);
printf("3: 按用户余额排序 \n");
putchar(10);
printf("0: 退出 \n");
putchar(10);
printf("===============================\n");
printf("*******************************\n");
putchar(10);
printf("\033[;35m根据系统提示,选择:\033[0m\n");
}
/*
功能:打印用户使用界面
参数:空
返回值:空
*/
void userMenu(void)
{
printf("*****欢迎进入“最坑爹”用户界面*****\n");
printf("===============================\n");
putchar(10);
printf("1: 查看个人信息 \n");
putchar(10);
printf("2: 修改个人信息 \n");
putchar(10);
printf("3: 注销个人信息 \n");
putchar(10);
printf("4: 充值 \n");
putchar(10);
printf("5: 查询中奖记录 \n");
putchar(10);
printf("6: 买买买!!! \n");
putchar(10);
printf("7: 查询购票记录 \n");
putchar(10);
printf("8: 陈大饼的羞羞羞 \n");
putchar(10);
printf("0: 返回上一级 \n");
putchar(10);
printf("===============================\n");
printf("*******************************\n");
putchar(10);
printf("根据系统提示,选择:\n");
}
void workerMenu(void)
{
printf("*****欢迎进入“稳坑爹”公正员界面****\n");
printf("===============================\n");
putchar(10);
printf("1: 开奖 \n");
putchar(10);
printf("2: 查看历史发行 \n");
putchar(10);
printf("0: 返回上一级 \n");
putchar(10);
printf("===============================\n");
printf("*******************************\n");
putchar(10);
printf("根据系统提示,选择:\n");
}