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 ;}

原创粉丝点击