今天给大家一个比较综合的项目:嗖嗖移动业务大厅。项目功能很多,概括的功能也很全面。吃透了这个项目,你的java基础部分已经非常棒了!!!

一 、 项目概述

技能要求

 使用面向对象设计的思想

 合理运用异常处理

 使用集合框架存储数据,不使用数据库

 使用 I/O 操作实现对文件的读写

开发工具

JDK 7.0、MyEclipse。

需求概述

移动、联通、电信是国内三大通信运营商,每个运营商提供了不同的品牌套餐来应对不同的用户群,例如北京移动,主要有全球通、神州行、动感地带三大品牌套餐,每种套餐的内容和资费不同。现嗖嗖移动是一拟定的通信运营商,提供了话唠套餐、网虫套餐、超人套餐,各种套餐所包含的服务内容及资费如表 1 所示。

如实际使用中,超出套餐内包含的通话时长、短信条数或上网流量时,按以下规则计费:

 超出的通话:0.2 元/分钟

 超出的短信:0.1 元/分钟

 超出的上网流量:0.1 元/MB

本项目嗖嗖移动业务大厅提供了嗖嗖移动用户的日常常用功能,包括新用户注册、本月账单查询、套餐余量查询、打印消费详单、套餐变更、办理退网、话费充值、查看消费记录、查看资费说明功能,另外,还可以模拟用户通话、上网、发短信的场景进行相应的扣费并记录消费信息。各功能介绍如表 2 所示。

二 、 项目业务流程描述

1.整体业务流程

嗖嗖移动项目的各个功能实际都是挂在功能菜单上的,其中主菜单包含 6 个功能,当用户输入 1~5 之间的功能编号后,验证卡号,如果该卡号已注册,执行相应功能后返回主菜单,否则,退出系统。如图 1 所示。

图 1 主菜单

当使用已注册用户登录并通过验证后,即显示二级菜单,包含 5 个功能,如图 2 所示。当输入 1~5 之外的功能编号时,返回主菜单。

图 2 二级菜单

2. 用户注册

该功能可以看作是去营业厅办理新卡的过程。主要分成以下几个步骤:

1) 选择卡号(从随机生成的 9 个以“139”开头的卡号中选择一个,输入序号即可)。

2) 选择套餐(共 3 类套餐,选择其中一个,输入所对应的序号即可)。

3) 输入用户名、密码信息(相当于现在各营业厅的实名登录,输入用户名和密码即可)。

4) 输入预存话费金额:这里需保存预存的金额足以支付一个月的套餐费用,否则给出信息提示“您预存的话费金额不足以支付本月固定套餐资费,请重新充值!”。

5) 注册新卡

实现效果如图 3 所示。

图 3 用户注册

3. 本月账单查询

本月账单可以显示以下信息:

 卡号。

 套餐月资费。

 合计(是套餐固定资费和超出套餐使用费用总和)。

 账户余额。

运行效果如图 4 所示。

图 4 本月账单查询

4. 套餐余量查询

本功能用来显示该卡所属套餐内所剩余的免费通话时长、短信条数、上网流量,不同品牌套餐所支持的服务不同,因此显示的内容不同。运行效果如图 5 所示。

图 5 套餐余量查询

5. 添加和打印消费清单

实现向消费记录中添加一条该卡的消费记录(该功能可在使用嗖嗖功能中调用),并实现打印该卡的消费记录,打印前先从消费记录中查找是否存在此卡的消费记录,如存在则提示“已添加一条消费记录。”,将消费记录输出到文本文件中,格式如图 5 所示。如不存在,提示用户相应信息,如图 6 所示。

图 5 消费记录

图 6 该卡不存在消费记录

6.使用嗖嗖

(1)随机进入某个场景

模拟嗖嗖用户使用卡的过程。选择该功能后,输入当前卡号,通过验证后,可随机进入表 3 所示的 6 个场景(当然还可以再设计其他场景),要求所进入的场景的服务类型是该卡所属套餐所支持的(例如网虫套餐只能进入服务类型为“上网”的场景)。

(2)模拟消费

进入该场景这之后,将按场景的描述要求消耗套餐余量,如套餐余量不足,需按套餐外的资费规则扣费,成功消费后,添加一条消费记录。效果如图 7 所示。

图 7 使用嗖嗖成功

余额不足时,提示信息。如本场景通话时长为 30 分钟,当通话至 10 分钟时余额不足,抛出异常,并提示用户“本次已通话 10 分钟,您的余额不足,请充值后再使用!”如图 8所示

图 8 余额不足的情况

(3)消费结束,添加消费记录

消费完毕,在消费列表中添加一条消费记录。并提示用户“已添加一条消费记录!”。按实际消费添加消费记录,除非没有消费。如图 8 的情况,则此条消费记录只需记录实际通话时长 10 分钟。

7. 办理退网

本功能可实现将当前卡用户从已注册用户列表中删除,删除后直接退出系统。运行效果如图 9 所示。

图 9 办理退网

8. 套餐变更

本功能类似我们去营业厅变量套餐,可以充分体会到使用面向对象后,代码更加灵活,可维护性更强。

本项目中没有引入对日期的记录和处理,因此,这里默认套餐变更时间为本月的开始,选择变量后的套餐为当前套餐之外的其他类型,否则显示信息提示。如图 10 所示。

图 10 选择套餐错误

选择套餐正确之后,还需判断当前余额是否足以支付一个月的套餐资费,如不足,提示错误信息。如图 11 所示。

图 11 变更套餐余额不足

如上述两个条件都满足时,套餐变量成功,显示相应信息,如图 12 所示。当前卡实际使用数据清零,当前卡所属套餐修改为变量后的套餐类型,当前卡余额减去新套餐月资费,本月消费金额修改为新套餐月资费。

图 12 套餐变更成功

9. 话费充值

可为指定卡号充值,要求充值金额最少 50 元。充值成功后提示信息。运行效果如图 13所示。

图 13 充值成功

通过最少充值金额验证后,修改当前卡余额即可。

10. 查看资费说明

此功能需实现将文本文件(套餐资费说明.txt)中的信息显示到控制台。本功能需使用 I/O 操作实现文本文件的写入。

以上是嗖嗖项目的整体需求概述,下面介绍如何搭建嗖嗖项目的框架结构:

一、 实体类(Entity)

二、工具类 (utils)

下面是项目的整体代码结构:

实体类中的其中一个手机卡类:

1 package cn.soso.entity; 2 /** 3 * 手机卡 4 * 5 */ 6 public class MobileCard { 7 private String cardNumber; //卡号 8 private String userName; //用户名 9 private String passWord; //密码 10 private ServicePackage serPackage; //所属套餐 11 private double consumAmount; //当月消费金额 12 private double money; //账户余额 13 private int realTalkTime; //实际通话时长(分钟) 14 private int realSMSCount; //实际发送短信条数(条) 15 private int realFlow; //实际上网流量 16 17 public MobileCard(){} 18 19 public MobileCard(String userName, String passWord, String cardNumber, 20 ServicePackage serPackage, double consumAmount, double money) { 21 super(); 22 this.userName = userName; 23 this.passWord = passWord; 24 this.cardNumber = cardNumber; 25 this.serPackage = serPackage; 26 this.consumAmount = consumAmount; 27 this.money = money; 28 } 29 30 public String getUserName() { 31 return userName; 32 } 33 34 public void setUserName(String userName) { 35 this.userName = userName; 36 } 37 38 public String getPassWord() { 39 return passWord; 40 } 41 42 public void setPassWord(String passWord) { 43 this.passWord = passWord; 44 } 45 46 public String getCardNumber() { 47 return cardNumber; 48 } 49 50 public void setCardNumber(String cardNumber) { 51 this.cardNumber = cardNumber; 52 } 53 54 public ServicePackage getSerPackage() { 55 return serPackage; 56 } 57 58 public void setSerPackage(ServicePackage serPackage) { 59 this.serPackage = serPackage; 60 } 61 62 public double getConsumAmount() { 63 return consumAmount; 64 } 65 66 public void setConsumAmount(double consumAmount) { 67 this.consumAmount = consumAmount; 68 } 69 70 public double getMoney() { 71 return money; 72 } 73 74 public void setMoney(double money) { 75 this.money = money; 76 } 77 78 public int getRealTalkTime() { 79 return realTalkTime; 80 } 81 82 public void setRealTalkTime(int realTalkTime) { 83 this.realTalkTime = realTalkTime; 84 } 85 86 public int getRealSMSCount() { 87 return realSMSCount; 88 } 89 90 public void setRealSMSCount(int realSMSCount) { 91 this.realSMSCount = realSMSCount; 92 } 93 94 public int getRealFlow() { 95 return realFlow; 96 } 97 98 public void setRealFlow(int realFlow) { 99 this.realFlow = realFlow;100 }101 102 /**103 * 显示卡信息104 */105 public void showMeg(){106 System.out.println("卡号:"+this.cardNumber+" 用户名:"+this.userName+" 当前余额:"+this.money+"元。");107 this.serPackage.showInfo();108 } 109 }

整体业务流程类:

1 package cn.soso.biz; 2 3 import java.util.Scanner; 4 5 import cn.soso.common.Common; 6 import cn.soso.entity.MobileCard; 7 import cn.soso.entity.ServicePackage; 8 import cn.soso.utils.CardUtil; 9 10 /** 11 * 业务类 12 * 13 * 14 */ 15 public class SosoMgr { 16 Scanner input = new Scanner(System.in); 17 CardUtil utils = new CardUtil(); 18 19 public static void main(String[] args) { 20 SosoMgr soso = new SosoMgr(); 21 soso.mainMenu(); 22 System.out.println("谢谢使用!"); 23 } 24 25 /** 26 * 主流程 27 */ 28 public void mainMenu() { 29 int menuChoose = 0; 30 String mobileNumber= ""; 31 String password = ""; 32 utils.init(); 33 utils.initScenes(); 34 //Common.typesInit(); 35 do { 36 System.out.println("\n*************欢迎使用嗖嗖移动业务大厅***************"); 37 System.out.println("1.用户登录 2.用户注册 3.使用嗖嗖 4.话费充值 5.资费说明 6.退出系统"); 38 System.out.print("请选择:"); 39 menuChoose = input.nextInt(); 40 // 分支语句:根据功能编号执行相应功能 41 switch (menuChoose) { 42 case 1: 43 //用户登录 44 System.out.print("请输入手机卡号:"); 45 mobileNumber = input.next(); 46 System.out.print("请输入密码:"); 47 password = input.next(); 48 if (utils.isExistCard(mobileNumber, password)) { 49 cardMenu(mobileNumber); 50 }else{ 51 System.out.println("对不起,您输入的信息有误,无法登录!"); 52 } 53 continue; 54 case 2: 55 //用户注册 56 registCard(); 57 continue; 58 case 3: 59 60 //使用嗖嗖 61 System.out.print("请输入手机卡号:"); 62 mobileNumber = input.next(); 63 64 if (utils.isExistCard(mobileNumber)) { 65 try { 66 /* System.out.println("****使用之前****"); 67 utils.showRemainDetail(mobileNumber); 68 utils.showAmountDetail(mobileNumber);*/ 69 utils.userSoso(mobileNumber); 70 } catch (Exception e) { 71 System.err.println(e.getMessage()); 72 } 73 }else{ 74 System.out.println("对不起,该卡号未注册,不能使用!"); 75 } 76 77 /*System.out.println("****使用之后****"); 78 utils.showRemainDetail(mobileNumber); 79 utils.showAmountDetail(mobileNumber);*/ 80 continue; 81 case 4: 82 //话费充值 83 System.out.print("请输入充值卡号:"); 84 mobileNumber = input.next(); 85 if (utils.isExistCard(mobileNumber)) { 86 System.out.print("请输入充值金额:"); 87 double money = input.nextDouble(); 88 utils.chargeMoney(mobileNumber, money); 89 }else{ 90 System.out.println("对不起,要充值的卡号未注册,无法充值!"); 91 } 92 continue; 93 case 5: 94 System.out.println("\n*****资费说明******"); 95 utils.showDescription(); 96 continue; 97 case 6: 98 //退出系统 99 break;100 default:101 //选择其他数字退出系统102 break;103 }104 break;105 } while (true);106 }107 108 /**109 * 手机卡功能菜单110 * 111 * @param number112 * @return113 */114 public int cardMenu(String mobileNumber) {115 int menuChoose = 0;116 do {117 System.out.println("\n*****嗖嗖移动用户菜单*****");118 System.out.println("1.本月账单查询");119 System.out.println("2.套餐余量查询");120 System.out.println("3.打印消费详单");121 System.out.println("4.套餐变更");122 System.out.println("5.办理退网");123 System.out.print("请选择(输入1~5选择功能,其他键返回上一级):");124 menuChoose = input.nextInt();125 switch (menuChoose) {126 case 1:127 System.out.println("\n*****本月账单查询******");128 utils.showAmountDetail(mobileNumber);129 continue;130 case 2:131 System.out.println("\n*****套餐余量查询******");132 utils.showRemainDetail(mobileNumber);133 continue;134 case 3:135 System.out.println("\n*****消费详单查询******");136 utils.printConsumInfo(mobileNumber);137 continue;138 case 4:139 System.out.println("\n*****套餐变更******");140 System.out.print("1.话唠套餐 2.网虫套餐 3.超人套餐 请选择(序号):"); 141 utils.changingPack(mobileNumber, input.next());142 continue;143 case 5:144 System.out.println("\n*****办理退网******");145 utils.delCard(mobileNumber);146 System.out.println("谢谢使用!");147 System.exit(1); //办理退网后退出系统 148 149 }150 151 break;152 } while (true);153 return menuChoose;154 }155 156 /**157 * 注册新卡流程158 */159 public void registCard(){160 String[] newNumbers = utils.getNewNumbers(9);161 //显示可供选择的手机号列表162 System.out.println("*****可选择的卡号*****");163 164 for(int i=0;i<9;i++){165 System.out.print((i+1)+"."+newNumbers[i]+"\t\t");166 if((i+1)%3==0){167 System.out.println();168 }169 }170 //选择手机号171 System.out.print("请选择卡号(输入1~9的序号):"); 172 String number = newNumbers[input.nextInt()-1];173 174 //选择套餐类型175 System.out.print("1.话唠套餐 2.网虫套餐 3.超人套餐, ");176 System.out.print("请选择套餐(输入序号):");177 //utils.getPackList();178 //获取套餐对象 179 ServicePackage pack = utils.createPack(input.nextInt());180 181 //输入用户名182 System.out.print("请输入姓名:");183 String name = input.next();184 185 //输入密码186 System.out.print("请输入密码:");187 String password = input.next();188 189 //输入预存话费金额190 double money = 0;191 System.out.print("请输入预存话费金额:");192 money = input.nextDouble();193 while(money

Java输入小数和整数求COSx_嗖嗖移动大厅 源代码 Java初级小项目相关推荐

  1. c语言求两个数的乘积和商,输入两个整数,求出它们的商数

    编写一个程序,输入两个整数,计算并输出它们的和,乘积,差,商和余数,C语言, #includevoidmain(){inta,b;printf("Inputtwointegers:" ...

  2. 在python中输入10个整数并求出最大值_python练习题 :用户任意输入10个整数到列表中,然后由大到小排列并输出。...

    一:填空题: 1.python是一种面向_对象 __的高级语言. 2.python可以在多种平台运行,这体现了python的___可移植___特性. 3.python源代码被解释器转换后的格式为___ ...

  3. java吃货联盟系统源码_小项目,吃货联盟,java初级小项目,源代码

    小项目,吃货联盟,java初级小项目,源代码 1importjava.util.Scanner;23/**4* 吃货联盟订餐管理系统5*6*/7publicclassOrderingMsg {8pub ...

  4. java输入两个整数_求平均值._用C语言编写:完成从键盘输入两个整数a和b,求平均值ave,并输出平均值...

    #includevoid main(){int a,b,ave;printf("输入两个整数:');scanf("%d%d",&a,&b);ave=(a+ ...

  5. java输入两个整数_Java中从键盘输入多个整数的方法

    例题:求数列的和 分别输入两个整数n,m,中间以空格隔断,n 为数列第一项,后面各项均为前一项的开根号,求前m项的和. 第一种从键盘输入并读取的方式:sc.hasNextInt() 函数和sc.nex ...

  6. 用c语言编写两整数乘积,c语言两个数相乘求积 c语言输入两个整数求乘积

    C语言中求两数相乘的程序? 思路:double类型的范围: -1.7*10(-308)-1.7*10(308),如果两个数的乘积不超过这样的精度,可以直接使用*符号进行运算. 参考代码: #inclu ...

  7. c语言输入10个整数 求偶数个数6,任意输入10个整数,输出其中的偶数,和偶数的个数...

    任意输入10个整数,输出其中的偶数,和偶数的个数 一 . 运用java代码如下: package bean; import java.util.Scanner; public class b { pu ...

  8. JAVA 把小数分成整数和小数

    在进行进制转换的时候,我们需要把小数分为整数和小数两部分. 这里介绍两种方法. 第一种举个例子:1.23分为1 和 0.23 第二种:1.23 分为 1 和23 有时需要具体情况具体分析自己需要哪种类 ...

  9. Java 输入三个整数 从小到大排列

    今天突然一想控制台输入三个数,如何将这三个数从小到大排序 经过短暂的思考,直接上代码: public class Test04 {public static void main(String[] ar ...

  10. java 多阶矩阵求逆_求N阶矩阵的逆矩阵 java

    求N阶矩阵的逆矩阵 java 别妄想泡我 911次浏览 2020年08月01日 16:49 最佳经验 本文由作者推荐 1毫升等于多少升-岂止的意思 import r; public class 求逆矩 ...

最新文章

  1. 算力超英伟达?华为推出两款“昇腾”芯片;五大AI战略正式公布
  2. R语言stringr包str_count函数计算字符串匹配个数实战
  3. 器官复刻、脑机接口、电子皮肤…这些前沿科学或改写人类未来
  4. jquery中not方法失效的解决方案
  5. python中参数(带星号的参数)
  6. # select sort 选择排序
  7. 炼丹感悟:On the Generalization of RL
  8. 信息学奥赛一本通 1132:石头剪子布 | OpenJudge NOI 1.7 04
  9. 42.数据库表转model类
  10. 程序员被公司辞退12天,前领导要求回公司讲清楚代码,结果懵了
  11. ERP技术在财务信息化转型中应用探讨
  12. 拓端tecdat|R语言深度学习:用keras神经网络回归模型预测时间序列数据
  13. 奔图打印机linux驱动rpm,奔图P2500打印机驱动
  14. rational rose的下载和安装教程
  15. 申请免费代码签名证书
  16. 网络策略(networkpolicy随笔记)
  17. 7个技巧帮助你进行更有吸引力的脉动/脉搏调查
  18. 科普操作系统与芯片那些事儿
  19. pycharm怎么快速注释-块注释
  20. 数据结构课程设计——迷宫问题课程设计报告

热门文章

  1. Liang-Barsky裁剪算法
  2. 【MODBUS通讯协议】
  3. 测试自动化成本及投资回报率
  4. 北航计算机组成原理课程设计-2021秋 PreProject-MIPS-MIPS 汇编程序解析
  5. 创建阻止windows自动锁屏的脚本
  6. FAT文件系统介绍以及FatFs的移植
  7. 基于java的点歌系统设计_KTV点歌系统的设计与实现(毕业论文).doc
  8. Word中文字后面是白色的
  9. mysql关系范式试题_数据库范式练习题
  10. 宽带运营商为什么限制上行带宽