發表文章

目前顯示的是有「Java」標籤的文章

LeetCode OJ: 125. Valid Palindrome 迴文判斷

題目連結  https://leetcode.com/problems/valid-palindrome/ 。 此題和 a022: 迴文 、 a038: 數字翻轉 、 LeetCode OJ: 9. Palindrome Number 迴文數字 類似。但本次要用Java String 的函數  reverse() 來解。先將非英文字母與數字給刪除,並轉成小寫,之後就可以呼叫  reverse() 做翻轉為 rev 字串,並和原字串 actual 比較是否相同。 程式碼: 1 2 3 4 5 6 7 public class Solution { public boolean isPalindrome ( String s ) { String actual = s . replaceAll ( "[^A-Za-z0-9]" , "" ). toLowerCase (); String rev = new StringBuffer ( actual ). reverse (). toString (); return actual . equals ( rev ); } } 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 If you like this post, please click the ads on the blog or buy me a coffee . Thank you very much.

打造自己的APCS實作題系統環境

底下文件是參考APCS官網所提供的 系統環境資訊 而建立出來的虛擬環境,用的 Lubuntu 版本是 Lubuntu Desktop 18.04 (32-bit) 。 文件下載處: APCS_Lubuntu環境建立 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 If you like this post, please click the ads on the blog or buy me a coffee . Thank you very much.

各種程式語言從檔案讀取一行文字的方法

在程式語言裡,常常會需要讀取一行文字。那麼在各式各樣程式語言中的程式碼又會是何種樣子呢?底下分別列出筆者知道的程式語言之寫法。 C語言 C++語言 Java語言 Python語言 C#語言 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 If you like this post, please click the ads on the blog or buy me a coffee . Thank you very much.

電腦遊戲設計入門

本部落格的幾篇文章: Console-based or GUI-based game programming 遊戲程式開發工具與網站 ( Tools and their website for game programming ) 開源跨平台遊戲開發工具介紹:GDevelop MIT App Inventor 2 乒乓球遊戲 Python 猜數字遊戲 用 Corona SDK 寫遊戲 Python 遊戲設計:軟體安裝 ( Python Game Development: Software Installation ) Pygame 遊戲設計:鍵盤控制角色移動 Scratch 程式設計教學 Java 遊戲程式設計:基礎篇 (Java Game Programming: The Basic) Java 遊戲程式設計:動畫 ( Java Game Programming: Animation ) Java 遊戲程式設計:鍵盤控制 (Java Game Programming: Control a Sprite with the Keyboard ) Java 遊戲程式設計:用鍵盤控制控制兩個長方形 ( Java Game Programming: Controlling two Sprites with the Keyboard ) Java 遊戲程式設計:乒乓球遊戲 ( Java Game Programming: Ping Pong ) etc. 說明了一些開發環境的建立,也介紹了一些小遊戲的做法。但, 設計電腦遊戲一定要學程式設計嗎 ?例如 開源跨平台遊戲開發工具介紹:GDevelop 文中提到的 GDevelop  以及  遊戲程式開發工具與網站 ( Tools and their website for game programming )  所提到的  Clickteam Fusion 、 RPG Maker ,這三款軟體皆可不需撰寫程式碼,就可以設計遊戲囉。 除了這三款軟體之外,還有沒有其他的工具呢?當然有(不然要這篇文章做什麼呢!?)。此類軟體有免費與付費的,底下就分為這兩類來介紹。 須付費電腦遊戲設計軟體: Game Maker https://www.yo...

APCS解題技巧

圖片
底下分享筆者在解APCS實作題相關題目(如 高中生解題系統 、 LeetCode 、 UVa Online Judge 、 HackerRank 等)以及APCS觀念題所用到的技巧。 一、看懂題目 這一點是最重要的,因為看不懂APCS的題目時,也就等於準備交白卷啦。但請在仔細想想,若看不懂題目時,要怎麼辦呢?這部分要怎麼讓自己增加看懂題目的能力呢? 請嘗試看很多不同的題目並看懂,但先不要解題。 請嘗試看很多不同的題目並看懂,但先不要解題。 請嘗試看很多不同的題目並看懂,但先不要解題。 為什麼要這樣子做呢?因為我們不知道APCS的題目類型會是怎麼樣,讓自己熟悉不同類型的題目時,就可以很快地知道題目的重點在那兒。底下分別以幾個例子說明APCS觀念題與實做題的一些題目類型。 觀念題部份 (圖取自 APCS官方提供的歷屆試題 ): 以上幾題主要是考 遞迴函式 的觀念,也包含 函式 、 迴圈 、 判斷 、 陣列 等觀念。 實做題部份 (圖取自 APCS官方提供的歷屆試題 ): 這部份的每一次考試的試題會有四題, 題目幾乎都是由易入難(第一題最簡單,第四題最困難) ,且每題都會說明評分方式,因此會有 部份給分 的情況,所以 作答時應依自己最容易取得分數的部份開始做起 。 二、分析題目 遇到不熟悉的觀念題題目時,可以先用紙筆將程式的每一行程式碼執行結果記錄下來,這樣子可以了解程式碼的運算結果是什麼,接著再來分析這些結果有什麼規律來找出規則。實作題部份都會說明題目以及範例說明,基本上也是得看懂題目才能想出解法。根據官方所提供的實作題: 2017-10-28_實作題_試題下載 、 2017-03-04_實作題_試題下載 、 2016-10-29_實作題_試題下載 、 2016-03-05_實作題_試題下載 。可以了解到,考題都是偏向要想出演算法來解題,所以除了程式語言的語法觀念外,還需熟悉一些基礎演算法,例如 排序 、 搜尋 、 堆疊 、 佇列 等觀念。主流的程式語言通常會有這些常見演算法的函式可用,這部份在後面說明。 三、善用工具 朋友們有看過本部落格的「 APCS 解題:特殊編碼 」這篇文章嗎?這篇文章用了 字典 的觀念,並以C++、Java、Python三種程式語言來實作。 疑!沒有用C程式語言來實作耶...

APCS 實作題 10610 第1題邏輯運算子參考解法

圖片
題目說明請看高中生解題系統上的「 c461: apcs 邏輯運算子 (Logic Operators) 」或是底下圖片。 此題考C語言的「 非零為True之觀念 」,解法很單純, 將非零的數值轉為True ,以及邏輯運算就可以了。筆者用四種版本的語言來實作。 C 語言: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include <stdio.h> #include <stdbool.h> int main () { int a, b, c; while (scanf( "%d %d %d" , & a, & b, & c) == 3 ) { // 非零轉為True if (a > 0 ) a = true ; if (b > 0 ) b = true ; c == 1 ? true : false ; bool hasAns = false ; // 邏輯運算結果 if ( (a & b) == c ) { printf( "AND \n " ); hasAns = true ; } if ( (a | b) == c ) { printf( "OR \n " ); hasAns = true ; } if ( (a ^ b) == c ) { printf( "XOR \n " ); hasAns = true ; } if ( hasAns == false ) printf( "IMPOSSIBLE \n " ); } return 0 ; } ...

APCS 實作題 10706 第1題特殊編碼參考解法

圖片
此題為APCS 2018 年 6 月檢測的第一題,題目來源為吳邦一老師所提供的「 APCS 2018 年6 月實作題檢測題目分析與解答 」,題目內容如下: 此題在高中生程式解題系統的題號為: e283: APCS 類似題 - 小崴的特殊編碼 筆者採取比較取巧的方式:「 查表法 」。於是就用字典來實作,Python程式碼如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 讀取正整數 N n = int ( input ()) # 字母編碼的對應表 decodeL = { '0 1 0 1' : 'A' , '0 1 1 1' : 'B' , '0 0 1 0' : 'C' , '1 1 0 1' : 'D' , '1 0 0 0' : 'E' , '1 1 0 0' : 'F' } num = [] # 讀取每一行的字母編碼 for i in range (n): num . append( input ()) # 查表輸出對應的字母 for i in range (n): print (decodeL[num[i]], end = '' ) 註:此Python在高中生解題系統會拿到 83% 的分數,要怎麼修改成 100%呢? Python 程式碼第二版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import sys # 字母編碼的對應表 decodeL = { '0 1 0 1' : 'A' , '0 1 1 1' : 'B' , '0 0 1 0' : 'C' , '1 1 0 1...

APCS 檢測系統環境導覽

圖片
本篇文章是根據 APCS官網 的 檢測系統環境(https://apcs.csie.ntnu.edu.tw/index.php/info/environment/) 來建立環境。建立好後,登入畫面如下: 看起來有提供範例程式,以及相關程式語言的開發環境,而根據官網的說明,會提供底下軟體: 那筆者就來實際測試看看囉。首先略過不是關注的重點:OS和Desktop。 Editors 點選桌面的Leafpad圖示,並開啟 P3.cpp 檔案。 開啟LXTerminal,並執行Vim。 看來 Editor 是沒問題的。 Languages 下圖適用指令的方式列出C、C++、Java、Python語言版本。 這也沒問題。 IDE IDE是軟體開發者常用的工具,用IDE才有機會方便除錯,先試試支援最多程式語言的Eclipse,版本為  https://www.eclipse.org/downloads/packages/release/oxygen/3 。預設是Java語言。 筆者從Create New Project找看看有沒有除了Java以外的C、C++、Python專案。 發現沒有支援Java語言之外的C、C++、Python專案。要如何使用Eclipse 來做Java除錯,可參考這篇: eclipse-執行-debug-除錯模式 。 再來是支援C、C++的 Code::Blocks 。 Code::Blocks 的除錯方式可觀看這部影片。或是 這篇教學文章:CodeBlock除錯 。 最後是Python語言用的IDLE。 而 IDLE的除錯方式可參考這篇:如何使用IDLE進行除錯 。 結言: 要考APCS的人,一定要先知道考場提供了那些軟硬體,以免上考場時,不知道怎麼操作,那就尷尬啦! 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 If you like this post, please click the ads on the blog or  buy me a coffee . Thank you very much.

讀書筆記:深入淺出設計模式 (HEAD FIRST DESIGN PATTERNS)

此文為筆者在閱讀【 深入淺出設計模式(Head First Design Patterns) 」一書所作的筆記。 設計模式種類: 策略模式(Strategy Pattern) :定義演算法家族,個別封裝起來,讓它們之間可以交互替換,此模式讓演算法的變動,不會影響到使用演算法的程式。 觀察者模式(Observer Pattern) : 出版者 + 訂閱者 = 觀察者模式。『觀察者模式』 定義了物件之間的一對多關係,如此一來,當一個物件改變狀態,其他相依者都會收到通知並自動被更新。 裝飾者模式(Decorator Pattern) : 動態地將責任加諸於物件上。若要擴充功能,裝飾者提供了比繼承更有彈性的選擇。 工廠方法模式(Factory Method Pattern) : 定義了一個建立物件的介面,但由次類別決定要實體化的類別為何者。工廠方法讓類別把實體化的動作,交由次類別進行。 抽象工廠模式(Abstract Factory Pattern) : 提供了一個介面,建立相關或相依物件之家族,而不需要明確指定具象類別。 獨體模式(Singleton Pattern) : 確保一個類別只有一個實體,並給它一個存取的全域點(global point)。 命令模式(Command Pattern) : 將「請求」封裝成物件,以便使用不同的請求、佇列、或者日誌,參數化其他物件。命令模式也支援可復原的作業。 轉接器模式(Adapter Pattern) : 將一個類別的介面,轉換成另一個介面以供客戶使用。轉接器讓原本介面不相容的類別可以合作無間。 表象模式(Facade Pattern) : 提供了一個統一的介面,用來存取次系統中的一群介面。表象定義了一個較高層次的介面,讓次系統更容易使用。 樣板方法模式(Template Method Pattern) : 將一個演算法的骨架定義在一個方法中,而演算法本身會用到的一些方法,則是定義在次類別中。樣板方法讓次類別在不改變演算法架構的情況下,重新定義演算法中的某些步驟。 設計守則:     一、 找出程式中可能需要更動之處,把它們獨立出來,不要和那些不需要更動的程式碼混在一起。把會變動的部分取出並『封裝』起來,好讓其他部分不會受到影響。 『把會變動的...

Python Puzzler 12: ABC

底下的Java程式碼會有什麼結果? 1 2 3 4 5 6 7 public class Abc { public static void main ( String [] args ) { String letters = "ABC" ; char [] numbers = { '1' , '2' , '3' }; System . out . println ( letters + " easy as " + numbers ); } } 使用JDK11.0.2的結果為  ABC easy as [C@5c8da962  。這是因為 numbers 是 ,而字元陣列會呼叫Object的toString(),但我們沒有將toString() method 給 Overwrite,於是會得到一組Hash code的數值。      那我們來看看在Python裡,會有什麼結果? 1 2 3 letters = "ABC" numbers = { '1' , '2' , '3' } print (letters + " easy as " + numbers) 上述的程式碼會得到下面的錯誤訊息: 1 2 print ( letters + " easy as " + numbers ) TypeError: can only concatenate str ( not "set" ) to str 這是因為在 Python 裡, { '1' , '2' , '3' }  會是集合(set)的語法。而且因為 letters 是str,所以 + 會被當成字串合併來執行。 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。 If you like this post, please click...

寫程式用的雲端 IDE(Cloud IDE for Programming)

要寫程式之前,得先將工具準備好,當所使用的程式語言有好多種,那前置作業就會很多,若只是要練習語法之類的話,那麼雲端 IDE 是個不錯的選擇,目前常見免費且不用建立帳號的雲端 IDE 有下面幾個: Here are some cloud IDEs for programming. And we don't need a account to use them. ideone:  http://ideone.com/ ,教學: https://www.techmarks.com/ideone-online-coding/ codepad: http://codepad.org/ ,教學: https://www.youtube.com/watch?v=8izi7QDEOHk CodePen:   http://codepen.io/ ,教學: https://www.minwt.com/webdesign-dev/html/11470.html JSFiddle:  https://jsfiddle.net/ ,教學: https://blog.miniasp.com/post/2011/02/07/Useful-tool-jsFiddle-Online-Editor-for-the-Web Tutorialspoint:  http://www.tutorialspoint.com/codingground.htm ,教學: https://codegym.tech/coding-ground/ Jdoodle:  https://www.jdoodle.com/ ,教學: https://www.youtube.com/watch?v=idN5QmUS8-8 其中的 Tutorialspoint 網站所提供的工具最完整,它除了多樣的程式語言外,還提供了一些 Terminal,如 MySQL、PowerShell、Node.js 等,此外 Tutorialspoint 也有豐富的教學資料,值得一看。 另外 CodePen 和 JSFiddle 只提供前端開發用的JavaScript + HTML + CSS。至於這些雲端 IDE 的使用方式大同小異,先在網頁上寫完程式碼,之後...

Python Expressive Puzzlers 8: Does Equal

底下的Java程式會輸出什麼結果? 1 2 3 4 5 6 7 8 public class DosEquis { public static void main ( String [] args ) { char x = 'X' ; int i = 0 ; System . out . print ( true ? x : 0 ); System . out . print ( false ? i : x ); } } 輸出結果會是XX嗎?根據 JLS 15.25 的說明 ( true ? x : 0 ) 的運算結果會是char型別,而 ( false ? i : x ) 的運算結果會是int型別。所以輸出結果為 X88 。 而 Python 只有  < expression1 > if < condition > else < expression2 > 的語法,沒有 Java 的 conditional operator 的語法,於是不會有這樣子的Pitfall。 若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

Python Expressive Puzzlers 7: Swap

底下兩個Java Class分別會輸出什麼結果? 1 2 3 4 5 6 7 8 public class CleverSwapOne { public static void main ( String [] args ) { int x = 1984 ; int y = 2001 ; x ^= y ^= x ^= y ; System . out . println ( "x = " + x + "; y = " + y ); } } 1 2 3 4 5 6 7 8 9 10 public class CleverSwapTwo { public static void main ( String [] args ) { int x = 1984 ; int y = 2001 ; x ^= y ; y ^= x ; x ^= y ; System . out . println ( "x = " + x + "; y = " + y ); } } CleverSwapOne 會輸出 x = 0; y = 1984 ,而 CleverSwapTwo 會輸出 x = 2001; y = 1984 。為什麼會這樣子呢? 根據 JLS 15.7 的說明 :「Evaluate Left-Hand Operand First」也就是 CleverSwapOne  的執行順序如下: 1 2 3 4 5 6 7 // The actual behavior of x ^= y ^= x ^= y in Java int tmp1 = x ; // First appearance of x in the expression int tmp2 = y ; // First appearance of y int tmp3 = x ^ y ; // Compute x ^ y x = tmp3 ; // L...