以下记录来自一个菜鸟,请大佬们见谅
2019.4.6 16:49,已经在电脑前坐了将近五个小时的我将个人第一个java优化系统调试完成,五个小时,只是将已经写好的系统进行优化,起初开始优化的时候觉得这简直是个无底洞,要考虑的东西太多太细(忽然想起一位java老师曾说过,“永远不要相信你的用户都是正常人”,言外之意就是要考虑到用户各种各样稀奇古怪的操作),而且不同类之间的分工很难协调,初步估算工程量比我原本写出系统的量还大,在这五个小时大脑周围一直有几个声音围着我转:“睡一会吧”、“去##的**系统”、“这##是人干的事吗”。但当最后一个javac stuSystem.java后没有报错,所有的一切都变成了一个声音:“值得!”
以下附上(1)第一次实现功能的代码
(2)优化后的代码
(1)
import java.util.Scanner;
class Student {
String num;
String name;
String gender;
byte age;
byte grade;
}
class main{
public static void main(String[] args ){
System.out.println("欢迎使用学生信息管理系统");
Student stu[] = new Student[10];
int dataIndex = 0;
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("请选择操作");
System.out.println("0:退出系统");
System.out.println("1:输入学生信息");
System.out.println("2:查询学生信息");
System.out.println("3:修改学生信息");
System.out.println("4:删除学生信息");
//int opIndex = scan.nextInt();
int opIndex = scanner.nextInt();
switch(opIndex){
case 0:
System.exit(0);///退出系统
case 1:
Scanner scan = new Scanner(System.in);
Student stud = new Student();
System.out.println("请输入学生的学号");
stud.num = scan.next() ;///重点:scanner 的使用
System.out.println("请输入学生的姓名");
stud.name = scan.next() ;///加括号
System.out.println("请输入学生的性别");
stud.gender = scan.next() ;
System.out.println("请输入学生的年龄");
stud.age = scan.nextByte() ;
System.out.println("请输入学生的成绩");
stud.grade = scan.nextByte() ;
stu[dataIndex] = stud;
dataIndex++;
break;
case 2:
System.out.println("请输入要查询学生的姓名");
Scanner sc = new Scanner(System.in);
String nam = sc.next();
int numb = -1;
for(int i = 0; i <dataIndex ; i++){
if(stu[i].name .equals(nam)){
numb = i;
}
}
if(numb >=0){
System.out.println("该学生的学号为:" + stu[numb].num);
System.out.println("该学生的性别为:" + stu[numb].gender);
System.out.println("该学生的年龄为:" + stu[numb].age);
System.out.println("该学生的成绩为:" + stu[numb].grade);
}
else{
System.out.println("不存在该学生!!");
}
break;
case 3:
System.out.println("请输入要修改信息学生的姓名");
Scanner sc1 = new Scanner(System.in);//sc不能重复定义
String nam1 = sc1.next();///nam不能重复定义
int numb1 = -1;
for(int i = 0; i <dataIndex ; i++){
if(stu[i].name .equals(nam1)){
numb1 = i;
}
}
if(numb1 >= 0){
System.out.println("请输入学生的学号");
stu[numb1].num = sc1.next() ;
System.out.println("请输入学生的姓名");
stu[numb1].name = sc1.next() ;
System.out.println("请输入学生的性别");
stu[numb1].gender = sc1.next() ;
System.out.println("请输入学生的年龄");
stu[numb1].age = sc1.nextByte() ;
System.out.println("请输入学生的成绩");
stu[numb1].grade = sc1.nextByte() ;
}
else{
System.out.println("不存在该学生!!");
}
break;
case 4:
System.out.println("请输入要删除信息学生的姓名");
Scanner sc2 = new Scanner(System.in);
String nam2 = sc2.next();
int numb2 = -1;
for(int i = 0; i <dataIndex ; i++){
if(stu[i].name .equals(nam2)){
numb2 = i;
}
if(numb2 >= 0){
for(i= numb2;i<dataIndex;i++){
stu[i] = stu[i+1];
}
dataIndex --;
}
else{
System.out.println("不存在该学生!!");
}
}
}
///数组的增长
if(dataIndex == stu.length){
Student newstu[] = new Student[stu.length + stu.length>>1];
for(int i = 0;i < stu.length ;i++){
newstu[i] = stu[i];
}
stu = newstu;
}
}
}
}
///成员变量和局部变量
/*****************************************
设计思路
1、输入:
(1)无限循环输入
(2)根据用户操作停止输入
(3)输入时先输入到一个对象中然后赋值给数组
(4)注意要用一个index来记录该输入第几个数组了
(5)用函数来进行输入等操作
输入时在主函数里定义一个成员变量
2、查询:
(1)遍历数组再遍历对象
3、修改学生信息
(1)
4、删除学生信息
(1)进行覆盖
问题:
(1)其他类里的局部变量怎么引入到main里?
是不是可以直接在其他class里给main里的变量赋值?否
*****************************************/
(2)
import java.util.Scanner;
class Student{
Student(){
}
Student (String stuNo, String stuName, String gender, byte age, int score){
this.stuNo = stuNo;
this.stuName = stuName;
this.gender = gender;
this.age = age;
this.score = score;
}
String stuNo;
String stuName;
String gender;
byte age;
int score;
}
class StuData{
Student stuArray[] = new Student[10];
int dataindex = 0;
void insertStu(Student stu){
if(dataindex == stuArray.length){
Student newArray[] = new Student[stuArray.length + (stuArray.length >> 1)];
for(int i = 0; i<dataindex; i++){
newArray[i] = stuArray[i];
}
stuArray = newArray;///赋值时不用加[]
}
stuArray[dataindex] = stu;
dataindex++;
}
Student checkStuNo(String stuNo){
for(int i = 0; i < dataindex; i++){
if(stuArray[i].stuNo.equals(stuNo)) ///.equals
{
return stuArray[i];
}
}
return null;
}
void delateStu(String stuNo){///错误:找不到符号 有可能是大小写的问题,只要双击不论大小写只要拼写相同就变绿
boolean flag = false;
for(int i = 0; i < dataindex; i++){
if (stuArray[i].stuNo.equals(stuNo)){
stuArray[i] = stuArray[i + 1];
flag = true;
}
}
if(flag){
dataindex--;
}
}
void updateStu(Student stu){
for(int i = 0; i < dataindex; i++){
if(stuArray[i].stuNo.equals(stu.stuNo)){
stuArray[i] = stu;
}
}
}
void printStu(Student stu){
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
System.out.print("学生编号 " + stu.stuNo + " ");
System.out.print("学生姓名 " + stu.stuName + " ");
System.out.print("学生性别 " + stu.gender + " ");
System.out.print("学生年龄 " + stu.age + " ");
System.out.println("学生成绩 " + stu.score + " ");
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
void printAllstuInf(){
for(int i = 0; i < dataindex; i++){
printStu(stuArray[i]);
}
}
}
class StuSys{
StuData stud = new StuData();
void insertStu(Scanner scanner){
System.out.println("请输入学生的学号 姓名 性别 年龄 成绩(输入出用空格分开):");
String stuNo = scanner.next();
String stuName = scanner.next();
String gender = scanner.next();
byte age = scanner.nextByte();
int score = scanner.nextInt();
int i = 0;
if(stud.checkStuNo(stuNo) == null){
Student stu = new Student(stuNo, stuName, gender, age, score);
stud.insertStu(stu);
System.out.println("学生信息添加成功!!!");
}
else{
System.out.println("您输入的学生编号已存在,请选择下一步操作");
System.out.println("1、继续添加 2、退出系统");
i = scanner.nextInt();
if(i == 1){
insertStu(scanner); ///递归
}
else if(i == 2){
System.exit(0);
}
else{
System.out.println("您输入的数据不合规!!!");
}
}
}
void delateStu(Scanner scan){
int i = 0;///可以重复使用i吗
System.out.println("请输入要删除学生的编号:");
String stuNo = scan.next();
if(stud.checkStuNo(stuNo) != null){
stud.delateStu(stuNo);
System.out.println("学成信息删除成功!!!");
}
else {
System.out.println("您输入的学号不存在,请选择下一步操作");
System.out.println("1、继续删除 2、退出系统");
if(i == 1){
delateStu(scan);
}
else if(i == 2) {
System.exit(0);
}
else{
System.out.println("您输入的数据不合规!!!");
}
}
}
void updateStu(Scanner scanner){
int i = 0;
System.out.println("请输入要修改的学生的编号:");
String stuNo = scanner.next();
Student stu = new Student();
///非要等与null吗??调试后的总结:1不能直接= new student 因为构造方法里没有student() (无参数的构造方法)
///解决方法:加一个无参的构造方法
if(stud.checkStuNo(stuNo) != null){
System.out.println("请输入学生的姓名 性别 年龄 成绩 (输入时用空格分开)");
stu.stuNo = stuNo;
stu.stuName = scanner.next();
stu.gender = scanner.next();
stu.age = scanner.nextByte();
stu.score = scanner.nextInt();
stud.updateStu(stu);
System.out.println("学生信息修改成功!!!");
}
else{
System.out.println("您输入的学生编号不存在,请选择下一步操作");
System.out.println("1、继续修改 2、退出系统");
i = scanner.nextInt();
if(i == 1){
insertStu(scanner);
}
else if(i == 2){
System.exit(0);
}
else{
System.out.println("您输入的数据不合规!!!");
}
}
}
void showStuInfo(Scanner scanner){
int i = 0;
Student stu = new Student();
System.out.println("请输入查看学生的编号");
String stuNo = scanner.next();
if((stu = stud.checkStuNo(stuNo)) != null){
stud.printStu(stu);
}
else{
System.out.println("您输入的学号不存在,请选择下一步操作");
System.out.println("1、继续查看 2、退出系统");
i = scanner.nextInt();
if(i == 1){
showStuInfo(scanner);
}
else if(i == 2){
System.exit(0);
}
else{
System.out.println("您输入的数据不合规!!!");
}
}
}
void showAllStuInfo(){
stud.printAllstuInf();
}
}
class Main{
public static void main(String[] strs){
System.out.println("欢迎使用tyrantfor的学生管理系统");
Scanner scan = new Scanner(System.in);
Main main = new Main();
StuSys s1 = new StuSys();
while(true){
main.showMenu();
switch(scan.nextInt()){
case 0:
System.exit(0);
case 1:
s1.insertStu(scan);
break;
case 2:
s1.delateStu(scan);
break;
case 3:
s1.updateStu(scan);
break;
case 4:
s1.showStuInfo(scan);
break;
case 5:
s1.showAllStuInfo();
break;
default:
System.out.println("输入数据不合规!!!");
}
}
}
void showMenu(){
System.out.println("请选择操作:\n\n");
System.out.println("1:增加学生信息");
System.out.println("2:删除学生信息");
System.out.println("3:修改学生信息");
System.out.println("4:根据学号查看学生信息");
System.out.println("5:查看所有学生信息");
System.out.println("0:退出系统");
}
}