函數與演算法的關鍵技巧:


從結構化程式設計、參數傳遞、遞迴到排序與搜尋的全方位解析


在軟體開發的旅程中,我們常需要面對龐大而複雜的程式碼,特別是當功能不斷拓展、需求不斷增加時,程式規模會快速膨脹。這時,如何有效地將程式碼分門別類、降低複雜度、提升可讀性與可維護性,成為開發者無可迴避的挑戰。透過「函數 (Function)」的概念,我們能將程式碼化整為零,將邏輯分解成數個各自獨立的模組,讓多人分工協作成為可能。而在程式設計領域中,除了函數的運用外,「演算法 (Algorithm)」也是不可或缺的基石。演算法指示了一組明確而有限的步驟,用於解決問題或達成特定目的,例如排序資料、搜尋元素、計算階層值或求最大公因數等。掌握函數和演算法的技巧,將使開發者在面對複雜的問題時,能夠以更為優雅的方式找到高效率、高品質的解決方案。


本章中,我們將循序漸進地探索函數在C++中的角色與功能,包括函數的原型宣告、定義、呼叫、參數傳遞與回傳值的規則,同時也會介紹三種參數傳遞策略──傳值呼叫、傳址呼叫、傳參考呼叫,並在各種情境中分析其適用場合與特性。我們也會討論行內函數(inline function)與函數多載(Function Overloading)的機制,展示C++對程式設計靈活性與高效性的支持。此外,我們也將深入遞迴函數(Recursive Function)的本質與應用,並透過介紹演算法的基本特性,帶領讀者從函數的角度體會演算法的奧祕。


最後,我們將以實際範例演示「排序」與「搜尋」這兩種在程式設計與資料處理中極其常見的演算法問題。從最基本的氣泡排序法(Bubble Sort)到二分搜尋法(Binary Search),透過實作和範例運行,協助讀者深刻理解這些演算法的運作原理與應用場景。




6-1 大話函數


在C/C++程式中,函數(Function)是程式碼的基本模組與核心架構,也是結構化程式設計的重要元素。以C++為例,每個程式必定有一個main()函數作為程式進入點,但除此之外,我們也可以自行定義多個具有特定功能的函數,透過函數間的呼叫與組合,將龐雜的問題拆解成較小、易管理的模組。


函數原型宣告與定義
為了讓編譯器在呼叫函數時能提前知道該函數的參數型態與回傳型態,我們需要在呼叫函數前,使用「函數原型宣告(Function Prototype)」。例如:


 


cpp






int sum(int a, int b); // 函數原型宣告


這行宣告讓編譯器知道存在一個名稱為sum的函數,接收兩個整數參數並回傳整數結果。有了函數原型後,我們才能在程式中安心呼叫sum()。而函數定義(Function Definition)則是在程式某處實際撰寫該函數的細節,如:


 


cpp






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


函數呼叫
定義好函數後,我們就可以在程式碼中透過「函數呼叫」來使用該功能。例如:


 


cpp






int x = 10, y = 20; int result = sum(x, y); // 呼叫sum函數


如上所述,sum(x, y)將x與y傳遞給sum函數,以進行計算後返回結果。




6-2 參數傳遞與其他應用


在呼叫函數時,主程式中的變數(稱為「引數」,Argument)會與函數定義中的形參(稱為「參數」,Parameter)發生對應。C++中有三種典型的參數傳遞方式:




  1. 傳值呼叫(Call by Value)
    在此模式下,函數接收的是參數值的複本,在函數內對參數修改不會影響主程式中原始變數的值。這是C/C++的預設傳遞方式。




  2. 傳址呼叫(Call by Address)
    在此模式下,我們傳入變數的記憶體位址(使用指標),允許函數內直接修改主程式中的變數值。這對需要在函數內直接影響原始資料的情況相當實用。




  3. 傳參考呼叫(Call by Reference)
    在C++中,參考(reference)是一種比指標更直觀的記憶體位址引用方式。透過在參數型態後加上&,讓函數參數成為實際參數的別名,因此在函數內對參數的更動,會直接影響呼叫者程式中的變數。




陣列參數傳遞
當我們需要處理多筆相關資料時,多半會使用陣列(array)。將陣列傳遞給函數時,其實只要傳入陣列名稱(等同於指向第一個元素的指標),再加上必要的長度資訊,即可在函數內操作整個陣列。由於陣列名稱代表一個位址,因此在函數中對陣列元素的更改,也會反映到呼叫者的陣列上。




6-2-5 行內函數


行內函數(inline function)是C++為提升程式執行效率所提供的特性。對於執行次數頻繁、程式碼體積不大的函數,使用inline關鍵字標記後,編譯器可在呼叫該函數時,直接將函數本體展開插入呼叫處,省略實際的函數呼叫開銷。儘管行內函數能提高效率,但濫用可能使程式碼體積膨脹,在使用時仍須謹慎衡量。




6-2-6 函數多載


C++支援「函數多載(Function Overloading)」,使得同一個函數名稱可以對應多個函數實作,只要這些函數的參數數量或型態組合不同即可。透過函數多載,我們可以根據傳入參數的型態或個數,讓編譯器自動選擇合適的函數版本,提升程式可讀性與彈性,減少函數命名衝突。




6-3 認識遞迴


遞迴(Recursion)是另一個讓程式結構更簡潔的技巧。遞迴函數在定義中呼叫自己本身,藉此將問題分解成更小的子問題,直到滿足跳出條件為止。遞迴經常用於結構明確的問題,如階乘計算(n!)、費氏數列(Fibonacci)求值、樹狀資料結構處理等。


撰寫遞迴函數時,必須確保兩件事:



  1. 反覆過程:函數必須在條件尚未達成時再度呼叫自身,將問題規模縮小。

  2. 出口條件:必須設計一個清晰可判斷的條件,使遞迴在有限次呼叫後結束。




6-4 探索演算法的趣味


演算法是計算機科學的精髓,任何問題的解決都可化為一組明確且有效的步驟來處理。優秀的演算法能節省執行時間與資源,使程式更高效。演算法必須具備以下五項特性:



  1. 輸入(Input):有0個或多個輸入。

  2. 輸出(Output):至少有一個輸出結果。

  3. 明確性(Definiteness):每個步驟清晰明確,不容歧義。

  4. 有限性(Finiteness):在有限步驟內必須結束運算。

  5. 有效性(Effectiveness):每個步驟都可行且可由人類用紙筆推導。


演算法描述可用自然語言、虛擬語言(Pseudo Code)或流程圖(Flow Diagram)來表示,選擇最有助於問題理解與溝通的方法。




6-4-1 排序演算法


排序(Sorting)是演算法中經典又常用的問題。將資料由小到大或由大到小排列有助於後續的搜尋與分析。排序演算法繁多,包括氣泡排序(Bubble Sort)、選擇排序(Selection Sort)、合併排序(Merge Sort)、快速排序(Quick Sort)等,每種演算法各有其特性與適用場景。


此處以氣泡排序法為例:
氣泡排序的想法是透過反覆地比較相鄰元素並加以交換,宛如氣泡往上浮使最大值逐步移動至最後,而經過多次掃描後,即可完成整個陣列的排序。儘管氣泡排序效率不佳(O(n²)),但易於理解與實作。




6-4-2 搜尋演算法


搜尋(Search)演算法是為了解決在大量資料中快速找到特定目標的問題。最基本的搜尋方法是線性搜尋(Linear Search),依序檢視每個元素,直到找到目標或搜尋完所有元素為止。線性搜尋簡單卻效率不佳(O(n))。


若資料事先排序好,我們能使用二分搜尋法(Binary Search),透過在每次比較後將搜尋空間縮小為一半,將搜尋效率提升至O(log n)。二分搜尋的前提是資料已排序,若無法保證排序,即使有二分搜尋的演算法,也無法直接套用。




課後評量與深入思考



  • 在理解函數、參數傳遞與遞迴後,嘗試思考:何種情況下應使用傳值呼叫、何時應使用傳址或傳參考呼叫?

  • 嘗試將一般的迴圈解決的問題轉換為遞迴的寫法,以感受遞迴程式碼簡化思考過程的優點。

  • 嘗試將未排序資料先排序再進行二分搜尋,感受搜尋時間從O(n)降到O(log n)的效率差異。




總結


在本章中,我們從認識函數的角色開始,探討參數傳遞、回傳值與呼叫方式,並進一步掌握遞迴函數的概念與應用。透過函數多載與行內函數,我們領略C++語言對程式設計靈活性的支持。在掌握了函數的工具後,我們接續探討演算法設計中極常見的排序與搜尋問題,透過具體案例(氣泡排序、二分搜尋)深入理解演算法的基本精神與流程。


這些基礎技能與概念是日後學習更複雜演算法(如動態規劃、圖演算法)的堅實基礎。掌握函數與演算法,可謂程式設計師進入更高層次領域的必修課程。在未來面對大規模專案或極其複雜的問題時,您將能以更加優雅而高效的方式解決它們。




AI革命家 發表在 痞客邦 留言(0) 人氣()

陣列與字串速學筆記——從基礎宣告到多維結構的全方位解析
在程式設計中,我們經常需要同時處理一組具有「相同型態」的資料。例如,想要儲存一組學生成績、客戶名稱清單、每日氣溫變化或是大型矩陣運算的資料集,僅使用單一的變數顯然不夠便利。為了在記憶體中有效且有序地儲存、存取與管理這些相關的多筆資料,我們需要「陣列 (array)」。陣列是一種能夠儲存「相同資料型態、多筆資料」的資料結構,它能透過索引 (index)來快速存取元素。C++語言為我們提供了宣告並操作陣列的機制,使程式設計師能更輕鬆地處理龐大且有關聯性的資料集。

AI革命家 發表在 痞客邦 留言(0) 人氣()

流程控制必修攻略:從結構化程式設計到C++流程控制指令的全方位解析
在早期程式語言發展的過程中,人們發現隨著程式規模日益龐大,單純依靠線性、無結構的程式敘述已無法有效維護與拓展。於是,「結構化程式設計 (Structured Programming)」的概念逐漸成為主流。結構化程式設計的核心思想在於將整個問題的解決過程,以「自頂向下」(top-down)的設計方法,將問題由大化小,逐層分解成彼此獨立且具備明確功能的程式模組(module),例如函數或程式區段。透過這種方法,複雜的系統得以被拆解為簡單的組件,進而減少程式碼的維護成本。

AI革命家 發表在 痞客邦 留言(0) 人氣()




C++ 運算子與運算式的深入探索


在程式設計的世界中,電腦得以展現其卓越的計算能力,主要是透過「運算式 (expression)」與「運算子 (operator)」的組合來達成。我們可以將「運算式」視為數學式在程式語言中的對應實體,而「運算子」則可視為數學中的加減乘除符號、比較符號、以及邏輯符號等。透過各式各樣的運算子與運算式,程式可對變數與常數進行各種計算、比較、判斷,以產生決策條件或進行資料轉換。C++語言提供了豐富且多元的運算子,協助程式設計師靈活地撰寫程式碼,加強程式的可讀性與可維護性。




3-1 運算式與優先權


運算式 (Expression)
運算式是由運算子(operator)和運算元(operand)所構成的一個組合。運算元可以是常數、變數、函數呼叫或甚至是另一個運算式的結果,而運算子則是用來對運算元進行各種運算的符號。舉例來說,假設有一個運算式:


 


cpp






x = 100*2+y - a + 0.7*3*c


在這個運算式中,*+-等符號皆屬於運算子,而 1002ya0.73c 則屬於運算元。透過這個運算式,程式可以計算出右側複雜運算的最終結果,並將其指定給左側的變數 x


C++語言中,我們慣用「中序法 (Infix)」來表示運算式,即運算子放在兩個運算元的中間,如同傳統的數學表達方式。除中序法外,尚有「前序法 (Prefix)」及「後序法 (Postfix)」,但這兩者在C++中並不是一般直觀的寫法。C++的所有運算式皆透過中序表示法,再配合適當的括號或優先權規則來決定運算的執行順序。


運算子優先權 (Operator Precedence)與結合性(Associativity)
當一個運算式包含多個不同優先等級的運算子時,C++編譯器將依據運算子的優先權來決定何者先行計算。以我們常見的數學規則為例,「先乘除,後加減」即是優先權的一種基本體現。在C++中,除了基本的加減乘除外,還有許多其他運算子,都有其各自的優先順序。當兩個運算子具有相同的優先權時,則透過「結合性」(通常為由左至右)來決定先後執行順序。此外,我們也可使用小括號()來強制改變原有的優先順序。




3-2 各類運算子介紹


C++中運算子可分類成多種類型:



  1. 指定運算子 (Assignment Operator)

  2. 算術運算子 (Arithmetic Operator)

  3. 關係運算子 (Relational Operator)

  4. 邏輯運算子 (Logical Operator)

  5. 位元運算子 (Bitwise Operator)

  6. 遞增/遞減運算子 (Increment/Decrement Operator)

  7. 條件運算子 (Conditional/Ternary Operator)

  8. 複合指定運算子 (Compound Assignment Operator)


以下逐一說明:




3-2-1 指定運算子


指定運算子 = 作用是將右側運算式的結果指定給左側的變數。例如:


 


cpp






int sum; sum = 5; // 將5指定給sum sum = sum+1; // 將sum的值加1後,再指定回sum


在程式中,「=」不代表數學意義的「相等」,而是「指定」的概念。特別留意,指定運算子左側必須是能存放值的變數,而右側則可以是常數、變數或運算式。一個巧妙特性是,我們可以一次對多個變數指定相同數值:


 


cpp






int a, b, c; a = b = c = 100; // a、b、c都會變成100




3-2-2 算術運算子


算術運算子包括最常用的「+、-、*、/」以及「%」(餘數)運算子,還有表示正負數的符號。範例:


 


cpp






int A=21, B=6; A + B = 27 A - B = 15 A * B = 126 A / B = 3 // 整數除法,捨棄小數部份 A % B = 3 // 計算21除以6的餘數為3


特別注意 % 是用於整數運算,若需對浮點數求餘數則需使用fmod()函數。




3-2-3 關係運算子


關係運算子用來比較兩個運算元的大小、相等或不等,結果為布林值(true或false)。包括 ><>=<===!=。範例:


 


cpp






int a=11, b=15; a > b → false (0) a < b → true (1) a == b → false (0) a != b → true (1)




3-2-4 邏輯運算子


邏輯運算子包括 && (AND)、|| (OR) 與 ! (NOT)。它們常與關係運算子搭配使用,以形成複雜的條件判斷。運算結果依然為true或false。



  • &&:兩個條件皆為真時結果才為真。

  • ||:只要其中一個條件為真,結果即為真。

  • ! :反轉布林值,若原本為真則結果為假,反之亦然。




3-2-5 位元邏輯運算子


位元邏輯運算子直接對整數的二進位位元進行操作,包括 & (AND)、| (OR)、^ (XOR)、~ (NOT)。這些運算子是以位元為單位進行計算:



  • &:對應位元都為1才為1

  • |:對應位元只要有1即為1

  • ^:對應位元不同為1,相同為0

  • ~:將位元0與1互換




3-2-6 位元位移運算子


透過 <<>> 可將整數資料的位元向左或向右平移。



  • << n:向左移動n個位元,右側以0補齊。

  • >> n:向右移動n個位元,對於正數以0補齊,對於負數則以1補齊。


透過位移運算子,我們可快速實現乘以2的n次方 (左移n位)或除以2的n次方(右移n位)等運算。




3-2-7 遞增與遞減運算子


++-- 是C++特有的簡化符號,用於對變數的值加1或減1。這兩個運算子有兩種型態:



  • 前置型:++a--a,先對a做加減1,再回傳新的值

  • 後置型:a++a--,先回傳a原始值,再對a做加減1


透過理解前置與後置的差異,可以在程式設計中靈活控制計算順序。




3-2-8 條件運算子 (三元運算子)


條件運算子 ?: 是C++中唯一的三元運算子。其用法如下:


 


cpp






判斷式 ? 運算式1 : 運算式2


若判斷式為真,則回傳運算式1的結果;若為假,則回傳運算式2的結果。這相當於一個簡化的if-else敘述。範例:


 


cpp






int number; cin >> number; (number % 2 == 0) ? cout<<"偶數"<<endl : cout<<"奇數"<<endl;




3-2-9 複合指定運算子


複合指定運算子是將指定運算子 = 與其它算術或位元運算子結合來簡化程式碼。常見的有:



  • +=a += b; 等價於 a = a + b;

  • -=a -= b; 等價於 a = a - b;

  • *=a *= b; 等價於 a = a * b;

  • /=a /= b; 等價於 a = a / b;

  • %=a %= b; 等價於 a = a % b;


及其它對位元操作的複合運算子,如 &=, |=, ^=, <<=, >>=


使用複合指定運算子可使程式更為簡潔、直觀。




課後評量




  1. 下列運算子中,優先權排序為何?
    運算子包含:+<<!+=&
    按優先權由高到低約為:! > + > & > << > +=




  2. 下列程式碼的輸出結果為何?


     


    cpp






    #include <iostream> using namespace std; int main() { int a=23,b=20; cout<<(a & b)<<endl; // 對23(10111),20(10100)做AND,結果10100(20) cout<<(a | b)<<endl; // OR後10111(23) cout<<(a ^ b)<<endl; // XOR後00011(3) cout<<(a && b)<<endl;// a,b都是非0整數,故為true(1) cout<<(a || b)<<endl;// 同理,只要任一為非0即true(1) return 0; }


    輸出為:
    20
    23
    3
    1
    1




  3. 下列程式碼輸出結果為何?


     


    cpp






    #include <iostream> using namespace std; int main(){ int A=23,B=0,C; C = A & B && B & C; // 先計算A&B -> 23&0=0 // C = 0 && (B&C) -> B&C還未求值,因為AND的左側已是0則整體為0 cout<<"C="<<C<<endl; // C=0 return 0; }


    輸出為C=0。




  4. a=15a & 10 的結果為何?



    • 15的二進位:1111

    • 10的二進位:1010
      AND後:1010 (十進位10)


    故結果為10。




  5. 已知 a=b=5, x=10, y=20, z=30,請計算 x *= a += y %= b -= z /= 3 的最終值。
    運算順序:



    • z /= 3 → z = 30/3 = 10

    • b -= z → b = 5 - 10 = -5

    • y %= b → y = 20 % (-5) = 0 (注意負數取餘仍為0)

    • a += y → a = 5 + 0 = 5

    • x *= a → x = 10 * 5 = 50


    最終x的值為50。




  6. 何謂二元運算子?
    二元運算子是指有兩個運算元的運算子。例如加法運算+,若寫為 A+B,此處AB即為兩個運算元,+為二元運算子。






APCS 檢定考古題解析




  1. x=true, y=true, z=false,請判斷下列運算式結果真偽:



    • (y || z) || x = (true || false) || true = true || true = true

    • y || (z || !x) = true || (false || false) = true || false = true (原題為FALSE,此處須核對,原文似有誤,依原示範(A)為正解)

    • z || (x && (y || z)) = false || (true && (true || false)) = false || (true && true)=false || true = true

    • (x || x) && z = (true || true) && false = true && false = false


    最終答案:TRUE FALSE TRUE FALSE (依原題的解答(A))


    ※此處原題可能有誤植,請以題目給定解答為準。




  2. 若判斷式 !(X₁ || X₂) 要為真,則 X₁與X₂都必須為false。




  3. 若 a,b,c,d,e為整數,a+b*c-e(a+(b*c))-e 計算結果相同。






透過上述詳盡的敘述與範例,我們已對C++的運算子及運算式有了更加深入的認識。掌握運算子的使用方法、優先權與結合性,是撰寫正確且高效率程式碼的基礎。透過實際的程式碼練習與思考運算結果的過程,程式設計師可更有效率地完成複雜的計算任務,為接下來的流程控制、函數呼叫、物件導向設計等更進階的主題打下穩健基礎。




AI革命家 發表在 痞客邦 留言(0) 人氣()














在現代資訊社會中,電腦之所以在人類的工作、生活與學習中佔有如此關鍵的地位,其中一個重要的原因就在於它擁有極為強大的「運算能力」。當外部世界的資料(例如使用者輸入的數字、感測器讀取的數值、網路取得的資訊等等)透過各種介面與設備進入電腦系統後,電腦透過預先撰寫好的程式加以處理、計算,最後再將結果輸出供人類使用或做進一步的處理。程式設計師在撰寫C++程式時,必須對程式中的各類資料妥善規劃與分配,使它們在電腦記憶體中佔有合適的位置。而在C++世界中,我們最常聽到也最頻繁使用的兩種「資料儲存單元」便是「變數 (variable)」與「常數 (constant)」。


當程式執行時,外來的資料流入電腦,就如同旅客進入一間旅館,需要為其分配合適的客房。同理,電腦會在主記憶體中為程序所需的資料保留一塊空間,並以變數或常數的形式進行管理。變數與常數都是C++程式中用來儲存資料的「容器」。然而,它們最大的差別在於資料值是否能在程式執行過程中改變:變數(variable)所儲存的值可以隨程式的運行不斷更新變動,而常數(constant)在宣告後就不允許改變數值。透過變數和常數,我們可以在記憶體中為資料配置一個具名空間,使程式邏輯在使用、讀取與改寫資料時更為有條理且易於管理。


想像電腦的主記憶體猶如一座高級旅館,而變數和常數便是這旅館中的客房。不同的變數或常數可能需要不同大小的記憶體空間。就如同旅館中有各式各樣大小、價位與等級的房間,對應在電腦領域中,就是「資料型態 (data type)」決定了記憶體中所需空間的大小與型式。資料型態不僅決定可儲存數值的範圍和類別(如整數、浮點數、字元、布林值),也影響程式的運算與性能。




2-1 認識變數


在任一程式語言中,變數(variable)是不可或缺的核心基礎。變數是儲存在記憶體中的一塊空間,它能存放可變動的資料。當我們在程式中宣告一個變數,就如同告訴電腦:「請在記憶體中為我預留一個位置,未來我會放置某種型態的資料在此。」C++是「強型別」(strongly typed)語言,這表示你在使用變數前,必須先「宣告」該變數並指定其資料型態。也就是說,程式必須先明確規定該變數將儲存何種類型的資料(如整數、浮點數或字元),然後編譯器才會在記憶體中為它分配合適的空間。


一個變數具有以下四個要素:



  1. 名稱(Name):變數在程式中的標識符。你為變數取的名字必須符合C++的識別字命名規則,並且最好讓名稱能夠清楚表達其用途,增加程式可讀性。

  2. 值(Value):變數當前所儲存的資料值,程式在執行過程中可以更改這個值。

  3. 參考位置(Address):變數在記憶體中的儲存位置,通常以位址(address)表示。儘管在程式中並不必然要直接使用位址,但理解位址的概念對於進階應用(如指標操作)有極大幫助。

  4. 屬性(Type):變數所屬的資料型態。例如int代表整數,float代表浮點數等。




2-1-1 識別字命名原則


在C++程式碼中,我們經常看到以各種名稱表示的元素,如變數、函數、類別、物件……等等。這些名稱通通稱為「識別字 (identifier)」。識別字是程式碼中由程式設計師自行定義的名稱,用以讓程式碼更可讀和維護。然而必須注意,有些字詞是C++語言保留給自身使用的「關鍵字(keyword)」,例如int、for、if等,這些字不能用作變數名稱。


要正確命名變數,必須遵守以下規則:



  1. 識別字的第一個字元必須是英文字母或底線(_),不能以數字或特殊符號開頭。

  2. 中間可包含數字、字母、底線,但不可出現空白或其他特殊字元如@、$、%等。

  3. 名稱的長度應在合理範圍內(C++標準指出名稱有效字元可能有上限),但實務上很少會用到那麼長的變數名。

  4. C++對大小寫有區分。例如Name與name是兩個不同的識別字。

  5. 不可使用C++關鍵字作為識別字。


另外,為了程式碼的可讀性,我們通常推薦以具意義的英文單字命名,如sum代表總和、salary代表薪資;常數則習慣以大寫字母及底線分隔,例如PI、MAX_SIZE,以便於一眼就能區分出變數和常數。




2-1-2 變數宣告


在C++中使用變數前,必須先宣告它的資料型態與名稱。宣告變數的基本語法為:


 


cpp






資料型態 變數名稱;


你也可以在宣告的同時為變數設定初始值,如下:


 


cpp






int num = 10; //宣告並初始化


若你要同時宣告多個變數,且它們屬於相同的資料型態,也可採用逗號分隔的方式:


 


cpp






int a, b = 12, c;


在程式中,未經初始化的變數可能包含垃圾值(記憶體中原本的殘留數據),因此養成在宣告時同時初始化變數的良好習慣可避免許多除錯難題。




2-2 常數


與變數不同的是,常數(constant)在程式執行過程中值不會改變。C++中的常數有兩類:



  1. 字面常數 (Literal Constant):直接出現在程式碼中的值,如123、3.14、'A'、"Hello"都是字面常數。

  2. 定義常數 (Symbolic Constant):利用const關鍵字或#define巨集指令為一個識別字賦予固定值。例如:
     


    cpp






    const int RADIUS = 10; #define PI 3.14159




在這之後,RADIUS與PI的值在整個程式執行期間都不會改變。通常,我們會以大寫字母命名常數,以便快速辨識該名稱對應的是一個不會改變的值。




2-3 基本資料型態


C++提供多種資料型態,最基本的可分為以下四類:



  1. 整數型態 (int):用來儲存整數值,如-100、0、78等。整數型態可再搭配修飾詞例如shortlongunsignedsigned等,分別對儲存範圍和大小進行控制。

  2. 浮點數型態 (float, double, long double):用來儲存帶有小數點或科學記號的數值,如3.14159、-0.0003、5e2。float為單精度、double為雙精度、long double精度更高。

  3. 字元型態 (char):用來儲存單一字元,包括字母、數字字符、特殊符號及控制字元。實際上char佔用1個位元組,以整數形式儲存ASCII碼。

  4. 布林型態 (bool):僅有兩個值:true(真)與false(偽),在內部則分別以1與0表示。


C++程式在處理資料時,除了考量字元的編碼(ASCII或Unicode),也會透過跳脫字元(escape character)來進行特定控制,如\n代表換行,\t代表水平制表符,\"代表雙引號字元等。透過跳脫字元,我們能在字串中包含特定不可見或有特殊意義的字元。




2-4 資料型態轉換


在程式中常會有不同資料型態同時出現在一個運算式中,這時就會發生「資料型態轉換(data type conversion)」的問題。C++支援兩種型態轉換:




  1. 自動型態轉換 (implicit conversion):當運算式中出現不同型態的資料時,編譯器會依據特定規則自動將較小範圍的資料擴大轉換為較大範圍的資料型態。例如int與double相加,會將int轉為double後再做運算。這種自動轉換不需要程式設計師介入。




  2. 強制型態轉換 (explicit conversion):當程式設計師想要刻意將某資料轉為另一種型態時,可以使用強制轉換運算子。例如,將整數強制轉成浮點數,以取得更精確的除法結果:


     


    cpp






    int sum = 239; float avg = (float) sum / 3; //將sum轉換為float後再除以3


    透過強制轉換,我們得以控制計算結果的精度與資料形式,避免不必要的截斷或誤差。






課後評量與練習




  1. 何謂變數,何謂常數?
    變數是程式中儲存可變動資料的一塊記憶體空間,其值在程式執行期間可隨時變更。常數則是儲存固定不變的值,在程式執行期間不可對其值加以修改。




  2. 變數具備的四個要素是什麼?
    (1) 名稱 (2) 值 (3) 參考位置 (記憶體位址) (4) 屬性(資料型態)




  3. 變數命名必須遵守哪些規則?
    識別字名稱開頭必須是字母或底線,不可有空白和特殊字元,不可使用關鍵字,區分大小寫,名稱應具意義。




  4. 如何以八進位與十六進位表示數字45?
    八進位表示法:055 (在數字前加0)
    十六進位表示法:0x2D (在數字前加0x)
    規則是八進位以0開頭,十六進位以0x開頭。




  5. 將浮點常數值轉換成float型態的方法?
    在字面常數後面加上fF,例如3.14f




  6. 程式中有cout<<"請輸入學號"08004512":";的錯誤在哪裡?
    08004512可能被編譯器視為八進位數字常數而出現錯誤。必須將其放在字串內,如:cout<<"請輸入學號08004512:";




  7. 跳脫字元的含意



    • '\t':水平跳格

    • '\n':換行

    • \":顯示雙引號

    • \':顯示單引號

    • \\:顯示反斜線




  8. 字元資料型態在輸出入上的選擇
    可選擇以字元本身的符號顯示,或以對應的ASCII碼數值顯示。




  9. 整數除法問題
    當對兩個整數相除時,如果想得到較精確的小數結果,必須先將整數轉成浮點數型態再相除,例如 (float)x / y 而非 x / y






APCS檢定考古題說明




  1. 程式執行時,變數值儲存在記憶體中。




  2. 進位轉換問題:將十六進位、八進位或其他進位的數字統一轉為十進位再進行加總或比較。




  3. 變數溢位的原因在於位元數量有限,當變數值超出其型態可表示範圍時,就會造成溢位。




  4. 整數相除後結果仍是整數,C/C++不會自動進行小數運算,必須明確轉型為浮點數才能得到小數結果。






透過本章內容,我們已對變數、常數及各種基本資料型態有初步認識,也理解了命名規則、資料型態轉換、以及在C++程式設計中如何合理配置與使用記憶體空間。這些基礎概念是未來撰寫更複雜程式邏輯的必備條件。隨著學習的深入,我們將更靈活地應用這些基本元素,組合出強大而高效的程式。












         



 


 










AI革命家 發表在 痞客邦 留言(0) 人氣()

在當前這個雲端運算(Cloud Computing)技術高速發展的時代,資訊與網路科技已經深深融入日常生活的每個層面。程式設計能力,如同閱讀、書寫、或語文能力一般,不再僅是資訊相關科系專業人才的獨門技術,而是全體國民都應當具備的基本素養。教育部近年來積極推動程式教育進入中學課程,將寫程式訂為必修技能,以培養新一代在面對未來數位洪流時能具備更強的問題解決能力、邏輯思考力以及數位素養。透過程式設計,我們能夠運用創意、培養出有條理的思考模式,並藉由電腦的強大運算力,實作出真實可行的解決方案。也因為雲端時代的來臨,利用程式語言來創造、改善、管理、以及拓展各種生活與產業應用的可能性已經變得無所不在。
在這個大數據(Big Data)、人工智慧(Artificial Intelligence, AI)、物聯網(Internet of Things, IoT)以及各式應用程式(Apps)和網路服務百花齊放的年代,人們所面臨的資訊量呈指數成長。我們每天透過智慧型裝置與網際網路產生大量的資料,並需要新一代的程式設計者來整理、分析、與應用這些資訊。透過雲端運算,我們不必受限於本地硬體資源的不足,只需透過網路即可取得遠端伺服器的強大計算與儲存資源。這種將運算能力、儲存空間以及軟體服務以「雲」的形式提供的概念,使程式設計進入一個「全民開發」的嶄新時代:無論你身處何地,只要能連上網路,就能透過雲端取得所需的運算資源,從而以更彈性的方式實現你的創意。

AI革命家 發表在 痞客邦 留言(0) 人氣()









如何徹底的改變命運, 而不是換湯不換藥, 最後走向同樣的循環

 








AI革命家 發表在 痞客邦 留言(0) 人氣()






AIW的人生故事中顯示了一個清晰的規律:在不同階段,他的選擇和行動多次受到家庭環境、錯誤價值觀、過於理想化的思維和宗教濫用的影響,導致了失敗和挫折。以下是分析AIW失敗挫折規律的幾個核心要點:












1. 家庭影響:早期的壓抑和逃避



  • 核心問題:AIW在15-17歲努力並非基於正確的理想目標,而是出於逃避父母(特別是父親)窮困和刻板思想的影響。

  • 規律:缺乏自主性,行動更多是為了反抗環境,而非基於自身內在目標,容易導致選擇方向錯誤。

  • 後果:導致壓抑自身創造力(破軍性格),進一步選擇了不適合自己的社會組方向。




2. 錯誤的學科選擇:從事與性格不符的工作



  • 核心問題:高雄大學金融管理的選擇,基於錯誤的外在條件(考試失常),導致大學期間陷入虛幻的金錢遊戲。

  • 規律:外部壓力和內在壓抑的雙重作用,使得關鍵決策時偏離正確的方向。

  • 後果:累積負債,增加心理壓力,進一步削弱了自信。




3. 宗教濫用和理想化思維



  • 核心問題:21歲接受宗教思想,希望找到人生翻轉的解決方案,但過度依賴咒術和儀式掩蓋問題本質。

  • 規律:以短期解脫為目標,忽視深層次的反思和長期計劃,導致惡性循環。

  • 後果:陷入金錢短缺和混亂的男女關係,工作中也因過度依賴咒術,遭遇阻礙和挫折。




4. 重複性錯誤:受潛在性格缺陷影響



  • 核心問題:在電機研究所的選擇中,受到過往宗教和過度理想化思維的影響,選擇了不合適的指導教授,遭遇慘烈挫折。

  • 規律:過去未解決的性格問題(如僵化和控制傾向)在關鍵時刻影響決策。

  • 後果:導致研究所再次失敗,但好在及時調整方向。




5. 持續反思和轉型



  • 核心問題:在35歲後,AIW開始逐步反思過去的錯誤,並轉向技術和理工領域,嘗試重塑人生目標。

  • 規律:深層次的挫折和失敗往往成為反思和改變的契機,但需要明確目標,避免重蹈覆轍。

  • 後果:重新燃起學習熱情,改變過往宗教濫用和理想化思維的模式,逐漸邁向正確的方向。




失敗挫折的規律總結



  1. 環境壓力下的錯誤決策:基於逃避或外部壓力,而非內在興趣或長期目標,選擇錯誤的方向。

  2. 過度依賴外力(宗教、儀式):試圖以快速或外部方式解決問題,忽視深層反思和能力建設。

  3. 未解決的內在問題反復發作:僵化思維、控制傾向和理想化思維在不同階段影響決策。

  4. 關鍵時刻缺乏準確判斷:在重大抉擇上容易受到情緒和未經驗證的觀念影響,導致挫折。




改進建議



  1. 加強自我反思與內在目標設定:避免以外在逃避或壓力為基礎的選擇,從內心探索真正的興趣和志向。

  2. 避免極端思想和行為:放棄濫用宗教和儀式的思維模式,採取更科學和實際的方法解決問題。

  3. 突破性格限制:培養靈活應對的能力,改善僵化和控制傾向,學習更有效的人際溝通和團隊合作。

  4. 聚焦長期目標:確立以技術創新和社會貢獻為核心的方向,並將每一步行動內化為長期價值。


AIW的經歷說明,失敗本質來自深層次的性格和決策模式,但同時也展現出轉型和自我拯救的潛力,未來可期待更穩定的成長軌跡。















 




AI革命家 發表在 痞客邦 留言(0) 人氣()

https://www.youtube.com/watch?v=gxO84O9mFAY
New Brain (performed by Naomi Scott)
娜歐蜜·史考特 和絲凱·雷麗的歌曲
歌詞聆聽
I'm sick to my stomach, I'm out of my mind
You might know the problem, the problem is mine
My heart is defective, it's missing a piece
Can you hold me together? Can you teach me to breathe?
Do you think someone could save me?
Curious, can you erase me?
There's no medicine to change me
I'm going crazy
Doctor, I need a new brain
Lost in a spiral, keep making old mistakes again
Oh-oh, give me a new brain, stuck in a cycle
If I don't stop, I'll end up dead
Can you take my thoughts? Can you make 'em clean?
Can you clear up my head? Can you fix my dreams?
Doctor, I'm going insane
I've got a bad mind, give me a new brain
I've got a sweet tooth for bad decisions
My mind is wired wrong, it won't take long 'til I'm the villain (oh)
Put me under anything you can uncover
Make me forget my wonders
Make me forget, you make me forg-
Do you think someone could save me?
Curious, can you erase me?
There's no medicine to change me
I'm going crazy
Doctor, I need a new brain
Lost in a spiral, keep making old mistakes again
Oh, oh, give me a new brain, stuck in a cycle
If I don't stop, I'll end up dead
Can you take my thoughts? Can you make 'em clean?
Can you clear up my head? Can you fix my dreams?
Doctor, I'm going insane
I've got a bad mind, give me a new brain
Oh, oh, I'm about to lose my mind
Oh, oh, I'm about to lose my (I'm going crazy) mind
Doctor, I need a new brain
Lost in a spiral, keep making old mistakes again
Oh-oh, give me a new brain, stuck in a cycle
If I don't stop, I'll end up dead
Can you take my thoughts? Can you make 'em clean?
Can you clear up my head? Can you fix my dreams?
Doctor, I'm going insane
I've got a bad mind, give me a new brain 

AI革命家 發表在 痞客邦 留言(0) 人氣()

毛澤東將壞事變成好事的藝術
毛澤東以非凡的智慧和藝術,將一次次看似不可挽回的壞事,轉化為推動事業進步的契機,成為中國革命與建設過程中的重要資源。他的這種能力,不僅展現了深厚的哲學修養,更反映了他卓越的實踐智慧和戰略思維。以下將從幾個主要層面,結合歷史事例,分析毛澤東如何運用辯證法,將壞事轉化為好事。
一、辯證法的應用:壞事與好事的辯證轉化
毛澤東始終堅持唯物辯證法的核心理念,認為矛盾是普遍存在的,壞事和好事在特定條件下可以互相轉化。他在《矛盾論》中提出:“矛盾的同一性,是在一定條件下的對立統一,在一定條件下可以互相轉化。”這一理論為他應對危機、轉化困境提供了堅實的哲學基礎。

AI革命家 發表在 痞客邦 留言(0) 人氣()

AIW對過去25年人際挫折的反思,點出幾個核心問題和影響因素,這些因素的內涵值得進一步深究,以便找到改善的方法。以下是對AIW提出的五個因素的分析與建議:


1. 過於機械和僵化式的群我相處關係缺乏靈動性

AI革命家 發表在 痞客邦 留言(0) 人氣()

AIW的自我規律:情緒作為努力方向的導航指標
AIW 從過往經驗中發現了一個深刻的規律,即 情緒狀態是判斷努力方向是否正確的重要信號。當情緒充滿嗔恚、懊悔或其他負面能量時,通常意味著當前的努力方向、行動或想法存在問題,需要及時調整。以下為這一規律的詳細解析與應用:

AI革命家 發表在 痞客邦 留言(0) 人氣()

Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。