BLOG-3
一、前言
面向对象程序设计(Object-Oriented Programming,简称OOP)是一种编程范式,它以对象作为程序的基本单元,将数据和操作封装在一起。面向对象程序设计的基本概念包括类、对象、继承、多态等。
-
类(Class)是面向对象程序设计的基本构建块,它是一种抽象的数据类型,用于描述具有相同属性和行为的对象的集合。类定义了对象的属性(成员变量)和行为(方法)。
-
对象(Object)是类的实例化结果,它是具体的、有状态的实体。对象可以根据类的定义,拥有自己的属性值,并能执行类中定义的方法。
-
继承(Inheritance)是一种机制,允许在已有类的基础上创建新类,新类可以继承和扩展已有类的属性和方法。继承能够提供代码的重用性和层次化的组织结构。
-
多态(Polymorphism)是指同一类型的对象在不同的情况下可以表现出不同的行为。多态性可以通过继承和接口实现,使得程序可以根据上下文选择合适的方法。
面向对象程序设计的优点包括代码的可重用性、可扩展性、易维护性和模块化等。它提供了一种更加灵活和抽象的编程方式,使得程序的设计和实现更加清晰和可管理。在前三次的作业中我主要使用了创建类和对象的知识,并未涉及到继承和多态的有关知识的运用。
二、作业分析
1.课程成绩统计程序-2
类图如下:

代码如下:
import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Locale; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); String tip = s.nextLine(); systemin pi=new systemin(); while (!tip.equals("end")) { pi.systemin(tip); tip = s.nextLine(); } pi.Sort(); pi.getnum(); pi.getcourse(); pi.getclass(); } } abstract class gd{ double Totalgd; public int getTotalgd() { return (int) Totalgd; } public int getUsualgd() { return 0; } public int getFinalgd() { return 0; } } class Examgd extends gd{ int Usualgd; int Finalgd; public int getTotalgd(){ return (int)(0.3*this.getUsualgd()+0.7*this.getFinalgd()); } public int getUsualgd() { return Usualgd; } public void setUsualgd(int usualgd) { Usualgd = usualgd; } public int getFinalgd() { return Finalgd; } public void setFinalgd(int finalgd) { Finalgd = finalgd; } } class NoExamgd extends gd{ int Finalgd; public int getTotalgd(){ return Finalgd; } public int getFinalgd() { return Finalgd; } public void setFinalgd(int finalgd) { Finalgd = finalgd; } } class Course{ String name; String kind; String method; public Course(String name, String kind, String method) { this.name = name; this.kind = kind; this.method = method; } public String getName() { return name; } public String getMethod() { return method; } } class Student{ String num; String name; public Student(String num, String name) { this.num = num; this.name = name; } public String getNum() { return num; } public String getName() { return name; } } class SelectCourse{ Course course; Student student; gd gd; public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public gd getgd() { return gd; } public void setgd(gd gd) { this.gd = gd; } } class systemin{ private final ArrayList<SelectCourse> selectCourses = new ArrayList<>(); private final ArrayList<Course> courses = new ArrayList<>(); private final ArrayList<Student> students = new ArrayList<>(); private final ArrayList<String> Class = new ArrayList<>(); private final HashMap<String,String> cm=new HashMap(); public void systemin(String input){ String []inputs=input.split(" "); if(Imatch.minput(input)==1){ cm.put(inputs[0],inputs[2]); if(checkC(inputs[0])!=null)return; else { if(inputs[1].equals("必修")&&(!inputs[2].equals("考试"))){ System.out.println(inputs[0]+" : course type & access mode mismatch"); } else if(inputs[1].equals("选修")&&!(inputs[2].equals("考试")||inputs[2].equals("考察"))){ System.out.println(inputs[0]+" : course type & access mode mismatch"); } else if(inputs[1].equals("实验")&&!(inputs[2].equals("实验"))){ System.out.println(inputs[0]+" : course type & access mode mismatch"); } else courses.add(new Course(inputs[0],inputs[1],inputs[2])); } } else if(Imatch.minput(input)==2){ Course findcourse=checkC(inputs[2]); if(inputs.length>5&&(Integer.parseInt(inputs[3])<4||Integer.parseInt(inputs[3])>9)) { System.out.println("wrong format"); return; } Student newStudent = new Student(inputs[0],inputs[1]); if(!checkStudent(newStudent.getNum()))students.add(newStudent); if(!checkClass(inputs[0].substring(0,6))){ Class.add(inputs[0].substring(0,6)); } if(cs(inputs[0],inputs[2]))return; if(findcourse==null){ System.out.println(inputs[2]+" does not exist"); return; } else if(findcourse.getMethod().equals("考试")&&inputs.length!=5){ System.out.println(inputs[0]+' '+inputs[1]+" : access mode mismatch"); } else if(findcourse.getMethod().equals("考察")&&inputs.length!=4){ System.out.println(inputs[0]+' '+inputs[1]+" : access mode mismatch"); } else if(findcourse.getMethod().equals("实验")&&(inputs.length-4!=Integer.parseInt(inputs[3]))){ System.out.println(inputs[0]+' '+inputs[1]+" : access mode mismatch"); } else{ SelectCourse newSelectCourse=new SelectCourse(); newSelectCourse.setCourse(findcourse); gd gd=null; if(findcourse.getMethod().equals("考试")){ Examgd examgd=new Examgd(); examgd.setUsualgd(Integer.parseInt(inputs[3])); examgd.setFinalgd(Integer.parseInt(inputs[4])); gd=examgd; } else if(findcourse.getMethod().equals("实验")){ NoExamgd noExamgd=new NoExamgd(); double sumScore=0; for (int i=4;i<inputs.length;i++)sumScore+=Integer.parseInt(inputs[i]); noExamgd.setFinalgd((int)(sumScore/Integer.parseInt(inputs[3]))); gd=noExamgd; } else { NoExamgd noExamgd=new NoExamgd(); noExamgd.setFinalgd(Integer.parseInt(inputs[3])); gd=noExamgd; } newSelectCourse.setgd(gd); newSelectCourse.setStudent(newStudent); selectCourses.add(newSelectCourse); } } else System.out.println("wrong format"); } private Course checkC(String courseName){ for (Course course:courses){ if(course.getName().equals(courseName))return course; } return null; } private Boolean checkStudent(String num){ for (Student student:students){ if(student.getNum().equals(num))return true; } return false; } private Boolean checkClass(String classnum){ for (String cname:Class){ if(cname.equals(classnum))return true; } return false; } private Boolean cs(String stunum,String cname){ for (SelectCourse selectCourse:selectCourses){ if(selectCourse.getStudent().getNum().equals(stunum)&&selectCourse.getCourse().getName().equals(cname))return true; } return false; } public void getnum(){ for (Student student:students){ double sum=0; int count=0; for (SelectCourse selectCourse:selectCourses){ if (selectCourse.getStudent().getNum().equals(student.getNum())) { sum+=selectCourse.getgd().getTotalgd(); count++; } } if(count==0) System.out.println(student.getNum()+' '+student.getName()+' '+"did not take any exams"); else System.out.println(student.getNum()+' '+student.getName()+' '+(int)(sum/count)); } } public void getcourse(){ for (Course course:courses){ double sumUsualScore=0; double sumFinalScore=0; double sumTotalScore=0; int count=0; for(SelectCourse selectCourse:selectCourses){ if(selectCourse.getCourse().getName().equals(course.getName())){ count++; sumTotalScore+=selectCourse.getgd().getTotalgd(); sumFinalScore+=selectCourse.getgd().getFinalgd(); if(selectCourse.getCourse().getMethod().equals("考试")){ sumUsualScore+=selectCourse.getgd().getUsualgd(); } } } if (count==0) System.out.println(course.getName()+' '+"has no grades yet"); else if(course.getMethod().equals("考试"))System.out.println(course.getName()+' '+(int)(sumUsualScore/count)+' '+(int)(sumFinalScore/count)+' '+(int)(sumTotalScore/count)); else if(course.getMethod().equals("考察"))System.out.println(course.getName()+' '+(int)(sumFinalScore/count)+' '+(int)(sumTotalScore/count)); else if(course.getMethod().equals("实验"))System.out.println(course.getName()+' '+(int)(sumFinalScore/count)); } } public void getclass(){ for (String classnum:Class){ double sum=0; int count=0; for (SelectCourse selectCourse:selectCourses){ if(selectCourse.getStudent().getNum().substring(0,6).equals(classnum)){ sum+=selectCourse.getgd().getTotalgd(); count++; } } if(count==0) System.out.println(classnum+' '+"has no grades yet"); else System.out.println(classnum+' '+(int)(sum/count)); } } public void Sort(){ students.sort(Comparator.comparing(Student::getNum)); courses.sort((x,y)->{ Collator instance = Collator.getInstance(Locale.CHINA); return instance.compare(x.getName(), y.getName()); } ); Collections.sort(Class); } } class Imatch { static String stuNumMatching = "[0-9]{8}"; static String stuNameMatching = "\\S{1,10}"; static String scoreMatching = "(\\d|[1-9]\\d|100)"; static String courseNameMatching = "\\S{1,10}"; static String courseTypeMatching = "(选修|必修|实验)"; static String checkcourseTypeMatching = "(考试|考察|实验)"; static String courseInput = courseNameMatching + " " + courseTypeMatching + " " + checkcourseTypeMatching; static String scoreInput = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " + scoreMatching + "(\\s"+scoreMatching+")*"; public static int minput(String s) { if (matchingCourse(s)) { return 1; } if (matchingScore(s)) { return 2; } return 0; } private static boolean matchingCourse(String s) { return s.matches(courseInput); } private static boolean matchingScore(String s) { return s.matches(scoreInput); } }
2.课程成绩统计程序-3
不会,没写出来。
3.立体图形问题
类图如下:

代码如下:
import java.util.Scanner; import java.lang.Math; abstract class Solid { abstract double getSurfaceArea(); abstract double getVolume(); } class Cube extends Solid { private double side; public Cube(double side) { this.side = side; } @Override double getSurfaceArea() { return 6 * Math.pow(side,2); } @Override double getVolume() { return Math.pow(side,3); } } class RegularPyramid extends Solid { private double side; public RegularPyramid(double side) { this.side = side; } @Override double getSurfaceArea() { return Math.sqrt(3) * Math.pow(side,2); } @Override double getVolume() { return Math.sqrt(2) * Math.pow(side,3)/12; } } public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); double side = sc.nextDouble(); display(new Cube(side)); display(new RegularPyramid(side)); } public static void display(Solid solid) { System.out.println(String.format("%.2f", solid.getSurfaceArea())); System.out.println(String.format("%.2f", solid.getVolume())); } }
分析:基本不难,就是三棱锥的表面积和体积公式写不对,三棱锥的表面积是4个边长为a的等边三角形,而等边三角形的面积公式是√3/4a2,三棱锥的表面积公式就是√3a2;三棱锥的高是√2/(3√3)a,三棱锥的体积就是√2/12a3。
4.魔方问题
类图如下:

代码如下:
import java.util.Scanner; import java.lang.Math; abstract class Solid { abstract String Colour(); abstract double getSurfaceArea(); abstract double getVolume(); } class Cube extends Solid { private String colour; private int order; private double side; public Cube(String colour,int order,double side) { this.colour = colour; this.order = order; this.side = side; } @Override String Colour(){ return colour; } @Override double getSurfaceArea() { return 6 * Math.pow(side * order,2); } @Override double getVolume() { return Math.pow(side * order,3); } } class RegularPyramid extends Solid { private String colour; private int order; private double side; public RegularPyramid(String colour,int order,double side) { this.colour = colour; this.order = order; this.side = side; } @Override String Colour(){ return colour; } @Override double getSurfaceArea() { return Math.sqrt(3) * Math.pow(side * order,2); } @Override double getVolume() { return Math.sqrt(2) * Math.pow(side * order,3)/12; } } public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String colour1 = sc.next(); int order1 = sc.nextInt(); double side1 = sc.nextDouble(); String colour2 = sc.next(); int order2 = sc.nextInt(); double side2 = sc.nextDouble(); display(new Cube(colour1,order1,side1)); display(new RegularPyramid(colour2,order2,side2)); } public static void display(Solid solid) { System.out.println(solid.Colour()); System.out.println(String.format("%.2f", solid.getSurfaceArea())); System.out.println(String.format("%.2f", solid.getVolume())); } }
分析:以上一题为基础,增加了颜色和阶数以及区分是立方体还是三棱锥。现在边长a变成了小单元的边长,乘上一个阶数就是整个魔方的边长。就是在公式的地方边长后面在乘上一个阶数即可。
5.魔方排序问题
有点思路,但前面计算三棱锥表面积和体积浪费了太多时间,没写出来。
6. 销售步枪问题(附加题)
没做。
三、总结
通过完成这三次pta的作业,我发现我在Java上有很多地方不明白,具体是哪儿不明白又说不上来。
浙公网安备 33010602011771号