南昌航空大學實驗報告
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);
}
}
}