113 專技高考高等考試 資訊技師 程式設計 考古題詳解

113 年・專技高考・高等考試・資訊技師
試題代碼 程式設計

第 一 題7 分

一位程式設計師為解決某一問題找到了一個有效但仍然相當複雜的演算法,因為程式執行完成所花費的時間非常重要,他根據過去所學得知:「在相同的執行環境下,針對同一演算法以 C++ 撰寫的程式其執行速度比以 Java 撰寫的程式來得快。」決定以 C++ 撰寫程式來實現所找到的演算法。請闡述為何會有上述引號內之說法。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查程式語言的執行效能與實作方式。C++ 通常先編譯成目標機器碼,再直接由處理器執行;Java 原始碼則先編譯成位元碼,由 Java 虛擬機(JVM)執行。兩種語言的編譯器、執行環境及執行期管理機制不同,因此在特定環境與工作負載下,C++ 程式常有較低的執行成本。

這是常見的效能概括,不是任何情況下都成立的定律;實際速度仍取決於程式寫法、編譯器最佳化、JVM 的即時編譯、記憶體管理及使用的函式庫等因素。

解題方法

作答時比較程式從原始碼到執行的流程,以及執行期間可能增加的成本:

  1. 編譯與執行方式 C++ 通常由編譯器將程式編譯為特定平台的原生機器碼,執行時可直接交由處理器執行。Java 則先編譯為平台中立的位元碼,再由 JVM 解譯或以即時編譯(JIT)轉為機器碼。JIT 能進行執行期最佳化,減少速度差距,但仍有 JVM 啟動、位元碼處理及執行期管理等成本。
🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 二 題7 分

下面所給 Java 程式有一錯誤以致無法成功編譯(interpreting),此錯誤落在某一行程式碼中。為讓此程式可以順利編譯執行產生輸出結果,請指出那一行程式碼敘述有誤,更正其錯誤,並詳述更正的理由。

import java.util.*;

public class P1 { int anInt = 0;

static void aMethod(int arr[]) {
    for (int i = 0; i < arr.length - 1; i++)
        for (int j = arr.length - 1; j > i; j--)
            if (arr[j] < arr[j - 1]) {
                int temp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = temp;
            }
    anInt++;
}

static void bMethod(int arr[]) {
    for (int i = 0; i < arr.length - 1; i++)
        for (int j = arr.length - 1; j > i; j--)
            if (arr[j] > arr[j - 1]) {
                int temp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = temp;
            }
    anInt++;
}

public static void main(String[] args) {
    Scanner inputObj = new Scanner(System.in);
    System.out.println("Enter the array size: ");
    int size = inputObj.nextInt();
    int[] intArry = new int[size];

    System.out.println("Enter the elements of the array: ");
    for (int i = 0; i < size; i++)
        intArry[i] = inputObj.nextInt();

    P1 callerObj = new P1();
    callerObj.aMethod(intArry);
    System.out.println(anInt + ". Array content: \n  " + Arrays.toString(intArry));
    callerObj.bMethod(intArry);
    System.out.println(anInt + ". Array content: \n  " + Arrays.toString(intArry));
}

}

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 Java 的靜態與實例成員存取規則,以及編譯器對變數作用範圍與方法宣告的檢查。

  • static 成員屬於類別,不必建立物件即可使用。
  • 非 static 成員屬於物件,必須透過物件存取。
  • static 方法中不能直接存取非 static 的實例欄位。

解題方法

先檢查程式中各欄位與方法的宣告,再確認它們在使用處是否符合靜態/實例存取規則。

欄位 anInt 宣告為:

int anInt = 0;

它是 P1 物件的實例欄位。aMethod 與 bMethod 都宣告為 static,但兩個方法內都直接執行:

anInt++;

這是在靜態方法中直接存取實例欄位,違反 Java 的存取規則,因此無法編譯。

此外,main 內也直接使用 anInt:

System.out.println(anInt + ...);

這同樣是在靜態方法中直接存取實例欄位。題目指出只有一行有誤,因此應以同一個根本原因修正欄位宣告:將 anInt 改為靜態欄位。

更正方式與理由

將原宣告:

int anInt = 0;
🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 三 題8 分

針對下面所給的 C++ 程式,若輸入是

11 5 −342 −20 −43 99 43 −4 11 −22 0 4 7 9 −111\ 5\ -342\ -20\ -43\ 99\ 43\ -4\ 11\ -22\ 0\ 4\ 7\ 9\ -1

皆不相同的數,輸出為何?並說明輸出的資料所代表的意義。

#include <iostream> using namespace std;

int main() { int N; int nNumbers[1000]; int numLarger[1000] = {0};

cin >> N;

for (int i = 0; i < N; i++)
    cin >> nNumbers[i];

for (int j = 0; j < N; j++) {
    for (int k = 0; k < N; k++)
        if (nNumbers[k] > nNumbers[j])
            numLarger[j]++;
}

int m;
cin >> m;

while (m > 0) {
    for (int i = 0; i < N; i++)
        if (m + numLarger[i] == N) {
            cout << nNumbers[i] << endl;
            break;
        }
    cin >> m;
}

return 0;

}

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考的是陣列、巢狀迴圈,以及如何用「比目前數字大的數量」表示數字在排序後的位置。

對每個 nNumbers[j],內層迴圈計算所有輸入數字中有幾個比它大,並存入 numLarger[j]。由於題目給定的數字皆不相同,若有 rr 個數字比某數字大,該數字由大到小排序後的位置就是第 r+1r+1 名。

解題方法

輸入的 N=11N=11,前 11 個數字為:

5, −342, −20, −43, 99, 43, −4, 11, −22, 0, 45,\ -342,\ -20,\ -43,\ 99,\ 43,\ -4,\ 11,\ -22,\ 0,\ 4

將數字由大到小排列:

99, 43, 11, 5, 4, 0, −4, −20, −22, −43, −34299,\ 43,\ 11,\ 5,\ 4,\ 0,\ -4,\ -20,\ -22,\ -43,\ -342

因此每個數字的 numLarger 值如下:

數字 nNumbers[i]比它大的數字個數 numLarger[i]
5566
−342-3421010
−20-2077
−43-4399
999900
434311
−4-466
111122
−22-2288
0055
🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 四 題8 分

針對下面所給的 C++ 類別(class)的定義,一程式設計師可以有(A)與(B)兩種使用方式。若某一函數(function)均有使用它們來建立物件,就此程式在編譯時、執行當中以及執行完畢後,詳述這兩種使用方式所建立的物件在記憶體配置與使用上之區別。

Class Person { public: void setFirstName(string fName); void setLastName(string lName); void setAge(int age);

private: string firstName; string lastName; int age; };

使用方式(A):

Person* aPerson = new Person(); aPerson->lastName = "ChangYang"; aPerson->firstName = "WenShiang";

使用方式(B):

Person aPerson; aPerson.lastName = "ChangYang"; aPerson.firstName = "WenShiang";

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 C++ 物件的儲存期、記憶體配置位置、生命週期與釋放方式。new 建立的物件具有動態儲存期;直接宣告的區域物件具有自動儲存期。

另須注意,題目中的 firstName、lastName、age 都是 private 成員,題示程式卻在類別外直接存取 firstName、lastName。因此,照題目原樣編譯,兩種寫法都會因違反存取權限而編譯失敗。以下在「將成員改為 public,或透過公開成員函數設定資料」的合理假設下,比較兩種物件使用方式。

解題方法

比較兩種寫法時,依序檢視:

  1. 編譯時:型別與存取權限是否合法。
  2. 執行時:物件配置位置、如何存取,以及生命週期。
  3. 函數結束後:物件是否自動銷毀,或是否仍需手動釋放。

使用方式(A):動態配置

Person* aPerson = new Person;
aPerson->lastName = "ChangYang";
aPerson->firstName = "WenShiang";

new Person 建立一個 Person 物件,並回傳指向該物件的指標。指標變數 aPerson 本身若在函數內宣告,通常具有自動儲存期;它所指向的物件則具有動態儲存期,一般由自由儲存區(常稱 heap)提供空間。

aPerson->lastName 等同於 (*aPerson).lastName,透過指標存取物件成員。函數結束時,區域指標變數會離開作用域,但它所指向的動態物件不會因此自動銷毀。若未執行 delete aPerson;,物件仍未釋放,且原指標離開作用域後,程式可能失去找到該物件的途徑,造成記憶體洩漏。

適當釋放方式為:

delete aPerson;

delete 會呼叫物件的解構函數並釋放其動態配置空間。若採用此寫法,應確保物件只被釋放一次,且釋放後不再使用該指標。

使用方式(B):自動配置

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 五 題20 分

下面所給為一 Java 程式,它的輸入檔 rsData.txt 包含一些以 0 與 1 所形成的字串,檔案中每一行(line)只包含一字串。就此程式,若輸入檔的內容如下所示,其輸出為何?並說明輸出的資料所代表的意義。

import java.io.; import java.util.; import java.util.concurrent.atomic.AtomicReference;

class rCalculator extends Thread { private List<String> inputLines; private int numRs; private int thdNumber; private char firstOrLastChar;

public rCalculator(List<String> inputLines, int thdNumber) {
    this.inputLines = inputLines;
    this.thdNumber = thdNumber;
    this.numRs = 0;
    this.lastChar = 0;
}

public int getNumRs() {
    return numRs;
}

public char getFirstOrLastChar() {
    return firstOrLastChar;
}

@Override
public void run() {
    String wholeStr = "";
    for (String ithStr: inputLines)
        wholeStr = wholeStr + ithStr;

    char prevChar = wholeStr.charAt(0);
    numRs++;

    for (int j = 1; j < wholeStr.length(); j++) {
        if (wholeStr.charAt(j) != prevChar) {
            numRs++;
            prevChar = wholeStr.charAt(j);
        }
    }

    if (thdNumber == 1)
        firstOrLastChar = wholeStr.charAt(wholeStr.length() - 1);
    else
        firstOrLastChar = wholeStr.charAt(0);

    System.out.println("Number of Rs = " + numRs + "  ---> Thread " + thdNumber);
}

}

public class rsOfString { public static void main(String[] args) { List<String> inputData = new ArrayList<>(); int lineCount = 0;

    try (BufferedReader br = new BufferedReader(new FileReader("rsData.txt"))) {
        String line;
        while ((line = br.readLine()) != null) {
            inputData.add(line);
            lineCount++;
        }
    } catch (IOException e) {
        e.printStackTrace();
        return;
    }

    List<String> inputForThread0 = inputData.subList(0, lineCount / 2);
    List<String> inputForThread1 = inputData.subList(lineCount / 2, lineCount);

    rCalculator thread0 = new rCalculator(inputForThread0, 0);
    rCalculator thread1 = new rCalculator(inputForThread1, 1);

    thread0.start();
    thread1.start();

    try {
        thread0.join();
        thread1.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    int totalNumRs = thread0.getNumRs() + thread1.getNumRs();

    if (thread0.getFirstOrLastChar() == thread1.getFirstOrLastChar())
        totalNumRs--;

    System.out.println("The total number of Rs = " + totalNumRs);
}

}

輸入檔(rsData.txt)內容:

01000101010000000001111111111 110001010001000000000000001001 110001000000000000001111111111 10000001111111111111111111111110

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查字串中連續相同字元區段的數量,也就是連續區段數(run)。例如 0011100 可分成 00、111、00 三個 run,因此 run 數為 3。

程式將輸入行分成兩組,各由一個執行緒計算其字串串接後的 run 數,再依兩組交界處的字元是否相同,修正總數。每個執行緒的 numRs 初始為 0;掃描字串時,第一個字元計為一個 run,每當字元與前一字元不同,就再增加一個 run。

解題方法

共有 4 行,lineCount / 2 = 2,所以分組如下:

  • thread0(執行緒編號 0):第 1、2 行
  • thread1(執行緒編號 1):第 3、4 行

各組會先把兩行直接串接,再計算連續區段數。串接時不會額外插入換行符號。

執行緒串接後的字串首尾run 數
001000101010000000001111111111 + 11000101000100000000000000100113
1110001000000000000001111111111 + 100000011111111111111111111111107

因此,兩個執行緒各自印出的行為:

Number of Rs = 13 ---> Thread 0
Number of Rs = 7 ---> Thread 1
🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 六 題20 分

下面所給為一以 C++ 定義的 Array class,請回答下列問題:

(一)為什麼 operator<< 運算子多載(operator overloading)不宜宣稱為 Array class 的一個成員函數(member function)?請詳述之。(5 分)

(二)為什麼 copy constructor 如 Array(const Array&) 的參數(parameter)必須是 reference type?請詳述之。(5 分)

(三)請撰寫一段 C++ 程式來實現成員函數 Array& operator-(const Array&)。此函數將兩個整數陣列 F 與 G 合併成一陣列 R。假設陣列 G 是這函數的參數(parameter),合併方式如下:(10 分)

  • F 中的整數按照順序一一複製到 R 中。
  • 接著 G 中的整數按照順序一一複製到 R 中,若此一整數不同時在 G 與 F 中。
  • 陣列 R 的大小(即 entry 的數量)需與所複製的整數數量一樣。

若所撰寫之程式碼中之陣列名稱不是用 F、G、R,請於答案中註明以何變數名稱分別來稱呼 F、G、R 陣列,未加以註明者,本子題不予計分。

此外,請就下面要點標示出所對應的程式碼,未加以標示者,本子題不予計分:

  • 決定陣列 R 的大小之程式碼。
  • 將陣列 F 的內容複製至陣列 R 的程式碼。
  • 將陣列 G 的內容複製至陣列 R 的程式碼。

#include <iostream> using namespace std;

class Array { friend ostream &operator<<(ostream &, const Array &); // output an array friend istream &operator>>(istream &, Array &); // input an array

public: Array(int = 10); // default constructor Array(const Array &); // copy constructor ~Array(); // destructor int getSize() const; // return array size const Array &operator=(const Array &); // assignment operator bool operator==(const Array &) const; // equality operator bool operator!=(const Array &right) const; // inequality operator int &operator; // subscript operator int operator const; // subscript operator Array &operator+(const Array &); // merge two arrays const Array &operator>>(int i); const Array &operator-(); Array &operator-(const Array &);

private: int size; // pointer-based array size int *ptr; // pointer to first element of pointer-based array };

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 C++ 的運算子多載、複製建構子,以及以動態配置陣列實作集合式合併。

  • 二元運算子的成員函數形式:左運算元是呼叫物件,右運算元是參數。例如 a - b 會呼叫 a.operator-(b)。
  • 二元運算子的非成員函數形式:左右運算元都由參數表示,例如 a << cout 對應 operator<<(a, cout);輸出串流 ostream 是左運算元。
  • 複製建構子:形式為 Array(const Array&),以另一個同型物件初始化新物件。
  • 題目中的 ptr 指向動態配置的整數陣列;合併結果應依實際要複製的元素數量配置空間。

(一)operator<< 不宜宣稱為 Array 成員函數

輸出運算式通常寫成:

cout << array;

對二元運算子而言,若它是 Array 的成員函數,左運算元必須是 Array 物件,呼叫形式會是:

array.operator<<(cout);

但實際運算式的左運算元是 cout,其型別為 ostream,不是 Array。因此,Array 成員函數無法自然地配合 cout << array 的運算元順序。

將它宣告為非成員函數後,兩個運算元便能依序作為參數:

ostream& operator<<(ostream& out, const Array& a);

此函數通常宣告為 Array 的 friend,讓它可以存取私有成員 size 與 ptr,以便輸出陣列內容。回傳 ostream& 則可支援串接輸出,例如 cout << array << endl。

(二)複製建構子的參數必須是參考型別

複製建構子若不使用參考,而寫成:

Array(Array other);

呼叫複製建構子時,必須先把傳入物件複製一份,才能將副本作為值傳入 other。但建立這份副本本身又需要呼叫複製建構子,於是形成無限遞迴,無法完成初始化。

使用參考參數:

Array(const Array& other);

可直接參照原物件,不必先複製出一個參數副本,因此避免遞迴。加上 const,可保證複製過程不修改來源物件,也能接受常數物件作為複製來源。

(三)實作 Array& operator-(const Array&)

以下以 *this 表示陣列 F、參數 right 表示陣列 G,並以 result 表示合併結果 R。依題意,先放入 F 的所有元素,再將 G 中未出現在 F 的元素依序加入。

**決定陣列 R 大小:**先計算 G 中有幾個元素不在 F 中,再將該數量加上 F 的大小。

**將陣列 F 的內容複製至陣列 R:**逐一複製 *this 的元素。

**將陣列 G 的內容複製至陣列 R:**逐一檢查 right 的元素;只有不在 F 中的元素才加入 R。

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 七 題10 分

一位程式設計師設計了一個 C++ 類別 Pt 與類別 Shape,並使用它們來開發一些幾何形狀的類別,如三角形、平行四邊形、圓形、長方形、橢圓形等類別。程式設計師利用 Pt 類別來建立用以描述幾何形狀的點,並利用繼承(inherit)Shape 類別將這些幾何形狀的類別建構在 Shape 類別上。若主程式碼與執行主程式碼所產出結果如下所示,請回答下列問題:(每小題 5 分,共 10 分)

(一)為何用這樣的語法「virtual double area() const = 0;」來敘述計算一個幾何形狀面積的成員函數樣板(function prototype)?請詳述之。

(二)請說明輸出結果的第四行「Point(0, 0) is created」是如何產生的。

class Pt { friend class Shape; friend class Triangle;

public: Pt(double = 0, double = 0); double getX() const { return x; } double getY() const { return y; }

private: double x; double y; };

Pt::Pt(double c1, double c2) { x = c1; y = c2; cout << "Point(" << x << ", " << y << ") created." << endl; }

class Shape { public: Shape(const int &ctColor, const int &fdColor) : contourColor(ctColor), filledColor(fdColor) {}

virtual double area() const = 0; // 計算一個形狀(Shape)的面積
virtual double perimeter() const = 0; // 計算一個形狀的周長
virtual bool outside(const Pt &) const = 0; // 決定所給的點是否在一個形狀外部
virtual void print() const = 0; // 把構成一個形狀的資訊列印出來
virtual void draw() const = 0; // 把一個形狀畫出來

int getContourColor() { return contourColor; } // 取出一個形狀的輪廓顏色
int getFilledColor() { return filledColor; } // 取出一個形狀內部填滿的顏色

private: int contourColor = -1; // 一個形狀的輪廓顏色 int filledColor = -1; // 一個形狀內部填滿的顏色 };

int main() { Pt p1(0, 0); Pt p2(2, 0); Pt p3(1, 1); Triangle aTrgle(p1, p2, p3, 20, 10);

aTrgle.area();
aTrgle.outside(p1);
aTrgle.perimeter();
aTrgle.print();
aTrgle.draw();

cout << "Contour color: " << aTrgle.getContourColor() << endl;
cout << "Filled color: " << aTrgle.getFilledColor() << endl;

return 0;

}

輸出結果:

Point(0, 0) is created. Point(2, 0) is created. Point(1, 1) is created. Point(0, 0) is created. Point(0, 0) is created. Point(0, 0) is created. A triangle is created! 20 10 Triangle area is calculated: Point outside a triangle is decided: Triangle perimeter is calculated: Points of a triangle are printed: A triangle is drawn Contour color: 20 Filled color: 10

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 抽象類別、純虛擬函數、繼承下的動態繫結,以及 建構子呼叫與預設引數。

Shape 是所有幾何形狀的共同基底類別,但不同形狀的面積、周長、點的位置判斷、列印與繪圖方式各自不同。因此,Shape 宣告共同介面,並要求具體形狀類別(例如 Triangle)提供實作。

解題方法

(一)virtual double area const = 0; 的意義

這行宣告的是純虛擬函數:

  • virtual 表示它是虛擬函數。透過基底類別指標或參考呼叫時,會依物件的實際型別執行對應的覆寫版本。
  • double 是回傳型別;area 是函數名稱,括號內沒有參數。
  • 函數尾端的 const 表示此函數不修改呼叫它的物件狀態。
  • = 0 表示此函數是純虛擬函數。Shape 只規定介面,不在此提供一般意義下的函數實作。

含有純虛擬函數的類別是抽象類別,不能直接建立物件,例如不能寫 Shape s(...)。衍生類別若未實作所有繼承而來的純虛擬函數,也仍是抽象類別;只有實作完成後,才能建立該衍生類別的物件。

因此,Triangle 必須提供符合宣告的 area const,以自己的幾何規則計算三角形面積。這種設計讓不同形狀共用相同操作介面,同時保留各自的計算方式。

(二)第四行 Point(0, 0) is created 的來源

前三行來自主程式中的區域物件:

Pt p1(0, 0);
Pt p2(2, 0);
Pt p3(1, 1);

建立這三個物件時,分別呼叫 Pt 建構子,輸出三個點的座標。

第四行則來自建立 Triangle 物件時,Triangle 的建構流程又建立了一個座標為 (0, 0) 的 Pt 成員或暫存點。Pt 建構子的參數有預設值:

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 八 題20 分

請使用 HTML 與 JavaScript,將本題所提供之程式碼所缺部分(方框 1、2、3)撰寫完整,設計出可達成下列功能的網頁:(方框 1 占 4 分、方框 2 占 8 分、方框 3 占 8 分,共 20 分)

  • 產出如下圖(A)(B)(C)之表單(Form),表單內主要包含兩個輸入框、一個按鈕、一個 result 區塊及一個 Canvas 元素。輸入框分別為「長度」和「寬度」,讓用戶在「長度」和「寬度」的輸入框中可分別輸入長方形的長和寬,單位為像素,「長度」和「寬度」的數值皆大於 0 且小於 500。
  • 按下「計算面積」按鈕後,JavaScript 函式 calculateArea() 會讀取輸入的數值,檢查其有效性,並計算長方形的面積。
  • 計算結果顯示在 result 區塊,並使用 Canvas 元素在網頁上繪製出一個長方形。Canvas 中的長方形會根據輸入的長寬居中顯示,並設定為藍色填充樣式。
<!DOCTYPE html> <html> <head> <title>長方形面積計算</title> </head> <body> <h1>長方形面積計算</h1>
<label for="length">長度:</label>
<input type="number" id="length" placeholder="輸入長度">
<br>

<label for="width">寬度:</label>
<input type="number" id="width" placeholder="輸入寬度">
<br>

____

<p id="result"></p>
<canvas id="rectangleCanvas" width="500" height="500" style="border:1px solid #000;"></canvas>

<script>
    function calculateArea() {
        const length = parseFloat(document.getElementById('length').value);
        const width = parseFloat(document.getElementById('width').value);

        ____

        document.getElementById('result').textContent = `長方形的面積為:${area} 平方單位`;

        const canvas = document.getElementById('rectangleCanvas');
        const context = canvas.getContext('2d');

        ____
    }
</script>
</body> </html>

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查表單事件處理、輸入值驗證、面積計算,以及 Canvas 的繪圖座標與填色。長方形面積公式為:

A=長×寬A = \text{長} \times \text{寬}

輸入值須為有效數值,且長、寬均大於 00、小於 500500。Canvas 的座標原點在左上角;若要讓長方形居中,繪圖起點需依 Canvas 與長方形的尺寸差計算。

解題方法

方框 1 放置按鈕,並以 onclick 呼叫 calculateArea。按鈕按下後,函式先讀取兩個輸入框的值,再檢查數值是否有效及是否符合範圍;不符合時顯示提示並結束函式。

驗證通過後,以長乘寬計算面積,更新 result 區塊。繪圖時,令 Canvas 寬、高皆為 500500,長方形在水平與垂直方向的起點分別為:

x=500−長2,y=500−寬2x = \frac{500-\text{長}}{2}, \qquad y = \frac{500-\text{寬}}{2}

最後呼叫 fillRect(x, y, 長, 寬) 繪出藍色長方形。

方框填答

方框 1:按鈕

<button onclick="calculateArea">計算面積</button>

方框 2:驗證輸入並計算面積

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

其他考古題