Java学习总结与感想

(1)前言与总结分析:这次题目集主要考察的是java类之间的复杂关系,算法本身并不复杂,主要是Java类关系的灵活运用。


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Main {
public static void main(String[] args) throws ParseException{
SimpleDateFormat SimpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
ArrayList<User> Users=new ArrayList<User>();
Scanner ljg=new Scanner(System.in);
String s=ljg.nextLine();
int i;
for(i=0;;i++)
{
if(s.charAt(0)!='u')
{
s=ljg.nextLine();
break;
}


Users.add(new User());
int q=s.indexOf(' ');
Users.get(i).number=s.substring(2,q);
Users.get(i).chargeMode=new LandlinePhoneCharging();

s=ljg.nextLine();
if(s.charAt(0)!='u')
{
break;
}
}
String s1=s;
while(s1.charAt(0)=='t')
{
if(s1.matches("t-[\\d]{11,12}\\s[\\d]{11,12}\\s[\\d]{4}.[\\d]{1,2}.[\\d]{1,2}\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s[\\d]{4}.[\\d]{1,2}.[\\d]{1,2}\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"))
{
int n=0;
int l=Users.size();
while(n<l)
{
try{ // 可能会导致错误的代码

int q=s1.indexOf(' ');
if(Users.get(n).number.equals(s1.substring(2,q)))
{

if(User.numaeral(s1.substring(q+2,q+5))==0)
{

q=s1.indexOf(' ',q+1);
int w=q;
q=s1.indexOf(' ',q+1);
q=s1.indexOf(' ',q+1);
Users.get(n).userRecords.callingInCityRecords.add(new CallRecord());
int size=Users.get(n).userRecords.callingInCityRecords.size();
Users.get(n).userRecords.callingInCityRecords.get(size-1).startTime=SimpleDateFormat.parse(s1.substring(w+1, q));
Users.get(n).userRecords.callingInCityRecords.get(size-1).endTime=SimpleDateFormat.parse(s1.substring(q+1));
}
else if(User.numaeral(s1.substring(q+2,q+5))==1)
{

q=s1.indexOf(' ',q+1);
int w=q;
q=s1.indexOf(' ',q+1);
q=s1.indexOf(' ',q+1);
Users.get(n).userRecords.callingInProvinceRecords.add(new CallRecord());
int size=Users.get(n).userRecords.callingInProvinceRecords.size();
Users.get(n).userRecords.callingInProvinceRecords.get(size-1).startTime=SimpleDateFormat.parse(s1.substring(w+1, q));
Users.get(n).userRecords.callingInProvinceRecords.get(size-1).endTime=SimpleDateFormat.parse(s1.substring(q+1));

}
else
{

q=s1.indexOf(' ',q+1);
int w=q;
q=s1.indexOf(' ',q+1);
q=s1.indexOf(' ',q+1);
Users.get(n).userRecords.callingInLandRecords.add(new CallRecord());
int size=Users.get(n).userRecords.callingInLandRecords.size();
Users.get(n).userRecords.callingInLandRecords.get(size-1).startTime=SimpleDateFormat.parse(s1.substring(w+1, q));
Users.get(n).userRecords.callingInLandRecords.get(size-1).endTime=SimpleDateFormat.parse(s1.substring(q+1));
}
}
}
catch(Exception e){
// 在错误发生时怎么处理
}
n++;
}
}
s1=ljg.nextLine();
}
int y;
int j;
User t=new User();
for(y=0;y<Users.size();y++)
{
for(j=y+1;j<Users.size();j++)
{
if(Users.get(y).number.charAt(11)>Users.get(j).number.charAt(11))
{
t=Users.get(y);
Users.set(y, Users.get(j));
Users.set(j,t);
}

}
}

for(y=0;y<Users.size();y++)
{
System.out.printf("%s %.1f %.1f\n",Users.get(y).number,Users.get(y).calCost(),(80-Users.get(y).calCost()));

}
}
}

abstract class CallChargeRule extends ChargeRule {
SimpleDateFormat SimpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
public abstract double calCost (UserRecords userRecords);
}


class CallRecord extends CommunicationRecord{
Date startTime;
Date endTime;
String callingAddressAreaCode;
String answerAddressAreaCode;
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}

}
abstract class ChargeMode {
ArrayList<ChargeRule> chargeRules = new ArrayList<>();
public abstract double calCost (UserRecords userRecords);
public abstract double getMonthlyRent ();
public ArrayList<ChargeRule> getChargeRules() {
return chargeRules;
}
public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
this.chargeRules = chargeRules;
}
}
abstract class ChargeRule {
public abstract double calCost (UserRecords userRecords);
}
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;
}
}
class LandlinePhoneCharging extends ChargeMode {

@Override
public double calCost(UserRecords userRecords) {
chargeRules.add(new LandPhoneInCityRule());
chargeRules.add(new LandPhoneInProvinceRule());
chargeRules.add(new LandPhoneInlandRule());
return chargeRules.get(0).calCost(userRecords)+chargeRules.get(1).calCost(userRecords)+chargeRules.get(2).calCost(userRecords);
}

@Override
public double getMonthlyRent() {
return 20;
}

}
class LandPhoneInCityRule extends CallChargeRule {
@Override
public double calCost(UserRecords userRecords) {
int i=0;
double s=0;
double m=0;
while(i<userRecords.callingInCityRecords.size())
{
try {
long time1=userRecords.callingInCityRecords.get(i).startTime.getTime();
long time2=userRecords.callingInCityRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=Math.ceil(s/1000/60)*0.1+m;
}
catch(Exception e){
i++;
}
}
return m;
}
}
class LandPhoneInlandRule extends CallChargeRule {

@Override
public double calCost(UserRecords userRecords) {
int i=0;
double s=0;
double m=0;
while(i<userRecords.callingInLandRecords.size())
{
try {
long time1=userRecords.callingInLandRecords.get(i).startTime.getTime();
long time2=userRecords.callingInLandRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=m+Math.ceil(s/1000/60)*0.6;
}
catch(Exception e){
i++;
}
}
return m;
}
}

class LandPhoneInProvinceRule extends CallChargeRule {

@Override
public double calCost(UserRecords userRecords) {
int i=0;
double s=0;
double m=0;
while(i<userRecords.callingInProvinceRecords.size())
{
try {
long time1=userRecords.callingInProvinceRecords.get(i).startTime.getTime();
long time2=userRecords.callingInProvinceRecords.get(i).endTime.getTime();
long time=(time2-time1);
i++;
s=(double)time;
m=Math.ceil(s/1000/60)*0.3+m;
}
catch(Exception e){
i++;
}
}
return m ;
}

}

class User {
UserRecords userRecords =new UserRecords();
double balance=100;
ChargeMode chargeMode;
String number;

public UserRecords getUserRecords() {
return userRecords;
}
public void setUserRecords(UserRecords userRecords) {
this.userRecords = userRecords;
}
public double getBalance() {
return balance;
}
public ChargeMode getChargeMode() {
return chargeMode;
}
public void setChargeMode(ChargeMode chargeMode) {
this.chargeMode = chargeMode;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public double calBalance () {
return balance;
}
public double calCost () {
return chargeMode.calCost(userRecords);
}

public static int numaeral(String number) {
if(Integer.parseInt(number)==791)
return 0;
if(Integer.parseInt(number)>=790&&Integer.parseInt(number)<799||Integer.parseInt(number)==701)
return 1;
else
return 2;
}
}
class UserRecords {
ArrayList<CallRecord> callingInCityRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> callingInProvinceRecords =new ArrayList<CallRecord>();
ArrayList<CallRecord> callingInLandRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInCityRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInProvinceRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInLandRecords=new ArrayList<CallRecord>();

public ArrayList<CallRecord> getCallingInCityRecords() {
return callingInCityRecords;
}
public void addCallingInCityRecords (CallRecord callRecord)
{
callingInCityRecords.add(callRecord);
}
public ArrayList<CallRecord> getCallingInProvinceRecords() {
return callingInProvinceRecords;
}
public void addCallingInProvinceRecords (CallRecord callRecord)
{
callingInProvinceRecords .add(callRecord);
}

public ArrayList<CallRecord> getCallingInLandRecords() {
return callingInLandRecords;
}
public void addCallingInLandRecords (CallRecord callRecord)
{
callingInLandRecords.add(callRecord);
}
public ArrayList<CallRecord> getAnswerInCityRecords() {
return answerInCityRecords;
}
public void addAnswerInCityRecords (CallRecord answerRecord)
{
answerInCityRecords.add(answerRecord);
}
public ArrayList<CallRecord> getAnswerInProvinceRecords() {
return answerInProvinceRecords;
}
public void addAnswerInProvinceRecords (CallRecord answerRecord)
{
answerInProvinceRecords.add(answerRecord);
}
public ArrayList<CallRecord> getAnswerInLandRecords() {
return answerInLandRecords;
}
public void addAnswerInLandRecords (CallRecord answerRecord)
{
answerInLandRecords.add(answerRecord);
}

}

 

开始还是对数据的处理把不同的数据相应的分类也包括对格式的判断与处理和一些简单的计算,关键还是复杂问题下对类关系的运用。

 

题目7-2是考察Java多态,也是Java基本的语法应用,难度较小,题目比较容易。


import java.util.Scanner;

public class Main{
public static void main(String[] args)
{
Scanner ljg=new Scanner(System.in);
int num,i;
String brr;
num=ljg.nextInt();
Container c[]=new Container[num];

for(i=0;i<num;i++)
{
brr=ljg.next();
if(brr.equals("cube")==true)
{
c[i]=new Cube(ljg.nextDouble());
}
if(brr.equals("cylinder")==true)
{
c[i]=new Cylinder(ljg.nextDouble(),ljg.nextDouble());
}
}

System.out.printf("%.2f\n",Container.sumofArea(c));
System.out.printf("%.2f",Container.sumofVolume(c));

}
}


interface Container {
public static final double pi=3.1415926;

public abstract double area();
public abstract double volume();
static double sumofArea(Container c[])
{
double sum=0;
for(int i=0;i<c.length;i++)
{
sum=sum+c[i].area();
}
return sum;
}
static double sumofVolume(Container c[])
{
double sum=0;
for(int i=0;i<c.length;i++)
{
sum=sum+c[i].volume();
}
return sum;
}



}


class Cube implements Container{
public double length;

public Cube()
{

}

public Cube(double length)
{
this.length=length;
}

public double area()
{
return length*length*6;
}

public double volume()
{
return length*length*length;
}


}


class Cylinder implements Container{
public double radius;
public double high;


public Cylinder()
{

}

public Cylinder(double radius,double high)
{
this.radius=radius;
this.high=high;
}

public double area()
{
return (pi*radius*radius*2+2*pi*radius*high);
}

public double volume()
{
return pi*radius*radius*high;
}



}

 

 

 

7-1 电信计费系列2-手机+座机计费,题目已经表达的很清楚了,是对电信计费的进一步的设计,这时候要考虑的情况更多,类之间的关系更加复杂,难度还是比较大的,感受到了这个题目的难度。

类之间的关系分析起来比较困难,核心功能的实现非常困难,深度考察了对Java的应用。

import java.math.BigInteger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Main {
public static void main(String[] args) throws ParseException{
SimpleDateFormat SimpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
ArrayList<User> Users=new ArrayList<User>();
Scanner ljg=new Scanner(System.in);

String ss=ljg.nextLine();
int m=0,y,j;
while(true)
{
if(ss.matches("u-0791[0-9]{7,8} 0"))
{
Users.add(new User());
int q=ss.indexOf(' ');
Users.get(m).number=ss.substring(2,q);
Users.get(m).chargeMode=new LandlinePhoneCharging();
m++;
}
if(ss.matches("u-1[0-9]{10} 1"))
{
Users.add(new User());
int q=ss.indexOf(' ');
Users.get(m).number=ss.substring(2,q);
Users.get(m).chargeMode=new iPhoneCharging();
m++;
}
ss=ljg.nextLine();
if(ss.charAt(0)=='t'||ss.equals("end"))
{
break;
}

}

User temp=new User();//交换用
for(y=0;y<Users.size();y++)
{
for(j=y+1;j<Users.size();j++)
{
BigInteger b1 = new BigInteger(Users.get(y).number);//号码转换
BigInteger b2 = new BigInteger(Users.get(j).number);//号码转换
if(Users.get(y).number.equals(Users.get(j).number))
{
Users.remove(j);
}
else if(Users.get(y).number.charAt(0)>Users.get(j).number.charAt(0))
{
temp=Users.get(y);
Users.set(y, Users.get(j));
Users.set(j,temp);
}
else if(b1.intValue()-b2.intValue()>0&&!(Users.get(y).number.charAt(0)=='0'&&Users.get(j).number.charAt(0)=='1'))
{
temp=Users.get(y);
Users.set(y, Users.get(j));
Users.set(j,temp);
}
}
}
String c=ss;
while(!c.equals("end"))
{
int n;
if(c.matches("t-0[\\d]{10,11} 0[\\d]{9,11} [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"))
{//座机打座机
n=0;
while(n<Users.size())
{
int q=c.indexOf(' ');
if(Users.get(n).number.equals(c.substring(2,q)))
{

if(User.numaeral(c.substring(q+2,q+5))==0)
{
q=c.indexOf(' ',q+1);
int w=q;
q=c.indexOf(' ',q+1);
q=c.indexOf(' ',q+1);
if(check(c.substring(w+1, q))&&check(c.substring(q+1)))
{
Users.get(n).userRecords.callingInCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInCityRecords.size();
Users.get(n).userRecords.callingInCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(w+1, q));
Users.get(n).userRecords.callingInCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(q+1));
}
}
else if(User.numaeral(c.substring(q+2,q+5))==1)
{

q=c.indexOf(' ',q+1);
int w=q;
q=c.indexOf(' ',q+1);
q=c.indexOf(' ',q+1);
if(check(c.substring(w+1, q))&&check(c.substring(q+1)))
{
Users.get(n).userRecords.callingInProvinceRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInProvinceRecords.size();
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(w+1, q));
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(q+1));
}
}
else
{

q=c.indexOf(' ',q+1);
int w=q;
q=c.indexOf(' ',q+1);
q=c.indexOf(' ',q+1);
if(check(c.substring(w+1, q))&&check(c.substring(q+1)))
{
Users.get(n).userRecords.callingInLandRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInLandRecords.size();
Users.get(n).userRecords.callingInLandRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(w+1, q));
Users.get(n).userRecords.callingInLandRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(q+1));
}
}
}//寻找到指定用户结束后进行的操作结束

n++;
}//寻找配对用户结束
}//座机打座机匹配操作结束

if(c.matches("t-1[\\d]{10} 0[\\d]{2,3} 1[\\d]{10} 0[\\d]{2,3} [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"))
{ //手机打手机
int q=c.indexOf(' ');
int r=c.indexOf(' ',q+1);
int s=c.indexOf(' ',r+1);
int t=c.indexOf(' ',s+1);
int u=c.indexOf(' ',t+1);
int v=c.indexOf(' ',u+1);
int p=User.numaeral(c.substring(s+2,t));
int jud=ifinrecord(c.substring(r+1,s),Users);

n=ifinrecord(c.substring(2,q),Users);

if(n!=-1&&check(c.substring(t+1,v))&&check(c.substring(v+1)))
{

if(User.numaeral(c.substring(q+2,r))==0)//不漫游
{

if(p==0)
{
Users.get(n).userRecords.callingInCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInCityRecords.size();
Users.get(n).userRecords.callingInCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(t+1, v));
Users.get(n).userRecords.callingInCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(v+1));
}
else if(p==1)
{
Users.get(n).userRecords.callingInProvinceRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInProvinceRecords.size();
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(t+1, v));
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(v+1));
}
else
{
Users.get(n).userRecords.callingInLandRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInLandRecords.size();
Users.get(n).userRecords.callingInLandRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(t+1, v));
Users.get(n).userRecords.callingInLandRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(v+1));

}
}//不漫游结束
else if(User.numaeral(c.substring(q+2,r))==1)//省内漫游
{
Users.get(n).userRecords.callingoutCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingoutCityRecords.size();
Users.get(n).userRecords.callingoutCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(t+1, v));
Users.get(n).userRecords.callingoutCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(v+1));

}//省内漫游结束

}////寻找到指定拨号用户结束后进行的操作结束
if(p==2&&jud!=-1&&check(c.substring(t+1,v))&&check(c.substring(v+1)))
{
Users.get(jud).userRecords.answerRecords.add(new CallRecord());
int le=Users.get(jud).userRecords.answerRecords.size();
Users.get(jud).userRecords.answerRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(t+1, v));
Users.get(jud).userRecords.answerRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(v+1));
}//寻找到指定接听用户后进行的操作结束
}//手机打手机结束
if(c.matches("t-0791[\\d]{7,8} 1[\\d]{10} 0[\\d]{2,3} [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"))
//座机打手机
{
int q=c.indexOf(' ');
int r=c.indexOf(' ',q+1);
int s=c.indexOf(' ',r+1);
int t=c.indexOf(' ',s+1);
int u=c.indexOf(' ',t+1);
int p=User.numaeral(c.substring(r+2,s));
n=ifinrecord(c.substring(2,q),Users);
int jud=ifinrecord(c.substring(q+1,r),Users);
if(n!=-1&&check(c.substring(s+1,u))&&check(c.substring(u+1)))
{

if(p==0)
{
Users.get(n).userRecords.callingInCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInCityRecords.size();
Users.get(n).userRecords.callingInCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingInCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}
else if(p==1)
{
Users.get(n).userRecords.callingInProvinceRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInProvinceRecords.size();
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingInProvinceRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}
else
{
Users.get(n).userRecords.callingInLandRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInLandRecords.size();
Users.get(n).userRecords.callingInLandRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingInLandRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}
}//寻找到指定拨号用户完成操作后结束
if(p==2&&jud!=-1&&check(c.substring(s+1,u))&&check(c.substring(u+1)))
{

Users.get(jud).userRecords.answerRecords.add(new CallRecord());
int le=Users.get(jud).userRecords.answerRecords.size();
Users.get(jud).userRecords.answerRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(jud).userRecords.answerRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}//寻找到指定接听用户后操作结束
}//座机打手机结束
if(c.matches("t-1[\\d]{10} 0[\\d]{2,3} 0[\\d]{9,11} [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) [\\d]{4}.[\\d]{1,2}.[\\d]{1,2} ([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"))
//手机打座机
{

int q=c.indexOf(' ');
int r=c.indexOf(' ',q+1);
int s=c.indexOf(' ',r+1);
int t=c.indexOf(' ',s+1);
int u=c.indexOf(' ',t+1);
int p=User.numaeral(c.substring(q+2,r));
n=ifinrecord(c.substring(2,q),Users);
if(n!=-1&&check(c.substring(s+1,u))&&check(c.substring(u+1)))
{
if(p==0)
{
Users.get(n).userRecords.callingInCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingInCityRecords.size();
Users.get(n).userRecords.callingInCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingInCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}
else if(p==1)
{
Users.get(n).userRecords.callingoutCityRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingoutCityRecords.size();
Users.get(n).userRecords.callingoutCityRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingoutCityRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));
}
else
{
Users.get(n).userRecords.callingoutLandRecords.add(new CallRecord());
int le=Users.get(n).userRecords.callingoutLandRecords.size();
Users.get(n).userRecords.callingoutLandRecords.get(le-1).startTime=SimpleDateFormat.parse(c.substring(s+1, u));
Users.get(n).userRecords.callingoutLandRecords.get(le-1).endTime=SimpleDateFormat.parse(c.substring(u+1));

}
}
}//手机打座机结束
c=ljg.nextLine();
}//用户通话记录输入结束

y=0;
while(y<Users.size())
{
System.out.printf("%s %.1f %.1f",Users.get(y).number,Users.get(y).calCost(),(100-Users.get(y).chargeMode.getMonthlyRent()-Users.get(y).calCost()));
System.out.printf("\n");
y++;
}
}
private static int ifinrecord(String s,ArrayList<User> Users) {
for(int i=0;i<Users.size();i++)
{
if(s.equals(Users.get(i).number))
return i;
}
return -1;
}
static boolean check (String str) {
SimpleDateFormat sd=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");//括号内为日期格式,y代表年份,M代表年份中的月份(为避免与小时中的分钟数m冲突,此处用M),d代表月份中的天数
try {
sd.setLenient(false);//此处指定日期/时间解析是否不严格,在true是不严格,false时为严格
sd.parse(str);//从给定字符串的开始解析文本,以生成一个日期
}
catch (Exception e) {
return false;
}
return true;
}
}

abstract class CallChargeRule extends ChargeRule {
SimpleDateFormat SimpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
public abstract double calCost (UserRecords userRecords);
}

class CallRecord extends CommunicationRecord{
Date startTime;
Date endTime;
String callingAddressAreaCode;
String answerAddressAreaCode;
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public String getCallingAddressAreaCode() {
return callingAddressAreaCode;
}
public void setCallingAddressAreaCode(String callingAddressAreaCode) {
this.callingAddressAreaCode = callingAddressAreaCode;
}
public String getAnswerAddressAreaCode() {
return answerAddressAreaCode;
}
public void setAnswerAddressAreaCode(String answerAddressAreaCode) {
this.answerAddressAreaCode = answerAddressAreaCode;
}
}

abstract class chargeMode {
ArrayList<ChargeRule> chargeRules = new ArrayList<>();
public abstract double calCost (UserRecords userRecords);
public abstract double getMonthlyRent();
public ArrayList<ChargeRule> getChargeRules() {
return chargeRules;
}
public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
this.chargeRules = chargeRules;
}
}

abstract class ChargeRule {
public abstract double calCost (UserRecords userRecords);
}

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

class iPhoneCharging extends chargeMode {

@Override
public double calCost(UserRecords userRecords) {
chargeRules.add(new IPhoneRule());
return chargeRules.get(0).calCost(userRecords);
}

@Override
public double getMonthlyRent() {
// TODO Auto-generated method stub
return 15;
}

}

class IPhoneRule extends ChargeRule {

@Override
public double calCost(UserRecords userRecords) {
int i=0;
double s=0,min=0;

for(i=0;i<userRecords.callingInCityRecords.size();i++)
{

long time1=userRecords.callingInCityRecords.get(i).startTime.getTime();
long time2=userRecords.callingInCityRecords.get(i).endTime.getTime();
long time=(time2-time1);
s=(double)time;
min=min+Math.ceil(s/1000/60)*0.1;
}

for(i=0;i<userRecords.callingInProvinceRecords.size();i++)
{
long time1=userRecords.callingInProvinceRecords.get(i).startTime.getTime();
long time2=userRecords.callingInProvinceRecords.get(i).endTime.getTime();
long time=(time2-time1);
s=(double)time;
min=min+Math.ceil(s/1000/60)*0.2;
}

for(i=0;i<userRecords.callingInLandRecords.size();i++)
{
long time1=userRecords.callingInLandRecords.get(i).startTime.getTime();
long time2=userRecords.callingInLandRecords.get(i).endTime.getTime();
long time=(time2-time1);
s=(double)time;
min=min+Math.ceil(s/1000/60)*0.3;
}

for(i=0;i<userRecords.answerRecords.size();i++)
{
long time1=userRecords.answerRecords.get(i).startTime.getTime();
long time2=userRecords.answerRecords.get(i).endTime.getTime();
long time=(time2-time1);
s=(double)time;
min=min+Math.ceil(s/1000/60)*0.3;
}

for(i=0;i<userRecords.callingoutCityRecords.size();i++)
{
long time1=userRecords.callingoutCityRecords.get(i).startTime.getTime();
long time2=userRecords.callingoutCityRecords.get(i).endTime.getTime();
long time=(time2-time1);
s=(double)time;
min=min+Math.ceil(s/1000/60)*0.3;
}

for(i=0;i<userRecords.callingoutLandRecords.size();i++)
{
long time1=userRecords.callingoutLandRecords.get(i).startTime.getTime();
long time2=userRecords.callingoutLandRecords.get(i).endTime.getTime();
long time=(time2-time1);
s=(double)time;
min=min+Math.ceil(s/1000/60)*0.6;
}
return min;
}

}

class LandlinePhoneCharging extends chargeMode {

@Override
public double calCost(UserRecords userRecords) {
chargeRules.add(new LandPhoneInCityRule());
chargeRules.add(new LandPhoneInProvinceRule());
chargeRules.add(new LandPhoneInlandRule());
return chargeRules.get(0).calCost(userRecords)+chargeRules.get(1).calCost(userRecords)+chargeRules.get(2).calCost(userRecords);
}

@Override
public double getMonthlyRent() {
// TODO Auto-generated method stub
return 20;
}

}

class LandPhoneInCityRule extends CallChargeRule {


@Override
public double calCost(UserRecords userRecords) {
int i;
double s=0,min=0;

for(i=0;i<userRecords.callingInCityRecords.size();i++)
{
long time1=userRecords.callingInCityRecords.get(i).startTime.getTime();
long time2=userRecords.callingInCityRecords.get(i).endTime.getTime();
long time=(time2-time1);
s=(double)time;
min=min+Math.ceil(s/1000/60)*0.1;
}
return min;
}
}

class LandPhoneInlandRule extends CallChargeRule {

@Override
public double calCost(UserRecords userRecords) {
int i;
double s=0,min=0;

for(i=0;i<userRecords.callingInLandRecords.size();i++)
{
long time1=userRecords.callingInLandRecords.get(i).startTime.getTime();
long time2=userRecords.callingInLandRecords.get(i).endTime.getTime();
long time=(time2-time1);
s=(double)time;
min=min+Math.ceil(s/1000/60)*0.6;
}
return min;
}
}

class LandPhoneInProvinceRule extends CallChargeRule {

@Override
public double calCost(UserRecords userRecords) {
int i;
double s=0,min=0;

for(i=0;i<userRecords.callingInProvinceRecords.size();i++)
{
long time1=userRecords.callingInProvinceRecords.get(i).startTime.getTime();
long time2=userRecords.callingInProvinceRecords.get(i).endTime.getTime();
long time=(time2-time1);
s=(double)time;
min=min+Math.ceil(s/1000/60)*0.3;
}
return min;
}

}

class User {
UserRecords userRecords =new UserRecords();
double balance=100;
chargeMode chargeMode;
String number;
public UserRecords getUserRecords() {
return userRecords;
}
public void setUserRecords(UserRecords userRecords) {
this.userRecords = userRecords;
}
public double getBalance() {
return balance;
}
public chargeMode getChargeMode() {
return chargeMode;
}
public void setChargeMode(chargeMode chargeMode) {
this.chargeMode = chargeMode;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public double calBalance () {
return balance;
}
public double calCost () {
return chargeMode.calCost(userRecords);
}

public static int numaeral(String number) {
if(Integer.parseInt(number)==791)
return 0;
else if(Integer.parseInt(number)>=790&&Integer.parseInt(number)<=799||Integer.parseInt(number)==701)
return 1;
else
return 2;
}

}

class UserRecords {
ArrayList<CallRecord> callingInCityRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> callingInProvinceRecords =new ArrayList<CallRecord>();
ArrayList<CallRecord> callingInLandRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> callingoutCityRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> callingoutLandRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInCityRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInProvinceRecords=new ArrayList<CallRecord>();
ArrayList<CallRecord> answerInLandRecords=new ArrayList<CallRecord>();

public ArrayList<CallRecord> getCallingInCityRecords() {
return callingInCityRecords;
}

public void addCallingInCityRecords (CallRecord callRecord)
{
callingInCityRecords.add(callRecord);
}

public ArrayList<CallRecord> getCallingInProvinceRecords() {
return callingInProvinceRecords;
}

public void addCallingInProvinceRecords (CallRecord callRecord)
{
callingInProvinceRecords.add(callRecord);
}

public ArrayList<CallRecord> getCallingInLandRecords() {
return callingInLandRecords;
}

public void addCallingInLandRecords (CallRecord callRecord)
{
callingInLandRecords.add(callRecord);
}

public ArrayList<CallRecord> getAnswerInCityRecords() {
return answerInCityRecords;
}

public void addAnswerInCityRecords (CallRecord answerRecord)
{
answerInCityRecords.add(answerRecord);
}

public ArrayList<CallRecord> getAnswerInProvinceRecords() {
return answerInProvinceRecords;
}

public void addAnswerInProvinceRecords (CallRecord answerRecord)
{
answerInProvinceRecords.add(answerRecord);
}

public ArrayList<CallRecord> getAnswerInLandRecords() {
return answerInLandRecords;
}

public void addAnswerInLandRecords (CallRecord answerRecord)
{
answerInLandRecords.add(answerRecord);
}
}

 

 

 

 

 

 

(2)改进建议:我认为自己的代码最大的改进的地方就是通过类来解决问题,更好的去理清好类之间的关系,一些代码可以更加的模块化,使代码更加紧凑。

 

7-1 电信计费系列3-短信计费是电信计费的最后一个模块因为只要考虑单一的短信计费所以考虑的情况比较少处理起来相对容易。

 

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws ParseException{
SimpleDateFormat SimpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

ArrayList<User> Users=new ArrayList<User>();
Scanner ljg=new Scanner(System.in);
String s=ljg.nextLine();
int i=0;
while(true)
{
if(s.matches("u-1[0-9]{10} 3"))
{
Users.add(new User());
int q=s.indexOf(' ');
Users.get(i).number=s.substring(2,q);
Users.get(i).chargeMode=new mphonecharging();
i++;
}
s=ljg.nextLine();

if(s.charAt(0)=='m'||s.equals("end"))
break;
}
int j,k;

for(j=0;j<Users.size();j++)
{
for(k=0;k<Users.size();k++)
{
if(j!=k&&Users.get(j).number.equals(Users.get(k).number))
{
Users.remove(k);
}
}
}
Collections.sort(Users);
String c=s;

while(!c.equals("end"))
{
int n=0;
int l=Users.size();
if(c.matches("m-1[\\d]{10} 1[\\d]{10} [a-zA-Z\\d ,.]+"))
{
int q=c.indexOf(' ');
int r=c.indexOf(' ',q+1);
n=ifinrecord(c.substring(2,q),Users);
if(n!=-1)
{
Users.get(n).userRecords.sendMessageRecords.add(new MessageRecord());
int le=Users.get(n).userRecords.sendMessageRecords.size();
Users.get(n).userRecords.sendMessageRecords.get(le-1).message=c.substring(r+1);
}
c=ljg.nextLine();
}



}
for(k=0;k<Users.size();k++)
{
System.out.printf("%s %.1f %.1f",Users.get(k).number,Users.get(k).calCost(),(100-Users.get(k).chargeMode.getMonthlyRent()-Users.get(k).calCost()));
System.out.printf("\n");
}
}

private static int ifinrecord(String s,ArrayList<User> Users) {
for(int i=0;i<Users.size();i++)
{
if(s.equals(Users.get(i).number))
return i;
}
return -1;
}
static boolean check (String str) {
SimpleDateFormat sd=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");//括号内为日

try {
sd.setLenient(false);//此处指定日期/时间解析是否不严格,在true是不严格,false时为严格
sd.parse(str);//从给定字符串的开始解析文本,以生成一个日期
}
catch (Exception e) {
return false;
}
return true;
}
}

abstract class chargeMode {
ArrayList<ChargeRule> chargeRules = new ArrayList<>();
public abstract double calCost (UserRecords userRecords);
public abstract double getMonthlyRent();

public ArrayList<ChargeRule> getChargeRules() {
return chargeRules;
}
public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
this.chargeRules = chargeRules;
}
}

abstract class ChargeRule {
public abstract double calCost (UserRecords userRecords);
}

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

class MessageRecord extends CommunicationRecord{
String message;

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
}

class mphonecharging extends chargeMode {

@Override
public double calCost(UserRecords userRecords) {
chargeRules.add(new mphonerule());
return chargeRules.get(0).calCost(userRecords);
}

@Override
public double getMonthlyRent() {
return 0;
}

}

class mphonerule extends ChargeRule {

@Override
public double calCost(UserRecords userRecords) {
int i=0;
double s=0;
while(i<userRecords.sendMessageRecords.size())
{
float a=(float)userRecords.sendMessageRecords.get(i).message.length()/10;
s=s+Math.ceil(a);
i++;
}
if(s<=3)
return s*0.1;
if(s>3&&s<=5)
return (s-3)*0.2+0.3;
else
return (s-5)*0.3+0.3+0.4;
}

}

class User implements Comparable<User> {
UserRecords userRecords =new UserRecords();
double balance=100;
chargeMode chargeMode;
String number;
public UserRecords getUserRecords() {
return userRecords;
}
public void setUserRecords(UserRecords userRecords) {
this.userRecords = userRecords;
}
public double getBalance() {
return balance;
}
public chargeMode getChargeMode() {
return chargeMode;
}
public void setChargeMode(chargeMode chargeMode) {
this.chargeMode = chargeMode;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public double calBalance () {
return balance;
}
public double calCost () {
return chargeMode.calCost(userRecords);
}
public static int numaeral(String number) {
if(Integer.parseInt(number)==791)
return 0;
else if(Integer.parseInt(number)>=790&&Integer.parseInt(number)<=799||Integer.parseInt(number)==701)
return 1;
else
return 2;
}

public static int numaeral(String number,String number1) {
if(Integer.parseInt(number)==791)
return 0;

else if(Integer.parseInt(number)>=790&&Integer.parseInt(number)<=799||Integer.parseInt(number)==701)
return 1;

else
return 2;
}

public int compareTo(User u) {

return this.number.compareTo(u.number);
}
}

class UserRecords {
ArrayList<MessageRecord> sendMessageRecords=new ArrayList<MessageRecord>();
ArrayList<MessageRecord> receiveMessageRecords=new ArrayList<MessageRecord>();

public ArrayList<MessageRecord> getSendMessageRecords(){
return sendMessageRecords;
}

public void addSendMessageRecords (MessageRecord sendMessageRecord){
sendMessageRecords.add(sendMessageRecord);
}

public ArrayList<MessageRecord> getReceiveMessageRecords() {
return receiveMessageRecords;
}

public void addReceiveMessageRecords (MessageRecord receiveMessageRecord){
receiveMessageRecords.add(receiveMessageRecord);
}
}

import java.util.*;
public class Main {
public static void main(String[] args) {

Scanner ljg= new Scanner(System.in);

int n=ljg.nextInt();

Shop myshop=new Shop(n);

Shop.InnerCoupons coupons50=myshop.new InnerCoupons(50);
Shop.InnerCoupons coupons100=myshop.new InnerCoupons(100);

coupons50.buy();
coupons100.buy();

}
}

class Shop {
private int milkCount;
InnerCoupons coupons50;
InnerCoupons coupons100;

public Shop(int milkCount)
{
this.milkCount=milkCount;
}

public void setMilkCount(int milkCount)
{
this.milkCount=milkCount;
}

public int getMilkCount( )
{
return milkCount;
}

public class InnerCoupons{
public int value;

public InnerCoupons(int value)
{
this.value=value;
}

public void buy()
{
System.out.println("使用了面值为"+this.value+"的购物券进行支付");
Shop.this.milkCount=Shop.this.milkCount-this.value/50;
System.out.println("牛奶还剩"+Shop.this.milkCount+"箱");
}


}
}

 



一个Java内部类的简单问题,一些基本的语法知识,解决起来比较容易。

 

 

 

 

 

(3)总结:通过本阶段的题目集的练习,继续理解了Java之间类的关系还有一些功能的组合,理解了Java与C语言的本质的区别是思想的不同, 深刻体会到了面向对象在解决问题当中的优势与方便。 Java尤其对一些复杂度特别高,类之间的关系特别复杂的问题有着天然的优势,这次电信计费的问题便是如此, 这也是Java能够流行起来的重要原因。对一些题目解决的不顺利暴露出自己对Java开始阶段对问题的分类和要使用哪些类来解决实际问题的分析与实现还很不到位,在一些题目上花了很多时间效果并不好,走了很多弯路,对类的运用还有待提升。接下来要积极转变面向过程的这种思想,下一步应该继续优化好代码的结构和运用继承与多态使代码更加简化,使代码复用性更好,这也是我们能正确应用这些方法的关键。在这阶段的学习中,还是有很多收获的,起码知道了Java在解决问题中的优势,理解了将万物分类的重要性。这是我对面向对象思想的初步了解,相信在接下来的学习中我能更加体会到这种思想在解决问题中的重要地位。

大作业:我认为大作业截止时间过后应该最少提供一种正确思路的代码方案供同学们参考,否则我们有问题没法解决那这样的大作业又起到多大的作用呢,作业本来就是来帮助我们发现自己的不足和来提高自己的。 学习编程本来就是一个先模仿后自主的过程,一开始没有丰富的模板怎样更好的入门呢,如果一开始同学们就能自主的解决所有问题那这门课程还有开设的必要吗?

课程:还是像前面提到的那样,编程是用来解决实际问题的,希望在课堂上能有更多的实际问题的演示过程,这样的话课堂上的效果会更好,理论和实际相结合的方式应该是一种很优秀的教学方式,也希望老师能对做过题目有一个详细的讲解,特别是一些重难点的地方。

posted @ 2022-06-12 10:43  直走啊  阅读(102)  评论(0)    收藏  举报