NCHU面对对象程序设计 第6-8次大作业

1. 前言

  本次作业涉及到的知识点还是很多的,像是接口类的编写和使用,使用Collection类进行排序之类的,对于JAVA的三大特性封装继承多态也有了更深的理解,而电信计费系列的题目是一个很多考察点的集合,对于输入的处理很麻烦,对于各种通话记录的分类也有些麻烦,由于三次的代码都是沿用前面的代码加入功能,所以三次并为一次讲。


2. 设计与分析

2.1. practice 6

2.1.2.多态测试

  • 思路

    考察接口类的使用,按照题目所给实现即可

  • 实现

//多态测试
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {	
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		String S;
		Container[] C=new Container[20];
		for(int i=0;i<n;i++)
		{
			S=input.next();
			if(S.equals("cube"))
			{
				double x=input.nextDouble();
				C[i]=new Cube(x);	
			}
			else {
				double x=input.nextDouble();
				double y=input.nextDouble();
				C[i]=new Cylinder(x,y);
			}
		}
		System.out.printf("%.2f\n%.2f",Container.sumofArea(C),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 ans=0;
		for(int i=0;c[i]!=null;i++)
		      ans+=c[i].area();
		return ans;
	}
	static double sumofVolume(Container c[])
	{
		double ans=0;
		for(int i=0;c[i]!=null;i++)
			ans+=c[i].volume();
		return ans;
	}
}

class Cube implements Container
{
	double side;
	public Cube(double x)
	{
		this.side=x;
	}
	public double area()
	{
		return 6*side*side;
	}
	public double volume()
	{
		return side*side*side;
	}
}

class Cylinder implements Container
{
	double r,hight;
	public Cylinder(double x,double y)
	{
		this.r=x;
		this.hight=y;
	}
	public double area()
	{
		return 2*r*r*pi+2*r*pi*hight;
	}
	public double volume()
	{
		return r*r*pi*hight;
	}
}


复杂度分析

6-1留待最后分析



2.2. practice 7

2.2.2. sdut-Collection-sort--C~K的班级(II)

  • 思路:
    利用Collection类的sort写一个compare函数即可,判断重复的话是重写了student类的equals方法,插入前循环列表判断是否含有这个对象

  • 实现:

//sdut-Collection-sort--C~K的班级(II)
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class student{
    private String num;
    private String name;
    private String age;
    private String sex;
    public String getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
    public String getNum() {
        return num;
    }
    public String getSex() {
        return sex;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setNum(String num) {
        this.num = num;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    //@Override
    public boolean equals(student b)
    {
        if(b.getNum().compareTo(this.num)!=0)
            return false;
        if(b.getName().compareTo(this.name)!=0)
            return false;
        if(b.getAge().compareTo(this.age)!=0)
            return false;
        if(b.getSex().compareTo(this.sex)!=0)
            return false;
        return true;
    }
}
public class Main {
    	public static void main(String[] args) {
            int  n;
            ArrayList<student> te=new ArrayList<student>();
            Scanner input=new Scanner(System.in);
            n=Integer.parseInt(input.next());
            for(int i=0;i<n;i++)
            {
                int flag=0;
                student s=new student();
                s.setNum(input.next());
                s.setName(input.next());
                s.setAge(input.next());
                s.setSex(input.next());
                for(student se:te)
                {
                    if(se.equals(s))
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag==0)
                    te.add(s);
            }
            Collections.sort(te, new Comparator<student>(){
                public int compare(student s1, student s2) 
                {
                   return s1.getNum().compareTo(s2.getNum());
                }
           });
            System.out.println(te.size());
            for(student se:te)
            {
                System.out.println(se.getNum()+" "+se.getName()+" "+se.getAge()+" "+se.getSex());
            }
    }
}


2.2.3. 阅读程序,按照题目需求修改程序

  • 思路:

    老实说没怎么搞懂,修改好程序以后交了几发出现了好几种错误,再交了几次就过了,这题考的是迭代器和Collections类的排序,具体实现还是比较简单

  • 实现:


// 1、导入相关包
import java.util.Iterator;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
//定义员工类
class Employee {

	private String name;
	private int age;

	public Employee() {
		super();
	}

	public Employee(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

//主函数
public class Main {

	public static void main(String[] args) {
				// 1、创建有序集合对象
				ArrayList<Employee> c=new ArrayList<Employee>() ;

      // 创建3个员工元素对象
        Scanner sc = new Scanner(System.in);
		for (int i = 0; i < 3; i++) {
			String employeeName = sc.next();
            String te=sc.next();
			int employeeAge = Integer.parseInt(te);
			Employee employee = new Employee(employeeName, employeeAge);
			c.add(employee);
		}
        sc.close();
        Collections.sort(c, new Comparator<Employee>(){
             public int compare(Employee e1, Employee e2) 
             {
                return e1.getAge()-e2.getAge();
             }
        });
				
				
				
				// 2、创建迭代器遍历集合
				Iterator <Employee> it = c.iterator();
				
				//3、遍历
				while (it.hasNext()) {
					
					//4、集合中对象未知,向下转型
					Employee e =  it.next();
					
					System.out.println(e.getName() + "---" + e.getAge());
				}
	}

}



复杂度分析

​ 7-1留待practice 8进行分析

2.3. practice 8

2.3.1. 电信计费系列3-短信计费

  • 思路:

    本题集合了前两次的题目一起说明,首先是输入的合法性:
    座机与座机的通话判断为按空格分割,前两个串匹配为座机("[0]{1}[0-9]{9,11}$"),后两个串匹配为日期([0-9]{3,4}.. (([0-1][0-9])|(2[0-3]))::$"),匹配成功就生成通话记录加入到对应的拨号用户和接听用户的通话卡中。
    手机通话麻烦很多,写了三个check函数,分别对应手机打座机,座机打手机,手机打手机,匹配成功后将手机的通话记录(只分为拨打和接听两种记录)一股脑塞到一起处理
    在计算拨打费用的时候,先匹配是不是南昌本地拨打的,是则匹配接听的电话的位置来判断是市内/省内/国内通话,再判断是否为省内漫游,不是则判断为国内漫游。接听电话的处理则只要判断是否在省外接听即可,省外就0.3元/s。
    短信的处理则简单了,由于电话号码固定为11位,所以从26位开始就是短信的内容,再判断了前24个字符的合法性后直接加到短信记录里即可,计费方式也是经典分段函数,处理较为简单。

  • 实现:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Scanner;
public class Main {
    static String zj="^[0]{1}[0-9]{9,11}$";
    static String sj="^[1]{1}[0-9]{10}$";
    static String qh="^[0]{1}[0-9]{2,3}$";
    static String rq="^[0-9]{3,4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$";
    static SimpleDateFormat date=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

    public static void main(String[] args) throws ParseException {
        Scanner input=new Scanner(System.in);
        ArrayList<User> users=new ArrayList<>();
        String te1="^u-[0-9]{11,12} [0-3]$";
        String te2="(^t-[0]{1}[0-9]{9,11} ((0[0-9]{9,11})|(1[0-9]{10} 0[0-9]{2,3})) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$)|(^t-1[0-9]{10} 0[0-9]{2,3} ((0[0-9]{9,11})|(1[0-9]{10} 0[0-9]{2,3})) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$)";
        String te3="^m-[1]{1}[0-9]{10} [1]{1}[0-9]{10} .+";
        int te4[]=new int[256];
        for(int i=0;i<256;i++)
            te4[i]=0;
        for(int i=48;i<=57;i++)
            te4[i]=1;
        for(int i=65;i<=90;i++)
            te4[i]=1;
        for(int i=97;i<=122;i++)
            te4[i]=1;
        te4[(int)' ']=1;
        te4[(int)'.']=1;
        te4[(int)',']=1;
        String S,tel1,type;
        S=input.nextLine();
        while(!S.equals("end"))
        {
            if(S.matches(te1))
            {
                User te=new User();
                tel1=S.substring(S.indexOf("-")+1, S.indexOf(" "));
                type=S.substring(S.indexOf(" ")+1);
                te.setNumber(tel1);
                te.setUserecords(new UseRecords());
                switch (type) {
                    case "0": te.setChargemode(new LandPhoneChargeing());break;
                    case "1": te.setChargemode(new PhoneChargeing());break;
                    case "3": te.setChargemode(new MessageChargeing());break;
                    default: S=input.nextLine();continue;
                }
                int flag=0;
                for(User tu:users)
                    if(tu.getNumber().equals(te.getNumber()))
                    {
                        flag=1;
                        break;
                    }
                if(flag==0)
                    users.add(te);
            }
            else if(S.matches(te2)) {
                CallRecord te = new CallRecord();
                String[] buff = S.split(" ");
                if(buff.length==6)
                {
                    if(!check1(te,buff))
                    {
                        //System.out.println(1);
                        S=input.nextLine();
                        continue;
                    }
                }
                else if(buff.length==7)
                {
                    if(!check2(te,buff))
                    {
                        //System.out.println(1);
                        S=input.nextLine();
                        continue;
                    }
                }
                else if(buff.length==8)
                {
                    if(!check3(te,buff))
                    {
                        //System.out.println(1);
                        S=input.nextLine();
                        continue;
                    }
                }
                else {
                    S=input.nextLine();
                    continue;
                }
                //System.out.println(te.getAnswerAddressAreaCode()+" "+te.getCallingAddressAreaCode());
                for (User tu : users) {
                    if (tu.getNumber().equals(te.getCallingNumber())) {
                        if(tu.getNumber().charAt(0)=='0')
                        {
                            if (te.getAnswerAddressAreaCode().equals("0791"))
                                tu.getUserecords().addcallingInCityRecords(te);
                            else if (check(te.getAnswerAddressAreaCode()))
                                tu.getUserecords().addcallingInProvinceRecords(te);
                            else tu.getUserecords().addcallingInLandRecords(te);
                        }
                        else tu.getUserecords().addcallingInCityRecords(te);
                    }
                    if (tu.getNumber().equals(te.getAnswerNumber()))
                        tu.getUserecords().addanswerInCityRecords(te);
                }
            }
            else if(S.matches(te3))
            {
                int flag=0;
                String te=S.substring(26);
                for(int i=0;i<te.length();i++)
                    if(te.charAt(i)>=256||te4[(int)te.charAt(i)]==0)
                    {
                        flag=1;
                        break;
                    }
                if(flag==1)
                {
                    S=input.nextLine();
                    continue;
                }
                //System.out.println(te);
                MessageRecord messageRecord=new MessageRecord();
                messageRecord.setCallingNumber(S.substring(2,13));
                messageRecord.setAnswerNumber(S.substring(14,25));
                messageRecord.setMassage(te);
                for (User tu:users)
                {
                    if(tu.getNumber().equals(messageRecord.getCallingNumber()))
                        tu.getUserecords().addsendMessageRecord(messageRecord);
                }
            }
            S=input.nextLine();
        }
        Collections.sort(users,new Comparator<User>() {
            public int compare(User u1,User u2)
            {
                return u1.getNumber().compareTo(u2.getNumber());
            }
        });
        for(User te:users)
        {
            System.out.print(te.getNumber());
            System.out.printf(" %.1f %.1f\n",te.calCost(),te.calbalance());
        }
        input.close();
    }
    public  static boolean check(String s)
    {
        String[] te3={"0790","0792","0793","0794","0795","0796","0797","0798","0799","0701"};
        for(String te:te3)
            if(s.equals(te))
                return true;
        return false;
    }
    public  static  boolean check1(CallRecord te,String[] buff) throws ParseException {
        buff[0]=buff[0].substring(2);
        if(!buff[0].matches(Main.zj)||!buff[1].matches(Main.zj))
            return false;
        if(!buff[0].substring(0,4).matches(Main.qh)||!buff[1].substring(0,4).matches(Main.qh))
            return false;
        String tp1=buff[2]+" "+buff[3];
        String tp2=buff[4]+" "+buff[5];
        if(!tp1.matches(Main.rq)||!tp2.matches(Main.rq))
            return false;
        te.setCallingNumber(buff[0]);
        te.setAnswerNumber(buff[1]);
        te.setCallingAddressAreaCode(buff[0].substring(0,4));
        te.setAnswerAddressAreaCode(buff[1].substring(0,4));
        te.setStartTime(Main.date.parse(tp1));
        te.setEndTime(Main.date.parse(tp2));
        return true;
    }
    public  static  boolean check2(CallRecord te,String[] buff) throws ParseException {
        buff[0]=buff[0].substring(2);
        int sjindex,zjindex;
        if(buff[0].matches(Main.sj)) {
            sjindex=0;
            zjindex=2;
        }
        else if(buff[1].matches(Main.sj)){
            sjindex=1;
            zjindex=0;
        }
        else return false;
        if(!buff[zjindex].matches(Main.zj)||!buff[sjindex].matches(Main.sj))
            return false;
        if(!buff[zjindex].substring(0,4).matches(Main.qh)||!buff[sjindex+1].matches(Main.qh))
            return false;
        String tp1=buff[3]+" "+buff[4];
        String tp2=buff[5]+" "+buff[6];
        if(!tp1.matches(Main.rq)||!tp2.matches(Main.rq))
            return false;
        if(sjindex==0) {
            te.setCallingNumber(buff[0]);
            te.setAnswerNumber(buff[2]);
            te.setCallingAddressAreaCode(buff[1]);
            te.setAnswerAddressAreaCode(buff[2].substring(0,4));
        }
        else{
            te.setCallingNumber(buff[0]);
            te.setAnswerNumber(buff[1]);
            te.setCallingAddressAreaCode(buff[0].substring(0,4));
            te.setAnswerAddressAreaCode(buff[2]);
        }
        te.setStartTime(Main.date.parse(tp1));
        te.setEndTime(Main.date.parse(tp2));
        return true;
    }
    public  static  boolean check3(CallRecord te,String[] buff) throws ParseException {
        buff[0]=buff[0].substring(2);
        if(!buff[0].matches(Main.sj)||!buff[2].matches(Main.sj))
        {
            //System.out.println(1);
            return false;
        }
        if(!buff[1].matches(Main.qh)||!buff[3].matches(Main.qh))
            return false;
        String tp1=buff[4]+" "+buff[5];
        String tp2=buff[6]+" "+buff[7];
        if(!tp1.matches(Main.rq)||!tp2.matches(Main.rq))
        {
            //System.out.println(1);
            return false;
        }
        te.setCallingNumber(buff[0]);
        te.setAnswerNumber(buff[2]);
        te.setCallingAddressAreaCode(buff[1]);
        te.setAnswerAddressAreaCode(buff[3]);
        te.setStartTime(date.parse(tp1));
        te.setEndTime(date.parse(tp2));
        return true;
    }
}

class User{
    private UseRecords userecords=new UseRecords();
    private double balance=100;
    private ChargeMode chargemode;
    private String number;
    double calbalance(){
        return balance-chargemode.calCost(userecords)-chargemode.getMonthlyRent();
    }
    double calCost(){
        return chargemode.calCost(userecords);
    }
    public UseRecords getUserecords() {
        return userecords;
    }
    public void setUserecords(UseRecords userecords) {
        this.userecords = userecords;
    }
    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;
    }
}

class UseRecords{
    private ArrayList<CallRecord> callingInCityRecords=new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingInProvinceRecords=new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingInLandRecords=new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInCityRecords=new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInProvinceRecords=new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInLandRecords=new ArrayList<CallRecord>();
    private ArrayList<MessageRecord> sendMessageRecords=new ArrayList<MessageRecord>();
    private ArrayList<MessageRecord> receiveMessageRecords=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 addanswerInCityRecords(CallRecord callRecord){
        answerInCityRecords.add(callRecord);
    }
    public void addanswerInProvinceRecords(CallRecord callRecord){
        answerInProvinceRecords.add(callRecord);
    }
    public void addanswerInLandRecords(CallRecord callRecord){
        answerInLandRecords.add(callRecord);
    }
    public void addsendMessageRecord(MessageRecord messageRecord){
        sendMessageRecords.add(messageRecord);
    }
    public void addreceiveMessageRecord(MessageRecord messageRecord){
        receiveMessageRecords.add(messageRecord);
    }
    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<MessageRecord> getSendMessageRecords() {
        return sendMessageRecords;
    }
    public ArrayList<MessageRecord> getReceiveMessageRecords() {
        return receiveMessageRecords;
    }
}

abstract class ChargeMode{
    //private ArrayList<ChargeRule> chargeRules=new ArrayList<ChargeRule>();
    //public ArrayList<ChargeRule> getChargeRules() {
    //return chargeRules;
    //}
    //public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
    //this.chargeRules = chargeRules;
    //}
    public abstract double calCost(UseRecords useRecords);
    public abstract double getMonthlyRent();
}

class LandPhoneChargeing extends ChargeMode{
    private double MonthlyRent=20;
    @Override
    public double calCost(UseRecords useRecords) {
        LandPhoneInCityRule landPhoneInCityRule=new LandPhoneInCityRule();
        LandPhoneInProvinceRule landPhoneInProvinceRule=new LandPhoneInProvinceRule();
        LandPhoneInLandRule landPhoneInLandRule=new LandPhoneInLandRule();
        double ans=0;
        ans+=landPhoneInCityRule.callCost(useRecords.getCallingInCityRecords());
        ans+=landPhoneInProvinceRule.callCost(useRecords.getCallingInProvinceRecords());
        ans+=landPhoneInLandRule.callCost(useRecords.getCallingInLandRecords());
        return ans;
    }
    @Override
    public double getMonthlyRent() {
        return MonthlyRent;
    }
}

class PhoneChargeing extends ChargeMode{
    private double MonthlyRent=15;
    @Override
    public double calCost(UseRecords useRecords) {
        PhoneCallRule PhoneCallRule=new PhoneCallRule();
        PhoneAnwserRule PhoneAnwserRule=new PhoneAnwserRule();
        double ans=0;
        ans+=PhoneCallRule .callCost(useRecords.getCallingInCityRecords());
        ans+=PhoneAnwserRule.callCost(useRecords.getAnswerInCityRecords());
        return ans;
    }
    @Override
    public double getMonthlyRent() {
        return MonthlyRent;
    }
}

class MessageChargeing extends ChargeMode{
    @Override
    public  double calCost(UseRecords useRecords)
    {
        PhoneMessageRule phoneMessageRule=new PhoneMessageRule();
        return phoneMessageRule.messagecost(useRecords.getSendMessageRecords());
    }

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

abstract class ChargeRule{
}

abstract class CallingChargeRule extends ChargeRule{
    private double cost;
    public double callCost(ArrayList<CallRecord> callRecords)
    {
        double ans=0;
        for(CallRecord te:callRecords)
        {
            long t=(te.getEndTime().getTime()-te.getStartTime().getTime())/1000;
            if(t<=0)
                continue;
            ans+=t/60*cost;
            if(t%60!=0)
                ans+=cost;
        }
        return ans;
    }
    public double getCost(){
        return cost;
    }
    public void setCost(double cost){
        this.cost = cost;
    }
}

class PhoneMessageRule extends ChargeRule{
    public double messagecost(ArrayList<MessageRecord> messageRecords)
    {
        double ans=0;
        int temp=0;
        for(MessageRecord te:messageRecords)
        {
            temp+=(te.getMassage().length()/10);
            //System.out.println(temp);
            if(te.getMassage().length()%10!=0)
                temp++;
        }
        if(temp<=3)
            ans=temp*0.1;
        else if(temp<=5)
            ans=temp*0.2-0.3;
        else ans=temp*0.3-0.8;
        return ans;
    }
}

class LandPhoneInCityRule extends CallingChargeRule{
    public LandPhoneInCityRule()
    {
        setCost(0.1);
    }
}

class LandPhoneInProvinceRule extends CallingChargeRule{
    public LandPhoneInProvinceRule() {
        setCost(0.3);
    }
}

class LandPhoneInLandRule extends CallingChargeRule{
    public LandPhoneInLandRule() {
        setCost(0.6);
    }
}

class PhoneCallRule extends CallingChargeRule{
    @Override
    public double callCost(ArrayList<CallRecord> callRecords) {
        double ans=0;
        double tc;
        for(CallRecord te:callRecords)
        {
            if(te.getCallingAddressAreaCode().equals("0791"))
            {
                if(te.getAnswerAddressAreaCode().equals("0791"))
                    tc=0.1;
                else if(Main.check(te.getAnswerAddressAreaCode()))
                    tc=0.2;
                else tc=0.3;
            }
            else if(Main.check(te.getCallingAddressAreaCode()))
                tc=0.3;
            else tc=0.6;
            long t=(te.getEndTime().getTime()-te.getStartTime().getTime())/1000;
            if(t<=0)
                continue;
            ans+=t/60*tc;
            if(t%60!=0)
                ans+=tc;
        }
        return ans;
    }
}

class PhoneAnwserRule extends CallingChargeRule{
    @Override
    public double callCost(ArrayList<CallRecord> callRecords) {
        double ans=0;
        for(CallRecord te:callRecords)
        {
            if(!te.getAnswerAddressAreaCode().equals("0791")&&!Main.check(te.getAnswerAddressAreaCode())) {
                long t = (te.getEndTime().getTime() - te.getStartTime().getTime()) / 1000;
                if(t<=0)
                    continue;
                ans += t / 60 * 0.3;
                if (t % 60 != 0)
                    ans += 0.3;
            }
        }
        return ans;
    }
}

abstract class CommunicationRecord{
    private String callingNumber;
    private 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 CallRecord extends CommunicationRecord{
    private Date startTime;
    private Date endTime;
    private String callingAddressAreaCode;
    private 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;
    }
}

class MessageRecord extends CommunicationRecord{
    private String massage;
    public String getMassage() {
        return massage;
    }
    public void setMassage(String massage) {
        this.massage = massage;
    }
}



2.3.2. 编写一个类Shop(商店)、内部类InnerCoupons(内部购物券)

  • 思路:

    内部类的考察,其实就是类里面还有个类,内部类可以调用类里的所有东西。

  • 实现:

import java.util.Scanner;
import java.util.ArrayList;
class shop{
    private int milkCount;
    InnerCoupons coupons50=new InnerCoupons(50);
    InnerCoupons coupons100=new InnerCoupons(100);
    public void setMilkCount(int milkCount) {
        this.milkCount = milkCount;
    }
    public int getMilkCount() {
        return milkCount;
    }
    class InnerCoupons{
        public int value;
        public InnerCoupons(int n){
            this.value=n;
        }
        public void buy() {
            System.out.println("使用了面值为"+value+"的购物券进行支付");
            milkCount-=value/50;
            System.out.println("牛奶还剩"+milkCount+"箱");
        }
    }
}
public class Main {

    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int n= input.nextInt();
        shop sp=new shop();
        sp.setMilkCount(n);
        sp.coupons50.buy();
        sp.coupons100.buy();
    }
}


2.3.3. 动物发声模拟器(多态)

  • 思路:

    没什么难点,按题目要求编写即可.

  • 实现:

import java.util.Scanner;
import java.util.ArrayList;
public class Main{
    public static void main(String[] args) {
        Cat cat = new Cat();
        Dog dog = new Dog();
        Goat goat = new Goat();
        speak(cat);
        speak(dog);
        speak(goat);
    }
    public static void speak(Animal animal)
    {
        System.out.print(animal.getAnimalClass()+"的叫声:");
        animal.shout();
    }    

}

abstract class Animal{
    abstract void shout();
    abstract String getAnimalClass();
}
class Cat extends Animal{
    @Override
    public void shout()
    {
        System.out.println("喵喵");
    }
    @Override
    public  String getAnimalClass(){
        return "猫";
    }
}
class Dog extends Animal{
    @Override
    public void shout()
    {
        System.out.println("汪汪");
    }
    @Override
    public  String getAnimalClass(){
        return "狗";
    }
}
//基于Animal类,定义山羊类Goat,并重写两个抽象方法
class Goat extends Animal{
    @Override
    public void shout()
    {
        System.out.println("咩咩");
    }
    @Override
    public  String getAnimalClass(){
        return "山羊";
    }
}



复杂度分析

电信计费题目
类图:

复杂度:



因为所有的处理都在于对输入的处理所以三个check函数和主函数复杂度很高,其他函数大多都是get,set。

3. 踩坑心得

这次作业没什么大的坑,也没有没有出现前面反复重写那么磨人的情况,更多是对于细节的处理和对应java特性的理解,像是输入的合法性判断,在分割处理后判断总会出现我意料之外的情况导致出错,所以每次都会写一个很长的正则导致匹配次数太多都出现了运行超时的情况,输入判断完成后的处理就没出什么问题了。

4. 改进建议

        没什么好的改进方法,只能说是在写的时候要考虑的更全面一些,测试点过了也不代表就完全正确,特别是输入的合理性,怪异的输入层出不穷,只匹配正确的输入才不会出现问题,进行过处理后的输入再判断正确性就会出现很多难考虑到的问题。

5. 总结

关于java中的接口

    接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

关于java中Collections类

    Collections 类是 Java 提供的一个操作 Set、List 和 Map 等集合的工具类。Collections 类提供了许多操作集合的静态方法,借助这些静态方法可以实现集合元素的排序、查找替换和复制等操作。

posted @ 2022-12-05 19:43  煌"  阅读(71)  评论(0)    收藏  举报