@
前言
這是我大一用c寫的一個小項目《網吧的管理系統的實現》,在這里提供大家學習和使用
主要知識:
- 鏈表的創建與使用
- 文件的操作
- 各種c語句的運用
tips:使用時,記得在c文件中添加一個 Account library.txt 文檔
一、設計任務
如今現在的網絡非常的發達,各種軟件、游戲、媒體等對網絡的要求也非常的高,所以為了滿足消費者,網吧必須改建,建立一個以網路技術、計算機技術與現代信息技術為支撐的娛樂、管理平台、將現行以游戲網為主的活動發展到多功能娛樂這個平台上來,既以大幅度提高網吧的競爭和盈利能力,建設成為一流的高檔網吧,以吸引高端消費群體打下強由劉的基礎。這就是我們要達到的目標。由此分析一個合理、簡單、規范的網吧管理系統符合目前需求形勢。
二、程序設計與實現
本程序面向兩類用戶即vip和管理員,有兩個入口,vip可以注冊然后進行登錄,管理員有固定的賬號和密碼(隱秘的入口)。Vip有上下機和修改密碼功能
管理員擁有會員信息的查看和充值等陸續開發的功能。如下圖所示
1.數據描述
(1)會員信息存儲
typedef struct
{
char vipAccount[MAX]; //會員賬號(身份證號)
char vipPassword[MIN]; //會員密碼
char vipPhoneNum[11]; //會員綁定手機號
int vipAmount; //會員剩余金額
} VIP;
(2)時間信息存儲
typedef struct clock
{
int hour; 小時
int minute; 分鍾
int second; 秒
}Clock;
(3)全局變量設計
定義全局變量MAX、 MIN 限制賬號、密碼長度
2.功能模塊設計
(1)函數名:void signUp()
函數功能:登錄賬號
輸 入:
輸 出:
算法描述:
(2)函數名:void enroll()
函數功能:注冊
輸 入:
輸 出:
算法描述:
(3)函數名:void getPassBack()
函數功能:密碼找回
輸 入:
輸 出:
算法描述:
(4)函數名:void GetPassword()
函數功能:密碼回顯‘*’
輸 入:密碼
輸 出:無
算法描述:
(5)函數名:void vipMenu()
函數功能:會員界面
輸 入:
輸 出:
算法描述:
(6)函數名:void maMenu()
函數功能:管理員界面
輸 入:
輸 出:
算法描述:
(7)函數名:void getOn()
函數功能:用戶上機
輸 入:
輸 出:
算法描述
(8)函數名:void changePass()
函數功能:密碼修改
輸 入:
輸 出:
算法描述:
(9)函數名:void preservation(double money)
函數功能:更新用戶信息
輸 入:已用金額
輸 出:
算法描述:
(10)函數名:void manage()
函數功能:管理員登錄
輸 入:
輸 出:
算法描述:
(11)函數名:void inforSheet()
函數功能:會員信息查看
輸 入:無
輸 出:無
算法描述:
(12)函數名:void recharge()
函數功能:充值
輸 入:無
輸 出:無
算法描述:
(13)函數名:void Begin()
函數功能:過場動畫
輸 入:無
輸 出:無
算法描述:
(14)函數名:void menu()
函數功能:
輸 入:
輸 出:
算法描述:
三、UI設計效果
1.啟動界面:一個簡單的進場動畫。
2.開始界面:幾個功能展示。
3.用戶界面:有會員的基本信息。
4.信息打印界面:
5.項目到目前為止存在的不足及改正措施:
(1)界面顯示不夠美觀。
(2)數據打印不夠整齊。
(3)沒能完成在計時的同時進行游戲(在里面添加c語言小游戲)功能實現(大二的我現在也解決不了,大一本心是想把用c寫的一些小游戲,用上去)
四、代碼實現(記得添加一個Account library.txt 文本文檔)
tips:管理員系統進入方法:在用戶菜單下輸入“管理員登錄”。賬號默認為(賬號:admin 密碼:1111)
驗證碼查看方法:打開c文件--->打開vercode.txt
用戶注冊:賬號是身份證號,初始密碼:123456(可修改)
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include<time.h>
#include<stdint.h>
#include <stdlib.h>
#define MAX 19
#define MIN 16
#define MIN_INPUT 0x20
#define MAX_INPUT 0x7e
time_t timer;
struct tm *tblock;
int userPrint;//用於用戶輸入驗證碼
typedef struct
{
char vipAccount[MAX]; //會員賬號(身份證號)
char vipPassword[MIN]; //會員密碼
char vipID[17]; //未知錯誤(1)
char vipPhoneNum[11]; //會員綁定手機號
double vipAmount; //會員剩余金額
} VIP;
VIP user;//便於操作
typedef struct clock
{
int hour; //小時
int minute; //分鍾
int second; //秒
} Clock;
Clock startime;//用於存儲上機開始時間
Clock endtime;//用於存儲下機時間
Clock temptime;//用於存儲臨時時間
void vipMenu()//會員界面ui
{
system("cls");
printf("_________________________________________\n");
printf("|*會員信息 |\n");
printf("|*賬號:%c%c%c%c%c%c%c%c%c%c%c%c%c%c**** |\n",user.vipAccount[0],user.vipAccount[1],user.vipAccount[2],user.vipAccount[3],user.vipAccount[4],user.vipAccount[5],user.vipAccount[6],user.vipAccount[7],user.vipAccount[8],user.vipAccount[9],user.vipAccount[10],user.vipAccount[11],user.vipAccount[12],user.vipAccount[13]);
printf("|*手機號:%c%c%c****%c%c%c%c |\n",user.vipPhoneNum[0],user.vipPhoneNum[1],user.vipPhoneNum[2],user.vipPhoneNum[7],user.vipPhoneNum[8],user.vipPhoneNum[9],user.vipPhoneNum[10]);
printf("|*余額:%lf |\n",user.vipAmount);
printf("| |\n");
printf("|===========會員界面====================|\n");
printf("|=======================================|\n");
printf("|======上機===========下機==============|\n");
printf("|======使用幫助=======密碼修改==========|\n");
printf("|_______________________________________|\n");
if(user.vipAmount<0)
{
printf("余額不足,請充值");
system("pause");
menu();
}
else
{
userChoices();
}
}
void GetPassword(char* pszPw)//密碼回顯“*”
{
char ch;
int i=0;
int flag=1;
while( ( ch = (char)getch() ) )
{
flag=1;
if ( ch == 13)
{
pszPw[i++]=0;
break;
}
else if ( ch >= MIN_INPUT && ch <= MAX_INPUT) /*所有可打印字符*/
{
pszPw[i++]=ch;
}
else if ( ch == 8 && i> 0 ) //退格鍵
{
pszPw[i--] = 0;
flag = 0;
putchar( ch );
putchar( ' ' );
putchar( ch );
}
else
flag= 0;
if(flag)
putchar('*');
}
pszPw[i]=0;
}
void manage()//管理員登錄
{
char userAccount[5];
char userPass[5];
printf("賬號:");
scanf("%s",userAccount);
printf("密碼:");
scanf("%s",userPass);
if(strcmp(userAccount,"admin")==0 && strcmp(userPass,"1111")==0)
{
maMenu();
}
}
void maMenu()//管理員界面
{
system("cls");
printf("_________________________________________\n");
printf("|===========管理員界面==================|\n");
printf("|=======================================|\n");
printf("|======會員信息總覽========會員充值=====|\n");
printf("|======使用幫助=========================|\n");
printf("|_______________________________________|\n");
maChoice();
}
void maChoice()//管理員選擇
{
char choice[20];
scanf("%s",choice);
if(strcmp(choice,"會員信息總覽")==0)
{
memberInfor();
}
else if(strcmp(choice,"會員充值")==0)
{
memberRecharge();
}
}
void memberInfor()//會員信息總覽
{
int i = 0;
VIP mangePass;
FILE *fpp = fopen("Account library.txt","r+");
printf("|NO| |account number| |password| |Binding| |balance|\n");
printf("------------------------------------------------------------------------------\n");
while(!feof(fpp))
{
i++;
fscanf(fpp,"%s",mangePass.vipAccount);
printf("%04d %s ",i,mangePass.vipAccount);
fscanf(fpp,"%s",mangePass.vipPassword);
printf("%s ",mangePass.vipPassword);
fscanf(fpp,"%s",mangePass.vipPhoneNum);
printf("%s ",mangePass.vipPhoneNum);
fscanf(fpp,"%s",mangePass.vipID);
printf("%s\n",mangePass.vipID);
}
maChoice();
}
void memberRecharge()//會員充值
{
int i = 3;
int condiTime = 0;
int flag = 0;
char key[MAX];//用於轉移數據
char account[MAX];//充值賬戶
double reMoney;
while(1)
{
rename("Account library.txt","Accountlibrary.txt");
FILE *fp = fopen("Accountlibrary.txt","r+");
FILE *fpp = fopen("Account library.txt","wt+");
printf("輸入充值賬號:");
scanf("%s",account);
printf("輸入充值金額:");
scanf("%lf",&reMoney);
while(fscanf(fp,"%s",key)!=EOF)
{
fprintf(fpp,"%s",key);
condiTime++;
if(condiTime%4!=0)
{
fprintf(fpp," ");
}
else
{
fprintf(fpp,"\n");
}
if(strcmp(account,key)==0)
{
flag = 1;
double balance;
fscanf(fp,"%s",key);
fprintf(fpp,"%s ",key);
fscanf(fp,"%s",key);
fprintf(fpp,"%s ",key);
fscanf(fp,"%lf",&balance);
balance = balance + reMoney;
fprintf(fpp,"%lf\n",balance);
condiTime = 0;
}
}
fclose(fpp);
fclose(fp);
system("del Accountlibrary.txt");
if(!flag)
{
printf("賬戶不存在,請重新輸入:");
}
else
{
printf("賬戶信息已更新\n");
while(i>1)
{
printf("返回用戶界面中.......%ds",i--);
printf("\r");
Sleep(1000);
}
system("pause");
maMenu();
}
}
}
void enroll()//注冊
{
char choice;
int flag ;//用於判斷是否重復手機號的標志
VIP user;
printf("正在注冊...\n");
while(1)
{
char account[MAX];
char phoneNum[12];
printf("身份證號:");
scanf("%s",user.vipAccount);
//身份證號查重
FILE *pf = fopen("Account library.txt","r+");
while(fscanf(pf,"%s",account)!=EOF)
{
if(strcmp(account,user.vipAccount)==0)
{
printf("賬號已被注冊,請重新輸入:");
enroll();
}
}
fclose(pf);
if(strlen(user.vipAccount)!=18)
{
continue;
}
else if(strlen(user.vipAccount)==18)
{
unsigned long curTime;
time(&timer);
tblock = gmtime(&timer);
curTime = (tblock->tm_year+1900)*10000+(tblock->tm_mon+1)*100+tblock->tm_mday;
//printf("%ld",curTime);
unsigned long tempTime;
tempTime = (user.vipAccount[6]-'0')*10000000+(user.vipAccount[7]-'0')*1000000+(user.vipAccount[8]-'0')*100000+(user.vipAccount[9]-'0')*10000+(user.vipAccount[10]-'0')*1000+(user.vipID[11]-'0')*100+(user.vipID[12]-'0')*10+(user.vipID[13]-'0');
//printf("%ld",tempTime);
if(curTime-tempTime>180000)
{
int flag = 0;//用於判斷
//printf("通過");
while(1)
{
flag = 0;
printf("輸入手機號:");
scanf("%s",user.vipPhoneNum);
//手機號查重
FILE *pf = fopen("Account library.txt","r+");
while(fscanf(pf,"%s",phoneNum)!=EOF)
{
if(strcmp(phoneNum,user.vipPhoneNum)==0)
{
printf("手機號已被注冊,請重新輸入:");
flag = 1;
break;
}
}
fclose(pf);
if(flag)
{
continue;
}
if(strlen(user.vipPhoneNum)!=11)
{
printf("輸入有誤,重新輸入\n");
continue;
}
else
{
int j;
//讀取文件中驗證碼
while(1)
{
int i = 3;
j = verCode();
printf("請輸入驗證碼:");
scanf("%d",&userPrint);
if(userPrint==j)
{
FILE *fp = fopen("Account library.txt","a+");
fprintf(fp,"%s 123456 %s 0.000000\n",user.vipAccount,user.vipPhoneNum);
fclose(fp);
printf("成功注冊,請記住你的賬號(身份證號)和密碼(默認:123456)\n");
printf("》》》請求發送中》》》》》\n");
while(i>1)
{
printf(".......%d",i--);
printf("\r");
Sleep(1000);
}
system("pause");
signUp();
}
else
{
printf("驗證碼錯誤,是否重新輸入手機號(Y/N):");
scanf("\n");
scanf("%c",&choice);
if(choice == 'Y')
{
break;
}
else
{
printf("已經重新發送驗證碼,");
continue;
}
}
}
}
}
}
else
{
printf("未成年人禁止上網\n");
continue;
}
}
}
}
void signUp()//登錄
{
int flag = 0;//賬號正確的標志
int count = 0;
FILE *fp;
char userAccount[18];
char userPass[16];
while(1)
{
printf("賬號:");
scanf("%s",userAccount);
fp = fopen("Account library.txt","r");
while(!feof(fp))
{
fscanf(fp,"%s",user.vipAccount);
if(strcmp(userAccount,user.vipAccount)==0)
{
flag = 1;
fscanf(fp,"%s",user.vipPassword);
fscanf(fp,"%s",user.vipPhoneNum);
fscanf(fp,"%lf",&user.vipAmount);
while(count<3)
{
printf("密碼:");
GetPassword(userPass);
if(strcmp(userPass,user.vipPassword)==0)
{
fclose(fp);
//printf("登錄成功");
vipMenu();
}
else if(count<3)
{
printf("密碼有誤請重新輸入:");
count++;
}
}
while(1)
{
int j = verCode();
int userVerify;
printf("驗證碼:%d\n請輸入以上驗證碼:",j);
scanf("%d",&userVerify);
if(userVerify==j)
{
printf("重新輸入密碼:");
GetPassword(userPass);
if(strcmp(userPass,user.vipPassword)==0)
{
fclose(fp);
// printf("登錄成功");
vipMenu();
}
}
}
}
else
{
fscanf(fp,"%s",user.vipPassword);
fscanf(fp,"%s",user.vipPhoneNum);
fscanf(fp,"%lf",&user.vipAmount);
}
}
if(!flag)
{
fseek(fp,0L,0);
printf("賬號不存在,請重新輸入\n");
fclose(fp);
}
}
}
int verCode()//發送驗證碼
{
int i;
int j;
srand((int)time(0));//初始化時間
j = rand()%9999;
FILE *fp = fopen("vercode.txt","w+");
//printf("%d",j);//需要寫入文件
fprintf(fp,"%d",j);
fclose(fp);
return j;
}
void Begin()//開始ui
{
printf("正在啟動網吧管理系統 請您遵守網吧管理規定,看好隨身物品。\n");
char str[100] = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>";
int i,j;
for(i = 0; i<strlen(str); i++)
{
printf("%c",str[i]);
Sleep(10);
}
printf("\n加載完成\n");
system("pause");
system("cls");
}
void menu()//菜單界面ui
{
system("cls");
printf("==================================\n");
printf("===========網吧管理系統===========\n");
printf("==================================\n");
printf("======會員登錄=======成為會員=====\n");
printf("======使用幫助=======找回密碼=====\n");
printf("==================================\n");
userChoice();
}
void userChoice()//用戶選擇1
{
while(1)
{
char userchoice[20];
scanf("%s",userchoice);
if(strcmp(userchoice,"會員登錄")==0)
{
// printf("登錄");
signUp();
}
else if(strcmp(userchoice,"成為會員")==0)
{
printf("注冊");
enroll();
}
else if(strcmp(userchoice,"使用幫助")==0)
{
printf("幫助");
//userMal();
}
else if(strcmp(userchoice,"管理員登錄")==0)
{
manage();
}
else if(strcmp(userchoice,"找回密碼")==0)
{
getPassBack();
}
else
{
printf("輸入有誤,請重新輸入");
}
}
}
void getPassBack()
{
int j,i;
int flag = 0; //是否有對應賬號的標簽
char key[11];
while(1)
{
printf("輸入綁定手機號:");
scanf("%s",key);
if(strlen(key)!=11)
{
printf("輸入有誤,重新輸入\n");
continue;
}
VIP mangePass;
FILE *fpp = fopen("Account library.txt","r+");
while(!feof(fpp))
{
fscanf(fpp,"%s",mangePass.vipAccount);
fscanf(fpp,"%s",mangePass.vipPassword);
fscanf(fpp,"%s",mangePass.vipPhoneNum);
fscanf(fpp,"%s",mangePass.vipID);
if(strcmp(key,mangePass.vipPhoneNum)==0)
{
flag = 1;
break;
}
}
if(flag)
{
printf("已經發送驗證碼,請輸入:");
j = verCode();
while(1)
{
scanf("%d",&userPrint);
if(userPrint==j)
{
printf("|NO| |account number| |password| |Binding| |balance|\n");
printf("------------------------------------------------------------------------------\n");
printf("%04d %s ",i,mangePass.vipAccount);
printf("%s ",mangePass.vipPassword);
printf("%s ",mangePass.vipPhoneNum);
printf("%s\n",mangePass.vipID);
}
else
{
printf("輸入有誤!!重新輸入");
}
}
}
}
}
void userChoices()//用戶選擇2
{
char userchoice[10];
while(1)
{
scanf("%s",userchoice);
if(strcmp(userchoice,"上機")==0)
{
getOn();
}
else if(strcmp(userchoice,"下機")==0)
{
printf("尚未上機");
}
else if(strcmp(userchoice,"使用幫助")==0)
{
}
else if(strcmp(userchoice,"密碼修改")==0)
{
changePass();
}
}
}
void getOn()//上機
{
int endWhile = 0;//用於下機結束循環
int vipChoice;//區域選項
int upOdown;//是否下機的選項
double money;//單價
while(1)
{
Clock a;
printf("選擇區域:1.VIP區\n2.游戲區\n3.普通區");
scanf("%d",&vipChoice);
switch(vipChoice)
{
case 1:
money = 0.25;
break;
case 2:
money = 0.16;
break;
case 3:
money = 0.05;
break;
default:
getOn();
}
while(!kbhit())
{
printf("\r");
if(endWhile == 0)
{
timestar();
endWhile = 1;
}
timeend();
Sleep(1000);
a.second = temptime.second - startime.second;
if(a.second<0)
{
a.second = a.second + 60;
temptime.minute--;
}
a.minute = temptime.minute - startime.minute;
if(a.minute<0)
{
a.minute = a.minute + 60;
temptime.hour--;
}
a.hour = temptime.hour - startime.hour;
printf("%02d:%02d:%02d", a.hour, a.minute,a.second);
if(a.minute%15==0 && a.minute!=0 && a.second==0)
{
//自動保存
money = money*15;
preservation(money);
}
}
printf("是否下機?(1/0)");
scanf("%d",&upOdown);
if(upOdown==1)
{
if(vipChoice == 1)
{
//自動保存
money = money *((a.hour*60+a.minute)%15);
preservation(money);
break;
}
else if(vipChoice == 2)
{
//自動保存
money = money *((a.hour*60+a.minute)%15);
preservation(money);
break;
}
else if(vipChoice == 3)
{
//自動保存
money = money *((a.hour*60+a.minute)%15);
preservation(money);
break;
}
}
else
{
printf("重新");
}
}
}
void preservation(double money)//更新用戶信息
{
int i = 3;
int condiTime = 0;
double balance;
char key[19];//用於文件數據的轉移
rename("Account library.txt","Accountlibrary1.txt");
FILE *fp = fopen("Accountlibrary1.txt","r+");
FILE *fpp = fopen("Account library.txt","wt+");
while(fscanf(fp,"%s",key)!=EOF)
{
fprintf(fpp,"%s",key);
condiTime++;
if(condiTime%4!=0)
{
fprintf(fpp," ");
}
else
{
fprintf(fpp,"\n");
}
if(strcmp(user.vipPhoneNum,key)==0)
{
double balance;
fscanf(fp,"%lf",&balance);
balance = balance - money;
fprintf(fpp,"%lf\n",balance);
condiTime++;
}
}
fclose(fpp);
fclose(fp);
system("del Accountlibrary1.txt");
printf("賬戶信息已更新\n");
while(i>1)
{
printf("返回用戶界面中.......%ds",i--);
printf("\r");
Sleep(1000);
}
system("pause");
}
void changePass()//密碼修改
{
int i = 3;
int j;
char phone[11];
while(1)
{
printf("輸入綁定手機號:");
scanf("%s",phone);
if(strcmp(phone,user.vipPhoneNum)==0)
{
printf("已經發送驗證碼,請輸入:");
j = verCode();
while(1)
{
scanf("%d",&userPrint);
if(userPrint==j)
{
int condiTime = 0;
char key[19];//用於文件數據的轉移
printf("輸入新密碼:");
scanf("%s",user.vipPassword);
rename("Account library.txt","Accountlibrary1.txt");
FILE *fp = fopen("Accountlibrary1.txt","r+");
FILE *fpp = fopen("Account library.txt","wt+");
while(fscanf(fp,"%s",key)!=EOF)
{
condiTime++;
if(strcmp(key,user.vipAccount)!=0)
{
fprintf(fpp,"%s ",key);
}
else
{
fprintf(fpp,"%s ",key);
fprintf(fpp,"%s ",user.vipPassword);
fscanf(fp,"%s",key);
condiTime++;
}
if(condiTime%4==0)
{
fprintf(fpp,"\n");
}
}
fclose(fpp);
fclose(fp);
system("del Accountlibrary1.txt");
printf("成功修改密碼,請記住你的賬號(身份證號)和新密碼\n");
printf("》》》請求發送中》》》》》\n");
while(i>1)
{
printf(".......%d",i--);
printf("\r");
Sleep(1000);
}
system("pause");
vipMenu();
}
else
{
printf("驗證碼錯誤,重新輸入:");
}
}
}
else
{
printf("手機號輸入錯誤");
}
}
}
void timestar()//記錄開始時間
{
time_t now ;
struct tm *p ;
time(&now) ;
p = localtime(&now) ;
startime.hour = p->tm_hour;
startime.minute = p->tm_min;
startime.second = p->tm_sec;
}
void timeend()//記錄結束時間
{
time_t now ;
struct tm *p ;
time(&now) ;
p = localtime(&now) ;
temptime.hour = p->tm_hour;
temptime.minute = p->tm_min;
temptime.second = p->tm_sec;
}
int main()
{
Begin();
menu();
return 0;
}