2021-05-22

用C语言实现银行管理系统


一、设计目的

本程序用于实现简单的银行储蓄系统操作功能。本程序运用链表将所有用户信息录入并写入文件,从而可从文件中直接调取所有用户信息。利用函数调用来解决银行的开户、查询、存款、取款、挂失、解除挂失、销户等功能。

二、总体设计

三、详细设计

所有功能函数如下:

struct bank_node *CreateDoc(int n);        

struct bank_node *InsertDoc(struct bank_node *head,int n);   /*开户*/     

void PrintDoc(struct bank_node * head); /*遍历*/

void Find(struct bank_node *head);/*查询账户信息*/

struct bank_node *Deposit(struct bank_node *head,  char str[]);/*存款*/

struct bank_node *Withdrawal(struct bank_node *head, char str[]);/*取款*/

struct bank_node * Modify1(struct bank_node * head,char str[])/*挂失*/

struct bank_node * Modify2(struct bank_node * head,char str[])/*取消挂失*/

struct bank_node * DeleteDoc(struct bank_node * head, struct bank_node *p6)/*销户*/

struct bank_node * Read()/*从文件读入数据*/

void Save(struct bank_node * head)/*保存数据到文件*/

开户:

       if(无账户信息){

              调用CreatDoc(n)函数创建用户信息;

}

else{

调用InsertDoc(head,n)把新用户信息插入原所创信息链表;

}
struct bank_node *CreateDoc(int n)

{

head=NULL;

while(x==1){

为指针p分配动态空间;

输入结点p中的各成员;

将结点p连接到链表的尾部;

p->next=NULL;

输入判断是否继续开户的变量x的新值;

}

返回head;

}

struct bank_node *InsertDoc(struct bank_node *head,int n)

{

while(x==1){

为指针p分配动态空间;

输入结点p中的各成员;

将结点p连接到链表的尾部;

p->next=NULL;

输入判断是否继续开户的变量x的新值;

}

返回head;

}

void PrintDoc(struct bank_node * head); /*遍历*/

{

if(链表为空)

无任何账户信息;

else{

for(中间指针变量ptr从链表头读起至链表尾结束){

       判断账户状态输出对应的各账户信息;

}

}

}

void Find(struct bank_node *head);/*查询账户信息*/

{

if(链表为空)

无账户信息;

       else{

for(中间指针变量ptr从链表头读起至链表尾结束){

       if(查到所查询的账号){

输入密码;

if(密码正确){

判断账户状态输出对应的账户信息;

}

else{

输出密码错误;

}

return;

}

}

if(没有查到所查询的账号)

输出“无账户信息”;

}

}
struct bank_node *Deposit(struct bank_node *head,  char str[]);/*存款*/

{

if(链表为空)

无账户信息;

else{

for(中间指针变量ptr从链表头读起至链表尾结束){

       if(ptr==NULL)   {

未找到账户信息;

return head;

}

       if(查到所查询的账号){

输入密码;

if(密码正确){

判断账户状态输出对应的账户状态;

if账户状态为挂失则不能进行存款操作;

else输入存款金额,保存新的账户信息并输出;

}

else{

输出密码错误;

}

}

}

}

return head;

}
struct bank_node *Withdrawal(struct bank_node *head, char str[]);/*取款*/

{

if(链表为空)

无账户信息;

else{

for(中间指针变量ptr从链表头读起至链表尾结束){

       if(ptr==NULL)   {

未找到账户信息;

return head;

}

       if(查到所查询的账号){

输入密码;

if(密码正确){

判断账户状态输出对应的账户状态;

if账户状态为挂失则不能进行取款操作;

else输入存款金额;

if所取金额是否大于余额,则不能进行取款操作;

else正常取款,保存新的账户信息并输出;

}

else{

输出密码错误;

}

}

}

}

return head;

}

struct bank_node * Modify1(struct bank_node * head,char str[])/*挂失*/

{

if(链表为空)

无账户信息;

else{

for(中间指针变量ptr从链表头读起至链表尾结束){

if(ptr==NULL)    {

未找到账户信息;

return head;

}

       if(查到所查询的账号){

输入密码;

if(密码正确){

判断账户状态输出对应的账户状态;

if账户状态为正常则进行挂失操作;

else不需再次进行挂失操作;

}

else{

输出密码错误;

}

}

}

}

return head;

}

struct bank_node * Modify2(struct bank_node * head,char str[])/*取消挂失*/

{

if(链表为空)

无账户信息;

else{

for(中间指针变量ptr从链表头读起至链表尾结束){

if(ptr==NULL)    {

未找到账户信息;

return head;

}

       if(查到所查询的账号){

输入密码;

if(密码正确){

判断账户状态输出对应的账户状态;

if账户状态为正常则无需进行解除挂失操作;

else进行解除挂失操作;

}

else{

输出密码错误;

}

}

}

}

return head;

}

struct bank_node * DeleteDoc(struct bank_node * head, struct bank_node *p6)/*销户*/

{

函数传递指针p6

定义指针ptr1,ptr2;

/*若删除表头节点*/

while(head!=NULL且strcmp(head->zhanghao,p6->zhanghao)==0))

{

              输入密码地址保存到指针p6

              if(头节点指向的密码与输出的密码相当)//代表密码正确

              {

                     if 头节点的money!=0

                     则代表该账户还有余额

                     直接返回头指针head;结束函数;

                     头指针赋给ptr2;

                     头指针指向下一个节点;

                     释放ptr2删除数据;

              }

               else{

                    密码错误返回头指针,结束函数;

               }

                    if(头为空)

              {

                     输出无账户信息

                     返回NULL;

              }

              头指针赋给ptr1

              下一个节点给ptr2

              while(ptr2等于NULL结束循环)

              {

                     输入密码存给p6

                     if(密码正确)

                     {

                            if余额如果不为0;

                            {

                            输出提示

                            返回头指针结束函数;

  • ·}

                            if(没有返回)

                            {

                                   ptr2的下一个节点给ptr1的下一个节点;

                                   释放ptr2删除数据

                                   返回头指针结束函数

                            }

                     }    

                     else提示密码错误

                     结束函数;

              }

              else

              ptr2后移一位;

              ptr1后移一位;

}

如果上面的没有结束函数说明无该账户

输出提示

结束函数

}

四、调试与测试

功能

测试目的

操作动作

是否与预期相同

开户

是否成功开户

按开户建创建

查询

是否进行查询

按查询键查询

存款

是否进行存款

按存款键存款

取款

是否进行取款

按取款键取款

挂失

是否挂失

按挂失键挂失

取消挂失

是否解除挂失

按取消挂失键取消挂失

销户

是否成功销户

按销户键销户



项目源码: 

成员1:

struct bank_node{
	char zhanghao[20];	/*账号*/ 
	char name[20];		/*户主姓名*/ 
	char mima[7];		/*密码*/ 
	double money;		/*余额*/ 
	int z;				/*状态(1:正常;0:挂失)*/
	struct bank_node *next; 
};
#include<stdio.h> 
#include<string.h>
#include<stdlib.h>
#include"成员二.cpp"

struct bank_node *CreateDoc(int n);		/*创建账户信息*/
struct bank_node *InsertDoc(struct bank_node *head,int n);/*插入账户信息*/	
void PrintDoc(struct bank_node * head); /*遍历*/
void Find(struct bank_node *head);/*查询账户信息*/
struct bank_node *Deposit(struct bank_node *head,  char str[]);/*存款*/
struct bank_node *Withdrawal(struct bank_node *head, char str[]);/*取款*/

int main(void)
{
	struct bank_node *head=NULL,*p,*p1,*p2,*p3,*p4,*p5,*p6;
	char zhanghao[20],mima[7];
	char name[20];
	char str1[20],str2[6];
	double money;
	int z,i=0,n;
	int choice;
	int size=sizeof(struct bank_node);
	printf("题目:银行储蓄系统\n");
	printf("成员1:***\n");
	printf("成员2:***\n");	
	printf("______________________________\n") ;
	printf("------------------------------\n") ;

	do{
		printf("------------------------------------------------------------------------------\n") ;
		printf("<1>: 开户  <2>:显示所有账户信息  <3>:查询账户信息  <4>:存款  <5>:取款 \n<6>:挂失  <7>:解除挂失  <8>:销户  <9>: 从文件读入数据  <10>: 保存数据到文件\n<0>:退出\n");
		printf("------------------------------------------------------------------------------\n") ;
		printf("请输入要办理的业务序号:");
		scanf("%d",&choice);
		switch(choice){
			case 1:
				printf("如若开户请输入 1,结束开户请输入 0\n");
				scanf("%d",&n);
				if(head==NULL){
					head=CreateDoc(n);
				}
				else{
					head=InsertDoc(head,n);
				}
				break;
			case 2:
				PrintDoc(head);
			 	break;
			case 3:
				Find(head);
				break;
			case 4:
				printf("请输入帐号:");
				scanf("%s",str1);
				
				head=Deposit(head,str1);
				break;
			case 5:
				printf("请输入帐号:");
				scanf("%s",str1);
			
				head=Withdrawal(head,str1);
				break;
			case 6:
				printf("请输入您的账号:\n");
            	scanf("%s", str1);
           	 	head=Modify1(head,str1);
            	break;
            case 7:
            	printf("请输入您的账号:\n");
            	scanf("%s", str1);
            	head=Modify2(head,str1);
            	break;
             case 8:
            	p6=(struct bank_node *)malloc(size);
            	printf("请输入您的账号:\n");
            	scanf("%s", p6->zhanghao);
            	head=DeleteDoc(head,p6);
            	break;

            case 9:
         		head=Read();
         		break;
        	case 10:
        		Save(head);
         		break;
			case 0:
				printf("\n欢迎下次使用!\n");
				break;
				
		}
	}while(choice!=0);
	
}

struct bank_node *CreateDoc(int n)		/*创建账户信息*/
{
	struct bank_node *head=NULL,*p,*ptr;
	char zhanghao[20],mima[7];
	 
	char name[10];
	double money;
	int z,x;
	int size=sizeof(struct bank_node);
	head=ptr=NULL;
	x=n;
	while(x==1) {
		p=(struct bank_node *)malloc(size);
		printf("请输入账号:");
		scanf("%s",p->zhanghao);
		printf("请输入户主姓名:");
		scanf("%s",p->name);
		printf("请输入密码:");
		scanf("%s",p->mima);
		p->money=0.00;
		printf("余额:%.2lf\n",p->money);
		p->z=1;
		printf("状态:正常\n");
		p->next=NULL;
		if(head==NULL){			/*根据输入顺序创建链表*/
			head=p;				
			head->next=NULL;
		}
		else{					
			ptr->next=p;
		}
		ptr=p;
		
		printf("若继续开户请输入 1,结束开户请输入 0\n");
		scanf("%d",&x);
	}
	return head;
}
struct bank_node *InsertDoc(struct bank_node *head,int n)/*插入账户信息*/
{
	struct bank_node *p,*ptr1,*ptr2;
	char zhanghao[20],mima[7];
	 
	char name[10];
	double money;
	int z,x;
	int size=sizeof(struct bank_node);
	ptr2=head;
	x=n;
	while(x==1){
		while(ptr2->next!=NULL){
			ptr1=ptr2;
			ptr2=ptr2->next;
		}
		p=(struct bank_node *)malloc(size);
		printf("请输入账号:");
		scanf("%s",p->zhanghao);
		printf("请输入户主姓名:");
		scanf("%s",p->name);
		printf("请输入密码:");
		scanf("%s",p->mima);
		p->money=0.00;
		printf("余额:%.2lf\n",p->money);
		p->z=1;
		printf("状态:正常\n");
		
		ptr2->next=p;
		p->next=NULL;
		printf("若继续开户请输入 1,结束开户请输入 0\n");
		scanf("%d",&x);
	}
	return head;
}


void PrintDoc(struct bank_node * head)
{
	struct bank_node * ptr;
	
    if(head == NULL){
        printf("\n无账户信息\n");
        return;
    }
    printf("\n所有帐户的信息为:\n");
    for(ptr = head; ptr != NULL; ptr = ptr->next)
    { 
    	if(ptr->z==1) 
    	{
    		printf("账号:%s\t姓名:%s\t余额:%.2lf\t账户状态:正常 \n", ptr->zhanghao, ptr->name, ptr->money);	
		}
      	else
      	{
      		printf("账号:%s\t姓名:%s\t余额:%.2lf\t账户状态:挂失 \n", ptr->zhanghao, ptr->name, ptr->money);
		}
    } 
} 	
	
void Find(struct bank_node *head)/*查询账户信息*/
{
	struct bank_node *ptr;
	char str1[20],str2[7];
	printf("请输入帐号:");
	scanf("%s",str1);
	if(head == NULL){
       printf("\n无账户信息\n");
    	return;
    }
	else{
		for(ptr=head;ptr!=NULL;ptr=ptr->next){
			if(strcmp(str1,ptr->zhanghao)==0){
				printf("请输入密码:");
				scanf("%s",str2);
				if(strcmp(str2,ptr->mima)==0){
					printf("您所查询的账户信息如下: \n");
					if(ptr->z==1)
					{
						printf("账号:%s\t姓名:%s\t余额:%.2lf\t账户状态:正常 \n", ptr->zhanghao, ptr->name, ptr->money);	
					}
					else{
						printf("账号:%s\t姓名:%s\t余额:%.2lf\t账户状态:挂失 \n", ptr->zhanghao, ptr->name, ptr->money);
					} 
				}
				else{
					printf("密码错误\n");
				}
				return;
			}
		}
		if(ptr==NULL){
			printf("\n无账户信息\n");
		} 
	}
	str1[0]='\0';
	str2[0]='\0';
}	


struct bank_node *Deposit(struct bank_node *head, char str[])/*存款*/
{
	struct bank_node *ptr;
	char str2[7];
	double money;
//	printf("账号:%s\t姓名:%s\t余额:%.2lf\t账户状态:正常 \n", p->zhanghao, p->name, p->money);
		
	if(head==NULL){
		printf("无账户信息\n");
	}
	else{
		for(ptr=head;ptr!=NULL;ptr=ptr->next)
			if(strcmp(ptr->zhanghao,str)==0)
				break;
		if(ptr==NULL){
			printf("\n无账户信息\n");
			return head;
		} 
		printf("请输入密码:");
		scanf("%s",str2);	
		if(strcmp(ptr->mima,str2)==0){
			if(ptr->z==0){
				printf("您的账户处于挂失状态,不能进行存款操作\n");
				return head;
			}
			printf("请输入所存金额:");
			scanf("%lf",&money);
			ptr->money=ptr->money+money;
			printf("账号:%s\t姓名:%s\t余额:%.2lf\t账户状态:正常 \n", ptr->zhanghao, ptr->name, ptr->money);	
		}
		else{
			printf("密码错误\n");
		}
		return head;
	}
}

struct bank_node *Withdrawal(struct bank_node *head, char str[])/*取款*/
{
	struct bank_node *ptr;
	char str2[7];
	double money;
//	printf("账号:%s\t姓名:%s\t余额:%.2lf\t账户状态:正常 \n", p->zhanghao, p->name, p->money);
		
	if(head==NULL){
		printf("无账户信息\n");
	}
	else{
		for(ptr=head;ptr!=NULL;ptr=ptr->next)
			if(strcmp(ptr->zhanghao,str)==0)
				break;
		if(ptr==NULL){
			printf("\n无账户信息\n");
			return head;
		} 
		printf("请输入密码:");
		scanf("%s",str2);
		if(strcmp(ptr->mima,str2)==0){
			if(ptr->z==0){
				printf("您的账户处于挂失状态,不能进行取款操作\n");
				return head;
			}
			printf("请输入所取金额:");
			scanf("%lf",&money);
			if(ptr->money<money||ptr->money==0){
				printf("\n余额不足,取款操作失败\n");
				return head;
			}
			ptr->money=ptr->money-money;
			printf("账号:%s\t姓名:%s\t余额:%.2lf\t账户状态:正常 \n", ptr->zhanghao, ptr->name, ptr->money);	
		}
		else{
			printf("密码错误\n");
		}
		return head;
	}
}	

成员2:

/*6*/struct bank_node * Modify1(struct bank_node * head,char str[])/*挂失6*/ 
{
	struct bank_node *ptr;
	char str2[7];
	if(head==NULL)
	{
		printf("\n无账户信息\n");
		return NULL;
	}
	else{
		for(ptr=head;ptr!=NULL;ptr=ptr->next)
			if(strcmp(ptr->zhanghao,str)==0)
			{
				break;
			}
		if(ptr==NULL){
			printf("\n无账户信息\n");
			return head;
		} 
		printf("请输入密码:");
		scanf("%s",str2);	
		if(strcmp(ptr->mima,str2)==0)
		{
			if(ptr->z==1)
			{
				ptr->z=0;
				printf("\n您的账户已经成功挂失\n"); 
				return head;
			}
			else{
				printf("您的账户已经挂失,无需再次挂失\n");
			}
			
		}
		else
		{
			printf("\n密码错误请重新进入界面选择并输入\n");
		//	return head;
		}
	
/*		if(ptr!=NULL)
		{
			ptr->z=0;
			printf("您的账户已经成功挂失\n");
		}*/
		
		return head;
	}
}	
struct bank_node * Modify2(struct bank_node * head,char str[])/*取消挂失*/ 
{
	struct bank_node *ptr;
	char str2[7];
	if(head==NULL)
		{
			printf("\n无账户信息\n");
			return NULL;
		}
	else{
		for(ptr=head;ptr!=NULL;ptr=ptr->next)
			if(strcmp(ptr->zhanghao,str)==0)
			{
				break;
			}
		if(ptr==NULL){
			printf("\n无账户信息\n");
			return head;
		} 
		printf("请输入密码:");
		scanf("%s",str2);
		if(strcmp(ptr->mima,str2)==0)
		{
			if(ptr->z==1)
			{
				printf("\n您的账户状态为正常无需取消挂失\n"); 
				return head;
			}
			else{
				ptr->z=1;
				printf("您的账户已经成功取消挂失,可以正常使用\n");
			}
		}
		else
		{
			printf("密码错误请重新进入界面选择并输入\n");
		//	return head;
		}
			
	
	/*	if(ptr!=NULL)
			{
				ptr->z=1;
				printf("您的账户已经成功取消挂失,可以正常使用\n");
			}
		else
			printf("\n没有找到该用户\n");
	*/		
		return head;
	}
}
struct bank_node * DeleteDoc(struct bank_node * head, struct bank_node *p6)/*销户*/  
{ 
    struct bank_node *ptr1,*ptr2;
	/*被删除的是表头节点*/
	while(head!=NULL&&strcmp(head->zhanghao,p6->zhanghao)==0){
				printf("请输入您的密码:\n");
            	scanf("%s", p6->mima);
		if(strcmp(head->mima,p6->mima)==0) 
		{
			if(head->money!=0)
			{
				printf("您的账户还有余额,不能进行销户操作\n");
				return head;
			 } 
			ptr2=head;
			head=head->next;
			free(ptr2);
		}
		else{
			printf("您的密码错误\n");
			return head; 
		}
	} 
	if(head==NULL)/*要被删除的为非表头节点*/ 
	{
		printf("\n无账户信息\n"); 
		return NULL;
	}
	ptr1=head;
	ptr2=head->next;/*从表头的下一个节点搜素所有符合删除要求的节点*/ 
	while(ptr2!=NULL){
		if(strcmp(ptr2->zhanghao,p6->zhanghao)==0)/*ptr2所指节点符合删除要求*/ 
		{
			printf("请输入您的密码:\n");
            	scanf("%s", p6->mima);
			if(strcmp(p6->mima,ptr2->mima)==0)
			{
				if(ptr2->money!=0)
			{
				printf("您的账户还有余额\n");
				return head;
			 } 
				ptr1->next=ptr2->next;
				free(ptr2);
				printf("操作成功\n");
				return head;
			}
			else{
				printf("密码错误\n");
			 	return head;
				}	
		}
		else
			{
				
				ptr1=ptr2;
			}
		ptr2=ptr1->next;
	}
	printf("无账户信息\n");
	return head;
}
struct bank_node * Read()/*从文件读入数据*/
{
	FILE *fp;
	struct bank_node * head,*tail,*p;
    int size = sizeof(struct bank_node);
    head =tail= NULL;
	if((fp=fopen("Bank.txt","r")) == NULL){	 
   	     printf("File open error!\n"); 
         exit(0);
	}
    while(!feof(fp)){	/* 读到文件尾结束 */ 
       	p = (struct bank_node *) malloc(size);
       	fscanf(fp,"%s %s %s %lf %d", p->zhanghao, p->name, p->mima,&p->money,&p->z);
       	p->next = NULL;
    	if(head == NULL) 
        	head = p;
		else  
        	tail->next = p;
    	tail = p;
   }
	if( fclose(fp) ){
    	printf( "Can not close the file!\n" );
    	exit(0);
	}
	return head;
}

void Save(struct bank_node * head)/*保存数据到文件*/
{
	FILE *fp;
	if((fp=fopen("Bank.txt","w")) == NULL){	 
   	     printf("File open error!\n"); 
         exit(0);
	 }

	struct bank_node * ptr;
	
    if(head == NULL){
        return;
    }
    
    for(ptr = head; ptr->next != NULL; ptr = ptr->next)
      	fprintf(fp,"%s %s %s %lf %d\n", ptr->zhanghao, ptr->name, ptr->mima,ptr->money,ptr->z);
      	
    fprintf(fp,"%s %s %s %lf %d", ptr->zhanghao, ptr->name, ptr->mima,ptr->money,ptr->z);
    
    if( fclose(fp) ){
    	printf( "Can not close the file!\n" );
    	exit(0);
	}
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值