程序设计能力实践I
课程实践报告
选题:银行业务模拟系统
功能。
使用C语言实现一个银行业务模拟程序,实现存取款等基本业务的模拟。选题者需要首先进行需求调研,了解银行的主要业务及形式,完成相关业务梳理及程序设计实现。最终实现的银行业务模拟系统需要覆盖以下基本功能:
实现新开账户功能
说明:用户提供姓名、性别、身份证号、联系电话、住址、初始密码等基本信息实现新账户的开设(需自动生成账户号、用户ID(若首次开设账户))。
用户登录
输入账户号和密码实现登录功能,成功登录后进入主业务界面(需要注意多次密码失败的处理)。
退卡
退出当前登录状态,返回欢迎主界面(该页面为未登录时的呈现页面,如可以显示新开账户、登录等功能)。
账户余额查询
登录状态下查看账户余额信息。
存款
登录状态下执行存款操作(模拟该功能通过输入存款数模拟存款业务)。
取款
登录状态下执行取款操作。
交易明细查询
登录状态下查询当前账户在指定时间范围内的业务记录(因此,最少需要实现以上存款、取款业务日志)。
持久化
本系统需要支持数据持久化,即系统数据需要进行永久存储,程序重启后能实现数据的自动加载。系统数据持久化通常通过数据库进行实现,考虑到当前掌握知识情况,持久化可通过文件进行实现,即所有业务数据需要与存储文件进行同步。
问题分析。
实现账户登录,以及记录账户信息需要利用结构体;
需求较多要在总体设计中确定模块结构、划分功能模块,将软件功能 需求分配给所划分的最单元模块。确定模块间的联系,确定数据结构、文 件结构、确定测试方法与策略;
日志用机构体保存每条记录,最后放在一个日志文件中。
持久化借助文件。
总体设计方案
一.结构体
定义一个用户信息的结构体
定义一个日志信息的结构体
二.各模块的功能和实现
1.菜单模块:显示用户管理系统的主菜单,供用户选择所需的功能,通过自己定义的menu函数来实现。
新开户模块:输入用户的姓名以及其它的一些用户的相关信息,通过自己定义的add函数来实现。
文件模块:将内存中用户的信息输出到磁盘文件中,或者将磁盘文件读到内存可以通过自己定义的save函数与load函数来实现。
浏览模块:浏览所有用户的相关信息,通过自己定义的display函数来实现。
用户功能模块:对用户登录状态下功能的控制,通过自己定义account_fun的函数来实现。
6.登录模块:输入需要用户的账号密码进行登录,通过自己定义chick的函数来实现。
存取款模块:通过存取款可以修改账户余额,通过自己定义deposit和draw的函数来实现。
日志模块:可以记录用户的存取款信息,通过自己定义的log函数来实现。
也可以进行日志信息查询,通过自己定义的log1函数来实现。
查询模块:searh函数实现
10.主函数控制。
使用说明及运行实例
1.运行程序,进入银行业务模拟系统的主菜单:
2.输入数字“1”进行新开账户:
(账号自行生成)
输入“2”进行登录:
(三次退出)
5.正确后进入主业务界面
6.输入“1”进行查询:
输入“2”进行存款:
输入“3”进行取款:
金额错误判断
金额不够判断
输入”4”交易明细查询。(存款取款日志)
10.数据会保存在文件中,可供下次查看
详细代码如下:
#include<stdio.h>
#include <windows.h>
#include <string.h>
#include<stdlib.h>
#include<time.h>
struct node{
int id_account;//账户号
char name[10];
char sex[4];
char id_card[19];
char phone[12];//电话
char address[50];
char pass[10];//密码
float Balance;
}account[1000];//起名为account
struct node2{
int id_account;
int mm;
float Balance;
int year;
int month;
int day;
int hour;
int min;
int sec;
}Log[500];
void menu1();
void add();
void menu2();
int load();
void save(int);
void chick();
void display();
void account_fun(int);
void searh(int);
void deposit(int);
void log(int,int,float);
void draw(int);
void save1(int);
int load1();
int main();
int main()
{
int n;
while(1)
{
menu1();
scanf("%d",&n);
switch(n)
{
case 1:add();break;
case 2:chick();break;
case 0:exit(0);break;
default:printf("您输入有误,请重新选择!\n");break;
}
}
return 0;
}
void searh(int index)
{
load();
printf("您的余额为%f\n",account[index].Balance);
}
void deposit(int index)
{
int m = load();
while(1)
{
int m1;
printf("请输入存款金额: ");
scanf("%d",&m1);
if(m1<0)
printf("金额错误\n");
else
{
account[index].Balance+=m1;
log(index,1,m1);
save(m);
display();
break;
}
}
}
void draw(int index)
{
int m = load();
while(1)
{
int m2;
printf("请输入取款金额: ");
scanf("%d",&m2);
if(m2<0)
printf("金额错误\n");
else if(m2>account[index].Balance)
{
printf("抱歉余额不足!!!\n");
}else
{
account[index].Balance-=m2;
log(index,2,m2);
save(m);
display();
break;
}
}
}
void log(int index,int mm,float Balance)
{
static int j=0;
time_t timep;
time(&timep);
struct tm *p=gmtime(&timep);
Log[j].id_account=account[index].id_account;
Log[j].mm=mm;
Log[j].year=1900+p->tm_year;
Log[j].month=1+p->tm_mon;
Log[j].day=p->tm_mday;
Log[j].hour=(8+p->tm_hour)%24;
Log[j].min=p->tm_min;
Log[j].sec=p->tm_sec;
Log[j].Balance=Balance;
save1(j);
j++;
}
void log1(int index)
{
system("cls");
int m1=load1();
int i=0;
for(;i<m1;i++)
{
if(account[index].id_account==Log[i].id_account)
{
if(Log[i].mm==1)
{
printf("%d\t%d\t存款 %f\t",i,Log[i].id_account,Log[i].Balance);
printf("%d/%d/%d", Log[i].year, Log[i].month, Log[i].day);
printf(" %d:%d:%d\n",Log[i].hour, Log[i].min, Log[i].sec);
}
else
{
printf("%d\t%d\t取款 %f\t",i,Log[i].id_account,Log[i].Balance);
printf("%d/%d/%d", Log[i].year, Log[i].month, Log[i].day);
printf(" %d:%d:%d\n",Log[i].hour, Log[i].min, Log[i].sec);
}
}
}
system("PAUSE");
account_fun(index);
}
int load1() /*导入函数*/
{
FILE* fp;
int i = 0;
if ((fp = fopen("account_log", "rb")) == NULL)
{
printf("cannot open file\n");
exit(0);
}
else
{
do
{
fread(&Log[i], sizeof(Log[i]), 1, fp);
i++;
} while (feof(fp) == 0);
}
fclose(fp);
return (i - 1);
}
void save1(int j) /*保存文件函数*/
{
FILE* fp;
if ((fp = fopen("account_log", "ab")) == NULL)
{
printf("cannot open file\n");
exit(0);
}
if (fwrite(&Log[j], sizeof(Log[j]), 1, fp) != 1)
printf("file write error\n");
fclose(fp);
}
void account_fun(int index)
{
int k;
menu2();
while(1)
{
scanf("%d",&k);
switch(k)
{
case 1:searh(index);break;
case 2:deposit(index);break;
case 3:draw(index);break;
case 4:log1(index);break;
case 0:main();break;
default:printf("您输入有误,请重新选择!\n");break;
}
}
}
void chick()
{
system("cls");
int m = load();
if(m==0)
{
printf("cannot open file\n");
exit(0);
}
display();
printf("============================================\n");
while(1)
{
int s1,index;
char s2[10];
int flag=0;
printf("请输入登录的账号\n");
scanf("%d",&s1);
for(int i=0; i<m; i++)
{
if(s1==account[i].id_account)
{
flag=1;
index=i;
}
}
if(flag==0) //输入的账号和存好的账号不一致
printf("该账号不存在!\n");
else{
int i;
for(i=0;i<3;i++)
{
char s2[10];
int flag1=0;//判断密码输入是否正确
printf("请输入账号对应的密码\n");
scanf("%s",s2);
if(strcmp(s2,account[index].pass)==0)
{
flag1=1;
}
if(flag1==0)
{
printf("密码输入错误\n");
}
else
{
account_fun(index);
break;
}
}
if(i==3)
{
printf("三次输入均错误退出\n");
break;
}
break;
}
}
system("PAUSE");
}
void display() /*浏览函数*/
{
int i;
int m = load();
printf("账号\t姓名\t性别\t身份证\t\t电话\t\t住址\t\t密码\t\t金额\n");
for (i = 0; i < m; i++) /*m为输入部分的用户人数*/
{
printf("%d\t%s\t%s\t%s\t\t%s\t\t%s\t\t%s\t\t%f\n", account[i].id_account, account[i].name, account[i].sex, account[i].id_card, account[i].phone, account[i].address,account[i].pass,account[i].Balance);
}
}
void add()
{
int s=0;
system("cls"); /*清屏*/
printf("------------输入用户信息------------"); printf("\n");
s = load();
int i, m;
printf("请输入需要创建信息的用户人数:\n");
scanf("%d", &m);
for (i = s; i < m+s; i++)
{
printf("请输入姓名: ");
scanf("%s", account[i].name);
printf("请输入性别(男,女): ");
scanf("%s", account[i].sex);
printf("请输入身份证号: ");
scanf("%s", account[i].id_card);
printf("请输入联系电话: ");
scanf("%s", account[i].phone);
printf("请输入住址: ");
scanf("%s", account[i].address);
printf("请输入密码: ");
scanf("%s", account[i].pass);
account[i].id_account=2023000+i;
account[i].Balance=0.0;
printf("\n");
}
printf("\n创建完毕!\n");
save(m+s);
system("PAUSE");
}
void menu2()
{
system("cls"); /*清屏*/
printf("##****************登录主业务界面*****************##\n");
printf(" 1.账户余额查询");
printf(" 2.存款\n");
printf(" 3.取款 ");
printf(" 4.交易明细查询\n");
printf(" 0.退卡\n");
printf("##*******************谢谢使用********************##\n");
printf("\n");
}
void menu1()
{
system("cls");
printf(" |*============================================*|\n");
printf(" |* 欢迎使用银行业务模拟系统 *|\n");
printf(" |*============================================*|\n");
printf(" |* 1.新开账户 *|\n");
printf(" |* 2.用户登录 *|\n");
printf(" |* 0.退出 *|\n");
printf(" |*============================================*|\n");
}
int load() /*导入函数*/
{
FILE* fp;
int i = 0;
if ((fp = fopen("account_list", "rb")) == NULL)
{
return 0;
}
else
{
do
{
fread(&account[i], sizeof(account[i]), 1, fp);
i++;
} while (feof(fp) == 0);
}
fclose(fp);
return (i - 1);
}
void save(int m) /*保存文件函数*/
{
int i;
FILE* fp;
if ((fp = fopen("account_list_bak", "wb")) == NULL)
{
printf("cannot open file\n");
exit(0);
}
for (i = 0; i < m; i++) /*将内存中用户的信息输出到磁盘文件中去*/
{
if (fwrite(&account[i], sizeof(account[i]), 1, fp) != 1)
printf("file write error\n");
}
fclose(fp);
remove("account_list");
rename("account_list_bak","account_list");
}