/*******************************************************************************
本程序特点:
1.按要求使用了相关数据结构 实现了要求的所有功能 并在功能上有所扩展
2.程序多次使用了 ?:表达式、do.while 循环 等 代码比较简洁
3.程序遵循了"少用goto" 等设计原则 程序安全性较好
4.程序重设了某些dos窗口参数 界面比较友好
参赛者:电子与信息工程学院 电子081班 王群峰 080404020
决赛题目2:银行业务管理程序
程序说明:
生僻函数:
1. system(char *) 调用DOS命令
2. fflush(stdin) 清空输入缓冲区
程序执行顺序:
1. 定义所需数据
2. 初始化
3. 打印命令列表(BEGIN标号)
4. 提示用户输入命令
5. 根据用户输入命令执行相关操作(switch 结构)
5.1(情形1) 转到相应函数,执行结束后跳出switch 结构
5.2(情形2) do{
5.2.1提示用户输入卡号(非必选步骤)
if(卡号为负) 结束程序
5.2.2提示用户输入金额
5.2.3执行相应函数
}while(5.2.3的函数执行返回了错误的结果)
跳出switch 结构
5.3(情形3) 提示命令输入错误 跳出switch 结构
6. 暂停程序、便于用户观察程序执行结果
7. 无条件跳转到BEGIN 重复执行3-6步骤
8. return 0
关于编译器:
本程序已在 VC++6.0环境 和 DevC++4.9 环境下调试通过
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define M 100
#define N 10
/*****************************以下为程序使用的 数据结构 *************************/
/*
变量、类型使用:
1.card[M][N+3] 核心数据结构 当前内存中的记录 包括卡号、余额、单条交易记录
2.struct result(类型) 包含简单数据的结构体 供各函数返回多数据时使用
*/
struct result{
int cardId;
double moneyLeft;
short int status;
};
double card[M][N+3]={0};
/*********************************************************************************/
/*****************************以下为函数声明**************************************/
/*
函数返回值类型说明:
1.short int 状态指示: 0 正常 、1 异常
2.struct result 带有状态标志的结构体 其状态码 0 正常、1 异常
3.void 顺序执行 无返回值
*/
void menu(); //显示命令列表
void init(); //初始化 工作包括:1.将每张卡的状态复位 2.创建欢迎界面
struct result mkId(double money);//添加账户
struct result putMoney(int cardId,double money);//存取款操作
void look(); //查看账户列表
struct result search(int cardId);//查询账户信息
short int rmId(int cardId); //注销账户
void printId(int cardId); //打印单张卡的详细记录
/*********************************************************************************/
/******************************下面main函数***************************************/
int main(){
char CMD;
short int curStatus = -1 ;
int cardId = -1;
double money = 0;
struct result curres;
init(); //初始化 1.将每张卡的状态复位 2.创建欢迎界面
BEGIN:
menu(); //显示命令列表
fflush(stdin); //每次从控制台读入数据前清空缓冲区 下同
scanf("%c",&CMD); //读取用户命令
switch(CMD){// 根据用户输入命令执行相关操作
case '1':
do{
printf("输入您的账户(卡号)和金额 (以空格分开)\n");
printf("提示:存款直接输入金额、取款输入相应的金额的相反数\n");
fflush(stdin);scanf("%d%lf",&cardId,&money);
if(cardId<0) exit(0);//输入负的卡号 、程序结束
curres = putMoney(cardId,money);
}while(curres.status);//只有存款函数被正确执行才能跳出循环 否则一直尝试存款操作
printf("存款成功!\n");
printf("您的账户(卡号):%d\t余额%.2f\n",curres.cardId,curres.moneyLeft);
break;
case '2':
do{
printf("请输入预存款额:\n");
fflush(stdin);scanf("%lf",&money);
curres = mkId(money);
}while(curres.status);//只有开户函数被正确执行才能跳出循环 否则一直尝试开户操作
printf("开户成功!\n");
printf("您的账户(卡号):%d\t余额%.2f\n",curres.cardId,curres.moneyLeft);
break;
case '3':
look();
break;
case '4':
do{
printf("输入您要搜索的账号:\n");
fflush(stdin);scanf("%d",&cardId);
if(cardId<0) exit(0); //输入负的卡号 、程序结束
curres = search(cardId);
}while(curres.status);//只有查询函数被正确执行才能跳出循环 否则一直尝试查询操作
printId(curres.cardId);//输出找到的账号的相关信息
break;
case '5':
do{
printf("输入要注销的账号:\n");
fflush(stdin);scanf("%d",&cardId);
if(cardId<0) exit(0);//输入负的卡号 、程序结束
curStatus = rmId(cardId);
}while(curStatus); //只有注销函数被正确执行才能跳出循环 否则一直尝试注销操作
printf("您的账户(卡号):%d 已注销!\n",cardId);
break;
case '6':
exit(0);
break;
default:
printf("提示:输入了未定义的命令!\n");
break;
}
system("pause");//DOS 命令 暂停程序 供用户观察程序运行结果
goto BEGIN;//转到BEGIN 程序不会自动结束 用户必须在提示输入命令时输入6以结束程序 或 输入负的卡号 或 强制关闭程序
return 0;//返回0 由于上面已跳转 实质上程序永远执行不到此处
}
/*********************************************************************************/
/******************************下面各函数实现*************************************/
void menu(){
system("cls");//每次向控制台输出大量信息前清屏 下同
printf("=======================操作命令列表============================\n");
printf("1.用户存取款(必须有账户) 2.开户(必须存入一定数量的款额才能开户) \n");
printf("3.查看当前用户列表 4.搜索账号信息(必须有账户)\n");
printf("5.注销用户(必须有账户) 6.退出程序\n");
printf("===============================================================\n");
printf(" 提示输入卡号时输入一个负值可以结束当前程序\n");
printf("===============================================================\n");
}
void init(){
unsigned int i=0,j=0;
for(i = 0;i<M;++i){
card[i][0] = i; //分配卡号 0~M
card[i][1] = -1; //分配余额 -1 表示该卡未使用
card[i][2] = 0; //分配当日进行业务次数
for(j = 3;j<N+3;++j){//将所有交易记录清零
if(card[i][j]!=0)card[i][j]=0;
}
}
system("title 银行业务管理程序");//DOS命令 设置窗口标题
system("color 37"); //DOS 命令 设置窗口文本与背景颜色
system("cls");
printf("=====================银行业务管理程序==========================\n");
printf("\n");
printf("业务处理能力:\n\n");
printf("支持账户数目:%d,支持单账户一日内最大业务次数%d\n",M,N);
printf("\n");
printf("提示:如果您不小心输入了不恰当的命令。。。\n");
printf("您可以在程序提示输入卡号时输入一个负值以结束当前程序\n");
printf("\n\n\n");
printf("===============================================================\n");
printf(" 决赛题目2:银行业务管理程序\n");
printf(" 电子与信息工程学院 电子081班 王群峰 080404020\n");
printf("===============================================================\n");
system("pause");
}
/*
struct result mkId(double) 开户 账户由系统分配 只需输入初始金额
*/
struct result mkId(double money){
struct result strTmp;
unsigned int i=0;
strTmp.cardId = -1;
strTmp.moneyLeft = -1;
strTmp.status = 1;
if(money<=0){ //不拿钱就想开户 不通过
printf("提示:开户必须先存入一定数额的钱!\n");
return strTmp;
}
for(i=0;i<M;++i){
if(card[i][1] == -1){//遇到空卡 则执行开户动作
card[i][1] = money; //记录余额
card[i][2] = 1; //业务次数
card[i][3] = money; //插入记录
strTmp.cardId = i;
strTmp.moneyLeft = money;
strTmp.status = 0;
printf("提示: 开户成功!\n");
return strTmp;
}
}
//没有空卡 返回错误信息
printf("提示:账户已满!\n");
return strTmp;
}
/*
struct result putMoney(int cardId,double money) 作用:存取款操作
money 为正存钱 为负取钱 处理时不分存取 直接在原有数额中加上 money
*/
struct result putMoney(int cardId,double money){
unsigned int i=0;
struct result strTmp;
//此处将返回值赋予错误值 只有当存取过程顺利进行后才会返回正确值 否则返回此错误值
strTmp.cardId=-1;
strTmp.moneyLeft = 0;
strTmp.status = 1;
if(cardId>=M || cardId<0 || money ==0 ||card[cardId][1]==-1){
//基本输入错误
(cardId>=M || cardId<0) ? printf("提示:账户(卡号)输入错误!\n")
: ( money ==0 ? printf("提示:不能存 | 取0元!\n")
: printf("提示:空账户!\n")
) ;
return strTmp;
}
if(money+card[cardId][1] < 0 || card[cardId][2]>=N){
//数据错误
(money+card[cardId][1] < 0 ) ? printf("提示:您的账号中没有足够数目的钱!\n")
: printf("提示:您的账号存储区已满!\n") ;
return strTmp;
}
for(i=3;i<N+3;++i){//找到一条未写入记录的位置 插入记录 返回
if(card[cardId][i]==0){
card[cardId][i] = money; //插入记录
card[cardId][1] += money; //累加余额
++card[cardId][2]; //更新已进行业务次数
strTmp.cardId=(int)card[cardId][0];
strTmp.moneyLeft = card[cardId][1];
strTmp.status = 0;
return strTmp;
}
}
return strTmp;
}
/*
void look() 显示账户列表
*/
void look(){
unsigned int i=0,j=0;
double money = 0;
system("cls");
printf("====================== 账户列表清单===========================\n");
printf("\n");
printf("%10s\t%10s\t%10s\n","卡号","余额","今日交易次数\n");
for(i=0;i<M;++i){
if(card[i][1]!=-1){
printf("%10d\t%10.2f\t%10d\n",(int)card[i][0],card[i][1],(int)card[i][2]);
money += card[i][1]; //money 记录总余额
++j; // j 记录有效卡数目
}
}
printf("\n");
printf("===============================================================\n");
printf("共%d个正在使用的账户,共存款%.2f元\n",j,money);
printf("还有%d个可用账户\n",M - j);
printf("===============================================================\n");
return ;
}
/*
struct result search(int cardId) 作用:查询账户信息
*/
struct result search(int cardId){
struct result strTmp;
strTmp.cardId=-1;
strTmp.moneyLeft = 0;
strTmp.status = 1;
if(cardId>=M || cardId<0 || card[cardId][1]==-1){
(cardId>=M || cardId<0) ? printf("提示:账户(卡号)输入错误!\n")
: printf("提示:空账户!\n");
return strTmp;
}
strTmp.cardId=(int)card[cardId][0];
strTmp.moneyLeft = card[cardId][1];
strTmp.status = 0;
return strTmp;
}
/*
short int rmId(int cardId) 作用:注销账户
*/
short int rmId(int cardId){
int i=0;
if(cardId>=M || cardId<0 || card[cardId][1]==-1){
(cardId>=M || cardId<0) ? printf("提示:账户(卡号)输入错误!\n")
: printf("提示:空账户!\n");
return 1;
}
//复位账户交易记录及余额
for(i=1;i<N+3;++i){
(i==1) ? (card[cardId][i]= -1 ) : (card[cardId][i]= 0);
}
printf("注销成功!\n");
return 0;
}
/*
void printId(int cardId) 打印账户信息
*/
void printId(int cardId){
unsigned int i=0;
double money=0;
if(cardId>=M || cardId<0){
printf("提示:账户(卡号)输入错误!\n");
return;
}
system("cls");
printf("========================账户信息===============================\n");
printf("账户(卡号):%d\t 余额:%.2lf\t今日交易次数:%d条\n",
(int) card[cardId][0],
card[cardId][1],
(int) card[cardId][2] );
printf("今日交易记录:\n");
for(i=3;i<N+3;++i){
if(!card[cardId][i]) continue; //遇到空记录 跳过
printf("%.2lf\t",card[cardId][i]);
}
printf("\n");
printf("===============================================================\n");
return ;
}
2010年辽工程序设计大赛参赛程序--银行业务管理程序
最新推荐文章于 2024-09-19 23:18:29 发布