学习了一段时间了。是时候写一个程序来检验一下学习的成果了。
七夕让我们一起new对象。
ok,首先我们来看一下需求。
简单的学生信息管理系统,通过键盘选择操作进行添加学生(学号,姓名,性别,年龄,成绩)的信息,通过数组存储,同时可以进行查询某个或全体学生信息,修改学生信息,删除学生信息的操作。
到手了需求先来分析一下。要码出这样一个系统,首先我们对整个程序进行分解。
在一个程序中,我们总能把一个大的程序分解成多个小程序,从而将求解整体问题分解为求解部分问题,然后在进行汇总。
首先我们需要定义一下我们的学生类。如下
public class Stu {
private String stuNum ;//学生学号
private String name;//学生姓名
private String gender;//学生性别
private int age;//学生年龄
private int mark;//学生成绩
public Stu(String stuNum,String name,String gender,int age,int mark) {
this.stuNum = stuNum;
this.name = name;
this.gender = gender;
this.age = age;
this.mark = mark;
}//构造方法
public String getStuNum() {
return stuNum;
}
public void setStuNum(String stuNum) {
this.stuNum = stuNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getMark() {
return mark;
}
public void setMark(int mark) {
this.mark = mark;
}
}
在如上的Stu类中定义了5种不同类型的私有型变量,用于记录学生的不同信息。同时定义了一个构造方法,和对私有变量的访问和修改方法。
好的,对象有了,可是我们现在没有对应的方法来操作他,那我们要对象干什么呢,先把他用数组放起来吧。
public class Hw {
public static void main(String[] args) {
Stu a[] = new Stu[100];
a[0] = new Stu("84G0235","小雅","女",18,89);
int count = 1;
}}
好的,我们定义了一个100个长度类型为Stu类的数组,并对数组的第一个元素进行实例化操作。然后定义一个count的整形变量用来记录数组中有多少个被实例化的元素。
OK,安排妥当之后,我们来看看我们要对学生对象进行什么操作:
显示所有学生信息,录入学生信息,查询学生信息,修改学生信息,删除学生信息。
我们来一个一个的实现他们,首先是
显示所有学生信息:
Stu [] putAllStu(Stu a[],int count) {
for(int i = 0 ;i < count;i++) {
System.out.print(i+1 +":");
System.out.print("学号:"+a[i].getStuNum());
System.out.print(" 姓名:"+a[i].getName());
System.out.print(" 性别:"+a[i].getGender());
System.out.print(" 年龄:"+a[i].getAge());
System.out.println(" 成绩:"+a[i].getMark());
}
return a;
}
OK,我们第一了一个叫putAllStu的方法,他有两个参数,一个是Stu类 类型的数组,一个是int型的变量,一个返回值,返回值的类型是一个Stu类 类型的数组。
如果要调用的话实际传入的是存放学生信息的数组和被实例化的元素个数,然后随着 i 的增加,输出所有的学生信息。
OK,我们来实现第二个功能:
录入学生信息
Stu[] inPutStu(Stu a[], int count,Scanner scan) {
if (count == a.length) {
a = Hw.newArray(a);
}
System.out.println("请输入录入学生学号:");
String newStuNum = scan.next().trim();
System.out.println("请输入录入学生姓名:");
String newName = scan.next().trim();
System.out.println("请输入录入学生性别:");
String newGender = scan.next().trim();
while (true) {
if (newGender.equals("男") || newGender.equals("女")) {
break;
} else {
System.out.println("输入有误,重新输入");
newGender = scan.next();
}
}
System.out.println("请输入录入学生年龄:");
int newAge = scan.nextInt();
System.out.println("请输入录入学生成绩:");
int newMake = scan.nextInt();
a[count] = new Stu(newStuNum, newName, newGender, newAge, newMake);
return a;
}// 录入学生信息。
这个方法的参数调用同上一个函数,根据提示依次输入要录入的学生信息,然后实例化数组元素,返回实例化后的数组,注意这里count(数组中被实例化的个数)的值应该加一 的,但是由于我们返回了数组,所以count+1 的步骤我们放在主函数里面进行实现。
OK,我们来实现第三个功能。
查询学生信息
void selectStu(Stu a[],int count, Scanner scan) {
System.out.println("请输入要查找的学生姓名:");
String name = scan.next();
for(int i = 0 ;i < count;i++) {
if(a[i].getName().equals(name)) {
System.out.print("学号:"+a[i].getStuNum());
System.out.print(" 姓名:"+a[i].getName());
System.out.print(" 性别:"+a[i].getGender());
System.out.print(" 年龄:"+a[i].getAge());
System.out.print(" 成绩:"+a[i].getMark());
System.out.println(" 在系统中的位置为:"+i);
return ;
}
}
System.out.println("查无此人");
return ;
}// 查找学生信息。
这里我采用了根据学生姓名查找学生信息的方法,根据学号的方法实现类似,就不写了。这里我们让用户输入学生姓名,采用a[i].getName().equals(name) 的方法判断他们是否相等。这一部分在一开始实现的时候发现,String 类型的变量不能直接采用==和 学生类里面的元素进行比较,后百度得到 equals() 方法。
这里小结一下 == 和 equals() 的区别。== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象,比较的是指针操作。equals单纯的用来比较的是两个对象的内容是否相等。
OK,我们来实现第四个功能,
修改学生信息,
Stu [] reSetStu(Stu a[],int count, Scanner scan) {
System.out.println("请输入要修改的学生学号:");
String stuNum = scan.next();
for(int i = 0 ;i < count;i++) {
if(a[i].getStuNum().equals(stuNum)) {
System.out.println("您将要修改的学生信息如下:");
System.out.print("学号:"+a[i].getStuNum());
System.out.print(" 姓名:"+a[i].getName());
System.out.print(" 性别:"+a[i].getGender());
System.out.print(" 年龄:"+a[i].getAge());
System.out.println(" 成绩:"+a[i].getMark());
System.out.println("请选择您要修改的项目,输入0退出");
System.out.println("1.学号:");
System.out.println("2.姓名:");
System.out.println("3.性别:");
System.out.println("4.年龄:");
System.out.println("5.成绩:");
int flag = 1;//立旗子,如果为零退出修改
while (flag!=0) {
flag = scan.nextInt();
switch(flag) {
case 1:
System.out.println("请输入新的信息");
String newStuNum = scan.next();
a[i].setStuNum(newStuNum);
break;
case 2:
System.out.println("请输入新的信息");
String newName = scan.next();
a[i].setStuNum(newName);
break;
case 3:
System.out.println("请输入新的信息");
String newGender = scan.next();
while(true) {
if(newGender.equals("男") || newGender.equals("女")) {
break;
}else {
System.out.println("输入有误,重新输入");
newGender = scan.next();
}
}
a[i].setStuNum(newGender);
break;
case 4:
System.out.println("请输入新的信息");
int newAge = scan.nextInt();
a[i].setAge(newAge);
break;
case 5:
System.out.println("请输入新的信息");
int newMark = scan.nextInt();
a[i].setMark(newMark);
break;
default:
System.out.println("请输入正确数字");
}
System.out.println("请继续选择您要修改的项目,输入0退出");
}
System.out.println("您修改后的学生信息如下:");
System.out.print("学号:"+a[i].getStuNum());
System.out.print(" 姓名:"+a[i].getName());
System.out.print(" 性别:"+a[i].getGender());
System.out.print(" 年龄:"+a[i].getAge());
System.out.println(" 成绩:"+a[i].getMark());
return a;
}
}
System.out.println("系统中无此学生");
return a;
}// 修改学生信息。
在这个方法中设置的是根据学号来修改学生信息,我们先让他打印了一遍原来的学生信息。然后打印了一个菜单让用户根据菜单上的数字选择要修改的信息,调用类中的set方法进行修改,可以重复进行修改,输入0退出。然后再输出修改后的信息。返回修改后的数组。
OK,最后一个功能,
删除学生信息
Stu [] delete(Stu a[],int count, Scanner scan) {
System.out.println("请输入要删除的学生学号:");
String stuNum = scan.next();
for(int i = 0 ;i < count;i++) {
if(a[i].getStuNum().equals(stuNum)) {
for(int j = i+1;j< count ;j++) {
a[j-1]=a[j];
}
return a;
}
}
System.out.println("系统中无此学生");
return a;
}
在这里我选择了使用查找学生学号的方式进行找到需要删除的学生信息位置,然后让其后面的数组元素前移。这里也应该有一个count--,在主方法里会实现。
OK,至此我们的所有功能都实现完了。
emm但还是有些问题,我在前面定义了一个100长度的数组来存放信息。但是如果我要存更多的学生信息呢?
static Stu [] newArray(Stu a[]) {
Stu [] newArray = new Stu[a.length+a.length];
for(int i = 0 ;i < a.length ; i++)
newArray[i] = a[i] ;
return newArray;
}
}//数组扩容
OK,我们把a数组里面的信息复制到一个是a数组长度的两倍的数组里面,并返回新数组。我们把他放到 inPutStu 方法里面。在方法的开始判断数组中的被实例化的元素个数是否等于数组的长度本身如果存放学生信息 的数组满了 就调用 newArray 方法对数组扩容。
emm,我们还需要一个菜单来引导用户进行操作。
void putMenu() {
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("5.删除学生信息");
System.out.println("0.退出系统");
}
好的,基本上该有的模块我们都有了。下面我们需要把他们糅合在一起,开始拼图。
import java.util.Scanner;
public class Hw {
public static void main(String[] args) {
int count = 1;
int redFlag = 1;
Stu a[] = new Stu[1];
a[0] = new Stu("84G0235","小雅","女",18,89);
Scanner scan = new Scanner(System.in);
Hw test = new Hw();
System.out.println("欢迎来到学生信息管理系统");
while(redFlag==1) {
test.putMenu();
int data0 = scan.nextInt();
switch(data0) {
case 0:
redFlag = 0;
break;
case 1:
test.putAllStu(a, count);
break;
case 2:
a = test.inPutStu(a, count, scan);
count++;
break;
case 3:
test.selectStu(a, count, scan);
break;
case 4:
a = test.reSetStu(a, count,scan);
break;
case 5:
a = test.delete(a, count,scan);
count--;
break;
}
}
}
在完善的主方法里面,我们定义了一个颜色更加鲜艳的旗子用来实现用户的循环操作。当在菜单页面输入的数字为0时,redflag就为0,这时系统结束。在每一次的循环中都打印出菜单和等待用户输入操作对应的数字。
好滴,到这里学生信息系统创建完毕了,剩下的就是细节上的优化了,这一部分就不再给出。下面附上完整代码
package com.zzu.heiya.homework;
import java.util.Scanner;
public class Hw {
public static void main(String[] args) {
int count = 1;
int redFlag = 1;
Stu a[] = new Stu[1];
a[0] = new Stu("84G0235", "小雅", "女", 18, 89);
Scanner scan = new Scanner(System.in);
Hw test = new Hw();
System.out.println("欢迎来到学生信息管理系统");
while (redFlag == 1) {
test.putMenu();
int data0 = scan.nextInt();
switch (data0) {
case 0:
redFlag = 0;
break;
case 1:
test.putAllStu(a, count);
break;
case 2:
a = test.inPutStu(a, count,scan);
count++;
// 如果数组中已实例化元素个数等于a的长度,扩容
break;
case 3:
test.selectStu(a, count, scan);
break;
case 4:
a = test.reSetStu(a, count , scan);
break;
case 5:
a = test.delete(a, count, scan);
count--;
break;
}
}
}
void putMenu() {
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("5.删除学生信息");
System.out.println("0.退出系统");
}// 显示所有学生信息。
Stu[] putAllStu(Stu a[], int count) {
for (int i = 0; i < count; i++) {
System.out.print(i + 1 + ":");
System.out.print("学号:" + a[i].getStuNum());
System.out.print(" 姓名:" + a[i].getName());
System.out.print(" 性别:" + a[i].getGender());
System.out.print(" 年龄:" + a[i].getAge());
System.out.println(" 成绩:" + a[i].getMark());
}
return a;
}// 显示所有学生信息。
Stu[] inPutStu(Stu a[], int count,Scanner scan) {
if (count == a.length) {
a = Hw.newArray(a);
}
System.out.println("请输入录入学生学号:");
String newStuNum = scan.next().trim();
System.out.println("请输入录入学生姓名:");
String newName = scan.next().trim();
System.out.println("请输入录入学生性别:");
String newGender = scan.next().trim();
while (true) {
if (newGender.equals("男") || newGender.equals("女")) {
break;
} else {
System.out.println("输入有误,重新输入");
newGender = scan.next();
}
}
System.out.println("请输入录入学生年龄:");
int newAge = scan.nextInt();
System.out.println("请输入录入学生成绩:");
int newMake = scan.nextInt();
a[count] = new Stu(newStuNum, newName, newGender, newAge, newMake);
return a;
}// 录入学生信息。
void selectStu(Stu a[], int count ,Scanner scan) {
System.out.println("请输入要查找的学生姓名:");
String name = scan.next().trim();
for (int i = 0; i < count; i++) {
if (a[i].getName().equals(name)) {
System.out.print("学号:" + a[i].getStuNum());
System.out.print(" 姓名:" + a[i].getName());
System.out.print(" 性别:" + a[i].getGender());
System.out.print(" 年龄:" + a[i].getAge());
System.out.print(" 成绩:" + a[i].getMark());
System.out.println(" 在系统中的位置为:" + i);
return ;
}
}
System.out.println("查无此人");
return ;
}// 查找学生信息。
Stu[] reSetStu(Stu a[], int count,Scanner scan) {
System.out.println("请输入要修改的学生学号:");
String stuNum = scan.next().trim();
for (int i = 0; i < count; i++) {
if (a[i].getStuNum().equals(stuNum)) {
System.out.println("您将要修改的学生信息如下:");
System.out.print("学号:" + a[i].getStuNum());
System.out.print(" 姓名:" + a[i].getName());
System.out.print(" 性别:" + a[i].getGender());
System.out.print(" 年龄:" + a[i].getAge());
System.out.println(" 成绩:" + a[i].getMark());
System.out.println("请选择您要修改的项目,输入0退出");
System.out.println("1.学号:");
System.out.println("2.姓名:");
System.out.println("3.性别:");
System.out.println("4.年龄:");
System.out.println("5.成绩:");
int flag = 1;
while (flag != 0) {
flag = scan.nextInt();
switch (flag) {
case 1:
System.out.println("请输入新的信息");
String newStuNum = scan.next();
a[i].setStuNum(newStuNum);
break;
case 2:
System.out.println("请输入新的信息");
String newName = scan.next();
a[i].setStuNum(newName);
break;
case 3:
System.out.println("请输入新的信息");
String newGender = scan.next();
while (true) {
if (newGender.equals("男") || newGender.equals("女")) {
break;
} else {
System.out.println("输入有误,重新输入");
newGender = scan.next();
}
}
a[i].setStuNum(newGender);
break;
case 4:
System.out.println("请输入新的信息");
int newAge = scan.nextInt();
a[i].setAge(newAge);
break;
case 5:
System.out.println("请输入新的信息");
int newMark = scan.nextInt();
a[i].setMark(newMark);
break;
default:
System.out.println("请输入正确数字");
}
System.out.println("请继续选择您要修改的项目,输入0退出");
}
System.out.println("您修改后的学生信息如下:");
System.out.print("学号:" + a[i].getStuNum());
System.out.print(" 姓名:" + a[i].getName());
System.out.print(" 性别:" + a[i].getGender());
System.out.print(" 年龄:" + a[i].getAge());
System.out.println(" 成绩:" + a[i].getMark());
return a;
}
}
System.out.println("系统中无此学生");
return a;
}// 修改学生信息。
Stu[] delete(Stu a[], int count,Scanner scan) {
System.out.println("请输入要删除的学生学号:");
String stuNum = scan.nextLine();
for (int i = 0; i < count; i++) {
if (a[i].getStuNum().equals(stuNum)) {
for (int j = i + 1; j < count; j++) {
a[j - 1] = a[j];
}
return a;
}
}
System.out.println("系统中无此学生");
return a;
}// 删除学生信息
static Stu[] newArray(Stu a[]) {
Stu[] newArray = new Stu[a.length + a.length];
for (int i = 0; i < a.length; i++)
newArray[i] = a[i];
return newArray;
}
}// 数组扩容
public class Stu {
private String stuNum ;//学生学号
private String name;//学生姓名
private String gender;//学生性别
private int age;//学生年龄
private int mark;//学生成绩
public Stu(String stuNum,String name,String gender,int age,int mark) {
this.stuNum = stuNum;
this.name = name;
this.gender = gender;
this.age = age;
this.mark = mark;
}//构造方法
public String getStuNum() {
return stuNum;
}
public void setStuNum(String stuNum) {
this.stuNum = stuNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
if(gender != "男"&&gender != "女") {
System.out.println("输入有误,重新操作");
return ;
}
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getMark() {
return mark;
}
public void setMark(int mark) {
this.mark = mark;
}
}
一千个人眼里有一千个哈姆雷特,这里只是提供了一种系统的实现方法作为参考学习。大家加油