PTA 6-8

一、作业总结
PTAdibaci总共进行了三次题目集的练习,无论是题目量,题目难度还是知识点,都是逐步递增的,并且越进行到后面的题目,运用到的技术也越来越多,在一周内(并且还有其他的课业的情况下)完成还是颇具难度的。

第一次题目集总体难度并不大,主要考察的是最基本的运用

第二次题目集相比与第一次,难度就有着一定的提升了,第二次开始考察容器-HashMap-检索

课程成绩统计程序-2

第三次题目的难度与前两次相比,难度就开始直线上升了,代码的耦合度开始迅速上升,对于这次题目,我也想了很久才做出来,期中遇到的问题也是最多的,调试测试点的过程也是很痛苦,不过好在最后也是成功钻研了出来。

7-1 容器-ArrayList-排序
分数 12
作者 蔡轲
单位 南昌航空大学

题目描述

编辑

输入多个学生的成绩信息,包括:学号、姓名、数学成绩、物理成绩。

学号是每个学生的唯一识别号,互不相同。

姓名可能会存在重复。

要求:使用ArrayList存储学生信息。

输入格式:

输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+数学成绩+英文空格+物理成绩

以“end”为输入结束标志

输出格式:

按数学/物理成绩之和从高到低的顺序输出所有学生信息,每个学生信息的输出格式:学号+英文空格+姓名+英文空格+数学/物理成绩之和

成绩相同的情况,按输入的先后顺序输出。

输入样例:

在这里给出一组输入。例如:

20201124 张少军 83 75
20201136 李四 78 86
20201118 郑觉先 80 62
end
 

输出样例:

在这里给出相应的输出。例如:

20201136 李四 164
20201124 张少军 158
20201118 郑觉先 142

完整代码如下:

import java.util.HashMap;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
HashMap<String, String> map = new HashMap<>();
String input = scanner.nextLine();
while (!input.equals("end")) {
String[] arr = input.split(" ");
map.put(arr[0], arr[1] + " " + arr[2]);
input = scanner.nextLine();
}
String query = scanner.nextLine();
if (map.containsKey(query)) {
System.out.println(query + " " + map.get(query));
} else {
System.out.println("The student " + query + " does not exist");
}
}
}

 

7-2 容器-HashMap-排序
分数 10
作者 蔡轲
单位 南昌航空大学

输入多个学生的成绩信息,包括:学号、姓名、成绩。

学号是每个学生的唯一识别号,互不相同。

姓名可能会存在重复。

要求:使用HashMap存储学生信息。

输入格式:

输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+成绩

以“end”为输入结束标志

输出格式:

按学号从大到小的顺序输出所有学生信息,每个学生信息的输出格式:学号+英文空格+姓名+英文空格+成绩

 

完整代码如下:


import java.util.HashMap;
import java.util.Scanner;
import java.util.TreeMap;

public class Main {
public static voaid main(String[] args) {
Scanner scanner = new Scanner(System.in);
HashMap<String, String> map = new HashMap<>();
String input = scanner.nextLine();
while (!input.equals("end")) {
String[] arr = input.split(" ");
map.put(arr[0], arr[1] + " " + arr[2]);
input = scanner.nextLine();
}
TreeMap<String, String> treeMap = new TreeMap<>((o1, o2) -> o2.compareTo(o1));
treeMap.putAll(map);
for (String key : treeMap.keySet()) {
System.out.println(key + " " + treeMap.get(key));
}
}
}

7-4 动物发声模拟器(多态)
分数 20
作者 刘凤良
单位 天津仁爱学院

设计一个动物发生模拟器,用于模拟不同动物的叫声。比如狮吼、虎啸、狗旺旺、猫喵喵……。
定义抽象类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 【】{
    【】
    【】
}
 

输入样例:

 
 

输出样例:

猫的叫声:喵喵
狗的叫声:汪汪
山羊的叫声:咩咩

完整代码如下:

//动物发生模拟器.
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);
}
//定义静态方法speak()
public static void speak(Animal animal) {
System.out.println(animal.getAnimalClass() + "的叫声:" + animal.shout());
}
}

//定义抽象类Animal
abstract class Animal{
public abstract String getAnimalClass();
public abstract String shout();
}
//基于Animal类,定义猫类Cat,并重写两个抽象方法
class Cat extends Animal{

public String getAnimalClass() {
return "猫";
}


public String shout() {
return "喵喵";
}
}
//基于Animal类,定义狗类Dog,并重写两个抽象方法
class Dog extends Animal{

public String getAnimalClass() {
return "狗";
}


public String shout() {
return "汪汪";
}
}
//基于Animal类,定义山羊类Goat,并重写两个抽象方法
class Goat extends Animal{

public String getAnimalClass() {
return "山羊";
}


public String shout() {
return "咩咩";
}
}

 

7-1 容器-ArrayList-排序
分数 12
作者 蔡轲
单位 南昌航空大学

题目描述

编辑

输入多个学生的成绩信息,包括:学号、姓名、数学成绩、物理成绩。

学号是每个学生的唯一识别号,互不相同。

姓名可能会存在重复。

要求:使用ArrayList存储学生信息。

输入格式:

输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+数学成绩+英文空格+物理成绩

以“end”为输入结束标志

输出格式:

按数学/物理成绩之和从高到低的顺序输出所有学生信息,每个学生信息的输出格式:学号+英文空格+姓名+英文空格+数学/物理成绩之和

成绩相同的情况,按输入的先后顺序输出。

输入样例:

在这里给出一组输入。例如:

20201124 张少军 83 75
20201136 李四 78 86
20201118 郑觉先 80 62
end
 

输出样例:

在这里给出相应的输出。例如:

20201136 李四 164
20201124 张少军 158
20201118 郑觉先 142

完整代码如下:

import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
ArrayList<Student> students = new ArrayList<>();
while (true) {
String line = scan.nextLine();
if (line.equals("end")) {
break;
}
String[] tokens = line.split(" ");
String id = tokens[0];
String name = tokens[1];
int mathScore = Integer.parseInt(tokens[2]);
int physicsScore = Integer.parseInt(tokens[3]);
Student student = new Student(id, name, mathScore, physicsScore);
students.add(student);
}
TreeMap<Integer, ArrayList<Student>> scores = new TreeMap<>();
for (Student student : students) {
int score = student.getMathScore() + student.getPhysicsScore();
if (scores.containsKey(score)) {
scores.get(score).add(student);
} else {
ArrayList<Student> list = new ArrayList<>();
list.add(student);
scores.put(score, list);
}
}
for (int score : scores.descendingKeySet()) {
ArrayList<Student> list = scores.get(score);
for (Student student : list) {
System.out.println(student.getId() + " " + student.getName() + " " + (student.getMathScore() + student.getPhysicsScore()));
}
}
}
}

class Student {
private String id;
private String name;
private int mathScore;
private int physicsScore;

public Student(String id, String name, int mathScore, int physicsScore) {
this.id = id;
this.name = name;
this.mathScore = mathScore;
this.physicsScore = physicsScore;
}

public String getId() {
return id;
}

public String getName() {
return name;
}

public int getMathScore() {
return mathScore;
}

public int getPhysicsScore() {
return physicsScore;
}
}

 


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 无参构造方法创建n1个对象
int n1 = scanner.nextInt();
ArrayList<PersonOverride> persons1 = new ArrayList<>();
for (int i = 0; i < n1; i++) {
persons1.add(new PersonOverride());
}
// 指定name age gender
int n2 = scanner.nextInt();
ArrayList<PersonOverride> persons2 = new ArrayList<>();
for (int i = 0; i < n2; i++) {
String name = scanner.next();
int age = scanner.nextInt();
boolean gender = scanner.nextBoolean();
PersonOverride person = new PersonOverride(name, age, gender);
if (!persons2.contains(person)) {
persons2.add(person);
}
}
// 输出persons1数组中的所有对象
for (PersonOverride person : persons1) {
System.out.println(person.toString());
}
// 输出persons2数组中的所有对象
for (PersonOverride person : persons2) {
System.out.println(person.toString());
}
// 输出persons2中实际包含的对象的数量
System.out.println(persons2.size());
// 输出PersonOverride的所有构造方法
System.out.println(Arrays.toString(PersonOverride.class.getConstructors()));
}
}

class PersonOverride {
private String name;
private int age;
private boolean gender;

public PersonOverride() {
this("default", 1, true);
}

public PersonOverride(String name, int age, boolean gender) {
this.name = name;
this.age = age;
this.gender = gender;
}

@Override
public String toString() {
return name + "-" + age + "-" + gender;
}

@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof PersonOverride)) {
return false;
}
PersonOverride other = (PersonOverride) obj;
return this.name.equals(other.name) && this.age == other.age && this.gender == other.gender;
}
}

 

完整代码如下:

 

7-5 jmu-Java-03面向对象基础-05-覆盖
分数 5
作者 郑如滨
单位 集美大学

Java每个对象都继承自Object,都有equals、toString等方法。
现在需要定义PersonOverride类并覆盖其toStringequals方法。

1. 新建PersonOverride类

a. 属性:String nameint ageboolean gender,所有的变量必须为私有(private)。

b. 有参构造方法,参数为name, age, gender

c. 无参构造方法,使用this(name, age,gender)调用有参构造方法。参数值分别为"default",1,true

d.toString()方法返回格式为:name-age-gender

e. equals方法需比较name、age、gender,这三者内容都相同,才返回true.

2. main方法

2.1 输入n1,使用无参构造方法创建n1个对象,放入数组persons1。
2.2 输入n2,然后指定name age gender。每创建一个对象都使用equals方法比较该对象是否已经在数组中存在,如果不存在,才将该对象放入数组persons2。
2.3 输出persons1数组中的所有对象
2.4 输出persons2数组中的所有对象
2.5 输出persons2中实际包含的对象的数量
2.5 使用System.out.println(Arrays.toString(PersonOverride.class.getConstructors()));输出PersonOverride的所有构造方法。

提示:使用ArrayList代替数组大幅复简化代码,请尝试重构你的代码。

输入样例:

1
3
zhang 10 true
zhang 10 true
zhang 10 false

 

输出样例:

default-1-true
zhang-10-true
zhang-10-false
2
[public PersonOverride(), public PersonOverride(java.lang.String,int,boolean)]

7-3 jmu-Java-02基本语法-03-身份证排序
分数 9
作者 郑如滨
单位 集美大学
  1. 输入n,然后连续输入n个身份证号。
  2. 然后根据输入的是sort1还是sort2,执行不同的功能。输入的不是sort1或sort2,则输出exit并退出。
    输入sort1,将每个身份证的年月日抽取出来,按年-月-日格式组装,然后对组装后的年-月-日升序输出。
    输入sort2,将所有身份证按照里面的年月日升序输出。

注意:处理输入的时候,全部使用ScannernextLine()方法,以免出错。

输入样例:

6
410425198309308225
320203197206115011
431227196108033146
330226196605054190
34080019810819327X
320111197112301539
sort1
sort2
e

 

输出样例:

1961-08-03
1966-05-05
1971-12-30
1972-06-11
1981-08-19
1983-09-30
431227196108033146
330226196605054190
320111197112301539
320203197206115011
34080019810819327X
410425198309308225
exit


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

class IDCard {
private String id;
private String date;

public IDCard(String id) {
this.id = id;
this.date = id.substring(6, 14);
}

public String getId() {
return id;
}

public String getDate() {
return date;
}
}

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine());
List<IDCard> idCards = new ArrayList<>();

for (int i = 0; i < n; i++) {
String id = scanner.nextLine();
idCards.add(new IDCard(id));
}

while (true) {
String command = scanner.nextLine();

if (command.equals("sort1")) {
Collections.sort(idCards, Comparator.comparing(IDCard::getDate));
for (IDCard idCard : idCards) {
System.out.println(idCard.getDate().substring(0, 4) + "-" +
idCard.getDate().substring(4, 6) + "-" +
idCard.getDate().substring(6, 8));
}
} else if (command.equals("sort2")) {
Collections.sort(idCards, Comparator.comparing(IDCard::getId));
for (IDCard idCard : idCards) {
System.out.println(idCard.getId());
}
} else {
System.out.println("exit");
break;
}
}
}
}

 

7-4 jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack
分数 10
作者 郑如滨
单位 集美大学

定义IntegerStack接口,用于声明一个存放Integer元素的栈的常见方法:

 
public Integer push(Integer item);
//如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。

public Integer pop();   //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null
public Integer peek();  //获得栈顶元素,如果为空,则返回null.
public boolean empty(); //如果为空返回true
public int size();      //返回栈中元素个数
 

定义IntegerStack的实现类ArrayIntegerStack,内部使用数组实现。创建时,可指定内部数组大小。

main方法说明

  1. 输入n,建立可包含n个元素的ArrayIntegerStack对象
  2. 输入m个值,均入栈。每次入栈均打印入栈返回结果。
  3. 输出栈顶元素,输出是否为空,输出size
  4. 使用Arrays.toString()输出内部数组中的值。
  5. 输入x,然后出栈x次,每次出栈均打印。
  6. 输出栈顶元素,输出是否为空,输出size
  7. 使用Arrays.toString()输出内部数组中的值。

思考

如果IntegerStack接口的实现类内部使用ArrayList来存储元素,怎么实现?测试代码需要进行什么修改?

输入样例

5
3
1 2 3
2

 

输出样例

1
2
3
3,false,3
[1, 2, 3, null, null]
3
2
1,false,1
[1, 2, 3, null, null]
 

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;

interface IntegerStack {
Integer push(Integer item);
Integer pop();
Integer peek();
boolean empty();
int size();
}

class ArrayIntegerStack implements IntegerStack {
private Integer[] stack;
private int top;

public ArrayIntegerStack(int capacity) {
stack = new Integer[capacity];
top = -1;
}

@Override
public Integer push(Integer item) {
if (item == null || top == stack.length - 1) {
return null;
}
stack[++top] = item;
return item;
}

@Override
public Integer pop() {
if (empty()) {
return null;
}
return stack[top--];
}

@Override
public Integer peek() {
if (empty()) {
return null;
}
return stack[top];
}

@Override
public boolean empty() {
return top == -1;
}

@Override
public int size() {
return top + 1;
}
}

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
ArrayIntegerStack stack = new ArrayIntegerStack(n);

for (int i = 0; i < n; i++) {
int item = scanner.nextInt();
Integer result = stack.push(item);
System.out.println(result);
}

System.out.println(stack.peek());
System.out.println(stack.empty() + "," + stack.size());
// System.out.println(Arrays.toString(stack.getStack()));

int x = scanner.nextInt();
for (int i = 0; i < x; i++) {
Integer result = stack.pop();
System.out.println(result);
}

System.out.println(stack.peek());
System.out.println(stack.empty() + "," + stack.size());
// System.out.println(Arrays.toString(stack.getStack()));
}
}

 

posted on 2023-06-28 23:49  ADBBAB  阅读(60)  评论(0编辑  收藏  举报

导航