项目案例作业1:学生信息管理系统(面向对象初步接触)
集美大学课程实验报告-项目案例作业1:学生信息管理系统(面向对象初步接触)
项目名称 | 内容 |
---|---|
课程名称 | Java |
班级 | 网安2413 |
指导教师 | 郑如滨 |
学生姓名 | 林沁茹 |
学号 | 202421336067 |
实验项目名称 | 项目案例作业1:学生信息管理系统(面向对象初步接触) |
上机实践日期 | |
上机实践时间 | 2学时 |
一、目的(本次实验所涉及并要求掌握的知识点)
- 运行、读懂学生管理系统
- 掌握学生管理系统里的基本语法与逻辑
二、功能解答
数据处理
问题1-该程序主要处理什么数据?
该程序主要处理自定义类StudentManagementSystem和Student里的数据
问题2-这些数据存储在哪里?
自定义类的数据(对象本身)存储在堆中,而我们用来操作这些对象的引用(变量名)和基本类型变量则存储在栈中
问题3-与C语言程序相比,Java代码处理这些数据有何不同之处?
-
对于StudentManagementSystem.java的对比分析
1.在Java中,数据和操作被封装在StudentManagementSystem这一类里面;而C语言没有类这一概念,而是定义一个数据结构,再使用函数来实现以上功能
2.在Java中,使用了List<Student>和ArrayList,这是一个动态数组,可以根据输入的内容自动扩容;而C语言没有内置动态数组,想要达到类似的效果需要使用链表,自己手动来写逻辑,实现扩容
3.在Java中,会自动分配内存,不需要人为干预;而C语言则需要自己手动请求内存,最后还需要手动释放内存
-
对于Student.java的对比分析
1.在Java中,使用访问控制(private)来强制使数据被隐藏,保证数据的安全性;而在C语言中,没有访问控制,所有内容默认公开
2.在Java中,使用this方法,将传进来的局部变量的值,赋给我(当前对象)自己的成员变量,可以在此时加点判断,保证数据的正确性;在C语言中,没有这种this方法,是直接就可以对变量赋值,不进行封装,不可以内置检查算法
3.在Java中,在类中的方法中返回对象的引用;在C语言中,返回的是整个结构体的完整拷贝
-
对于StudentManagementSystemTest.java的对比分析
1.在Java中,采取System.out.println来进行输出和换行;在C语言中,使用printf("\n")来进行输出和换行
2.在Java中,使用new来创建一个类型,并启动了一个完整的生命周期,其构建的是一个已经构造好、处于可用状态的对象;在C语言中,使用malloc来进行内存的申请,其是在堆上动态分配指定字节数的内存块,并返回这块内存的起始地址
-
对于Main.java的对比分析
1.在Java中,采用scanner类型来进行面板的读取;在C语言中,使用scanf来进行面板的读取
2.在Java中,==永远可以用来比较任何类型的变量,但对于引用类型,它比较的是内存地址,如果想比较其内容是否相等,应该使用 equals() 方法。但要注意,equals() 方法的行为是否满足我们的要求取决于它是否在类中被正确地重写;C语言对于任何类型都可以使用==来进行比较,但对于结构体需要逐个成员进行比较
功能说明
Main.java文件运行
1. 根据要求,添加学生信息
2.根据输入的学生姓名,在数组中寻找该名学生对应的信息
3.根据科目的查找,输出对应科目的学生信息
4.根据绩点的查找,输出对应绩点的学生信息
5.展示所有信息
6.根据ID,删除学生信息
7.退出程序
StudentManagementSystemTest.java文件运行
根据要求,先后输出所有学生信息,查找John的信息,查找学科为Mathematics的学生信息,查找绩点为3.5的学生信息,去除一个学生信息后存储的所有学生信息
三、类功能讲解
-
对于Student.java的分析(Student类)
1. public Student(String name, int age, String gender, String id, String major, double gpa)
方法:类的构造方法
功能概述:对对象的属性进行初始化
属性用途:存储学生的具体数据
2.public String getName()
方法:类中的一个getter方法
功能概述:获取并返回当前Student对象的name属性的值
属性用途:name是String类型的私有成员变量,用于存储学生的姓名
3.public void setName(String name)
方法:类中的一个setter方法
功能概述:给当前的Student对象的name属性赋一个新值
属性用途:用于存储学生的姓名
4.public int getAge()
方法:类中的一个getter方法
功能概述:获取并返回当前Student对象的age属性的值
属性用途:age是String类型的私有成员变量,用于存储学生的年龄
5.public void setAge(int age)
方法:类中的一个setter方法
功能概述:给当前的Student对象的age属性赋一个新值
属性用途:用于存储学生的年龄
6.public String getGender()
方法:类中的一个getter方法
功能概述:获取并返回当前Student对象的gender属性的值
属性用途:gender是String类型的私有成员变量,用于存储学生的性别
7.public void setGender(String gender)
方法:类中的一个setter方法
功能概述:给当前的Student对象的gender属性赋一个新值
属性用途:用于存储学生的性别
8.public String getId()
方法:类中的一个getter方法
功能概述:获取并返回当前Student对象的id属性的值
属性用途:id是String类型的私有成员变量,用于存储学生的学号
9.public void setId(String id)
方法:类中的一个setter方法
功能概述:给当前的Student对象的id属性赋一个新值
属性用途:用于存储学生的学号
10.public String getMajor()
方法:类中的一个getter方法
功能概述:获取并返回当前Student对象的major属性的值
属性用途:major是String类型的私有成员变量,用于存储学生的科目
11.public void setMajor(String major)
方法:类中的一个setter方法
功能概述:给当前的Student对象的major属性赋一个新值
属性用途:用于存储学生的项目
12.public double getGpa()
方法:类中的一个getter方法
功能概述:获取并返回当前Student对象的gpa属性的值
属性用途:gpa是String类型的私有成员变量,用于存储学生的绩点
13.public void setGpa(double gpa)
方法:类中的一个setter方法
功能概述:给当前的Student对象的gpa属性赋一个新值
属性用途:用于存储学生的绩点
14.public String toString()
方法:重写了Java中所有类都默认继承自Object类的toString()方法
功能概述:将当前Student对象的所有属性信息,格式化成一个易于阅读的字符串形式并返回
属性用途:私有属性被直接访问,并通过字符串拼接的方式组合成一个完整的表达形式
-
对于StudentManagementSystem.java的分析(StudentManagementSystem类)
1.public StudentManagementSystem()
方法:类的构造方法
功能概述:对对象进行初始化,确保在students内部已经被正确创建
属性用途:存储所有学生的具体数据
2.public void addStudent(Student student)
方法:类中的一个setter方法
功能概述:添加一名学生信息到数组中
3.public void removeStudent(Student student)
方法:类中的一个setter方法
功能概述:去除数组中一名学生信息
4.public List getStudents()
方法:类中的一个getter方法
功能概述:获取并返回数组中一名学生的信息
5.public List searchByName(String name)
方法:类中的一个setter方法
功能概述:在数组中根据输入的名字查找学生的信息,并返回所有符合条件的学生信息
6.public List searchByMajor(String major)
方法:类中的一个setter方法
功能概述:在数组中根据输入的科目查找学生的信息,并返回所有符合条件的学生信息
7.public List searchByGpa(double gpa)
方法:类中的一个setter方法
功能概述:在数组中根据输入的绩点查找学生的信息,并返回所有符合条件的学生信息
-
对于StudentManagementSystemTest.java的分析(测试类)
public static void main(String[] args)
方法:类中的一个main方法
功能概述:给当前的StudentManagementSystem对象存入三个Student对象信息,并展示所有信息和StudentManagementSystem类里方法调用后的结果
属性用途:用于存储学生的年龄
-
对于Main.java的分析(Main类)
public static void main(String[] args)
方法:类中的一个main方法
功能概述:使用Scanner读取面板,调用while循环和switch方法,实现功能的选取,并根据面板输入内容调用相应StudentManagementSystem类里的方法,并展示
属性用途:读取面板和用于存储学生的年龄
-
对于Main类不同于其它类的分析
Main类是整个应用程序的启动器和用户交互层,负责启动和运行整个程序,它的存在不是为了解决问题本身,而是为了让问题能够在一个特定的环境(这里是命令行)中被用户使用和解决;其它类都属于应用程序的核心领域模型,它们共同定义了“学生管理”这个问题的本质
四、基本语法讲解
List
1.是Java中最核心、最常用的接口之一
2.是一个有序的、允许重复元素的集合,可以把它想象成一个动态数组或者一个序列
3.需要使用new ArrayList<>()来进行实例化
方法
- 方法的分类
1.构造方法,实现对象的初始化
2.普通方法,可以对于输入内容进行自定义判断和返回格式(即定义对象的行为,让对象能执行操作),可以被反复的调用
- 方法重写
子类对父类中允许访问的方法的实现过程进行重新编写,其中返回值和形参都不能改变
读取
采用Scanner类来读取命令行内容
输出
采用System.out.println来进行输出和换行
五、实验使用环境(本次实验所使用的平台和相关软件)
以下请根据实际情况编写
- 操作系统:Windows 11专业版
- 编程语言:Java
- 开发工具:[eclipse)
六、附件-参考文件
- Main.java
点击查看代码
package code;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
/**
* This program is a student management system that allows users to add, remove,
* and search for students by name, major, and GPA. It uses the Student and
* StudentManagementSystem classes to store and manage student data.
*/
// Initialize the scanner
Scanner scanner = new Scanner(System.in);
StudentManagementSystem sms = new StudentManagementSystem();
boolean running = true;
while (running) {
// Prompt user for input
//System.out.println("林沁茹,学号:202421336067");
System.out.println("Enter 1 to add a student");
System.out.println("Enter 2 to remove a student");
System.out.println("Enter 3 to search for a student by name");
System.out.println("Enter 4 to search for a student by major");
System.out.println("Enter 5 to search for a student by GPA");
System.out.println("Enter 6 to show all students");
System.out.println("Enter 7 to exit");
// Get user input
int choice = scanner.nextInt();
// Process user input
switch (choice) {
case 1:
// Add a student
System.out.println("Enter student name:");
String name = scanner.next();
System.out.println("Enter student age:");
int age = scanner.nextInt();
System.out.println("Enter student gender:");
String gender = scanner.next();
System.out.println("Enter student ID:");
String id = scanner.next();
System.out.println("Enter student major:");
String major = scanner.next();
System.out.println("Enter student GPA:");
double gpa = scanner.nextDouble();
Student student = new Student(name, age, gender, id, major, gpa);
sms.addStudent(student);
System.out.println("Student added successfully!\n");
break;
case 2:
// Remove a student
System.out.println("Enter student ID to remove:");
String removeId = scanner.next();
List<Student> students = sms.getStudents();
boolean removed = false;
for (Student s : students) {
if (s.getId().equals(removeId)) {
sms.removeStudent(s);
removed = true;
System.out.println("Student removed successfully!\n");
break;
}
}
if (!removed) {
System.out.println("Student not found!");
}
break;
case 3:
// Search for a student by name
System.out.println("Enter student name to search:");
String searchName = scanner.next();
List<Student> searchResults = sms.searchByName(searchName);
if (searchResults.isEmpty()) {
System.out.println("No students found!");
} else {
System.out.println("Search results:");
for (Student s : searchResults) {
System.out.println(s);
}
}
break;
case 4:
// Search for a student by major
System.out.println("Enter student major to search:");
String searchMajor = scanner.next();
searchResults = sms.searchByMajor(searchMajor);
if (searchResults.isEmpty()) {
System.out.println("No students found!");
} else {
System.out.println("Search results:");
for (Student s : searchResults) {
System.out.println(s);
}
}
break;
case 5:
// Search for a student by GPA
System.out.println("Enter student GPA to search:");
double searchGpa = scanner.nextDouble();
searchResults = sms.searchByGpa(searchGpa);
if (searchResults.isEmpty()) {
System.out.println("No students found!");
} else {
System.out.println("Search results:");
for (Student s : searchResults) {
System.out.println(s);
}
}
break;
case 6:
// Show all Students
List<Student> studentList = sms.getStudents();
if (studentList.size() == 0) {
System.out.println("The System Data is empty Now!");
}else {
for (Student studentItem : studentList) {
System.out.println(studentItem.toString());
}
}
break;
case 7:
// Exit the program
running = false;
System.out.println("Exit Successfully!");
break;
default:
// Invalid input
System.out.println("Invalid choice!");
break;
}
}
// Close scanner
scanner.close();
}
}
- Student.java
点击查看代码
package code;
public class Student {
private String name;
private int age;
private String gender;
private String id;
private String major;
private double gpa;
public Student(String name, int age, String gender, String id, String major, double gpa) {
this.name = name;
this.age = age;
this.gender = gender;
this.id = id;
this.major = major;
this.gpa = gpa;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public double getGpa() {
return gpa;
}
public void setGpa(double gpa) {
this.gpa = gpa;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", id='" + id + '\'' +
", major='" + major + '\'' +
", gpa=" + gpa +
'}';
}
}
- StudentManagementSystem.java
点击查看代码
package code;
import java.util.ArrayList;
import java.util.List;
public class StudentManagementSystem {
private List<Student> students;
public StudentManagementSystem() {
students = new ArrayList<>();
}
public void addStudent(Student student) {
students.add(student);
}
public void removeStudent(Student student) {
students.remove(student);
}
public List<Student> getStudents() {
return students;
}
public List<Student> searchByName(String name) {
List<Student> result = new ArrayList<>();
for (Student student : students) {
if (student.getName().equals(name)) {
result.add(student);
}
}
return result;
}
public List<Student> searchByMajor(String major) {
List<Student> result = new ArrayList<>();
for (Student student : students) {
if (student.getMajor().equals(major)) {
result.add(student);
}
}
return result;
}
public List<Student> searchByGpa(double gpa) {
List<Student> result = new ArrayList<>();
for (Student student : students) {
if (student.getGpa() == gpa) {
result.add(student);
}
}
return result;
}
}
- StudentManagementSystemTest.java
点击查看代码
package code;
import java.util.List;
import java.util.Scanner;
public class StudentManagementSystemTest {
public static void main(String[] args) {
StudentManagementSystem sms = new StudentManagementSystem();
Student s1 = new Student("John", 20, "Male", "001", "Computer Science", 3.5);
Student s2 = new Student("Mary", 21, "Female", "002", "Mathematics", 3.8);
Student s3 = new Student("Tom", 19, "Male", "003", "Physics", 3.2);
sms.addStudent(s1);
sms.addStudent(s2);
sms.addStudent(s3);
System.out.println("All students: " + sms.getStudents());
System.out.println("Search by name: " + sms.searchByName("John"));
System.out.println("Search by major: " + sms.searchByMajor("Mathematics"));
System.out.println("Search by GPA: " + sms.searchByGpa(3.5));
sms.removeStudent(s2);
System.out.println("All students after removing Mary: " + sms.getStudents());
}
}