简单的超市会员管理系统

简单的超市会员管理系统

随着社会的进步,人们生活水平的提高,各种各样的会员应运而生。各种便民服务的地方为了提高服务粘性,留住顾客往往采用会员制,例如便利店、健身房,生鲜超市、美容美发店等等不一而足。会员制一般根据会员们的充值金额,划分等级,享受不同的折扣;也可以根据消费频次、消费额度等进行优惠,或者设立一个月的某日为会员日,享受优惠。现在我们简化一下,完成一个具有基本功能的会员管理系统,其中至少包含以下功能:
会员相关信息采用文件存储,文件名为: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("感谢您的使用!"); //输出感谢使用的提示
}
  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值