在做以前的课程设计时,曾经用c语言设计过一个在doc窗口上的学生信息管理系统。与今天要介绍的Java版本学生成绩管理系统很相似,但是用c语言编写程序有它自己的弊端。c语言是面向过程的设计语言,而Java是面向对象的设计语言,代码量要比c简单些。但这并不是主要的区别,用面向过程与面向对象所编写的程序主要区别还是设计思路,这个在字面上也就体现出来了。下面我给大家介绍一下Java版的学生成绩管理系统的设计过程。

      程序的最终执行是要在控制台上显示的,这就需要有IO方法。在菜单栏通过选择不同的操作,来完成学生成绩的添加、查询、修改及退出。我要介绍的这个程序主要不是为了完成成绩管理功能,只是要把主要思路介绍给大家,所以功能不是很完善,只能处理一个学生的信息。好了闲话少说,进入代码实现阶段:

主程序的设计,Main

package menu.Menu;   

import com.dr.demo.menu.Menu;

public class Main {   
        public static void main(String[] args) {   
                new Menu();   
        }   
}

是不是很简单呀,说对了,程序的入口main里面只有一个实例化一个匿名Menu对象的操作。接下来就是Menu的编写了。

Menu类的设计。

package menu;

import util.InputDate;
import PersonOperate.PersonOperate;

public class Menu {
    InputDate input = null;
    public Menu(){
        input = new InputDate();//循环出现菜单
        while(true){
            this.show();
             }
        }

     //定义的菜单内容  

    public void show(){
         System.out.println("\t\t\t1、增加学生信息");   
         System.out.println("\t\t\t2、浏览学生信息");   
         System.out.println("\t\t\t3、修改学生信息");   
         System.out.println("\t\t\t4、退出系统");   
         System.out.print("\n\n请选择要使用的操作:"); 
         int temp = input.getInt();
         switch(temp){
         case 1:{
             new PersonOperate().add();//增加学生信息
             break;
         }
         case 2:{
             new PersonOperate().show();//浏览学生信息
             break;
         }
         case 3:{
             new PersonOperate().update();//修改学生信息
             break;
         }
         case 4:{
             System.out.println("是否推出系统Y/N");//退出系统
             String t = input.getString();
             if("Y".equals(t)||"y".equals(t))
             {
             System.out.println("系统退出!");   
             System.exit(1);    }
             else break;
         }
          default:{   
             System.out.println("输入的内容不正确");   
             break;   
     }   
         }
    }
}

当程序运行时,控制台主界面的设计就是这样的。需要说明的是,case语句中要实例化的类,及调用类的方法这些都是放在其他类中的,这体现了面向对象编程的一个特点,封装性。在主界面设计时,我们只需考虑要实现那些功能,具体功能放在其他类中实现。

PersonOperate类的设计。

package PersonOperate;

import person.Person;
import util.FileOperate;
import util.InputDate;

public class PersonOperate {
      private  InputDate input = null;
      public PersonOperate(){
          this.input = new InputDate();
      }

//完成具体的Person对象操作

      public void add(){
          System.out.println("请输入姓名:");
          String name = this.input.getString();
          System.out.println("请输入年龄");
          int  age = this.input.getInt();
          System.out.println("请输入成绩");
          float score = this.input.getFloat();

        //生成Person对象,把对象保存在文件中

          Person per = new Person(name,age,score);
          try{
              new FileOperate().save(per);

         //io操作层

           System.out.println("数据保存成功!");
          }catch(Exception e){
              System.out.println("数据保存失败!");
          }   
      }
      public void show(){

      //从文件中把内容读进来

          Person per = null;
          try{
              per = (Person)new FileOperate().read();
          }catch(Exception e){
              System.out.println("数据读取失败,请确定数据已经存入!");
          }
          if(per!=null){
              System.out.println(per);
          }
      }
      public void update(){
          Person per = null;
          try{
              per =(Person) new FileOperate().read();
          }catch(Exception e){
              System.out.println("数据读取失败,请确定数据已经存入!");
          }
          if(per!=null){
              System.out.println("请输入新姓名:(原姓名"+per.getName()+")");
              String name = this.input.getString();
              System.out.println("请输入新姓名:(原姓名"+per.getName()+")");
              int age = this.input.getInt();
              System.out.println("请输入新姓名:(原姓名"+per.getName()+")");
              float score = this.input.getFloat();

              //信息重新设置
              per.setAge(age);
              per.setName(name);
              per.setScore(score);
              try{
                  new FileOperate().save(per);
                  System.out.println("数据更新成功!");
              }catch(Exception e){
                  System.out.println("数据更新失败!");}
          }
      }
}

在PersonOperate类中设计了学生成绩的添加、查询、修改方法。这里我们看到,在这些方法里面又实例化了其他类的对象并调用了这些类中的方法。PersonOperate类在这里起承上启下的作用。它实例化并调用一些有关IO底层的类及方法。有关底层的东西是不变的,如果要添加其它功能,只需在PersonOperate类里在新增方法并在Menu里调用就可以。这样可以减小程序的维护。还能提高代码的可读性,易于查找程序中的错误。体现了面向对象设计的另一特点三层架构体系。下面就来实现底层的类。

FileOperate类与InputDate类:

package util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class FileOperate {
       public static final String Filename = "e:\\person.txt";//保存数据路径

//把对象保存在文件之中

   public void save(Object obj) throws Exception{
           ObjectOutputStream out = null;
           try{
               out = new ObjectOutputStream(new FileOutputStream(new File(Filename)));
               out.writeObject(obj);
           }catch(Exception e){
                     throw e;
           }finally{
               try{
                   out.close();
                   }catch(Exception e){}
               }
           }

//把对象从文件之中读出来
       public Object read() throws Exception{
           Object obj = null;
           ObjectInputStream input = null;
           try{
               input = new ObjectInputStream(new FileInputStream(new File(Filename)));
               obj = input.readObject();
           }catch(Exception e){
               throw e;
           }finally{
               try{
                   input.close();
                   }catch(Exception e){}
           }
             return obj;         
       }
    }

package util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputDate {
    private BufferedReader buf = null;
    public InputDate(){
        buf = new BufferedReader(new InputStreamReader(System.in));
    }
    public String getString(){
        String str = null;
        try{
            str = buf.readLine();
        }catch(IOException e){}
        return  str;
    }
    public int getInt(){
        int temp = 0;
        String str = null;
        boolean flag = true;
        while(flag){
            str = this.getString();
            if(!(str.matches("\\d+"))){
                System.out.println("输入的内容必须是整数,请重新输入:");
            }
            else{
                temp = Integer.parseInt(str);
                flag = false;
            }
        }
        return temp;
    }
    public float getFloat(){
        float temp = 0;
        String str = null;
        boolean flag = true;
        while(flag){
            str = this.getString();
            if(!(str.matches("\\d+?.\\d{1,2}"))){
                System.out.println("输入的内容必须是小数(小数点后两位),请重新输入:");
            }
            else{
                temp = Float.parseFloat(str);
                flag = false;
            }
        }
        return temp;
    }

}

上面定义的两个类是这个程序中对数据进行的最底层操作。分别完成向文件进行数据的读取与写入和从键盘读取数据进行功能的选取。每一个程序都有这部分,而且是很相似的,但再往上看就会有很大的不同。最后是有关学生的基本信息类的定义了,也是很简单的。

Person类的定义:

package person;

import java.io.Serializable;

public class Person implements Serializable{
    private String name;
    private int age;
    private float score;
    public Person(){}
    public Person(String name,int age,float score){
        this.name=name;
        this.age=age;
        this.score=score;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public float getScore() {
        return score;
    }
    public void setScore(float score) {
        this.score = score;
    }

//要重写toString方法
  public String toString(){
        return "姓名:"+this.name+",年龄:"+this.age+",成绩:"+this.score;
    }

}

好了,这个程序到此告一段落,虽然功能简单但是它体现的面向对象编程的最基本的思路,封装性,三层架构等等多么大的程序也是由这些思路构成的。只是本文没有涉及到数据库、多线程、web等技术,但在以后我会加入的。本文写得不清楚的地方,希望大家多多指点。