#include
#include
#include
#include
#define MAX 10
#define MENU_MAIN_COUNT 7
typedef struct member
{
char name[MAX];
char id[MAX];
char sex[2];
int age;
float money;
char tel[12];
struct member *next;
float cost;
}mem;
void menu();
void save(mem *p);
mem *head=NULL;
mem* get_last(mem *p)
指针
{
if(p->next == NULL)
{
return p;
}
else
{
}
}
get_last(p->next);
void creat_member(mem *pNew)
作,会员登记函数
{
的会员
char s;
printf("卡号:");
printf("请输入姓名: ");
//编译预处理指令,引入头文件
//自定义符号常量
//主菜单的选项个数
//定义结构体类型 member,采用链式存储结构
//姓名
//卡号
//性别
//年龄
//余额
//电话
//定义一个指针指向下一个会员信息
//消费金额
//定义结构体变量 mem
/*声明函数*/
/*声明函数,声明菜单函数*/
//声明保存函数
//头指针为 NULL
//取得链表最后一个元素的节点指针并返回该
//输入信息操
//创建一个新
scanf("%s",pNew->id);
scanf("%s",pNew->name);
//运用指针输入卡号
//运用指针输入姓名
a:
printf("请输入性别(f--女 m--男): ");
s = getchar();
if(s=='f'||s=='m')
{
getchar();
//输入男女
//判断是 男 是 女
if (s == 'f' || s == 'F') strcpy(pNew->sex,"女");
if (s == 'M' || s == 'm') strcpy(pNew->sex,"男");
}
else
{
误
新输入
printf("输入错误,请重新输入...\n");
goto a;
//如果输入错
//跳转至 a,重
}
printf("请输入年龄: ");
printf("请输入缴费金额: ");
scanf("%d",&(pNew->age));
scanf("%f",&(pNew->money));
//运用指针输入年龄
//运用指针输入余
printf("请输入电话: ");
scanf("%s",pNew->tel);
//运用指针输入电
额
话
//运用指针
//会员登记
//添加会员
//按 mem 动
//调用会员登
pNew->cost=0;
初始化消费额为 0
printf("\n 创建完毕!\n");
}
void newMember()
函数
{
信息
char con='N';
mem *pLast= NULL;
mem *pNew=(mem *)malloc(sizeof(mem));
态分配内存
pNew->next=NULL;
creat_member(pNew);
记函数
if(head == NULL)
{
head = pNew;
}
else
{
pLast = get_last(head);
pLast->next = pNew;
}
printf("继续输入会员信息?(Y 继续,N 返回菜单)");
记
//判断是否继续登
getchar();
con = getchar();
if (con == 'n' || con == 'N')
{
save(pNew);
menu();
}
else{
save(pNew);
newMember();
}
}
操作
void table_head()
{
printf("+----------+------+------+------+--------+--------+-----------+\n");
printf("| 卡号 | 姓名 | 性别 | 年龄 | 余额 |累计消费| 电话
printf("+----------+------+------+------+--------+--------+-----------+\n");
//显示信息
//定义表头
|\n");
}
void table_buttom()
{
printf("+----------+------+------+------+--------+--------+-----------+\n");
}
void table_row(mem *p)
{
部分
printf("|%10s|%6s|%6s|%6d|%8.2f|%8.2f|%11s|\n",
p->id,p->name,p->sex,p->age,p->money,p->cost,p->tel);
}
//定义底线
// 定义中间
void display(mem *p)
{
p = head;
//显示所有信息
table_head();
while(p != NULL)
{
table_row(p);
p = p->next;
}
table_buttom();
}
void display_one(mem *p)
{
table_head();
table_row(p);
table_buttom();
}
//调用表头
//调用中间部分
//调用底线
//只显示一条信息
void table_sum()
{
//定义总计
printf("+----------+------+------+------+--------+--------+-----------+\n");
printf("|
printf("+----------+------+------+------+--------+--------+-----------+\n");
| 总计 | 总计 |
|
|
|
|\n");
}
void table_r(float money,float cost)
{
//定义总计 2
printf("|
|
|
|
|%8.2f|%8.2f|
|\n",money,cost);
}
void display_statistics(mem *p,float money,float cost)
{
息函数
p = head;
table_head();
while(p != NULL)
{
table_row(p);
p = p->next;
}
p=head;
table_sum();
//显示统计信
//调用表头
//定义中间部分
//定义总计
table_r(money,cost);
table_buttom();
}
作
void save(mem *p)
{
FILE *fp;
向文件的指针变量
fp=fopen("member.dat", "a");
的返回值赋给指针变量 fp
while(p != NULL)
{
//定义总计 2
//定义表尾
//文件相关操
//保存函数
//定义一个指
//将 fopen 函数
fprintf(fp, "%s %s %s %d %f %s %d\n",p->id, p->name, p->sex, p->age, p->money,
p->tel,p->cost);
p = p->next;
}
fclose(fp);
getchar();
}
void modify_file(mem *p)
{
会员信息函数
FILE *fp;
p= head;
if((fp=fopen("member.dat", "w"))==NULL)
{
文件的操作是否有错
printf("文件不存在");
getchar();
menu();
数
}
while(p != NULL)
{
//关闭指针
//保存修改
//检查打开
//调用菜单函
fprintf(fp, "%s %s %s %d %f %s %f\n",p->id, p->name, p->sex, p->age, p->money,
p->tel,p->cost);
p = p->next;
}
fclose(fp);
getchar();
}
void load(mem *p)
{
FILE *fp;
mem *pLast = NULL;
head=NULL;
if((fp=fopen("member.dat","r"))==NULL)
{
操作是否有错
printf("没有会员信息,请录入!");
getch();
menu();
}
while(!feof(fp))
{
//从文件加载信息
//检查打开文件的
//调用菜单函数
//文件指针是否到
达末尾
存
mem *pNew = (mem *)malloc(sizeof(mem));
//按 mem 动态分配内
pNew->next = NULL;
fscanf(fp, "%s %s %s %d %f %s %f\n",
pNew->id, pNew->name, pNew->sex, &(pNew->age), &(pNew->money),
pNew->tel,&(pNew->cost));
if(head == NULL)
{
head = pNew;
}
else
{
pLast = get_last(head);
pLast->next = pNew;
}
}
p = head;
fclose(fp);
}
数
//通过卡号搜索 信息函
//通过卡号搜索信息
//判断 id 是否不为 n
//找到
//输入 n 时返回菜单
//重新搜索卡号
//调用寻找函数
//返回 p
/*修改会员信息操作*/
//修改会员的信息
mem* search_id(mem *p)
{
char id[MAX];
int i=0;
p = head;
scanf("%s",id);
while(p&&(strcmp(id,"n")!=0))
{
if(strcmp(p->id,id)==0)
{
i=1;
break;
}
else
p=p->next;
}
if(strcmp(id,"n")==0)
menu();
if(p==NULL)
{
printf("您查找的卡号不存在,请重新输入:\n");
p=search_id(p);
}
else
return p;
}
void modify_m()
{
char s,fun='y';
char pro[] =
"|\n"
"| 1 姓名\n"
"| 2 性别\n"
"| 3 年龄\n"
"| 4 电话\n"
"| 5 返回\n"
"|\n";
mem *p;
load(p);
display(p);
printf("请输入需要修改信息的会员卡号(n 返回菜单):");
p=search_id(p);
while(fun=='y'||fun=='Y')
{
//调用显示函数
//调用按号寻找函数
//当继续寻找时
system("cls");
display_one(p);
printf("请选择修改的项目:\n");
printf(pro);
getchar();
scanf("%c",&fun);
switch(fun)
{
case '1': printf("请输入姓名: ");
case '2': a:
//清屏
//调用显示一条函数
//输出 pro
//用 switch 语句选择修改内容
scanf("%s",p->name);break;
printf("请输入性别(f--女 m--男): ");
s = getchar();
if(s=='f'||s=='m')
{
getchar();
if (s == 'f' || s == 'F') strcpy(p->sex,"女");
if (s == 'M' || s == 'm') strcpy(p->sex,"男");
}
else
{
printf(">输入错误,请重新输入...\n");
goto a;
}
break;
case '3': printf("请输入年龄: ");
scanf("%d",&(p->age));break;
case '4': printf("请输入电话: ");
default : break;
}
printf("是否继续修改 Y/N?");
getchar();
fun=getchar();
}
modify_file(p);
system("cls");
display_one(p);
printf("\n 修改成功,按任意键继续!");
getchar();
menu();
}
scanf("%s",p->tel); break;
//判断是否继续寻找
//调用保存修改会员信息函数
//清屏
//调用显示一条函数
//调用菜单函数