2010年辽工程序设计大赛参赛程序--银行业务管理程序

/*******************************************************************************
本程序特点:
                  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 ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sanzhong104204

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

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

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

打赏作者

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

抵扣说明:

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

余额充值