银行业务模拟系统

程序设计能力实践I

课程实践报告

选题:银行业务模拟系统

  1. 功能。

使用C语言实现一个银行业务模拟程序,实现存取款等基本业务的模拟。选题者需要首先进行需求调研,了解银行的主要业务及形式,完成相关业务梳理及程序设计实现。最终实现的银行业务模拟系统需要覆盖以下基本功能:

  1. 实现新开账户功能

说明:用户提供姓名、性别、身份证号、联系电话、住址、初始密码等基本信息实现新账户的开设(需自动生成账户号、用户ID(若首次开设账户))。

  1. 用户登录

输入账户号和密码实现登录功能,成功登录后进入主业务界面(需要注意多次密码失败的处理)。

  1. 退卡

退出当前登录状态,返回欢迎主界面(该页面为未登录时的呈现页面,如可以显示新开账户、登录等功能)。

  1. 账户余额查询

登录状态下查看账户余额信息。

  1. 存款

登录状态下执行存款操作(模拟该功能通过输入存款数模拟存款业务)。

  1. 取款

登录状态下执行取款操作。

  1. 交易明细查询

登录状态下查询当前账户在指定时间范围内的业务记录(因此,最少需要实现以上存款、取款业务日志)。

  1. 持久化

本系统需要支持数据持久化,即系统数据需要进行永久存储,程序重启后能实现数据的自动加载。系统数据持久化通常通过数据库进行实现,考虑到当前掌握知识情况,持久化可通过文件进行实现,即所有业务数据需要与存储文件进行同步。

  1. 问题分析。

  1. 实现账户登录,以及记录账户信息需要利用结构体;

  1. 需求较多要在总体设计中确定模块结构、划分功能模块,将软件功能 需求分配给所划分的最单元模块。确定模块间的联系,确定数据结构、文 件结构、确定测试方法与策略;

  1. 日志用机构体保存每条记录,最后放在一个日志文件中。

  1. 持久化借助文件。

总体设计方案

一.结构体

定义一个用户信息的结构体

定义一个日志信息的结构体

二.各模块的功能和实现

1.菜单模块:显示用户管理系统的主菜单,供用户选择所需的功能,通过自己定义的menu函数来实现。

  1. 新开户模块:输入用户的姓名以及其它的一些用户的相关信息,通过自己定义的add函数来实现。

  1. 文件模块:将内存中用户的信息输出到磁盘文件中,或者将磁盘文件读到内存可以通过自己定义的save函数与load函数来实现。

  1. 浏览模块:浏览所有用户的相关信息,通过自己定义的display函数来实现。

  1. 用户功能模块:对用户登录状态下功能的控制,通过自己定义account_fun的函数来实现。

6.登录模块:输入需要用户的账号密码进行登录,通过自己定义chick的函数来实现。

  1. 存取款模块:通过存取款可以修改账户余额,通过自己定义deposit和draw的函数来实现。

  1. 日志模块:可以记录用户的存取款信息,通过自己定义的log函数来实现。

也可以进行日志信息查询,通过自己定义的log1函数来实现。

  1. 查询模块:searh函数实现

10.主函数控制。

使用说明及运行实例

1.运行程序,进入银行业务模拟系统的主菜单:

2.输入数字“1”进行新开账户:

(账号自行生成)

  1. 输入“2”进行登录:

(三次退出)

5.正确后进入主业务界面

6.输入“1”进行查询:

  1. 输入“2”进行存款:

  1. 输入“3”进行取款:

金额错误判断

金额不够判断

  1. 输入”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");

}

假设某银行有n个窗口对外接待客户,从早晨银行9点开门起到5点关门,不断有客户进入银行,由于每个窗口在某个时刻只能接待一个客户。因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进银行的客户。如果某个窗口的业务员正空闲,则可上前输业务。反之,若个窗口均有客户所占,他便会排在为数最少的队伍后面。编制一个程序模拟银行的这种业务活动并计算一天中客户在银行的平均逗留时间。 首先从题目分析:N个窗口排队,首先就要建立N个队列来存储排队的用户信息 ,然后算出那个队列最短就用户就到那个队伍排队,同时通过随机生成他办理业务的时间和到来的时间,通过计算用户的到来时间和离开时间就可以计算出某个用户在银行的逗留时间 ;话不多说直接上代码。 下面是主函数,由用户输入银行上下班时间,计算营业多长时间Total_time,如何当前时间小于关门的时间,就一直进入customer_into();函数,用户不断的进来 #define FALSE 0 #define TRUE 1 #define QUEUE_SUM 4 //窗口的数量 int rand_business_time=0, rand_wait_time=0;//定义办理时间,等待时间变量 int Total_time=0,now_tim=0;//总时间,当前时间 int go_time[4] = {0,0,0,0};//定义数组存储每个窗口最后一位办理完业务的时间 int sum_nan[4] = {0,0,0,0};//定义数组存储每个窗口排队的人数 int Sign=TRUE; //是否关门标志位 float Sum_Wait_Time=0.0; //等待的总时间 float Sun_Nan=0.0; //总人数 int open_time;//开门时间 int off_time; //关门时间 int main() { Prompted(); printf("输入银行的24小时制营业时间:如营业时间为9:00--17:00,则应输入:9,17\n"); scanf("%d,%d", &open;_time,&off;_time); Total_time = (off_time - open_time) * 60;//计算银行总营业多少分钟 for (int i = 0; i now_time) { customer_into(); //客户进入函数 } printf("银行关门时间到不再接收客人\n\n"); for (int i = 0; i < QUEUE_SUM; i++) { DisposeQueue(&queue;[i],i);//输入在银行关门前还没有办理完业务的客户信息 } printf("平均时间为%.2f分钟",Sum_Wait_Time/Sun_Nan); /*通过各个客户的总等待时间总和/总人数算出逗留平均时间*/ _getch(); return 0; }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王在青大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值