博客班级 AHPU软件工程
作业要求 ATM管理系统
作业目标 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11478
学号 3180701131
一.题目要求

作业目标

编写一个ATM管理系统,语言不限,要求应包括以下主要功能:
(1)开户,销户
(2)查询账户余额
(3)存款
(4)取款
(5)转账(一个账户转到另一个账户)等...
二. 代码

界面

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

FILE *fp1; 
              
struct users
{
    int num;
	char code[20];
    float money;
	int flag; //该账户是否存在,存在为true
}x[200];

void openaccount();
void cancleaccount();
void getmoney();
void savemoney();
void inquire();
void transfer();

//主函数,功能页面
void main()
{
	printf("welcome!\n");
	printf("\n");
	int t;
	do
	{
		printf("*********************ATM管理系统*******************\n");
		printf("\n");
		printf("                       1.开户 \n");
		printf("                       2.销户 \n");
		printf("                       3.查询账户余额 \n");
		printf("                       4.存款 \n");
    	printf("                       5.取款 \n");
	    printf("                       6.转账 \n");
		printf("                       0.退出系统 \n");
		printf("\n");
		printf("******************Designed by 吴山茶******************\n");
		printf("\n");
		printf("请选择功能:");
        scanf("%d",&t);
		system("cls");
		switch(t)
		{	case 1:openaccount();printf("\n");break;
		    case 2:cancleaccount();printf("\n");break;
			case 3:inquire();printf("\n");break;
			case 4:savemoney();printf("\n");break;
			case 5:getmoney();printf("\n");break;
			case 6:transfer();printf("\n");break;
			case 0:break;
			default:break; 
		}
	}while(t!=0);
	exit(0);
}

读出文件数据

int read()                                          
{
	FILE * fp;
	fp=fopen("D:\\users.txt","rb");                  /*用只读的方式打开文件*/
	if(fp==NULL)
	{
		printf("文件打开错误!\n");
		exit(1);
	}
	int n=0;
	do
	{
		fread(&x[n],sizeof(struct users),1,fp);  /*依次读出文件中结构体数组中每一个元素*/
		n++;
	}while(feof(fp)==0);                            /*指针指向末尾停止*/
	fclose(fp);
	return(n-1);                                      /*返回结构体数组的元素个数:i-1*/
}

保存x[i]的账户信息

void save(int k)                                                                                                                                               
{
	int i;
	FILE * fp;
	fp=fopen("D:\\users.txt","wb");                            /*重写的方式打开文件*/
	if(fp==NULL)
	{
		printf("文件打开错误!\n");                                    
		exit(1);
	}
	for(i=0;i<k;i++)                                            /*控制依次写入k个x[]元素*/
		if (fwrite(&x[i], sizeof (struct users),1,fp)==-1)   
			printf("保存失败\n");
	fclose(fp);
}
void openaccount(){
	srand((int)time(0)); 
	int i=read();
	char temp[20];
	x[i].num=rand()%10000+100000000;              /*设置随机种子,并保证每次种子不同,作为帐号*/                        
	printf("账号:%d\n",x[i].num);
	do
    {
        /*确认两次密码输入是否一致*/
        printf("\n\t\t密  码:");
        scanf("%s",x[i].code);
        printf("\n\t\t确认密码:");
        scanf("%s",temp);
        if(strcmp(x[i].code,temp)!=0)
        printf("\n\t\t两次密码不一致,请重新输入");
    }while(strcmp(x[i].code,temp)!=0);
	x[i].money=0;
	x[i].flag=1;
	save(i+1);                                       /*调入save(),将输入的账户信息续写在文件中*/
	printf("开户成功!\n");``
	system("pause");
}

销户操作

void cancleaccount()
{
	printf("请输入要销户的账号:");
	int i=read(),j,k,n;
	char temp[20];
	scanf("%d",&n);
	for(j=0;j<i;j++)                            /*由i控制依次检查文件中的x[]元素,找到所要查询的账号*/
		{
			if((x[j].num==n)&&(x[j].flag==1))
			{
				k=j;
				do
    {
        /*核验身份*/
        printf("\n\t\t密  码:");
        scanf("%s",temp);
        if(strcmp(x[k].code,temp)!=0)
        printf("\n\t\t密码错误,请重新输入");
    }while(strcmp(x[k].code,temp)!=0);

	printf("您是否确认注销该账户?\t 输入1为确认注销,输入0为不注销\n");
	int choice = 0;
	scanf("%d",&choice);
	if (choice == 1) {
		x[k].flag=0;   //flag标记为账户不存在
		printf("%d",x[k].flag);
		printf("销户成功!\n");
		save(i);
		printf("%d",x[k].flag);
		
	}
	else 
		printf("您已取消本次注销行为\n");
				break;
			}
			else
			{
				if(j==i-1)
				{
				printf("该账号不存在!\n");          
				break;
				}
			}
		}
	
	
	system("pause");
}
void cancleaccount()
{
	printf("请输入要销户的账号:");
	int i=read(),j,k,n;
	char temp[20];
	scanf("%d",&n);
	for(j=0;j<i;j++)                            /*由i控制依次检查文件中的x[]元素,找到所要查询的账号*/
		{
			if((x[j].num==n)&&(x[j].flag==1))
			{
				k=j;
				do
    {
        /*核验身份*/
        printf("\n\t\t密  码:");
        scanf("%s",temp);
        if(strcmp(x[k].code,temp)!=0)
        printf("\n\t\t密码错误,请重新输入");
    }while(strcmp(x[k].code,temp)!=0);

	printf("您是否确认注销该账户?\t 输入1为确认注销,输入0为不注销\n");
	int choice = 0;
	scanf("%d",&choice);
	if (choice == 1) {
		x[k].flag=0;   //flag标记为账户不存在
		printf("%d",x[k].flag);
		printf("销户成功!\n");
		save(i);
		printf("%d",x[k].flag);
		
	}
	else 
		printf("您已取消本次注销行为\n");
				break;
			}
			else
			{
				if(j==i-1)
				{
				printf("该账号不存在!\n");          
				break;
				}
			}
		}
	
	
	system("pause");
}

转账业务

void transfer()
{
	printf("请输入您的账号:");
	int i=read(),j,k,l,n,p,q;
	float m;
	char temp[20];
	scanf("%d",&n);
	for(j=0;j<i;j++)                            /*由i控制依次检查文件中的x[]元素,找到所要查询的账号*/
		{
			if(x[j].num==n&&x[j].flag==1)
			{
				k=j;
				do
				{
                /*核验身份*/
                 printf("\n\t\t密  码:");
                 scanf("%s",temp);
                 if(strcmp(x[k].code,temp)!=0)
                 printf("\n\t\t密码错误,请重新输入");
				}while(strcmp(x[k].code,temp)!=0);

        	    printf("请输入您要转入钱的账号:");
	            scanf("%d",&n);
			    for(p=0;p<i;p++)                            /*由i控制依次检查文件中的x[]元素,找到所要查询的账号*/
				{
		    	  if(x[p].num==n&&x[p].flag==1)
				  {
				    l=p;
				    printf("请输入您要转入的金额:");
				    scanf("%f",&m);
				    x[k].money-=m;
				    x[l].money+=m;
				    save(i);
			     	break;
				  }
		         else
				 {
					 if(p==i-1)
					{
				     printf("该账号不存在!\n");          
				     break;
					 }
				 }
				}
				break;
			}
			else
			{
				if(j==i-1)
					{
				     printf("该账号不存在!\n");          
				     break;
					 }
			}
	}
}

作业小结

(1)psp表格

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 120 80
Development 开发 100 150
Analysis 需求分析(包括学习新技术) 10 10
Design Spec 生成设计文档 30 40
Design Review 设计复审 5 10
Coding Standard 代码规范 6 6
Design 具体设计 10 12
Coding 具体编码 36 21
Code Review 代码复审 5 7
Test 测试(自我测试,修改代码,提交修改) 10 15
Reporting 报告 9 6
Test Report 测试报告 3 2
Size Measurement 计算工作量 2 1
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 3 3

(2)心得和经验

独立完成本次实验耗时较长,代码能力有待提高。