Day44--练习--操作题(2)
当然可以,这里有一道稍微复杂一点的Java练习题,它将涉及到数组和循环的使用:
题目:学生成绩管理系统
要求:
编写一个简单的学生成绩管理系统,该系统能够:
- 输入学生的姓名和对应的成绩。
- 显示所有学生的姓名和成绩。
- 计算并显示所有学生的平均成绩。
- 找出并显示成绩最高的学生姓名和成绩。
输入:
- 学生数量(int类型)
- 每个学生的姓名(String类型)
- 每个学生的成绩(double类型)
输出:
- 所有学生的姓名和成绩列表
- 所有学生的平均成绩
- 成绩最高的学生的姓名和成绩
示例:
请输入学生数量: 3
请输入第1个学生的姓名: 张三
请输入张三的成绩: 85.5
请输入第2个学生的姓名: 李四
请输入李四的成绩: 90.0
请输入第3个学生的姓名: 王五
请输入王五的成绩: 78.5
所有学生的成绩如下:
张三: 85.5
李四: 90.0
王五: 78.5
所有学生的平均成绩是: 84.67
成绩最高的学生是: 李四, 成绩是: 90.0
提示:
- 使用数组或集合来存储学生的姓名和成绩。
- 使用循环来处理多个学生的输入和计算。
- 可以使用
ArrayList
来动态存储学生信息,如果使用数组则需要注意数组的大小固定。
这个练习题将帮助你巩固数组、循环和条件判断的使用,同时也是对你之前所学基础语法的一个综合运用。
答案:
以下是实现上述学生成绩管理系统的Java代码示例:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Student {
String name;
double score;
Student(String name, double score) {
this.name = name;
this.score = score;
}
}
public class StudentGradeManager {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<Student> students = new ArrayList<>();
System.out.print("请输入学生数量: ");
int numberOfStudents = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
for (int i = 1; i <= numberOfStudents; i++) {
System.out.print("请输入第" + i + "个学生的姓名: ");
String name = scanner.nextLine();
System.out.print("请输入" + name + "的成绩: ");
double score = scanner.nextDouble();
scanner.nextLine(); // 消耗换行符
students.add(new Student(name, score));
}
// 显示所有学生的成绩
System.out.println("
所有学生的成绩如下:");
double totalScore = 0;
for (Student student : students) {
System.out.println(student.name + ": " + student.score);
totalScore += student.score;
}
// 计算平均成绩
double averageScore = totalScore / numberOfStudents;
System.out.printf("
所有学生的平均成绩是: %.2f
", averageScore);
// 找出成绩最高的学生
Student topStudent = students.get(0);
for (Student student : students) {
if (student.score > topStudent.score) {
topStudent = student;
}
}
System.out.println("
成绩最高的学生是: " + topStudent.name + ", 成绩是: " + topStudent.score);
scanner.close();
}
}
```
### 代码解释:
1. **Student类**:定义了一个`Student`类来存储学生的姓名和成绩。
2. **ArrayList**:使用`ArrayList`来动态存储学生对象。
3. **输入处理**:使用`Scanner`类来获取用户输入,并处理输入的换行符。
4. **显示成绩**:使用`for-each`循环遍历`ArrayList`并显示每个学生的姓名和成绩。
5. **计算平均成绩**:通过累加所有学生的成绩并除以学生数量来计算平均成绩。
6. **找出最高成绩**:遍历`ArrayList`,找出成绩最高的学生。
这个代码示例涵盖了Java的基础语法和面向对象编程的概念,包括类、对象、数组列表、循环和条件判断。希望这个示例对你有所帮助!
详细解析:
为什么要使用ArrayList来动态存储学生对象?
使用ArrayList
来动态存储学生对象有几个原因:
1. 动态大小
- 数组大小固定:如果你使用数组来存储学生对象,你需要预先知道学生的数量,并且数组的大小是固定的。如果学生数量变化,你需要手动调整数组的大小,这可能会导致代码复杂且容易出错。
- ArrayList动态调整:
ArrayList
是Java集合框架的一部分,它可以动态地调整大小。当你添加或删除元素时,ArrayList
会自动处理内存分配和调整,使得代码更简洁和灵活。
2. 简化代码
- 添加和删除元素:使用
ArrayList
,你可以很容易地添加和删除学生对象,而不需要手动管理数组索引或处理数组复制。 - 遍历方便:
ArrayList
提供了方便的方法来遍历元素,比如使用for-each
循环,这使得代码更简洁和易读。
3. 类型安全
- 泛型支持:
ArrayList
是泛型类,可以在创建时指定存储的元素类型(例如ArrayList<Student>
),这提供了类型安全,避免了类型转换错误。
4. 内置方法
- 丰富的内置方法:
ArrayList
提供了许多有用的方法,比如add
、remove
、get
、size
等,这些方法使得操作集合变得非常方便。
示例对比
使用数组
Student[] students = new Student[numberOfStudents]; // 需要预先知道学生数量
for (int i = 0; i < numberOfStudents; i++) {
students[i] = new Student(name, score);
}
使用ArrayList
ArrayList<Student> students = new ArrayList<>();
students.add(new Student(name, score)); // 动态添加元素
总结
使用ArrayList
来存储学生对象使得代码更简洁、灵活和易于维护。它提供了动态调整大小、类型安全和丰富的内置方法,非常适合用于存储和管理一组对象。
printf在上面啥意思?
printf
是一个在多种编程语言中存在的函数,用于格式化输出。在 Java 中,printf
是 PrintStream
类的一个方法,主要用于按照指定的格式输出字符串。
printf
方法的基本语法如下:
System.out.printf(format, args);
format
是一个包含格式说明符的字符串,用于指定输出的格式。args
是一个或多个要输出的参数,它们的类型和顺序必须与格式说明符匹配。
格式说明符
格式说明符以 %
开头,后面跟着一个或多个字符,用于指定输出的格式。常见的格式说明符包括:
%s
:字符串%d
:十进制整数%f
:浮点数%c
:字符
示例
以下是一些使用 printf
方法的示例:
System.out.printf("Hello, %s!", "World"); // 输出: Hello, World!
System.out.printf("The answer is %d.", 42); // 输出: The answer is 42.
System.out.printf("Pi is approximately %.2f.", 3.14159); // 输出: Pi is approximately 3.14.
在你的代码中的应用
在你的代码中,printf
方法用于格式化输出平均成绩:
System.out.printf("
所有学生的平均成绩是: %.2f
", averageScore);
这里的 %.2f
是一个格式说明符,表示输出一个浮点数,并保留两位小数。averageScore
是要输出的参数。
希望这能帮助你理解 printf
方法在 Java 中的用法!