第三次博客作业
Blog-3
1.对之前发布的第三阶段PTA题目集的总结:
(1)前言:
岁月如流,转眼就第三次博客作业了,本学期java的学习也告一段落,本阶段pta其实难度都还可以,题量并不大,用较为简单的方式让我学到了一些很有用的技能。
题目集9只有一道题,虽然拿到分是很容易的,可拿满分并不容易,题量不大,难度较高,比较考验学生十分细心。
题目集10题量较大,难度其实还好,考察了HashMap的检索和排序功能以及多态。
题目集11题量较大,难度较高。
(2)设计与分析:
课程成绩统计程序-1:
类图:
关键就是类的设计,对于这类问题,要先根据需求做好十足的分析在写代码,后面写代码会起到事半功倍的效果。再就是异常的情况,对于异常情况比如说格式错误输出wrong format的情况就将该信息作废,而对于课程性质和课程的考核方式不匹配,则需要创建具体的课程对象。成绩数量和课程的考核方式不匹配也是类似的情况。我的思路就是对于格式错误的情况,就输出wrong format然后该信息直接作废,而对于其他异常情况比如说课程信息不匹配,就将他的名字放入一个Arraylist中,在最后输出课程平均分的时候用到。
课程成绩统计程序-2:
代码:
import java.util.*;
import java.text.Collator;
public class Main {
public static void main(String[] args){
Scanner input =new Scanner(System.in);
String str = null;
Courses coursess = new Courses();
ArrayList<String> strs = new ArrayList<String>();
ArrayList<Student> students = new ArrayList<>();
ArrayList<CourseSelection> courseSelections = new ArrayList<>();
ArrayList<String> classNames = new ArrayList<>();
ArrayList<String> courseNames = new ArrayList<>();
int s=0,z=0;
while(!"end".equals(str)){
str = input.nextLine();
strs.add(str);
}
for(String j:strs) {
String[] strings = j.split(" ");
if (strings.length == 3 && (strings[1].equals("必修") || strings[1].equals("选修") || strings[1].equals("实验")) && (strings[2].equals("考察") || strings[2].equals("考试") || strings[2].equals("实验"))&&strings[0].length()<9) {
if (strings[1].equals("必修") && (strings[2].equals("考察")||strings[2].equals("实验"))) {
System.out.println(strings[0] + " : course type & access mode mismatch");
}
else if(strings[1].equals("选修") && (strings[2].equals("实验"))){
System.out.println(strings[0] + " : course type & access mode mismatch");
}
else {
s=0;
for(String i:courseNames){
if(i.equals(strings[0]))
s=1;
}
if(s==0){
courseNames.add(strings[0]);
coursess.addCourse(strings[0], strings[2]);
}
}
}
else if (j.matches("[0-9]{8} [\u4E00-\u9FA5A-Za-z]{1,10} [\u4E00-\u9FA5A-Za-z]{1,10} (0|100|[1-9][0-9]?)")) {
Student student = new Student(strings[1], strings[0]);
s=0;z=0;
for(Student i:students){
if(i.getName().equals(strings[1])&&i.getID().equals(strings[0]))
s = 1;
}
if(s==0)
students.add(student);
for(String i:classNames){
if(i.equals(strings[0].substring(0,6)))
z = 1;
}
if(z==0)classNames.add(strings[0].substring(0,6));
if (Courses.searchCourse(strings[2]) != null) {
if (Courses.searchCourse(strings[2]).getType().equals("考察")) {
s=0;z=0;
for(CourseSelection i:courseSelections){
if(i.getStudent().getID().equals(strings[0])&&i.getStudent().getName().equals(strings[1])&&i.getCourse().getName().equals(strings[2]))
s=1;
}
if(s==0){
Course course = new Course(strings[2], "考察");
Score score = new AssessmentScore(Integer.parseInt(strings[3]));
CourseSelection courseSelection = new CourseSelection(course, student, score);
courseSelections.add(courseSelection);}
} else {
System.out.println(strings[0] + " " + strings[1] + " : access mode mismatch");
}
} else {
System.out.println(strings[2] + " does not exist");
}
}
else if(j.matches("[0-9]{8} [\u4E00-\u9FA5A-Za-z]{1,10} [\u4E00-\u9FA5A-Za-z]{1,10} [4-9](\\s(0|100|[1-9][0-9]?)){2,9}")){
Student student = new Student(strings[1], strings[0]);
s = 0; z = 0;
for(Student i:students){
if(i.getName().equals(strings[1])&&i.getID().equals(strings[0]))
s=1;
}
if(s==0)
students.add(student);
for(String i:classNames){
if(i.equals(strings[0].substring(0,6)))
z = 1;
}
if(z==0)classNames.add(strings[0].substring(0,6));
if (Courses.searchCourse(strings[2]) != null) {
if (Courses.searchCourse(strings[2]).getType().equals("实验")&&Integer.parseInt(strings[3])==strings.length-4) {
s=0;z=0;
for(CourseSelection i:courseSelections){
if(i.getStudent().getID().equals(strings[0])&&i.getStudent().getName().equals(strings[1])&&i.getCourse().getName().equals(strings[2]))
s=1;
}
if(s==0){
int sumOfScore=0;int d = 0;
Course course = new Course(strings[2], "实验");
for(int i = 4;i < strings.length;i++){
d++;
sumOfScore = sumOfScore + Integer.parseInt(strings[i]);
}
Score score = new ExperimentalScore((int)(sumOfScore/d));
CourseSelection courseSelection = new CourseSelection(course, student, score);
courseSelections.add(courseSelection);}
} else {
System.out.println(strings[0] + " " + strings[1] + " : access mode mismatch");
}
} else {
System.out.println(strings[2] + " does not exist");
}
}
else if (j.matches("[0-9]{8} [\u4E00-\u9FA5A-Za-z0-9+$]{1,11} [\u4E00-\u9FA5A-Za-z0-9+$]{1,11}\\s(0|100|[1-9][0-9]?) (0|100|[1-9][0-9]?)")) {
Student student = new Student(strings[1], strings[0]);
s = 0; z = 0;
for(Student i:students){
if(i.getName().equals(strings[1])&&i.getID().equals(strings[0]))
s=1;
}
if(s==0)
students.add(student);
for(String i:classNames){
if(i.equals(strings[0].substring(0,6)))
z = 1;
}
if(z==0)classNames.add(strings[0].substring(0,6));
if (Courses.searchCourse(strings[2]) != null) {
if (Courses.searchCourse(strings[2]).getType().equals("考试")) {
s=0;z=0;
for(CourseSelection i:courseSelections){
if(i.getStudent().getID().equals(strings[0])&&i.getStudent().getName().equals(strings[1])&&i.getCourse().getName().equals(strings[2]))
s=1;
}
if(s==0){
Course course = new Course(strings[2], "考试");
Score score = new TextScore(Integer.parseInt(strings[4]), Integer.parseInt(strings[3]));
CourseSelection courseSelection = new CourseSelection(course, student, score);
courseSelections.add(courseSelection);}
} else {
System.out.println(strings[0] + " " + strings[1] + " : access mode mismatch");
}
} else {
System.out.println(strings[2] + " does not exist");
}
} else if (j.matches("end")) {
} else {
System.out.println("wrong format");
}
}
double sum1 = 0; double sum2 = 0; double x=0;double y=0;
students.sort(Comparator.naturalOrder());
courseSelections.sort(Comparator.naturalOrder());
Collator instance = Collator.getInstance(Locale.CHINA);
students.sort(Comparator.naturalOrder());
Collections.sort(courseNames,instance);
classNames.sort(Comparator.naturalOrder());
for(Student i: students){
sum1 =0;
x = 0;
for(CourseSelection j:courseSelections){
if(i.getName().equals(j.getStudent().getName())&&i.getID().equals(j.getStudent().getID())){
x++;
sum1 = sum1 + j.getTotalScoreOfOne();
}
}
if(x==0){
i.setTotalScore(0);
System.out.println(i.getID() + " " + i.getName()+ " did not take any exams");
}
else{
i.setTotalScore((int)(sum1/x));
System.out.println(i.getID() + " " + i.getName() + " " + (int)(sum1/x));}
}
double sum3;
for(String i:courseNames){
sum2=0;
sum1=0;
sum3=0;
x=0;
y=0;
for(CourseSelection j:courseSelections){
if(i.equals(j.getCourse().getName())){
if(j.getScore() instanceof AssessmentScore){
sum1 = sum1 + ((AssessmentScore) j.getScore()).getFinalScore();
}
else if(j.getScore() instanceof TextScore){
sum1 = sum1 + ((TextScore) j.getScore()).getFianlScore();
sum2 = sum2 + ((TextScore) j.getScore()).getRegularScore();
}
sum3 = sum3 + j.getTotalScoreOfOne();
x++;y++;
}
}
if(Courses.searchCourse(i).getType().equals("考试")){
if(x==0)
System.out.println( i+ " has no grades yet");
else
System.out.println(i + " " + (int)(sum2/x) + " " + (int)(sum1/x) + " " + (int)(sum3/x));
}
else if(Courses.searchCourse(i).getType().equals("考察")){
if(x==0)
System.out.println( i+ " has no grades yet");
else
System.out.println(i + " " + (int)(sum1/x) + " " + (int)(sum1/x));
}
else if(Courses.searchCourse(i).getType().equals("实验")){
if(x==0)
System.out.println( i+ " has no grades yet");
else
System.out.println(i + " " + (int)(sum3/x));
}
}
for(String i:classNames){
sum1 = 0;
x=0;
for(CourseSelection j:courseSelections){
if(i.equals(j.getStudent().getID().substring(0,6))){
sum1 = sum1 + j.getTotalScoreOfOne();
x++;
}
}
if(x==0)
System.out.println( i+ " has no grades yet");
else
System.out.println(i + " " + (int)(sum1/x));
} }
}
class CourseSelection implements Comparable<CourseSelection>{
private Course course;
private Student student;
private Score score;
public CourseSelection() {
}
public CourseSelection(Course course, Student student, Score score) {
this.course = course;
this.student = student;
this.score = score;
}
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 Score getScore() {
return score;
}
public void setScore(Score score) {
this.score = score;
}
public double getTotalScoreOfOne(){
double sum;
sum = this.score.getSumOfScore();
return sum;
}
@Override
public int compareTo(CourseSelection o){
if(Integer.parseInt(this.getStudent().getID().substring(4,6)) > Integer.parseInt(o.getStudent().getID().substring(4,6)))
return 1;
else if(Integer.parseInt(this.getStudent().getID().substring(4,6)) == Integer.parseInt(o.getStudent().getID().substring(4,6))){
if(Integer.parseInt(this.getStudent().getID().substring(6,8)) > Integer.parseInt(o.getStudent().getID().substring(6,8)))
return 1;
else
return -1;
}
if(Integer.parseInt(this.getStudent().getID().substring(4,6)) < Integer.parseInt(o.getStudent().getID().substring(4,6)))
return -1;
return 0;
}
}
class Course {
private String Coursename;
private String type;
public Course() {
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Course(String coursename, String type) {
Coursename = coursename;
this.type = type;
}
public String getName() {
return Coursename;
}
public void setName(String name) {
this.Coursename = name;
}
}
class Courses{
static ArrayList<Course> courses = new ArrayList();
public static ArrayList<Course> getCourses() {
return courses;
}
public static void setCourses(ArrayList<Course> courses) {
Courses.courses = courses;
}
public Course addCourse(String courseName, String type){
Course course = new Course(courseName,type);
courses.add(course);
return course;
}
public static Course searchCourse(String courseName){
for(int i = 0;i < courses.size();i++){
if(courses.get(i).getName().equals(courseName)){
return courses.get(i);
}
}
return null;
}
}
class Class{
private String className;
public Class() {
}
public Class(String className) {
this.className = className;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
class Student implements Comparable<Student>{
private String name;
private String ID;
private int totalScore;
public Student() {
}
public Student(String name, String ID) {
this.name = name;
this.ID = ID;
}
public int getTotalScore() {
return totalScore;
}
public void setTotalScore(int totalScore) {
this.totalScore = totalScore;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
@Override
public int compareTo(Student o){
if(Integer.parseInt(this.getID().substring(4,6)) > Integer.parseInt(o.getID().substring(4,6)))
return 1;
else if(Integer.parseInt(this.getID().substring(4,6)) == Integer.parseInt(o.getID().substring(4,6))){
if(Integer.parseInt(this.getID().substring(6,8)) > Integer.parseInt(o.getID().substring(6,8)))
return 1;
else
return -1;
}
if(Integer.parseInt(this.getID().substring(4,6)) < Integer.parseInt(o.getID().substring(4,6)))
return -1;
return 0;
}
}
abstract class Score{
public double getSumOfScore(){
return 0;
}
}
class AssessmentScore extends Score{
private int finalScore;
public AssessmentScore() {
}
public AssessmentScore(int finalScore) {
this.finalScore = finalScore;
}
public int getFinalScore() {
return finalScore;
}
public void setFinalScore(int finalScore) {
this.finalScore = finalScore;
}
@Override
public double getSumOfScore(){
return finalScore;
}
}
class TextScore extends Score{
private int fianlScore;
private int regularScore;
public TextScore() {
}
public TextScore(int fianlScore, int regularScore) {
this.fianlScore = fianlScore;
this.regularScore = regularScore;
}
public int getFianlScore() {
return fianlScore;
}
public void setFianlScore(int fianlScore) {
this.fianlScore = fianlScore;
}
public int getRegularScore() {
return regularScore;
}
public void setRegularScore(int regularScore) {
this.regularScore = regularScore;
}
@Override
public double getSumOfScore(){
return (int)(this.regularScore*0.3+this.fianlScore*0.7);
}
}
class ExperimentalScore extends Score{
private int AverageScore;
public ExperimentalScore() {
}
public ExperimentalScore(int averageScore) {
AverageScore = averageScore;
}
public int getAverageScore() {
return AverageScore;
}
public void setAverageScore(int averageScore) {
AverageScore = averageScore;
}
@Override
public double getSumOfScore(){
return (int)(this.AverageScore);
}
}
类图:

相比于上次,这次多了一个实验的情况,其实是换汤不换药的,具体的思路是差不多的,其实考察的就是你类的设计,如果上次类没设计好的话,这次其实不废多少功夫。新增了一个ExperimentScore(实验成绩),然后修改一下主函数可以达到目的。
课程成绩统计程序-3:
类图:

这道题目我花了较长的一段时间去写,但这道题我并没有拿到满分,对于其部分测试点我并没有弄懂,但我想一定是对于需求我并没有解读完全,对于一些比较复杂的输入案例我可能得不到想要的结果。
(3)踩坑心得:
1.对于格式错误:粗心酿酒大错,会出现因为格式的问题而导致结果错误,终究是没好好分析需求导致的。
2.对于HashMap:HashMap它是无序的,并不可以像TreeMap一样实现Comparable然后对其进行排序。
3.类的设计:类的设计要尽可能的遵守类的设计规则,不能因小失大。
(4)改进建议:
对于题目的需求我觉得有些方面还是没有说明清楚,还是存在一点的漏洞。
(5)总结:
1.关于正则表达式:正则表达式在出来字符串等问题的时候真的是非常的方便,能非常提高代码的可读性以及编码的难度。
2.关于HashMap:HashMap可用于快速的查找和存储,可适用于大多数数据检索场景。
3.关于TreeMap:可以按照键值对的键进行排序; 内部有序,可以保证元素的顺序; 性能比HashMap更稳定。
4.根据需求进行设计:在写代码之前,要对需求进行分析并进行设计,我该如何设计才能高效准确的满足需求。
2.对课程相应建议及意见:
畅所欲言:其实对于老师讲的知识点我们都有一定的掌握,老师讲的也很好,但是我们自己动手的时候是有些云里雾里的,就感觉自己写的代码可能并不是很完美,但是又不知道怎样的才算好,就想让老师对于个别的题目给个标准的代码,我们也好研究,就是自己写的代码跟标准的有何差距,不有个对比的话其实自身是不知道自己代码有和欠缺的,就算知道,有时也感觉有点无从下手的无力感。

浙公网安备 33010602011771号