个人作业三-ATM管理系统

ATM管理系统

博客班级 软件工程导论-计算机18级
作业要求 作业要求
作业目标 通过ATM项目熟悉软件开发的流程
学号 3180701342
作业要求
编写一个ATM管理系统,语言不限,要求应包括以下主要功能:

(1)开户,销户

(2)查询账户余额

(3)存款

(4)取款

(5)转账(一个账户转到另一个账户)等...

允许网上查询参考,但请注意不要直接抄袭,可以理解看懂别人的代码,再自己编写

(4)举例分析流程图与活动图的联系

请同学们认真完成作业,每一部分给出完整流畅的语言描述,必要时可添加图表内容帮助理解。

开户函数

  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 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("  ***欢迎来都建设银行***\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 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);    //关闭文件
  		}
	
  	}
  }

转账

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

查询

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

运行截图

开户

取款

存款

转账

查询余额

个人小结

psp耗时表

psp2.1 任务内容 计划完成需要的时间 (min) 实际完成需要的时间
Planning 计划 10
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 15 20
Development 开发 120 480
Analysis 需求分析(包括学习新技术) 15 15
Design Spec 生成设计文档 10 10
Design Review 设计复审 5 5
Coding Standard 代码规范 5 3
Design 具体设计 10 12
Coding 具体编码 60 70
Code Review 代码复审 5 7
Test 测试(自我测试,修改代码,提交修改) 10 15
Reporting 报告 15 15
Test Report 计算工作量 2 1
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 3 3
posted @ 2020-11-18 22:36  潘韵帆  阅读(102)  评论(0)    收藏  举报