源代码如下,工程文件,报告都在压缩包里面
#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;
}