java面向对象程序设计

题目:

使用文本命令行窗口界面模拟全球通计费程序。要求使用真实的全球通资费标准,模拟统计一个特定号码的一个月的实时话费。能根据输入实现各种用户的话费的计算并显示月实时帐单。

设计思路:

1.该题目从题干来看较为简单,需求较少,因此第一步,我们便要搞懂该程序的功能需求:该程序模拟全球通计费系统,需要我们给电话号码计算花费并可以查询显示当月实时账单。那么,我们可以从增删改查出发,一个特定号码我们可以理解为一个电话用户,即我们可以添加一个电话用户,之后对这位用户的通话进行记录,记录的同时计算该用户的消费金额,当我们查询时,将该金额进行显示出来;

2.搞清楚需求之后,我们下一步做的事准备工作,首先就是资料查询,即关于全球通计费的资料查询,该题目要求我们使用真实的全球通资费标准,那么我就要知道该标准,并用我们的程序将其统一的表示起来。

全球通计费标准(仅供参考)(该程序中只使用前两个套餐,原理都一样)

3.对题目分析完成之后,我们便要开始程序的简单构架,首先我们需要一个用户类,用来记录用户的电话和消费记录,从上述信息可以看出,消费主要通过月租、来电显示、市话、国内漫游、长途、国际长途,我们可以将这些作为该类的属性进行记录,同时用sumPrice用来记录总消费;在我们明白如何对数据进行记录之后,下一步要做的便是如何操作这些数据来达到我们的功能需求:在这里为了增加可读性,我使用了一个接口对我们需要的操作进行一个简单的陈列,之后在行为类中国对这些方法进行实现就可以了;最终的结果是在主类里面显示出来。

知识储备:

该程序难度较低,可以作为刚入门的人员或者大一新生对自己的阶段性检测,涉及到的知识点如下:

1.异常处理机制:这个是为了增加程序的健壮性,避免程序在失误输入下崩溃;

2.链表的使用:这个是为了存储数据,使用链表存储数据较数组相比更为方便和修改;

3.正则表达:这个是为了对电话号码的输入进行筛选,希望输入的电话号码符合实际情况;

4.面向对象思想:这个是该程序的核心思想,该思想对于刚开始接触编程的人来说可能有点抽象,你们可以参考我的上一篇课设文章(学生学籍管理系统),会发现这个程序代码更加简洁,其简洁主要体现在方法的调用上面(当然,这里的功能也较少),在这个代码里面,我更多的是去调用方法,而不是重复写代码,举个例子:这种程序都涉及到大量的输入输出,那么对于输入的格式就必须有一个要求,即在这里用的异常处理机制,我在上一篇课设文章也使用到了异常处理,不过当时并没有通过调用方法来实现,而是在每次输入的时候都进行异常判断,这便使得代码量剧增。而在这个程序中,我写了一个异常处理方法,用来对输入的数据进行判断,如果数据符合要求,则对其赋值,不符合要求,则将数值设置为0,便可以实现我们的需求。这个便是面向对象思想的一个简单使用,可以多看几遍这块代码,去做一下对比,体会一下面向对象的含义。

注:在该程序中,大量使用私有方法,可以多观察这些方法的调用,想一下为什么要这样写,可能会增加你们对面向对象的理解(PS:该程序中对执行的格式要求有所降低,你们可以根据自己的风格调整格式)

代码:

//用户(电话)类:
/*** @ClassName 电话类* @Description TODO* @Author 今夕河西* @Date 2022-09-09 14:46* @Version 1.0**/
public class Phone {private String phone_number;    //电话号码private double yz;  //月租private double ldxs;    //来点显示private double time_sh; //市话时间private double time_gnmy;   //国内漫游private double time_ct; //长途private double sum_price;   //整体收费public String getPhone_number() {return phone_number;}public void setPhone_number(String phone_number) {this.phone_number = phone_number;}public double getYz() {return yz;}public void setYz(double yz) {this.yz = yz;}public double getLdxs() {return ldxs;}public void setLdxs(double ldxs) {this.ldxs = ldxs;}public double getTime_sh() {return time_sh;}public void setTime_sh(double time_sh) {this.time_sh = time_sh;}public double getTime_gnmy() {return time_gnmy;}public void setTime_gnmy(double time_gnmy) {this.time_gnmy = time_gnmy;}public double getTime_ct() {return time_ct;}public void setTime_ct(double time_ct) {this.time_ct = time_ct;}public double getSum_price() {return sum_price;}public void setSum_price(double sum_price) {this.sum_price = sum_price;}public Phone(String phone_number, double yz, double ldxs, double time_sh, double time_gnmy, double time_ct) {this.phone_number = phone_number;this.yz = yz;this.ldxs = ldxs;this.time_sh = time_sh;this.time_gnmy = time_gnmy;this.time_ct = time_ct;}public Phone() {}@Overridepublic String toString() {return "Phone{" +"电话号码='" + phone_number + '\'' +", 月租金额=" + yz +", 来电显示金额=" + ldxs +", 市话通话时长=" + time_sh +", 国内漫游通话时长=" + time_gnmy +", 长途通话时长=" + time_ct +", 总计消费金额=" + sum_price +'}';}
}//行为接口:
/*** @InterfaceName 接口--行为展示* @Description TODO* @Author 今夕河西* @Date 2022-09-09 14:47* @Version 1.0**/
public interface ActionImplement {//创建用户void addPhone();//拨打电话void add_call();//查询本月消费void select_price();
}//行为实现
import java.util.LinkedList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @ClassName 行为方法类* @Description TODO* @Author 今夕河西* @Date 2022-09-09 14:47* @Version 1.0**/
public class Action implements ActionImplement{//创建两个链表来接收两种套餐public LinkedList<Phone> linkedList1 = new LinkedList<Phone>(); //第一种套餐public LinkedList<Phone> linkedList2 = new LinkedList<Phone>(); //第二种套餐@Overridepublic void addPhone() {    //办理一个电话号码Phone phone = new Phone();Scanner scanner = new Scanner(System.in);System.out.println("该功能为添加电话用户!");System.out.print("请您输入电话号码:");String phone_number = scanner.next();while (!IsMobilphone(phone_number)) {System.out.print("电话号码格式不正确,请重新输入:");phone_number = scanner.next();}while (!IsExitPhone(phone_number)) {System.out.print("该电话号码已存在,请重新输入:");phone_number = scanner.next();}phone.setPhone_number(phone_number);System.out.println("用户创建成功!");view();System.out.print("请为该用户选择套餐(选择套餐一请输入1,选择套餐二请输入2):");int select_fa = scanner.nextInt();while (select_fa != 1 && select_fa != 2) {System.out.print("暂无其他套餐,请重新输入:");select_fa = scanner.nextInt();}if (select_fa == 1) {phone.setYz(50);System.out.print("请选择是否需要来电显示(如果需要请输入1,不需要输入其他):");int ldxh_select = scanner.nextInt();if (ldxh_select == 1) {phone.setLdxs(10);} else {phone.setLdxs(0);}linkedList1.add(phone); //套餐一在第一个链表里面} else {phone.setYz(25);System.out.print("请选择是否需要来电显示(如果需要请输入1,不需要输入其他):");int ldxh_select = scanner.nextInt();if (ldxh_select == 1) {phone.setLdxs(10);} else {phone.setLdxs(0);}linkedList2.add(phone);}}@Overridepublic void add_call() {Scanner scanner = new Scanner(System.in);System.out.println("该功能为记录该月通话记录:");System.out.println("请选择您要记录的手机号:");String phone_number = scanner.next();for (int i = 0; i < linkedList1.size(); i++) {Phone phone = linkedList1.get(i);if (phone.getPhone_number().equals(phone_number)) {double time_sh = 0; //市话时间double time_gnmy = 0;   //国内漫游double time_ct = 0; //长途System.out.println("该用户为:" + phone_number);System.out.print("请输入其市话通话时长(分钟):");time_sh = IsExptaion(time_sh);System.out.print("请输入其国内漫游通话时长:");time_gnmy = IsExptaion(time_gnmy);System.out.print("请输入其长途通话时长:");time_ct = IsExptaion(time_ct);phone.setTime_sh(time_sh);phone.setTime_gnmy(time_gnmy);phone.setTime_ct(time_ct);} else {if (i == linkedList1.size()) {for (int j = 0; j < linkedList2.size(); j++) {Phone phone1 = linkedList2.get(i);if (phone1.getPhone_number().equals(phone_number)) {double time_sh = 0; //市话时间double time_gnmy = 0;   //国内漫游double time_ct = 0; //长途System.out.println("该用户为:" + phone_number);System.out.print("请输入其市话通话时长:");time_sh = IsExptaion(time_sh);System.out.print("请输入其国内漫游通话时长:");time_gnmy = IsExptaion(time_gnmy);System.out.print("请输入其长途通话时长:");time_ct = IsExptaion(time_ct);phone1.setTime_sh(time_sh);phone1.setTime_gnmy(time_gnmy);phone1.setTime_ct(time_ct);} else {if (j == linkedList2.size()) {System.out.println("未查询到该用户,请检查是否输入正确!");}}}}}}}@Overridepublic void select_price() {Scanner scanner = new Scanner(System.in);System.out.println("该功能为查询该月账单记录:");System.out.println("请选择您要记录的手机号:");String phone_number = scanner.next();for (int i = 0; i < linkedList1.size(); i++) {Phone phone = linkedList1.get(i);if (phone.getPhone_number().equals(phone_number)) {phone.setSum_price(Computer_Price1(phone.getTime_sh(),phone.getTime_gnmy(),phone.getTime_ct()) + phone.getYz() + phone.getLdxs());System.out.println(phone.toString());} else {if (i == linkedList1.size()) {for (int j = 0; j < linkedList2.size(); j++) {Phone phone1 = linkedList2.get(i);if (phone1.getPhone_number().equals(phone_number)) {phone1.setSum_price(Computer_Price2(phone1.getTime_sh(),phone1.getTime_gnmy(),phone1.getTime_ct()) + phone1.getYz() + phone1.getLdxs());System.out.println(phone1.toString());} else {if (j == linkedList2.size()) {System.out.println("未查询到该用户,请检查是否输入正确!");}}}}}}}//展示套餐信息private void view () {System.out.println("欢迎使用全球通:以下两种套餐供您选择:");System.out.println("套餐一:计划套餐:");System.out.println("月租50元,来电显示10元/月,市话0.4元/分,国内漫游费0.6元/分,长途费0.07元/6秒");System.out.println("套餐二:自由套餐:");System.out.println("月租25元,来电显示10元/月,市话0.2元/分,国内漫游费0.6元/分,长途费0.07元/6秒");}//判断手机号是否符合规定private boolean IsMobilphone(String num) {String regex1="0\\d{2,3}[-]?\\d{7,8}|0\\d{2,3}\\s?\\d{7,8}";String regex2="1[3-9][0-9]\\d{8}";//定义Pattern对象Pattern pattern1=Pattern.compile(regex1);Pattern pattern2=Pattern.compile(regex2);//匹配对象Matcher matcher1=pattern1.matcher(num);Matcher matcher2=pattern2.matcher(num);//bool函数判断输入是否正确boolean boo1=matcher1.matches();boolean boo2=matcher2.matches();if (boo1) {return true;} else if (boo2) {return true;} else {return false;}}private  double IsExptaion (double time) {Scanner scanner = new Scanner(System.in);try {time = scanner.nextDouble();} catch (Exception e) {System.out.println("数据输入错误,该时间按照零来计算!");return 0;}return time;}private boolean IsExitPhone (String phone_number) {for (int i = 0; i < linkedList1.size(); i++) {Phone phone = linkedList1.get(i);if (phone.getPhone_number().equals(phone_number)) {return false;}}for (int i = 0; i < linkedList2.size(); i++) {Phone phone = linkedList2.get(i);if (phone.getPhone_number().equals(phone_number)) {return false;}}return true;}private double Computer_Price1 (double time1, double time2, double time3) {double sum_price = time1 * 0.4 + time2 *0.6 + time3 * 0.07;return sum_price;}private double Computer_Price2 (double time1, double time2, double time3) {double sum_price = time1 * 0.2 + time2 *0.6 + time3 * 0.07;return sum_price;}
}//主类展示
import java.util.Scanner;/*** @ClassName 主类* @Description TODO* @Author 今夕河西* @Date 2022-09-09 14:44* @Version 1.0**/
public class Main {public static void main(String[] args) {System.out.println("欢迎使用全球通计费系统!");run();}private static void showMenu () {System.out.println("该系统功能如下所示:");System.out.print("输入1:添加用户功能" + "     ");System.out.print("输入2:记录用户通话记录" + "     ");System.out.print("输入3:显示用户消费情况" + "     ");System.out.println("输入4:退出系统");}private static void run () {Scanner scanner = new Scanner(System.in);Action action = new Action();System.out.println("请您先添加一名用户:");action.addPhone();boolean flag = true;while (flag) {showMenu();System.out.print("请输入您要选择的功能");int number = scanner.nextInt();switch (number) {case 1: {System.out.println("欢迎使用功能1!");action.addPhone();System.out.println("该功能结束,即将跳出功能1!");System.out.println("请继续选择功能!");System.out.println();break;}case 2: {System.out.println("欢迎使用功能2!");action.add_call();System.out.println("该功能结束,即将跳出功能2!");System.out.println("请继续选择功能!");System.out.println();break;}case 3: {System.out.println("欢迎使用功能3!");action.select_price();System.out.println("该功能结束,即将跳出功能3!");System.out.println("请继续选择功能!");System.out.println();break;}case 4: {System.out.println("感谢您的使用!");flag = false;break;}default: {System.out.println("该功能尚未开发,敬请期待!");break;}}}}}

运行结果:

课程设计:模拟全球通计费程序--java(包含源码、思路、结果)相关推荐

  1. java实现模拟考试系统,基于jsp的驾照模拟考试系统a-JavaEE实现驾照模拟考试系统a - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的驾照模拟考试系统a, 该项目可用各类java课程设计大作业中, 驾照模拟考试系统a的系统架构分为前后台两部分, 最 ...

  2. 学生学籍管理程序--java(包含源码、思路、结果)(课设)

    java面向对象程序设计课程设计来喽!!!! 学生学籍管理程序(java版): 题目 问题描述:使用文本命令窗口设计学生学籍管理程序.要求能够对学生的学籍信息进行存储.删除.检索和显示.能够统计全部学 ...

  3. part1:推荐一些适合练手、课程设计、毕业设计的python小项目源码,无任何下载门槛

    人生苦短,我用python,随着python这些年的流行,很多人开始使用python来实现各种功能.下面推荐一些适合用来练手.大学生课程设计作业.大学生毕业设计的python小项目,尤其适合新手,源码 ...

  4. 【python期末设计(节选)】志愿者管理系统开发包含源码软件工程

    一.概述 1.1 课题描述 在信息化高速发展的今天,各行业都应该充分利用信息化管理的软件系统,更好地的管理工作,让各项活动得到更好的开展,人力,财力,物理上更好的分配利用和协调调度.利用志愿者管理系统 ...

  5. 计算机毕业设计、课程设计、实战项目之[含论文+源码等]SSM网上水果生鲜超市商城|电商系统[包运行成功]

    <SSM网上水果生鲜超市商城>该项目采用的技术实现如下:HTML+CSS+JavaScript+jsp+Spring+SpringMVC+Mybatis+Mysql数据库+Tomcat服务 ...

  6. 计算机毕业设计、课程设计、实战项目之[含论文+源码等]基于SpringBoot在线电影订票系统[包运行成功]

    <基于SpringBoot在线电影订票系统>该项目采用技术后台:Springboot.spring.springmvc.springdata.mysql数据库.前台:FreeMarker. ...

  7. 【免费赠送源码】Springboot剧本杀交流分享平台1p7vg计算机毕业设计-课程设计-期末作业-毕设程序代做

    [免费赠送源码]Springboot剧本杀交流分享平台1p7vg计算机毕业设计-课程设计-期末作业-毕设程序代做 [免费赠送源码]Springboot剧本杀交流分享平台1p7vg计算机毕业设计-课程设 ...

  8. Springboot科学养宠 omap1计算机毕业设计-课程设计-期末作业-毕设程序代做

    Springboot科学养宠 omap1计算机毕业设计-课程设计-期末作业-毕设程序代做 [免费赠送源码]Springboot科学养宠 omap1计算机毕业设计-课程设计-期末作业-毕设程序代做 本源 ...

  9. Springboot垃圾分类管理系统836b7计算机毕业设计-课程设计-期末作业-毕设程序代做

    Springboot垃圾分类管理系统836b7计算机毕业设计-课程设计-期末作业-毕设程序代做 [免费赠送源码]Springboot垃圾分类管理系统836b7计算机毕业设计-课程设计-期末作业-毕设程 ...

最新文章

  1. MySQL 水平分区方案Spock Proxy
  2. 空值排序(oracle/sqlserver)
  3. 在 PHP 中养成 7 个面向对象的好习惯
  4. android 图片作为背景图片,Android设置网络图片为手机背景图片的方法
  5. 解决Docker上安装RabbitMQ后Web管理页面打不开的问题
  6. Tomcat7和mysql连接池dbcp方式的配置方法和测试
  7. 深入了解RabbitMQ工作原理及简单使用
  8. Linux中的MAN命令
  9. jp摩根的人都在学python么_摩根大通已要求所有资管部门员工必须学习编程
  10. Java7并发编程指南——第四章:线程执行器
  11. 今年别想了!iPhone 12系列没有120Hz高刷屏
  12. js 数组 改变长度_Java数组,什么是Java数组?Java数组学习
  13. iOS 读书笔记 第一章
  14. Fixchart图表组件——介绍
  15. [已解决] org.hibernate.HibernateException:未配置CurrentSessionContext
  16. iOS中使用URL Scheme进行App跳转
  17. JavaScript之浏览器大战
  18. Fiddler Everywhere 3.2.1 Crack
  19. 事关美亚柏科未来发展!智慧城市建设注入新动力
  20. 去除firefox火狐更新提示

热门文章

  1. 【英宝通Unity4.0公开课学习 】(二)场景创建
  2. 【停车场智慧停车微信小程序源代码(腾讯地图版)】
  3. 安卓7.0权限及预览版问题
  4. 使用skyeye运行《Linux设备驱动开发详解》的实例
  5. 使用.NET Reflector单步调试编译好的程序集
  6. (诛仙剑C-SKY)4-FrameBuffer
  7. splay 文艺平衡树 (数据结构)
  8. js 正则是否包含某些字符串_js 正则包含字符
  9. 51单片机LED点阵屏逐帧显示和流动显示图像
  10. python用循环输入给数组赋值_python二维数组重复赋值问题