超市管理系统
一、项目简介:
1.实现对后勤管理人员帐号的基本操作以及货物的增加,删除,查找,更新库存等操作。
2.通过代码实现对会员账号的创建,登录,修改,查找,以及消费记录的存储。
3.实现管理员对后勤人员及会员账户的管理。
4.实现基本的结账,会员积分功能
二、代码分块实现
一、以下是自己封装的一些工具函数
//工具函数
char get_cmd(char start,char end)
{
assert(start <= end);
puts("--------------------");
printf("请输入指令:");
for(;;)
{
char cmd = getch();
if(start <= cmd && cmd <= end)
{
printf("%c\n",cmd);
return cmd;
}
}
}
//清理字符串
char* get_str(char* str,size_t size)
{
size_t len = strlen(fgets(str,size,stdin));
if('\n' == str[len-1])
str[len-1] = '\0';
else
while('\n' != getchar());
return str;
}
//获取密码
char* get_passwd(char* passwd,size_t size)
{
int i=0;
while(i<size-1)
{
passwd[i]=getch();
if(127==passwd[i])
{
if(i>0)
{
i--;
printf("\b \b");
}
continue;
}
i++;
printf("*");
}
passwd[size-1]='\0';
printf("\n");
return passwd;
}
//显示
void show_msg(const char* msg,float sec)
{
printf("\033[01;32m%s\033[00m\n",msg);
usleep(sec*1000000);
}
//任意键继续
void anykey_continue(void)
{
stdin ->_IO_read_ptr = stdin->_IO_read_end;
puts("按任意键继续...");
getch();
}
二、创建数据结构
//VIP账户信息
typedef struct User
{
char name[20];//vip用户名
char phone[12];//手机号
char passwd[7];//密码
int pay_jifen;//积分
char level;
size_t cnt;
User cons[CONS];
}User;
//后勤管理人员
typedef struct User1
{
char name2[20];//后勤用户名
char phone2[12];//手机号
char passwd2[7];//密码
char lock;
}User1;
size_t cnt2;
User1 cons2[CONS2];
//收款记录
typedef struct Record
{
double record_money; //金额
char payment_phone[12]; //账号
}Record;
size_t cont;
Record con[CON];
//存数商品信息的结构体
typedef struct MarketGoods
{
char goods_id[30];//商品编号
char goods_name[30];//商品名称
double goods_price; //商品价格
int goods_amount;//商品总数目
int goods_remain;//商品剩余数目
char pay_id[30];//购买编号
} MarketGoods;
MarketGoods goods[COUNT];
int count=0;//全局变量,用于保存实际上有多少种商品
int pay_jifen = 0;//用于每次结帐计算积分
三、VIP模块
/*********vip管理模块*********/
//vip添加函数
void add(void)
{
if(cnt >= 100)
{
show_msg("VIP已满,添加失败!",0.7);
return;
}
printf("请输入账号:");
get_str(cons[cnt].name,sizeof(cons[cnt].name));
printf("请输入密码:");
get_passwd(cons[cnt].passwd,sizeof(cons[cnt].passwd));
//再次输入密码
char repasswd[7];
printf("请再次输入密码:");
get_passwd(repasswd,sizeof(repasswd));
//确认密码
if(strcmp(cons[cnt].passwd,repasswd))
{
show_msg("两次输入的密码不一致,添加失败!",0.75);
return;
}
//输入电话号
printf("请输入用于找回密码的手机号: ");
get_str(cons[cnt].phone,sizeof(cons[cnt].phone));
printf("剩余积分:0\n");
cons[cnt].level=0;
cnt++;
show_msg("添加成功",0.7);
anykey_continue();
}
//删除函数
void del(void)
{
char arr[12];
printf("请输入要删除的VIP账号:");
get_str(arr,sizeof(arr));
int index = phone_query(arr);
if(-1 == index)
{
show_msg("查询不到该账号,删除失败!",0.7);
return;
}
if(index < cnt-1)
{
cons[index] = cons[cnt-1];
}
cnt--;
show_msg("删除账号成功!",0.7);
return;
}
//修改函数
void modify(void)
{
char arr[12];
printf("请输入要修改的账号:");
get_str(arr,sizeof(arr));
int index = phone_query(arr);
if(-1 == index)
{
show_msg("查询不到该账号,修改失败!",0.7);
return;
}
char passwd[7];
printf("请输入旧密码:");
get_passwd(passwd,sizeof(passwd));
if(strcmp(passwd,cons[index].passwd))
{
show_msg("旧密码错误,无法修改密码!",0.75);
return ;
}
char repasswd[7];
printf("请输入新密码: ");
get_passwd(passwd,sizeof(repasswd));
printf("请确认密码:");
get_passwd(repasswd,sizeof(repasswd));
if( 0== strcmp(passwd,repasswd))
{
strcpy(cons[index].passwd,passwd);
show_msg("修改成功",0.75);
}
else
{
show_msg("修改失败",0.75);
}
}
//查询函数
void query(void)
{
char key[20];
printf("请输入要查询的关键字:");
get_str(key,sizeof(key));
for(int i=0; i<cnt; i++)
{
if(strstr(cons[i].phone,key) || strstr(cons[i].name,key))
{
printf("%s %s %c\n",cons[i].name,cons[i].phone,cons[i].level);
}
}
anykey_continue();
}
//遍历函数
void show(void)
{
if(0 >= cnt)
{
show_msg("目前没有VIP账户!",0.7);
return;
}
for(int i=0; i<cnt; i++)
{
printf("账号 手机号 密码 积分\n");
printf("%s %s %s %d\n",
cons[i].name,
cons[i].phone,
cons[i].passwd,
cons[i].pay_jifen);
}
anykey_continue();
}
三、后勤模块
/*********后勤函数*********/
//添加函数
void add_user(void)
{
if(cnt2 >= 100)
{
show_msg("后勤已满,添加失败!",0.7);
return;
}
printf("请输入账号:");
get_str(cons2[cnt2].name2,sizeof(cons2[cnt2].name2));
printf("请输入密码:");
get_passwd(cons2[cnt2].passwd2,sizeof(cons2[cnt2].passwd2));
//再次输入密码
char repasswd2[7];
printf("请再次输入密码:");
get_passwd(repasswd2,sizeof(repasswd2));
//确认密码
if(strcmp(cons2[cnt2].passwd2,repasswd2))
{
show_msg("两次输入的密码不一致,添加失败!",0.75);
return;
}
//输入电话号
printf("请输入用于找回密码的手机号: ");
get_str(cons2[cnt2].phone2,sizeof(cons2[cnt2].phone2));
cons2[cnt2].lock=0;
cnt2++;
show_msg("添加成功",0.7);
return ;
}
//删除函数
void del_user(void)
{
char arr2[12];
printf("请输入要删除的后勤账号:");
get_str(arr2,sizeof(arr2));
int index = phone_query2(arr2);
if(-1 == index)
{
show_msg("查询不到该账号,删除失败!",0.7);
return;
}
if(index < cnt2-1)
{
cons2[index] = cons2[cnt2-1];
}
cnt2--;
show_msg("删除账号成功!",0.7);
return;
}
//修改函数
void modify_user(void)
{
char arr2[12];
printf("请输入要修改的后勤账号:");
get_str(arr2,sizeof(arr2));
int index = phone_query2(arr2);
if(-1 == index)
{
show_msg("查询不到该账号,修改失败!",0.7);
return;
}
printf("请输入旧密码:");
char passwd2[7];
get_passwd(passwd2,sizeof(passwd2));
if(strcmp(passwd2,cons2[index].passwd2))
{
show_msg("旧密码错误,无法修改密码!",0.75);
return ;
}
char repasswd2[7];
printf("请输入新密码: ");
get_passwd(passwd2,sizeof(repasswd2));
printf("请确认密码:");
get_passwd(repasswd2,sizeof(repasswd2));
if( 0== strcmp(passwd2,repasswd2))
{
strcpy(cons2[index].passwd2,passwd2);
show_msg("修改成功",0.75);
}
else
{
show_msg("修改失败",0.75);
}
}
//查询函数
void query_user(void)
{
char key[20];
printf("请输入要查询的用户名:");
get_str(key,sizeof(key));
for(int i=0; i<cnt2; i++)
{
if(strstr(cons2[i].phone2,key) || strstr(cons2[i].name2,key))
{
printf("%s %s %c\n",cons2[i].name2,cons2[i].phone2,cons2[i].lock);
}
}
anykey_continue();
}
//遍历函数
void show_user(void)
{
if(0 >= cnt2)
{
show_msg("目前没有VIP账户!",0.7);
return;
}
for(int i=0; i<cnt2; i++)
{
printf("账号 手机号 密码\n");
printf("%s %s %s\n",
cons2[i].name2,
cons2[i].phone2,
cons2[i].passwd2);
}
anykey_continue();
}
四、货物模块
/**********货物管理**********/
//添加商品
void add_com(void)
{
char flag[10];
do
{
printf("请输入你的商品信息\n");//录入商品的信息
printf("商品编号:");
scanf("%s",goods[count].goods_id);
printf("商品名字:");
scanf("%s",goods[count].goods_name);
printf("商品价格:");
scanf("%lf",&goods[count].goods_price);
printf("商品总数目:");
scanf("%d",&goods[count].goods_amount);
printf("商品剩余数目:");
scanf("%d",&goods[count].goods_remain);
printf("是否继续输入数据y是n否:");//是否还想继续输入数据
scanf("%s",flag);
count++;//商品种类加1
}while(strcmp(flag,"y")==0||strcmp(flag,"Y")==0);
anykey_continue();
}
//删除商品
void del_com(void)
{
int i,j;
char ch[20],com_name[20];
printf("输入删除的商品名: ");//根据商品的名称来删除数据
scanf("%s",com_name);
for(i=0;i<count;i++)
{
if(strcmp(com_name,goods[i].goods_name)==0)
break;//找到,即跳出循环
}
for(j=i;j<count-1;j++)
{
goods[j]=goods[j+1];
}
printf("\t 你已经删除 %s\n",com_name);
count--;
anykey_continue();
}
//修改商品信息
void change_com(void)
{
int i;
char ch[20],com_id[20];
printf("\n你是否确定要修改商品信息 y/n: ");//根据商品的id来修改据
scanf("%s",ch);
if(strcmp(ch,"y")!=0 && strcmp(ch,"Y")!=0)
{
return;
}
printf("\n请输入你要修改的商品id:");
scanf("%s",com_id);
for(i=0;i<count;i++)
{
if(strcmp(goods[i].goods_id,com_id)==0)
{
printf("\n是否要修改商品名(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
{
printf("\n商品名:");
scanf("%s",goods[i].goods_name);
}
printf("\n是否要修改商品价格(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
{
printf("\n价格:");
scanf("%lf",&goods[i].goods_price);
}
printf("\n是否修改商品总数量(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
{
printf("\n总数量:");
scanf("%d",&goods[i].goods_amount);
}
printf("\n是否修改商品的剩余数量(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
{
printf("\n剩余数量:");
scanf("%d" ,&goods[i].goods_remain);
}
}
}
anykey_continue();
}
//查找商品
void search_com(void)
{
int i;
char com_name[20];
printf("\n请输入要查找的商品名:"); //根据商品的名称来查找数据
scanf("%s",com_name);
for(i=0;i<count;i++)
{
if(strcmp(goods[i].goods_name,com_name)==0)
{
printf("编号 名称 价格 总数目 剩余数目\n");
printf("%s %s %lf %8d %10d \n",
goods[i].goods_id,
goods[i].goods_name,
goods[i].goods_price,
goods[i].goods_amount,
goods[i].goods_remain);
}
}
anykey_continue();
}
//遍历商品
void show_com(void)
{
int i;
printf("编号 名称 价格 总数目 剩余数目\n");
for(i=0;i<count;i++)
{
printf("%s %s %lf %8d %10d \n",
goods[i].goods_id,
goods[i].goods_name,
goods[i].goods_price,
goods[i].goods_amount,
goods[i].goods_remain);
}
anykey_continue();
}
五、做交互菜单
//后勤三级菜单
void log_menu(void)
{
for(;;)
{
// 清理屏幕
system("clear");
puts("1、添加后勤用户");
puts("2、删除后勤用户");
puts("3、修改后勤信息");
puts("4、查看后勤用户");
puts("5、遍历后勤用户");
puts("6、返回上一级");
// 获取指令并调用功能函数
switch(get_cmd('1','6'))
{
case '1':add_user();break;
case '2':del_user();break;
case '3':modify_user();break;
case '4':query_user();break;
case '5':show_user();break;
case '6':return;
}
}
}
//vip三级菜单
void vip_menu(void)
{
for(;;)
{
// 清理屏幕
system("clear");
puts("1、添加VIP账号");
puts("2、删除VIP账号");
puts("3、修改VIP密码");
puts("4、查找VIP账号");
puts("5、遍历VIP账号");
puts("6、返回上一级");
// 获取指令并调用功能函数
switch(get_cmd('1','6'))
{
case '1': add(); break;
case '2': del(); break;
case '3': modify(); break;
case '4': query();break;
case '5': show(); break;
case '6': return;
}
}
}
/***********收款**********/
//修改收款账户
void change_coll(void)
{
char cmd[12];
printf("请输入旧收款帐号:");
scanf("%s",cmd);
if(0 == strcmp(shou_kuan_id,cmd))
{
printf("请输入新收款账户:");
scanf("%s",shou_kuan_id);
return;
}
printf("输入的帐号有误,请重新输入!");
anykey_continue();
}
//管理员二级菜单
void man_menu(void)
{
for(;;)
{
system("clear");
puts("1、VIP 管理");
puts("2、后勤管理");
puts("3、收款账户管理");
puts("4、返回上一级");
switch(get_cmd('1','4'))
{
case '1': vip_menu();break;
case '2': log_menu();break;
case '3': change_coll();break;
case '4': return;
}
}
}
//后勤登录后二级菜单
void logistics_menu(void)
{
for(;;)
{
// 清理屏幕
system("clear");
puts("***欢迎使用后勤管理系统***");
puts("1、录入商品信息");
puts("2、下架商品");
puts("3、修改商品信息");
puts("4、查找商品");
puts("5、遍历商品");
puts("6、退出系统");
switch(get_cmd('1','6'))
{
case '1': add_com() ;break;
case '2': del_com() ;break;
case '3': change_com() ;break;
case '4': search_com() ;break;
case '5': show_com() ;break;
case '6': return;
}
}
}
六、结账模块
/*********结帐**********/
//会员结帐
void vipshop_car(void)
{
char pay_id[30];
double pay_money;
int pay_number;
char flag[20];
char payment_phone[12];
do{
printf("请输入商品id:");
scanf("%s",pay_id);
for(int i=0;i<count;i++)
{
if(strcmp(goods[i].goods_id,pay_id)==0)
{
printf("请输入购买的商品数量:");
scanf("%d",&pay_number);
if(goods[i].goods_remain<pay_number)
{
printf("库存数量不足,无法购买\n");
printf("请重新输入:");
return;
}
else
{
pay_money+=pay_number*goods[i].goods_price;//累计金额
goods[i].goods_remain-=pay_number;
}
}
}
printf("是否继续购买商品,y是n否:");//是否还想继续输入数据
scanf("%s",flag);
}while(strcmp(flag,"y")==0||strcmp(flag,"Y")==0);
pay_jifen += pay_money;
printf("花费:%lf,增加的积分为 :%d\n",pay_money,pay_jifen);
printf("请输入扣款账户:");
scanf("%s",con[cont].payment_phone);
con[cont].record_money = pay_money;
cont++;
anykey_continue();
return;
}
//非vip结帐
int novipshop_car()
{
char pay_id[30],ch[20];
double pay_money;
int pay_number;
char flag[20];
char payment_phone[12];
do{
printf("请输入商品id:");
scanf("%s",pay_id);
for(int i=0;i<count;i++)
{
if(strcmp(goods[i].goods_id,pay_id)==0)
{
printf("请输入购买的商品数量:");
scanf("%d",&pay_number);
if(pay_number<=0)
{
return 0;
}
if(goods[i].goods_remain<pay_number)
{
printf("库存数量不足,无法购买\n");
printf("请重新输入:");
anykey_continue();
return 0;
}
else
{
pay_money+=pay_number*goods[i].goods_price;//累计金额
goods[i].goods_remain-=pay_number;
}
}
}
printf("是否继续购买商品,y是n否:");//是否还想继续输入数据
scanf("%s",flag);
}while(strcmp(flag,"y")==0||strcmp(flag,"Y")==0);
printf("花费:%lf\n",pay_money);
printf("请输入扣款账户:");
scanf("%s",con[cont].payment_phone);
con[cont].record_money = pay_money;
cont++;
anykey_continue();
}
//付款记录
void show_record(void)
{
for(int i=0;i<cont;i++)
{
printf("%s 向 %s 付%f 元\n",
con[i].payment_phone,
shou_kuan_id,
con[i].record_money);
}
anykey_continue();
}
完整代码
#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdbool.h>
#define COUNT 1000
#define CONS 100
#define CONS2 100
#define CON 1000
#define CNS 100
typedef struct User
{
char name[20];//vip用户名
char phone[12];//手机号
char passwd[7];//密码
int pay_jifen;//积分
char level;
}User;
typedef struct User1
{
char name2[20];//后勤用户名
char phone2[12];//手机号
char passwd2[7];//密码
char lock;
}User1;
//vip
size_t cnt;
User cons[CONS];
//后勤
size_t cnt2;
User1 cons2[CONS2];
//收款记录
typedef struct Record
{
double record_money;
char payment_phone[12];
}Record;
//收款记录
size_t cont;
Record con[CON];
char shou_kuan_id[12] = "12345678910";//收款账户
typedef struct MarketGoods//存数商品信息的结构体
{
char goods_id[30];//商品编号
char goods_name[30];//商品名称
double goods_price; //商品价格
int goods_amount;//商品总数目
int goods_remain;//商品剩余数目
char pay_id[30];//购买编号
} MarketGoods;
MarketGoods goods[COUNT];
int count=0;//全局变量,用于保存实际上有多少种商品
int pay_jifen = 0;//用于每次结帐计算积分
//工具函数
char get_cmd(char start,char end)
{
assert(start <= end);
puts("--------------------");
printf("请输入指令:");
for(;;)
{
char cmd = getch();
if(start <= cmd && cmd <= end)
{
printf("%c\n",cmd);
return cmd;
}
}
}
char* get_str(char* str,size_t size)
{
size_t len = strlen(fgets(str,size,stdin));
if('\n' == str[len-1])
str[len-1] = '\0';
else
while('\n' != getchar());
return str;
}
//获取
char* get_passwd(char* passwd,size_t size)
{
int i=0;
while(i<size-1)
{
passwd[i]=getch();
if(127==passwd[i])
{
if(i>0)
{
i--;
printf("\b \b");
}
continue;
}
i++;
printf("*");
}
passwd[size-1]='\0';
printf("\n");
return passwd;
}
//查询vip
int phone_query(char* str)
{
for(int i=0; i<cnt; i++)
{
if(0 == strcmp(cons[i].name,str))
return i;
}
return -1;
}
//查询后勤
int phone_query2(char* str)
{
for(int i=0; i<cnt2; i++)
{
if(0 == strcmp(cons2[i].name2,str))
return i;
}
return -1;
}
//显示
void show_msg(const char* msg,float sec)
{
printf("\033[01;32m%s\033[00m\n",msg);
usleep(sec*1000000);
}
void anykey_continue(void)
{
stdin ->_IO_read_ptr = stdin->_IO_read_end;
puts("按任意键继续...");
getch();
}
//收款记录保存
int save_record(size_t size,const char* path)
{
assert(0!=size && NULL!=path);
FILE*wfp =fopen(path,"w");
if(NULL == wfp)
{
printf("无法打开文件,无法保存数据!\n");
return 0;
}
int count=0;
while(count<size)
{
fprintf(wfp,"%s %lf\n",
con[count].payment_phone,
con[count].record_money);
count++;
}
fclose(wfp);
return count;
}
//收款记录加载
int load_reccord(size_t len,const char* path)
{
assert(0!=len && NULL!=path);
FILE* rfp = fopen(path,"r");
if(NULL == rfp)
{
printf("无法打开文件,加载数据失败!\n");
return 0;
}
int count=0;
while(count<len)
{
int ret =fscanf(rfp,"%s %lf\n",
con[count].payment_phone,
&con[count].record_money);
if(ret != 2)
{
break;
}
count++;
}
fclose(rfp);
return count;
}
//收款账户通用的文本保存数据
int save_coll(size_t size,const char* path)
{
assert(0!=size && NULL!=path);
FILE*wfp =fopen(path,"w");
if(NULL == wfp)
{
printf("无法打开文件,无法保存数据!\n");
return 0;
}
fprintf(wfp,"%s\n",shou_kuan_id);
fclose(wfp);
}
//收款账户通用的文本加载数据
int load_coll(size_t len,const char* path)
{
assert(0!=len && NULL!=path);
FILE* rfp = fopen(path,"r");
if(NULL == rfp)
{
printf("无法打开文件,加载数据失败!\n");
return 0;
}
fscanf(rfp,"%s\n",shou_kuan_id);
fclose(rfp);
}
//后勤通用的文本保存数据
int save_data2(size_t size,const char* path)
{
assert(0!=size && NULL!=path);
FILE*wfp =fopen(path,"w");
if(NULL == wfp)
{
printf("无法打开文件,无法保存数据!\n");
return 0;
}
int count=0;
while(count<size)
{
fprintf(wfp,"%s %s %s\n",
cons2[count].name2,
cons2[count].phone2,
cons2[count].passwd2);
count++;
}
fclose(wfp);
return count;
}
//后勤通用的文本加载数据
int load_data2(size_t len,const char* path)
{
assert(0!=len && NULL!=path);
FILE* rfp = fopen(path,"r");
if(NULL == rfp)
{
printf("无法打开文件,加载数据失败!\n");
return 0;
}
int count=0;
while(count<len)
{
int ret =fscanf(rfp,"%s %s %s\n",
cons2[count].name2,
cons2[count].phone2,
cons2[count].passwd2);
if(ret != 3)
{
break;
}
count++;
}
fclose(rfp);
return count;
}
// 货物通用的文本格式保存数据
int save_data0(size_t size,const char* path)
{
assert(0!=size && NULL!=path);
FILE* wfp = fopen(path,"w");
if(NULL == wfp)
{
printf("无法打开文件,无法保存数据!\n");
return 0;
}
int cnt = 0;
while( cnt < size)
{
fprintf(wfp,"%s %s %lf %8d %10d\n",
goods[cnt].goods_id,
goods[cnt].goods_name,
goods[cnt].goods_price,
goods[cnt].goods_amount,
goods[cnt].goods_remain);
cnt++;
}
fclose(wfp);
return cnt;
}
// 货物通用的文本格式加载数据
int load_data0(size_t len,const char* path)
{
assert(0!=len && NULL!=path);
FILE* rfp = fopen(path,"r");
if(NULL == rfp)
{
printf("无法打开文件,加载数据失败!\n");
return 0;
}
int cnt=0;
while(cnt < len)
{
int ret = fscanf(rfp,"%s %s %lf %8d %10d\n",
goods[cnt].goods_id,
goods[cnt].goods_name,
&goods[cnt].goods_price,
&goods[cnt].goods_amount,
&goods[cnt].goods_remain);
if(ret != 5)
{
break;
}
cnt++;
}
fclose(rfp);
return cnt;
}
//vip通用的文本保存数据
int save_data(size_t size,const char* path)
{
assert(0!=size && NULL!=path);
FILE*wfp =fopen(path,"w");
if(NULL == wfp)
{
printf("无法打开文件,无法保存数据!\n");
return 0;
}
int count=0;
while(count<size)
{
fprintf(wfp,"%s %s %s %d\n",
cons[count].name,
cons[count].phone,
cons[count].passwd,
cons[count].pay_jifen);
count++;
}
fclose(wfp);
return count;
}
//vip通用的文本加载数据
int load_data(size_t len,const char* path)
{
assert(0!=len && NULL!=path);
FILE* rfp = fopen(path,"r");
if(NULL == rfp)
{
printf("无法打开文件,加载数据失败!\n");
return 0;
}
int count=0;
while(count<len)
{
int ret =fscanf(rfp,"%s %s %s %d\n",
cons[count].name,
cons[count].phone,
cons[count].passwd,
&cons[count].pay_jifen);
if(ret != 4)
{
break;
}
count++;
}
fclose(rfp);
return count;
}
/*********vip管理模块*********/
//vip添加函数
void add(void)
{
if(cnt >= 100)
{
show_msg("VIP已满,添加失败!",0.7);
return;
}
printf("请输入账号:");
get_str(cons[cnt].name,sizeof(cons[cnt].name));
printf("请输入密码:");
get_passwd(cons[cnt].passwd,sizeof(cons[cnt].passwd));
//再次输入密码
char repasswd[7];
printf("请再次输入密码:");
get_passwd(repasswd,sizeof(repasswd));
//确认密码
if(strcmp(cons[cnt].passwd,repasswd))
{
show_msg("两次输入的密码不一致,添加失败!",0.75);
return;
}
//输入电话号
printf("请输入用于找回密码的手机号: ");
get_str(cons[cnt].phone,sizeof(cons[cnt].phone));
printf("剩余积分:0\n");
cons[cnt].level=0;
cnt++;
show_msg("添加成功",0.7);
anykey_continue();
}
//删除函数
void del(void)
{
char arr[12];
printf("请输入要删除的VIP账号:");
get_str(arr,sizeof(arr));
int index = phone_query(arr);
if(-1 == index)
{
show_msg("查询不到该账号,删除失败!",0.7);
return;
}
if(index < cnt-1)
{
cons[index] = cons[cnt-1];
}
cnt--;
show_msg("删除账号成功!",0.7);
return;
}
//修改函数
void modify(void)
{
char arr[12];
printf("请输入要修改的账号:");
get_str(arr,sizeof(arr));
int index = phone_query(arr);
if(-1 == index)
{
show_msg("查询不到该账号,修改失败!",0.7);
return;
}
char passwd[7];
printf("请输入旧密码:");
get_passwd(passwd,sizeof(passwd));
if(strcmp(passwd,cons[index].passwd))
{
show_msg("旧密码错误,无法修改密码!",0.75);
return ;
}
char repasswd[7];
printf("请输入新密码: ");
get_passwd(passwd,sizeof(repasswd));
printf("请确认密码:");
get_passwd(repasswd,sizeof(repasswd));
if( 0== strcmp(passwd,repasswd))
{
strcpy(cons[index].passwd,passwd);
show_msg("修改成功",0.75);
}
else
{
show_msg("修改失败",0.75);
}
}
//查询函数
void query(void)
{
char key[20];
printf("请输入要查询的关键字:");
get_str(key,sizeof(key));
for(int i=0; i<cnt; i++)
{
if(strstr(cons[i].phone,key) || strstr(cons[i].name,key))
{
printf("%s %s %c\n",cons[i].name,cons[i].phone,cons[i].level);
}
}
anykey_continue();
}
//遍历函数
void show(void)
{
if(0 >= cnt)
{
show_msg("目前没有VIP账户!",0.7);
return;
}
for(int i=0; i<cnt; i++)
{
printf("账号 手机号 密码 积分\n");
printf("%s %s %s %d\n",
cons[i].name,
cons[i].phone,
cons[i].passwd,
cons[i].pay_jifen);
}
anykey_continue();
}
/*********后勤函数*********/
//添加函数
void add_user(void)
{
if(cnt2 >= 100)
{
show_msg("后勤已满,添加失败!",0.7);
return;
}
printf("请输入账号:");
get_str(cons2[cnt2].name2,sizeof(cons2[cnt2].name2));
printf("请输入密码:");
get_passwd(cons2[cnt2].passwd2,sizeof(cons2[cnt2].passwd2));
//再次输入密码
char repasswd2[7];
printf("请再次输入密码:");
get_passwd(repasswd2,sizeof(repasswd2));
//确认密码
if(strcmp(cons2[cnt2].passwd2,repasswd2))
{
show_msg("两次输入的密码不一致,添加失败!",0.75);
return;
}
//输入电话号
printf("请输入用于找回密码的手机号: ");
get_str(cons2[cnt2].phone2,sizeof(cons2[cnt2].phone2));
cons2[cnt2].lock=0;
cnt2++;
show_msg("添加成功",0.7);
return ;
}
//删除函数
void del_user(void)
{
char arr2[12];
printf("请输入要删除的后勤账号:");
get_str(arr2,sizeof(arr2));
int index = phone_query2(arr2);
if(-1 == index)
{
show_msg("查询不到该账号,删除失败!",0.7);
return;
}
if(index < cnt2-1)
{
cons2[index] = cons2[cnt2-1];
}
cnt2--;
show_msg("删除账号成功!",0.7);
return;
}
//修改函数
void modify_user(void)
{
char arr2[12];
printf("请输入要修改的后勤账号:");
get_str(arr2,sizeof(arr2));
int index = phone_query2(arr2);
if(-1 == index)
{
show_msg("查询不到该账号,修改失败!",0.7);
return;
}
printf("请输入旧密码:");
char passwd2[7];
get_passwd(passwd2,sizeof(passwd2));
if(strcmp(passwd2,cons2[index].passwd2))
{
show_msg("旧密码错误,无法修改密码!",0.75);
return ;
}
char repasswd2[7];
printf("请输入新密码: ");
get_passwd(passwd2,sizeof(repasswd2));
printf("请确认密码:");
get_passwd(repasswd2,sizeof(repasswd2));
if( 0== strcmp(passwd2,repasswd2))
{
strcpy(cons2[index].passwd2,passwd2);
show_msg("修改成功",0.75);
}
else
{
show_msg("修改失败",0.75);
}
}
//查询函数
void query_user(void)
{
char key[20];
printf("请输入要查询的用户名:");
get_str(key,sizeof(key));
for(int i=0; i<cnt2; i++)
{
if(strstr(cons2[i].phone2,key) || strstr(cons2[i].name2,key))
{
printf("%s %s %c\n",cons2[i].name2,cons2[i].phone2,cons2[i].lock);
}
}
anykey_continue();
}
//遍历函数
void show_user(void)
{
if(0 >= cnt2)
{
show_msg("目前没有VIP账户!",0.7);
return;
}
for(int i=0; i<cnt2; i++)
{
printf("账号 手机号 密码\n");
printf("%s %s %s\n",
cons2[i].name2,
cons2[i].phone2,
cons2[i].passwd2);
}
anykey_continue();
}
/**********货物管理**********/
//添加商品
void add_com(void)
{
char flag[10];
do
{
printf("请输入你的商品信息\n");//录入商品的信息
printf("商品编号:");
scanf("%s",goods[count].goods_id);
printf("商品名字:");
scanf("%s",goods[count].goods_name);
printf("商品价格:");
scanf("%lf",&goods[count].goods_price);
printf("商品总数目:");
scanf("%d",&goods[count].goods_amount);
printf("商品剩余数目:");
scanf("%d",&goods[count].goods_remain);
printf("是否继续输入数据y是n否:");//是否还想继续输入数据
scanf("%s",flag);
count++;//商品种类加1
}while(strcmp(flag,"y")==0||strcmp(flag,"Y")==0);
anykey_continue();
}
//删除商品
void del_com(void)
{
int i,j;
char ch[20],com_name[20];
printf("输入删除的商品名: ");//根据商品的名称来删除数据
scanf("%s",com_name);
for(i=0;i<count;i++)
{
if(strcmp(com_name,goods[i].goods_name)==0)
break;//找到,即跳出循环
}
for(j=i;j<count-1;j++)
{
goods[j]=goods[j+1];
}
printf("\t 你已经删除 %s\n",com_name);
count--;
anykey_continue();
}
//修改商品信息
void change_com(void)
{
int i;
char ch[20],com_id[20];
printf("\n你是否确定要修改商品信息 y/n: ");//根据商品的id来修改据
scanf("%s",ch);
if(strcmp(ch,"y")!=0 && strcmp(ch,"Y")!=0)
{
return;
}
printf("\n请输入你要修改的商品id:");
scanf("%s",com_id);
for(i=0;i<count;i++)
{
if(strcmp(goods[i].goods_id,com_id)==0)
{
printf("\n是否要修改商品名(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
{
printf("\n商品名:");
scanf("%s",goods[i].goods_name);
}
printf("\n是否要修改商品价格(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
{
printf("\n价格:");
scanf("%lf",&goods[i].goods_price);
}
printf("\n是否修改商品总数量(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
{
printf("\n总数量:");
scanf("%d",&goods[i].goods_amount);
}
printf("\n是否修改商品的剩余数量(y/n): ");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
{
printf("\n剩余数量:");
scanf("%d" ,&goods[i].goods_remain);
}
}
}
anykey_continue();
}
//查找商品
void search_com(void)
{
int i;
char com_name[20];
printf("\n请输入要查找的商品名:"); //根据商品的名称来查找数据
scanf("%s",com_name);
for(i=0;i<count;i++)
{
if(strcmp(goods[i].goods_name,com_name)==0)
{
printf("编号 名称 价格 总数目 剩余数目\n");
printf("%s %s %lf %8d %10d \n",
goods[i].goods_id,
goods[i].goods_name,
goods[i].goods_price,
goods[i].goods_amount,
goods[i].goods_remain);
}
}
anykey_continue();
}
//遍历商品
void show_com(void)
{
int i;
printf("编号 名称 价格 总数目 剩余数目\n");
for(i=0;i<count;i++)
{
printf("%s %s %lf %8d %10d \n",
goods[i].goods_id,
goods[i].goods_name,
goods[i].goods_price,
goods[i].goods_amount,
goods[i].goods_remain);
}
anykey_continue();
}
//后勤三级菜单
void log_menu(void)
{
for(;;)
{
// 清理屏幕
system("clear");
puts("1、添加后勤用户");
puts("2、删除后勤用户");
puts("3、修改后勤信息");
puts("4、查看后勤用户");
puts("5、遍历后勤用户");
puts("6、返回上一级");
// 获取指令并调用功能函数
switch(get_cmd('1','6'))
{
case '1':add_user();break;
case '2':del_user();break;
case '3':modify_user();break;
case '4':query_user();break;
case '5':show_user();break;
case '6':return;
}
}
}
//vip三级菜单
void vip_menu(void)
{
for(;;)
{
// 清理屏幕
system("clear");
puts("1、添加VIP账号");
puts("2、删除VIP账号");
puts("3、修改VIP密码");
puts("4、查找VIP账号");
puts("5、遍历VIP账号");
puts("6、返回上一级");
// 获取指令并调用功能函数
switch(get_cmd('1','6'))
{
case '1': add(); break;
case '2': del(); break;
case '3': modify(); break;
case '4': query();break;
case '5': show(); break;
case '6': return;
}
}
}
/***********收款**********/
//修改收款账户
void change_coll(void)
{
char cmd[12];
printf("请输入旧收款帐号:");
scanf("%s",cmd);
if(0 == strcmp(shou_kuan_id,cmd))
{
printf("请输入新收款账户:");
scanf("%s",shou_kuan_id);
return;
}
printf("输入的帐号有误,请重新输入!");
anykey_continue();
}
//管理员二级菜单
void man_menu(void)
{
for(;;)
{
system("clear");
puts("1、VIP 管理");
puts("2、后勤管理");
puts("3、收款账户管理");
puts("4、返回上一级");
switch(get_cmd('1','4'))
{
case '1': vip_menu();break;
case '2': log_menu();break;
case '3': change_coll();break;
case '4': return;
}
}
}
//后勤登录后二级菜单
void logistics_menu(void)
{
for(;;)
{
// 清理屏幕
system("clear");
puts("***欢迎使用后勤管理系统***");
puts("1、录入商品信息");
puts("2、下架商品");
puts("3、修改商品信息");
puts("4、查找商品");
puts("5、遍历商品");
puts("6、退出系统");
switch(get_cmd('1','6'))
{
case '1': add_com() ;break;
case '2': del_com() ;break;
case '3': change_com() ;break;
case '4': search_com() ;break;
case '5': show_com() ;break;
case '6': return;
}
}
}
/*********结帐**********/
//会员结帐
void vipshop_car(void)
{
char pay_id[30];
double pay_money;
int pay_number;
char flag[20];
char payment_phone[12];
do{
printf("请输入商品id:");
scanf("%s",pay_id);
for(int i=0;i<count;i++)
{
if(strcmp(goods[i].goods_id,pay_id)==0)
{
printf("请输入购买的商品数量:");
scanf("%d",&pay_number);
if(goods[i].goods_remain<pay_number)
{
printf("库存数量不足,无法购买\n");
printf("请重新输入:");
return;
}
else
{
pay_money+=pay_number*goods[i].goods_price;//累计金额
goods[i].goods_remain-=pay_number;
}
}
}
printf("是否继续购买商品,y是n否:");//是否还想继续输入数据
scanf("%s",flag);
}while(strcmp(flag,"y")==0||strcmp(flag,"Y")==0);
pay_jifen += pay_money;
printf("花费:%lf,增加的积分为 :%d\n",pay_money,pay_jifen);
printf("请输入扣款账户:");
scanf("%s",con[cont].payment_phone);
con[cont].record_money = pay_money;
cont++;
anykey_continue();
return;
}
//非vip结帐
int novipshop_car()
{
char pay_id[30],ch[20];
double pay_money;
int pay_number;
char flag[20];
char payment_phone[12];
do{
printf("请输入商品id:");
scanf("%s",pay_id);
for(int i=0;i<count;i++)
{
if(strcmp(goods[i].goods_id,pay_id)==0)
{
printf("请输入购买的商品数量:");
scanf("%d",&pay_number);
if(pay_number<=0)
{
return 0;
}
if(goods[i].goods_remain<pay_number)
{
printf("库存数量不足,无法购买\n");
printf("请重新输入:");
anykey_continue();
return 0;
}
else
{
pay_money+=pay_number*goods[i].goods_price;//累计金额
goods[i].goods_remain-=pay_number;
}
}
}
printf("是否继续购买商品,y是n否:");//是否还想继续输入数据
scanf("%s",flag);
}while(strcmp(flag,"y")==0||strcmp(flag,"Y")==0);
printf("花费:%lf\n",pay_money);
printf("请输入扣款账户:");
scanf("%s",con[cont].payment_phone);
con[cont].record_money = pay_money;
cont++;
anykey_continue();
}
//付款记录
void show_record(void)
{
for(int i=0;i<cont;i++)
{
printf("%s 向 %s 付%f 元\n",
con[i].payment_phone,
shou_kuan_id,
con[i].record_money);
}
anykey_continue();
}
int login_index = -1;
//vip登录函数
void login_vip(void)
{
// 输入用户名
char name[20];
printf("请输入用户名:");
get_str(name,sizeof(name));
// 查询用户是否存在
int index = phone_query(name);
if(-1 == index)
{
show_msg("该用户不存在,登录失败!",0.75);
return;
}
// 判断是否被锁
if(cons[index].level >= 3)
{
show_msg("该用户已经被锁定,请联系管理员!",0.75);
return;
}
// 输入密码
char passwd[7];
printf("请输入密码:");
get_passwd(passwd,sizeof(passwd));
// 比较密码
if(0 == strcmp(cons[index].passwd,passwd))
{
// 初始化锁定标志
cons[index].level = 0;
// 记录登录成功的用户下标
login_index = index;
// 登录成功,进入子菜单
vipshop_car();
cons[index].pay_jifen+=pay_jifen;
return;
}
// 锁定标志+1
switch(++cons[index].level)
{
case 1: show_msg("密码错误,你还有2次机会!",0.75); break;
case 2: show_msg("密码错误,你还有1次机会!",0.75); break;
case 3: show_msg("三次密码错误,账号被锁定,请联系管理员!",0.75); break;
}
}
//结帐菜单
void jiezhang_menu(void)
{
for(;;)
{
system("clear");
puts("1、会员结帐");
puts("2、非会员结帐");
puts("3、退出结帐");
switch(get_cmd('1','3'))
{
case '1': login_vip();break;
case '2': novipshop_car();break;
case '3': return;
}
}
}
//一级菜单
void first_menu(void)
{
system("clear");
puts("1、管理员操作");
puts("2、后勤管理");
puts("3、结帐");
puts("4、收款记录");
puts("5、退出系统");
}
//后勤登录函数
void login_houqin(void)
{
// 输入用户名
char name[20];
printf("请输入用户名:");
get_str(name,sizeof(name));
// 查询用户是否存在
int index = phone_query2(name);
if(-1 == index)
{
show_msg("该用户不存在,登录失败!",0.75);
return;
}
// 判断是否被锁
if(cons2[index].lock >= 3)
{
show_msg("该用户已经被锁定,请联系管理员!",0.75);
return;
}
// 输入密码
char passwd[7];
printf("请输入密码:");
get_passwd(passwd,sizeof(passwd));
// 比较密码
if(0 == strcmp(cons2[index].passwd2,passwd))
{
// 初始化锁定标志
cons2[index].lock = 0;
// 记录登录成功的用户下标
login_index = index;
// 登录成功,进入子菜单
logistics_menu();
return;
}
// 锁定标志+1
switch(++cons2[index].lock)
{
case 1: show_msg("密码错误,你还有2次机会!",0.75); break;
case 2: show_msg("密码错误,你还有1次机会!",0.75); break;
case 3: show_msg("三次密码错误,账号被锁定,请联系管理员!",0.75); break;
}
}
int main(int argc,const char* argv[])
{
int cns = load_coll(1,"shoukuan.txt");
cnt2 = load_data2(CONS2,"houqin.txt");
cnt = load_data(CONS,"vip.txt");
count = load_data0(COUNT,"kucun.txt");
for(;;)
{
// 显示功能菜单
first_menu();
// 获取指令并调用功能函数
switch(get_cmd('1','5'))
{
case '1': man_menu(); break;
case '2': login_houqin();break;
case '3': jiezhang_menu();break;
case '4': show_record();break;
case '5':
save_coll(1,"shoukuan.txt");
save_data2(cnt2,"houqin.txt");
save_data(cnt,"vip.txt");
save_data0(count,"kucun.txt");
return 0;
}
}
}