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