JAVA 学生管理系统(实战项目)(Static)

题目

在这里插入图片描述

思路

①关于学生类,单独定义一个Class文件,专门保存信息
②以数组保存数据的话,就是要求刚开始创建的是一个数组形式
③可以实现添加,删除,修改,查询,遍历功能。
即要求首先所有的数据,有地方可以存储,并且随时可以查询,并且进行修改。

具体步骤

1.首先做一个主方法,在进入系统后,提示进入系统,并且指引操作。获得输入值后,需要对输入值,进行判断,不符合要求,则需要进行重新输入。如果功能正确,因为功能比较多,所以用Switch来进行选择功能。
2.主方法做完之后,需要做功能页面。
3.在功能的同时,将学生类进行编写。

Static 关键字

静态代码块执行先于非静态代码块:
①静态方法不能"直接"调用非静态方法,可以间接通过创建该方法(指非静态方法)所在类的对象来调用;非静态方法可以直接调用静态方法;
②静态代码块不能直接调用非静态方法,可以间接通过创建该方法(指非静态方法)所在类的对象来调用静杰代码块可以直调用静态方法;
③静态方法或者静态代码块不能直接使用非静态成员变量,可以间接通过创建该成员变量的对象来调用,静态方法或者静代块只能直接使用静变量;
一句话:静态的先于非静态的,所以静态的不能直接使用非静态的;但是非静态的可以直接使用静态的;静态的可以直接使用静态的;非静态的可以直接使用非静态的;

自己第一次写的代码

Main:

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;
			}
			
	    }
	  }
	}
  }
}


Menu

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();
		}
		}
	}

}

Student

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的一些便捷化操作,还是不太熟练,比如快捷创建循环体,快捷创建对象的调用,快捷的批量输出这些,还是不会用。全程考手打,是会记很牢,但是会很浪费时间,然后也容易出问题。

对照老师的代码

因为整个项目,代码会比较长,所以我会按照老师边写边讲,在博客中粘上部分代码,进行分析以及比较。

1.首先进行Student类的创建

		private String id;
		private String name;
		private String mobile;
		private String address;

为了方便封装,体现私有性,所以选择用private修饰。 我其实当时自己写代码的时候,没想到用封装,因为没有这个意识。
在创建完成后,右键选择Source→Generate Getters and Setters(生成相应的Get方法跟Set方法)→选择我们刚才创建的几个。完成创建。
在这里插入图片描述
快捷打印:
Source右键→Generate toString()
在这里插入图片描述
直接输出打印对象,但是要对自动生成的代码,进行适量修改。

2.对学生对象的添加

首先根据要求,提示用户,进行输入相关信息,并且保存信息。

				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;

3.对学生对象的查询

由于我们对学生对象的查询,即显示学生的所有信息。
因此我们需要对学生进行唯一化,因此可以通过学号,对学生信息进行查询。
查询不到的上限是达到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;
			}

但是

4.对学生对象的删除

对学生对象的删除,也是要依靠学号,所以首先需要复制刚才查询的代码,值相等的情况,就是我们找到的情况,此时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;
			}

5.对学生对象的修改

对学生对象的修改,也要依照我们的学号来进行搜索,如果搜索到,即意味着我们可以拿来修改,由于此时的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;
			}

附: 老师的代码

Student

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 ;
		}
		

Main

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;
			}
		}
	}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值