南昌航空大学实验报告
2021 年 9 月 17 日
课程名称:面向对象程序设计B 实验名称: Java程序控制结构
学号: 姓名: 同组人:
指导教师评定: 签名:
一、实验目的
1、 1、熟悉Java开发及运行环境;
2、 掌握Java程序开发的基本步骤;
3、 了解Java+程序开发中的常见错误及其解决办法;
4、 了解IDE的调试手段和工具。
二、实验要求
1、对实验中要求的代码进行上机调试,完成实验指导书中全部实验内容。
2、编写实验报告。
三、实验步骤
1、 Java开发环境的配置
(1)在命令行下运行java –version及javac –version,查看机器上安装的Java版本并检查Java开发环境是否配置正确;
(2)如果环境配置不正确,请修改系统环境变量path配置开发环境。
2、 由单个类组成的Java程序的编写与运行;
(1)采用记事本编写下面所给的Java程序并保存为FirstProgram.java;
class Test{
public static void main(){
System.out.println("Hello,my first java program!");
}
}
(2)在命令行下运行javac FirstProgram.java,并根据出现的提示信息修改程序直至程序编译正确为止;
(3)在命令行下运行java FirstProgram,并根据出现的提示信息修改程序直至程序运行正确为止;
运行以及调试如下:1.在命令行下运行结果如下:
2.代码更正,将代码中的Test改为FirstProgram,main方法后的括号里加上String arg[],如图所示:
3、由多个类组成的Java程序的编写与运行;
(1)在FirstProgram.java中添加以下代码;
public class Another{
public void say(){
System.out.println("Another one.");
}
}
(2)使用javac命令编译程序,并根据出现的提示信息修改程序直至程序编译正确为止;
(3)使用java命令运行程序,并根据出现的提示信息修改程序直至程序运行正确为止。
运行及调试如下:
1.在命令行里运行里直接运行,报出一个错误,将class前面的public去掉,再次运行,只能输出Hello,my first java program,无法输出Another one:,在第一个类中进行调用,具体更改代码以及运行截图如下:
3、 调试程序,参考附件以及相关在线资料,调试以下程序。
(1)以下代码中有几处语法错误和逻辑错误,请修正下面代码的错误并输出结果。
package experiment_1;
import java.util.Scanner;
/**
* 分数的四则运算测试类
*/
public class FractionalCalculator {
public static void main(String[] args) {
Calculator cal;
// 输入分数内容和运算符
Scanner input = new Scanner(System.in);
System.out.println("请分部输入表达式");
System.out.println("请输入参数1的分子:");
String data1 = input.next();
System.out.println("请输入参数1的分母:");
String data2 = input.next();
System.out.println("请输入运算符(+-*/) :");
String operation = input.next();
System.out.println("请输入参数2的分子:");
String data3 = input.next();
System.out.println("请输入参数2的分母:");
String data4 = input.next();
// 运算并输出
System.out.println("运算结果为:");
cal.compute(data1,data2, operation,data3,data4);
}
}
/**
* 分数的四则运算类输入:两个以字符串构成的分数,输出其相加的结果,结果仍以分数行式表示。
*/
int numerator; // 分子
int denominator; // 分母
class Calculator {
/**设置分子分母
* 输入:正整数
* 输出:最简分数式,分子分母不包含公约数
*/
void setNumeratorAndDenominator(int a, int b){ // 设置分子和分母
int c = gcd(a,b); // 计算最大公约数
numerator = a / c
denominator = b / c;
}
int getNumerator(){
return numerator;
}
int getDenominator(){
return denominator;
}
/*greatest common divisor 求两整数最大公约数,
* 输入:两正整数a,b
* 输出:最大公约数b
*/
int gcd(int a,int b){
if(a < b){
int c = a;
a = b;
b = c;
}
int r = a % b;
while(r > 0){
a = b;
b = r;
r = a % b;
}
}
Calculator add(Calculator r){ // 加法运算
int a = r.getNumerator();
int b = r.getDenominator();
int newNumerator = numerator * b + denominator * a;
int newDenominator = denominator * b;
Calculator result = new Calculator();
result.setNumeratorAndDenominator(newNumerator, newDenominator);
return result;
}
Calculator add(Calculator r){ // 减法运算
int a = r.getNumerator();
int b = r.getDenominator();
int newNumerator = numerator * b - denominator * a;
int newDenominator = denominator * b;
Calculator result = new Calculator();
result.setNumeratorAndDenominator(newNumerator, newDenominator);
return result;
}
// 转化输入格式,判断并输出运算结果,代码中仅包含加法运算的内容,其他运算不用补齐,调试程序时注意只调试加法运算。
public static void compute(String data1,String data2,String operation,String data3,String data4){
int data1_1 = Math.abs(Long.parseLong(data1));
int data1_2 = Math.abs(Long.parseLong(data2));
int data2_1 = Math.abs(Long.parseLong(data3));
int data2_2 = Math.abs(Long.parseLong(data4));
Calculator r1 = new Calculator();
r1.setNumeratorAndDenominator(data1_2, data1_2);
Calculator r2 = new Calculator();
r2.setNumeratorAndDenominator(data2_1, data2_2);
Calculator result;
int a,b;
if(operation.equals("+")){
result = r1.add(r2);
a = result.getNumerator();
b = result.getDenominator();
System.out.println(data1+"/"+data2+" "+operation+" " +data3+"/"+data4+" = " + a + "/" + b);
}
}
}
运行及调试如下:1.输入代码测试如下图所示:(1)28行出现错误,更改应该将int numerator;int denominator;挪到第二个类当中去。
(2)42行末尾少了分号。
(3)缺少返回值;改正:在68以及69行之间加上return b;
(4)72与82行函数命名重复,下面的应该是减法函数,更改:将第二个add改为sub。
(5)这四点错误是应该强制改为int类型而不是long类型,应该将Long.parseLong都改为Integer.parseInt
(6)代码成功运行后,但是进行计算得出的结果有误如下图所示:
经过查看代码发现102行的代码第一个data1_2应该改为data1_1。
四、实验结果
第一个实验截图:
结论:如果文件中只有一个类,文件名必须与类名一致,以及方法后面的括号用于传参。
第二个实验截图:
结论:如果一个文件里有两个类,第二个类无需加public,同时可通过第一个类来调用第二个类。
第三个实验截图:
结论:代码书写要注意,以及可以借助eclipse工具来对代码进行调试分析。
五、实验小结
通过这次实验,了解一些代码书写命名规范比如说:如何在第一个类里调用第二个类,如何给文件命名,之前只是在课上与慕课上见老师演示,但是终归没有自己亲自动手体会的那么深刻。也初步学会了使用eclipse工具,能利用eclipse方便的对代码错误的地方进行调试。也通过上面的实验更加进一步了解了什么叫做一切皆对象,一切皆类。
遇到的问题:刚开始做一二两个实验时没法自己顺利的找到问题,还得重新翻一下慕课,说明上课与慕课上的知识并未充分记牢,但通过实验加深了我对这几个点的印象,也说明了学Java这门课还得边学边练才能记的更加清楚,学的更加牢固。
六、附录
package experiment_1;
import java.util.Scanner;
/**
* 分数的四则运算测试类
*/
public class FractionalCalculator {
public static void main(String[] args) {
Calculator cal=new Calculator();
// 输入分数内容和运算符
Scanner input = new Scanner(System.in);
System.out.println("请分部输入表达式");
System.out.println("请输入参数1的分子:");
String data1 = input.next();
System.out.println("请输入参数1的分母:");
String data2 = input.next();
System.out.println("请输入运算符(+-*/) :");
String operation = input.next();
System.out.println("请输入参数2的分子:");
String data3 = input.next();
System.out.println("请输入参数2的分母:");
String data4 = input.next();
// 运算并输出
System.out.println("运算结果为:");
cal.compute(data1,data2,operation,data3,data4);
}
}
/**
* 分数的四则运算类输入:两个以字符串构成的分数,输出其相加的结果,结果仍以分数行式表示。
*/
class Calculator {
int numerator; // 分子
int denominator; // 分母
/**设置分子分母
* 输入:正整数
* 输出:最简分数式,分子分母不包含公约数
*/
void setNumeratorAndDenominator(int a, int b){ // 设置分子和分母
int c = gcd(a,b); // 计算最大公约数
numerator = a / c;
denominator = b / c;
}
int getNumerator(){
return numerator;
}
int getDenominator(){
return denominator;
}
/*greatest common divisor 求两整数最大公约数,
* 输入:两正整数a,b
* 输出:最大公约数b
*/
int gcd(int a,int b){
if(a < b){
int c = a;
a = b;
b = c;
}
int r=0;
if(b!=0)
r = a % b;
while(r > 0){
a = b;
b = r;
r = a % b;
}
return b;
}
Calculator add(Calculator r){ // 加法运算
int a = r.getNumerator();
int b = r.getDenominator();
int newNumerator = numerator * b + denominator * a;
int newDenominator = denominator * b;
Calculator result = new Calculator();
result.setNumeratorAndDenominator(newNumerator, newDenominator);
return result;
}
Calculator sub(Calculator r){ // 减法运算
int a = r.getNumerator();
int b = r.getDenominator();
int newNumerator = numerator * b - denominator * a;
int newDenominator = denominator * b;
Calculator result = new Calculator();
result.setNumeratorAndDenominator(newNumerator, newDenominator);
return result;
}
// 转化输入格式,判断并输出运算结果,代码中仅包含加法运算的内容,其他运算不用补齐,调试程序时注意只调试加法运算。
public void compute(String data1,String data2,String operation,String data3,String data4){
int data1_1 = Math.abs(Integer.parseInt(data1));
int data1_2 = Math.abs(Integer.parseInt(data2));
int data2_1 = Math.abs(Integer.parseInt(data3));
int data2_2 = Math.abs(Integer.parseInt(data4));
Calculator r1 = new Calculator();
r1.setNumeratorAndDenominator(data1_1, data1_2);
Calculator r2 = new Calculator();
r2.setNumeratorAndDenominator(data2_1, data2_2);
Calculator result;
int a,b;
if(operation.equals("+")){
result = r1.add(r2);
a = result.getNumerator();
b = result.getDenominator();
System.out.println(data1+"/"+data2+" "+operation+" " +data3+"/"+data4+" = " + a + "/" + b);
}
}
}