ATM管理系统

这个作业属于哪个课程 AHPU-软件工程导论
这个作业要求在哪里 个人作业三-ATM管理系统
这个作业的目标 编写一个ATM管理系统,并实现存款取款等功能
学号 3180701108

**

1.开户

/*开户函数*/
 
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);
}

2.查询账户余额

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");
}

3.取款

//银行取款函数
//
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("************************************\n");
    printf("**  1: 100元    *****    2:200元  **\n");
	printf("************************************\n");
    printf("**  3: 300元    *****    4:400元  **\n");
	printf("************************************\n");
    printf("**  5: 500元    *****    6:600元  **\n");
	printf("************************************\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");
			q->next=NULL;
			fclose(fp);    //关闭文件
		}
		
	}
}

4.存款


//银行存款函数
 
 
 
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("************************************\n");
    printf("**  1: 100元    *****    2:200元  **\n");
	printf("************************************\n");
    printf("**  3: 300元    *****    4:400元  **\n");
	printf("************************************\n");
    printf("**  5: 500元    *****    6:600元  **\n");
	printf("************************************\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");
	}
}
 
 
 

5.转账

//银行转账函数
/
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("************************************\n");
    printf("**  1: 100元    *****    2:200元  **\n");
	printf("************************************\n");
    printf("**  3: 300元    *****    4:400元  **\n");
	printf("************************************\n");
    printf("**  5: 500元    *****    6:600元  **\n");
	printf("************************************\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");
		}
	}
	}
}
 

6.销户

void shanchu(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;
		}
	}
}
 

7.菜单

//银行子菜单函数
/
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 menu()
{
	printf("****************欢迎来到建设银行取款机系统****************\n\n\n\n");
	printf("**************************************************\n");
	printf("**** 1 建立信息并显示  ******  2 卡号查询信息 ****\n");
	printf("**************************************************\n");
	printf("**** 3 姓名查询信息    ******  4 余额查询信息 ****\n");
	printf("**************************************************\n");
	printf("**** 5 删除某卡号信息  ******  6 增加新的用户 ****\n");
	printf("**************************************************\n");
	printf("**** 7 按余额降序输出  ******  8 输出         ****\n");
	printf("**************************************************\n");
	printf("**** 0 退出            ******    谢谢光临     ****\n");
	printf("**************************************************\n");
	printf("请选择您需要的业务\n\n");
}
 
 
 

8.运行截图

系统界面

系统子界面

开户

存款

取款

转账

销户

9.PSP表格

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

10.实验小结

本次设计的ATM管理系统简单的实现了我们日常生活中需要的开户、存款、取款等功能。还有许多不足需要完善。
posted @ 2020-11-17 23:40  好帅一头鱼  阅读(185)  评论(0编辑  收藏  举报