Try   HackMD

高中部多元選修:程式設計

課程基本資訊

  • 課程名稱:(多元選修)程式設計
  • 課程時長:每週 1 小時
  • 總週數21 週

課程進度安排

週次 課程內容 重要事件
第1週 程式設計概論
第2週 基本語法介紹
第3週 控制結構
第4週 函數與模組
第5週 資料結構簡介
第6週 實作練習
第7週 第一次報告 報告主題:前六週內容
第8週 物件導向程式設計
第9週 例外處理與調試
第10週 資料庫基礎
第11週 網頁程式設計基礎
第12週 實作練習
第13週 專題討論
第14週 第二次報告 報告主題:第8-13週內容
第15週 資料分析簡介
第16週 前端與後端技術
第17週 專題實作
第18週 課程回顧
第19週 期末考試準備
第20週 期末考試
第21週 期末報告 報告主題:整體課程總結

重要報告

  • 第一次報告:第 7 週
  • 第二次報告:第 14 週
  • 期末報告:第 21 週

第1週:程式設計概論

課程目標

  • 了解程式設計的基本概念
  • 探索程式設計的歷史與應用
  • 確立學習程式設計的動機與目標

課程大綱

1. 程式設計的定義

  • 程式設計:使用特定語言撰寫指令,讓電腦執行特定任務。
    • 一種將人類邏輯轉換為電腦可理解指令的過程。
  • 重要性:提升解決問題的能力,優化工作流程。
    • 解決問題:透過程式設計,可以有效地解決各種問題。
    • 優化流程:自動化重複性工作,提升工作效率。

2. 程式設計的歷史

  • 早期的程式設計語言(如 Fortran, COBOL)
    • Fortran:1950年代初期,主要用於科學計算。
    • COBOL:同樣在1950年代,主要用於商業應用。
  • 現代程式設計語言(如 Python, Java, C++)
    • Python:易學易用,適合初學者和數據分析。
    • Java:廣泛應用於企業級應用和Android開發。
    • C++:常用於系統程式設計和高效能應用。
  • 程式設計的演進與技術發展

3. 程式設計的應用領域

  • 網頁開發:HTML, CSS, JavaScript
  • 軟體開發:桌面應用程式與行動應用程式
  • 數據分析:數據處理與可視化
  • 遊戲開發:互動娛樂使用 Unity、Unreal Engine 等平台開發互動娛樂。

4. 課程架構與學習目標

  • 課程內容概覽(後續週次安排)
    • 每週主題簡介,涵蓋基礎語法、控制結構、數據結構等。
  • 學習成果(能力評估標準)
    • 能夠獨立撰寫簡單的程式,解決實際問題。
  • 期望學生參與度與作業要求

5. 第一堂課活動

  • 自我介紹與學習動機分享
  • 小組討論:為什麼學習程式設計?

6. 課後作業

  • 撰寫一篇短文,描述你對程式設計的看法及期望學習的內容。

第2週上課內容:基本語法介紹

課程目標

  • 理解程式語言的基本語法
  • 學習如何撰寫簡單的程式碼
  • 培養編寫可讀性高的程式碼的能力

課程大綱

1. 程式語言概述

  • 程式語言的定義:
    程式語言是用來撰寫指令以控制電腦行為的工具。
  • 常見程式語言:
    • Python:適合初學者,功能強大。
    • Java:跨平台,廣泛應用於企業和Android開發。
    • JavaScript:主要用於網頁開發,增加互動性。

2. 基本語法概念

  • 在不同的程式語言中,變數的表示方式和定義語法可能會有所不同。以下是一些常見程式語言中變數的表示方式:
程式語言 變數定義方式示例 說明
Python x = 10 直接使用 = 進行賦值,支持多種類型。
Java int x = 10; 需要指定變數類型,結尾有分號。
JavaScript let x = 10; 使用 let、const 或 var 來定義變數。
C++ int x = 10; 需要指定變數類型,結尾有分號。
C# int x = 10; 類似於 Java 和 C++,需要指定類型。
Ruby x = 10 類似於 Python,無需指定類型。
PHP $x = 10; 變數以 $ 開頭,無需指定類型。
Swift var x = 10 使用 var 定義可變變數,無需指定類型。
  • 變數類型示例

    • python
    ​​name = "Alice"  # 字串
    ​​age = 30        # 整數
    ​​height = 5.7    # 浮點數
    
    • Java
    ​​String name = "Alice"; // 字串
    ​​int age = 30;          // 整數
    ​​double height = 5.7;   // 浮點數
    
    • JavaScript
    ​​let name = "Alice";  // 字串
    ​​let age = 30;        // 整數
    ​​let height = 5.7;    // 浮點數
    
    • C++
    ​​#include <iostream>
    ​​using namespace std;
    
    ​​int main() {
    ​​    string name = "Alice"; // 字串
    ​​    int age = 30;          // 整數
    ​​    double height = 5.7;   // 浮點數
    ​​    return 0;
    ​​}
    
    • C#
    ​​string name = "Alice"; // 字串
    ​​int age = 30;          // 整數
    ​​double height = 5.7;   // 浮點數
    
    • Ruby
    ​​name = "Alice"  # 字串
    ​​age = 30        # 整數
    ​​height = 5.7    # 浮點數
    
    • PHP
    ​​$name = "Alice";  // 字串
    ​​$age = 30;        // 整數
    ​​$height = 5.7;    // 浮點數
    
    • Swift
    ​​var name = "Alice"  // 字串
    ​​var age = 30        // 整數
    ​​var height = 5.7    // 浮點數
    
    • 變數:存儲資料的命名位置
      • 宣告變數的方式

      • Python範例:

        ​​​​​​​x = 10  # 整數
        ​​​​​​​name = "John"  # 字串
        
      • 變數命名規則:只能包含字母、數字和下劃線,不能以數字開頭。

    • 資料型別:數據的類型(整數、浮點數、字串、布林值)
      • 整數:例如 10
      • 浮點數:例如 3.14
      • 字串:例如 "Hello"
      • 布林值:例如 True 或 False
    • 運算符:數學運算符、比較運算符、邏輯運算符
      • 數學運算符:+、-、*、/
      • 比較運算符:==、!=、>、<
      • 邏輯運算符:and、or、not

3.不同語法對運算式的表示方式

不同程式語言在運算式表示方面存在一些差異,主要體現在運算符的符號、優先級和結合性等方面。以下是一些常見程式語言中運算式的表示方式示例:

基本運算符

運算符 描述 Python Java JavaScript C++ C# Ruby PHP Swift
+ 加法 + + + + + + + +
- 減法 - - - - - - - -
* 乘法 * * * * * * * *
/ 除法 / / / / / / / /
% 取餘數(模運算) % % % % % % % %
** 指數運算 ** ** ** ** ** ** ** **

邏輯運算符

運算符 描述 Python Java JavaScript C++ C# Ruby PHP Swift
== 等於 == == == == == == == ==
!= 不等於 != != != != != != != !=
> 大於 > > > > > > > >
< 小於 < < < < < < < <
>= 大於等於 >= >= >= >= >= >= >= >=
<= 小於等於 <= <= <= <= <= <= <= <=
and 邏輯與 and && && && && && && &&
or 邏輯或 or
not 邏輯非 not ! ! ! ! ! ! !

賦值運算符

運算符 描述 Python Java JavaScript C++ C# Ruby PHP Swift
= 賦值 = = = = = = = =
+= 加法賦值 += += += += += += += +=
-= 減法賦值 -= -= -= -= -= -= -= -=
*= 乘法賦值 *= *= *= *= *= *= *= *=
/= 除法賦值 /= /= /= /= /= /= /= /=
%= 取餘數賦值 %= %= %= %= %= %= %= %=
**= 指數賦值 **= **= **= **= **= **= **= **=

其他運算符

運算符 描述 Python Java JavaScript C++ C# Ruby PHP Swift
**. ** 成員訪問 . . . . . . -> .
**[] ** 索引訪問 [] [] [] [] [] [] [] []
**() ** 函數調用 () () () () () () () ()

優先級和結合性

不同語言的運算符優先級和結合性可能略有不同,建議查閱相關語言的文檔以獲取詳細信息。

示例

# python
result = (10 + 5) * 2  # 計算結果為 30
# java
int result = (10 + 5) * 2;  // 計算結果為 30
# JavaScript
let result = (10 + 5) * 2;  // 計算結果為 30
# C++
int result = (10 + 5) * 2;  // 計算結果為 30
# C#
int result = (10 + 5) * 2;  // 計算結果為 30
# Ruby
result = (10 + 5) * 2  # 計算結果為 30
# PHP
$result = (10 + 5) * 2;  // 計算結果為 30
# Swift
let result = (10 + 5) * 2  // 計算結果為 30

小結

不同程式語言的運算式表示方式各有特點,了解這些差異可以幫助你更有效地理解和編寫程式碼。建議在學習程式設計時,仔細閱讀相關語言的文檔,以掌握其運算符的用法和優先級。

第3週上課內容:控制結構

1. 不同語法對控制結構 if、else、elif 的表示方式

在不同的程式語言中,控制結構 if、else 和 elif 的表示方式可能略有不同,但其基本邏輯和功能是相同的。以下是一些常見程式語言中控制結構的表示方式示例:

if 語句

程式語言 if 語句示例 說明
Python if condition: 使用 : 結尾,縮進表示程式區塊。
Java if (condition) { } 使用 {} 包裹程式區塊。
JavaScript if (condition) { } 使用 {} 包裹程式區塊。
C++ if (condition) { } 使用 {} 包裹程式區塊。
C# if (condition) { } 使用 {} 包裹程式區塊。
Ruby if condition then end 使用 then 和 end 標記程式區塊。
PHP if (condition) { } 使用 {} 包裹程式區塊。
Swift if condition { } 使用 {} 包裹程式區塊。

else 語句

程式語言 else 語句示例 說明
Python else: 使用 : 結尾,縮進表示程式區塊。
Java else { } 使用 {} 包裹程式區塊。
JavaScript else { } 使用 {} 包裹程式區塊。
C++ else { } 使用 {} 包裹程式區塊。
C# else { } 使用 {} 包裹程式區塊。
Ruby else end 使用 else 和 end 標記程式區塊。
PHP else { } 使用 {} 包裹程式區塊。
Swift else { } 使用 {} 包裹程式區塊。

elif 語句

程式語言 elif 語句示例 說明
Python elif condition: 使用 : 結尾,縮進表示程式區塊。
Java else if (condition) { } 使用 else if 進行多重條件判斷。
JavaScript else if (condition) { } 使用 else if 進行多重條件判斷。
C++ else if (condition) { } 使用 else if 進行多重條件判斷。
C# else if (condition) { } 使用 else if 進行多重條件判斷。
Ruby elsif condition then end 使用 elsif 和 end 標記程式區塊。
PHP elseif (condition) { } 使用 elseif 進行多重條件判斷。
Swift else if condition { } 使用 else if 進行多重條件判斷。

第一次段考作業

radius = float(input("請輸入圓形的半徑: "))
area = 3.14159 * radius * radius
print("圓形的面積是:", area)
  • 輸入半徑:5
  • 程式輸出:圓形的面積是: 78.53975

score1 = int(input("請輸入第一個分數: "))
score2 = int(input("請輸入第二個分數: "))
score3 = int(input("請輸入第三個分數: "))
average_score = (score1 + score2 + score3) / 3
print("平均分數是:", average_score)
  • 輸入分數:80, 90, 75
  • 程式輸出:平均分數是: 81.66666666666667

original_price = float(input("請輸入商品原價: "))
discount_rate = float(input("請輸入折扣率 (例如 0.2 代表 20%): "))
discount_price = original_price * (1 - discount_rate)
print("折扣價是:", discount_price)
  • 輸入原價:100
  • 輸入折扣率:0.15
  • 程式輸出:折扣價是: 85.0

示例

  • Python
age = 25

if age < 18:
    print("未成年")
elif age >= 18 and age < 65:
    print("成年")
else:
    print("老年")
  • Java
int age = 25;

if (age < 18) {
    System.out.println("未成年");
} else if (age >= 18 && age < 65) {
    System.out.println("成年");
} else {
    System.out.println("老年");
}
  • JavaScript
let age = 25;

if (age < 18) {
    console.log("未成年");
} else if (age >= 18 && age < 65) {
    console.log("成年");
} else {
    console.log("老年");
}
  • C++
#include <iostream>
using namespace std;

int main() {
    int age = 25;

    if (age < 18) {
        cout << "未成年" << endl;
    } else if (age >= 18 && age < 65) {
        cout << "成年" << endl;
    } else {
        cout << "老年" << endl;
    }
    return 0;
}
  • C#
using System;

class Program {
    static void Main(string[] args) {
        int age = 25;

        if (age < 18) {
            Console.WriteLine("未成年");
        } else if (age >= 18 && age < 65) {
            Console.WriteLine("成年");
        } else {
            Console.WriteLine("老年");
        }
    }
}
  • Ruby
age = 25

if age < 18
  puts "未成年"
elsif age >= 18 and age < 65
  puts "成年"
else
  puts "老年"
end
  • PHP
<?php
$age = 25;

if ($age < 18) {
    echo "未成年";
} elseif ($age >= 18 && $age < 65) {
    echo "成年";
} else {
    echo "老年";
}
?>
  • Swift
let age = 25

if age < 18 {
    print("未成年")
} else if age >= 18 && age < 65 {
    print("成年")
} else {
    print("老年")
}

小結

不同程式語言的控制結構語法略有差異,但其邏輯和功能是一致的。了解這些差異可以幫助你更有效地理解和編寫程式碼。在學習程式設計時,建議仔細閱讀相關語言的文檔,以掌握其控制結構的用法和語法規則。


第二次段考作業

https://blockly.games/?lang=zh-hant

image

https://hourofcode.com/mchoc

電競訓練營:人工智能聯盟
https://hourofcode.com/codecombatesports


2. 不同語法對控制結構 For While 的表示方式

以下是不同語法對控制結構 For 和 While 的表示方式:

  • C 語言

    • For 迴圈
    ​​for (initialization; condition; increment) {
    ​​// code to be executed
    ​​}
    ​​# 初始化;狀態;增量
    
    • While 迴圈
    ​​  while (condition) {
    ​​// code to be executed
    ​​}
    
  • Python 語言

    • For 迴圈
    ​​for item in iterable:
    ​​  # code to be executed
    
    • While 迴圈
    ​​while condition:
    ​​  # code to be executed
    
  • JavaScript 語言

    • For 迴圈
    ​​for (initialization; condition; increment) {
    ​​  // code to be executed
    ​​}
    
    • While 迴圈
    ​​while (condition) {
    ​​  // code to be executed
    ​​}
    
  • Java 語言

    • For 迴圈
    ​​for (initialization; condition; increment) {
    ​​  // code to be executed
    ​​}
    
    • While 迴圈
    ​​while (condition) {
    ​​  // code to be executed
    ​​}
    
  • PHP 語言

    • For 迴圈
    ​​for (initialization; condition; increment) {
    ​​  // code to be executed
    ​​}
    
    • While 迴圈
    ​​while (condition) {
    ​​  // code to be executed
    ​​}
    
  • Go 語言

    • For 迴圈
    ​​for initialization; condition; increment {
    ​​  // code to be executed
    ​​}
    
    • While 迴圈
    ​​for condition {
    ​​  // code to be executed
    ​​}
    
  • Swift 語言

    • For 迴圈
    ​​for item in iterable {
    ​​  // code to be executed
    ​​}
    
    • While 迴圈
    ​​while condition {
    ​​  // code to be executed
    ​​}
    
  • Kotlin 語言

    • For 迴圈
    ​​for (item in iterable) {
    ​​  // code to be executed
    ​​}
    
    • While 迴圈
    ​​while (condition) {
    ​​  // code to be executed
    ​​}
    
  • Ruby 語言

    • For 迴圈
    ​​for item in iterable do
    ​​  # code to be executed
    ​​end
    
    • While 迴圈
    ​​while condition do
    ​​  # code to be executed
    ​​end
    
  • C# 語言

    • For 迴圈
    ​​for (initialization; condition; increment) {
    ​​  // code to be executed
    ​​}
    
    • While 迴圈
    ​​while (condition) {
    ​​  // code to be executed
    ​​}
    

小結

不同的程式語言對於 For 和 While 迴圈的語法細節可能略有不同,但它們的基本概念是相同的:

  • For 迴圈While迴圈皆是允許重複執行一段程式碼,直到滿足特定條件為止。

以下是一些 For 和 While 迴圈的範例,以說明它們在不同程式語言中的用法:

1. C 語言

  • For 迴圈:印出 1 到 10 的數字
#include <stdio.h>

int main() {
  for (int i = 1; i <= 10; i++) {
    printf("%d\n", i);
  }
  return 0;
}
  • While 迴圈:計算 1 到 10 的總和
#include <stdio.h>

int main() {
  int i = 1;
  int sum = 0;
  while (i <= 10) {
    sum += i;
    i++;
  }
  printf("總和為:%d\n", sum);
  return 0;
}

2. Python 語言

  • For 迴圈:印出清單中的每個項目
my_list = ["蘋果", "香蕉", "橘子"]
for fruit in my_list:
  print(fruit)
  • While 迴圈:輸入數字直到輸入 0
number = 1
while number != 0:
  number = int(input("請輸入一個數字 (輸入 0 結束): "))
  print("您輸入的數字是:", number)

3. JavaScript 語言

  • For 迴圈:印出 1 到 5 的平方
for (let i = 1; i <= 5; i++) {
  console.log(i * i);
}
  • While 迴圈:輸入字串直到輸入 "結束"
let input = "";
while (input !== "結束") {
  input = prompt("請輸入一個字串 (輸入 \"結束\" 結束): ");
  console.log("您輸入的字串是:", input);
}

4. Java 語言

  • For 迴圈:計算 1 到 5 的總和
public class Main {
  public static void main(String[] args) {
    int sum = 0;
    for (int i = 1; i <= 5; i++) {
      sum += i;
    }
    System.out.println("總和為:" + sum);
  }
}
  • While 迴圈:輸入數字直到輸入負數
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int number = 1;
    while (number >= 0) {
      System.out.print("請輸入一個數字 (輸入負數結束): ");
      number = scanner.nextInt();
      System.out.println("您輸入的數字是:" + number);
    }
  }
}

5. PHP 語言

  • For 迴圈:印出陣列中的每個元素
$fruits = array("蘋果", "香蕉", "橘子");
for ($i = 0; $i < count($fruits); $i++) {
  echo $fruits[$i] . "<br>";
}
  • While 迴圈:輸入文字直到輸入 "結束"
$input = "";
while ($input !== "結束") {
  $input = readline("請輸入一個文字 (輸入 \"結束\" 結束): ");
  echo "您輸入的文字是:" . $input . "<br>";
}

6. Go 語言

  • For 迴圈:印出 1 到 5 的偶數
package main

import "fmt"

func main() {
  for i := 1; i <= 5; i++ {
    if i%2 == 0 {
      fmt.Println(i)
    }
  }
}
  • While 迴圈:輸入數字直到輸入 0
package main

import "fmt"

func main() {
  number := 1
  for number != 0 {
    fmt.Print("請輸入一個數字 (輸入 0 結束): ")
    fmt.Scanln(&number)
    fmt.Println("您輸入的數字是:", number)
  }
}

7. Swift 語言

  • For 迴圈:印出 1 到 10 的數字
for i in 1...10 {
  print(i)
}
  • While 迴圈:輸入文字直到輸入 "結束"
var input = ""
while input != "結束" {
  input = readLine()!
  print("您輸入的文字是:", input)
}

8. Kotlin 語言

  • For 迴圈:印出 1 到 5 的平方
for (i in 1..5) {
  println(i * i)
}
  • While 迴圈:輸入數字直到輸入負數
import java.util.*

fun main() {
  val scanner = Scanner(System.`in`)
  var number = 1
  while (number >= 0) {
    print("請輸入一個數字 (輸入負數結束): ")
    number = scanner.nextInt()
    println("您輸入的數字是:" + number)
  }
}

9. Ruby 語言

  • For 迴圈:印出陣列中的每個元素
fruits = ["蘋果", "香蕉", "橘子"]
fruits.each do |fruit|
  puts fruit
end
  • While 迴圈:輸入文字直到輸入 "結束"
input = ""
while input != "結束"
  input = gets.chomp
  puts "您輸入的文字是:" + input
end

10. C# 語言

  • For 迴圈:計算 1 到 5 的總和
using System;

public class Program {
  public static void Main(string[] args) {
    int sum = 0;
    for (int i = 1; i <= 5; i++) {
      sum += i;
    }
    Console.WriteLine("總和為:" + sum);
  }
}
  • While 迴圈:輸入數字直到輸入負數
using System;

public class Program {
  public static void Main(string[] args) {
    int number = 1;
    while (number >= 0) {
      Console.Write("請輸入一個數字 (輸入負數結束): ");
      number = Convert.ToInt32(Console.ReadLine());
      Console.WriteLine("您輸入的數字是:" + number);
    }
  }
}

第4週上課內容:函數與模組

不同語法對函數與模組的表示方式:

以下是一些常見程式語言中函數和模組的表示方式:

1. C 語言

  • 函數:
#include <stdio.h>

// 函數定義
int sum(int a, int b) {
  return a + b;
}

int main() {
  int result = sum(3, 5);
  printf("3 + 5 = %d\n", result);
  return 0;
}
  • 模組:

C 語言本身沒有明確的模組概念,但可以使用頭文件(.h)和源文件(.c)來模擬模組化。

2. Python 語言

  • 函數:
def sum(a, b):
  return a + b

result = sum(3, 5)
print("3 + 5 =", result)
  • 模組:

Python 使用檔案來表示模組。例如,一個名為 my_module.py 的檔案可以包含以下程式碼:

def sum(a, b):
  return a + b

def greet(name):
  print("Hello,", name)

然後,在另一個檔案中,可以使用 import 語句導入模組:

import my_module

result = my_module.sum(3, 5)
print("3 + 5 =", result)
my_module.greet("Alice")

3. JavaScript 語言

  • 函數:
function sum(a, b) {
  return a + b;
}

let result = sum(3, 5);
console.log("3 + 5 =", result);
  • 模組:

JavaScript 使用 exportimport 來定義和導入模組。例如,一個名為 my_module.js 的檔案可以包含以下程式碼:

export function sum(a, b) {
  return a + b;
}

export function greet(name) {
  console.log("Hello,", name);
}

然後,在另一個檔案中,可以使用 import 語句導入模組:

import { sum, greet } from './my_module.js';

let result = sum(3, 5);
console.log("3 + 5 =", result);
greet("Alice");

4. Java 語言

  • 函數:
public class Main {
  public static int sum(int a, int b) {
    return a + b;
  }

  public static void main(String[] args) {
    int result = sum(3, 5);
    System.out.println("3 + 5 = " + result);
  }
}
  • 模組:

Java 使用類別來表示模組。例如,一個名為 MyModule.java 的檔案可以包含以下程式碼:

public class MyModule {
  public static int sum(int a, int b) {
    return a + b;
  }

  public static void greet(String name) {
    System.out.println("Hello, " + name);
  }
}

然後,在另一個檔案中,可以使用 import 語句導入模組:

import MyModule;

public class Main {
  public static void main(String[] args) {
    int result = MyModule.sum(3, 5);
    System.out.println("3 + 5 = " + result);
    MyModule.greet("Alice");
  }
}

5. Go 語言

  • 函數:
package main

import "fmt"

func sum(a, b int) int {
  return a + b
}

func main() {
  result := sum(3, 5)
    # := 表示聲明一個新變數,並將 sum(3, 5) 的結果賦予它。
    # := 運算子只能在 函數內部 使用,不能在函數外部使用。
  fmt.Println("3 + 5 =", result)
}
  • 模組:

Go 使用包(package)來表示模組。例如,一個名為 my_module 的包可以包含以下程式碼:

package my_module

func sum(a, b int) int {
  return a + b
}

func greet(name string) {
  fmt.Println("Hello,", name)
}

然後,在另一個檔案中,可以使用 import 語句導入模組:

package main

import "fmt"
import "my_module"

func main() {
  result := my_module.sum(3, 5)
  fmt.Println("3 + 5 =", result)
  my_module.greet("Alice")
}

6. Swift 語言

  • 函數:
func sum(a: Int, b: Int) -> Int {
  return a + b
}

let result = sum(a: 3, b: 5)
print("3 + 5 =", result)
  • 模組:

Swift 使用檔案來表示模組。例如,一個名為 MyModule.swift 的檔案可以包含以下程式碼:

func sum(a: Int, b: Int) -> Int {
  return a + b
}

func greet(name: String) {
  print("Hello,", name)
}

然後,在另一個檔案中,可以使用 import 語句導入模組:

import MyModule

let result = MyModule.sum(a: 3, b: 5)
print("3 + 5 =", result)
MyModule.greet(name: "Alice")

7. Kotlin 語言

  • 函數:
fun sum(a: Int, b: Int): Int {
  return a + b
}

fun main() {
  val result = sum(3, 5)
  println("3 + 5 = $result")
}
  • 模組:

Kotlin 使用檔案來表示模組。例如,一個名為 MyModule.kt 的檔案可以包含以下程式碼:

package my_module

fun sum(a: Int, b: Int): Int {
  return a + b
}

fun greet(name: String) {
  println("Hello, $name")
}

然後,在另一個檔案中,可以使用 import 語句導入模組:

import my_module.*

fun main() {
  val result = sum(3, 5)
  println("3 + 5 = $result")
  greet("Alice")
}

8. PHP 語言

  • 函數:
function sum($a, $b) {
  return $a + $b;
}

$result = sum(3, 5);
echo "3 + 5 = " . $result . "<br>";
  • 模組:

PHP 使用檔案來表示模組。例如,一個名為 my_module.php 的檔案可以包含以下程式碼:

function sum($a, $b) {
  return $a + $b;
}

function greet($name) {
  echo "Hello, " . $name . "<br>";
}

然後,在另一個檔案中,可以使用 requireinclude 語句導入模組:

require "my_module.php";

$result = sum(3, 5);
echo "3 + 5 = " . $result . "<br>";
greet("Alice");

9. C# 語言

  • 函數:
using System;

public class Program {
  public static int sum(int a, int b) {
    return a + b;
  }

  public static void Main(string[] args) {
    int result = sum(3, 5);
    Console.WriteLine("3 + 5 = " + result);
  }
}
  • 模組:

C# 使用命名空間來表示模組。例如,一個名為 MyModule 的命名空間可以包含以下程式碼:

namespace MyModule {
  public static class MathUtils {
    public static int sum(int a, int b) {
      return a + b;
    }
  }

  public static class Greetings {
    public static void greet(string name) {
      Console.WriteLine("Hello, " + name);
    }
  }
}

然後,在另一個檔案中,可以使用 using 語句導入模組:

using System;
using MyModule;

public class Program {
  public static void Main(string[] args) {
    int result = MathUtils.sum(3, 5);
    Console.WriteLine("3 + 5 = " + result);
    Greetings.greet("Alice");
  }
}

10. Ruby 語言

  • 函數:
def sum(a, b)
  return a + b
end

result = sum(3, 5)
puts "3 + 5 = #{result}"
  • 模組:

Ruby 使用檔案來表示模組。例如,一個名為 my_module.rb 的檔案可以包含以下程式碼:

module MyModule
  def self.sum(a, b)
    return a + b
  end

  def self.greet(name)
    puts "Hello, #{name}"
  end
end

然後,在另一個檔案中,可以使用 require 語句導入模組:

require "my_module"

result = MyModule.sum(3, 5)
puts "3 + 5 = #{result}"
MyModule.greet("Alice")

以上範例可以幫助各位同學更好地理解,在不同程式語言中"函數和模組"的表示方式!

第5週上課內容:資料結構簡介

資料結構的定義、特點及應用

以下是七種資料結構的詳細說明:

1. 陣列 (Array)

  • 定義: 陣列是一種線性資料結構,用於儲存相同資料類型的元素的集合。陣列中的元素以連續的記憶體位置儲存,並使用索引 (index) 來存取它們。索引從 0 開始,到陣列大小減 1 結束。

  • 特點:

    • 元素類型相同: 陣列只能儲存同一種資料類型的元素,例如整數、浮點數、字元等等。
    • 元素以連續記憶體位置儲存: 陣列中的元素在記憶體中是連續儲存的,這使得存取元素非常快。
    • 使用索引存取元素: 您可以使用索引來快速存取陣列中的任何元素。
    • 大小固定: 一旦宣告陣列的大小,就無法再改變。
  • 應用:

    • 儲存固定大小的資料集合: 例如儲存學生成績、一個月的溫度資料、一個遊戲中的角色屬性等等。
    • 作為其他資料結構的基礎: 例如,串列、堆疊、佇列等資料結構可以使用陣列來實現。
    • 在演算法中使用: 例如排序演算法、搜尋演算法等等。

2. 串列 (List)

  • 定義: 串列是一種線性資料結構,用於儲存資料元素的順序集合。串列中的元素可以是任何資料類型,並且可以動態新增或刪除。

  • 特點:

    • 元素可以是任何資料類型: 串列可以儲存不同資料類型的元素,例如整數、浮點數、字元、物件等等。
    • 元素以鏈結方式儲存: 串列中的元素以鏈結方式儲存,每個元素都指向下一個元素。
    • 可以動態新增或刪除元素: 您可以隨時新增或刪除串列中的元素,而不需要事先知道串列的大小。
    • 大小可變: 串列的大小可以根據需要動態調整。
  • 應用:

    • 儲存需要動態調整大小的資料集合: 例如購物車中的商品清單、音樂播放清單、網頁瀏覽歷史記錄等等。
    • 實現其他資料結構: 例如堆疊、佇列、樹等等。
    • 在演算法中使用: 例如排序演算法、搜尋演算法等等。

3. 堆疊 (Stack)

  • 定義: 堆疊是一種後進先出 (LIFO) 的資料結構。它就像一個堆疊的盤子,最後放上去的盤子會最先被拿走。

  • 特點:

    • 只能從頂端新增或刪除元素: 堆疊只能從頂端新增元素(稱為 push)或刪除元素(稱為 pop)。
    • 後進先出: 最近新增的元素會最先被刪除。
  • 應用:

    • 函數呼叫堆疊: 程式語言使用堆疊來管理函數呼叫。
    • 撤銷/重做功能: 例如文字編輯器中的撤銷/重做功能可以使用堆疊來實現。
    • 表達式求值: 例如計算器可以使用堆疊來計算表達式。

4. 佇列 (Queue)

  • 定義: 佇列是一種先進先出 (FIFO) 的資料結構。它就像排隊等候的人群,最先排隊的人會最先被服務。

  • 特點:

    • 只能從隊尾新增元素: 佇列只能從隊尾新增元素(稱為 enqueue)。
    • 只能從隊頭刪除元素: 佇列只能從隊頭刪除元素(稱為 dequeue)。
    • 先進先出: 最早新增的元素會最先被刪除。
  • 應用:

    • 處理任務佇列: 例如作業系統可以使用佇列來管理任務。
    • 訊息佇列: 例如網路應用程式可以使用佇列來傳送訊息。
    • 打印機佇列: 例如打印機可以使用佇列來管理打印任務。

5. 樹 (Tree)

  • 定義: 樹是一種非線性資料結構,由節點 (node) 組成,節點之間以父子關係連接。樹的根節點沒有父節點,而葉節點沒有子節點。

  • 特點:

    • 具有層級結構: 樹的節點按照層級排列,根節點位於最高層級。
    • 根節點是樹的起始點: 樹的根節點是樹的唯一入口點。
    • 每個節點最多只有一個父節點: 除了根節點之外,每個節點都有一個父節點。
    • 每個節點可以有多個子節點: 節點可以有任意數量的子節點。
  • 應用:

    • 文件系統: 文件系統可以使用樹來表示檔案和目錄的組織結構。
    • 資料庫索引: 資料庫可以使用樹來建立索引,以便快速搜尋資料。
    • 決策樹: 決策樹可以用於機器學習,以建立預測模型。

6. 圖 (Graph)

  • 定義: 圖是一種非線性資料結構,由節點 (node) 和邊 (edge) 組成。節點表示物件,邊表示節點之間的關係。

  • 特點:

    • 節點和邊: 圖由節點和邊組成,節點表示物件,邊表示節點之間的關係。
    • 無方向圖和有方向圖: 圖可以是有方向的或無方向的。在有方向圖中,邊具有方向,而在無方向圖中,邊沒有方向。
    • 加權圖和無加權圖: 圖可以是加權的或無加權的。在加權圖中,邊具有權重,而在無加權圖中,邊沒有權重。
  • 應用:

    • 社交網路: 社交網路可以使用圖來表示使用者和他們之間的關係。
    • 交通網路: 交通網路可以使用圖來表示城市、道路和交通路線。
    • 電路設計: 電路設計可以使用圖來表示電路元件和它們之間的連接。

7. 集合 (Set)

  • 定義: 集合是一種資料結構,用於儲存不重複的元素。集合中的元素沒有順序,並且可以是任何資料類型。

  • 特點:

    • 不重複元素: 集合中的元素不能重複。
    • 無序: 集合中的元素沒有順序。
    • 可以是任何資料類型: 集合中的元素可以是任何資料類型。
  • 應用:

    • 儲存不重複的資料: 例如儲存一個人的興趣愛好、一個班級的學生名單等等。
    • 檢查元素是否存在: 您可以使用集合來快速檢查元素是否存在於集合中。
    • 在演算法中使用: 例如排序演算法、搜尋演算法等等。

不同語法對資料結構的表示方式:

以下是不同程式語言中資料結構的表示方式,涵蓋常見的資料結構與範例:

1. 陣列 (Array)

  • C/C++: int arr[5]; // 宣告一個大小為 5 的整數陣列
  • Java: int[] arr = new int[5]; // 宣告一個大小為 5 的整數陣列
  • Python: arr = [1, 2, 3, 4, 5] // 宣告一個包含 5 個元素的整數列表
  • JavaScript: let arr = [1, 2, 3, 4, 5]; // 宣告一個包含 5 個元素的整數陣列
  • Go: arr := [5]int{1, 2, 3, 4, 5} // 宣告一個大小為 5 的整數陣列

2. 串列 (List)

  • C++: 使用 STL 中的 std::list 模板類別
  • Java: 使用 java.util.List 接口,例如 java.util.ArrayList
  • Python: list = [1, 2, 3, 4, 5] // 使用列表表示串列
  • JavaScript: let list = [1, 2, 3, 4, 5]; // 使用陣列表示串列
  • Go: 使用 []int 切片表示串列

3. 堆疊 (Stack)

  • C++: 使用 STL 中的 std::stack 模板類別
  • Java: 使用 java.util.Stack 類別
  • Python: 使用列表,並使用 append()pop() 方法模擬堆疊
  • JavaScript: 使用陣列,並使用 push()pop() 方法模擬堆疊
  • Go: 使用 []int 切片,並使用 append()pop() 方法模擬堆疊

4. 佇列 (Queue)

  • C++: 使用 STL 中的 std::queue 模板類別
  • Java: 使用 java.util.Queue 接口,例如 java.util.LinkedList
  • Python: 使用列表,並使用 append()pop(0) 方法模擬佇列
  • JavaScript: 使用陣列,並使用 push()shift() 方法模擬佇列
  • Go: 使用 []int 切片,並使用 append()pop(0) 方法模擬佇列

5. 樹 (Tree)

  • C++: 使用自訂資料結構或 STL 中的 std::mapstd::set 模擬樹
  • Java: 使用自訂資料結構或 java.util.TreeMapjava.util.TreeSet 模擬樹
  • Python: 使用自訂資料結構或字典 (dictionary) 模擬樹
  • JavaScript: 使用自訂資料結構或 MapSet 模擬樹
  • Go: 使用自訂資料結構或 map 模擬樹

6. 圖 (Graph)

  • C++: 使用自訂資料結構或 STL 中的 std::mapstd::set 模擬圖
  • Java: 使用自訂資料結構或 java.util.HashMapjava.util.HashSet 模擬圖
  • Python: 使用自訂資料結構或字典 (dictionary) 模擬圖
  • JavaScript: 使用自訂資料結構或 MapSet 模擬圖
  • Go: 使用自訂資料結構或 map 模擬圖

7. 集合 (Set)

  • C++: 使用 STL 中的 std::setstd::unordered_set 模板類別
  • Java: 使用 java.util.Set 接口,例如 java.util.HashSetjava.util.TreeSet
  • Python: 使用 set 資料類型
  • JavaScript: 使用 Set 資料類型
  • Go: 使用 map 模擬集合,或者使用 set

範例:

  • Python:
# 陣列
numbers = [1, 2, 3, 4, 5]

# 串列
my_list = [1, 2, 3, 4, 5]

# 堆疊
stack = []
stack.append(1)
stack.append(2)
stack.pop()

# 佇列
queue = []
queue.append(1)
queue.append(2)
queue.pop(0)

# 樹
tree = {
    'root': {
        'left': {
            'value': 1
        },
        'right': {
            'value': 2
        }
    }
}

# 圖
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D'],
    'C': ['A', 'E'],
    'D': ['B'],
    'E': ['C']
}

# 集合
my_set = {1, 2, 3, 4, 5}