20145221 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)

实验要求

  • 使用JDK编译、运行简单的Java程序;
  • 使用IDEA 编辑、编译、运行、调试Java程序。

实验内容

  • 命令行下Java程序开发
  • IDEA下Java程序开发、调试
  • 练习(通过命令行和IDEA两种方式实现,在IDEA下练习调试程序)
  • 实现四则运算,并进行测试

实验步骤(实现四则运算,并进行测试)

前期准备

  1. 预先安装好JDK,并配置好环境变量,相关操作在 Hello Java ! 中已经进行了说明;
  2. 继续下载idealC-2016.1.1,安装完毕后在IDEA界面中配置JDK,为后期运行IDEA调试程序做准备。

需求分析

  1. 四则运算,即要实现基本的加、减、乘、除运算法则,并使结果能在屏幕上正确输出;
  2. 需要一个主类,设置主函数,提供输入、输出功能,实现计算功能;
  3. 需要一个“计算器”类,提供“加、减、乘、除”这样一个算法,供主函数调用;
  4. 需要一个测试类,对基本的易错的输入实例进行测试,检验功能完整性。

设计

  1. 计算器类的设计:
  • 该类不含主函数,仅供调用使用;
  • 设计私有成员变量resultflag,result用来记录各个功能函数的计算结果,flag用来判断除法运算是否合法;
  • 设计四个计算功能的函数,分别实现加减乘除功能,并通过this.result来返回计算结果,通过this.flag返回判断是否合法的结果;
  • 设计两个取值功能的函数,因为resultflag是私有成员变量,不能由别的类直接进行取值,所以设计两个取值的函数,分别为getResult()isFlag()
  1. 主类的设计:
  • 首先要定义接口:java.util.Scanner;,提供用户输入的功能;
  • 定义主函数,记录三个输入变量,分别是左右操作数(double型),以及中间的运算符(字符串型);
  • 定义计算器类类变量,实现调用计算器类的功能,针对不同的运算符调用不同功能的计算函数,进而实现计算;
  • 将结果进行输出。
  1. 测试类的设计:
  • 对一些易错的输入实例进行测试,需要调用主类;
  • 修改错误,完成测试。

代码实现 & 测试

IDEA环境下开发:

  1. 打开IDEA,创建包"lab01",将实验一所有代码放在该包下,便于编译运行调试;
  2. 分别创建class Calculatorclass CalculatorDemoclass CalculatorTest
  3. Calculator类代码:
public class Calculator {
        private double result;
        private boolean flag = true;
        public void add(double a, double b){
            this.result = a + b;
        }
        public void subtract(double a, double b){
            this.result = a - b;
        }
        public void multiply(double a, double b){
            this.result = a * b;
        }
        public void divide(double a, double b){
            if(b != 0)
                this.result = a / b;
            else
                this.flag = false;
        }
        public double getResult(){
            return result;
        }
        public boolean isFlag(){
            return flag;
        }
    }
    public class Calculator {
        private double result;
        private boolean flag = true;
        public void add(double a, double b){
            this.result = a + b;
        }
        public void subtract(double a, double b){
            this.result = a - b;
        }
        public void multiply(double a, double b){
            this.result = a * b;
        }
        public void divide(double a, double b){
            if(b != 0)
                this.result = a / b;
            else
                this.flag = false;
        }
        public double getResult(){
            return result;
        }
        public boolean isFlag(){
            return flag;
        }
    }
  1. CalculatorDemo类代码:
import java.util.Scanner;
    public class CalculatorDemo {
        public static void main(String[] args) {
            Scanner scanner1 = new Scanner(System.in);
            Scanner scanner2 = new Scanner(System.in);
            Scanner scanner3 = new Scanner(System.in);
            Calculator calculator = new Calculator();
            System.out.print("First Number:   ");
            double a = scanner1.nextDouble();
            System.out.print("Calculate Type:   ");
            String type = scanner2.next();
            System.out.print("Second Number:   ");
            double b = scanner3.nextDouble();
            switch (type){
                case "+":
                    calculator.add(a, b);
                    System.out.println(calculator.getResult());
                    break;
                case "-":
                    calculator.subtract(a, b);
                    System.out.println(calculator.getResult());
                    break;
                case "*":
                    calculator.multiply(a, b);
                    System.out.println(calculator.getResult());
                    break;
                case "/":
                    calculator.divide(a, b);
                    if(calculator.isFlag()) {
                        System.out.println(calculator.getResult());
                        break;
                    }
                default:
                    System.out.println("Error!");
            }
        }
    }
    import java.util.Scanner;
    public class CalculatorDemo {
        public static void main(String[] args) {
            Scanner scanner1 = new Scanner(System.in);
            Scanner scanner2 = new Scanner(System.in);
            Scanner scanner3 = new Scanner(System.in);
            Calculator calculator = new Calculator();
            System.out.print("First Number:   ");
            double a = scanner1.nextDouble();
            System.out.print("Calculate Type:   ");
            String type = scanner2.next();
            System.out.print("Second Number:   ");
            double b = scanner3.nextDouble();
            switch (type){
                case "+":
                    calculator.add(a, b);
                    System.out.println(calculator.getResult());
                    break;
                case "-":
                    calculator.subtract(a, b);
                    System.out.println(calculator.getResult());
                    break;
                case "*":
                    calculator.multiply(a, b);
                    System.out.println(calculator.getResult());
                    break;
                case "/":
                    calculator.divide(a, b);
                    if(calculator.isFlag()) {
                        System.out.println(calculator.getResult());
                        break;
                    }
                default:
                    System.out.println("Error!");
            }
        }
    }
  1. CalculatorTest类代码:
public class CalculatorTest {
        public static void main(String[] args) {
            final double TEST1 = 2.7;
            final double TEST2 = 0;
            boolean flag = true;
            Calculator calculator = new Calculator();
            calculator.add(TEST1,TEST2);
            if(calculator.getResult() != TEST1) {
                flag = false;
                System.out.println("test failed 1!");
            }
            calculator.subtract(TEST1,TEST2);
            if(calculator.getResult() != TEST1){
                flag = false;
                System.out.println("test failed 2!");
            }
            calculator.multiply(TEST1,TEST2);
            if(calculator.getResult() != TEST2) {
                flag = false;
                System.out.println("test failed 3!");
            }
            calculator.divide(TEST1,TEST2);
            if(calculator.isFlag() != false) {
                flag = false;
                System.out.println("test failed 4!");
            }
            if(flag)
                System.out.println("test passed!");
        }
    }
    public class CalculatorTest {
        public static void main(String[] args) {
            final double TEST1 = 2.7;
            final double TEST2 = 0;
            boolean flag = true;
            Calculator calculator = new Calculator();
            calculator.add(TEST1,TEST2);
            if(calculator.getResult() != TEST1) {
                flag = false;
                System.out.println("test failed 1!");
            }
            calculator.subtract(TEST1,TEST2);
            if(calculator.getResult() != TEST1){
                flag = false;
                System.out.println("test failed 2!");
            }
            calculator.multiply(TEST1,TEST2);
            if(calculator.getResult() != TEST2) {
                flag = false;
                System.out.println("test failed 3!");
            }
            calculator.divide(TEST1,TEST2);
            if(calculator.isFlag() != false) {
                flag = false;
                System.out.println("test failed 4!");
            }
            if(flag)
                System.out.println("test passed!");
        }
    }
  1. 调试
  • IDEA中调试很简单,Ctrl+Shift+F10,即可编译运行;
  • IDEA可以边编译边纠错,所以编译运行时没有发现什么错误;
  • 不过通过帮助同学,学到了断点调试单步执行等方法,可以让JVM只编译你选中的部分,对其中的语法错误可以一句一句纠错,使得发现解决问题的时间大大提高,在此之前,只是按一下编译的按钮,出现错误,逐句查找,比较费时费力。

命令行下开发:

  1. 代码如上,在DOS命令行下编译执行该代码;
  2. 编译 & 执行:
  • 在编译时因为该三个类钧属于包lab01下,所以编译时不能直接javac *.java,这样虽然编译可以通过,但执行的时候无论输入以下哪种代码都会出现如下报错,提示找不到或者无法加载主类Calculator:
  • java应用编程实践报告 java程序设计实践报告_操作系统

  • 所以在编译CalculatorDemo.java文件时,须在命令行下输入以下指令:javac -d . *.java,这样,JVM会把编译生成的.class文件放在文件夹lab01中,执行时输入指令:java lab01.CalculatorDemojava lab01.CalculatorTest即可运行以上文件。
  • java应用编程实践报告 java程序设计实践报告_java应用编程实践报告_02

分析总结(遇到问题及解决办法)

  • 拿到题目后,看见是四则运算,觉得很简单,实现加减乘除不就行了,甚至函数都不用编写,直接通过Java中的运算操作符,然后打印结果不就OK了,不过考虑到实验是实践代码的最好机会,所以就准备运用自己所学,设计一台计算器。
  • 问题一:在设计Calculator类时,其中有一个除法功能,当时没顾虑太多,最后想着如果人家输入的除数为0怎么办?这样,就必定要在divide()函数中加一些别的“特征”,来告诉调用者除法输入参数不合法!所以考虑到了常用的boolean型变量flag,先判断除数是否为0,如果为0,则不再进行除法运算,使flag置为flase;如果不为0,继续除法运算,flag为初始化的值true。这样调用者可以通过isFlag()函数的返回值来判断是否输入有误。
  • 问题二:习惯了IDEA的集成开发环境,渐渐对传统的命令行陌生了。为了代码管理的需要,我将本次实验的三个类全部放在了包lab01中,这就使得用命令行编译时要注意了。注意:不能直接使用javac命令编写,因为这三个类属于特定的包中,必须要用javac -d指令,这样编译的.class文件才能被java指令执行。
  • 问题三:仍然是命令行中出现的问题,不能单独编译一个Calculator.java文件(其中含有Calculator类变量),由于刚开始对这一点比较模糊,编译器反复提示“找不到或者无法加载主类”,最后才明白是因为Calculator类根本没有编译,JVM上哪去识别它呢,所以要将Calculator类与CalculatorDemo类一起编译才行,执行javac -d . *.java指令。

其他(感悟、思考等,可选)

  • 这是Java第一次做实验,,也是自己第一次使用对象封装调用等完成了一个简单的小程序。结果可能不重要,因为实现加减乘除并不是很难的一个程序,重要的是在实现计算器功能的同时,让我运用了平时学到的知识,将知识第一次付诸于实践。原本对书本并不理解的知识点,在这次实验中运用了一遍理解就更深刻了,比如在本次实验中用到的对对象封装的技巧,设计出了一个“计算器”,它拥有加减乘除的基本功能,同时也能对输入的对错加以简单的判断。
  • 这次实验也让我感到一些不安,因为自己并不能完全独立的完成本次实验。在代码实现的阶段中,有部分经常就忘记怎么敲了,不能确定是否如此,或者IDEA报了错,看着错误类型不知道怎么处理,只知道书中某一页好像讲了这个知识,所以自己只好重新翻课本寻求答案。这说明,在平时的学习过程中,看人家代码容易,自己手敲代码还是一件比较费力的事。读懂代码和会敲代码是两码事,所以要在读懂代码的基础上,多实践,锻炼自己敲代码的能力。

PSP(Personal Software Process)时间:

步骤

耗时

百分比

需求分析

10min

10%

设计

20min

20%

代码实现

40min

40%

测试

15min

15%

分析总结

15min

15%