Blog3


前言 10-16周java学习总结

近几周PTA的作业以电信收费为主,考试内容涉及正则表达式,字符串的比较.输入.分割代码的复用性.面向对象设计,ArrayList的使用等等。题目量和难度都适中。

期末考试主要考察了对课本知识的运用,例如多态,继承,抽象类,抽象类ArrayList的用法等等.难度题量都适中。

同时实验五考察了javafx的应用。

设计与分析

 

7-1 电信计费系列2-手机+座机计费

实现南昌市电信分公司的计费程序,假设该公司针对手机和座机用户分别采取了两种计费方案,分别如下:
1、针对市内座机用户采用的计费方式(与电信计费系列1内容相同):
月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
假设本市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。
2、针对手机用户采用实时计费方式:
月租15元,市内省内接电话均免费,市内拨打市内电话0.1元/分钟,市内拨打省内电话0.2元/分钟,市内拨打省外电话0.3元/分钟,省内漫游打电话0.3元/分钟,省外漫游接听0.3元/分钟,省外漫游拨打0.6元/分钟;
注:被叫电话属于市内、省内还是国内由被叫电话的接听地点区号决定,比如以下案例中,南昌市手机用户13307912264在区号为020的广州接听了电话,主叫号码应被计算为拨打了一个省外长途,同时,手机用户13307912264也要被计算省外接听漫游费:
u-13307912264 1
t-079186330022 13307912264 020 2022.1.3 10:00:25 2022.1.3 10:05:11

输入:
输入信息包括两种类型
1、逐行输入南昌市用户开户的信息,每行一个用户,含手机和座机用户
格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐)
例如:u-079186300001 0
座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。
手机号码由11位数字构成,最高位是1。
本题在电信计费系列1基础上增加类型1-手机实时计费。
手机设置0或者座机设置成1,此种错误可不做判断。
2、逐行输入本月某些用户的通讯信息,通讯信息格式:
座机呼叫座机:t-主叫号码 接听号码 起始时间 结束时间
t-079186330022 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:11
以上四项内容之间以一个英文空格分隔,
时间必须符合”yyyy.MM.dd HH:mm:ss”格式。提示:使用SimpleDateFormat类。
输入格式增加手机接打电话以及收发短信的格式,手机接打电话的信息除了号码之外需要额外记录拨打/接听的地点的区号,比如:
座机打手机:
t-主叫号码 接听号码 接听地点区号 起始时间 结束时间
t-079186330022 13305862264 020 2022.1.3 10:00:25 2022.1.3 10:05:11
手机互打:
t-主叫号码 拨号地点 接听号码 接听地点区号 起始时间 结束时间
t-18907910010 0791 13305862264 0371 2022.1.3 10:00:25 2022.1.3 10:05:11

注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。

输出:
根据输入的详细通讯信息,计算所有已开户的用户的当月费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。
每条通讯、短信信息均单独计费后累加,不是将所有信息累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理:
输入数据中出现的不符合格式要求的行一律忽略。

输入样例:

在这里给出一组输入。例如:

u-13811111111 1
t-13811111111 0791 13811111110 020 2022.1.3 08:00:00 2022.1.3 08:09:20
end

输出样例:

在这里给出相应的输出。例如:

13811111111 3.0 82.0
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.util.Comparator;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner in = new Scanner(System.in);
ArrayList<User> x = new ArrayList<User>();
//        UserRecords y = new UserRecords();
ArrayList<CallRecord> z = new ArrayList<CallRecord>();
LandlinePhoneCharging cost1 = new LandlinePhoneCharging();
MobilelinePhoneCharging cost2 = new MobilelinePhoneCharging();
while(true) {
String a = in.nextLine();
if(a.equals("end")) {
break;
}
if(jug(a)==3) {
User b = new User();
String[] strarray=a.split(" ");
b.setNumber(strarray[0].substring(2));
b.setChargeMode(strarray[1]);
x.add(b);
for (int i = 0; i < x.size(); i++) {
for (int j = 0; j < x.size(); j++) {
if (i != j && x.get(i).number.equals(x.get(j).number)) {
x.remove(x.get(j));
}
}
}
}
else if(jug(a)==2){
User b = new User();
String[] strarray=a.split(" ");
b.setNumber(strarray[0].substring(2));
b.setChargeMode(strarray[1]);
x.add(b);
for (int i = 0; i < x.size(); i++) {
for (int j = 0; j < x.size(); j++) {
if (i != j && x.get(i).number.equals(x.get(j).number)) {
x.remove(x.get(j));
}
}
}
}
else if(jug(a)==1) {
CallRecord b = new CallRecord();
String[] strarray=a.split(" ",6);
b.setCallingAddressAreaCode(strarray[0].substring(2, 6));
b.setAnswerAddressAreaCode(strarray[1].substring(0, 4));
b.setCallingNumber(strarray[0].substring(2));
b.setAnswerNumber(strarray[1]);
b.setStartTime(strarray[2].concat(" ").concat(strarray[3]));
b.setEndTime(strarray[4].concat(" ").concat(strarray[5]));
z.add(b);
}
else if(jug(a)==4) {
CallRecord b = new CallRecord();
String[] strarray=a.split(" ",7);
b.setCallingAddressAreaCode(strarray[0].substring(2, 6));
b.setAnswerAddressAreaCode(strarray[2]);
b.setCallingNumber(strarray[0].substring(2));
b.setAnswerNumber(strarray[1]);
b.setStartTime(strarray[3].concat(" ").concat(strarray[4]));
b.setEndTime(strarray[5].concat(" ").concat(strarray[6]));
z.add(b);
}else if(jug(a)==5) {
CallRecord b = new CallRecord();
String[] strarray=a.split(" ",8);
b.setCallingAddressAreaCode(strarray[1]);
b.setAnswerAddressAreaCode(strarray[3]);
b.setCallingNumber(strarray[0].substring(2));
b.setAnswerNumber(strarray[2]);
b.setStartTime(strarray[4].concat(" ").concat(strarray[5]));
b.setEndTime(strarray[6].concat(" ").concat(strarray[7]));
z.add(b);
}else if(jug(a)==6) {
CallRecord b = new CallRecord();
String[] strarray=a.split(" ",7);
b.setCallingAddressAreaCode(strarray[1]);
b.setAnswerAddressAreaCode(strarray[2].substring(0, 4));
b.setCallingNumber(strarray[0].substring(2));
b.setAnswerNumber(strarray[2]);
b.setStartTime(strarray[3].concat(" ").concat(strarray[4]));
b.setEndTime(strarray[5].concat(" ").concat(strarray[6]));
z.add(b);
}
}
for(int i=0;i<x.size();i++) {
for(int j =0;j<z.size();j++) {
if(x.get(i).ChargeMode.equals("0")) {
if(z.get(j).answerAddressAreaCode.equals("NC")) {
if(x.get(i).number.equals(z.get(j).callingNumber))
x.get(i).userRecords.addCallingInCityRecords(z.get(j));
}else if(z.get(j).answerAddressAreaCode.equals("JX")) {
if(x.get(i).number.equals(z.get(j).callingNumber))
x.get(i).userRecords.addCallingInProvinceRecords(z.get(j));
}else if(z.get(j).answerAddressAreaCode.equals("ZG")){
if(x.get(i).number.equals(z.get(j).callingNumber))
x.get(i).userRecords.addCallingInLandRecords(z.get(j));
}
}else {
if(z.get(j).answerAddressAreaCode.equals("NC")) {
if(x.get(i).number.equals(z.get(j).callingNumber)) {
if(z.get(j).callingAddressAreaCode.equals("NC")) {
x.get(i).userRecords.addPhonecallingInCityRecords(z.get(j));
}else if(z.get(j).callingAddressAreaCode.equals("JX")){
x.get(i).userRecords.addPhonecallingInProvinceRecords(z.get(j));
}else if(z.get(j).callingAddressAreaCode.equals("ZG")){
x.get(i).userRecords.addPhonecallingInLandRecords(z.get(j));
}
}
if(x.get(i).number.equals(z.get(j).answerNumber)) {
if(z.get(j).answerAddressAreaCode.equals("NC")) {
x.get(i).userRecords.addAnswerInInCityRecords(z.get(j));
}else if(z.get(j).answerAddressAreaCode.equals("JX")){
x.get(i).userRecords.addAnswerInInProvinceRecords(z.get(j));
}else if(z.get(j).answerAddressAreaCode.equals("ZG")){
x.get(i).userRecords.addAnswerInInLandRecords(z.get(j));
}
}
}else if(z.get(j).answerAddressAreaCode.equals("JX")) {
if(x.get(i).number.equals(z.get(j).callingNumber)) {
if(z.get(j).callingAddressAreaCode.equals("NC")) {
x.get(i).userRecords.addPhonecallingInCityRecords(z.get(j));
}else if(z.get(j).callingAddressAreaCode.equals("JX")){
x.get(i).userRecords.addPhonecallingInProvinceRecords(z.get(j));
}else if(z.get(j).callingAddressAreaCode.equals("ZG")){
x.get(i).userRecords.addPhonecallingInLandRecords(z.get(j));
}
}
if(x.get(i).number.equals(z.get(j).answerNumber)) {
if(z.get(j).answerAddressAreaCode.equals("NC")) {
x.get(i).userRecords.addAnswerInInCityRecords(z.get(j));
}else if(z.get(j).answerAddressAreaCode.equals("JX")){
x.get(i).userRecords.addAnswerInInProvinceRecords(z.get(j));
}else if(z.get(j).answerAddressAreaCode.equals("ZG")){
x.get(i).userRecords.addAnswerInInLandRecords(z.get(j));
}
}
}else if(z.get(j).answerAddressAreaCode.equals("ZG")){
if(x.get(i).number.equals(z.get(j).callingNumber)) {
if(z.get(j).callingAddressAreaCode.equals("NC")) {
x.get(i).userRecords.addPhonecallingInCityRecords(z.get(j));
}else if(z.get(j).callingAddressAreaCode.equals("JX")){
x.get(i).userRecords.addPhonecallingInProvinceRecords(z.get(j));
}else if(z.get(j).callingAddressAreaCode.equals("ZG")){
x.get(i).userRecords.addPhonecallingInLandRecords(z.get(j));
}
}
if(x.get(i).number.equals(z.get(j).answerNumber)) {
if(z.get(j).answerAddressAreaCode.equals("NC")) {
x.get(i).userRecords.addAnswerInInCityRecords(z.get(j));
}else if(z.get(j).answerAddressAreaCode.equals("JX")){
x.get(i).userRecords.addAnswerInInProvinceRecords(z.get(j));
}else if(z.get(j).answerAddressAreaCode.equals("ZG")){
x.get(i).userRecords.addAnswerInInLandRecords(z.get(j));
}
}
}
}
}
}
Collections.sort(x, new MyComparatorToUser());
for(int i =0;i<x.size();i++) {
if(x.get(i).ChargeMode.equals("0")) {
x.get(i).balance = 100- cost1.calCost(x.get(i).userRecords);
double q = 80-x.get(i).balance;
if(i==x.size()-1) {
System.out.print(x.get(i).number+" "+String.format("%.1f", q)+" "+String.format("%.1f", x.get(i).balance));
}
else {
System.out.println(x.get(i).number+" "+String.format("%.1f", q)+" "+String.format("%.1f", x.get(i).balance));
}
}
else {
x.get(i).balance = 100- cost2.calCost(x.get(i).userRecords);
double q = 85-x.get(i).balance;
if(i==x.size()-1) {
System.out.print(x.get(i).number+" "+String.format("%.1f", q)+" "+String.format("%.1f", x.get(i).balance));
}
else {
System.out.println(x.get(i).number+" "+String.format("%.1f", q)+" "+String.format("%.1f", x.get(i).balance));
}
}
}
in.close();
}
static class MyComparatorToUser implements Comparator<User>{
@Override
public int compare(User u1, User u2) {
double p = Double.parseDouble(u1.number);
double q = Double.parseDouble(u2.number);
if(u1.number.charAt(0)=='0'&&u2.number.charAt(0)=='0') {
return (int)(p-q);
}
if(u1.number.charAt(0)=='0') {
p=0;
}
if(u2.number.charAt(0)=='0') {
q=0;
}
return (int)(p-q);
}
}
public static int jug(String a) {
String parrten1 = "t-0791[0-9]{7,8} [0-9]{3,4}[0-9]{7,8} [1-9]//d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])//s(20|21|22|23|[0-1]//d):[0-5]//d:[0-5]//d [1-9]//d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])//s(20|21|22|23|[0-1]//d):[0-5]//d:[0-5]//d";
String parrten2 = "u-0791[0-9]{7,8}[ ]0";//开户
String parrten3 = "u-(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])//d{8} 1";//开户
String parrten4 = "t-[0-9]{3,4}[0-9]{7,8} (13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])//d{8} [0-9]{3,4} [1-9]//d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])//s(20|21|22|23|[0-1]//d):[0-5]//d:[0-5]//d [1-9]//d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])//s(20|21|22|23|[0-1]//d):[0-5]//d:[0-5]//d";
String parrten5 = "t-(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])//d{8} [0-9]{3,4} (13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])//d{8} [0-9]{3,4} [1-9]//d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])//s(20|21|22|23|[0-1]//d):[0-5]//d:[0-5]//d [1-9]//d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])//s(20|21|22|23|[0-1]//d):[0-5]//d:[0-5]//d";
String parrten6 = "t-(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])//d{8} [0-9]{3,4} [0-9]{3,4}[0-9]{7,8} [1-9]//d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])//s(20|21|22|23|[0-1]//d):[0-5]//d:[0-5]//d [1-9]//d{3}.([1-9]|1[0-2]).([1-9]|[1-2][0-9]|3[0-1])//s(20|21|22|23|[0-1]//d):[0-5]//d:[0-5]//d";
if(a.matches(parrten1)) {
return 1;
}
else if(a.matches(parrten2)) {
return 2;
}else if(a.matches(parrten3)) {
return 3;
}else if(a.matches(parrten4)) {
return 4;
}else if(a.matches(parrten5)) {
return 5;
}else if(a.matches(parrten6)) {
return 6;
}
return 0;
}
}
class UserRecords {
ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>();
ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>();
ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>();
ArrayList<CallRecord> phonecallingInCityRecords = new ArrayList<CallRecord>();
ArrayList<CallRecord> phonecallingInProvinceRecords = new ArrayList<CallRecord>();
ArrayList<CallRecord> phonecallingInLandRecords = new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInCityRecords = new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInLandRecords = new ArrayList<CallRecord>();
ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
ArrayList<MessageRecord> reciveMessageRecords = new ArrayList<MessageRecord>();
public void addCallingInCityRecords(CallRecord callRecord) {
callingInCityRecords.add(callRecord);
}
public void addCallingInProvinceRecords(CallRecord callRecord) {
callingInProvinceRecords.add(callRecord);
}
public void addCallingInLandRecords(CallRecord callRecord) {
callingInLandRecords.add(callRecord);
}
public void addAnswerInInCityRecords(CallRecord answerRecord) {
answerInCityRecords.add(answerRecord);
}
public void addAnswerInInProvinceRecords(CallRecord answerRecord) {
answerInProvinceRecords.add(answerRecord);
}
public void addAnswerInInLandRecords(CallRecord answerRecord) {
answerInLandRecords.add(answerRecord);
}
public void addSendMessageRecords(MessageRecord sendMessageRecord) {
sendMessageRecords.add(sendMessageRecord);
}
public void addReciveMessageRecords(MessageRecord reciveMessageRecord) {
reciveMessageRecords.add(reciveMessageRecord);
}
public ArrayList<CallRecord> getCallingInCityRecords() {
return callingInCityRecords;
}
public ArrayList<CallRecord> getCallingInProvinceRecords() {
return callingInProvinceRecords;
}
public ArrayList<CallRecord> getCallingInLandRecords() {
return callingInLandRecords;
}
public ArrayList<CallRecord> getAnswerInCityRecords() {
return answerInCityRecords;
}
public ArrayList<CallRecord> getAnswerInProvinceRecords() {
return answerInProvinceRecords;
}
public ArrayList<CallRecord> getAnswerInLandRecords() {
return answerInLandRecords;
}
public ArrayList<CallRecord> getPhonecallingInCityRecords() {
return phonecallingInCityRecords;
}
public void addPhonecallingInCityRecords(CallRecord callRecord) {
phonecallingInCityRecords.add(callRecord);
}
public ArrayList<CallRecord> getPhonecallingInProvinceRecords() {
return phonecallingInProvinceRecords;
}
public void addPhonecallingInProvinceRecords(CallRecord callRecord) {
phonecallingInProvinceRecords.add(callRecord);
}
public ArrayList<CallRecord> getPhonecallingInLandRecords() {
return phonecallingInLandRecords;
}
public void addPhonecallingInLandRecords(CallRecord callRecord) {
phonecallingInLandRecords.add(callRecord);
}
public ArrayList<MessageRecord> getSendMessageRecords() {
return sendMessageRecords;
}
public ArrayList<MessageRecord> getReciveMessageRecords() {
return reciveMessageRecords;
}
}
class User {
UserRecords userRecords = new UserRecords();
double balance = 100;
String ChargeMode;
String number;
public User() {
}
public double calBalance() {
return 100-calCost();
}
public double calCost() {
return 0;
}
public  UserRecords  getUserRecords() {
return userRecords;
}
public  void  setUserRecords(UserRecords userRecords) {
this.userRecords = userRecords;
}
public double getBalance() {
return balance;
}
public void setChargeMode(String chargeMode) {
ChargeMode = chargeMode;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
class MobilePhoneInProvinceCallRule extends CallChargeRule{
@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double cost=0;
if(callRecords.size()==0) {
return 0;
}
for(int i=0;i<callRecords.size();i++) {
long  a = (callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())/1000;
long b = a%60;
if(b==0&&
(callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())>0) {
cost = cost + (a/60)*0.1;
}else {
cost = cost + ((a-b)/60+1)*0.3;
}
}
return cost;
}
}
class MobilePhoneInProvinceAnswerRule extends CallChargeRule{
@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double cost=0;
return cost;
}
}
class MobilePhoneInlandCallRule extends CallChargeRule{
@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double cost=0;
if(callRecords.size()==0) {
return 0;
}
for(int i=0;i<callRecords.size();i++) {
long  a = (callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())/1000;
long b = a%60;
if(b==0&&
(callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())>0) {
cost = cost + (a/60)*0.1;
}else {
cost = cost + ((a-b)/60+1)*0.6;
}
}
return cost;
}
}
class MobilePhoneInlandAnswerRule extends CallChargeRule{
public double calCost(ArrayList<CallRecord> callRecords) {
double cost=0;
if(callRecords.size()==0) {
return 0;
}
for(int i=0;i<callRecords.size();i++) {
if(callRecords.get(i).answerAddressAreaCode.equals("ZG")) {
long  a = (callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())/1000;
long b = a%60;
if(b==0&&
(callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())>0) {
cost = cost + (a/60)*0.1;
}else {
cost = cost + ((a-b)/60+1)*0.3;
}
}
}
return cost;
}
}
class MobilePhoneInCityCallRule extends CallChargeRule{
@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double cost=0;
if(callRecords.size()==0) {
return 0;
}
for(int i=0;i<callRecords.size();i++) {
long  a = (callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())/1000;
long b = a%60;
if(b==0&&
(callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())>0) {
cost = cost + (a/60)*0.1;
}else {
if(callRecords.get(i).answerAddressAreaCode.equals("NC"))
cost = cost + ((a-b)/60+1)*0.1;
else if(callRecords.get(i).answerAddressAreaCode.equals("JX"))
cost = cost + ((a-b)/60+1)*0.2;
else 
cost = cost + ((a-b)/60+1)*0.3;
}
}
return cost;
}
}
class MobilePhoneInCityAnswerRule extends CallChargeRule{
@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double cost=0;
return cost;
}
}
class MobilelinePhoneCharging extends ChargeMode{
double monthlyRent = 15;
public MobilelinePhoneCharging() {
super();
}
@Override
public double calCost(UserRecords userRecords) {
MobilePhoneInCityCallRule a = new MobilePhoneInCityCallRule();
MobilePhoneInlandCallRule b = new MobilePhoneInlandCallRule();
MobilePhoneInProvinceCallRule c = new MobilePhoneInProvinceCallRule();
MobilePhoneInCityAnswerRule d = new MobilePhoneInCityAnswerRule();
MobilePhoneInProvinceAnswerRule e = new MobilePhoneInProvinceAnswerRule();
MobilePhoneInlandAnswerRule f = new MobilePhoneInlandAnswerRule();
return a.calCost(userRecords.getPhonecallingInCityRecords())+c.calCost(userRecords.getPhonecallingInProvinceRecords())+b.calCost(userRecords.getPhonecallingInLandRecords())+
f.calCost(userRecords.getAnswerInLandRecords())+15;
}
@Override
public double getMonthlyRent() {
return monthlyRent;
}
}
class MessageRecord {
String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
class LandPhoneInProvinceRule extends CallChargeRule{
@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double cost=0;
if(callRecords.size()==0) {
return 0;
}
for(int i=0;i<callRecords.size();i++) {
long  a = (callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())/1000;
long b = a%60;
if(b==0&&
(callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())>0) {
cost = cost + (a/60)*0.3;
}else {
cost = cost + ((a-b)/60+1)*0.3;
}
}
return cost;
}
}
class LandPhoneInlandRule extends CallChargeRule{
@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double cost=0;
if(callRecords.size()==0) {
return 0;
}
for(int i=0;i<callRecords.size();i++) {
long  a = (callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())/1000;
long b = a%60;
if(b==0&&
(callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())>0) {
cost = cost + (a/60)*0.6;
}else {
cost = cost + ((a-b)/60+1)*0.6;
}
}
return cost;
}
}
class LandPhoneInCityRule extends CallChargeRule{
@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double cost=0;
if(callRecords.size()==0) {
return 0;
}
for(int i=0;i<callRecords.size();i++) {
long  a = (callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())/1000;
long b = a%60;
if(b==0&&
(callRecords.get(i).endTime.getTime()-callRecords.get(i).startTime.getTime())>0) {
cost = cost + (a/60)*0.1;
}else {
cost = cost + ((a-b)/60+1)*0.1;
}
}
return cost;
}
}
class LandlinePhoneCharging extends ChargeMode{
double monthlyRent = 20;
public LandlinePhoneCharging() {
super();
}
@Override
public double calCost(UserRecords userRecords) {
LandPhoneInCityRule a = new LandPhoneInCityRule();
LandPhoneInlandRule b = new LandPhoneInlandRule();
LandPhoneInProvinceRule c = new LandPhoneInProvinceRule();
return a.calCost(userRecords.getCallingInCityRecords())+b.calCost(userRecords.getCallingInLandRecords())+c.calCost(userRecords.getCallingInProvinceRecords())+20;
}
@Override
public double getMonthlyRent() {
return monthlyRent;
}
}
abstract class CommunicationRecord {
String callingNumber;
String answerNumber;
public String getCallingNumber() {
return callingNumber;
}
public void setCallingNumber(String callingNumber) {
this.callingNumber = callingNumber;
}
public String getAnswerNumber() {
return answerNumber;
}
public void setAnswerNumber(String answerNumber) {
this.answerNumber = answerNumber;
}
}
abstract class ChargeRule {
}
abstract class ChargeMode {
ArrayList<ChargeRule> chargeRules = new ArrayList<ChargeRule>();
public ArrayList<ChargeRule> getChargeRules() {
return chargeRules;
}
public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
this.chargeRules = chargeRules;
}
public  double calCost(UserRecords userRecords) {
return 0;
}
public double getMonthlyRent() {
return 0;
}
}
class CallRecord extends CommunicationRecord{
Date startTime;
Date endTime;
String callingAddressAreaCode;
String answerAddressAreaCode;
SimpleDateFormat a = new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss");
public CallRecord() {
super();
// TODO 自动生成的构造函数存根
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(String startTime)   {
try {
this.startTime = a.parse(startTime);
} catch (ParseException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
try {
this.endTime = a.parse(endTime);
} catch (ParseException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public String getCallingAddressAreaCode() {
return callingAddressAreaCode;
}
public void setCallingAddressAreaCode(String callingAddressAreaCode) {
if(callingAddressAreaCode.matches("0791"))
this.callingAddressAreaCode = "NC";
else if(callingAddressAreaCode.matches("(079[0-9]|0701)")){
this.callingAddressAreaCode = "JX";
}else {
this.callingAddressAreaCode = "ZG";
}
}
public String getAnswerAddressAreaCode() {
return answerAddressAreaCode;
}
public void setAnswerAddressAreaCode(String answerAddressAreaCode) {
if(answerAddressAreaCode.matches("0791"))
this.answerAddressAreaCode = "NC";
else if(answerAddressAreaCode.matches("(079[0-9]|0701)")){
this.answerAddressAreaCode = "JX";
}else {
this.answerAddressAreaCode = "ZG";
}
}
public boolean isMobilePhoneNumber(String Number) {
if(Number.matches("(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])//d{8})")) {
return true;
}
return false;
}
}
abstract class CallChargeRule extends ChargeRule{
public double calCost(ArrayList<CallRecord> callRecords) {
return 0;
}
}

本次作业难度较大,代码写的有点乱,首先用while循环确保循环输入,直到end退出程序,输入一条语句立刻进行判断,执行开户,或者记录操作,如果输入两个相同的号码,将取消开户,对于计费,使用的是记录操作,记录下后传入ArrayLis的用户中储存起来,最后用costcal函数进行计算,再返回结果并保留两位小数,在这之前使用comperto进行排序,再将用户的信息按顺序输出。中间过程比较繁杂,细节比较多,就不再一一赘述。类图如下。

 

 

Blog3

实验5

一、实验目的

1、了解JavaFX的基本原理和基本组件;

2、能够熟练应用JavaFX组件进行界面设计;

3、掌握Java的事件驱动机制、lambda表达式;

4、掌握shape形状类的使用。

一、实验目的

1、了解JavaFX的基本原理和基本组件;

2、能够熟练应用JavaFX组件进行界面设计;

3、掌握Java的事件驱动机制、lambda表达式;

4、掌握shape形状类的使用。

一、实验步骤

1、  请修改实验四农夫过河游戏的代码,将用户界面改为图形界面,界面效果自行设计。

2、  请画出修改后的类图,并说明在界面中使用了哪些技巧以达到较好地界面效果。

3、  途中遇见了图片无法加载的问题图3-1,经过寻找,发现图片路径输入有误,修改路径后,程序正常运行。

4、  类图见代码末尾。图1-1

 

途中遇见了图片无法加载的问题,经过寻找,发现图片路径输入有误,修改路径后,程序正常运行。

通过按顺序点击农夫带羊过河—农夫独自过河—农夫带狼过河—农夫带羊过河—农夫带白菜过河—农夫独自过河—农夫带羊过河后,程序执行完毕,最终得到结果如见代码末尾2-1,程序正常运行,输出结果正常,点击农夫独自过河,得到结果如2-2,程序正常运行,输出正常。

通过javafx的实验让我掌握了基本的图形界面程序,让非专业用户能够一目了然程序的操作。将算法和用户操作分开,让程序维护和修改更容易,减少以后代码的修改量。过程中遇到了图片为空,无法加载的问题,后来发现是因为路径搞错了,修改路径以后正常运行。

类图及相关运行界面如下。

Blog3

 

 Blog3

 

 

Blog3

 

 

踩坑心得:

实验中存在不少细节问题,例如狼先吃羊,故羊无法再吃白菜,白菜存活,故需判断当羊进食时是否活着等等问题。本题可将农夫,狼,羊,白菜的共有属性放入一个父类中,用船来执行过河的操作,降低代码的耦合度,提高代码的复用性,方便日后修改添加新类。途中遇见了图片无法加载的问题,经过寻找,发现图片路径输入有误,修改路径后,程序正常运行。

改进建议:

建议多提供输入样例,方便进行判断,修善代码,多出些和所学契合的题目。

总结:

学会了使用抽象类,抽象方法继承与多态,使用容器类,降低代码的耦合度,提高复用性。同时学会了流的运用,文件流的读入写出等等操作,学会了使用异常处理,声明,抛出,抓取异常,优雅的终止错误。对于以上学习内容,对于容器类应该进一步学习和研究熟练的使用ArrayList , 学会了使用fx中的类,例如button等。希望老师能够提供答案或者上课讲一讲这些题目。

原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/268223.html

(0)
上一篇 2022年6月19日
下一篇 2022年6月19日

相关推荐

发表回复

登录后才能评论