湖北汽车工业学院电气与信息工程学院
《C语言程序设计》
实训报告
实训题目: 银行账户信息管理系统
专业: 计算机科学与技术 班级: T923-1 姓名: 杨泽华 李少光 成绩:
一、需求分析
1、问题
根据需求,该系统所应包含的信息有以下一些:
银行账户的基本信息:
编号、客户姓名、客户地址、客户电话、账户总金额(最开始为0)。
共有5个客户。
根据需求,该系统所应实现的功能有以下一些:
1) 存款:输入客户编号、存款金额、存款日期,完成存款功能。
2) 取款:输入客户编号、存款金额、取款日期,完成取款功能。
3) 查询指定客户的余额
4) 查询指定客户的存款记录
5) 查询指定客户的取款记录
2、系统
采用C语言实现,开发环境为VC,可以运行在操作系统windows98及以上皆可。
3、运行要求
能不受限制的录入银行账户信息
界面友好,操作方便,例如输入日期前需要提示用户日期格式
容错性强,例如输入日期格式不合法时,需要提示用户。
二、总体设计
1、系统流程设计
根据系统要求,设计如下的系统流程
2、系统模块设计
根据系统的功能设计,如下模块
主界面模块:完成系统菜单的显示
功能选择模块:根据用户的选择,完成其相应的功能
银行客户存款:完成用户从界面输入存款信息,在系统中查询定位,并将存
款金额累加到账户总金额的功能。
银行客户取款:完成用户从界面输入取款信息,在系统中查询定位,并将从
账户总金额减去取款金额。
指定客户余额查询:完成用户从界面输入查询条件,在系统查询符合条件的
银行账户信息,并在界面上显示的功能。
指定客户的存款记录查询:完成用户从界面输入查询条件,在系统查询符合
条件的存款记录链表,并在界面上显示的功能。
指定客户的取款记录查询:完成用户从界面输入查询条件,在系统查询符合
条件的取款记录链表,并在界面上显示的功能。
三、详细设计 1、数据结构设计
根据系统要求,系统中需要保存的数据有银行客户的信息,其结构如下:
同时为了便于查询,还应建立一个存取款记录,主要包括日期格式的合法性使用C语言创建的结构体如下:
struct Date{/*定义日期结构体*/
char year[5];
char month[3];
char day[3];
};
struct record{/*定义存取记录链表*/
int num;
struct Date crt;
int flag;
float change;
struct record *next;
};
struct client{/*定义客户结构体*/
int num;
char name[20];
char add[100];
char tel[20];
float sum;
};2、界面设计
主界面:
根据系统要求,设计一个字符界面,显示系统的菜单,为了体现友好性,将在每个菜单前显示该菜单项对应的数字
用户输入菜单项前面的数字,主菜单消失,进入该模块的相应界面,进行相应的操作,完成后,回到主界面。
输入界面:
存款界面:
取款界面:
查询界面:
略
3、模块实现
主界面实现:调用printf()函数,在屏幕上打印需要显示的字符信息。
功能选择模块实现:
接受从键盘输入的菜单选择,判断并调用相应的功能函数,完成其对应的功能。实现功能选择。
对应的函数:
A.客户存款模块实现此时(flag=1)::
模块说明:从键盘接收输入的客户编号,遍历链表,判断节点的编号是否与输入的编号相等,如果相等,从键盘输入存款金额和存款日期的信息,在该过程中需判断存款金额是否大于0,且存款日期是否合法(包括格式(YYYY-MM-DD)和是否是闰年(调用函数judge(year,month,day)),保存在该节点中。
{
if (month>=1 && month<=12 && day>=1 && day<=31){
if(month==2){
if (year%400==0 || year%100!=0 && year%4==0){/*闰年二月日期判断*/
if(day<=29)
return 1;
else
return 0;
}
else{/*非闰年二月日期判断*/
if(day<=28)
return 1;
else
return 0;
}
}
Else
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
if(day<=31)
return 1;
else
return 0;
}
else
if(day<=30)
return 1;
else
return 0;
}
else return 0;
}
对应函数:search_rcd(head,flag)
B.客户取款模块实现(此时flag=-1):
与存款类似
对应函数:search_rcd(head,flag);
C. 客户查询余额模块实现:
模块说明:根据从键盘接收到的客户编号,遍历链表,判断节点的编号是否与输入的编号相等,如果相等,则在屏上显示客户的账上余额。
对应程序:
printf("请输入客户编号:");
scanf("%d",&num);
if(num<=0 || num>5){
printf("无此客户\n");
system("pause");
break;
}
for(i=0;i<5;i++){/*判断指定用户*/
if(cli[i].num==num)
printf("该客户余额为 %.2f元\n",cli[i].sum);
}
system("pause");
break;
D.客户查询取款记录模块实现:
模块说明:根据从键盘接收到的客户编号,遍历链表,判断节点的编号是否与输入的编号相等,如果相等,则在屏上显示客户的取款金额和日期及账上余额。
模块流程:
对应函数:search_rcd(head,flag);
E.客户查询取款记录模块实现:
模块说明:根据从键盘接收到的客户编号,遍历链表,判断节点的编号是否与输入的编号相等,如果相等,则在屏上显示客户的存款金额和日期记账上余额。
模块流程:
对应函数: search_rcd(head,flag);
实训总结:
本学期实训课与c语言课相结合,以上机实验操作为主,加深了我对C语言的理解和运用能力,帮助我解决了许多C语言学习时遇到的问题。通过在学习时遇到的问题查找资料使我接触和了解了更多课本以外的知识。特别是最后的大实训,和同学明确分工合作,最终完成了任务。让我认识到合作的重要性,同时还
得出一个结论:知识必须通过应用才能实现其价值!有些东西以为学会了,但真正到用的时候才发现是两回事,所以我认为只有到真正会用的时候才是真的学会了。
实训感想:
该程序的亮点是运用结构体判断日期是否合法时,拆分日期字符串,并存入日期结构体以及将结构体字符变量转变为整型。
不足之处是程序可能存在漏洞,界面设计还不够十分完美!
C程序源代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Date{/*定义日期结构体*/
char year[5];
char month[3];
char day[3];
};
struct record{/*定义存取记录链表*/
int num;
struct Date crt;
int flag;
float change;
struct record *next;
};
struct client{/*定义客户结构体*/
int num;
char name[20];
char add[100];
char tel[20];
float sum;
};
struct client cli[5]={/*定义5个客户*/
{1,"赵","汽院","134xxxxxxxx",0},
{2,"钱","张湾","134xxxxxxxx",0},
{3,"孙","红卫","134xxxxxxxx",0},
{4,"李","五堰","134xxxxxxxx",0},
{5,"周","六堰","134xxxxxxxx",0}
};
struct record * update(struct record *head,struct record *rcd);/*
声明存取功能函数*/
void search_rcd(struct record *head,int flag);/*声明记录查询函数*/ int judge(int year,int month,int day);/*声明日期范围判断函数*/
void main()
{
struct record *rcd,*head;/*定义链表头和插入链表*/
int choice,flag;/*定义变量*/
int num,i;
int year,month,day;
float change;
int size=sizeof(struct record);
char *date=(char *)malloc(sizeof(char));
head=NULL;
do{
system("cls");/*清屏*/
printf("**************银行账户信息管理菜单*************\n"); printf("* 1:客户存款服务 *\n");
printf("* 2.客户取款服务 *\n"); printf("* 3.查询指定客户的余额 *\n"); printf("* 4.查询指定客户的存款记录 *\n"); printf("* 5.查询指定客户的取款记录 *\n"); printf("* 0.退出 *\n"); printf("*客户信息: *\n"); printf("* 编号 姓名 地址 联系方式 *\n"); printf("* 1 赵 汽院 134xxxxxxxx *\n"); printf("* 2 钱 张湾 134xxxxxxxx *\n"); printf("* 3 孙 红卫 134xxxxxxxx *\n"); printf("* 4 李 五堰 134xxxxxxxx *\n"); printf("* 5 周 六堰 134xxxxxxxx *\n"); printf("***********************************************\n"); printf("请选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:
rcd=(struct record *) malloc(size);
rcd->flag=1;/*存款标识*/
printf("请输入账户编号:");
scanf("%d",&num);
if(num<=0 || num>5){
printf("无此客户\n");
system("pause");
break;
}
printf("请输入存款金额:");
scanf("%f",&change);
printf("请输入存款日期:");
scanf("%s",date);
rcd->num=num;
rcd->change=change;
sscanf(date,"%[^-]-%[^-]-%s",rcd->crt.year,rcd->crt.month,rcd->cr t.day); /*拆分日期字符串,并存入日期结构体*/
year=atoi(rcd->crt.year);/*将结构体字符变量转变为整型*/
month=atoi(rcd->crt.month);
day=atoi(rcd->crt.day);
if(judge(year,month,day)==0||*(date+4)!='-'|| *(date+7)!='-'
|| strlen(date)!=10)/*判断日期格式*/
printf("您输入的日期不合法\n");
head=update(head,rcd);/*调用存取功能函数*/
system("pause");
break;
case 2:
rcd=(struct record *) malloc(size);
rcd->flag=-1;/*取款标识*/
printf("请输入账户编号:");
scanf("%d",&num);
if(num<=0 || num>5){
printf("无此客户\n");
system("pause");
break;
}
printf("请输入取款金额:");
scanf("%f",&change);
printf("请输入取款日期:");
scanf("%s",date);
rcd->num=num;
rcd->change=change;
sscanf(date,"%[^-]-%[^-]-%s",rcd->crt.year,rcd->crt.month,rcd->cr
t.day);/*拆分日期字符串,并存入日期结构体*/
year=atoi(rcd->crt.year);/*将结构体字符变量转变为整型*/
month=atoi(rcd->crt.month);
day=atoi(rcd->crt.day);
if(judge(year,month,day)==0 || *(date+4)!='-'|| *(date+7)!='-' ||
strlen(date)!=10)/*判断日期格式*/
printf("日期不合法!\n");
head=update(head,rcd);/*调用存取功能函数*/
system("pause");
break;
case 3:
printf("请输入客户编号:");
scanf("%d",&num);
if(num<=0 || num>5){
printf("无此客户\n");
system("pause");
break;
}
for(i=0;i<5;i++){/*判断指定用户*/
if(cli[i].num==num)
printf("该客户余额为 %.2f元\n",cli[i].sum); }
system("pause");
break;
case 4:
flag=1;/*存款标识*/
search_rcd(head,flag);/*调用记录查询函数*/
system("pause");
break;
case 5:
flag=-1;/*取款标识*/
search_rcd(head,flag);/*调用记录查询函数*/
system("pause");
break;
case 0:
break;/*退出程序*/
}
}while(choice!=0);
}
struct record * update(struct record *head,struct record *rcd) {
struct record *p1,*ptr;
int i;
p1=head;
ptr=rcd;
switch(ptr->flag){/*改变总金额*/
case 1:
for(i=0;i<5;i++){
if(cli[i].num==ptr->num)
cli[i].sum+=ptr->change;
}
break;
case -1:
for(i=0;i<5;i++){
if(cli[i].num==ptr->num){
if(cli[i].sum<ptr->change){
printf("余额不足,该操作无法进行!\n"); return head;
}
else
cli[i].sum-=ptr->change;
}
}
}
if(head==NULL){/*链表为空时,插入记录*/
head=ptr;
head->next=NULL;
}
else{/*链表不为空时,插入记录*/
while(p1->next!=NULL){
p1=p1->next;
}
p1->next=ptr;
ptr->next=NULL;
}
return head;
}
void search_rcd(struct record *head,int flag)
{
struct record *ptr;
int num;
if(head==NULL){/*空链表*/
printf("没有记录\n");
return;
}
else{
printf("请输入客户编号:");
scanf("%d",&num);
if(num<=0 || num>5){
printf("无此客户\n");
}
else{
printf("存取金额 操作日期\n"); for(ptr=head;ptr;ptr=ptr->next){/*遍历链表*/
if(ptr->num==num&&ptr->flag==flag)
/*flag=1时输出存款记录,flag=-1时输出取款记录*/
printf("%.2f %s-%s-%s\n",ptr->change,ptr->crt.year,ptr->crt.month,ptr->crt.day);
}
}
}
}
int judge(int year,int month,int day)
{
if (month>=1 && month<=12 && day>=1 && day<=31){
if(month==2){
if (year%400==0 || year%100!=0 && year%4==0){/*闰年二月日期判断*/
if(day<=29) return 1;
else return 0;
}
else{/*非闰年二月日期判断*/
if(day<=28)
return 1;
else
return 0;
}
}
else
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
if(day<=31)
return 1;
else
return 0;
}
else
if(day<=30)
return 1;
else
return 0;
}
else return 0;
}
资金及银行账户管理自查报告根据重庆市国有资产监督管理委员会关于的通知文件精神要求公司领导高度重视成立自查自纠领导小组召开会议讲解文…
银行结算账户自查报告为了加强银行结算帐户管理工作维护支付结算的正常秩序按照办事处转发人民币银行结算账户管理办法实施细则和人民币银行…
为规范我行人民币支付结算、票据业务、支付系统运行和账户管理工作,根据《关于开展支付结算管理和支付系统运行情况自查的通知》的文件要求…
银行结算账户自查报告为了加强银行结算帐户管理工作,维护支付结算的正常秩序,按照办事处《转发〈人民币银行结算账户管理办法实施细则〉和…
账户管理自查报告市分行根据上级行要求我行对账户管理进行了认真自查现将自查情况报告如下一账户管理情况我行严格按照人民币银行结算账户管…
单位银行结算账户管理协议甲方(信用社)全称:乙方(存款人)全称:根据《人民币银行结算账户管理办法》和乙方提出的申请,甲方同意为乙方…
银行账户管理与反洗钱洗钱犯罪活动造成资金流动的无规律性,直接影响了金融市场的稳定,随着我国金融市场上衍生产品的日益更新,各类洗钱活…
银行结算账户管理中存在的问题和建议人民币银行结算账户管理是支付结算管理的一项重要内容加强账户管理对促进社会信用维护经济金融秩序防范…
浅谈银行账户管理中存在的问题及建议杜兴星作者单位辽宁省朝阳市龙城区农村信用合作联社银行账户管理包括银行账户的开立使用和撤销涵盖了单…