商场会员管理与统计消费系统,广工,c语言程序设计

本文档展示了如何使用C语言实现一个商场会员管理与消费统计系统,包括成员信息管理、购买记录、余额更新等功能,并提供了相应的文件操作函数。
摘要由CSDN通过智能技术生成

源代码如下,工程文件,报告都在压缩包里面 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <mmsystem.h> // 包含Multimedia API的头文件

#define MAX_MEMBERS 100    // 最多会员数量
#define MAX_PURCHASES 100    // 最多购买记录数量

// 成员结构体
struct Member {
    char id[10];    // 会员编号
    char name[50];    // 会员姓名
    char sex[10];    // 会员性别
    char phone[20];    // 会员电话
};

// 购买结构体
struct Purchase {
    struct tm *data;    // 日期和时间
    char time[20];    // 时间字符串,格式为"年/月/日 时:分:秒"
    char id[10];    // 会员编号
    char name[50];    // 会员姓名
    double amount;    // 金额
    char payment[20];    // 支付方式,例如"现金"、"微信支付"等
};

// 全局变量
struct Member members[MAX_MEMBERS];    // 存储会员信息的数组
struct Purchase purchases[MAX_PURCHASES];    // 存储购买记录的数组
double balances[MAX_MEMBERS];    // 存储会员余额的数组
int num_members = 0;    // 统计成员数量
int num_purchases = 0;    // 统计购买记录的数量

// 将成员存到文件中
void save_members_to_file() {
    FILE *file = fopen("members.txt", "w");    // 打开文件,以写入方式
    if (file == NULL) {    // 如果文件打开失败
        printf("无法打开文件。\n");    // 输出错误信息
        return;    // 结束函数
    }
    for (int i = 0; i < num_members; i++) {    // 遍历所有成员
        // 将成员信息写入文件,格式为"会员编号,会员姓名,会员性别,会员电话"
        fprintf(file, "%s,%s,%s,%s\n", members[i].id, members[i].name, members[i].sex, members[i].phone);
    }
    fclose(file);    // 关闭文件
}

// 从文件中加载成员信息
void load_members_from_file() {
    FILE *file = fopen("members.txt", "r");    // 打开文件,以读取方式
    if (file == NULL) {    // 如果文件打开失败
        printf("无法打开文件。\n");    // 输出错误信息
        return;    // 结束函数
    }
    while (!feof(file) && num_members < MAX_MEMBERS) {    // 当文件没有读取到末尾并且成员数量没有达到上限时
        struct Member *member = &members[num_members++];    // 获取下一个成员的指针,并将成员数量加1
        // 从文件中读取成员信息,格式为"会员编号,会员姓名,会员性别,会员电话"
        fscanf(file, "%[^,],%[^,],%[^,],%[^\n]\n", member->id, member->name, member->sex, member->phone);
    }
    fclose(file);    // 关闭文件

    file = fopen("balances.txt", "r");    // 打开文件,以读取方式
    if (file == NULL) {    // 如果文件打开失败
        printf("无法打开文件。\n");    // 输出错误信息
        return;    // 结束函数
    }
    int i = 0;
    while (!feof(file) && i < num_members) {    // 当文件没有读取到末尾并且成员数量没有达到上限时
        fscanf(file, "%lf\n", &balances[i++]);    // 从文件中读取会员余额,并将i加1
    }
    fclose(file);    // 关闭文件
}

// 将会员余额存到文件中
void save_balances_to_file() {
    FILE *file = fopen("balances.txt", "w");    // 打开文件,以写入方式
    if (file == NULL) {    // 如果文件打开失败
        printf("无法打开文件。\n");    // 输出错误信息
        return;    // 结束函数
    }
    for (int i = 0; i < num_members; i++) {    // 遍历所有会员
        fprintf(file, "%.2lf\n", balances[i]);    // 将会员余额写入文件,保留两位小数
    }
    fclose(file);    // 关闭文件
}

// 将购买记录存到文件中
void save_purchases_to_file() {
    FILE *file = fopen("purchases.txt", "w");    // 打开文件,以写入方式
    if (file == NULL) {    // 如果文件打开失败
        printf("无法打开文件。\n");    // 输出错误信息
        return;    // 结束函数
    }
    for (int i = 0; i < num_purchases; i++) {    // 遍历所有购买记录
        // 将购买记录写入文件,格式为"年/月/日 时:分:秒,会员编号,会员姓名,金额,支付方式"
        fprintf(file, "%d/%d/%d %d:%d:%d,%s,%s,%.2f,%s\n",
                purchases[i].data->tm_year,
                purchases[i].data->tm_mon,
                purchases[i].data->tm_mday,
                purchases[i].data->tm_hour,
                purchases[i].data->tm_min,
                purchases[i].data->tm_sec,
                purchases[i].id,
                purchases[i].name,
                purchases[i].amount,
                purchases[i].payment);
    }
    fclose(file);    // 关闭文件
}

// 从文件中加载购买信息
void load_purchases_from_file() {
    FILE *file = fopen("purchases.txt", "r");    // 打开文件,以读取方式
    if (file == NULL) {    // 如果文件打开失败
        printf("无法打开文件。\n");    // 输出错误信息
        return;    // 结束函数
    }
    while (!feof(file) && num_purchases < MAX_PURCHASES) {    // 当文件没有读取到末尾并且购买记录数量没有达到上限时
        struct Purchase *purchase = &purchases[num_purchases++];    // 获取下一条购买记录的指针,并将购买记录数量加1
        purchase->data = (struct tm *) malloc(sizeof(struct tm));    // 为日期和时间结构体分配内存
        // 从文件中读取购买记录,格式为"年/月/日 时:分:秒,会员编号,会员姓名,金额,支付方式"
        fscanf(file, "%d/%d/%d %d:%d:%d,%[^,],%[^,],%lf,%[^\n]\n",
               &purchase->data->tm_year,
               &purchase->data->tm_mon,
               &purchase->data->tm_mday,
               &purchase->data->tm_hour,
               &purchase->data->tm_min,
               &purchase->data->tm_sec,
               purchase->id,
               purchase->name,
               &purchase->amount,
               purchase->payment);
    }
    fclose(file);    // 关闭文件
}

// 添加成员
void add_member() {
    if (num_members >= MAX_MEMBERS) {    // 如果会员数量已达上限
        printf("会员数量已达上限,无法添加新会员。\n");    // 输出错误信息
        return;
    }
    struct Member *member = &members[num_members++];    // 获取下一个成员的指针,并将成员数量加1
    printf("请输入会员编号:");
    scanf("%s", member->id);
    printf("请输入会员姓名:");
    scanf("%s", member->name);
    printf("请输入会员性别:");
    scanf("%s", member->sex);
    printf("请输入会员电话:");
    scanf("%s", member->phone);
    printf("请输入预存金额:");
    double balance;
    scanf("%lf", &balance);
    balances[num_members - 1] = balance;    // 将预存金额保存到余额数组中
    printf("会员添加成功。\n");
}

// 修改会员信息
void modify_member() {
    char id[10];
    printf("请输入要修改的会员编号:");
    scanf("%s", id);
    int i;
    for (i = 0; i < num_members; i++) {
        if (strcmp(members[i].id, id) == 0) {    // 如果找到要修改的会员
            printf("请输入新的会员姓名:");
            scanf("%s", members[i].name);
            printf("请输入新的会员性别:");
            scanf("%s", members[i].sex);
            printf("请输入新的会员电话:");
            scanf("%s", members[i].phone);
            printf("会员信息修改成功。\n");
            return;
        }
    }
    printf("未找到该会员。\n");    // 如果没有找到要修改的会员,输出错误信息
}
// 删除会员
void delete_member() {
    char id[10];
    printf("请输入要删除的会员编号:");
    scanf("%s", id);
    int i;
    for (i = 0; i < num_members; i++) {
        if (strcmp(members[i].id, id) == 0) {    // 如果找到要删除的会员
            for (int j = i; j < num_members - 1; j++) {
                members[j] = members[j + 1];    // 将后面的会员信息向前移动
                balances[j] = balances[j + 1];    // 将后面的余额信息向前移动
            }
            num_members--;    // 会员数量减1
            printf("会员删除成功。\n");
            return;
        }
    }
    printf("未找到该会员。\n");    // 如果没有找到要删除的会员,输出错误信息
}

// 查询会员
void query_member() {
    char id[10];
    printf("请输入要查询的会员编号:");
    scanf("%s", id);
    int i;
    for (i = 0; i < num_members; i++) {
        if (strcmp(members[i].id, id) == 0) {    // 如果找到要查询的会员
            printf("姓名:%s\n", members[i].name);
            printf("性别:%s\n", members[i].sex);
            printf("电话:%s\n", members[i].phone);
            return;
        }
    }
    printf("未找到该会员。\n");    // 如果没有找到要查询的会员,输出错误信息
}

// 列出所有会员
void list_members() {
    printf("会员列表:\n");
    printf("%-10s %-20s %-10s %-20s %-10s\n", "编号", "姓名", "性别", "电话", "余额");
    for (int i = 0; i < num_members; i++) {
        printf("%-10s %-20s %-10s %-20s %-10.2lf\n", members[i].id, members[i].name, members[i].sex, members[i].phone, balances[i]);
    }
}



// 添加消费记录
void add_purchase() {
    // 检查是否达到最大消费记录数
    if (num_purchases >= MAX_PURCHASES) {
        printf("消费数量已达上限,无法添加新消费。\n");
        return;
    }
    // 获取要添加的消费记录的指针
    struct Purchase *purchase = &purchases[num_purchases++];
    time_t t;
    time(&t);
    // 获取当前时间并将其分配给消费记录的时间字段
     purchase->data = localtime(&t);
    // 获取用户输入的会员编号
    printf("请输入会员编号:");
    scanf("%s", purchase->id);
    // 获取用户输入的消费名称
    printf("请输入消费名称:");
    scanf("%s", purchase->name);
    // 获取用户输入的消费金额
    printf("请输入消费金额:");
    scanf("%lf", &purchase->amount);
    // 获取用户输入的付款方式
    printf("请输入付款方式:");
    scanf("%s", purchase->payment);

    // 更新会员余额
    int i;
    for (i = 0; i < num_members; i++) {
        // 查找与消费记录中会员编号匹配的会员
        if (strcmp(members[i].id, purchase->id) == 0) {
            // 减去消费金额以更新会员余额
            balances[i] -= purchase->amount;
            printf("消费添加成功。\n");
            return;
        }
    }
    printf("未找到该会员。\n");
}

// 列出所有消费记录
void list_purchases() {
    // 打印消费记录表头
    printf("消费列表:\n");
    printf("%-20s %-20s %-10s %-10s %-10s\n", "时间", "会员编号", "名称", "金额", "支付方式");
    // 遍历所有消费记录并打印每条记录
    for (int i = 0; i < num_purchases; i++) {
        printf("%d/%d/%d %d:%d:%-3d %-20s %-10s %-10.2f %-10s\n",
               purchases[i].data->tm_year + 1900,
               purchases[i].data->tm_mon+1,
               purchases[i].data->tm_mday,
               purchases[i].data->tm_hour,
               purchases[i].data->tm_min,
               purchases[i].data->tm_sec,
               purchases[i].id,
               purchases[i].name,
               purchases[i].amount,
               purchases[i].payment);
    }
}


// 销售统计
void list_sales() {
    printf("销售统计:\n");
    double total_sales = 0;
    // 计算所有销售额的总和
    for (int i = 0; i < num_purchases; i++) {
        total_sales += purchases[i].amount;
    }
    // 打印总销售额和平均每笔销售额
    printf("总销售额:%.2f\n", total_sales);
    printf("平均每笔销售额:%.2f\n", total_sales / num_purchases);
}

// 列出消费排行
void list_ranking() {
    printf("消费排行:\n");
    double balances[MAX_MEMBERS] = {0}; // 用于保存每个会员的余额
    int i, j;
    // 计算每个会员的总消费额
    for (i = 0; i < num_members; i++) {
        double total_spending = 0;
        for (j = 0; j < num_purchases; j++) {
            if (strcmp(members[i].id, purchases[j].id) == 0) {
                total_spending += purchases[j].amount;
            }
        }
        balances[i] = total_spending;
    }
    // 使用冒泡排序对会员按消费额进行排序
    for (i = 0; i < num_members - 1; i++) {
        for (j = 0; j < num_members - i - 1; j++) {
            if (balances[j] < balances[j + 1]) {
                double tmp_balance = balances[j];
                balances[j] = balances[j + 1];
                balances[j + 1] = tmp_balance;

                struct Member tmp_member = members[j];
                members[j] = members[j + 1];
                members[j + 1] = tmp_member;
            }
        }
    }
    // 打印会员名和对应的消费额,按消费额从高到低排列
    for (i = 0; i < num_members; i++) {
        printf("%s %.2lf\n", members[i].name, balances[i]);
    }
}

// 查询余额
void query_balance() {
    char id[10];
    printf("请输入要查询的会员编号:");
    scanf("%s", id);
    int i;
    for (i = 0; i < num_members; i++) {
        if (strcmp(members[i].id, id) == 0) {
            double total_spending = 0;
            int j;
            // 计算指定会员的总消费额
            for (j = 0; j < num_purchases; j++) {
                if (strcmp(members[i].id, purchases[j].id) == 0) {
                    total_spending += purchases[j].amount;
                }
            }
            // 打印剩余余额
            printf("剩余余额:%.2lf\n", balances[i] - total_spending);
            save_balances_to_file(); // 保存余额到文件中
            return;
        }
    }
    printf("未找到该会员。\n");
}
//用dev没法实现这个代码,365行一直出错,错误提示[Error] ld returned 1 exit status
/*void playBackgroundMusic() {
  mciSendString("open \"D:\\新建文件夹 (4)\\课设\\music.mp3\" alias BGMusic", NULL, 0, NULL); // 初始化,使用完整的文件路径和文件名
     mciSendString("play BGMusic repeat", NULL, 0, NULL); // 启动播放并设置循环播放
}*/

// 主函数
int main() {

	  // 播放背景音乐
	 //   playBackgroundMusic();   
    // 从文件加载会员信息和购买记录
    load_members_from_file();
    load_purchases_from_file();

    // 设置控制台颜色为淡黄色背景和淡绿色前景
    system("color e2");

    // 播放蜂鸣声,频率为1000,持续时间为1200毫秒
    Beep(1000, 1200);

    // 进入无限循环,显示菜单并提示用户进行选择
    while (1) {
        printf("************************************************\n");
        printf("~~~~~~~欢迎使用商场会员管理与消费统计系统~~~~~~~\n");
        printf("请选择操作:\n");
        printf("1. 添加会员\n");
        printf("2. 修改会员信息\n");
        printf("3. 删除会员\n");
        printf("4. 查询会员信息\n");
        printf("5. 列出所有会员\n");
        printf("6. 添加消费记录\n");
        printf("7. 列出所有消费记录\n");
        printf("8. 销售统计\n");
        printf("9. 消费排行榜\n");
        printf("10. 查询会员余额\n");
        printf("0. 退出\n");
        printf("************************************************\n");

        int choice;
        printf("请输入你的选项:");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                system("cls");
                add_member();
                save_members_to_file();
                break;
            case 2:
                system("cls");
                modify_member();
                save_members_to_file();
                break;
            case 3:
                system("cls");
                delete_member();
                save_members_to_file();
                break;
            case 4:
                system("cls");
                query_member();
                break;
            case 5:
                system("cls");
                list_members();
                break;
            case 6:
                system("cls");
                add_purchase();
                save_purchases_to_file();
                break;
            case 7:
                system("cls");
                list_purchases();
                break;
            case 8:
                system("cls");
                list_sales();
                break;
            case 9:
                system("cls");
                list_ranking();
                break;
            case 10:
                system("cls");
                query_balance();
                break;
            case 0:
                save_members_to_file();
                save_purchases_to_file();
                 save_balances_to_file(); 
                printf("欢迎再次使用,再见。\n");
                return 0; // 退出程序
            default:
                printf("无效的选项,请重新输入。\n");
        }
    }

    return 0;
}

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值