简单的超市会员管理系统
随着社会的进步,人们生活水平的提高,各种各样的会员应运而生。各种便民服务的地方为了提高服务粘性,留住顾客往往采用会员制,例如便利店、健身房,生鲜超市、美容美发店等等不一而足。会员制一般根据会员们的充值金额,划分等级,享受不同的折扣;也可以根据消费频次、消费额度等进行优惠,或者设立一个月的某日为会员日,享受优惠。现在我们简化一下,完成一个具有基本功能的会员管理系统,其中至少包含以下功能:
会员相关信息采用文件存储,文件名为:member.txt;
当会员充值或消费时,更新对应的文件信息,并在屏幕显示当前余额;
根据充值金额,划分3个档次(普通会员、中级会员和高级会员),进行折扣处理,比如九折、八折、七折等等(具体要求团队自定);
当然,也可以扩展功能,使之更接近实用的系统。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "windows.h"
#define L 50
#define G 10
char adminname[5] = "admin"; //管理员账号
char adminpassword[16] = "123"; //管理员账户密码,可以存储16位密码
typedef struct node
{
int num; //账户编号
char name[L]; //账户姓名
char password[L]; //账户密码
long int money; //话费金额
char grade[G]; //会员等级
struct node *next; //建立一个next结点
} node;
node *u_head; //用户头指针
node *u_tail; //用户尾指针---方便插入
node *userGR; //登录时,指向用户
//改变字体颜色函数
void changecolor(int x); //通过不同颜色的提示起到优化程序界面和提醒用户注意的功能
//文件函数
node *Rcreatelink(); //将输入信息复制到链表中
void save(); //将信息保存至文件中
//登陆函数
int search(char name[L], char password[L]); //搜索用户功能函数
int login(); //登录功能函数
void boundar(); //
//管理员函数
void looklook(); //管理员查看账户函数
void increase(); //管理员添加用户函数
void revise(); //管理员修改会员信息函数
void adminmenu(); //管理员功能菜单
void admin(); //管理员
//用户函数
void user(); //用户
void usermenu(); //用户功能菜单
void createvip(node *q); //通过金额自动生成会员等级函数
void createvip(node *q)
{
char grade[3][50] = {"普通会员", "中级会员", "高级会员"}; //定义三个会员等级
int num;
num = q->money / 500;
if (num <= 3) //消费小于1500元为普通会员,可以获得95折优惠
strcpy(q->grade, grade[0]); //将定义的等级复制到链表中
else if (num <= 5) //消费大于1500小于2500为中级会员,可以获得9折优惠
strcpy(q->grade, grade[1]);
else //消费大于2500为高级会员,可以获得8折优惠
strcpy(q->grade, grade[2]);
}
node *Rcreatelink()
{
int num, money; //会员编号,消费金额
char name[L], password[L], grade[G]; //用户名,用户密码,会员用户等级
node *head = (node *)malloc(sizeof(node)); //对head结点分配内存空间
node *p; //建立结点p
FILE *fp = fopen("member.txt", "r"); //读取存储用户的文件
p = head;
if (fp == NULL) //如果文件指针指向为空,输出打开文件失败
{
changecolor(4);
printf("打开文件失败!\n");
}
else
{
while (fscanf(fp, "%d %s %s %d %s", &num, name, password, &money, grade) != EOF) //读取文件的内容,其中EOF是文件的结尾
{
node *q; //建立结点q
q = (node *)malloc(sizeof(node)); //对结点q分配内存空间
q->num = num;
strcpy(q->name, name); //将用户名和密码复制到链表中
strcpy(q->password, password);
q->money = money; //将消费金额复制到链表中
strcpy(q->grade, grade); //复制会员等级
p->next = q; //指针后移一位
p = q;
}
p->next = NULL;
u_tail = p;
}
fclose(fp); //关闭文件
return head;
}
void save()
{
node *temp = u_head->next; //将temp指针指向head的下一个节点
FILE *fp = fopen("member.txt", "w"); //读取文件
while (temp)
{
fprintf(fp, "%d %s %s %d %s ", temp->num, temp->name, temp->password, temp->money, temp->grade); //输出到文件member.txt
temp = temp->next;
}
fclose(fp); //关闭文件
}
int search(char name[], char password[]) //通过文件查找是否存在该用户
{
node *p; //建立结点p
p = u_head->next;
if ((strcmp(name, adminname) == 0) && (strcmp(password, adminpassword) == 0)) //比较输入的用户名和密码与管理员是否相同
return 1;
while (p) //循环
{
if (strcmp(name, p->name) == 0 && strcmp(password, p->password) == 0) //比较输入的用户名和密码与文件中的是否匹配
{
userGR = p;
return 2;
}
p = p->next; //指针后移
}
return 0;
}
int login()
{
int flag;
char a[L], c[L];
changecolor(7);
printf("\t\t\t-----------------------\n"); //输出用户登录界图案
printf("\t\t\t***** 登 陆 页 面 *****\n");
printf("\t\t\t-----------------------\n");
printf("\t\t\t+会员名: "); //输出输入用户名的提示
scanf("%s", &a); //输入用户名
printf("\t\t\t+密 码: ");
scanf("%s", &c); //输入密码
printf("\t\t\t-----------------------\n");
flag = search(a, c);
return flag;
}
void boundar()
{
int FL;
FL = login(); //进行登陆操作,如果登录失败,返回值为零
while (FL == 0)
{
system("cls"); //执行命令,清空屏幕
changecolor(4); //字体颜色改为红色突出强调
printf("\t\t\t用户名或密码错误!\n"); //输出登陆失败的提示
printf("\t\t\t请重新输入!\n"); //输出重新输入密码的提示
FL = login(); //重新进行登录
}
if (FL == 1) //如果管理员登陆成功,返回值为1
{
changecolor(2);
printf("\t\t\t管理员登陆成功!\n"); //输出管理员登录成功的提示
system("cls"); //清除屏幕内容
admin(); //进入管理员功能
}
else if (FL == 2) //如果会员用户登录成功返回2
{
changecolor(2);
printf("\t\t\t会员登陆成功!\n"); //输出会员登录成功的提示
system("cls"); //清除屏幕内容
user(); //进入用户功能
}
}
void admin() //管理员
{
changecolor(2);
printf("\t\t\t欢迎您,管理员\n"); //输出欢迎提示
adminmenu(); //进入管理员菜单
}
void looklook() //查看用户信息函数
{
int a, num;
node *p; //建立结点p
p = u_head->next;
changecolor(7);
printf("看全部会员信息(1),查看某特定会员(2)\n"); //输出查看功能不同子功能的代号
scanf("%d", &a); //输入用户要使用的功能代号
if (a == 1) //如果代号==1,执行查看所有用户信息功能
{
printf("********************************************************\n"); //输出查看功能界面
printf("| 编号 |会 员 名| 密 码 |消费金额| 会员等级 |\n"); //输出表头
while (p != NULL) //如果指针指向不为空
{
printf("|%4d |%-8s| %-10s| %6d | %s |\n", p->num, p->name, p->password, p->money, p->grade); //输出用户的相关信息
p = p->next; //将指针后移
}
if (p == NULL) //如果指针指向为空,则文件中未存储会员信息
{
changecolor(4);
printf("\t\t\t无会员信息!\n"); //输出无会员信息的提示
printf("\t\t\t请前往录入(添加)会员信息\n"); //输出请添加会员的提示
}
}
else //如果用户使用模块2
{
printf("查看会员编号:"); //输出需要用户输入会员编号的提示
scanf("%d", &num); //输入会员编号
while (p) //循环
{
if (p->num == num) //如果链表中的用户编号和输入的编号相同
{
changecolor(7);
printf("********************************************************\n"); //输出表头图案和文字
printf("| 编号 |会 员 名| 密 码 |消费金额| 会员等级 |\n");
printf("|%4d |%-8s| %-10s| %6d | %s |\n", p->num, p->name, p->password, p->money, p->grade); //输出会员的信息
}
p = p->next; //将指针后移
}
}
}
void increase() //添加会员函数
{
int i, n; //n是需要添加的人数
int num, money; //num是会员编号,money是会员花费金额
char name[L], password[L]; //输入会员的用户名和密码
node *p = u_tail; //建立结点p指向链表尾结点
printf("想要添加几人信息:"); //输出需要添加几个人的提示信息
scanf("%d", &n); //输入要添加会员的数量
printf("********************************************************\n"); //输出图案
printf("编号 会员名 密码 消费金额(根据金额生成会员等级)\n"); //输出表头
for (i = 0; i < n; i++) //循环输入会员相关信息
{
node *r = (node *)malloc(sizeof(node)); //建立结点r,并分配内存空间
scanf("%d %s %s %d", &num, name, password, &money); //输入会员的编号,用户名,密码,消费金额
r->num = num; //将会员编号复制到链表中
strcpy(r->name, name); //将会员名复制到链表中
strcpy(r->password, password); //将会员密码复制到链表中
r->money = money; //将会员消费金额复制到链表中
createvip(r); //根据消费金额生成会员等级
p->next = r; //将指针后移
r->next = NULL; //将r->next设置为空
p = r; //指针后移
}
p->next = NULL;
u_tail = p;
save(); //将输入的文件保存
}
void revise() //修改会员信息函数
{
int c, d, e = -1; //用户选择的序号以及会员编号的变量
int money; //消费金额
char name[L], password[L];
node *p, *q; //建立结点p,q
p = u_head;
q = p->next;
printf("\t\t\t1.修改 2.删除\n"); //对会员信息修改的操作
printf("\t\t\t请输入想要进行操作:"); //输出用户选择操作的提示
scanf("%d", &c); //输入用户选择的序号
if (c == 1) //如果用户输入1,进入会员信息修改操作
{
printf("\t\t\t请输入修改会员编号:"); //输出提示用户输入要修改的会员编号
scanf("%d", &d); //输入会员编号
while (q) //循环查找会员编号
{
if (q->num == d) //比对会员编号信息
{
while (e != 0)
{
changecolor(7);
system("cls"); //清空屏幕内容
printf("\t\t\t请输入要修改信息:\n"); //提示管理员用户选择修改的内容以及序号
printf("1.会员名\n");
printf("2.会员密码\n");
printf("3.消费金额\n");
printf("0.退出\n");
scanf("%d", &e); //输入序号
switch (e)
{
case 1:
printf("修改前会员名:%s\n", q->name); //输入修改前的会员名
printf("想要修改会员名:"); //提示管理员用户输入修改后的用户名
scanf("%s", name); //输入修改后的会员名
strcpy(q->name, name); //将修改后的用户名输入到链表中
changecolor(2);
printf("\n修改成功"); //提示用户修改成功
break; //退出循环
case 2:
changecolor(7);
printf("输入修改前的密码:%s\n", q->password); //提示管理员输入修改之前的密码
printf("输入修改后的密码:"); //提示管理员输入修改之后的密码
scanf("%s", password); //输入修改之后的密码
strcpy(q->password, password); //更新修改之后的密码
changecolor(4);
printf("\n修改成功!请牢记您的密码!\n不要将您的密码告诉他人!"); //输出提示
break; //退出循环
case 3:
changecolor(7);
printf("修改前消费金额:%d\n", q->money); //提示管理员输入修改前的消费金额,并输出修改之前的消费金额
printf("想要修改金额:"); //提示输入想要修改的金额
scanf("%d", &money); //输入消费金额
q->money = money; //更新消费金额
printf("\n修改成功!\n"); //输出修改成功的提示
createvip(q);
break;
//会员等级就不需要修改了,通过函数自动生成。
case 0: //如果输入0,退出循环
break;
}
}
}
q = q->next; //指针后移
}
}
else
{
changecolor(7);
system("cls"); //清屏
printf("请输入想要删除的编号:"); //输出管理员操作提示
scanf("%d", &d); //输入要删除的会员编号
while (p) //循环查找会员编号
{
if (q->num == d) //如果存储的会员编号与输入的编号相同则执行操作
{
p->next = q->next; //指针指向要删除节点的下一个节点
changecolor(4);
printf("删除成功!\n"); //输出删除成功
}
q = q->next;
p = p->next;
}
save(); //保存
}
}
void adminmenu() //管理员菜单
{
int a = -1;
while (a != 0)
{
changecolor(7);
printf("\t\t\t 您具有以下功能:\n"); //输出不同的功能以及序号
printf("\t\t\t*1.查看会员信息\n");
printf("\t\t\t*2.添加会员信息\n");
printf("\t\t\t*3.修改会员信息\n");
printf("\t\t\t*0.退出\n");
printf("\t\t\t*");
scanf("%d", &a);
switch (a)
{
case 1: //进入查看功能
system("cls"); //清屏
looklook(); //调用查看函数
break; //退出
case 2: //进入添加功能
system("cls"); //清屏
increase(); //调用添加函数
save(); //保存内容
break; //退出
case 3: //进入修改功能
system("cls"); //清屏
revise(); //调用修改函数
save(); //保存修改后的内容
break; //退出
case 0:
break; //退出
}
}
}
void user() //用户功能
{
changecolor(7);
printf("欢迎您,%s会员\n", userGR->grade); //输出欢迎提示
usermenu(); //进入用户菜单
printf("再见!"); //结束后输出再见提示
}
void usermenu() //用户菜单
{
int a;
char password[L] = {0};
changecolor(7);
printf("您拥有查看个人信息和修改密码的权限!\n"); //输出提示以及会员用户信息
printf("您的个人信息如下\n:");
printf("---------------------------------------------------\n");
printf("| 编号 |会 员 名| 密 码 |消费金额| 会员等级 |\n");
printf("|%4d |%-8s| %-10s| %6d | %s |\n", userGR->num, userGR->name, userGR->password, userGR->money, userGR->grade);
printf("如果想要修改密码请输入(1)");
scanf("%d", &a); //输入操作序号
if (a == 1)
{
printf("您的原始密码为:%s", userGR->password); //输出用户更改之前的密码
printf("请输入修改的密码:"); //输出用户修改过的密码
scanf("%s", password); //输入用户修改之后的密码
strcpy(userGR->password, password); //更新修改后的密码
changecolor(2);
printf("修改成功!\n"); //输出修改成功的提示
}
save(); //保存用户修改完成的信息
}
void changecolor(int x) //改变输出文字颜色函数
{
if (x >= 0 && x <= 15)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
int main()
{
node *head = Rcreatelink();
u_head = NULL;
u_head = head;
boundar();
changecolor(7);
printf("感谢您的使用!"); //输出感谢使用的提示
}