話說昨天PO了一篇自己都不太想看的程式教學,今天本來該寫些正常的東東,例如過兩天就要交的服務學習心得之類的......總之,天有不測風雲,人有旦夕禍福,因為所以,蟑螂螞蟻,後來我就沒寫了。
有常在逛K板、K島等等網站的朋友就知道,FB上面幾乎是沒有新東西的(僅指這類KUSO的),你所看到轉來轉去的有趣的圖和影片,基本上都不知道在網路上流傳多久了,但偶而看到某些真的很特別的,還是會會心一笑。
下面這就是很久很久以前就看過的,不過大部分人應該只知道部分而已。這次PO的版本我以前有看過,是我發現最長~~~的版本了,最近好不容易又找到,跟大家分享!
從前從前
魔王抓走公主,公主一直叫.
魔王:「你儘管叫破喉嚨吧...沒有人會來救你的....」
公主:「破喉嚨..破喉嚨..」
沒有人:「公主..我來救你了...」
魔王:「說曹操曹操就到...」
曹操:「魔王..你叫我幹嘛..」
魔王:「哇勒..看到鬼」
鬼:「靠!被發現了..」
靠:「阿鬼,你看的到我喔...」
魔王:「Oh,My God!」
上帝:「誰叫我?」
誰:「沒有人叫你阿...」
沒有人:「我哪有?裝蒜啊!」
蒜:「誰在裝我?」
誰:「又說我?你們找麻煩啊?」
麻煩:「哪一個找我?」
哪一個:「找你?我才沒有...咦,這兒有好多人.」
好多人:「我才剛到耶.你是誰?」
哪一個:「我才不是誰.」
誰:「他才不是我.」
公主:「大家都是來救我的嗎?」
大家都:「我不是來救你的,是來看熱鬧的.」
熱鬧:「我有什麼好看的?」
上帝:「不關我的事,先走了.」
魔王:「你回答一個問題再走,為什麼這麼多人救公主?我這個魔王怎麼演下去?」
下去:「你好好的魔王不幹,演我做什麼?」
公主:「魔王若是沒有人演,我就可以走了.」
沒有人:「若是我演魔王,怎麼會讓你走...」
怎麼會:「我才不讓公主走,我要看熱鬧.」
熱鬧:「看我幹什麼?」
什麼:「你居然要『幹』我?流氓!」
你居然:「我哪有?」
我:「關我什麼事啊?」
魔王:「靠!我要瘋了.......」
靠:「喊我幹什麼!...」
瘋了:「你要我幹啥?」
你要我:「我什麼都不知道ㄚ!」
我什麼都不:「我哪知啊!」
我哪知:「我在這裏啊!有人在叫我嗎?」
有人:「我沒有叫你啊!」
我沒有:「誰叫他了啊?」
誰:「冤枉啊...我沒有...」
我沒有:「我可沒冤枉你啊...」
你:「諒你也不敢.」
諒你:「誰說我不敢!?」
誰:「拜託啊...我什麼都沒說啦」
我什麼都沒:「你要我說什麼?」
我什麼都不:「...你...你不就是我那失散多年的兄弟嗎?」
我那失散多年的兄弟:「靠...我名字取這麼長...也會被叫到啊...」
誰:「...我要趕快離開這個是非之地」
是非:「原來這裏是我的地盤啊...」
我什麼都不and沒:「你們別吵我們在講話啦...」
你們別吵我們:「我沒有在講話啊...」
我沒有:「我才沒有講話咧!...」
我什麼都不:「-_-|||...走...我們到外面去聊...」
走:「人家不好意思啦...(扭捏)」
我什麼都沒:「關你屁事啊...閃啦...」
(兩兄弟生氣的走出去)
關你屁事:「嗚...為什麼趕我走...」
為什麼:「我沒有要趕你走啦...乖...不要哭」
我沒有:「喔...又關我啥事了」
關我啥事:「啥?有人叫我嗎?」
有人:「誰要叫你啊...」
誰:「我真的要走了...T.T」
走:「人家真的不好意思啦...*V.V*」
關你屁事:「...你不是我表妹嗎?」
關我啥事:「...表哥...好久不見啦...」
好久:「我不是在這裏嘛...」
魔王:「你們有完沒完?」
完沒完:「他才沒有我」
你們:「我才沒有他」
我才:「誰說的?」
誰:「叫我幹嗎?」
嗎:「你居然要幹我?」
你:「我才不會幹他」
我才:「誰說我不會?」
誰:「冤枉!我沒說.」
說:「叫我幹嗎?」
嗎:「你們倆真不要臉!」
你們倆:「我要!我要!」
臉:「誰要我?」
誰:「我不要啊!?」
魔王:「快一點,再說我可要攆人啦!」
人啦:「趕攆我?找K」
K:「誰找我?」
誰:「欸欸欸欸!別提我的名字,再提我也K他!」
他:「別K我.」
我:「誰要K我?」
誰:「終於讓我逮著一個啦,殺呀..」
一個啦:「別逮我.」
我:「我也受夠啦,誰再提我的名字,我決不放過你!」
誰:「看我的降龍十八掌!」 我:「看我的九陰白骨爪!」
降龍十八掌:「我有什麼好看的?」
九陰白骨爪:「我有啥好看的?」
什麼好看的:「兄弟,我終於找著你啦!」
啥好看的:「哥,咱們出去聊.」
!!!..... 最後大魔王就瘋掉了...
從此大家過著幸福快樂的日子
~The End~
OK,今天就到這啦,絕對不是沒東西好寫隨便POPO啊,喔呵呵呵呵呵呵,明天開始會認真滴,各位晚安啦!!
曲辰の幻想蒼穹
曲辰的生活、心得、小作品、以及碎碎念,歡迎各位一起分享!
2012年11月25日 星期日
2012年11月24日 星期六
Infix to Postfix + Computation of Postfix
程式目的:將中序式(infix)轉換為後序式(postfix),並將postfix的值計算出來
程式語言:C 語言
開發工具:Dev-c++ 5.2.0.2
程式碼分享:cpp檔案、exe檔案
執行結果:
程式碼:
演算法:
理所當然的,要了解一個程式得從其演算法開始理解,若是搞懂了,基本上程式就完成7成囉,剩下的只是把這些步驟轉換為程式語言而已!
讓我們先從最基本的開了解:何謂中序式(infix)與後序式(postfix)?infix就是我們一般所寫的算式,將運算子放在運算元的中間,例如1 * ( 2 + 3 );而postfix則是把運算子放在運算元的後面,以剛剛的例子而言, 則變為1 2 3 + *,並且可以注意到我們將括號都拿掉了。這次我們要做的就是從infix變為postfix的方法。
當我們拿到一個算式,首先來分析它的組成。一個算式可以簡單分成運算子(符號)及運算元(數字)兩個部分,處理的時候也大致就是分成兩種來工作:凡是遇到運算元,則直接輸出;遇到運算子則與我們準備好的stack最上層的運算子判斷,若是優先權低於等於stack中的運算子(例如 + → * ),輸出stack中的運算子,直到stack中的運算子優先權較低再把比較的運算子存入stack中,若是比較的stack原本優先權就較高,則直接存入stack中。一直重複上面兩種動作來處理運算子及運算元,直到算式結尾,再把stack中剩下的運算子一次輸出,最後即成我們所要求的postfix運算式。
在轉換的過程中,要注意的是遇到括號需要特別處理,括號可以分為左右括號來看。遇到左括號,無條件存入stack中;遇到右括號,從stack最上層開始輸出,直到遇到左括號為止,左右括號本身都不輸出。
好,現在我們有一個postfix算式了(假設前面沒算錯......),現在該來把它的值計算出來。postfix的計算比起轉換簡單的多,一樣準備一個stack,遇到運算元就丟入stack中,遇到運算子就將stack最上層的兩個數取出來做運算,運算結果再存回stack中,這樣最終stack裡就是我們所求的答案哩!
以上就是本次程式的演算法,若是看不懂,放心不是你太笨,是我表達太差!建議可以參考這位作者的中序式轉後序式以及後序式的運算,寫的相當詳盡喔,同時裡面也有各種語言的程式碼範例,本程式也是以其為架構改寫的。
程式解析:
演算法了解了以後,就來看看這支程式要怎麼實作吧!
本程式分為5個function,分別為main、InToPost、Priority、PostToInt與Cal,main用來做資料的輸入以及輸出,InToPost實作infix與postfix的轉換,Priority比較運算子之間的優先權,PostToInt處理postfix算式的運算,Cal則做兩兩運算元間的計算。
在本程式中,所有的算式以及stack都以陣列來實作,運算元設定為整數,運算子僅處理+ - * / %五種,並且支援正負號,若有其他需要可自行調整,以下就依序來解析。
#define LENGTH 9999
首先在最外面,我們define了一個LENGTH,這個變數代表了未知的陣列長度,可以依需求來調整,通常會給它一個大一點的值,除非我們能明確的知道這個"未知"的範圍是多少。
#include "memory.h"
這個memory.h是用來支援我們在PostToInt所使用的memset,功能是設置陣列的值。
int Err=0;
宣告一個全域變數作為判斷錯誤的依據。
long long int PostToInt(char*);
long long int Cal(char, long long int, long long int);
注意到此處的宣告形態為long long int,是為了因應計算結果可能出現的超長整數,同裡除非我們能確定"值"的範圍,不然預設較寬裕的立場以防錯誤。
int main(void) {...}
main的部分相當單純,在讀入算式之後,分別做轉換、運算以及各自的錯誤判斷。需注意的是錯誤判斷必須分開處理,因為運算邏輯錯誤(例如除以0)只會在計算層面出錯,轉換並無影響。另外印出計算結果因應long long int型態,需使用%lld來取代%d。
void InToPost(char* Infix, char* Postfix) {...}
InToPost在轉換的過程中,除了使用switch case對運算子及運算元做基本的處理之外,最重要的就是大量的錯誤判斷,以下將分別解釋。
for(i = 0; Infix[i] != '\0'; i++){...}
if(temp!=0){...}
在轉換開始之前,先使用一個for loop及if來判斷左右括號的正確性,以temp計算左右括號,左括號+1,右括號-1,如此即可判斷,若是有先右括號再左括號的情形(計算中隨時temp<1),又或是左右括號數量不對(計算完成temp!=0),皆為錯誤。
for(i = 0, j = 0, Stack_Top = 0; Infix[i] != '\0'; i++)
{if(i==0){...}
...
switch(Infix[i]){...}
...}
轉換的最主要部分,一開始的if對首位做判斷,如果是數字當然沒問題,運算子的話,+-可以視為正負號,若是其他的則錯誤。switch case的部分,針對不同狀況做出相對的處理,並且判斷錯誤情形,例如右括號後面不會直接接數字之類,此為數學邏輯故不贅述,詳細的請自行參照程式碼。比較特別的是允許類似--3(減負三)或++7(加正七)的寫法。另外在顯示的部分,每個token之間以一個空格隔開,以助分辨,不然數字會擠在一起(例如13和5變成135)。
int Priority(char op) {...}
簡單的判斷符號的優先權,先乘除後加減,相信大家都會。
long long int PostToInt(char* /*Infix*/Postfix)
{...
switch(Postfix[i]){...}
...}
一樣使用switch case做不同運算子與運算元的處理,由於之前是使用字串做儲存,現在遇到數字先存入另一暫存陣列,並使用atoll轉換為long long int型態後再存入stack。其餘仍為數學邏輯判斷,請自行參考程式碼。
long long int Cal(char op, long long int N1, long long int N2){...}
最後的一個部分,由於邏輯判斷在前面都做過了,這裡單純的把傳來的運算子與運算元做計算即可。
結語:
本程式碼相當簡單,並沒有使用什麼高深的方法,例如A情況會是錯誤的,就單純的加個遇到A則回傳錯誤的判斷,相當的直觀,故應該很容易理解,當然相對的程式優化程度低,效能也會比較差,只希望對有需要的人有所幫助,有任何錯誤也請不吝指教!
程式語言:C 語言
開發工具:Dev-c++ 5.2.0.2
程式碼分享:cpp檔案、exe檔案
執行結果:
程式碼:
演算法:
理所當然的,要了解一個程式得從其演算法開始理解,若是搞懂了,基本上程式就完成7成囉,剩下的只是把這些步驟轉換為程式語言而已!
讓我們先從最基本的開了解:何謂中序式(infix)與後序式(postfix)?infix就是我們一般所寫的算式,將運算子放在運算元的中間,例如1 * ( 2 + 3 );而postfix則是把運算子放在運算元的後面,以剛剛的例子而言, 則變為1 2 3 + *,並且可以注意到我們將括號都拿掉了。這次我們要做的就是從infix變為postfix的方法。
當我們拿到一個算式,首先來分析它的組成。一個算式可以簡單分成運算子(符號)及運算元(數字)兩個部分,處理的時候也大致就是分成兩種來工作:凡是遇到運算元,則直接輸出;遇到運算子則與我們準備好的stack最上層的運算子判斷,若是優先權低於等於stack中的運算子(例如 + → * ),輸出stack中的運算子,直到stack中的運算子優先權較低再把比較的運算子存入stack中,若是比較的stack原本優先權就較高,則直接存入stack中。一直重複上面兩種動作來處理運算子及運算元,直到算式結尾,再把stack中剩下的運算子一次輸出,最後即成我們所要求的postfix運算式。
在轉換的過程中,要注意的是遇到括號需要特別處理,括號可以分為左右括號來看。遇到左括號,無條件存入stack中;遇到右括號,從stack最上層開始輸出,直到遇到左括號為止,左右括號本身都不輸出。
好,現在我們有一個postfix算式了(假設前面沒算錯......),現在該來把它的值計算出來。postfix的計算比起轉換簡單的多,一樣準備一個stack,遇到運算元就丟入stack中,遇到運算子就將stack最上層的兩個數取出來做運算,運算結果再存回stack中,這樣最終stack裡就是我們所求的答案哩!
以上就是本次程式的演算法,若是看不懂,放心不是你太笨,是我表達太差!建議可以參考這位作者的中序式轉後序式以及後序式的運算,寫的相當詳盡喔,同時裡面也有各種語言的程式碼範例,本程式也是以其為架構改寫的。
程式解析:
演算法了解了以後,就來看看這支程式要怎麼實作吧!
本程式分為5個function,分別為main、InToPost、Priority、PostToInt與Cal,main用來做資料的輸入以及輸出,InToPost實作infix與postfix的轉換,Priority比較運算子之間的優先權,PostToInt處理postfix算式的運算,Cal則做兩兩運算元間的計算。
在本程式中,所有的算式以及stack都以陣列來實作,運算元設定為整數,運算子僅處理+ - * / %五種,並且支援正負號,若有其他需要可自行調整,以下就依序來解析。
#define LENGTH 9999
首先在最外面,我們define了一個LENGTH,這個變數代表了未知的陣列長度,可以依需求來調整,通常會給它一個大一點的值,除非我們能明確的知道這個"未知"的範圍是多少。
#include "memory.h"
這個memory.h是用來支援我們在PostToInt所使用的memset,功能是設置陣列的值。
int Err=0;
宣告一個全域變數作為判斷錯誤的依據。
long long int PostToInt(char*);
long long int Cal(char, long long int, long long int);
注意到此處的宣告形態為long long int,是為了因應計算結果可能出現的超長整數,同裡除非我們能確定"值"的範圍,不然預設較寬裕的立場以防錯誤。
int main(void) {...}
main的部分相當單純,在讀入算式之後,分別做轉換、運算以及各自的錯誤判斷。需注意的是錯誤判斷必須分開處理,因為運算邏輯錯誤(例如除以0)只會在計算層面出錯,轉換並無影響。另外印出計算結果因應long long int型態,需使用%lld來取代%d。
void InToPost(char* Infix, char* Postfix) {...}
InToPost在轉換的過程中,除了使用switch case對運算子及運算元做基本的處理之外,最重要的就是大量的錯誤判斷,以下將分別解釋。
for(i = 0; Infix[i] != '\0'; i++){...}
if(temp!=0){...}
在轉換開始之前,先使用一個for loop及if來判斷左右括號的正確性,以temp計算左右括號,左括號+1,右括號-1,如此即可判斷,若是有先右括號再左括號的情形(計算中隨時temp<1),又或是左右括號數量不對(計算完成temp!=0),皆為錯誤。
for(i = 0, j = 0, Stack_Top = 0; Infix[i] != '\0'; i++)
{if(i==0){...}
...
switch(Infix[i]){...}
...}
轉換的最主要部分,一開始的if對首位做判斷,如果是數字當然沒問題,運算子的話,+-可以視為正負號,若是其他的則錯誤。switch case的部分,針對不同狀況做出相對的處理,並且判斷錯誤情形,例如右括號後面不會直接接數字之類,此為數學邏輯故不贅述,詳細的請自行參照程式碼。比較特別的是允許類似--3(減負三)或++7(加正七)的寫法。另外在顯示的部分,每個token之間以一個空格隔開,以助分辨,不然數字會擠在一起(例如13和5變成135)。
int Priority(char op) {...}
簡單的判斷符號的優先權,先乘除後加減,相信大家都會。
long long int PostToInt(char* /*Infix*/Postfix)
{...
switch(Postfix[i]){...}
...}
一樣使用switch case做不同運算子與運算元的處理,由於之前是使用字串做儲存,現在遇到數字先存入另一暫存陣列,並使用atoll轉換為long long int型態後再存入stack。其餘仍為數學邏輯判斷,請自行參考程式碼。
long long int Cal(char op, long long int N1, long long int N2){...}
最後的一個部分,由於邏輯判斷在前面都做過了,這裡單純的把傳來的運算子與運算元做計算即可。
結語:
本程式碼相當簡單,並沒有使用什麼高深的方法,例如A情況會是錯誤的,就單純的加個遇到A則回傳錯誤的判斷,相當的直觀,故應該很容易理解,當然相對的程式優化程度低,效能也會比較差,只希望對有需要的人有所幫助,有任何錯誤也請不吝指教!
IT DEMO
是否常常會碰到這種狀況,有些東西明明學過了、看過了,可是真到用時卻什麼都想不起來?
是否也有碰過這種情形,想要找個方法、找個例子,偏偏網路上找到的不是這裡錯誤那裡有問題,就是程式碼怪到看不懂,丟進去也無法執行?
是否也有碰過這種情形,想要找個方法、找個例子,偏偏網路上找到的不是這裡錯誤那裡有問題,就是程式碼怪到看不懂,丟進去也無法執行?
正好藉著網誌空間,將學校或自學的一些小成品分享出來,當作自己的一種學習檢視及記錄,或許也可以幫助一些剛好需要的朋友喔!
○ 網頁相關
2012年11月8日 星期四
溫暖,從身邊開始
星期四,由於周二系上工程認證調課的緣故,在上完阿和的時光穿梭課之後,又趕回了聖言樓補上兩堂的計組。不知是否接了系主任的關係,國華葛格這學期的計組和資結都可說上的相當愉快!
時間是晚間的六點三十分,已經許久沒有在這個時間離開學校。走出教室,外面已是一片漆黑,路上仍有不少學生,或是剛下課,或是結束了社團活動,匆匆的踏上了那星光與路燈點綴著的返家旅程。
經過淨心堂時,卻發現這裡反常的熱鬧,有幾個人在唱歌,幾個人在向經過的人發著東西。我走了過去,一位男同學迎面而來,遞給了我一個用著透明杯子裝著的東西,說:「同學,送你歐趴糖,祝你考試順利!」
沒錯,就是這一小杯爆米花。先不管爆米花算不算糖這件事,杯子裡面那明顯不是食物的東西也暫時忽略(燈光昏暗邊走邊吃真的很容易忽略......),裡面有很多顆沒爆開的「米花」也不是很重要,我要在走進捷運站之前把它吃光光才行這也不是什麼大問題,重要的是這可是我人生中地一次拿到歐趴糖啊,身為一個「超資深」的大學生,似乎還滿失敗的......
這個小紙條,捲起來後塞在珍珠奶茶的吸管中,打開來後是一長約20公分、寬約三公分的紙條,上面寫著「孩子:生命有如花朵綻放,吐露芬芳!」
在拿到爆米花的當下只有一個想法,So sweeeeeeeeet!!其實生活就是這麼的簡單,我們把小小的快樂帶給身邊的人,將這份溫暖傳遞出去,終將成就大大的愛。
Love's arms are peace, 'gainst rule, 'gainst sense, 'gainst shame; And sweetens, in the suff'ring pangs it bears, The aloes of all forces, shocks, and fears. -Shakespeare
莎士比亞在《A Lover's Complaint》中說,愛的力量是和平,從不顧理性、成規和榮辱,它能使一切恐懼、震驚和痛苦在身受時化作甜蜜。
在以前講的故事,是說一個小孩上公車時給司機一個大大的微笑,之後司機又把這個快樂分享給上車的旅客,詳細情形已經忘記了,不過現在有了新的故事可以和大家分享,下面這個影片希望各位可以花五分鐘好好欣賞一番,日後在適當的時機,不要吝嗇獻出你的愛,讓我們一起 pay it forward !!
2012年11月3日 星期六
20121103 龍騰諾西
Long time no see ~~ !!
事情是這樣的,在開學前最後的兩個星期,瘋狂的參加了十場左右的研討會,只能說真的太忙太忙,東西太多太多,來不及更新,結果越積越多,最後......你知道的。
剛剛仔細算了一下,最後一次更新是在9月8日,從那時到現在大約有20幾篇還欠著尚未更新,只能說人的潛力真的是無窮無盡,惰性更是無遠弗屆啊!
由於下下個禮拜就要期中考嚕,所以欠著的應該是等考完之後再慢慢更新吧,畢竟這一個禮拜的時間要好好的用來 玩遊戲 認真念書,畢竟光陰似箭,歲月如梭,就像上某個老師的時光穿梭課一樣,眼睛閉起來再睜開來三節課就過去了!!
話說最近連FB都有點懶得上去,看到每個群組、社團都是[20+]的訊息,就很懶的一一去看,但是有的訊息又是那種你沒上就算了,上了還不看就不行那種,結果惡性循環,只能說人的潛力真的是無窮無盡,惰性更是無遠弗屆啊 (這句話好熟)。
訂閱:
文章 (Atom)