①关于学生类,单独定义一个Class文件,专门保存信息
②以数组保存数据的话,就是要求刚开始创建的是一个数组形式
③可以实现添加,删除,修改,查询,遍历功能。
即要求首先所有的数据,有地方可以存储,并且随时可以查询,并且进行修改。
1.首先做一个主方法,在进入系统后,提示进入系统,并且指引操作。获得输入值后,需要对输入值,进行判断,不符合要求,则需要进行重新输入。如果功能正确,因为功能比较多,所以用Switch来进行选择功能。
2.主方法做完之后,需要做功能页面。
3.在功能的同时,将学生类进行编写。
静态代码块执行先于非静态代码块:
①静态方法不能"直接"调用非静态方法,可以间接通过创建该方法(指非静态方法)所在类的对象来调用;非静态方法可以直接调用静态方法;
②静态代码块不能直接调用非静态方法,可以间接通过创建该方法(指非静态方法)所在类的对象来调用静杰代码块可以直调用静态方法;
③静态方法或者静态代码块不能直接使用非静态成员变量,可以间接通过创建该成员变量的对象来调用,静态方法或者静代块只能直接使用静变量;
一句话:静态的先于非静态的,所以静态的不能直接使用非静态的;但是非静态的可以直接使用静态的;静态的可以直接使用静态的;非静态的可以直接使用非静态的;
package StudentSystem;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
while(true) {//因为要一直进行系统执行,所以需要一直执行循环。
//首先进入系统,先提示欢迎进入学生管理系统,然后显示菜单。
System.out.println("欢迎进入Grit学生管理系统,请输入你想要执行的操作");
System.out.println("1.填加学生信息,请输入:1");
System.out.println("2.删除学生信息,请输入:2");
System.out.println("3.修改学生信息,请输入:3");
System.out.println("4.查询学生信息,请输入:4");
System.out.println("5.显示学生信息,请输入:5");
//获得输入的值,并且进行判断,是否符合要求。
Scanner a = new Scanner(System.in);
int Num = a.nextInt();
if(Num<0 || Num>5) {
System.out.println("您想要执行的操作不符合要求,请重新输入");//不符合要求,需要重新返回循环
}
else {
//符合要求,进行功能筛选
switch(Num) {
case 1 :{//增加学生信息
Menu.add();
break;
}
case 2 :{//删除个人信息
Menu.delet();
break;
}
case 3 :{//修改个人信息
Menu.remove();
break;
}
case 4 :{//查询个人信息
Menu.search();
break;
}
case 5 :{//显示个人信息
Menu.show();
break;
}
}
}
}
}
}
ackage StudentSystem;
import java.util.Scanner;
public class Menu {
static String [] Array = new String [5] ;
//1.增加学生信息
public static void add() {
System.out.println("欢迎进入学生信息添加功能,请按要求依次进行操作");
System.out.println("1.请输入你想要添加的学生学号:");
Scanner b = new Scanner(System.in);
String Id = b.nextLine();
Array [0] = Id;
System.out.println("2.请输入你想要添加的学生姓名:");
Scanner c = new Scanner(System.in);
String Name = c.nextLine();
Array [1] = Name;
System.out.println("3.请输入你想要添加的学生年龄:");
Scanner d = new Scanner(System.in);
String Year = d.nextLine();
Array [2] = Year;
System.out.println("4.请输入你想要添加的学生性别:");
Scanner e = new Scanner(System.in);
String Sex = e.nextLine();
Array [3] = Sex;
System.out.println("5.请输入你想要添加的学生绩点(0-4):");
Scanner f = new Scanner(System.in);
String Score = f.nextLine();
Array [4] = Score;
Student.addinf();
}
//2.删除学生信息
public static void delet() {
Menu.show();
System.out.println("请输入你想要删除的学生编号为:");
Scanner g = new Scanner(System.in);
int Score = g.nextInt();//获得想要去除的编号
for(;Score *5 < Student.i-1+5 ;Score++) {
Student.Array1[(Score-1)*5]= Student.Array1[Score*5] ;
Student.Array1[(Score-1)*5+1]= Student.Array1[Score*5+1] ;
Student.Array1[(Score-1)*5+2]= Student.Array1[Score*5+2] ;
Student.Array1[(Score-1)*5+3]= Student.Array1[Score*5+3] ;
Student.Array1[(Score-1)*5+4]= Student.Array1[Score*5+4] ;
}
System.out.println("删除成功!!!");
}
//3.修改学生信息
public static void remove() {
Menu.show();
System.out.println("请输入你想要修改的学生编号为:");
Scanner h = new Scanner(System.in);
int Num2 = h.nextInt();//获得想要修改的编号
System.out.println("请输入你想要修改的学生信息对应数字为(1代表学号,2代表姓名,3代表年龄,4代表性别,5代表绩点):");
Scanner i = new Scanner(System.in);
int inf1 = i.nextInt();//获得想要修改的类型
System.out.println("请输入你想要修改的新学生信息为:");
Scanner k = new Scanner(System.in);
String inf2 = k.nextLine();//获得想要修改信息
int NUM = (Num2-1)*5+ inf1 - 1;
Student.Array1[NUM]=inf2;
System.out.println("您已修改完毕!!!");
}
//4.查询学生信息
public static void search() {
System.out.println("请输入你想要查询的学生信息为(任意输入一个学生的信息,如:学号,年龄,姓名等):");
Scanner l = new Scanner(System.in);
String inf3 = l.nextLine();//获得想要查询信息
for(int z= 0;z<Student.i ;z++) {
if (Student.Array1[z].equals(inf3) ) {
System.out.println("查询到信息如下:");
int j = ((z+1)/5)+1;
int Z = (j-1)*5;
System.out.print("序号:"+ j);
System.out.print("学号:"+Student.Array1[Z]);
System.out.print("姓名:"+Student.Array1[Z+1]);
System.out.print("年龄:"+Student.Array1[Z+2]);
System.out.print("性别:"+Student.Array1[Z+3]);
System.out.print("绩点:"+Student.Array1[Z+4]);
System.out.println();
break;
}
}
System.out.println("没有查询到相关信息");
}
//5.遍历学生信息
public static void show() {
int Num1 = Student.Array1.length;
for (int j=1;j<Num1+1;j=j+5) {
if(Student.Array1[j-1] != null ) {
int M = j/5 + 1;
System.out.print("序号:"+M);
System.out.print("学号:"+Student.Array1[j-1]);
System.out.print("姓名:"+Student.Array1[j]);
System.out.print("年龄:"+Student.Array1[j+1]);
System.out.print("性别:"+Student.Array1[j+2]);
System.out.print("绩点:"+Student.Array1[j+3]);
System.out.println();
}
}
}
}
package StudentSystem;
public class Student {
static int i = 0 ;
static String [] Array1 = new String [9999] ;
//添加信息进数组
public static void addinf () {
Array1[i] = Menu.Array[0];
Array1[i+1] = Menu.Array[1];
Array1[i+2] = Menu.Array[2];
Array1[i+3] = Menu.Array[3];
Array1[i+4] = Menu.Array[4];
i=i+5;
}
}
其实自己第一次写完这个代码,差不多用了有4个小时吧。当时其实过程挺艰辛的,因为说实话,对于对象这一节课,本来听得就迷迷糊糊,记得东西也不是很多,所以当看到要求以对象来进行创建,存储及修改,删除的时候,我自己会有一种惊恐的感觉,不知道咋下手。
然后真得做的时候,也会感觉到第一点就是:知识不牢固,很多东西需要翻自己记录的笔记,翻自己之前的博客;第二点:就是很多概念,会有点感觉模糊,就是我知道这个东西,但是要让我写出来,总是存在这样那样的问题,如果说自己去用Eclipse修改,或者根据错误提示,进行修正,会改正。但是如果纸写代码的话,就会感觉自己一定要出问题。第三点:就是对于Eclipse的一些便捷化操作,还是不太熟练,比如快捷创建循环体,快捷创建对象的调用,快捷的批量输出这些,还是不会用。全程考手打,是会记很牢,但是会很浪费时间,然后也容易出问题。
因为整个项目,代码会比较长,所以我会按照老师边写边讲,在博客中粘上部分代码,进行分析以及比较。
private String id;
private String name;
private String mobile;
private String address;
为了方便封装,体现私有性,所以选择用private修饰。 我其实当时自己写代码的时候,没想到用封装,因为没有这个意识。
在创建完成后,右键选择Source→Generate Getters and Setters(生成相应的Get方法跟Set方法)→选择我们刚才创建的几个。完成创建。
快捷打印:
Source右键→Generate toString()
直接输出打印对象,但是要对自动生成的代码,进行适量修改。
首先根据要求,提示用户,进行输入相关信息,并且保存信息。
System.out.println("请输入学号:");
String id = scan.next();
System.out.println("请输入姓名:");
String name = scan.next();
System.out.println("请输入手机号:");
String mobile = scan.next();
System.out.println("请输入地址:");
String address = scan.next();
在获得信息后,则需要使用set方法,将我们获得的信息设置到我们第一次创建的Student的类中。
比较快速的设置的步骤:
在Student类中,右键→Source→Generate Constructor using fileds(生成使用领域的构造函数)→选择我们要生成的即可。(记得把Super();删除)
在完成构造函数设置后,我们发现,在Main文件下的Student();报错,是因为我们生成了设置值的方法,却没有往里边放值,所以依次填入我们刚才设置的信息。
如下:
Student student = new Student(id,name,mobile,address);//创建一个新对象
设置好了之后,为了方便存值,我们需要设置一个变量,用来自增,帮助我们顺序存放学生信息;
首先他需要是static的,因为只有static才能在static里使用,同时由于我们做了封装,所以我们创建的变量为:
private static int index = 0 ;
所以我们每次生成一个新的student对象后,将他按顺序存入我们前边创建名叫clazz的班级,则可以表示为:
clazz[index]=student;
System.out.println("输入成功");
index++;
但是同时,我们也需要注意,因为我们设置的clazz是有容量上限,所以需要进行对index的判断,index的最大值应该是 clazz长度值-1;如果没到最大值,那么就正常运行,如果超过最大值,则提示已经没有容量。代码如下:
if (index<clazz.length) {
clazz[index] = student;
System.out.println("输入成功!");
index++;//为后续添加学生奠定基础
break;
}
System.out.println("没有添加位置了");
break;
由于我们对学生对象的查询,即显示学生的所有信息。
因此我们需要对学生进行唯一化,因此可以通过学号,对学生信息进行查询。
查询不到的上限是达到clazz长度值-1,并且没有一个相等;
如果查询到,则输出相应学生信息。
代码如下:
case 4 :{//查询个人信息
System.out.println("请输入学号:");
String id = scan.next();
//
for(int j =0 ; j<clazz.length;j++) {
if (clazz[j]==null ) {//如果值为空,意思就是后边没有存数,意味着我们不需要拿来判断,但是能进入到这一步,说明存有数的位置,已经比完了还没有找到,则不可能找不到了
System.out.println("没有查询到相关信息");
return;
}
if(clazz[j].getId().equals(id)) {//将输入的学号,与之前存储的学号进行比较,如果相同,则说明找到
System.out.println("学生信息如下:"+clazz[j]);
return;
}
}
System.out.println("没有查询到相关信息");
break;
}
但是
对学生对象的删除,也是要依靠学号,所以首先需要复制刚才查询的代码,值相等的情况,就是我们找到的情况,此时j就等于我们想要删除的位置。如果不是clazz数组的上限,而我们要做的只需要将后边的值向左移一位。如果是数组的上限,则我们只需要将其等于Null即可。
同时我们也需要注意,我们这也忽视了如果删除的位置不在上限,但是clazz数组存到上限,即我们【j+1】已经超出上限,不能拿来赋值,此时需要额外的判断,并且将其赋值为null,来解决该问题。
代码如下:
case 2 :{//删除个人信息
System.out.println("请输入学号:");
String id = scan.next();
//
for(int i =0 ; i<clazz.length;i++) {
if (clazz[i]==null ) {//如果值为空,意思就是后边没有存数,意味着我们不需要拿来判断,但是能进入到这一步,说明存有数的位置,已经比完了还没有找到,则不可能找不到了
System.out.println("没有查询到相关信息");
return;
}
if(clazz[i].getId().equals(id)) {//将输入的学号,与之前存储的学号进行比较,如果相同,则说明找到
if(i==clazz.length-1) {//如果是需要将上限删除,直接令其等于null即可
clazz[i]=null;
break;
}
for(int j = i; j<clazz.length-1;j++) {//如果需要删除的位置不是上限,则需要将位置左移。此处为Length-1是因为:在此移动中,是将后一位向前一位移动。
//如果存满,那么在上限位置,没有数可以移动,那么我们需要对上限赋值为null
clazz[j]=clazz[j+1]; //因为j+1代表下一个数的位置,而下一个数的位置最大是clazz.length-1。所以,j应该小于clazz.length-1。
if(clazz[j+1]==null) {
break;
}
if((j+1)==clazz.length-1) {
clazz[j+1]=null;
break;
}
}
System.out.println("删除成功");
return;
}
}
System.out.println("没有查询到相关信息");
break;
}
对学生对象的修改,也要依照我们的学号来进行搜索,如果搜索到,即意味着我们可以拿来修改,由于此时的clazz[j]直接对应相应的地址,我们可以直接setName等,直接进行修改。
此时老师代码里修改内容不包括学号,
因为是依靠学号来进行修改的,
再次修改可能会跟之前的进行重复,那其实可以推论我们只需要将设置ID前,通过查询的代码,判断是否合规即可。
老师代码如下:
case 3 :{//修改个人信息
System.out.println("请输入学号:");
String id = scan.next();
//
for(int j =0 ; j<clazz.length;j++) {
if (clazz[j]==null ) {//如果值为空,意思就是后边没有存数,意味着我们不需要拿来判断,但是能进入到这一步,说明存有数的位置,已经比完了还没有找到,则不可能找不到了
System.out.println("没有查询到相关信息");
return;
}
if(clazz[j].getId().equals(id)) {//将输入的学号,与之前存储的学号进行比较,如果相同,则说明找到
System.out.println("请输入新姓名:");
String name = scan.next();
clazz[j].setName(name);
System.out.println("请输入新手机号:");
String mobile = scan.next();
clazz[j].setMobile(mobile);
System.out.println("请输入新地址:");
String address = scan.next();
clazz[j].setAddress(address);
System.out.println("修改成功!");
return;
}
}
System.out.println("没有查询到相关信息");
break;
}
package TstudentSystem;
public class Student {
private String id;//为了方便封装,体现私有性,所以选择用private修饰
private String name;
private String mobile;
private String address;
public Student(String id, String name, String mobile, String address) {
this.id = id;
this.name = name;
this.mobile = mobile;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "学号:" + id + ", 名字:" + name +", 手机号:" + mobile + ", 地址:" + address ;
}
package TstudentSystem;
import java.util.Scanner;
public class Main {
private static int index = 0 ;
private static Student [] clazz = new Student[30]; //创建一个名叫班级的数组,数组是由30个对象(学生)构成的(数组长度)
public static void main(String[] args) {
System.out.println("欢迎进入学生管理系统,请输入你想要执行的操作");
while(true) {
menu(); //使主菜单一直执行。
}
}
static void menu() {
System.out.println("1.填加学生信息,请输入:1");
System.out.println("2.删除学生信息,请输入:2");
System.out.println("3.修改学生信息,请输入:3");
System.out.println("4.查询学生信息,请输入:4");
Scanner scan = new Scanner (System.in);
int option = scan.nextInt();//获得输入的操作信息
switch(option) {
case 1 :{//增加学生信息
System.out.println("请输入学号:");
String id = scan.next();
//判断学号是否合规
for(int i = 0; i<clazz.length;i++) {
if (clazz[i]==null) {//如果值为空,意思就是后边没有存数,意味着我们不需要拿来判断
break;//结束for循环
}
if(clazz[i].getId().equals(id)) {//将输入的学号,与之前存储的学号进行比较,如果相同,则说明学号重复
System.out.println("输入的学号重复,请重新输入");
return;
}
}
System.out.println("请输入姓名:");
String name = scan.next();
System.out.println("请输入手机号:");
String mobile = scan.next();
System.out.println("请输入地址:");
String address = scan.next();
Student student = new Student(id,name,mobile,address);//创建一个新对象
if (index<clazz.length) {
clazz[index] = student;
System.out.println("输入成功!");
index++;//为后续添加学生奠定基础
break;
}
System.out.println("没有添加位置了");
break;
}
case 2 :{//删除个人信息
System.out.println("请输入学号:");
String id = scan.next();
//
for(int i =0 ; i<clazz.length;i++) {
if (clazz[i]==null ) {//如果值为空,意思就是后边没有存数,意味着我们不需要拿来判断,但是能进入到这一步,说明存有数的位置,已经比完了还没有找到,则不可能找不到了
System.out.println("没有查询到相关信息");
return;
}
if(clazz[i].getId().equals(id)) {//将输入的学号,与之前存储的学号进行比较,如果相同,则说明找到
if(i==clazz.length-1) {//如果是需要将上限删除,直接令其等于null即可
clazz[i]=null;
break;
}
for(int j = i; j<clazz.length-1;j++) {//如果需要删除的位置不是上限,则需要将位置左移。此处为Length-1是因为:在此移动中,是将后一位向前一位移动。
//如果存满,那么在上限位置,没有数可以移动,那么我们需要对上限赋值为null
clazz[j]=clazz[j+1]; //因为j+1代表下一个数的位置,而下一个数的位置最大是clazz.length-1。所以,j应该小于clazz.length-1。
if(clazz[j+1]==null) {
break;
}
if((j+1)==clazz.length-1) {
clazz[j+1]=null;
break;
}
}
System.out.println("删除成功");
return;
}
}
System.out.println("没有查询到相关信息");
break;
}
case 3 :{//修改个人信息
System.out.println("请输入学号:");
String id = scan.next();
//
for(int j =0 ; j<clazz.length;j++) {
if (clazz[j]==null ) {//如果值为空,意思就是后边没有存数,意味着我们不需要拿来判断,但是能进入到这一步,说明存有数的位置,已经比完了还没有找到,则不可能找不到了
System.out.println("没有查询到相关信息");
return;
}
if(clazz[j].getId().equals(id)) {//将输入的学号,与之前存储的学号进行比较,如果相同,则说明找到
System.out.println("请输入新姓名:");
String name = scan.next();
clazz[j].setName(name);
System.out.println("请输入新手机号:");
String mobile = scan.next();
clazz[j].setMobile(mobile);
System.out.println("请输入新地址:");
String address = scan.next();
clazz[j].setAddress(address);
System.out.println("修改成功!");
return;
}
}
System.out.println("没有查询到相关信息");
break;
}
case 4 :{//查询个人信息
System.out.println("请输入学号:");
String id = scan.next();
//
for(int j =0 ; j<clazz.length;j++) {
if (clazz[j]==null ) {//如果值为空,意思就是后边没有存数,意味着我们不需要拿来判断,但是能进入到这一步,说明存有数的位置,已经比完了还没有找到,则不可能找不到了
System.out.println("没有查询到相关信息");
return;
}
if(clazz[j].getId().equals(id)) {//将输入的学号,与之前存储的学号进行比较,如果相同,则说明找到
System.out.println("学生信息如下:"+clazz[j]);
return;
}
}
System.out.println("没有查询到相关信息");
break;
}
default:
System.out.println("您输入的操作,不符合要求,请重新输入");
break;
}
}
}