You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

706 lines
20 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#define _CRT_SECURE_NO_WARNINGS 1
#include "xitong.h"
/* 基础输入输出实现 */
void qingkonghuanche(void) {
int c;
while ((c = getchar()) != '\n' && c != EOF) { /* 丢弃本行剩余输入 */
}
}
void duquzifuchuan(char *huanchongqu, int daxiao) {
int changdu;
if (fgets(huanchongqu, daxiao, stdin) == NULL) {
huanchongqu[0] = '\0'; /* 读入失败时返回空串 */
return;
}
changdu = (int)strlen(huanchongqu);
if (changdu > 0 && huanchongqu[changdu - 1] == '\n') {
huanchongqu[changdu - 1] = '\0'; /* 去掉行尾换行符 */
} else {
qingkonghuanche(); /* 输入过长时清理缓冲区 */
}
}
int duquzhengshu(void) {
char huanchongqu[64];
duquzifuchuan(huanchongqu, 64);
return atoi(huanchongqu);
}
double duqufudian(void) {
char huanchongqu[64];
duquzifuchuan(huanchongqu, 64);
return atof(huanchongqu);
}
void qudangqianshijian(char *shijianchuan, int daxiao) {
time_t dangqian;
struct tm *shijianjiegou;
dangqian = time(NULL);
shijianjiegou = localtime(&dangqian);
strftime(shijianchuan, (size_t)daxiao, "%Y-%m-%d %H:%M:%S", shijianjiegou);
}
int shifoucunzaiwenjian(const char *wenjianming) {
FILE *wenjian;
wenjian = fopen(wenjianming, "r");
if (wenjian != NULL) {
fclose(wenjian);
return 1; /* 文件存在 */
}
return 0; /* 文件不存在 */
}
void chushihuaxitong(YinhangXitong *xitong) {
xitong->zhiyuanshu = 0;
xitong->kehushu = 0;
xitong->kashu = 0;
xitong->jiaoyishu = 0;
xitong->paiduishu = 0;
xitong->wangdianshu = 0;
xitong->luxianshu = 0;
}
void jiazaizhiyuan(YinhangXitong *xitong) {
FILE *wenjian;
char hang[512];
Zhiyuan z;
xitong->zhiyuanshu = 0;
wenjian = fopen("职员信息.txt", "r");
if (wenjian == NULL) {
return;
}
while (fgets(hang, sizeof(hang), wenjian) != NULL) { /* 逐行读入文本 */
if (sscanf(hang, "%d|%31[^|]|%7[^|]|%d|%31[^|]|%31[^|]|%31[^|]|%127[^\n]",
&z.zhiyuanid, z.xingming, z.xingbie, &z.nianling, z.gangwei, z.dianhua, z.mima, z.dizhi) == 8) { /* 解析一条完整记录 */
if (xitong->zhiyuanshu < 200) {
xitong->zhiyuanliebiao[xitong->zhiyuanshu] = z; /* 写入内存数组 */
xitong->zhiyuanshu++;
}
}
}
fclose(wenjian);
}
void baocunzhiyuan(YinhangXitong *xitong) {
FILE *wenjian;
int i;
wenjian = fopen("职员信息.txt", "w");
if (wenjian == NULL) {
return;
}
for (i = 0; i < xitong->zhiyuanshu; i++) { /* 把数组逐条写回文件 */
fprintf(wenjian, "%d|%s|%s|%d|%s|%s|%s|%s\n",
xitong->zhiyuanliebiao[i].zhiyuanid,
xitong->zhiyuanliebiao[i].xingming,
xitong->zhiyuanliebiao[i].xingbie,
xitong->zhiyuanliebiao[i].nianling,
xitong->zhiyuanliebiao[i].gangwei,
xitong->zhiyuanliebiao[i].dianhua,
xitong->zhiyuanliebiao[i].mima,
xitong->zhiyuanliebiao[i].dizhi);
}
fclose(wenjian);
}
void jiazaikehu(YinhangXitong *xitong) {
FILE *wenjian;
char hang[1024];
Kehu k;
char kazifuchuan[128];
char *fen;
int i;
xitong->kehushu = 0;
wenjian = fopen("客户信息.txt", "r");
if (wenjian == NULL) {
return;
}
while (fgets(hang, sizeof(hang), wenjian) != NULL) {
for (i = 0; i < 10; i++) { /* 先清空银行卡编号数组 */
k.yinhangkabianhao[i] = 0;
}
if (sscanf(hang, "%d|%31[^|]|%7[^|]|%d|%127[^|]|%lf|%lf|%31[^|]|%15[^|]|%d|%lf|%127[^|]|%31[^|]|%d|%lf|%lf",
&k.zhuzhanghao,
k.xingming,
k.leixing,
&k.yinhangkashuliang,
kazifuchuan,
&k.chuxuyue,
&k.daikuanyue,
k.dianhua,
k.kaihuriqi,
&k.xinyong,
&k.jinrongzichan,
k.dizhi,
k.mima,
&k.shenfenzheng,
&k.yueshouru,
&k.yuezhichu) == 16) {
if (strcmp(kazifuchuan, "-") != 0) {
fen = strtok(kazifuchuan, ","); /* 以逗号拆分卡号列表 */
i = 0;
while (fen != NULL && i < 10) {
k.yinhangkabianhao[i] = atoi(fen);
i++;
fen = strtok(NULL, ",");
}
k.yinhangkashuliang = i;
} else {
k.yinhangkashuliang = 0;
}
if (xitong->kehushu < 500) {
xitong->kehuliebiao[xitong->kehushu] = k;
xitong->kehushu++;
}
}
}
fclose(wenjian);
}
void baocunkehu(YinhangXitong *xitong) {
FILE *wenjian;
int i;
int j;
char kazifuchuan[256];
char linshi[32];
wenjian = fopen("客户信息.txt", "w");
if (wenjian == NULL) {
return;
}
for (i = 0; i < xitong->kehushu; i++) {
kazifuchuan[0] = '\0';
if (xitong->kehuliebiao[i].yinhangkashuliang <= 0) {
strcpy(kazifuchuan, "-");
} else {
for (j = 0; j < xitong->kehuliebiao[i].yinhangkashuliang && j < 10; j++) { /* 组合卡号字符串 */
sprintf(linshi, "%d", xitong->kehuliebiao[i].yinhangkabianhao[j]);
strcat(kazifuchuan, linshi);
if (j != xitong->kehuliebiao[i].yinhangkashuliang - 1) {
strcat(kazifuchuan, ",");
}
}
}
fprintf(wenjian, "%d|%s|%s|%d|%s|%.2f|%.2f|%s|%s|%d|%.2f|%s|%s|%d|%.2f|%.2f\n",
xitong->kehuliebiao[i].zhuzhanghao,
xitong->kehuliebiao[i].xingming,
xitong->kehuliebiao[i].leixing,
xitong->kehuliebiao[i].yinhangkashuliang,
kazifuchuan,
xitong->kehuliebiao[i].chuxuyue,
xitong->kehuliebiao[i].daikuanyue,
xitong->kehuliebiao[i].dianhua,
xitong->kehuliebiao[i].kaihuriqi,
xitong->kehuliebiao[i].xinyong,
xitong->kehuliebiao[i].jinrongzichan,
xitong->kehuliebiao[i].dizhi,
xitong->kehuliebiao[i].mima,
xitong->kehuliebiao[i].shenfenzheng,
xitong->kehuliebiao[i].yueshouru,
xitong->kehuliebiao[i].yuezhichu);
}
fclose(wenjian);
}
void jiazaika(YinhangXitong *xitong) {
FILE *wenjian;
char hang[512];
Yinhangka ka;
xitong->kashu = 0;
wenjian = fopen("银行卡信息.txt", "r");
if (wenjian == NULL) {
return;
}
while (fgets(hang, sizeof(hang), wenjian) != NULL) {
if (sscanf(hang, "%d|%d|%15[^|]|%lf|%lf|%15[^|]|%15[^\n]",
&ka.kabianhao,
&ka.zhuzhanghao,
ka.kaleixing,
&ka.yue,
&ka.lilv,
ka.kaihuriqi,
ka.zhuangtai) == 7) {
if (xitong->kashu < 1200) {
xitong->kaliebiao[xitong->kashu] = ka;
xitong->kashu++;
}
}
}
fclose(wenjian);
}
void baocunka(YinhangXitong *xitong) {
FILE *wenjian;
int i;
wenjian = fopen("银行卡信息.txt", "w");
if (wenjian == NULL) {
return;
}
for (i = 0; i < xitong->kashu; i++) {
fprintf(wenjian, "%d|%d|%s|%.2f|%.4f|%s|%s\n",
xitong->kaliebiao[i].kabianhao,
xitong->kaliebiao[i].zhuzhanghao,
xitong->kaliebiao[i].kaleixing,
xitong->kaliebiao[i].yue,
xitong->kaliebiao[i].lilv,
xitong->kaliebiao[i].kaihuriqi,
xitong->kaliebiao[i].zhuangtai);
}
fclose(wenjian);
}
void jiazaijiaoyi(YinhangXitong *xitong) {
FILE *wenjian;
char hang[1024];
Jiaoyi j;
xitong->jiaoyishu = 0;
wenjian = fopen("交易记录.txt", "r");
if (wenjian == NULL) {
return;
}
while (fgets(hang, sizeof(hang), wenjian) != NULL) {
if (sscanf(hang, "%d|%d|%d|%15[^|]|%lf|%lf|%19[^|]|%7[^|]|%63[^\n]",
&j.jiaoyiid,
&j.zhuzhanghao,
&j.kabianhao,
j.yewuleixing,
&j.jine,
&j.yuehou,
j.shijian,
j.shouruzhichu,
j.beizhu) == 9) {
if (xitong->jiaoyishu < 5000) {
xitong->jiaoyiliebiao[xitong->jiaoyishu] = j;
xitong->jiaoyishu++;
}
}
}
fclose(wenjian);
}
void baocunjiaoyi(YinhangXitong *xitong) {
FILE *wenjian;
int i;
wenjian = fopen("交易记录.txt", "w");
if (wenjian == NULL) {
return;
}
for (i = 0; i < xitong->jiaoyishu; i++) {
fprintf(wenjian, "%d|%d|%d|%s|%.2f|%.2f|%s|%s|%s\n",
xitong->jiaoyiliebiao[i].jiaoyiid,
xitong->jiaoyiliebiao[i].zhuzhanghao,
xitong->jiaoyiliebiao[i].kabianhao,
xitong->jiaoyiliebiao[i].yewuleixing,
xitong->jiaoyiliebiao[i].jine,
xitong->jiaoyiliebiao[i].yuehou,
xitong->jiaoyiliebiao[i].shijian,
xitong->jiaoyiliebiao[i].shouruzhichu,
xitong->jiaoyiliebiao[i].beizhu);
}
fclose(wenjian);
}
void jiazaipaidui(YinhangXitong *xitong) {
FILE *wenjian;
char hang[512];
Paidui p;
xitong->paiduishu = 0;
wenjian = fopen("排队记录.txt", "r");
if (wenjian == NULL) {
return;
}
while (fgets(hang, sizeof(hang), wenjian) != NULL) {
if (sscanf(hang, "%d|%d|%7[^|]|%7[^|]|%15[^|]|%d|%19[^\n]",
&p.quhaoid,
&p.zhuzhanghao,
p.kehuileixing,
p.chuangkou,
p.zhuangtai,
&p.pingfen,
p.shijian) == 7) {
if (xitong->paiduishu < 3000) {
xitong->paiduiliebiao[xitong->paiduishu] = p;
xitong->paiduishu++;
}
}
}
fclose(wenjian);
}
void baocunpaidui(YinhangXitong *xitong) {
FILE *wenjian;
int i;
wenjian = fopen("排队记录.txt", "w");
if (wenjian == NULL) {
return;
}
for (i = 0; i < xitong->paiduishu; i++) {
fprintf(wenjian, "%d|%d|%s|%s|%s|%d|%s\n",
xitong->paiduiliebiao[i].quhaoid,
xitong->paiduiliebiao[i].zhuzhanghao,
xitong->paiduiliebiao[i].kehuileixing,
xitong->paiduiliebiao[i].chuangkou,
xitong->paiduiliebiao[i].zhuangtai,
xitong->paiduiliebiao[i].pingfen,
xitong->paiduiliebiao[i].shijian);
}
fclose(wenjian);
}
void jiazaiwangdian(YinhangXitong *xitong) {
FILE *wenjian;
char hang[512];
Wangdian w;
xitong->wangdianshu = 0;
wenjian = fopen("网点信息.txt", "r");
if (wenjian == NULL) {
return;
}
while (fgets(hang, sizeof(hang), wenjian) != NULL) {
if (sscanf(hang, "%d|%31[^|]|%127[^|]|%d",
&w.wangdianid,
w.mingcheng,
w.dizhi,
&w.yewurenshu) == 4) {
if (xitong->wangdianshu < 120) {
xitong->wangdianliebiao[xitong->wangdianshu] = w;
xitong->wangdianshu++;
}
}
}
fclose(wenjian);
}
void baocunwangdian(YinhangXitong *xitong) {
FILE *wenjian;
int i;
wenjian = fopen("网点信息.txt", "w");
if (wenjian == NULL) {
return;
}
for (i = 0; i < xitong->wangdianshu; i++) {
fprintf(wenjian, "%d|%s|%s|%d\n",
xitong->wangdianliebiao[i].wangdianid,
xitong->wangdianliebiao[i].mingcheng,
xitong->wangdianliebiao[i].dizhi,
xitong->wangdianliebiao[i].yewurenshu);
}
fclose(wenjian);
}
void jiazailuxian(YinhangXitong *xitong) {
FILE *wenjian;
char hang[256];
Luxian l;
xitong->luxianshu = 0;
wenjian = fopen("网点路径.txt", "r");
if (wenjian == NULL) {
return;
}
while (fgets(hang, sizeof(hang), wenjian) != NULL) {
if (sscanf(hang, "%d|%d|%d|%d",
&l.qidianid,
&l.zhongdianid,
&l.juli,
&l.kehang) == 4) {
if (xitong->luxianshu < 400) {
xitong->luxianliebiao[xitong->luxianshu] = l;
xitong->luxianshu++;
}
}
}
fclose(wenjian);
}
void baocunluxian(YinhangXitong *xitong) {
FILE *wenjian;
int i;
wenjian = fopen("网点路径.txt", "w");
if (wenjian == NULL) {
return;
}
for (i = 0; i < xitong->luxianshu; i++) {
fprintf(wenjian, "%d|%d|%d|%d\n",
xitong->luxianliebiao[i].qidianid,
xitong->luxianliebiao[i].zhongdianid,
xitong->luxianliebiao[i].juli,
xitong->luxianliebiao[i].kehang);
}
fclose(wenjian);
}
void jiazaisuoyoushuju(YinhangXitong *xitong) {
jiazaizhiyuan(xitong);
jiazaikehu(xitong);
jiazaika(xitong);
jiazaijiaoyi(xitong);
jiazaipaidui(xitong);
jiazaiwangdian(xitong);
jiazailuxian(xitong);
}
void baocunsuoyoushuju(YinhangXitong *xitong) {
baocunzhiyuan(xitong);
baocunkehu(xitong);
baocunka(xitong);
baocunjiaoyi(xitong);
baocunpaidui(xitong);
baocunwangdian(xitong);
baocunluxian(xitong);
}
/* 查询辅助 */
int zhaozhiyuan(YinhangXitong *xitong, int zhiyuanid) {
int i;
for (i = 0; i < xitong->zhiyuanshu; i++) {
if (xitong->zhiyuanliebiao[i].zhiyuanid == zhiyuanid) {
return i;
}
}
return -1; /* 没找到返回-1 */
}
int zhaokehu(YinhangXitong *xitong, int zhuzhanghao) {
int i;
for (i = 0; i < xitong->kehushu; i++) {
if (xitong->kehuliebiao[i].zhuzhanghao == zhuzhanghao) {
return i;
}
}
return -1; /* 没找到返回-1 */
}
int zhaoka(YinhangXitong *xitong, int kabianhao) {
int i;
for (i = 0; i < xitong->kashu; i++) {
if (xitong->kaliebiao[i].kabianhao == kabianhao) {
return i;
}
}
return -1; /* 没找到返回-1 */
}
int zhaowangdian(YinhangXitong *xitong, int wangdianid) {
int i;
for (i = 0; i < xitong->wangdianshu; i++) {
if (xitong->wangdianliebiao[i].wangdianid == wangdianid) {
return i;
}
}
return -1; /* 没找到返回-1 */
}
void kehutianjiaka(Kehu *kehu, int kabianhao) {
int i;
for (i = 0; i < kehu->yinhangkashuliang && i < 10; i++) {
if (kehu->yinhangkabianhao[i] == kabianhao) {
return; /* 已存在则不重复添加 */
}
}
if (kehu->yinhangkashuliang < 10) {
kehu->yinhangkabianhao[kehu->yinhangkashuliang] = kabianhao;
kehu->yinhangkashuliang++;
}
}
void kehuquchuaka(Kehu *kehu, int kabianhao) {
int i;
int j;
for (i = 0; i < kehu->yinhangkashuliang; i++) {
if (kehu->yinhangkabianhao[i] == kabianhao) {
for (j = i; j < kehu->yinhangkashuliang - 1; j++) {
kehu->yinhangkabianhao[j] = kehu->yinhangkabianhao[j + 1];
}
kehu->yinhangkabianhao[kehu->yinhangkashuliang - 1] = 0;
kehu->yinhangkashuliang--;
return;
}
}
}
int shengchengjiaoyiid(YinhangXitong *xitong) {
int maxid;
int i;
maxid = 500000;
for (i = 0; i < xitong->jiaoyishu; i++) {
if (xitong->jiaoyiliebiao[i].jiaoyiid > maxid) {
maxid = xitong->jiaoyiliebiao[i].jiaoyiid;
}
}
return maxid + 1; /* 在当前最大流水号基础上+1 */
}
int shengchengquhaoid(YinhangXitong *xitong) {
int maxid;
int i;
maxid = 70000;
for (i = 0; i < xitong->paiduishu; i++) {
if (xitong->paiduiliebiao[i].quhaoid > maxid) {
maxid = xitong->paiduiliebiao[i].quhaoid;
}
}
return maxid + 1; /* 在当前最大取号基础上+1 */
}
void xierujiaoyi(YinhangXitong *xitong, int zhuzhanghao, int kabianhao, const char *yewuleixing, double jine, double yuehou, const char *shouruzhichu, const char *beizhu) {
Jiaoyi j;
if (xitong->jiaoyishu >= 5000) {
return; /* 交易数组已满则放弃写入 */
}
j.jiaoyiid = shengchengjiaoyiid(xitong);
j.zhuzhanghao = zhuzhanghao;
j.kabianhao = kabianhao;
strcpy(j.yewuleixing, yewuleixing);
j.jine = jine;
j.yuehou = yuehou;
qudangqianshijian(j.shijian, sizeof(j.shijian));
strcpy(j.shouruzhichu, shouruzhichu);
strcpy(j.beizhu, beizhu);
xitong->jiaoyiliebiao[xitong->jiaoyishu] = j; /* 新交易写入数组末尾 */
xitong->jiaoyishu++;
}
/* 打印函数 */
void xianshizhiyuan(const Zhiyuan *z) {
printf("ID:%d 姓名:%s 性别:%s 年龄:%d 岗位:%s 电话:%s 地址:%s\n",
z->zhiyuanid, z->xingming, z->xingbie, z->nianling, z->gangwei, z->dianhua, z->dizhi);
}
void xianshikehu(const Kehu *k) {
int i;
printf("主账户:%d 姓名:%s 类型:%s 储蓄:%.2f 贷款:%.2f 信用:%d 资产:%.2f 电话:%s 开户:%s 地址:%s\n",
k->zhuzhanghao, k->xingming, k->leixing, k->chuxuyue, k->daikuanyue, k->xinyong, k->jinrongzichan, k->dianhua, k->kaihuriqi, k->dizhi);
printf("银行卡数量:%d 编号:", k->yinhangkashuliang);
for (i = 0; i < k->yinhangkashuliang; i++) {
printf("%d", k->yinhangkabianhao[i]);
if (i != k->yinhangkashuliang - 1) {
printf(",");
}
}
printf("\n");
}
void xianshika(const Yinhangka *ka) {
printf("卡号:%d 主账户:%d 类型:%s 余额:%.2f 利率:%.4f 开户:%s 状态:%s\n",
ka->kabianhao, ka->zhuzhanghao, ka->kaleixing, ka->yue, ka->lilv, ka->kaihuriqi, ka->zhuangtai);
}
void xianshijiaoyi(const Jiaoyi *j) {
printf("流水:%d 主账户:%d 卡号:%d 类型:%s 金额:%.2f 余额:%.2f 时间:%s 收支:%s 备注:%s\n",
j->jiaoyiid, j->zhuzhanghao, j->kabianhao, j->yewuleixing, j->jine, j->yuehou, j->shijian, j->shouruzhichu, j->beizhu);
}
void xianshipaidui(const Paidui *p) {
printf("取号:%d 主账户:%d 客户类型:%s 窗口:%s 状态:%s 评分:%d 时间:%s\n",
p->quhaoid, p->zhuzhanghao, p->kehuileixing, p->chuangkou, p->zhuangtai, p->pingfen, p->shijian);
}
void xianshiwangdian(const Wangdian *w) {
printf("网点ID:%d 名称:%s 地址:%s 当前业务人数:%d\n", w->wangdianid, w->mingcheng, w->dizhi, w->yewurenshu);
}
void zhanshimorenwenjianming(void) {
printf("\n测试数据文件:\n");
printf("1. 职员信息.txt\n");
printf("2. 客户信息.txt\n");
printf("3. 银行卡信息.txt\n");
printf("4. 交易记录.txt\n");
printf("5. 排队记录.txt\n");
printf("6. 网点信息.txt\n");
printf("7. 网点路径.txt\n");
}
/* 登录 */
int guanliyuanlogin(void) {
char zhanghao[32];
char mima[32];
printf("登录提示:默认管理员账号 admin密码 123456\n");
printf("管理员账号: ");
duquzifuchuan(zhanghao, 32);
printf("管理员密码: ");
duquzifuchuan(mima, 32);
if (strcmp(zhanghao, "admin") == 0 && strcmp(mima, "123456") == 0) { /* 固定管理员账号密码 */
return 1;
}
return 0;
}
int zhiyuanlogin(YinhangXitong *xitong, int *zhiyuanxuhao) {
int id;
char mima[32];
int xuhao;
printf("登录提示默认职员ID 1001(或1002),密码 123456\n");
printf("职员ID: ");
id = duquzhengshu();
printf("密码: ");
duquzifuchuan(mima, 32);
xuhao = zhaozhiyuan(xitong, id); /* 先按职员ID定位 */
if (xuhao >= 0 && strcmp(xitong->zhiyuanliebiao[xuhao].mima, mima) == 0) {
*zhiyuanxuhao = xuhao; /* 返回登录职员在数组中的下标 */
return 1;
}
return 0;
}
int kehulogin(YinhangXitong *xitong, int *kehuxuhao) {
int zhanghao;
char mima[32];
int xuhao;
printf("登录提示:默认客户主账户 20001(或20002),密码 123456\n");
printf("客户主账户: ");
zhanghao = duquzhengshu();
printf("密码: ");
duquzifuchuan(mima, 32);
xuhao = zhaokehu(xitong, zhanghao); /* 先按主账户定位 */
if (xuhao >= 0 && strcmp(xitong->kehuliebiao[xuhao].mima, mima) == 0) {
*kehuxuhao = xuhao; /* 返回登录客户在数组中的下标 */
return 1;
}
return 0;
}