2010年辽工程序设计大赛参赛程序--银行业务管理程序
来源:互联网 发布:太平绅士 知乎 编辑:程序博客网 时间:2024/04/28 14:30
/*******************************************************************************本程序特点: 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 ;}