ATM管理系统

ATM管理系统

|软件工程导论 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19 |
| ---- | ---- | ---- |
| 作业要求 |https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11477 |
| 作业目标| 设计程序实现开户、登录、查询、存取款等功能 |
| 学号 | 3190704209 |

代码:

主要函数代码:

函数的声明:

void chaxun(struct per *head);    
void kaihu(struct per *head);
void denglu(struct per *head);
void caidan(struct per *head);
void qukuan(struct per *head);
void xgmm(struct per *head);
void cunkuan(struct per *head);
void zhuanzhang(struct per *head);
void xiaohu(struct person **Phead);
void tuichu();
void menu();

菜单函数:

void caidan(struct per *head)
{
	head=NULL;
	int i;      //i为客户选择输入的变量
	while(1)
	{
		printf("请选择您需要的业务:\n");      //银行业务菜单
		printf("*********************************\n");
		printf("**  1 取款   *****   2 查询    **\n");
		printf("*********************************\n");
		printf("**  3 转账   *****   4 修改密码**\n");
		printf("*********************************\n");
		printf("**  5 存款   *****   6 退出    **\n");
		printf("*********************************\n");
		scanf("%d",&i);
		if(i<6||i>0)
		{
			switch(i)
			{
			case 1:qukuan(head);       //调用银行取款函数
			       system("pause");
				   system("cls");
				   break;
			case 2:system("cls");
				   chaxun(head);  //调用银行查询函数
				   break;
            case 3:system("cls");
				   zhuanzhang(head);  //调用银行转账函数
				   break;
            case 4:system("cls");
				   xgmm(head);  //调用银行修改密码函数
				   break;
            case 5:system("cls");
				   cunkuan(head);  //调用银行存款函数
				   break;
            case 6:system("cls");
				   tuichu();  //调用银行退出函数
				   break;
			}
		}
		else
		{
			printf("您的输入有误\n");
			system("pause");
			system("cls");
		}
	}
}

开户函数:

void kaihu(struct per *head)
{
	head=NULL;
	FILE *fp;   //定义文件指针
	struct per *p1=NULL,*p2=NULL;   //p1,p2为定义链表指针
	p1=(struct per*)malloc(sizeof(struct per));  //开辟内存单元
	      printf("请输入您的姓名:\n");  //请数据输入链表中
		  scanf("%s",p1->name);
		  printf("请设置您的卡号:\n");
		  scanf("%s",p1->ID);
		  printf("请设置您银行卡密码:\n");
		  scanf("%s",p1->mima);
		  p1->money=0;
		  p1->next=NULL;
		  printf("您的个人信息为");
		     printf("姓名:%s \n卡号:%s \n余额:%4d\n",p1->name,p1->ID,p1->money);
          if(NULL==head)           //为新用户开辟内存单元
		  {
			  head=(struct per *)malloc(sizeof(struct per));
			  head->next=p1;    //进行头插法,将其作为第一个节点
		  }
		  else    //为新增客户开辟内存单元
		  {
			  for(p2=head;p2->next!=NULL;p2=p2->next); //进行尾插
			  p2->next=p1;
		  }
		  if((fp=fopen("save.txt","ab+"))==NULL) //打开文件
		  {
			  printf("cannot poen file\n");
			  return;
		  }
		  if(fwrite(p1,sizeof(struct per),1,fp)!=1)  //将链表信息写入文件中
			  printf("file write error\n");
		      fclose(fp);
			  printf("\n");
			  printf("恭喜您开户成功,请登录\n");
			  system("pause");
			  system("cls");
			  denglu(head);
}

销户函数:

void xiaohu(struct person **Phead)   //*(*Phead)为指向结构体指针的地址
{
	char k[20];    //定义输入查找客户姓名卡号的变量
	struct person *p=*Phead,*t;
	if(NULL==(*Phead))     //若指针最后指向空,则没有客户信息
	{
		printf("没有账户信息可删除!\n");
		return;
	}
	printf("请选择要注销的卡号:\n");
	scanf("%s",k);
	if(p->kehu.ID==k)//若第一个客户就是,则让头指针指向下一个结点
		*Phead=(*Phead)->next,free(p);
	else
	{
		while(NULL==p->next&&p->next->kehu.ID!=k)   //遍历寻找,核对客户卡号
			p=p->next;   //当p->next没指向空,并且客户的卡号还没找到,则继续寻找
		if(p->next==NULL)
			printf("对不起,没有该账户!\n");
		else
		{
			t=p->next;  //如果找到,则把p->next的值赋给t
			p->next=p->next->next;
		}
		printf("删除成功!");
	}
}

登录函数:

void denglu(struct per *head)
{
	char d[20];
	char mima[20];
	int i,j;
	FILE *fp;     //定义文件指针
	struct per *p,*q=NULL;
	if((fp=fopen("save.txt","rb+"))==NULL)   //打开一个二进制文件,为读方式
	{
		printf("不能打开文件\n");   //如不能打开,则结束程序
	}
	p=(struct per*)malloc(sizeof(struct per));   //申请空间
	head=p;
	while(!feof(fp))       //循环读数据直到文件尾结束
 
	{
		if(1!=fread(p,sizeof(struct per),1,fp))
			break;   //如果没读到数据,跳出循环
		p->next=(struct per *)malloc(sizeof(struct per));  //为下一个结点申请空间
		q=p;  //保存当前节点的指针,作为下一结点的前驱
		p=p->next;  //指针后移,新读入数据链到当前表尾
		
	}
	q->next=NULL;  //最后一个结点的后继指针为空
	fclose(fp);
	printf("  **********************\n");
	printf("  ***欢迎ATM自助系统***\n");
	printf("  **********************\n");
	for(j=1;j<4;j++)      //限制卡号输入的次数的循环
	{
		printf("请输入您的卡号\n");
		scanf("%s",d);
		for(q=head;q!=NULL;q=q->next)   //遍历链表
		{
			if(strcmp(q->ID,d)!=0)  //核对账号
			{
			continue;   //跳出循环
			}
					else
		{
			for(i=1;i<4;i++)   //限制密码输入的次数的循环
			{
				printf("\n\n请输入您的密码\n");
				scanf("%s",mima);
				if(strcmp(q->mima,mima)!=0)      //核对密码
				{
					printf("密码不正确。请重新输入密码\n");
					system("pause");
					system("cls");
					continue;    //若密码不对,跳出循环
				}
				else
				{
					system("cls");
					caidan(head);   //调用菜单函数
				}
			}
			printf("\n\n\n您输入密码三次错误,谢谢光临\n");
			system("pause");
			system("cls");
			exit(0);
		}
	}
		
	
	printf("\n\n\n您输入的卡号有误,请重试\n");
	system("pause");
	system("cls");
}
printf("您的卡号三次输入错误,谢谢使用\n");
exit(0);
}
 

查询存款:

void chaxun(struct per *head)
{
	head=NULL;  //链表头指针
	FILE *fp;  //定义文件指针
	struct per *p,*q=NULL;
	if((fp=fopen("save.txt","rb+"))==NULL)  //打开一个二进制文件,为读方式
	{
		printf("不能打开文件\n");  //如不能打开,则结束程序
	}
	p=(struct per*)malloc(sizeof(struct per));   //申请空间
	head=p;
	while(!feof(fp))    //循环读数据直到文件尾结束
	{
		if(1!=fread(p,sizeof(struct per),1,fp))
			break;    //如果没读到数据,跳出循环
		p->next=(struct per *)malloc(sizeof(struct per));  //为下一个结点申请空间
		q=p;   //保存当前结点的指针,作为下一个结点的前驱
		p=p->next;   //指针后移,新读入数据链到当前表尾
	}
	q->next=NULL;   //最后一个结点的后继指针为空
	fclose(fp);
	printf("您卡上现有余额%d元\n\n",q->money);
	system("pause");
	system("cls");
}

存款:

void cunkuan(struct per *head)
{
	int i;
	head=NULL;   //链表头指针
	FILE *fp;  //定义文件指针
	struct per *p,*q=NULL;
	if((fp=fopen("save.txt","rb+"))==NULL)  //打开一个二进制文件,为读方式
	{
		printf("不能打开文件\n");  //如不能打开,则结束程序
	}
	p=(struct per*)malloc(sizeof(struct per));   //申请空间
	head=p;
	while(!feof(fp))    //循环读数据直到文件尾结束
	{
		if(1!=fread(p,sizeof(struct per),1,fp))
			break;    //如果没读到数据,跳出循环
		p->next=(struct per *)malloc(sizeof(struct per));  //为下一个结点申请空间
		q=p;   //保存当前结点的指针,作为下一个结点的前驱
		p=p->next;   //指针后移,新读入数据链到当前表尾
	}
	q->next=NULL;   //最后一个结点的后继指针为空
	fclose(fp);
	system("cls");
	printf("您卡上原有余额%d元\n",q->money);   
    printf("  1: 100元        2:200元  \n");
    printf("  3: 300元        4:400元  \n");
    printf("  5: 500元        6:600元  \n");
    printf("请选择您要存入的余额\n");
	scanf("%d",&i);
	if(i>6||i<=0)
	{
		printf("对不起,您的输入有误\n\n");
		return;
	}
	else
	{
		i=100*i;
		q->money+=i;
		if((fp=fopen("save.txt","wb+"))==NULL)   //打开文件
		{
			printf("cannot open file\n");
		}
		if(fwrite(q,sizeof(struct per),1,fp)!=1)  //将修改的密码重新写入文件
			printf("file write error\n");
	    	printf("您已经成功存取%d元\n",i);
			q->next=NULL;
			fclose(fp);
			system("pause");
			system("cls");
	}
}

取款:

void qukuan(struct per *head)
{
	head=NULL;   //head为链表头指针
	int i;
	FILE *fp;          //定义文件指针
	struct per *p,*q=NULL;
	if((fp=fopen("save.txt","rb+"))==NULL) //打开一个二进制文件,为读方式
	{
		printf("不能打开文件\n");  //如不能打开,则结束程序
	}
	p=(struct per*)malloc(sizeof(struct per));  //申请空间
	head=p;
	while(!feof(fp))   //循环读数据直到文件尾结束
	{
		if(1!=fread(p,sizeof(struct per),1,fp))
			break;   //如果没有读到数据,跳出循环
		p->next=(struct per *)malloc(sizeof(struct per));  //为下一个结点申请空间
		q=p;   //保存当前结点的指针,作为下一个结点的前驱
		p=p->next;  //指针后移,新读入数据链到当前表尾
	}
	q->next=NULL;  //最后一个结点的后继指针为空
	fclose(fp);
	system("cls");
    printf("  1: 100元        2:200元  \n");
    printf("  3: 300元        4:400元  \n");
    printf("  5: 500元        6:600元  \n");
    printf("请按要求选择您要取款的金额\n");
	scanf("%d",&i);
	if(i>6||i<=0)    //限制输入范围
	{
		printf("对不起,您的输入有误\n\n");
		return;
	}
	else
	{
		i=100*i;  //对应选项乘以一百为取款金额
		if(i>q->money)
		{
			printf("对不起,您的金额不足\n");
			system("pause");
			system("cls");
			caidan(head);   //调用取款机菜单函数
		}
		else
		{
			q->money-=i;  //对金额进行处理
			if((fp=fopen("save.txt","wb+"))==NULL)  //打开文件
			{
				printf("cannot open file\n");
				return;
			}
			if(fwrite(q,sizeof(struct per),1,fp)!=1) //将修改的信息重新写入文件
				printf("file write error\n");
			printf("您已经成功取走%d元\n",i);
			q->next=NULL;
			fclose(fp);    //关闭文件
		}
		
	}
}

转账:

void zhuanzhang(struct per *head)
{
	head=NULL;
	FILE *fp;  //定义文件指针
	struct per *p,*q=NULL;
	if((fp=fopen("save.txt","rb+"))==NULL)  //打开一个二进制文件,为读方式
	{
		printf("不能打开文件\n");  //如不能打开,则结束程序
	}
	p=(struct per*)malloc(sizeof(struct per));   //申请空间
	head=p;
	while(!feof(fp))    //循环读数据直到文件尾结束
	{
		if(1!=fread(p,sizeof(struct per),1,fp))
			break;    //如果没读到数据,跳出循环
		p->next=(struct per *)malloc(sizeof(struct per));  //为下一个结点申请空间
		q=p;   //保存当前结点的指针,作为下一个结点的前驱
		p=p->next;   //指针后移,新读入数据链到当前表尾
	}
	q->next=NULL;   //最后一个结点的后继指针为空
	fclose(fp);
	int i,j,k;
	printf("请输入帐号号码\n");
	scanf("%d",&i);
	printf("请再次输入帐号号码\n");   //核对卡号
	scanf("%d",&j);
	if(i!=j)
	{
		printf("两次账号不同,请重新输入\n");
		zhuanzhang(head);
	}
	else
	{
		system("cls");

    printf(" 1: 100元         2:200元  \n");

    printf(" 3: 300元         4:400元  \n");

    printf(" 5: 500元         6:600元  \n");
    printf("请输入转账金额\n");
	scanf("%d",&k);
	if(k>6||k<=0)
	{
		printf("对不起,您的输入有误\n\n");
		return;
	}
	else
	{
		k=k*100;
		if(k>q->money)    //对余额进行判断
		{
			printf("对不起,您的余额不足\n");
			system("pause");
			system("cls");
			caidan(head);
		}
		else
		{
			printf("您已成功转账%d元\n",k);
			q->money-=k;
			if((fp=fopen("save.txt","wb+"))==NULL)
			{
				printf("cannot open file\n");
				return;
			}
			if(fwrite(q,sizeof(per),1,fp)!=1)  //将数据重新写入文件
				printf("file write error\n");
			q->next=NULL;
			fclose(fp);
			system("pause");
			system("cls");
		}
	}
	}
}

部分运行截图:

个人小结

<head> <meta http-equiv=Content-Type content="text/html; charset=gb2312"> <meta name=ProgId content=Excel.Sheet> <meta name=Generator content="Microsoft Excel 15"> <link id=Main-File rel=Main-File href="../工作簿1.htm"> <link rel=File-List href=filelist.xml> <link rel=Stylesheet href=stylesheet.css> <style> <!--table {mso-displayed-decimal-separator:"\."; mso-displayed-thousand-separator:"\,";} @page {margin:.75in .7in .75in .7in; mso-header-margin:.3in; mso-footer-margin:.3in;} ruby {ruby-align:left;} rt {color:windowtext; font-size:9.0pt; font-weight:400; font-style:normal; text-decoration:none; font-family:等线; mso-generic-font-family:auto; mso-font-charset:134; mso-char-type:none; display:none;} --> </style> <![if !supportTabStrip]><script language="JavaScript"> <!-- function fnUpdateTabs() { if (parent.window.g_iIEVer>=4) { if (parent.document.readyState=="complete" && parent.frames['frTabs'].document.readyState=="complete") parent.fnSetActiveSheet(0); else window.setTimeout("fnUpdateTabs();",150); } }

if (window.name!="frSheet")
window.location.replace("../工作簿1.htm");
else
fnUpdateTabs();
//-->

<![endif]>

</head>
psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 20 10
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 20 20
Development 开发 120 180
Analysis 需求分析(包括学习新技术) 20 10
Design Spec 生成设计文档 5 10
Design Review 设计复审 5 10
Coding Standard 代码规范 5 10
Design 具体设计 20 30
Coding 具体编码 60 80
Code Review 代码复审 10 10
Test 测试(自我测试,修改代码,提交修改) 5 20
Reporting 报告 7 10
Test Report 测试报告 5 10
Size Measurement 计算工作量 5 10
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 5 10
</body>

通过这次的ATM系统设计使我对于自己所掌握的知识有了新的理解与认知,使得我意识到了自己对于文件读写这一部分的理解依旧不够,需要进一步的学习加强。

posted @ 2020-11-18 09:31  编程不易  阅读(268)  评论(0)    收藏  举报