前言
第三次也是最后博客文章主要是关于java课程第三阶段关于PTA题目集、超星作业以及在实验平台上布置的一些题型。相较于第一、二阶段的作业总结而言此次作业更加针对于总结在面向对象过程中的三大技术特性,即封装性、继承性和多态性,类图的设计更加普遍。在不断深入学习Java的过程又延伸到了Javafx,在这个阶段也挺有趣的,不仅能把图片放在窗口还可以通过Java代码的撰写做出很多好玩的小程序。通过学习类属性的访问权限,了解到了四种访问权限:public,private,protected,default;以及不同类的类型:实体类,业务类,接口类;对于类设计上,学习的多,代表思路与编程思想变得更为开阔且严谨,开始真正考虑到如何将一个题目设计到恰如其分,不同的设计思路带来的不同效果。
设计与分析
第三阶段的作业次数与第一、二阶段是一样的,一共有三次,但相比较于第二个,本阶段作业难度有所提升,涉及到的也大多是继承和多态。本阶段的学习让我们还是主要了解了以下三个方面的内容:
1.正则表达式的简单使用。
2.面向对象的三大特性:封装性、继承性、多态性。
3.同时也了解了一些面向对象编程的原则:单一职责原则、开闭原则等。
同时通过可查阅的资料了解到类的继承与多态的特征与属性:关于继承与多态:面向对象的三大特征:封装性、继承性、多态性,继承是多态的前提,如果没有继承,就没有多态。
特点:
1、子类可以拥有父类的“内容”
2、子类还可以拥有自己专有的新内容
3、单继承:一个类的直接父类只能有唯一一个
4、可以多级继承,有多个子类。在继承关系当中,“子类就是一个父类”。也就是说,子类可以被当作父类看待
7-1 课程成绩统计程序-1
某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。
考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。
考察的总成绩直接等于期末成绩
必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。
1、输入:
包括课程、课程成绩两类信息。
课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。
课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式
课程性质输入项:必修、选修
考核方式输入选项:考试、考察
课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩
课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩
以上信息的相关约束:
1)平时成绩和期末成绩的权重默认为0.3、0.7
2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】
3)学号由8位数字组成
4)姓名不超过10个字符
5)课程名称不超过10个字符
6)不特别输入班级信息,班级号是学号的前6位。
2、输出:
输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。
为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。
1)学生课程总成绩平均分按学号由低到高排序输出
格式:学号+英文空格+姓名+英文空格+总成绩平均分
如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"
2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出
格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分
如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"
3)班级所有课程总成绩平均分按班级由低到高排序输出
格式:班级号+英文空格+总成绩平均分
如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"
异常情况:
1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"
2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"
以上两种情况如果同时出现,按第一种情况输出结果。
3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"
4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"
5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。
信息约束:
1)成绩平均分只取整数部分,小数部分丢弃
类图如下:
通过该类图应该可以大致看出整个程序的大致类关系,和一对多、一对一关系,这道题目和之前的菜单程序有很多相似之处,输入是如此但是仍然没有拿到满分,很多测试点还是没能过,仅仅取得87的分数下面先展示下本次作业的代码:
1 import java.util.*; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner in = new Scanner(System.in); 6 List<String> list = new ArrayList<>(); 7 List<Student> students = new ArrayList<>(); 8 List<Clazz> classes = new ArrayList<>(); 9 List<Course> courses = new ArrayList<>(); 10 List<SelectCourse> selectCourses = new ArrayList<>(); 11 12 String str = in.nextLine(); 13 while(!str.equals("end")){ 14 // if(!list.contains(str)) 15 list.add(str); 16 str = in.nextLine(); 17 } 18 for(String s : list){ 19 String[] buff = s.split(" "); 20 if(buff.length==2 || buff.length==3){ //该行是课程信息 21 Course course = null; 22 if(!Check.checkCourseName(buff[0]) || !Check.checkType(buff[1]) || (buff.length==2&&buff[1].equals("选修"))){ 23 System.out.println("wrong format"); 24 continue; 25 } 26 27 if(buff.length == 3){ 28 course = new Course(buff[0],buff[1],buff[2]); 29 if(!Check.checkCourseMethod(buff[1],buff[2])){ 30 System.out.println(buff[0]+" : course type & access mode mismatch"); 31 continue; 32 } 33 if(!Check.checkMethod(buff[2])){ 34 System.out.println("wrong format"); 35 continue; 36 } 37 }else{ 38 course = new Course(buff[0],buff[1]); 39 } 40 41 if(!courses.contains(course)){ 42 courses.add(course); 43 } 44 }else if(buff.length == 4 || buff.length == 5){ //该行是成绩信息 45 if(!Check.checkScore(buff[3])){ //判断成绩范围是否符合标准 46 System.out.println("wrong format"); 47 continue; 48 } 49 if(buff.length == 5){ 50 if(!Check.checkScore(buff[4])){ //判断成绩范围是否符合标准 51 System.out.println("wrong format"); 52 continue; 53 } 54 } 55 56 if(!Check.checkStudentId(buff[0])){ //判断学号是否符合标准 57 System.out.println("wrong format"); 58 continue; 59 } 60 if(!Check.checkCourseName(buff[2]) || !Check.checkCourseName(buff[1])){ //判断课程名字和学生姓名是否符合标志 61 System.out.println("wrong format"); 62 continue; 63 } 64 Student student = new Student(buff[0], buff[1]); 65 if(!students.contains(student)){ //防止重复添加学生 66 students.add(student); 67 } 68 69 Clazz clazz = new Clazz(buff[0].substring(0, 6)); 70 if(!classes.contains(clazz)){ //防止重复添加班级 71 classes.add(clazz); 72 } 73 student.setCla(clazz); 74 75 if(!Check.checkCourse(courses, buff[2])){ //判断解析某个成绩信息时,课程名称是否在已输入的课程列表中 76 System.out.println(buff[2]+" does not exist"); 77 continue; 78 } 79 Course course = Course.getCourseByName(courses,buff[2]); 80 if(!Check.checkCourseMethod(buff[1],buff[2])){ //判断课程性质和课程的考核方式是否匹配 81 System.out.println(buff[0]+" : course type & access mode mismatch"); 82 continue; 83 } 84 85 if(!Check.checkCountScore(course,buff)){ //判断解析某个成绩信息时,输入的成绩数量和课程的考核方式是否匹配 86 System.out.println(buff[0]+" "+buff[1]+" : access mode mismatch"); 87 continue; 88 } 89 Score score = null; 90 91 if(buff.length==4){ 92 score = new InScore(Integer.parseInt(buff[3])); 93 }else if(buff.length==5){ 94 score = new ExScore(Integer.parseInt(buff[3]),Integer.parseInt(buff[4])); 95 } 96 97 SelectCourse selectCourse = new SelectCourse(course,student,score); 98 99 if(!selectCourses.contains(selectCourse)){ 100 selectCourses.add(selectCourse); 101 } 102 } 103 else 104 System.out.println("wrong format"); 105 } 106 for(Course course : courses) { 107 course.getTotalAvg(selectCourses); 108 } 109 110 Collections.sort(students); 111 Collections.sort(courses); 112 Collections.sort(classes); 113 114 for (Student student : students) { 115 student.print(selectCourses); 116 } 117 118 for(Course course : courses) { 119 course.print(selectCourses); 120 } 121 122 for(Clazz cla : classes) { 123 cla.print(selectCourses); 124 } 125 126 } 127 } 128 129 class Check { 130 public static boolean checkCourse(List<Course> courses, String name) { 131 for(Course course : courses){ 132 if(course.getName().equals(name)) 133 return true; 134 } 135 return false; 136 } 137 138 public static boolean checkCountScore(Course course, String[] buff) { 139 if(course.getMethod().equals("考试") && buff.length==5) 140 return true; 141 if(course.getMethod().equals("考察") && buff.length==4) 142 return true; 143 return false; 144 } 145 146 public static boolean checkCourseMethod(String str1, String str2) { 147 if(str1.equals("必修") && str2.equals("考察")){ 148 return false; 149 } 150 return true; 151 } 152 153 public static boolean checkScore(String score) { 154 String regex = "\\d+"; // 使用正则表达式匹配8位数字 155 if (!score.matches(regex)) { 156 return false; 157 } 158 if(Integer.parseInt(score)>100 || Integer.parseInt(score)<0) 159 return false; 160 return true; 161 } 162 163 public static boolean checkCourseName(String name){ 164 if(name.length() > 10){ 165 return false; 166 } 167 return true; 168 } 169 170 public static boolean checkStudentId(String id) { 171 String regex = "\\d{8}"; // 使用正则表达式匹配8位数字 172 if (id.matches(regex)) 173 return true; 174 return false; 175 } 176 177 public static boolean checkType(String t) { 178 if(t.equals("必修") || t.equals("选修")) 179 return true; 180 return false; 181 } 182 183 public static boolean checkMethod(String m) { 184 if(m.equals("考试") || m.equals("考察")) 185 return true; 186 return false; 187 } 188 } 189 190 class Clazz implements Comparable<Clazz> { 191 private String cla_id; 192 193 public Clazz(String cla_id) { 194 this.cla_id = cla_id; 195 } 196 197 public String getCla_id() { 198 return cla_id; 199 } 200 201 public void setCla_id(String cla_id) { 202 this.cla_id = cla_id; 203 } 204 205 public void print(List<SelectCourse> selectCourses){ 206 if(selectCourses.isEmpty()){ 207 System.out.println(this.cla_id+" has no grades yet"); 208 }else{ 209 System.out.println(this.cla_id+" "+getTotalAvg(selectCourses)); 210 } 211 } 212 public int getTotalAvg(List<SelectCourse> selectCourses) { 213 double sum = 0; 214 int i = 0; 215 for(SelectCourse selectCourse: selectCourses){ 216 if(selectCourse.getStudent().getCla().getCla_id().equals(this.cla_id)){ 217 sum+= selectCourse.getScore().getTotalScore(); 218 i++; 219 } 220 221 } 222 return (int) Math.floor(sum/i); 223 } 224 225 @Override 226 public boolean equals(Object obj) { 227 if (this == obj) 228 return true; 229 if (obj == null || getClass() != obj.getClass()) 230 return false; 231 Clazz clazz = (Clazz) obj; 232 return Objects.equals(cla_id, clazz.cla_id); 233 } 234 235 @Override 236 public int hashCode() { 237 return Objects.hash(cla_id); 238 } 239 240 241 @Override 242 public int compareTo(Clazz o) { 243 return this.cla_id.compareTo(o.cla_id); 244 } 245 } 246 247 class Course implements Comparable<Course> { 248 private String name; 249 private String type; //性质 250 private String method; //考核方式 251 private int total; 252 253 public Course(String name, String type) { 254 this.name = name; 255 this.type = type; 256 } 257 public Course(String name, String type, String method) { 258 this.name = name; 259 this.type = type; 260 this.method = method; 261 } 262 263 public int getTotal() { 264 return total; 265 } 266 267 public void setTotal(int total) { 268 this.total = total; 269 } 270 271 public String getName() { 272 return name; 273 } 274 275 public void setName(String name) { 276 this.name = name; 277 } 278 279 public String getType() { 280 return type; 281 } 282 283 public void setType(String type) { 284 this.type = type; 285 } 286 287 public String getMethod() { 288 return method; 289 } 290 291 public void setMethod(String method) { 292 this.method = method; 293 } 294 295 public void print(List<SelectCourse> selectCourses){ 296 if(selectCourses.isEmpty()){ 297 System.out.println(this.name+" has no grades yet"); 298 return; 299 } 300 if(this.method.equals("考察")){ 301 System.out.println(name+" "+getEndAvg(selectCourses)+" "+getTotalAvg(selectCourses)); 302 }else if(this.method.equals("考试")){ 303 System.out.println(name+" "+getDailAvg(selectCourses)+" "+getEndAvg(selectCourses)+" "+getTotalAvg(selectCourses)); 304 } 305 306 } 307 public int getDailAvg(List<SelectCourse> selectCourses) { 308 double sum = 0; 309 int i = 0; 310 for(SelectCourse selectCourse: selectCourses){ 311 if(selectCourse.getCourse().getName().equals(this.name)){ 312 sum+= selectCourse.getScore().getDailyScore(); 313 i++; 314 } 315 } 316 return (int) Math.floor(sum/i); 317 } 318 319 public int getEndAvg(List<SelectCourse> selectCourses) { 320 double sum = 0; 321 int i = 0; 322 for(SelectCourse selectCourse: selectCourses){ 323 if(selectCourse.getCourse().getName().equals(this.name)){ 324 sum+= selectCourse.getScore().getEndScore(); 325 i++; 326 } 327 } 328 return (int) Math.floor(sum/i); 329 } 330 331 public int getTotalAvg(List<SelectCourse> selectCourses) { 332 double sum = 0; 333 int i = 0; 334 for(SelectCourse selectCourse: selectCourses){ 335 if(selectCourse.getCourse().getName().equals(this.name)){ 336 sum+= selectCourse.getScore().getTotalScore(); 337 i++; 338 } 339 } 340 this.total = (int) Math.floor(sum/i); 341 return (int) Math.floor(sum/i); 342 } 343 344 public static Course getCourseByName(List<Course> courses, String name){ 345 for(Course c : courses){ 346 if(c.getName().equals(name)){ 347 return c; 348 } 349 } 350 return null; 351 } 352 353 @Override 354 public boolean equals(Object obj) { 355 if (this == obj) 356 return true; 357 if (obj == null || getClass() != obj.getClass()) 358 return false; 359 Course course = (Course) obj; 360 return Objects.equals(name, course.name); 361 } 362 363 @Override 364 public int hashCode() { 365 return Objects.hash(name); 366 } 367 368 @Override 369 public int compareTo(Course o) { 370 return this.total-o.total; 371 } 372 } 373 374 abstract class Score { 375 private String stu_id; 376 private String stu_name; 377 private int totalScore = 0; 378 private int dailyScore = 0; 379 private int endScore = 0; 380 private List<SelectCourse> selectCourses; 381 382 public Score(int totalScore) { 383 this.endScore = totalScore; 384 this.totalScore = totalScore; 385 } 386 387 public Score(int dailyScore, int endScore) { 388 this.dailyScore = dailyScore; 389 this.endScore = endScore; 390 } 391 392 public int getEndScore() { 393 return endScore; 394 } 395 396 public void setEndScore(int endScore) { 397 this.endScore = endScore; 398 } 399 400 public int getDailyScore() { 401 return dailyScore; 402 } 403 404 public void setDailyScore(int dailyScore) { 405 this.dailyScore = dailyScore; 406 } 407 408 public String getStu_id() { 409 return stu_id; 410 } 411 412 public void setStu_id(String stu_id) { 413 this.stu_id = stu_id; 414 } 415 416 public String getStu_name() { 417 return stu_name; 418 } 419 420 public void setStu_name(String stu_name) { 421 this.stu_name = stu_name; 422 } 423 424 public int getTotalScore() { 425 return totalScore; 426 } 427 428 public void setTotalScore(int totalScore) { 429 this.totalScore = totalScore; 430 } 431 } 432 433 class ExScore extends Score { 434 public ExScore(int score1,int score2) { 435 super(score1, score2); 436 this.setTotalScore((int) (score1*0.3+score2*0.7)); 437 } 438 } 439 440 class InScore extends Score { 441 public InScore(int totalScore) { 442 super(totalScore); 443 } 444 } 445 446 class SelectCourse { 447 private Course course; 448 private Student student; 449 private Score score; 450 451 public SelectCourse(Course course, Student student, Score score) { 452 this.course = course; 453 this.student = student; 454 this.score = score; 455 } 456 457 public Course getCourse() { 458 return course; 459 } 460 461 public void setCourse(Course course) { 462 this.course = course; 463 } 464 465 public Student getStudent() { 466 return student; 467 } 468 469 public void setStudent(Student student) { 470 this.student = student; 471 } 472 473 public Score getScore() { 474 return score; 475 } 476 477 public void setScore(Score score) { 478 this.score = score; 479 } 480 481 @Override 482 public boolean equals(Object obj) { 483 if (this == obj) 484 return true; 485 if (obj == null || getClass() != obj.getClass()) 486 return false; 487 SelectCourse selectCourse = (SelectCourse) obj; 488 return Objects.equals(student.getStu_id(), selectCourse.student.getStu_id()) && Objects.equals(course.getName(), selectCourse.course.getName()) && Objects.equals(score.getTotalScore(), selectCourse.score.getTotalScore()); 489 } 490 @Override 491 public int hashCode() { 492 return Objects.hash(student,course,score); 493 } 494 } 495 496 class Student implements Comparable<Student> { 497 private String stu_id; 498 private String name; 499 private Clazz cla; 500 501 public Student(String stu_id, String name) { 502 this.stu_id = stu_id; 503 this.name = name; 504 this.cla = new Clazz(stu_id.substring(0, 6)); 505 } 506 507 public String getStu_id() { 508 return stu_id; 509 } 510 511 public void setStu_id(String stu_id) { 512 this.stu_id = stu_id; 513 } 514 515 public String getName() { 516 return name; 517 } 518 519 public void setName(String name) { 520 this.name = name; 521 } 522 523 public Clazz getCla() { 524 return cla; 525 } 526 527 public void setCla(Clazz cla) { 528 this.cla = cla; 529 } 530 531 public void print(List<SelectCourse> selectCourses){ 532 if(selectCourses.isEmpty()){ 533 System.out.println(stu_id+" "+name+" did not take any exams"); 534 }else{ 535 System.out.println(stu_id+" "+name+" "+getAvgGrade(selectCourses)); 536 } 537 } 538 539 public int getAvgGrade(List<SelectCourse> selectCourses) { 540 double sum = 0; 541 int i = 0; 542 for(SelectCourse selectCourse: selectCourses){ 543 if(selectCourse.getStudent().getStu_id().equals(this.stu_id)){ 544 sum+= selectCourse.getScore().getTotalScore(); 545 i++; 546 } 547 } 548 return (int) Math.floor(sum/i); 549 } 550 551 @Override 552 public boolean equals(Object obj) { 553 if (this == obj) 554 return true; 555 if (obj == null || getClass() != obj.getClass()) 556 return false; 557 Student student = (Student) obj; 558 return Objects.equals(stu_id, student.stu_id); 559 } 560 561 @Override 562 public int hashCode() { 563 return Objects.hash(stu_id); 564 } 565 566 @Override 567 public int compareTo(Student o) { 568 return this.stu_id.compareTo(o.stu_id); 569 } 570 }
测试点
好像就是关于计算成绩出错的问题导致测试点过不去,但是一直找不到问题所在,下面是该类图:
7-2 统计java程序中关键词的出现次数
作者 段喜龙
单位 南昌航空大学
编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:
- Java中共有53个关键字(自行百度)
- 从键盘输入一段源码,统计这段源码中出现的关键字的数量
- 注释中出现的关键字不用统计
- 字符串中出现的关键字不用统计
- 统计出的关键字及数量按照关键字升序进行排序输出
- 未输入源码则认为输入非法
输入格式:
输入Java源码字符串,可以一行或多行,以exit
行作为结束标志
输出格式:
- 当未输入源码时,程序输出
Wrong Format
- 当没有统计数据时,输出为空
- 当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为
数量\t关键字
输入样例:
在这里给出一组输入。例如:
//Test public method
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
exit
输出样例:
在这里给出相应的输出。例如:
1 float
3 if
2 int
2 new
2 public
3 this
2 throw
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
这题很奇怪,看着很简单很容易,但是不知道为什么测试点总是有一个过不去,按照测试点去改了也没有用,总之,很怪!
接下来是代码:
1 import java.util.*; 2 import java.util.regex.Pattern; 3 import java.util.regex.Matcher; 4 5 public class Main{ 6 public static void main(String[] args) { 7 Scanner in = new Scanner(System.in); 8 String[] array = {"abstract","assert","boolean","break","byte","case", 9 "catch","char","class","const","continue","default","do","double", 10 "else","enum","extends","false","final","finally","float","for","goto", 11 "if","implements","import","instanceof","int","interface","long", 12 "native","new","null","package","private","protected","public", 13 "return","short","static","strictfp","super","switch","synchronized", 14 "this","throw","throws","transient","true","try","void","volatile", 15 "while"}; 16 Set<String> keyword = new TreeSet<>(Arrays.asList(array)); 17 18 Map<String,Integer> map = new HashMap<>(); 19 StringBuilder input = new StringBuilder();//将源码存进去 20 for(int i = 1;;i++) { 21 String str = in.nextLine(); 22 if(str.equals("exit")) { 23 break; 24 } 25 input.append(str + "\n"); 26 } 27 28 if(input.toString().isEmpty()) { 29 System.out.println("Wrong Format"); 30 System.exit(0); 31 } 32 33 //删除源码的注释和字符串 34 String newinput = " " + input.toString(); 35 newinput = newinput.replaceAll("\"(.*?)\"", " "); 36 newinput = newinput.replaceAll("//.*?\n", " "); 37 newinput = newinput.replaceAll("(/\\*)(\n*.*?)*(\\*/)", " "); 38 //删除源码中的除字母数字的字符 39 // newinput = newinput.replaceAll("[^A-Za-z\\d]", " "); 40 41 for(String str : keyword){ 42 int n = 0; 43 Pattern r = Pattern.compile("[^a-zA-Z\\d]" + str + "[^a-zA-Z\\d]"); 44 Matcher m = r.matcher(newinput); 45 while(m.find()) { 46 n++; 47 } 48 map.put(str,n); 49 if(n > 0) { 50 System.out.println(map.get(str) + "\t" + str); 51 } 52 } 53 } 54 }
这道题比较容易就不给类图了,下面是没过的测试点:
7-3 容器-HashMap-检索
作者 蔡轲 单位 南昌航空大学输入多个学生的成绩信息,包括:学号、姓名、成绩。
学号是每个学生的唯一识别号,互不相同。
姓名可能会存在重复。
使用HashMap存储学生信息,并实现根据学号的检索功能
输入格式:
输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+成绩
以“end”为输入结束标志
end之后输入某个学号,执行程序输出该生的详细信息
输出格式:
输出查询到的学生信息格式:学号+英文空格+姓名+英文空格+成绩
如果没有查询到,则输出:"The student "+查询的学号+" does not exist"
输入样例1:
在这里给出一组输入。例如:
20201107 张少军 83
20201116 李四 78
20201118 郑觉先 80
end
20201116
输出样例1:
在这里给出相应的输出。例如:
20201116 李四 78
输入样例2:
在这里给出一组输入。例如:
20201107 张少军 83
20201116 李四 78
20201118 郑觉先 80
end
20202316
输出样例2:
在这里给出相应的输出。例如:
The student 20202316 does not exist
这道题挺简单的就不做多讲解,下面是代码:
1 // package Ptaoop10; 2 3 import java.util.*; 4 5 public class Main { 6 public static void main(String[] args) { 7 // 定义存储学生信息的 HashMap 8 Map<Integer, Student> studentMap = new HashMap<>(); 9 // 输入学生信息 10 Scanner scanner = new Scanner(System.in); 11 while (true) { 12 String input = scanner.nextLine(); 13 14 if (input.equalsIgnoreCase("end")) { // 以 end 作为输入结束标志 15 break; 16 } 17 18 String[] fields = input.split("\\s+"); 19 if (fields.length != 3) { // 判断用户输入的学生信息格式是否正确 20 System.out.println("Wrong Format"); 21 continue; 22 } 23 24 try { 25 int id = Integer.parseInt(fields[0]); 26 String name = fields[1]; 27 int score = Integer.parseInt(fields[2]); 28 29 Student student = new Student(id, name, score); 30 studentMap.put(id, student); 31 } catch (NumberFormatException e) { 32 System.out.println("Wrong Format"); 33 } 34 } 35 // 根据学号检索学生信息 36 while (true) { 37 String input = scanner.nextLine(); 38 if (input.equalsIgnoreCase("end")) { // 以 end 作为查询结束标志 39 break; 40 } 41 42 try { 43 int id = Integer.parseInt(input); 44 Student student = studentMap.get(id); 45 if (student != null) { 46 System.out.println(student); 47 } else { 48 System.out.println("The student "+id+" does not exist"); 49 } 50 } catch (NumberFormatException e) { 51 System.out.println("Wrong Format"); 52 } 53 return; 54 } 55 } 56 } 57 58 class Student { 59 private int id; 60 private String name; 61 private int score; 62 63 public Student(int id, String name, int score) { 64 this.id = id; 65 this.name = name; 66 this.score = score; 67 } 68 69 public int getId() { 70 return id; 71 } 72 73 public String getName() { 74 return name; 75 } 76 77 public double getScore() { 78 return score; 79 } 80 81 @Override 82 public String toString() { 83 return id + " "+name+" "+score; 84 } 85 }
7-4 容器-HashMap-排序
作者 蔡轲 单位 南昌航空大学输入多个学生的成绩信息,包括:学号、姓名、成绩。
学号是每个学生的唯一识别号,互不相同。
姓名可能会存在重复。
要求:使用HashMap存储学生信息。
输入格式:
输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+成绩
以“end”为输入结束标志
输出格式:
按学号从大到小的顺序输出所有学生信息,每个学生信息的输出格式:学号+英文空格+姓名+英文空格+成绩
输入样例:
在这里给出一组输入。例如:
20201124 张少军 83
20201136 李四 78
20201118 郑觉先 80
end
输出样例:
在这里给出相应的输出。例如:
20201136 李四 78 20201124 张少军 83 20201118 郑觉先 80
这题也是类似,下面代码:
1 // package pta101; 2 3 import java.util.*; 4 5 public class Main { 6 public static void main(String[] args) { 7 // 定义存储学生信息的 HashMap 8 Map<Integer, Student> studentMap = new HashMap<>(); 9 10 // 输入学生信息 11 Scanner scanner = new Scanner(System.in); 12 while (true) { 13 String input = scanner.nextLine(); 14 15 if (input.equalsIgnoreCase("end")) { // 以 end 作为输入结束标志 16 break; 17 } 18 19 String[] fields = input.split("\\s+"); 20 if (fields.length != 3) { // 判断用户输入的学生信息格式是否正确 21 System.out.println("Wrong Format"); 22 continue; 23 } 24 25 try { 26 int id = Integer.parseInt(fields[0]); 27 String name = fields[1]; 28 int score = Integer.parseInt(fields[2]); 29 30 Student student = new Student(id, name, score); 31 studentMap.put(id, student); 32 } catch (NumberFormatException e) { 33 System.out.println("Wrong Format"); 34 } 35 } 36 37 // 根据学号排序并输出学生信息 38 List<Integer> keyList = new ArrayList<>(studentMap.keySet()); 39 Collections.sort(keyList); //升序 40 Collections.reverse(keyList); // 升序进行翻转 41 42 for (Integer id : keyList) { 43 System.out.println(studentMap.get(id)); 44 } 45 return; 46 } 47 } 48 49 class Student { 50 private int id; 51 private String name; 52 private int score; 53 54 public Student(int id, String name, int score) { 55 this.id = id; 56 this.name = name; 57 this.score = score; 58 } 59 60 public int getId() { 61 return id; 62 } 63 64 public String getName() { 65 return name; 66 } 67 68 public int getScore() { 69 return score; 70 } 71 72 @Override 73 public String toString() { 74 return id + " "+name+" "+score; 75 } 76 }
7-5 课程成绩统计程序-2
课程成绩统计程序-2在第一次的基础上增加了实验课,以下加粗字体显示为本次新增的内容。
某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。
考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。
考察的总成绩直接等于期末成绩
实验的总成绩等于课程每次实验成绩的平均分
必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。
1、输入:
包括课程、课程成绩两类信息。
课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。
课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式
课程性质输入项:必修、选修、实验
考核方式输入选项:考试、考察、实验
考试/考查课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩
考试/考查课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩
实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩
实验次数至少4次,不超过9次
实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+实验次数+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩
以上信息的相关约束:
1)平时成绩和期末成绩的权重默认为0.3、0.7
2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】
3)学号由8位数字组成
4)姓名不超过10个字符
5)课程名称不超过10个字符
6)不特别输入班级信息,班级号是学号的前6位。
2、输出:
输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。
为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。
1)学生课程总成绩平均分按学号由低到高排序输出
格式:学号+英文空格+姓名+英文空格+总成绩平均分
如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"
2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出
考试/考察课程成绩格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分
实验课成绩格式:课程名称+英文空格+总成绩平均分
如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"
3)班级所有课程总成绩平均分按班级由低到高排序输出
格式:班级号+英文空格+总成绩平均分
如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"
异常情况:
1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"
2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"
以上两种情况如果同时出现,按第一种情况输出结果。
3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"
4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"
5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。
信息约束:
1)成绩平均分只取整数部分,小数部分丢弃
参考类图(与第一次相同,其余内容自行补充)
又是这题目,和菜单程序一样迭代到2了,虽然做了那么多次了还是出现种种问题,先展示一下没过的测试点:
总共有四个测试点没有通过,分数满分60分也只有44分,太奇怪了还是和第一次一样反正只要是和学生成绩有关的测试点就总是出现各种问题,调试了半天仍然出现问题,只能说在以后得更加注重细节!
类图和第一次差不了多少,类图如下:
7-6 动物发声模拟器(多态)
作者 刘凤良 单位 天津仁爱学院设计一个动物发生模拟器,用于模拟不同动物的叫声。比如狮吼、虎啸、狗旺旺、猫喵喵……。
定义抽象类Animal,包含两个抽象方法:获取动物类别getAnimalClass()、动物叫shout();
然后基于抽象类Animal定义狗类Dog、猫类Cat和山羊Goat,用getAnimalClass()方法返回不同的动物类别(比如猫,狗,山羊),用shout()方法分别输出不同的叫声(比如喵喵、汪汪、咩咩)。
最后编写AnimalShoutTest类测试,输出:
猫的叫声:喵喵
狗的叫声:汪汪
山羊的叫声:咩咩
其中,在AnimalShoutTestMain类中,用speak(Animal animal){}方法输出动物animal的叫声,在main()方法中调用speak()方法,分别输出猫、狗和山羊对象的叫声。
请在下面的【】处添加代码。
//动物发生模拟器. 请在下面的【】处添加代码。
public class AnimalShoutTest2 {
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog();
Goat goat = new Goat();
speak(cat);
speak(dog);
speak(goat);
}
//定义静态方法speak()
【】
}
//定义抽象类Animal
【】class Animal{
【】
}
//基于Animal类,定义猫类Cat,并重写两个抽象方法
class Cat 【】{
【】
【】
}
//基于Animal类,定义狗类Dog,并重写两个抽象方法
class Dog 【】{
【】
【】
}
//基于Animal类,定义山羊类Goat,并重写两个抽象方法
class Goat 【】{
【】
【】
}
输入样例:
输出样例:
猫的叫声:喵喵
狗的叫声:汪汪
山羊的叫声:咩咩
这题可就太简单了,下面是代码:
1 // package Ptaoop10; 2 3 //动物发生模拟器. 请在下面的【】处添加代码。 4 public class Main { 5 public static void main(String[] args) { 6 Cat cat = new Cat(); 7 Dog dog = new Dog(); 8 Goat goat = new Goat(); 9 speak(cat); 10 speak(dog); 11 speak(goat); 12 } 13 // 定义静态方法speak() 14 15 private static void speak(Animal animal) { 16 System.out.println(animal.getAnimalClass() + "的叫声:" + animal.shout()); 17 } 18 } 19 20 //定义抽象类Animal 21 abstract class Animal { 22 abstract public String getAnimalClass(); 23 abstract public String shout(); 24 } 25 26 //基于Animal类,定义猫类Cat,并重写两个抽象方法 27 class Cat extends Animal { 28 @Override 29 public String getAnimalClass() { 30 return "猫"; 31 } 32 @Override 33 public String shout() { 34 return "喵喵"; 35 } 36 } 37 //基于Animal类,定义狗类Dog,并重写两个抽象方法 38 class Dog extends Animal { 39 @Override 40 public String getAnimalClass() { 41 return "狗"; 42 } 43 44 @Override 45 public String shout() { 46 return "汪汪"; 47 } 48 } 49 50 //基于Animal类,定义山羊类Goat,并重写两个抽象方法 51 class Goat extends Animal { 52 @Override 53 public String getAnimalClass() { 54 return "山羊"; 55 } 56 @Override 57 public String shout() { 58 return "咩咩"; 59 } 60 }
采坑心得
在课程成绩程序-1和2里面有太多因为计算能力不够而丢失的测试点,由于在编程过程中没有做好备注导致代码写完测试点没有过去都不知道从哪里找错误,一定要多备注,多测试。
对象的创建分析,类与对象的关系
类是一种抽象的数据类型,它是对某一事物的整体描述/定义,但是并不能代表一个具体的事物
动物、植物、手机、电脑…
Person类、Pet类、Car类,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为
对象是抽象概念具体的实例
张三就是一个人的具体实例,张三家里的旺财就是狗的一个具体实例
能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念
创建与初始化对象
使用new关键字创建对象
使用new关键字创建的时候,除了分配内存空间之外还会给创建好的对象默认初始化以及对类中构造器的调用
类中的构造器也称为构造方法,是在进行对象创建的时候必须要调用的,并且构造器有以下两个特点:
必须和类的名字相同
必须没有返回类型,也不能使用void
静态代码块、构造代码块、局部代码块
静态代码块
随着类的加载而加载,并且只被加载一次,一般用于项目的初始化
1 static{...}
概述
1、 静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化
2、 构造代码块:在调用构造方法前会自动调用,每次创建对象都会被调用
3、 局部代码块:方法里的代码块,方法被调用时才会执行
4、 静态代码块:static{ },位置:在类里方法外
5、 TODO创建测试类,类中写好静态代码块,构造代码块,构造方法,普通方法里嵌套局部代码块。测试他们的执行顺序。
6、 静态 - 构造代码块 - 构造方法 - 局部
比较值相等最好用equal别用==
1 public class equalTest { 2 public static void main(String[] args) { 3 Integer a = 12; 4 Integer b = 12; 5 Integer c = 133; 6 Integer d = 133; 7 Integer e = 24; 8 int f = 133; 9 10 System.out.println(a == b); //true 11 System.out.println(c == d); //false 12 System.out.println(f == c); //true 13 System.out.println(a + b == e); //true 14 }
通过这次学会了Javafx的使用,实话说,感觉这里蛮难的,里面好多方法的使用都要去学习,去琢磨,通过查阅资料,浏览他人优质的代码去学习,去改进,整个实验进行的很曲折,功能也有些不完善,但是总体而言还是收获很大的,javafx里面的按钮事件驱动机制、lambda表达式等等,还有很多值得去学习。
改进建议
Java编程中因首先针对抽象类及接口对项目搭建宏观整体框架。在通过对父类继承或对接口实现来填充程序内容已完善细节。对于整体框架的建立至关重要,关系到之后对细节实现的难易程度以及整体的可复用性。良好的框架使得代码的可复用性提高,同时对代码增加细节也将方便进行。因此在编写程序之前,因首先分析整体的执行顺序并对其中的复杂动作进行相应化简使得代码更易书写。
总结
在学习Java的过程中我得出这样的结论:
在学习Java的面向对象的编程语言的特性。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习Java之前没有C++的经验,只有C语言的经验,花了很长时间,才彻底把这些 概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了很多遍,才彻底领悟了。学习中,要养成良好的习惯(写括号时要成对,字母大小写要区分,单词拼写要准确)。在学习的过程中,最好不是仅仅停留在java表层,不是抄书上的例子运行出结果就可以。要注意,即便对一个简单的例子也要有耐心去琢磨、调试、改动。在学习的过程中一定要动手做、试着写代码,而不是抱一本书看看就行。很多东西和体会必须自己动手才能真正属于自己。 在 Java 的学习过程中,可能会遇到形形色色的问题不容易解决,应多去专业论坛了解相关的知识,书本上的知识有限。要会从网上搜索有用的信息 加以整理,促进学习的深入和知识水平的提高。
最后,对于这次面向对象编程的课程我觉得很有赞扬的地方,首先从pta平台布置多种不同类型的题目,全是任课老师自己设计的题目,更贴近学生的需求和掌握,属实暖心,上课也很生动,很容易让学生产生兴趣,很满意!
标签:return,String,int,public,JavaBlog,id,name From: https://www.cnblogs.com/fzq2513610927/p/17510105.html