首先,做一个项目,我们需要吧它分成不同小模块去完成它,可以参考:“MVC设计模式(经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。)”
1.先做Student对象
package Student;
/**
*
* @author 汤
*
*/
public class Student {
private String number;
private String name;
private String sex;
private int age;
private int math;
private int english;
private int java;
public Student() {
super();
}
public Student(String number, String name, String sex, int age) {
super();
this.number = number;
this.name = name;
this.sex = sex;
this.age = age;
this.math=0;
this.english=0;
this.java=0;
}
public Student(String number, String name, String sex, int age, int math, int english, int java) {
super();
this.number = number;
this.name = name;
this.sex = sex;
this.age = age;
this.math = math;
this.english = english;
this.java = java;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getEnglish() {
return english;
}
public void setEnglish(int english) {
this.english = english;
}
public int getJava() {
return java;
}
public void setJava(int java) {
this.java = java;
}
@Override
public String toString() {
return "Student [number=" + number + ", name=" + name + ", sex=" + sex + ", age=" + age + ", math=" + math
+ ", english=" + english + ", java=" + java + "]";
}
}
- 写出构造器
- 写出get、set方法
- 重写toString方法
2.写出View的用户界面
package View;
import Controller.Controller;
import Student.Student;
import Tools.Tools;
import saveInformation.saveTools;
import sortStudent.sortStudent;
/**
*
* @author 汤
*
*/
public class View {
private Controller student = new Controller(40);
public static void main(String[] args) {
View v = new View();
v.Menu();
}
public void Menu() {
boolean boo = true;
while (boo) {
System.out.println(" 欢迎使用学生信息管理系统——by 汤峻玮");
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(" 8.观看文件信息");
System.out.println(" 9.退出管理系统");
System.out.print(" 请选择(1-9):");
char n = Tools.readMenu();
switch (n) {
case '1':
addNewStudent();// 增
break;
case '2':
addStudentscore();// 增
break;
case '3':
deleteInformation();// 删
break;
case '4':
replaceInformation();// 改
break;
case '5':
lookupInformation();// 查
break;
case '6':
displayInformation();// 看
break;
case '7':
Student[] stu = sortStudent.sortStudentInformation(student.getAllStudent());// 排序
for (int i = 0; i < student.getTotal(); i++) {
student.replaceStudent(i, stu[i]);
}
boolean bo4 = saveTools.saveInformation(student.getAllStudent(), false);
if (bo4) {
System.out.println("文件保存成功!");
} else {
System.out.println("文件保存失败!");
}
break;
case '8':
saveTools.readInformation();
break;
case '9':
System.out.print("确认是否退出(Y/N):");
char isExit = Tools.readSelection();
if (isExit == 'Y') {
boo = false;
}
break;
}
}
}
public void addNewStudent() {
System.out.println("------学生信息添加------");
System.out.print("请输入姓名:");
String name = Tools.readString(10);
System.out.print("请输入性别:");
String sex = Tools.readString(3);
System.out.print("请输入年龄:");
int age = Tools.readInt();
System.out.print("请输入学号:");
String number = Tools.readString(30);
Student stu = new Student(number, name, sex, age);
boolean k = student.addStudent(stu);
if (k) {
System.out.println("------信息添加成功------");
boolean bo = saveTools.saveInformation(student.getAllStudent(), true);
if (bo) {
System.out.println("文件保存成功!");
} else {
System.out.println("文件保存失败!");
}
} else {
System.out.println("------信息添加失败------");
}
}
public void addStudentscore() {
int i;
System.out.println("------学生成绩录入------");
System.out.println("现有信息");
displayInformation();
System.out.println("请选择添加成绩对象的学号:");
String number = Tools.readString(30);
for (i = 0; i < student.getTotal(); i++) {
if (number.equals(student.getStudent(i).getNumber())) {
System.out.println("已经找到对应学生");
System.out.println("请输入添加的数学成绩:");
int math = Tools.readInt();
System.out.println("请输入添加的英语成绩:");
int english = Tools.readInt();
System.out.println("请输入添加的程序成绩:");
int java = Tools.readInt();
student.getStudent(i).setMath(math);
student.getStudent(i).setEnglish(english);
student.getStudent(i).setJava(java);
System.out.println("------成绩添加成功------");
boolean bo1 = saveTools.saveInformation(student.getAllStudent(), false);
if (bo1) {
System.out.println("文件保存成功!");
} else {
System.out.println("文件保存失败!");
}
break;
}
}
if (i == student.getTotal()) {
System.out.println("------成绩添加失败------");
}
}
public void deleteInformation() {
System.out.println("------学生信息删除------");
System.out.println("现有信息");
displayInformation();
System.out.println("请选择删除对象学号:");
String number = Tools.readString(30);
for (int i = 0; i < student.getTotal(); i++) {
if (number.equals(student.getStudent(i).getNumber())) {
System.out.println("已找到对应学生");
System.out.println("确认删除吗?(Y/N)");
char isChoice = Tools.readSelection();
if (isChoice == 'Y') {
boolean k = student.deleteStudent(i);
if (k) {
System.out.println("------信息删除成功------");
boolean bo2 = saveTools.saveInformation(student.getAllStudent(), false);
if (bo2) {
System.out.println("文件保存成功!");
} else {
System.out.println("文件保存失败!");
}
} else {
System.out.println("------信息删除失败------");
}
} else {
System.out.println("------退出成功------");
}
}
}
}
public void replaceInformation() {
System.out.println("------学生信息修改------");
System.out.println("现有信息");
displayInformation();
System.out.println("请输入修改的学生学号:");
String number = Tools.readString(30);
for (int i = 0; i < student.getTotal(); i++) {
if (number.equals(student.getStudent(i).getNumber())) {
System.out.println("已经找到对应学生");
System.out.println("请输入修改学生姓名(回车不修改):");
String name = Tools.readString(10, student.getStudent(i).getName());
System.out.println("请输入修改学生性别(回车不修改):");
String sex = Tools.readString(3, student.getStudent(i).getSex());
System.out.println("请输入修改学生年龄(回车不修改):");
int age = Tools.readInt(student.getStudent(i).getAge());
System.out.println("请输入修改学生学号(回车不修改):");
String numbers = Tools.readString(30, student.getStudent(i).getNumber());
System.out.println("是否继续修改成绩?(Y/N)");
char isChoice = Tools.readSelection();
if (isChoice == 'Y') {
System.out.println("请输入修改的数学成绩(回车不修改)");
int math = Tools.readInt(student.getStudent(i).getMath());
System.out.println("请输入修改的英语成绩(回车不修改)");
int english = Tools.readInt(student.getStudent(i).getEnglish());
System.out.println("请输入修改的程序成绩(回车不修改)");
int java = Tools.readInt(student.getStudent(i).getJava());
Student stu2 = new Student(numbers, name, sex, age, math, english, java);
boolean boo = student.replaceStudent(i, stu2);
if (boo) {
System.out.println("------信息更改成功------");
boolean bo3 = saveTools.saveInformation(student.getAllStudent(), false);
if (bo3) {
System.out.println("文件保存成功!");
} else {
System.out.println("文件保存失败!");
}
} else {
System.out.println("------信息更改失败------");
}
} else {
Student stu3 = new Student(numbers, name, sex, age, student.getStudent(i).getMath(),
student.getStudent(i).getEnglish(), student.getStudent(i).getJava());
boolean bo = student.replaceStudent(i, stu3);
if (bo) {
System.out.println("------信息更改成功------");
} else {
System.out.println("------信息更改失败------");
}
}
}
}
}
public void lookupInformation() {
boolean boo = true;
while (boo) {
System.out.println("------学生信息查询------");
System.out.println("请输入查询指令:");
System.out.println("1.查询姓名");
System.out.println("2.查询学号");
System.out.println("3.查询年龄");
System.out.println("4.退出查询");
System.out.println("请输入指令(1-4):");
char c = Tools.readlittleMenu();
switch (c) {
case '1':
int count = 0;
System.out.println("请输入姓名:");
String name = Tools.readString(10);
for (int i = 0; i < student.getTotal(); i++) {
if (name.equals(student.getStudent(i).getName())) {
System.out.println("找到了!他的学号是:" + student.getStudent(i).getNumber());
count++;
}
}
System.out.println("查找结束,符合条件的有" + count + "人");
break;
case '2':
int count2 = 0;
System.out.println("请输入学号:");
String number = Tools.readString(30);
for (int i = 0; i < student.getTotal(); i++) {
if (number.equals(student.getStudent(i).getNumber())) {
System.out.println("找到了!他的姓名是:" + student.getStudent(i).getName());
count2++;
}
}
System.out.println("查找结束,符合条件的有" + count2 + "人");
break;
case '3':
int count3 = 0;
System.out.println("请输入年龄:");
int age = Tools.readInt();
for (int i = 0; i < student.getTotal(); i++) {
if (age == student.getStudent(i).getAge()) {
System.out.println("找到了!他的学号是:" + student.getStudent(i).getNumber());
count3++;
}
}
System.out.println("查找结束,符合条件的有" + count3 + "人");
break;
case '4':
boo = false;
break;
}
}
}
public void displayInformation() {
Student[] stu = student.getAllStudent();
for (int i = 0; i < stu.length; i++) {
System.out.println("[ 姓名:" + stu[i].getName() + " ,学号:" + stu[i].getNumber() + " ,性别:" + stu[i].getSex()
+ " ,年龄:" + stu[i].getAge() + " ,数学:" + stu[i].getMath() + " ,英语:" + stu[i].getEnglish() + " ,程序:"
+ stu[i].getJava() + " ]");
}
}
}
要以给用户“贴心”的体验为原则,多写提示语句
框架搭建好了,那么就需要去实现用户需求的功能了
3.实现工具类Tools
工具类的用处就是读取并且判断从键盘输入的值是否符合条件
- readKeyBoard(int、boolean)读键盘
- readMenu()读菜单指令
- readChar()读字符
- readChar(defaultValue)读字符,回车就读默认值
- readInt()读整数
- readInt(defaultValue)读整数,回车就读默认值
- readSelection()读判断Y or N
- …
package Tools;
import java.util.Scanner;
/**
*
* @author 汤JW2021.6.6
*
*/
public class Tools {
private static Scanner scan = new Scanner(System.in);
//读键盘
private static String readKeyBoard(int limit, boolean blankReturn) {
String line = "";
while (scan.hasNextLine()) {
line = scan.nextLine();
if (line.length() == 0) {
if (blankReturn)
return line;
else
continue;
}
if (line.length() < 1 || line.length() > limit) {
System.out.print("输入长度(不大于" + limit + ")(并且不小于1) 错误,请重新输入:");
continue;
}
break;
}
return line;
}
//读菜单
public static char readMenu(){
char c;
while(true){
String str=readKeyBoard(1,false);
c=str.charAt(0);
if(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5'&&c!='6'&&c!='7'&&c!='8'&&c!='9'){
System.out.println("指令未识别,请重新输入");
}else{
break;
}
}
return c;
}
//读字符,并且返回
public static char readChar() {
String str=readKeyBoard(1,false);
return str.charAt(0);
}
//读字符,并且返回,如果不输入那么直接输出默认的值
public static char readChar(char defaultValue) {
String str=readKeyBoard(1,true);
return (str.length()==0)? defaultValue:str.charAt(0);
}
//读长度不超过两位的整数,并且返回。
public static int readInt() {
int n;
while(true) {
String str=readKeyBoard(3, false);
try {
n=(int)Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.println("数字输入错误,请重新输入:");
}
}
return n;
}
//读长度不超过两位的整数,并且返回,如果不输入那么直接输出默认的值
public static int readInt(int defaultValue) {
int n;
while(true) {
String str=readKeyBoard(2, true);
if(str.equals("")) {
return defaultValue;
}
try {
n=(int)Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.println("数字输入错误,请重新输入:");
continue;//?
}
}
return n;
}
//用于确认选择,读取‘Y’或者‘N’,并且返回
public static char readSelection() {
char c;
while(true) {
String str=readKeyBoard(1, false).toUpperCase();
c=str.charAt(0);
if(c=='Y'||c=='N') {
break;
}else {
System.out.println("选择指令错误,请重新输入:~");
}
}
return c;
}
//读取长度不超过limit的字符串,并且返回
public static String readString(int limit) {
String str=readKeyBoard(limit, false);
return str;
}
//读取长度不超过limit的字符串,如果不输入那么直接输出默认的值,并且返回
public static String readString(int limit,String defaultValue) {
String str=readKeyBoard(limit, true);
while(true) {
if(str.equals("")) {
return defaultValue;
}else {
break;
}
}
return str;
}
public static char readlittleMenu(){
char c;
while(true){
String str=readKeyBoard(1,false);
c=str.charAt(0);
if(c!='1'&&c!='2'&&c!='3'&&c!='4'){
System.out.println("指令未识别,请重新输入");
}else{
break;
}
}
return c;
}
}
4.完成控制层面Controller:
用户---->控制---->对象
package Controller;
import Student.Student;
/**
*
* @author 汤JW
*
*/
public class Controller {
private Student[] stu;
private static int total;
public Controller(int index) {
stu=new Student[index];
}
//增加
public boolean addStudent(Student student) {
if(total<0||total>stu.length) {
return false;
}else {
stu[total++]=student;
return true;
}
}
//删除
public boolean deleteStudent(int index) {
if (total < 0 || total > stu.length) {
return false;
} else {
total--;
stu[index]=null;
for(int i=index;i<total;i++) {
stu[i]=stu[i+1];
}
return true;
}
}
//修改
public boolean replaceStudent(int index,Student stu3) {
if(total<0 || total>stu.length) {
return false;
}else {
stu[index]=stu3;
return true;
}
}
//查所有
public Student[] getAllStudent() {
Student[] stu4=new Student[total];
for(int i=0;i<stu4.length;i++) {
stu4[i]=stu[i];
}
return stu4;
}
//查单个
public Student getStudent(int index) {
if(index<0 ||index>total) {
return null;
}else {
return stu[index];
}
}
public static int getTotal() {
return total;
}
}
5.排序sortStudent
排序是重写比较器实现的排序,内容较多,所以不放在Controller中
package sortStudent;
import java.util.Arrays;
import java.util.Comparator;
import Controller.Controller;
import Student.Student;
import Tools.Tools;
//专门用来排序
public class sortStudent {
public static Student[] sortStudentInformation(Student[] stu) {
System.out.println("------学生成绩排序------");
System.out.println("1.按照数学成绩排序:");
System.out.println("2.按照程序成绩排序:");
System.out.println("3.按照英语成绩排序:");
System.out.println("4.按照年龄大小排序:");
System.out.println("请选择指令(1-4):");
char c = Tools.readChar();
switch (c) {
case '1':
Arrays.sort(stu, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Student && o2 instanceof Student) {
Student stu1 = (Student) o1;
Student stu2 = (Student) o2;
if (stu1.getMath() == stu2.getMath()) {
return Integer.compare(stu1.getAge(), stu2.getAge());
} else {
return -((Integer) stu1.getMath()).compareTo((Integer) stu2.getMath());
}
}
return 0;
}
});
return stu;
case '2':
Arrays.sort(stu, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Student && o2 instanceof Student) {
Student stu1 = (Student) o1;
Student stu2 = (Student) o2;
if (stu1.getJava() == stu2.getJava()) {
return Integer.compare(stu1.getAge(), stu2.getAge());
} else {
return -((Integer) stu1.getJava()).compareTo((Integer) stu2.getJava());
}
}
return 0;
}
});
return stu;
case '3':
Arrays.sort(stu, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Student && o2 instanceof Student) {
Student stu1 = (Student) o1;
Student stu2 = (Student) o2;
if (stu1.getEnglish() == stu2.getEnglish()) {
return Integer.compare(stu1.getAge(), stu2.getAge());
} else {
return -((Integer) stu1.getEnglish()).compareTo((Integer) stu2.getEnglish());
}
}
return 0;
}
});
return stu;
case '4':
Arrays.sort(stu, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Student && o2 instanceof Student) {
Student stu1 = (Student) o1;
Student stu2 = (Student) o2;
if (stu1.getAge() == stu2.getAge()) {
return stu1.getName().compareTo(stu2.getName());
} else {
return -((Integer) stu1.getAge()).compareTo((Integer) stu2.getAge());
}
}
return 0;
}
});
return stu;
}
return stu;
}
}
6.使用字符流进行保存saveTools
因为字符流一般都是二进制,一般保存一些图片视频。所以我选择字符流
package saveInformation;
import java.io.*;
import Student.Student;
/*汤JW
*/
//保存信息
public class saveTools{
private static File file=new File("D://stu.txt");
public static boolean saveInformation(Student[] stu,boolean boo) {
FileWriter fw=null;
int i;
try {
fw = new FileWriter(file, boo);
for(i=0;i<stu.length;i++) {
// fw.write(stu[i].getName()+"/"+stu[i].getNumber()+"/"+stu[i].getAge()+"/"+stu[i].getSex()+"/"+stu[i].getMath()+"/"+stu[i].getEnglish()+"/"+stu[i].getJava()+"\n");
fw.write(stu[i].toString()+"\n");
}
System.out.println("保存成功");
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}finally {
try {
if(fw!=null)
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void readInformation() {
FileReader fr = null;
try {
File file = new File("D:/stu.txt");
fr = new FileReader(file);
char[] cbuf = new char[5];
int len;
while ((len = fr.read(cbuf)) != -1) {
String str = new String(cbuf, 0, len);// 从0开始取到len
System.out.print(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 资源关闭
try {
if (fr != null)
fr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上就是我的期末课设作业。
本人大一,第一次发代码,我知道其中有许多不足,例如:在下一次打开这程序,文件又会重置;文件中的东西只能读取为String不能转化为Student型到内存中等等,并且用户界面尚不美观,还未用到Swing等知识,属实遗憾,希望随着学习的深入我会解决这些问题!
持续行动,不要自我感动!
7.13更新:
已对IO流做出优化:对于上次学生成绩管理系统IO流的改进