C语言课设——银行综合业务平台

前言

这是本人大一上学期的c语言课设,目前本人已经大四在某小厂从事java后端实习生,上班摸鱼期间偶然间发现大一时的c课设,感慨尤深,特发此篇csdn纪念,同时希望能帮助到正在学习c语言的大一学弟学妹们。  本课设(代码+文档)已在gitee开源,链接在最后,需要的可以下载!

系统功能设计

本系统是一个关于银行储蓄业务的系统,需要保存用户(储户)在银行的基本信息、办理的银行卡的信息以及用户一定时间的交易信息。因此系统需要的核心数据有:用户数据、银行卡数据、交易数据;用户数据包括:用户编号、用户名称、身份证号、电话、地址;银行卡数据包括:银行卡号、币种、存储类型、开户日期、余额,密码,使用状态(是否注销)、用户编号;交易数据包括:交易日期、交易类型、卡号、金额。根据对银行综合业务管理系统的分析,系统的主要功能包括:从文件读出数据、从文件保存数据、用户存款、用户取款、用户转账、查询余额、查询明细、管理者开户、注销客户、查询账户、查看所有用户和账户信息等,银行综合业务平台系统的总体功能 如图所示。

 设计思路:

定义3个结构:银行卡信息结构、交易记录结构、用户信息结构。

②用户信息结构包含银行卡结构、交易记录链表头结点、尾结点。

③一个用户信息的结构 可以存储一个用户的所有信息。

④使用动态数组记录每个人的信息。

⑤使用链表记录每个人的交易记录。

⑥将所有数据存储在一个文档中,易于管理。

结构体及函数声明

全局变量

extern UserInfo *arr;     //盛放动态数组首地址
extern int UserNum;	  //记录用户数
extern int ArrNum;		  //记录动态数组长度
extern int SaveFlag;	  //记录保存状态
extern const char SAVEFLAG[2][10];		//保存状态
extern const char MONEY_TYPE[3][10];	//币种
extern const char PHASE[2][10];			//交易期限
extern const char TRAD_TYPE[5][10];		//交易类型
extern const char STATUS[2][10];			//用户银行卡状态
extern const char SEX[2][10];			//性别
extern const char TITLE[16][15];			//表头
extern const char CAOZUO[2][10];		//操作

客户信息结构体

typedef struct UserInfo    //用户信息,包含(基本信息、银行卡信息、交易记录)
{
	int number;       //编号
	char name[20];    //姓名
	char phone_id[20]; //手机号
	char address[25];		//籍贯
	char ID_num[25];		//身份证
	int sex;    //0.男      1.女
	BankCardInfo cord;   //银行卡结构
	Trad_Record* record_h;		//记录链表头
	Trad_Record* record_last;	//记录链表尾
}UserInfo;

银行卡信息结构体

typedef struct BankCardInfo
{
	char card_id[30];    //银行卡号
	int moneytype;        //币种:0代表人民币,1代表美元,2代表欧元
	int phase;         //0.活期 or 1.定期
	char app_time[30];     //申请日期
	long moneynum;			//余额
	char password[20];		//登录密码
	int status;			//1.正常    0.注销
}BankCardInfo;

银行交易记录结构体

typedef struct Trad_Record

{

char trad_time[30]; //交易时间

int trad_type;      //0.存款,1.取款,2.挂失

char card[30]; //交易的卡号

long money; //交易金额

struct Trad_Record *next; //下一条信息

}Trad_Record;

全局常量字符串

const char SAVEFLAG[2][10] = {
	{"未保存"},
	{"已保存"}
};

const char MONEY_TYPE[3][10] = {
	{"人民币"},
	{"美元"},
	{"欧元"}
};

const char PHASE[2][10] = {
	{"活期"},
	{"定期"}
};

const char TRAD_TYPE[5][10] = {
	{"存款"},//0
	{"取款"},//1
	{"转账"},//2
	{"开户"},//3
	{"注销"},//4
	
};

const char STATUS[2][10] = {
	{"注销"},
	{"正常"}
};

const char SEX[2][10] = {
	{"男性"},
	{"女性"}
};

const char TITLE[16][15] = {
	{"编号"},		//0
	{"姓名"},		//1
	{"手机号码"},	//2
	{"户籍"},		//3
	{"身份证号"},	//4
	{"性别"},		//5
	{"银行卡号"},	//6
	{"开户时间"},	//7
	{"余额"},		//8
	{"币种"},		//9
	{"登录密码"},	//10
	{"期限"},		//11
	{"交易记录"},	//12
	{"交易时间"},   //13
	{"交易类型"},	//14
	{"交易金额"},	//15

};//表头信息

const char CAOZUO[2][10] = {
	{"未确认"},
	{"已确认"}
};

所有函数声明

void adminfun();    //操作人员系统
void userfun();		//用户系统

int login_system();			//管理人员登录
int login_user();			//用户登录

int location_ID(char* id);   //根据身份证寻找下标
int location_CordID(char* id);		//根据卡号寻找下标
char* GetNowTime(char* nowtime);    //获取现在时间

void delate(int n);				//删除(信息)
void open_account();			//开户
void unsubscribe(int n);		//注销
void revise(int n);				//修改信息

int isunsubscribe(int n);
void withdrawal(int n);	 //取款
void deposit(int n);  //存款
void transfer_accounts(int a, int b);  //转账(a账户到b账户)
void check_balance(int n);   //查询余额
void change_password(int n);

void print_record(int n);   //查询记录
void print_login_page();		//输出主页面
void print_login_admin();		//输出管理人员菜单
void print_login_user();		//输出用户菜单
void print_title_user();		//输出用户信息表头
void print_title_cord();		//输出银行卡信息表头
void print_all_cord();			//输出所以银行卡信息
void print_all_user();			//输出所以用户信息
void print_person(int n);		//输出个人详细信息

UserInfo* data_load();			//从文件载入数据
int data_save();				//保存到文件
int backups();					//备份数据
UserInfo* refresh();				//刷新

系统设计

对系统的具体实现做一定的讲解。

载入数据

载入数据这里,我是从文件中载入,由于存储数据结构比较复杂(同时使用动态数组+链表),而且受限于个人水平,载入数据时代码冗余严重。

首先读取用户信息,再读取用户银行卡信息,最后读取交易记录,通过判断结束标识-1 来判断是否结束切换后一个人。在这里是利用标识判断结束标识来判断结束的,即最后的 “over -1 over -1”是有效的结束标识。标志此人信息结束,用于分隔两个人的数据。利用while 循环不断循环以上过程,读出所有人的数据。

①首先打开文件

fopen_s(&fp, "UserBase.md", "r");

②判断是否打开成功   

if (fp == NULL)

{

      printf("打开文件失败!\n");

      exit(0);

}

③为动态数组申请一段初始长度用于存储数据

arr = (UserInfo*)malloc(LEN_User*100); 

④读取此人银行卡信息和个人信息

//读取个人银行卡信息
//fscanf_s返回成功读取的个数,这里用来判断读取结束。
sign = fscanf_s(fp, "%d %s %s %s %s %d %d\n", &arr[n].number, arr[n].name, 19, arr[n].phone_id, 19, arr[n].address, 24, arr[n].ID_num, 24, &arr[n].sex,&(arr[n].cord).status);   //读取个人信息

sign = fscanf_s(fp, "%s %s %ld %d %s %d\n", (arr[n].cord).app_time, 29, (arr[n].cord).card_id, 29, &(arr[n].cord).moneynum, &(arr[n].cord).moneytype, (arr[n].cord).password, 19, &(arr[n].cord).phase);  

⑤读取此人交易记录

由于这里是链表,所以在文件中使用终止符代表链表结束,如果有更好的办法欢迎在评论区指出。

arr[n].record_h = (Trad_Record*)malloc(LEN_TRcord);   //为链表头申请内存

tr_t1 = arr[n].record_h;   

fscanf_s(fp, "%s %d %s %d\n", tr_t1->trad_time,29, &tr_t1->trad_type,

tr_t1->card,29, &tr_t1->money);   //读取第一条记录

signt = (tr_t1->trad_type == -1 && tr_t1->money == -1);  //判断是否结束

tr_t2 = (Trad_Record*)malloc(LEN_TRcord);  //  申请第二个节点的内存

if (!signt)    //若未结束 ,则再读入一条记录

{

fscanf_s(fp, "%s %d %s %d\n", tr_t2->trad_time, 29, &tr_t2->trad_type,

 tr_t2->card, 29, &tr_t2->money);

signt = (tr_t2->trad_type == -1 && tr_t2->money == -1);   //再次判断是否结束

}

if (!signt)   //若未结束 ,则插入这条数据

{

tr_t1->next = tr_t2;

tr_t1 = tr_t2;

tr_t2 = (Trad_Record*)malloc(LEN_TRcord);

if (tr_t2 == NULL)

{

printf("error\n");

exit(0);

}

}

while (!signt)  //若未结束 ,则再读入一条记录

{

fscanf_s(fp, "%s %d %s %d\n", tr_t2->trad_time, 29,

&tr_t2->trad_type, tr_t2->card, 29, &tr_t2->money);

signt = (tr_t2->trad_type == -1 && tr_t2->money == -1);

if (signt)

break;

tr_t1->next = tr_t2;

tr_t1 = tr_t2;

tr_t2 = (Trad_Record*)malloc(LEN_TRcord);

}

tr_t1->next = NULL;   //最后一条记录指向空

arr[n].record_last = tr_t1; //保存最后一条记录便于以后增加

free(tr_t2);   //释放掉未使用的节点

用户系统

登录

int login_user()      //登录成功返回下标,
{
	int t;
	int t_2;
	int i;
	char account[30];
	char password[20];
	for (i = 0; i < 3; i++)
	{
		printf("\t\t请输入卡号:\n\n");
		scanf_s("%s", account, 29);
		t = location_CordID(account);
		if (t == -1)
		{
			printf("未找到该账户!\n");
		}
		else
		{
			printf("\t\t请输入密码:\n\n");
			scanf_s("%s", password, 19);
			t_2 = strcmp(((arr[t].cord).password), password);
			if (t_2 != 0)
			{
				t = -1;	//t为-1标志失败
				printf("密码错误!\n");
			}
		}
		if (t == -1)
		{
			printf("请重新输入!\n");
		}
		else
		{
			break;
		}
	}

	return t;
}

取款功能

通过调用withdrawal()”函数实现用户取款功能。首先判断用户账号是否被注销,若账号已被注销则结束此功能;若未被注销则进入取款界面。输入取款金额,若取款金额小于0或大于账户余额则结束此功能;取款金额正确,再次确认是否取出,若不确定则结束功能;确定后,取款成功,返回用户界面,如图2所示,部分代码如下:

void withdrawal(int n)	 //取款
{
	if (isunsubscribe(n) == 0)
	{
		printf("账户已注销!\n");
		goto end;
	}
	char nowtime[30];
	char *p_nowtime;
	p_nowtime = GetNowTime(nowtime);    //获取当前时间

	Trad_Record* p;
	long money;
	char c_t;		

	printf("输入取款金额:\n");
	scanf_s("%ld",&money);
	if (money < 0)
	{
		printf("金额不正确! \n退出!\n");
		goto end;
	}
	printf("确定要取出%ld %s吗?(请按Y或y继续,任意键取消操作)\n",money,MONEY_TYPE[(arr[n].cord).moneytype]);
	getchar();       //接受缓冲器字符
	c_t = getchar();
	
	if (c_t == 'Y' || c_t == 'y')
	{
		if ((arr[n].cord).moneynum >= money)
		{
			(arr[n].cord).moneynum -= money;

			p = (Trad_Record*)malloc(LEN_TRcord);  //添加记录(链表)
			if (p == NULL)
			{
				printf("error\n");
				exit(0);
			}
			arr[n].record_last->next = p;
			p->next = NULL;
			strcpy_s(p->card, 29,(arr[n].cord).card_id);
			p->money = money*(-1);
			p->trad_type = 1;
			
			
			strcpy_s(p->trad_time, 29, nowtime);
			arr[n].record_last = p;
			
			printf("操作成功!\n");
		}
		else
			printf("余额不足!\n");
	}
	else
		printf("操作取消!\n");
	data_save();
end:;
}

存款功能

通过函数”deposit()”实现用户存款功能。首先判断账号是否注销,若账状态正常则进入存款界面;输入存款金额,若金额正确,保存当前时间、交易类型等信息至文档,操作成功,返回用户界面。部分代码如下:

void deposit(int n)  //存款
{
	if (isunsubscribe(n) == 0)
	{
		printf("账户已注销!\n");
		goto end;
	}
	
	char nowtime[30];
	char *p_nowtime;
	p_nowtime = GetNowTime(nowtime);    //获取当前时间

	Trad_Record* p;
	long money;
	char cct;

	printf("请将整齐的%s放入:\n", MONEY_TYPE[(arr[n].cord).moneytype]);
	scanf_s("%ld", &money);
	if (money < 0)
	{
		printf("金额不正确! \n退出!\n");
		goto end;
	}
	printf("确定要存入%ld %s吗?(请按Y或y继续,任意键取消操作)\n", money, MONEY_TYPE[(arr[n].cord).moneytype]);
	getchar();       //接受缓冲器字符
	cct = getchar();
	if (cct == 'Y' || cct == 'y')
	{
		(arr[n].cord).moneynum += money;
		

		p = (Trad_Record*)malloc(LEN_TRcord);  //添加记录(链表)
		if (p == NULL)
		{
			printf("error\n");
			exit(0);
		}
		
		p->next = NULL;
		strcpy_s(p->card, 29, (arr[n].cord).card_id);  //交易卡号
		p->money = money;								//交易金额
		p->trad_type = 0;								//交易类型
		strcpy_s(p->trad_time, 29, nowtime);			//交易时间
		arr[n].record_last->next = p;					//加入记录
		arr[n].record_last = p;
		
		printf("操作成功!\n");
		SaveFlag = 0;

	}
	else
		printf("操作取消!\n");
end:;
}

转账功能

通过调用”transfer_accounts()”函数实现转账功能。进转账界面后输入要转账的对象,首先判断转账对象是否是自己,若不是再判断转账对象是否存在,若存在则输入转账金额;判断转账金额是否正确,若正确,再次确认是否转账,确认后操作成功,返回用户界面。如图所示,部分代码如下:

void transfer_accounts(int a, int b)  //转账(a账户到b账户)
{
	if (isunsubscribe(a) == 0)
	{
		printf("账户%s已注销!\n",(arr[a].cord).card_id);
		goto end;
	}
	if (isunsubscribe(b) == 0)
	{
		printf("账户%s已注销!\n", (arr[b].cord).card_id);
		goto end;
	}
	char nowtime[30];
	char *p_nowtime;
	p_nowtime = GetNowTime(nowtime);    //获取当前时间

	Trad_Record* p;
	long money;
	char cct;

	printf("输入转账金额:\n");
	scanf_s("%ld", &money);
	if (money < 0)
	{
		printf("金额不正确! \n退出!\n");
		goto end;
	}
	printf("确定要转账%ld %s到 %s 的账户吗?(请按Y或y继续,任意键取消操作)\n", money, MONEY_TYPE[(arr[a].cord).moneytype],arr[b].name);
	getchar();       //接受缓冲器字符
	cct = getchar();
	if (cct == 'Y' || cct == 'y')
	{
		if ((arr[a].cord).moneynum >= money)
		{
			(arr[a].cord).moneynum -= money;
			(arr[b].cord).moneynum += money;

			p = (Trad_Record*)malloc(LEN_TRcord);  //为账户a添加记录
			if (p == NULL)
			{
				printf("error\n");
				exit(0);
			}
			arr[a].record_last->next = p;
			p->next = NULL;
			strcpy_s(p->card, 29, (arr[a].cord).card_id);
			p->money = money*(-1);
			p->trad_type = 2;
			strcpy_s(p->trad_time, 29, nowtime);
			arr[a].record_last = p;


			p = (Trad_Record*)malloc(LEN_TRcord);  //为账户b添加记录
			if (p == NULL)
			{
				printf("error\n");
				exit(0);
			}
			arr[b].record_last->next = p;
			p->next = NULL;
			strcpy_s(p->card, 29, (arr[b].cord).card_id);
			p->money = money;
			p->trad_type = 2;
			strcpy_s(p->trad_time, 29, nowtime);
			arr[b].record_last = p;
			
			printf("操作成功!\n");
		}
		else
			printf("余额不足!\n");
	}
	else
		printf("操作取消!\n");
	data_save();
end:;
}

查询余额

实现用户查询余额功能,进入查询余额后系统会将卡内余额展示出来,直接输出即可。

部分代码如下:

printf("您当前的余额是%ld %s \n", (arr[n].cord).moneynum, MONEY_TYPE[(arr[n].cord).moneytype]);

查询明细

通过调用函数“showTradeInfo()”实现用户查询账户明细的功能。进入查询账户明细界面输入卡号,则系统提供用户信息,调用函数即可。

void print_record(int n);

查询状态

(arr[n].cord).status记录用户银行卡状态 (0或1),且有定义STATUS[2][10]={{注销},{正常}};因此可以使用STATUS[(arr[n].cord).status]引用相应字符串。

例程:

printf("当前状态是:%s \n",STATUS[(arr[n].cord).status]);

修改密码

为用户提供修改密码功能基本流程是:首先输入身份证判断身份证是否正确,若正确进入下一步,不正确则退出,输入原密码,判断是否正确,若正确进入下一步,不正确则退出,输入新密码,修改成功,退出。密码修改流程图,如图4所示:

主要代码:

void change_password(int n)
{

	char cht[30];
	int sign;
	printf("请输入您的身份证号:\n");
	scanf_s("%s",cht,29);
	sign = strcmp(cht, arr[n].ID_num);
	if (sign == 0)
	{
		printf("清输入你的原密码:\n");
		scanf_s("%s",cht,29);
		sign = strcmp(cht, (arr[n].cord).password);
		if (sign == 0)
		{
			printf("请输入你的新密码:\n");
			scanf_s("%s",cht,29);
			strcpy_s((arr[n].cord).password, 29, cht);
			printf("操作成功!\n");
		}
		else
		{
			printf("原密码错误!\n");
		}
	}
	else
	{
		printf("身份证错误!\n");
	}
}

管理人员系统

银行工作人员登录系统必须具有访问权限,本系统的登录模块主要通过调用函数“login_system()”实现,其主要代码为:

int login_system()
{
	int sign;
	const char* ACCOUNT = "admin";
	const char* PASSWORD = "admin";
	char account[11];
	char password[11];
	printf("\t\t请输入账号:\n\n");
	scanf_s("%s", account, 10);
	printf("\t\t请输入密码:\n\n");
	scanf_s("%s", password, 10);
	if ((strcmp(account, ACCOUNT) == 0) && (strcmp(password, PASSWORD) == 0))
		sign = 1;
	else
		sign = 0;
	return sign;
}

 

其中管理人员系统通过调用函数“adminfun()”实现,登录成功进入,执行相应操作:

以下是例程为:

void adminfun()
{
	char order[10];
	char t[30];
	int sign;
	int back = 0;	//返回标志
	if (login_system())
	{
		system("cls");
		printf("\n\n\t\t登录成功请稍等...\n");
		Sleep(1000);
		while (1)
		{
			if (back == 1)  //返回标志
				break;

			system("cls");
			print_login_admin();
			scanf_s("%s", order, 9);
			switch (order[0] - 48)
			{
			case 1:
				open_account();
				printf("任意键退出...\n");
				getch();
				break;
			case 2:
				printf("请输入银行卡号或身份证号:\n");
				scanf_s("%s", t, 29);
				sign = location_ID(t);
				if (sign == -1)
					sign = location_CordID(t);
				if (sign != -1)
					unsubscribe(sign);
				else
					printf("找不到这个人!\n");
				printf("任意键退出...\n");
				getch();
				break;
			case 3:
				printf("请输入银行卡号或身份证号:\n");
				scanf_s("%s", t, 29);
				sign = location_ID(t);
				if (sign == -1)
					sign = location_CordID(t);
				if (sign != -1)
					print_person(sign);
				else
					printf("找不到这个人!\n");
				printf("任意键退出...\n");
				getch();
				break;
			case 4:
				print_title_user();
				print_all_user();
				printf("任意键退出...\n");
				getch();
				break;
			case 5:
				print_title_cord();
				print_all_cord();
				printf("任意键退出...\n");
				getch();
				break;
			case 6:      //返回上一级
				back = 1;
				break;
			case 7:
				printf("请输入银行卡号或身份证号:\n");
				scanf_s("%s", t, 29);
				sign = location_ID(t);
				if (sign == -1)
					sign = location_CordID(t);
				if (sign != -1)
					delate(sign);
				else
					printf("找不到这个人!\n");
				printf("任意键退出...\n");
				getch();
				break;

			case 8://修改账户数据
				printf("请输入银行卡号或身份证号:\n");
				scanf_s("%s", t, 29);
				sign = location_ID(t);
				if (sign == -1)
					sign = location_CordID(t);
				if (sign != -1)
					revise(sign);
				else
					printf("找不到这个人!\n");
				printf("任意键退出...\n");
				getch();
				break;

			case 9:
				if (data_save())
				{
					printf("%d条记录已经存入文件,请按任意键结束\n", UserNum);
				}
				printf("任意键退出...\n");
				getch();
				break;
			case 0:
				backups();     //备份函数  备份到文件"back.md"
				printf("备份成功!\n");
				printf("任意键退出...\n");
				getch();
				break;
			default:
				printf("输入错误!\n");
				break;

			}
		}
	}
}

 

开户

通过调用函数“open_account()”实现开户功能,输入姓名、身份证号、电话、地址得到卡号,系统生成开户日期,然后选择币种和存储类型从而实现开户,部分代码如下:

void open_account()
{
	char nowtime[30];
	char* p_nowtime;
	p_nowtime = GetNowTime(nowtime);    //获取当前时间
	int n, i;
	UserInfo* t;
	n = UserNum;
	if (n + 5 >= ArrNum)     //判断数组长度是否足够(若不足则增加一段)并留出冗余
	{
		t = (UserInfo*)realloc(arr, (ArrNum + 10) * LEN_User);     //用ralloc修改原数组的长度
		if (arr == NULL)
		{
			printf("申请内存失败,请按任意键返回主菜单");
			getch();
			exit(0);
		}
		ArrNum += 10;
	}
	printf("请输入姓名:\n");
	scanf_s("%s", arr[n].name, 19);

	printf("请输入身份证号:\n");
	scanf_s("%s", arr[n].ID_num, 24);

	printf("请输入手机号:\n");
	scanf_s("%s", arr[n].phone_id, 19);

	printf("请输入户籍:\n");
	scanf_s("%s", arr[n].address, 24);

	do
	{
		if (arr[n].sex == -1)
			goto end;
		printf("请输性别:(0男性 1女性 )\n");
		scanf_s("%d", &arr[n].sex);
	} while (!(arr[n].sex == 0 || arr[n].sex == 1));   //判断输入的有效性避免出现错误

	strcpy_s((arr[n].cord).app_time, 29, nowtime);   //时间

	do
	{
		printf("输入币种: (0人民币 1美元 2欧元)\n");
		scanf_s("%d", &(arr[n].cord).moneytype);
	} while (!(((arr[n].cord).moneytype == 0) || ((arr[n].cord).moneytype == 1) || ((arr[n].cord).moneytype == 2)));


	do
	{
		printf("输入存款期限: (0活期 1定期)\n");
		scanf_s("%d", &(arr[n].cord).phase);
	} while (!((((arr[n].cord).phase) == 0) || (((arr[n].cord).phase) == 1)));

	printf("输入存款金额:\n");
	scanf_s("%ld", &(arr[n].cord).moneynum);

	printf("设置密码:\n");
	scanf_s("%s", (arr[n].cord).password, 19);

	(arr[n].cord).status = 1;   //状态置正常
	printf("正在为您生成卡号!\n");
	strcpy_s((arr[n].cord).card_id, 29, "621700021000");      //前12位固定
	do
	{
		for (i = 0; i < 7; i++) //后7位随机
		{
			(arr[n].cord).card_id[i + 12] = (rand() % 10) + 48;
		}
		(arr[n].cord).card_id[i + 12] = '\0';
	} while (location_CordID((arr[n].cord).card_id) != -1);   //设置条件,防止重复

	arr[n].number = n + 1;    //设置编号

	printf("您的卡号是:%s \n", (arr[n].cord).card_id);

	//生成初始记录
	arr[n].record_h = (Trad_Record*)malloc(LEN_TRcord);
	if (arr[n].record_h == NULL)
	{
		printf("error!\n");
		exit(0);
	}
	strcpy_s((arr[n].record_h)->card, 29, (arr[n].cord).card_id);
	strcpy_s((arr[n].record_h)->trad_time, 29, nowtime);
	(arr[n].record_h)->trad_type = 3;
	(arr[n].record_h)->money = (arr[n].cord).moneynum;
	(arr[n].record_h)->next = NULL;
	arr[n].record_last = arr[n].record_h;

	n = n + 1;      //增加一个人
	UserNum = n;
	SaveFlag = 0; //标志未保存
end:;
}

 

注销账户

通过调用函数“unsubscribe(int n)”实现注销账户功能,通过输入银行卡号,判断是否注销此银行卡,部分代码如下:

void unsubscribe(int n)
{
	char nowtime[30];
	char* p_nowtime;
	p_nowtime = GetNowTime(nowtime);    //获取当前时间
	Trad_Record* trp;

	(arr[n].cord).status = 0;  //标志注销

	//生成记录
	trp = (Trad_Record*)malloc(LEN_TRcord);
	if (trp == NULL)
	{
		printf("error!\n");
		exit(0);
	}
	strcpy_s(trp->card, 29, (arr[n].cord).card_id);
	strcpy_s(trp->trad_time, 29, nowtime);
	trp->trad_type = 4;  //4代表注销
	trp->money = 0;
	trp->next = NULL;
	arr[n].record_last->next = trp;   //加入此记录
	arr[n].record_last = trp;		//此记录为最后一条

	SaveFlag = 0;  //标志未保存
	printf("注销完成!\n");
}

 

查询所有用户信息

通过调用函数“print_all_user()”实现查询所有用户信息的功能,通过卡号,输出所有客户信息部分代码如下:

void print_all_user()
{
	int i;
	for (i = 0; i < UserNum; i++)
	{
		printf("%-6d%-15s%-30s%-30s%-15s\n", arr[i].number, arr[i].name, arr[i].ID_num, arr[i].address, arr[i].phone_id);
	}
}

 

查询所有账户信息

通过调用函数“print_all_cord()”实现查询所有账户信息,部分代码如下:

void print_all_cord()
{
	int i;
	for (i = 0; i < UserNum; i++)
	{
		printf("%-30s%-30s%-10ld",(arr[i].cord).card_id,(arr[i].cord).app_time,(arr[i].cord).moneynum);
		printf("%-8s%-15s%-8s\n",MONEY_TYPE[(arr[i].cord).moneytype], (arr[i].cord).password, PHASE[(arr[i].cord).phase]);
	}
}

 

删除信息

删除个人信息

void delate(int n)
{
	int i;
	for (i = n; i < UserNum; i++)	//后移覆盖删除
	{
		arr[i] = arr[i + 1];
	}
	UserNum--;  //人数减一
	SaveFlag = 0;  //标志未保存
}

查询详细个人信息

void print_person(int n)  //形参是数组下标
{
	printf("\t\t\t===============账号信息===============\n\n");
	printf("卡号:%s\n\n", (arr[n].cord).card_id);
	printf("币种:%s\n\n", MONEY_TYPE[(arr[n].cord).moneytype]);
	printf("存储类型:%s\n\n", PHASE[(arr[n].cord).phase]);
	printf("开户日期:%s\n\n", (arr[n].cord).app_time);
	printf("金额:%ld\n\n", (arr[n].cord).moneynum);
	printf("注销状态:%s\n\n", STATUS[(arr[n].cord).status]);
	printf("客户姓名:%s\n\n", arr[n].name);
	printf("身份证号:%s\n\n", arr[n].ID_num);
	printf("电话:%s\n\n", arr[n].phone_id);
	printf("户籍:%s\n\n", arr[n].address);
	printf("\t\t\t===============交易记录===============\n\n");
	print_record(n);    //查看记 录函数
}

 

退出系统

可使用back做返回标识,让back初值是0,当执行case 8时使back=1 返回while循环内执行if(back==1)break;即可返回上一级。

while (1)

{

if (back == 1)

break;

scanf_s("%s", order, 9);   //防止用户输出过多数据进入死循环

switch (order[0] - 48)

{

case 1:break;

case 2:break;

case 3:break;

case 4:break;

case 5:break;

case 6:break;

case 7:break;

case 8:back = 1;break;

}

}

保存

通过调用之前说明过的函数data_save()函数保存文件,data_save()函数有返回值,返回保存用户的个数若保存失败则返回-1。

if (data_save())

{

printf("%d条记录已经存入文件,请按任意键结束\n", UserNum);

}

备份

通过调用之前说明过的函数backups()函数保存文件,backups()函数有返回值,返回保存用户的个数若保存失败则返回-1。

backups();     //备份函数  备份到文件"back.md"

printf("备份成功!\n");

printf("任意键退出...\n");

getch();

break;

 系统演示

软件测试是为了发现程序中的错误而执行程序的过程。软件测试目的是尽可能多的发现并排除软件中隐藏的错误,最终把一个高质量的软件交给用户使用。系统主界面,如图5所示:

用户功能实现

用户在进入到用户功能界面后,用户主界面,如图6所示:

取款

用户在进入到取款界面后,并且输入取款金额,再按y确认取款,完成取款详细界面,如图7所示:

存款

用户在进入到存款界面后,可以输入存款金额,并且输入存款金额,再按y确认操作详细界面如图8所示。

转账

用户在进入到转账界面后,可以通过对方账号以及对方姓名验证信息,并且输入转账金额,确认操作,详细界面如图9所示。

查询余额

用户在进入到查询余额界面后,在屏幕上输出余额,详细界面如图10所示。

查询明细

用户在进入到查询明细界面后,在屏幕上输出交易记录,详细界面如图11所示。

查询状态

用户在进入到查询状态界面后,在屏幕上输出当前状态,详细界面如图12所示。

修改密码

用户在进入到查询明细界面后,先输入身份证,再输入原密码,都正确则输入新密码,其后完成改密操作,详细界面如图13所示。

管理人员功能实现

用户在进入到用户功能界面后,界面如图14所示。

开户

用户在进入到开户界面后,先后输入姓名、身份证、手机号、户籍、性别、币种、存款类型、存款金额、登录密码,然后生成卡号完成开户,详细界面如图15所示。

注销银行卡

用户在进入到注销银行卡界面后,输入身份证号或银行卡号注销界面如图16所示。

查询账户信息

用户进入查询账户界面,输入身份证号或银行卡,输出所以信息卡号界面如图17所示。

所有客户信息

用户在进入到查看所有客户信息界面后,显示所有客户信息界面如图18所示。

所有卡信息

用户在进入到查看所有卡信息界面后,显示所有银行卡信息界面如图19所示。

删除客户信息

用户在进入到删除客户信息界面后,输入卡号或身份证号,删除该客户信息,界面如图20所示。

修改客户信息

用户在进入到修改客户信息界面后,显示所有能修改的信息列表,选择一列,输入新的信息,完成修改,详细界面如图21所示。

gitee

已在码云开源(内含文档)

C语言课设----银行综合业务平台: 本人大一的c语言课设......

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值