# include <stdio.h>
# include <stdlib.h>
typedef int ElemType;
typedef struct Money_Date //客户账目来往信息储存 结构体(邻接在单链表上)
{
double money; //存入或者取出的钱
ElemType year; //年
ElemType month; //月
ElemType date; //日
struct Money_Date *nextarc; //指向下一条弧的指针
}mon;
typedef struct Customer //客户个人信息 结构体
{
ElemType id; //账号
char name[15]; //姓名
double initial_money; //开户金额
ElemType x; //存储客户交易来往数目
Money_Date *firstarc; //指向第一个客户账目来往信息
struct Customer *next; //指向下一个客户信息
}cus;
FILE *fp;
void menu(cus *C); //声明菜单函数
void search(cus *C); //声明查询函数菜单
cus *if_accout(cus *C,int i) //检验账号是否存在函数
{
cus *q=C->next,*p=C;
while(q!=NULL){ //在单链表中查找
if(q->id == i)
break;
p=q;
q=p->next;
}
return q;
}
double All_Money(cus *p,mon *m) //计算全部余额
{
double All=0;
m=p->firstarc;
All+=p->initial_money;
while(m!=NULL){ //在单链表中的邻接表查找
All+=m->money;
m=m->nextarc;
}
return All;
}
void In_Date(mon *&m) //输入日期函数
{
printf("年 月 日(如:2020 09 29)");
scanf("%d %d %d",&m->year,&m->month,&m->date);
if(m->year<0 || m->month<=0 || m->month>12 //检验日期输入是否错误
|| m->date<=0 || m->date>31){
printf("日期错误;请重新输入:\n");
printf("年 月 日(如:2020 09 29)");
scanf("%d %d %d",&m->year,&m->month,&m->date);
}
}
void Delete(cus *&C) //全部结点销毁
{
cus *pre=C,*p=C->next;
mon *m=NULL,*o=NULL;
while(p!=NULL){
m=p->firstarc;
if(m!=NULL){
//判断单链表上是否有邻接表(是否存(取)过钱)
o=m->nextarc;
while(o!=NULL){//释放邻接表上的结点
free(m);
m=o;
o=m->nextarc;
}
free(m); //循环结束时,m指向最后一个尾结点,释放它
}
free(pre);
pre=p;
p=pre->next;
}
free(pre); //释放单链表结点
}
void Open_account(cus *&C) //开户函数
{
cus *q=C,*pre=C,*p=C;
int flag = 0;
char ch;
do{
q= (cus*)malloc(sizeof(cus));
printf("请输入客户的信息\n");
printf("账号(为纯数字):"); scanf("%d", &q->id);
if(if_accout(C,q->id) == NULL) //调用了查询账号是否存在函数
{
while(p->next!=NULL)
{
pre=p;
p=pre->next;
}
q->next = p->next ;
p->next = q;
q->firstarc=NULL;
ch=getchar(); //清掉输入的回车键
printf("姓名:"); scanf("%s", q->name);
printf("开户金额:"); scanf("%lf",&q->initial_money);
q->x=0; //没存过钱,值为0
}
else
{
free(q);
printf("该账号已经存在了!\n");
}
printf("\n继续开户 输入请按“1” ,按“0”返回主界面:");
scanf("%d", &flag);
if(flag==0) menu(C); //返回主菜单
} while (flag);
}
void Delete_account(cus *&C) //销户函数
{
cus *q=C,*pre=C,*p=C;
mon *m=NULL,*o=NULL;
int i=0,e;
printf("请输入你要删除的账号:");
scanf("%d",&i);
q=if_accout(q,i);//调用if_accout()函数获取指定账号的位置
if(!q)
printf("没有该用户\n");
else{
e=q->id;
while(p->next!=q)
{
p=p->next;
}
m=q->firstarc;
if(m!=NULL){//判断单链表上是否有邻接表(是否存(取)过钱)
o=m->nextarc;
while(o!=NULL){//释放邻接表上的结点
free(m);
m=o;
o=m->nextarc;
}
free(m); //循环结束时,m指向最后一个尾结点,释放它
}
p->next=q->next;
free(q); //释放单链表结点
printf("已为你删除用户%d的所有信息。\n",e);
}
printf("*******已为你返回主界面*******\n");
menu(C);
}
void In_account(cus *&C) //存款函数
{
cus *p=C;
mon *m=NULL,*o=NULL;
int i;
double All=0;//All为余额
printf("请输入你的账号:");
scanf("%d",&i);
p=if_accout(p,i);//调用if_accout()函数获取指定账号的位置
if(!p)
printf("没有该用户\n");
else{
All=All_Money(p,m); //调用计算余额
o=p->firstarc; //指向第一个交易记录
while(o!=NULL){
o=o->nextarc;
}
m= (mon*)malloc(sizeof(mon));
printf("请输入你要存款的金额:");
scanf("%lf",&m->money);
printf("请输入交易时间:\n");
In_Date(m);
m->nextarc=p->firstarc; //接入链表后
p->firstarc=m;
p->x++; //交易记录进行加1
printf("成功存入金额:%lf\n",m->money);
printf("当前余额为:%lf\n",All+m->money);
}
printf("*******已为你返回主界面*******\n");
menu(C);
}
void Out_account(cus *&C) //取款函数
{
cus *p=C;
mon *m=NULL,*o=NULL;
int i;
double All;
printf("请输入你的账号:");
scanf("%d",&i);
p=if_accout(p,i);//调用if_accout()函数获取指定账号的位置
if(!p)
printf("没有该用户\n");
else{
All=All_Money(p,m); //调用计算余额
o=p->firstarc; //指向第一个交易记录
while(o!=NULL){
o=o->nextarc;
}
m= (mon*)malloc(sizeof(mon));
printf("请输入你要取款的金额(为负数:如(-100)):");
scanf("%lf",&m->money);
if(All >= (m->money)*(-1)){ //if-else 表示余额是否足够取款
printf("请输入交易时间:\n");
In_Date(m);
m->nextarc=p->firstarc; //接入链表后
p->firstarc=m;
p->x++; //交易记录进行加1
printf("成功取出金额:%lf\n",m->money);
printf("当前余额为:%lf\n",All+m->money);
}
else{
printf("你的余额不足!!!\n");
}
}
printf("*******已为你返回主界面*******\n");
menu(C);
}
void search_1(cus *C ) //查询子函数1
{
cus *p=C->next,*q=C;
mon *m=p->firstarc,*o=NULL,*n=NULL;
int i;
printf("请输入你要查询的客户账号:");
scanf("%d",&i);
q=if_accout(q,i);
if(!q)
printf("该客户不存在。\n");
else
{
m=q->firstarc;
n= (mon*)malloc(sizeof(mon)); //为n创建一个结点
o= (mon*)malloc(sizeof(mon)); //为o创建一个结点
printf("请输入你要查询交易时间的范围:\n");
printf("起始时间:");
In_Date(o);
printf("终止时间:");
In_Date(n);
while(m != NULL)
{
//判断年月日是否符合查询条件
if(m->year > o->year && m->year < n->year)//大于起始的年份,小于终止的年份,直接输出
{
if(m->money >= 0)
{ //根据“钱”输入的正负判断是存入还是取出的
printf("%d年%d月%d日",m->year,m->month,m->date);
printf("存入:+%lf\n",m->money);
}
else
{
printf("%d年%d月%d日",m->year,m->month,m->date);
printf("取出:%lf\n",m->money);
}
}
else if(m->year == o->year){ //等于起始的年份
if(m->month >= o->month && m->date >= o->date){
if(m->money >= 0)
{
printf("%d年%d月%d日",m->year,m->month,m->date);
printf("存入:+%lf\n",m->money);
}
else
{
printf("%d年%d月%d日",m->year,m->month,m->date);
printf("取出:%lf\n",m->money);
}
}
}
else if(m->year == n->year) //等于终止的年份
if( m->month <= n->month && m->date <= n->date){
if(m->money >= 0)
{
printf("%d年%d月%d日",m->year,m->month,m->date);
printf("存入:+%lf\n",m->money);
}
else
{
printf("%d年%d月%d日",m->year,m->month,m->date);
printf("取出:%lf\n",m->money);
}
}
m=m->nextarc;
}
free(o);
free(n);
printf("查询成功~!\n");
}
rewind(fp); //使位置标记返回文件头
printf("*******已为你返回子界面*******\n");
search(C);
}
void search_2(cus *C ) //查询子函数2
{
cus *q=C;
mon *m=NULL;
int i;
printf("请输入你要查询的客户账号:");
scanf("%d",&i);
q=if_accout(q,i);
if(!q)
printf("该客户不存在。\n");
else
{
printf("它的全部交易记录为:\n");
m=q->firstarc;
while(m != NULL)
{
if(m->money >= 0){ //根据“钱”输入的正负判断是存入还是取出的
printf("%d年%d月%d日",m->year,m->month,m->date);
printf("存入:+%lf\n",m->money);
}
else
{
printf("%d年%d月%d日",m->year,m->month,m->date);
printf("取出:%lf\n",m->money);
}
m=m->ne
m0_57780045
- 粉丝: 2
- 资源: 4
最新资源
- 2025计量基础知识考试题库及答案.doc
- 2025金属冶炼(炼钢)安全员考试题库(含答案).pptx
- 2025健康管理师三级专业能力考核试卷及答案.doc
- 2025交管12123驾驶证学法减分题库附含答案.doc
- 建筑工程员工工资表.xls
- 工程部薪酬2018年6月.doc
- 工程施工操作员薪酬管理制度.doc
- 2025教育心理学与德育工作基础知识点大全.doc
- 2025教育心理学与德育工作基础知识点整理总复习资料.doc
- 2025基本公共卫生知识考试题及答案.docx
- 2025基本公共卫生知识题库及答案.docx
- 2025基础知识与规范要求技能大赛题库及答案.docx
- 2025脊柱术后脑脊液漏应急预案考试试题(含答案).docx
- 2025计量基础知识题库及答案.docx
- 2025计算机二级考试全真试题库及答案(通用版).docx
- 2025计算机基础理论信息安全基本知识试题及答案.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论9