技术支持课--项目实训--储蓄综合业务平台--完成--C语言编写

来源:互联网 发布:nginx 常用第三方模块 编辑:程序博客网 时间:2024/05/15 01:33
实验目的:制作储蓄综合业务平台

实验内容:实现储蓄的相应功能

* 程序头部注释开始

* 程序的版权和版本声明部分

* Copyright (c) 2011, 烟台大学计算机学院学生

 * All rights reserved.* 文件名称:

 * 作 者: 雷恒鑫

* 完成日期: 2011年12 月23 日

* 版 本 号: V1.0

* 对任务及求解方法的描述部分

* 输入描述:输入用户名和密码

* 问题描述:实现开户.存款.查询等基础功能

* 程序输出:各功能实现后的界面

* 程序头部的注释结束(此处也删除了斜杠)

--------------------------------------------------------------------------------------------------------------------------------------

bank.h

--------------------------------

//显示欢迎信息void welcome();//系统主菜单void mainmenu();//开户void openAnAccount();//销户void closeAnAcount();//存款void deposit();//取款void withdraw();//查询void query();//查找一个账户在数组中的位置int findAnAccount(int accNumber);//显示一个账户的信息void dispAnAccount(int i);//生成账号int createAccNumber();//把数据从文件中读到结构体数组中int readDate();//把结构体数组中的数据写入文件int writeDate();//检查录入的户名.密码.存入金额格式是否合法。返回值: 0: 合法.1: 非法。//flag: 0: 户名. 1:密码. 2:存入金额。checkstr: 需要检查的项目。int checkInput(int flag, char *checkStr);//去除右空格char *rightTrim(char *str);//显示所有账户void queryall();//得到键盘录入的户名void getaccName(char accName[]);//得到键盘录入的密码void getaccPWD(char accPWD[]);//得到键盘录入的金额double getcash(int flag);/*课本上没有*///得到键盘录入的账号int getaccNumber(int flag);#define N_MAXREC_NO 100//文件最大行数#define MAXLINE 256//行最大长度//数据文件记录结构struct record{int accNumber;//账号char accName[9];//户名char accPWD[7];//密码double balance;//余额char flag[2];//销户标志};//自定义数据类型typedef struct record RECORD;//结构体数组RECORD rs[N_MAXREC_NO];//最后一个账户在结构体中的位置int maxAccount = -1;/*课本上没有*/


 

------------------------------------------------------------------------------

---------------------------------------------------------------------------------

bank.c

-----------------------------------

#include <stdlib.h>#include <string.h>#include <conio.h>#include <stdio.h>#include <ctype.h>#include "bank.h"main(){char userName[9];char userPWD[7];int i;welcome();for(i = 0; i < 3; i++){printf("\n");printf("请输入您的用户名:");scanf("%s", userName);fflush(stdin);printf("\n请输入您的密码:");scanf("%s",userPWD);fflush(stdin);if ((strcmp(userName,"admin")==0) && (strcmp(userPWD,"admin")==0)){//用户名和密码正确,显示主菜单mainmenu();}else{if (i < 2){//用户名或密码错误,提示用户重新输入printf("用户名或密码错误,请重新输入!");}else{//连续三次输错用户名或密码,退出系统。printf("用户名或密码错误,退出系统!");}}}}void welcome(){printf("+----------------------------+\n");printf("|                            |\n");printf("|  欢迎使用储蓄综合业务平台  |\n");printf("|                            |\n");printf("+----------------------------+\n");}void mainmenu(){char choice;      /*我把int型改成了char型*/choice = -1;do{printf("\n");printf("+-------------------------------+\n");printf("|  存款 请按1       开户 请按4  |\n");printf("|  取款 请按2       销户 请按5  |\n");printf("|  查询 请按3       退出 请按0  |\n");printf("+-------------------------------+\n");printf("请输入您的选择:");scanf("%s", &choice);       /*我把%d改成了%s*/fflush(stdin);switch(choice){case '0':exit(0);case '1':deposit();break;case '2':withdraw();break;case '3':query();break;case '4':openAnAccount();break;case '5':closeAnAcount();break;// case 6://  queryall();//  break;default:printf("\n无效选项!");break;}}while(choice != 0);}void openAnAccount(){int accNumber;//账号char accName[9];//户名char accPWD[7];//密码double cash;//存入金额//初始化变量accNumber = 0;memset(accName, 0, sizeof(accName));memset(accPWD, 0, sizeof(accName));cash = 0;//判断是否已经超过最大用户数if (maxAccount<=(N_MAXREC_NO-2) ){//生成账号accNumber = createAccNumber();//获取账户名称getaccName(accName);//获取账户密码getaccPWD(accPWD);//获取存入金额cash = getcash(0);maxAccount++;rs[maxAccount].accNumber = accNumber;strcpy(rs[maxAccount].accName,accName);strcpy(rs[maxAccount].accPWD,accPWD);rs[maxAccount].balance = cash;strcpy(rs[maxAccount].flag,"0");//显示账户信息dispAnAccount(maxAccount);printf("开户成功!按任意键返回主菜单...");getch();return;}else{printf("您一次性开户已经超过最大用户数!按任意键返回主菜单...");getch();return;}}void dispAnAccount(int i){printf("+-------------------------------------------------+\n");printf("| %-5s | %-8s | %-6s | %-12s | %4s |\n","账号","户名","密码","余额","状态");printf("+-------+----------+--------+--------------+------+\n");printf("| %5d | %-8s | %-6s | %-12.2f | %4s |\n",rs[i].accNumber,rs[i].accName,rs[i].accPWD,rs[i].balance,atoi(rs[i].flag)?"销户":"正常");printf("+-------------------------------------------------+\n");}int createAccNumber(){if(maxAccount == -1){//账号从开始return 10001;}else{//顺序产生账号return rs[maxAccount].accNumber + 1;}}void getaccName(char accName[]){char caccName[100];//户名int i = 1;while(i){memset(caccName, 0, sizeof(caccName));printf("\n");printf("请输入储户户名:");scanf("%s", caccName);fflush(stdin);if(checkInput(0,caccName)){printf("超过位的最大户名长度!\n");continue;}i = 0;}memcpy(accName, caccName, 9);}void getaccPWD(char accPWD[]){char caccPWD[100];//密码int i = 1;while(i){memset(caccPWD, 0, sizeof(caccPWD));printf("\n");printf("请输入储户密码:");scanf("%s", caccPWD);fflush(stdin);if(checkInput(1,caccPWD)){printf("超过位的最大密码长度!\n");continue;}i = 0;}memcpy(accPWD, caccPWD, 7);}double getcash(int flag){char ccash[100];//金额double dcash;//金额int i = 1;while(i){memset(ccash, 0, sizeof(ccash));dcash = 0;printf("\n");switch(flag){case 0: printf("请输入存入金额:");break;case 1: printf("请输入取款金额:");break;}scanf("%lf",&dcash);     //不是1f而是lf;fflush(stdin);sprintf(ccash,"%12.2f",dcash);if(checkInput(2,ccash)){printf("录入的金额超过位的最大存入(取出)金额长度!\n");continue;}i = 0;}return dcash;}int checkInput (int flag, char *checkStr){switch(flag){//检查户名是否超过最大长度case 0:{if(strlen(checkStr) > 8){return 1;}break;}//检查密码是否超过最大长度case 1:{if(strlen(checkStr) > 6){return 1;}break;}//检查存入金额是否超过最大长度case 2:{if(strlen(checkStr) > 12){return 1;}break;}default:return 0;}return 0;}void deposit(){int accNumber;//帐号int accountPosition;//账户在数组中的位置(下标)double cash;//存入金额//初始化accNumber = 0;accountPosition = -1;//-1,表示未找到cash = 0;//获取存款帐号accNumber = getaccNumber(0);//查找该账户accountPosition = findAnAccount(accNumber);if (accountPosition== -1){printf("查无此帐户,按任意键返回...");getch();return;}//显示帐户信息dispAnAccount(accountPosition);//以销户帐户,不能进行存款操作if (strcmp(rs[accountPosition].flag,"0") !=0){printf("该帐户已经销户,不能存款!按任意键返回...");getch();return;}//获取存入金额cash = getcash(0);//存款金额不能为0或负数if (cash<=0){printf("存款金额不能为负数!按任意键返回...");getch();return;}rs[accountPosition].balance = rs[accountPosition].balance + cash;//显示帐户信息dispAnAccount(accountPosition);printf("存款成功!按任意键返回...");getch();}int getaccNumber( int flag){int iaccNumber;//帐号iaccNumber= 0;printf("\n");switch(flag){case 0 : printf ("请输入要存款的帐号:"); break;case 1 : printf ("请输入要取款的帐号:"); break;case 2 : printf ("请输入要销户的帐号:"); break;    case 3 : printf ("请输入要查询的帐号:"); break;}scanf("%d",&iaccNumber);fflush(stdin);return iaccNumber;}int findAnAccount(int accNumber){int accountPosition;//帐户在数组中的位置int i;//循环控制变量//初始位置是-1,表示未找到accountPosition = -1;//查找帐户的位置if (accNumber<=rs[maxAccount].accNumber && accNumber>=10001)/*老师加分*/{for (i=0;i<=maxAccount;i++){if(rs[i].accNumber == accNumber){accountPosition = i;break;}}}return accountPosition;}void withdraw(){char accPWD[7];//密码int accNumber;//帐号int accountPosition;//账户在数组中的位置(下标)double cash;//取款金额//初始化accNumber = 0;accountPosition = -1;//-1,表示未找到cash = 0;//获取取款帐号accNumber = getaccNumber(1);//查找该账户accountPosition = findAnAccount(accNumber);if (accountPosition== -1){printf("查无此帐户,按任意键返回...");getch();return;}//显示帐户信息dispAnAccount(accountPosition);//以销户帐户,不能进行取款操作if (strcmp(rs[accountPosition].flag,"0") !=0){printf("该帐户已经销户,不能取款!,按任意键返回...");getch();return;}//获取要查询的帐户密码getaccPWD(accPWD);//密码不正确if (strcmp(rs[accountPosition].accPWD,accPWD) != 0){printf("\n密码不正确,按任意键返回...");getch();return;}//获取取款金额cash = getcash(1);//取款金额不能为0或负数if (cash<=0){printf("存款金额不能为负数!按任意键返回...");getch();return;}//取款是否超出存款金额if ((rs[accountPosition].balance - cash)<0){printf("您的取款金额已超过存款金额,不能取款!,按任意键返回...");getch();return;}rs[accountPosition].balance = rs[accountPosition].balance - cash;//显示帐户信息dispAnAccount(accountPosition);printf("取款成功!按任意键返回...");getch();}void query(){int accNumber;//帐号char accPWD[7];//密码int accountPosition;//帐户在数组中的位置//初始位置是-1,表示未找到accountPosition = -1;accNumber = 0;memset(accPWD,0,sizeof(accPWD));//获取要查询的帐号accNumber = getaccNumber(3);//获取要查询的帐户密码getaccPWD(accPWD);//查找该帐户accountPosition = findAnAccount(accNumber);if (accountPosition== -1){printf("查无此帐户,按任意键返回...");getch();return;}//显示帐户信息dispAnAccount(accountPosition);//密码不正确if (strcmp(rs[accountPosition].accPWD,accPWD) != 0){printf("\n密码不正确,按任意键返回...");getch();return;}//已销户帐户if (strcmp(rs[accountPosition].flag,"0") != 0){printf("\n该账户已经销户!按任意键返回...");getch();return;}printf("\n查询成功!按任意键返回...");getch();return;}//销户void closeAnAcount(){int accNumber;//账号char accPWD[7];//密码char userAnswer;//用户的回答int accountPosition;//账户在数组中的位置//初始化accountPosition = -1;//-1,表示未找到accNumber = 0;memset (accPWD,0,sizeof(accPWD));//获取要销户的账号accNumber = getaccNumber(2);//获取要销户的账户密码getaccPWD(accPWD);//查找该账户accountPosition = findAnAccount(accNumber);if (accountPosition == -1){printf("查无此帐户,按任意键返回...");getch();return;}//显示账户信息dispAnAccount(accountPosition);//密码不正确if (strcmp(rs[accountPosition].accPWD,accPWD) != 0){printf("\n密码不正确,按任意键返回...");getch();return;}//销户已销户if (strcmp(rs[accountPosition].flag,"0") != 0){//已销户账户,不能再次销户printf("\n该账户已经销户,不能再次销户,按任意键返回...");getch();return;}printf("确认将账户%d销户吗?【1:销户|其他:不销户】",rs[accountPosition].accNumber);scanf("%c",&userAnswer);fflush(stdin);if (userAnswer == '1'){strcpy(rs[accountPosition].flag, "1");rs[accountPosition].balance = 0;dispAnAccount(accountPosition);printf("销户成功!按任意键返回...");getch();return;}printf("用户取消销户!按任意键返回...");getch();return;}


 

 ========================================================================

运行的部分结果:

----------------------------------------------------------------------------------------------------------------------------------------------------------

经验积累:

1.有了自定义函数,主函数就轻松多了。

2.为了使程序更加好懂,每个自定义函数只需实现一种功能即可。