作为一个普通的大学生,我深知在编程方面还有很大的不足,文章内如有不妥之处还希望各位大神能够不吝赐教,指出我的不足,也希望这篇文章能让更多的同学共同进步,在此非常感谢大家的阅读和指导,非常感谢!
一、设计题目
学生通讯录管理系统,设计一个学生通信录,学生通迅录的数据信息构成内容自行设计(如:姓名、家庭地址、邮政编码、电话号码等等),通信录数据类型定义为结构体类型。要求界面友好,易于操作。
1.主要功能
(1) 能建立、修改和增删学生通讯录
(2) 能够按多种方式进行查询
二、运行环境(软、硬件环境)
1. 软件环境
(1)Java Development Kit (JDK):JDK是Java开发的核心工具包,包含了编译、运行Java程序所需的各种工具和资源。JDK包含了Java编译器(javac)、Java运行时环境(JRE)以及其他一些工具和库。
(2)Java Runtime Environment (JRE):JRE是Java的运行环境,用于解释执行Java的字节码文件。
(3)Java Virtual Machine (JVM):JVM是Java编程语言的核心,并且具有平台独立性,是JRE的一部分。JVM负责解释执行字节码文件,是可运行Java字节码文件的虚拟计算机。
2. 硬件环境
(1)Windows11操作系统
(2)AMD Ryzen 7 7730U处理器(其实我不确定硬件环境是不是指这些,希望了解这些的大神可以指导一下!非常感谢!)
三、算法设计的思想
1. 数据结构设计
定义结构体类型:学生通讯录的数据信息构成内容应包含学生的基本信息,如姓名、年龄、家庭地址、邮政编码、电话号码等。在Java中,可以通过定义一个Student类来实现这一数据结构,包含相应的属性(如name、age、address、emsCode、call等)和方法(如构造方法、get和set方法等)。
2. 主要功能实现
(1)创建新的学生记录:通过addStu()方法,用户可以输入新学生的信息,并将其保存为一个新的Student对象,然后将其添加到学生集合中。
(2)修改学生记录:通过姓名查找并修改学生的信息。首先,通过查找算法定位到要修改的学生记录,然后选择要修改的属性,允许用户修改其属性,并保存修改后的数据。
(3)删除学生记录:同样通过姓名来查找并删除学生的信息。
(4)查询学生记录:支持按多种方式进行查询,如按姓名、号码等。通过遍历学生集合来找到符合条件的学生记录,并显示相关信息。
3. 算法设计策略
(1)输入/输出设计:
输入模块:创建文件存储输入的学生信息;通过用户输入或文件导入的方式获取数据。减少繁琐的重复输入。
输出模块:将数据输出到控制台或保存到文件中。
(2)查找算法设计:采用for循环遍历来快速定位到要操作的学生记录。
四、类图、流程图
五、算法设计分析
1. 系统需求分析
(1)数据管理:系统需要能够添加、删除、修改和查询学生通讯录信息。
(2)性能要求:系统应该具备较高的响应速度,尤其是在处理大量数据时。
(3)用户界面:系统应提供简洁、易用的用户界面,方便用户操作。
2. 数据结构选择
(1)使用类(Class):在Java中,可以使用类来表示学生信息。一个Student类可以包含学生的姓名、学号、联系方式等属性,另一个StuManager类包含多种方法,用于实现添加、修改、删除和显示信息等功能。
(2)集合(ArrayList):对于存储多个学生对象,可以使用Java的集合,如ArrayList。这些集合类提供了各种操作学生对象的方法,如添加、删除、遍历等。
3. 算法设计
(1)添加算法:
通过调用学生对象的addStu ()方法来实现,用户输入学生信息后,创建一个新的Student对象。该对象添加到集合类ArrayList中。
(2)删除算法:
通过调用学生对象的delStu()方法来实现,根据用户输入的姓名,遍历集合中的学生对象。找到匹配的学生对象后,从集合中删除该对象。
(3)修改算法:
通过调用学生对象的modifyStu()方法来实现,根据用户输入的姓名,遍历集合中的学生对象。找到匹配的学生对象后,。选择要修改的学生属性,修改该属性。
(4)查询算法:
通过调用学生对象的nameRefer()和nameRefer()方法来实现,根据用户输入的查询条件(如姓名、号码等),遍历集合中的学生对象。如果找到匹配的学生对象,则显示其信息。
4. 性能优化
文件:如果系统需要处理大量数据,并且某些数据被频繁访问,可以考虑使用文件来存储这些数据,以减少繁琐的重复输入。
5. 安全性考虑
输入验证:对用户输入的数据进行验证,确保输入的数据是合法和有效的。例如,检查号码是否符合规定格式等。
六、源代码
package course1;
import java.io.Serializable;
public class Student implements Serializable {
private String name; //名字
private int age; //年龄
private String address; //地址
private int emsCode; //邮政编码
private int call; //电话号码
public Student() {
}
public Student(String name, int age, String address, int emsCode, int call) {
this.name = name;
this.age = age;
this.address = address;
this.emsCode = emsCode;
this.call = call;
}
//输入输出名字
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 getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
//输入输出邮政编码
public int getEmsCode() {
return emsCode;
}
public void setEmsCode(int emsCode) {
this.emsCode = emsCode;
}
//输入输出电话号码
public int getCall() {
return call;
}
public void setCall(int call) {
this.call = call;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age + '\'' +
",address=" + address + '\'' +
",emsCode=" + emsCode + '\'' +
",call=" + call + '\'' +
'}';
}
}
package course1;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class stuManager {
static List<Student> stulist=new ArrayList<>();//静态方法可访问的必须是类(静态)成员
static Scanner in=new Scanner(System.in); //静态方法可访问的必须是类(静态)成员
//菜单
public static void menu() {
System.out.println("\t学生通讯录管理系统");
System.out.println("--------------------------");
System.out.println("1.信息录入");
System.out.println("2.按给定姓名删除");
System.out.println("3.修改学生信息");
System.out.println("4.显示所有学生");
System.out.println("5.保存");
System.out.println("6.按名字查询学生");
System.out.println("7.按电话号码查询学生");
System.out.println("0.退出");
System.out.println("当前有"+stulist.size()+"个学生"); //显示当前系统中已有的学生数
System.out.print("请输入你的选择(0~6):");
}
//录入学生
public static void addStu(List<Student> stulist) {
while(true) {
System.out.println("1.输入学生信息 0.停止输入");
int choose;
System.out.print("请输入选择(1 or 0):");
choose=in.nextInt();
if(choose==0){
break;
} else if (choose==1) {
System.out.print("输入学生姓名:");
String name = in.next();
System.out.print("输入学生年龄:");
int age = in.nextInt();
System.out.print("输入学生的地址:");
String address = in.next();
System.out.print("输入学生的邮政编码:");
int emsCode = in.nextInt();
System.out.print("输入学生的电话号码:");
int call = in.nextInt();
Student stu = new Student();
stulist.add(new Student(name, age, address, emsCode, call));
}
}
}
//按姓名删除学生
public static void delStu(List<Student> stulist) {
System.out.print("输入要删除学生的姓名:");
String name=in.next();
for(int i=0;i<stulist.size();i++) {
if(name.equals((stulist.get(i)).getName())) {
stulist.remove(i);
}
}
}
//修改学生信息
public static void modifyStu(List<Student> stulist){
System.out.print("输入你要修改的学生的名字:");
String stuname= in.next();
for (int i = 0; i < stulist.size(); i++) {
Student stu=new Student();
if(stuname.equals((stulist.get(i)).getName())){
System.out.println("你要修改的学生信息如下:");
System.out.printf("姓名:%-15s\t年龄:%-3d\n",stulist.get(i).getName(),stulist.get(i).getAge());
System.out.printf("地址:%-15s\t邮政编码:%-3d\n",stulist.get(i).getAddress(),stulist.get(i).getEmsCode());
System.out.printf("电话号码:%-15d\n",stulist.get(i).getCall());
int x;
System.out.println(
"情况1,修改学生的姓名;\n" +
"情况2,修改学生的年龄;\n" +
"情况3,修改学生的地址;\n" +
"情况4,修改学生的邮政编码;\n" +
"情况5,修改学生的电话号码;\n" +
"情况0,不进行修改;");
System.out.print("请输入你的选择:");
x=in.nextInt();
/*
情况x=1,修改学生的姓名;
情况x=2,修改学生的年龄;
情况x=3,修改学生的地址;
情况x=4,修改学生的邮政编码;
情况x=5,修改学生的电话号码;
情况x=0,不进行修改;
*/
if(x==0) {
break;
}else if(x==1){
String name;
System.out.print("请输入该学生的新姓名:");
name=in.next();
stulist.get(i).setName(name);
} else if (x==2) {
int age;
System.out.print("请输入该学生的新年龄:");
age=in.nextInt();
stulist.get(i).setAge(age);
} else if (x==3) {
int address;
System.out.print("请输入该学生的新地址:");
address=in.nextInt();
stulist.get(i).setAge(address);
} else if (x==4) {
int emsCode;
System.out.print("请输入该学生的新邮政编码");
emsCode=in.nextInt();
stulist.get(i).setAge(emsCode);
} else if (x==5) {
int call;
System.out.print("请输入该学生的新电话号码:");
call=in.nextInt();
stulist.get(i).setAge(call);
}
}
}
}
// 显示out文本中的学生信息
public static void showStu(List<Student> stulist) {
for(int i=0;i<stulist.size();i++) {
System.out.printf("姓名:%-15s\t年龄:%-3d\n",stulist.get(i).getName(),stulist.get(i).getAge());
System.out.printf("地址:%-15s\t邮政编码:%-3d\n",stulist.get(i).getAddress(),stulist.get(i).getEmsCode());
System.out.printf("电话号码:%-15d\n",stulist.get(i).getCall());
}
}
// 从文件中读出已有的学生信息(将学生信息写进out文本中)
public static void save(List<Student> stulist){
ObjectOutputStream oos= null;
try {
oos = new ObjectOutputStream(new FileOutputStream("out.dat"));
oos.writeObject(stulist);
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(oos!=null)
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 显示所有(遍历)学生
public static List<Student> load(){
List<Student> stulist=null;
ObjectInputStream ois= null;
try {
ois = new ObjectInputStream(new FileInputStream("out.dat"));
stulist=(List<Student>) ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if(ois!=null)
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return stulist;
}
//通过名字查询学生
public static void nameRefer(List<Student> stulist){
System.out.print("输入你要查询的学生的名字:");
String name= in.next();
for (int i = 0; i < stulist.size(); i++) {
if(name.equals((stulist.get(i)).getName())) {
System.out.printf("姓名:%-15s\t年龄:%-3d\n",stulist.get(i).getName(),stulist.get(i).getAge());
System.out.printf("地址:%-15s\t邮政编码:%-3d\n",stulist.get(i).getAddress(),stulist.get(i).getEmsCode());
System.out.printf("电话号码:%-15d\n",stulist.get(i).getCall());
}
}
}
//通过电话号码查询学生
public static void callRefer(List<Student> stulist){
System.out.print("输入你要查询的学生的电话号码:");
int call= in.nextInt();
for (int i = 0; i < stulist.size(); i++) {
if(call==((stulist.get(i)).getCall())) {
System.out.printf("姓名:%-15s\t年龄:%-3d\n",stulist.get(i).getName(),stulist.get(i).getAge());
System.out.printf("地址:%-15s\t邮政编码:%-3d\n",stulist.get(i).getAddress(),stulist.get(i).getEmsCode());
System.out.printf("电话号码:%-15d\n",stulist.get(i).getCall());
}
}
}
public static void main(String[] args) {
int choice;
File file=new File("out.dat");
if(file.exists()) // 判断有没有已保存的学生信息文件,如文件存在,
stulist=load(); //则将文件中的学生信息加载到系统中。
while(true) {
menu();
choice=in.nextInt();
switch(choice){
case 1: addStu(stulist);break;
case 2:delStu(stulist);break;
case 3:modifyStu(stulist);break;
case 4:showStu(stulist);break;
case 5:save(stulist);break;
case 6:nameRefer(stulist);break;
case 7:callRefer(stulist);break;
case 0:in.close();System.exit(0);
}
}
}
}
七、运行结果分析
1. 功能正确性
(1)添加功能:检查添加学生信息后,系统是否能够正确地将新信息存储到集合中,并且能够在需要时检索出来。
(2)删除功能:测试删除指定学生信息后,系统是否能够正确地移除该信息,并且不会影响其他学生的数据。
(3)修改功能:验证修改学生信息后,系统是否能够更新数据结构中对应学生的信息,并且保持其他学生信息的完整性。
(4)查询功能:通过不同的查询条件(如姓名、号码)测试查询功能,确保系统能够准确地返回符合条件的学生信息。
2. 性能表现
(1)响应时间:记录系统执行各种操作(如添加、删除、修改、查询)的响应时间,评估系统是否满足性能要求。
(2)可扩展性:评估系统在处理大量数据时的表现,包括添加大量学生信息、查询大量数据等场景下的性能表现。
3. 用户界面友好性
(1)操作便捷性:测试用户界面的操作流程是否简单易懂,是否方便用户快速完成各种操作。
(2)错误信息提示:验证系统在出现错误时是否能够提供清晰明了的错误信息提示,帮助用户快速定位问题并解决。
八、收获及体会
学生通讯录管理系统需要综合考虑系统需求、数据结构选择、算法设计、性能优化等方面。通过合理的算法设计和实现,可以构建出高效、稳定、易用的学生通讯录管理系统。
设计学生通讯录管理系统在Java中,无疑是一个富有挑战性和实践性的任务。在设计过程中,我遇到了很多新的问题和挑战。这促使我不断学习和探索新的知识和技术,提高自己的能力。同时也让我意识到编程是一项需要耐心和毅力的工作。在设计和实现过程中,可能会遇到很多困难和挫折,但只要不放弃,坚持下去,最终一定能够成功。
同时在完成这份报告的过程中我也遇到了很多我不了解以及只有浅薄认识的的信息,发出来也是希望能让各位大神指导一下我的问题,同时也能让更多的同学共同进步!非常感谢大家的阅读和指导,在下不胜荣幸!