顯示具有 函式 標籤的文章。 顯示所有文章
顯示具有 函式 標籤的文章。 顯示所有文章

2018年8月24日 星期五

寫程式入門會遇上的術語小整理

對於自己學程式時,查資料遇上的卡關用字,盡可能的集中於此,解釋上也以好懂優先,若有錯誤歡迎提醒更正...:3

程式(Porgram)

  指一連串能 "指示電腦" 或其他具有 "訊息理能力的裝置" 每一步動作的指令,通常用某種程式語言編寫,執行於某種目標(求得結果)上。

參考來源:維基百科,自由的百科全書 - Wikipedia  電腦程式

函數(Function)與副程式(Subroutines)、參數(Parameter)、引數(Argument):

  有些程式碼被重覆使用,一旦這些程式碼需要修改,可能會造成前後不一致,或是變數名稱不符等種種問題。總而言之是不容易被維護的。為了方便維護程式,並且節省程式設計師的力氣,因此發展出了函數與副程式的寫法。執行相同動作的程式碼只需要撰寫一次。

1.函數與副程式最基本的差異就是:函數有"回傳值",副程式沒有。
2.每一個函數或副程式只負責解決"一個"小問題。
3.函數與副程式是程式裡的"黑盒子(Black Box)",在黑盒子外面不需要知道裡面實作的方法,只需要知道輸入值( 參數(Parameter) )與回傳值。

 ex:回傳值 = 函數 ( 參數 )
  回傳值就是黑盒子出來的輸出值,輸入值就是參數(Parameter)黑盒子即應用時不需要了解中間怎麼做、經過了什麼,能達成目的就行,而目的就是函數的名稱。

4.黑盒子的出入口(參數與回傳值)必須定義清楚並且容易了解。
5.物件導向裡,所有的函數與副程式都被稱為"方法"。
6.在迴圈,重複的程序會連續執行。在函數與副程式裡,重複的程序可以需要時再呼叫,在分配上更能靈活應用。

保留字(Reserved Word):

  也有稱關鍵字,指該程式語言保留下來的英文單字,這些單字是不能被用來作為變數名稱。簡單的說就是該程式語言的語法不能拿來當變數,因為電腦會搞不懂我們寫的是指令還是變數。


物件(Object)、封裝(Encapsulation):

  物件裡只有兩種東西:屬性(Property)方法(Method)

  在開刀房工作時,醫生會告訴護士需要的器材(物件名稱)、尺寸(屬性),護士就會給予該項器材,該器材的功能可能不只一個,但醫生知道使用該器材的部分功能(方法)來工作。

  外出開(物件名稱),我們開啟了冷氣(方法),調了溫度(屬性)。播放了音樂(方法),決定哪首歌(屬性)。踩下油門(方法)出發,踩太底(屬性)爆衝出去(副程式的結果)

  網路遊戲裡,血量不夠(目的)要喝血罐(物件名稱)補血(方法),每瓶血罐預先設定可以補多少血量(屬性)
註:當然,血量不能隨玩家輸入來決定,不是遊戲不會結束,就是角色永生了。

  需要什麼工具(物件名稱)?工具的什麼功能(方法)?該功能要什麼輸入值(屬性)?是否有結果(輸出值)會出來?

1.決定完屬性(預設或等待輸入)與方法(是否有輸出)後,會集中放在一個" 類別 ",之後要使用時,該類別會以一個寫法上像" 資料型態 "(int、float....etc)那樣,並銜接一個變數名稱(就是物件名稱),然後就可以開始設定該物件的屬性與應用該物件的方法。
2.在" 物件導向 "裡,這種集中放置屬性與方法的方式,就是" 封裝(Encapsulation) "
3.相異物件名稱,可以有相同名稱的屬性或方法,但是並不會被混淆,使用時就會發現到。
4.屬性就是" 資料成員(Data Member"。
5.方法的名稱不可與" 類別名稱 "相同,這唯一特殊例外的方法叫" 建構子(Constructor) "

   你我拿相同的手機(物件名稱),有著一樣的功能(方法),且設定不同的電話號碼(屬性),且操作(輸出值)上卻不會互相影響。

參考來源:摩刻部落 一個呆子的網站 基礎程式設計(14)-物件、屬性與方法

類別(Class)

  就像在寫函數時,可以先寫在主程式前面,告訴電腦執行主程式時,對該函數的" 前提 "。同樣的道理,類別是創造物件的" 前提 ",應用時在寫法上與函數稍有差異,因為類別裡包含的屬性與方法,都是為了該物件的需要而設計、集合起來的,省略了每次應用都要再重新撰寫並呼叫好幾個函數。

1.自創的" 類別名稱 "不可與" 主程式名稱 "相同。唯一的例外,就是被設定關鍵字為全域(Public),且會包含一個叫" main "的類別,這是一般語言裡程式執行的起點。
2.程式碼裡,擁有同名類別的異名套件並不會被混淆喔!:3
3.類別也是有因為各種目的而生出的特殊種類,如
" 常數類別 "(為了不讓該類別被繼承而修改)。
" 抽象類別 "
 1.為了一定要被繼承,且不能被宣告成物件(需透過子類別名稱建立)。
 2.可以自行實作方法給子類別呼叫但是,若宣告為" 抽象方法 "(函數或副程式),則沒有實作過程且一定由子類別覆寫(Override),僅僅只能宣告。
 3.該類別底下的屬性與方法關鍵字不可為私有(Private)。
 4.而且,子類別僅能繼承(Inheritance)唯一的抽象類別。
" 巢狀類別 "(一種兩類別之間寫法上的結構,由外層類別對內層的類別的一切支配與控制。內層的屬性與方法供外層來使用,即便關鍵字是私有(Private))。

參考來源:
摩刻部落 一個呆子的網站 基礎程式設計(14)-物件、屬性與方法
摩刻部落 一個呆子的網站 基礎程式設計(17)-類別的種類
 iT 邦幫忙 4x D9:[Java]抽象類別(基本範例解說)

過載(Overload)、建構子(Constructor):

  " 物件 "透過" 類別 "事先告訴電腦使用時該連結那些功能(方法)或設定哪個值(屬性)。然而,有一種特殊的" 方法 ",是唯一能和類別名稱相同,不回傳任何值,可以用來作為集中預設值設定區域的方法,並能將集中於此的預設值再次應用於同類別的其他方法中,當該方法需要輸入值卻沒有被輸入時,就可以加入預設值來輸出結果。

  然而,這種方法,當然可以透過在同一" 類別  "裡,再寫一個一樣的方法,但執行內容與回傳結果相異,且輸入值(參數)的部分給予設定個數與資料型態,當之後遇到應用時,若有加上對應的輸入值,則會自動被判定是對應到哪一種同名的方法,這就是" 過載(Overloading) "。

參考來源:
摩刻部落 一個呆子的網站 基礎程式設計(15)-建構子

繼承(Inheritance)、覆寫(Override)、多型(Polymorphism)

  繼承(Inheritance)顧名思義,是一種與來源的支配關係,應用於類別與類別之間,來源的類別即是所謂唯一的" 父類別 ",所以底下可能支配著多個" 子類別 "。類別裡只有兩種東西:屬性(Property)方法(Method)" 子類別 "則能夠將" 父類別 "的屬性(被設定允許修改的)與方法(建構子不行)做再一次的延伸應用(改寫預設值、重寫一個同名的方法(就是" 覆寫 ")、呼叫父類別的方法與屬性...etc)

  也就是說,若有一群要重複執行的指令,則能用迴圈進行。有多次同樣重複執行且含迴圈的指令,則能用" 函數與副程式 "來統一管理。有多個部分同樣的屬性、方法的類別,則能將相同的部分集中放在父類別裡,再透過繼承的方式來逐一延伸與應用以顯示差異。

  建立物件時,倘若使用父類別名稱做物件的" 資料型態 ",而後面接著的,卻是子類別的建構子。在應用與父類別同名的方法時,則會自動選擇使用被子類別覆寫(Override)的方法(即使同父的子類別之間有同名的方法但不同實作)。這種會依據子類別的不同而自動做出相異的判斷就是多型(Polymorphism)。

參考來源:
Elsaの程式學習筆記 [Java] Java中函數「覆寫(Override)」之介紹
摩刻部落 一個呆子的網站 基礎程式設計(16)-類別繼承
國立中山大學程式諮詢網  5. 什麼是多型
痞客邦 Cedric's 學習備忘錄 多型 ( polymorphism)
摩刻部落 一個呆子的網站 基礎程式設計(18)-多形概念

介面(Interface)、實作(Implements)

  從類別與類別間相同的部分集中到父類別,會應用到繼承(Inheritance)。但從設計程式功能時的角度來看,若從集中" 需要的程式功能 "這點來著手,是否較好進行思考呢?於是,一種類似" 父類別 ",卻打破唯一繼承(實作的子類別可以實作(似" 繼承 ")多個介面(" 類別 "))。與" 抽象類別 ",卻只有宣告方法(完全交由實作類別" 外包 "的概念),完全沒有自己的實作。

  在介面需要新增方法時,並不適合直接在原介面與實作的子類別各自加上內容,因為當事後要來回朔問題時,對於找尋錯誤的該方法時,會因為越來越多的方法數而形成如同海底撈針似的困擾,所以會產生新的介面(用同一個子類別,所以會實作多個介面)來存放要新增的功能,並繼承先前的介面(對!新介面繼承舊介面)。

1.介面下會有一個類別以" 實作 "(Implements)的方式(不是用繼承(Inheritance),用的關鍵字不一樣)來" 實作 "(設計方法的內容)宣告的方法。
2.介面與介面之間,則可以使用繼承(Inheritance)的方式來新增方法。

參考資料:摩刻部落 一個呆子的網站 基礎程式設計(19)-介面與多重繼承

函式庫(Library)、API(Application Programming Interface)、框架(Frame)、套件(Package)、模組/模塊(Module)

  函式庫(Library)將該程式語言該常用或基本的方法、物件集中起來(也許是程式語言本身給予的、自己或別人開發的),做成一支可供匯入的程式,不需再自己重新定義相同目的的方法,直接應用裡面的函式,以加速撰寫程式碼效率為主要目的

  API(Application Programming Interface)程式常用或基本的方法(必須被設定為可被外部存取,也就是要全域(Public))集中起來(也許自己或別人開發的),做成一支可供匯入的程式,不需再自己重新定義相同目的的方法,直接應用裡面的函式,以加速程式與程式之間的開發為主要目的(因為開發程式時可以再匯入其他程式增加功能,這裡的其他程式就是API)

  框架(Frame)制定一套規範或者規則(思想),大家(程式設計師)在該規範或者規則(思想)下,確保所做的、所想的、所理解的一樣。如同開發環境(IDE)、作業系統、程式語言、資料結構...etc,通常具有增進開發效率的特色。

  套件(Package)則是除了函式庫外,額外增加了自動安裝程序(為了防止使用者自行設定造成的各種不可測錯誤。應該是用腳本寫的吧...),也就是軟體包。之後依據看是開發者(再自行引入函式庫)、使用者(程式自動匯入執行)。

參考來源:
痞客邦 CONY的世界 什麼是Library(函式庫,大陸稱庫)
摩刻部落 一個呆子的網站 基礎程式設計(20)-套件與API
Simple API、Method和Library是什麼東西和關係?
Corner Hack [Dev] IDE, API, SDK, Library 基本術語解釋
學長
[英](語言跟我一樣易卡關者,前方高能注意!!@o@)
Quora What is the difference between an API, a library and a framework?
Onetrail API, Library and Framework. What’s the difference?

巨集(Macro):

  根據一系列預定義的規則替換一定的文字模式。將一系列的的操作自訂為一個步驟(制定操作程序),讓應用程式來「記住」這些操作以及順序。必較像是這隻程式執行前的" 暖身準備 "。

參考資料:維基百科,自由的百科全書 - Wikipedia  巨集

平台(Platform):

  指在電腦裡讓軟體執行的系統環境,包括硬體環境和軟體環境而程式或軟體就是在這上面執行的。

參考資料:維基百科,自由的百科全書 - Wikipedia  系統平台

插件/外掛、(Plug-in、Plugin、add-in、addin、add-on、addon)、擴充套件(Extension):

   在程式裡,針對功能上進行修改或者增加,而差別在於,插件通常依賴於應用程序的用戶界面(修改),它的一切行為都不能超出已經嚴格定義好的界限。而擴充套件通常較沒有限制,也許還會擁有獨立的用戶界面(新增)。他們通常是用來減小應用程序的尺寸,並提供一些可選的功能。

參考資料:維基百科,自由的百科全書 - Wikipedia  插件

疊代器(Iterator):

  寫程式時,不免會應用到各種暫時儲存資料的物件 --- " 容器 "。然而,在這些裡要取出指定的部分資料時,勢必要" 挨家挨戶 "的走一遭來尋求結果(查水表?)。而這挨家挨戶的" 人 ",就是以一個移動式箭頭的存在,來進行所謂的" 走訪 ",以協助程式進行" 篩選資料 "。

沙箱、沙盒(Sandbox):

  源自於一種安全模型,可以將為信任的程式碼在裡頭進行測試,以防止直接對電腦造成損害,在這虛擬出來的環境裡頭,因為記憶體被獨立出來,存取權上也受限,對於檢測危害的程式碼有相當的助益。

參考資料:

維基百科,自由的百科全書 - Wikipedia  沙盒 (電腦安全)
什麼是沙箱?沙盒? Sandbox








2018年5月21日 星期一

ITSA- Recursionc 001~050-[C_RU30-中] 迷宮問題

題目連結:https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?a=15488

看不到內容請點這:
C++
https://hackmd.io/owAW7zoGTo66CZ2xG78V-A#%E8%BF%B7%E5%AE%AE%E5%95%8F%E9%A1%8C

Time Limit: 2 seconds
問題描述 :
一個 10x10 的迷宮(0~9),以右下角為出發點 (8,8) ,左上角為出口 (1,1) ,設計者以右上左下的順序來找尋出口, 1 表示牆壁, 0 表示可走的路,請輸入迷宮,並顯示路徑。
搜尋規則為:右→上→左→下。走過的路徑標示為G,在沒有遭遇無路可走的情況時不能在走標示G的路徑。
如發現無路可走時,退回上一步,並將此格標示為D,表示不得再走此格。
此時我們會發現,如退回到起點時,這表示這是一個沒有可行路徑的迷宮。
輸入說明 :
輸入一個 10x10 的迷宮,
1表示牆壁,0表示可走的路
1 1 1 1 1 1 1 1 1 1
1 0 0 1 1 1 1 1 0 1
1 1 0 1 1 1 1 1 0 1
1 1 0 0 0 0 0 0 0 1
1 1 1 0 0 1 1 1 0 1
1 1 1 0 0 0 1 1 0 1
1 1 1 0 1 0 0 0 0 1
1 1 1 0 1 1 1 0 0 1
1 1 1 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
輸出說明 :
如成功輸出YES,否則輸出NO;下一行則輸出路徑結果,如:
YES
1 1 1 1 1 1 1 1 1 1
1 X G 1 1 1 1 1 D 1
1 1 G 1 1 1 1 1 D 1
1 1 G G G G G G 1
1 1 1 0 0 1 1 1 G 1
1 1 1 0 0 0 1 1 G 1
1 1 1 0 1 0 0 G G 1
1 1 1 0 1 1 1 G 1 1
1 1 1 0 0 0 0 G S 1
1 1 1 1 1 1 1 1 1 1
範例 :

輸入範例輸出範例
1 1 1 1 1 1 1 1 1 1
1 0 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 0 0 0 0 0 0 1
1 1 1 0 0 1 1 1 0 1
1 1 1 0 0 0 1 1 0 1
1 1 1 0 1 0 0 0 0 1
1 1 1 0 1 1 1 0 1 1
1 1 1 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
YES
1 1 1 1 1 1 1 1 1 1
1 X G 1 1 1 1 1 1 1
1 1 G 1 1 1 1 1 1 1
1 1 G G G G G G D 1
1 1 1 0 0 1 1 1 G 1
1 1 1 0 0 0 1 1 G 1
1 1 1 0 1 0 0 G G 1
1 1 1 0 1 1 1 G 1 1
1 1 1 0 0 0 0 G S 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 0 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 0 0 0 0 0 1
1 1 1 0 1 1 1 1 0 1
1 1 1 0 1 0 1 1 0 1
1 1 1 0 1 0 0 0 0 1
1 1 1 1 1 1 1 0 1 1
1 1 1 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
NO
1 1 1 1 1 1 1 1 1 1
1 X 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 D D D D D 1
1 1 1 0 1 1 1 1 D 1
1 1 1 0 1 D 1 1 D 1
1 1 1 0 1 D D D D 1
1 1 1 1 1 1 1 D 1 1
1 1 1 D D D D D S 1
1 1 1 1 1 1 1 1 1 1

2018年5月16日 星期三

ITSA- Arrayc 151~200-[C_AR154-易] 感染被包圍的人

題目連結:https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=24871

看不到內容請點這:
C++
https://hackmd.io/owAW7zoGTo66CZ2xG78V-A#%E6%B3%9B%E6%B4%AA%E6%BC%94%E7%AE%97%E6%B3%95%E7%AF%84%E4%BE%8B%E9%A1%8C-%E2%80%94-ITSA--Arrayc-151200-C_AR154-%E6%98%93%E6%84%9F%E6%9F%93%E8%A2%AB%E5%8C%85%E5%9C%8D%E7%9A%84%E4%BA%BA

Time Limit: 1 seconds
問題描述 :
在一個 2 維的空間中,有一群病毒(用大寫英文字母 X 表示),還有一群人類(用數字 0 表示)。若這群人則被病毒包圍了,那他們都會被感染成木頭人(用大寫的 I 表示)。

舉例而言:
Table 1 中只有 1 位人類,而且它被病毒包圍,所以這位人類會被感染,成為木頭人,其結果如 Table 3 所示。
Table 2 中也只有 1 位人類,但它沒被病毒包圍,所以不會被感染。因此結果如 Table 4 所示。
給你一個 2 維的空間,請你撰寫程式,將所有被感染的人類都換成木頭人。


輸入說明 :
輸入是一個 7 X 7 的 2 維盤面。
每一行有 7 個字母,每個字母不是 X ,或是數字 0 。每個字母用空白隔開。
輸出說明 :
將輸入盤面中被感染的人類改為大寫的 I ,並且輸出。
範例 :

輸入範例輸出範例
X X X X X X X
X X X X X X X
X X X X X X X
X X 0 X X X X
X X X X X X X
X X X X X X X
X X X X X X X
X X X X X X X
X X X X X X X
X X X X X X X
X X I X X X X
X X X X X X X
X X X X X X X
X X X X X X X

留意點:

//只要在邊綠的人,就不會被感染;
//就算是被包圍 ( 僅四方位 )  的團體,仍舊會全部感染;
//只要和邊緣的人有相連 ( 相連指的是走上、下、左、右,任一邊可以相連即可 ) 就不會被感染;

這題的寫法有兩種,僅寫出差異點


/*只要在邊緣找到一個  0,就由這個 0 開始使用 flood fill 演算法走訪下去。凡走到 0,這個 0 就可以標記為「非感染」。到最後,剩下的 0 就是會被感染的人了。*/



2018年1月4日 星期四

ITSA線上程式競賽基礎題目-題目26. 各位數和排序

題目連結:https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=30785
看不到內容請點這:
C++
https://hackmd.io/rm3s4cyYRs22sofZh3ZaCg#%E5%90%84%E4%BD%8D%E6%95%B8%E5%92%8C%E6%8E%92%E5%BA%8F

ITSA線上程式競賽基礎題目-題目24. 計算複利

題目連結:https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=30759

看不到內容請點這:
C++
https://hackmd.io/rm3s4cyYRs22sofZh3ZaCg#%E8%A8%88%E7%AE%97%E8%A4%87%E5%88%A9



ITSA線上程式競賽基礎題目-題目16. 子字串出現次數

題目連結;https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=30768

看不到內容請點這:
C++
https://hackmd.io/rm3s4cyYRs22sofZh3ZaCg#%E5%AD%90%E5%AD%97%E4%B8%B2%E5%87%BA%E7%8F%BE%E6%AC%A1%E6%95%B8

ITSA線上程式競賽基礎題目-題目13. 撲克牌大小

題目連結:https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=30764

看不到內容請點這:
C++
https://hackmd.io/rm3s4cyYRs22sofZh3ZaCg#%E6%92%B2%E5%85%8B%E7%89%8C%E5%A4%A7%E5%B0%8F

ITSA線上程式競賽基礎題目-題目12. 遞迴程式練習

題目連結:https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=30761

看不到內容請點這:
C++
https://hackmd.io/rm3s4cyYRs22sofZh3ZaCg#%E9%81%9E%E8%BF%B4%E7%A8%8B%E5%BC%8F%E7%B7%B4%E7%BF%92

ITSA線上程式競賽基礎題目-題目10. 輾轉相除法

題目連結:https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=30757

看不到內容請點這:
C++
https://hackmd.io/rm3s4cyYRs22sofZh3ZaCg#%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95