2025年8月11日 星期一

FAQ: 減掉程式碼

 //  FAQ: 減掉程式碼

//  8/12 製作
//
//



Q: 什麼是減掉程式碼?
A: 程式碼的疊加,
我們之前在自動號碼產生器裡面
討論過了,
現在我們來討論如何減掉程式碼,
如何做一個minus的動作。
以前有進化論,
人類之所以跟猴子不一樣,不但是因為
人類沒有毛,也沒有尾巴,
而且在人類社會裡,
沒有看到任何短尾人。
這就表示去除尾巴的過程十分的精準。
程式設計也一樣,
如果你要減掉一些演算法,
要進行的一定是下列這幾個選項,
比如說省略,削減,刪除,與減少。
這些都是minus的動作,
也可以加上兩條反斜線,改成註解。

你要minus一個演算法,
當然不可以碰運氣,隨機的減掉。
不管是列出表格,還是一個一個點勾勾,
當然都必須事先計算時間跟成本,
計算來不來的及在上班時間刪減完,
而且還要冒著電腦更新與當機的風險。

Q: 那是什麼故事?
A: 根據以前的記載與一些故事,
能夠處理minus動作的工程師,
通常比較有機會得到更多薪水和獎勵,
minus動作如果做的很快很好,
當然會得到很多獎金,
但是刪除錯了如果無法回復回來,
也會有賠償責任,風險也很高的。

而且有些機器公司是說,
刪除程式碼叫做刪除程式碼,
minus動作根本就不是刪除程式碼,
minus動作是另外處理其他機器的指令。
遇到這樣公司的時候,
連要求minus動作都是困難重重,
這時候就要詢問更多公司規定,
並且很難一展抱負了喔。
所以事實上,並沒有minus演算法,
minus演算法沒有這種事。

Q: 那麼要怎麼減掉程式碼才會是對的呢?
A: 第一個你要知道打程式碼進去都是值錢的,
所以每刪除一筆就是虧損一筆。
但是上班時間這裡刪一刪,那裡刪一刪,
所以最簡單就說,
我刪除完了程式碼就可以跑了,
這樣就可以了。
刪除完就可以跑的程式碼可以產生價格,
使版本編號進入下一個版本。
接下來累積幾個工作天,
會有好幾個改版刪除好的新版本,
使得大家可以討論,
刪減少一點比較好,
還是刪減多一點比較好。
因為刪減是一個非理性的過程,
按一下就不見了,
所以它既可以是很簡單,
也可以是複雜到非常複雜。
這時候當然是眾說紛紜的啦,
有人要按下去就好,
有人要列表格打勾勾刪除,
還有人拿著碼錶跟會計簿在旁邊等的。
事實上要慘賠的時候,就是有各種
不同的情況,有人想爭取簡單的慘賠,
有人想爭取碼錶跟會計簿的慘賠。
所以我之前有主張過,
要做好成本管理,
首先要追求不虧損,
行有餘力,才追求專案的達成率。


Q: 為什麼不是使用虧損去賺到創意呢?
A: 因為如果演算法不值錢,妳就不值錢了,
所以追求虧損以換取創意會有行不通的時候。

Q: 那企業管理的書,
都是有成功的範例,
我來虧損一下怎麼不行呢?
A: 妳是說刪除程式碼以後程式碼要成功嗎?
但是程式碼這種東西,就是特別的貴,
有時候程式碼刪除掉了補充不回來的話,
這公司就真的不行了。
比如說妳在身份證上面貼一張黑膠帶,
遮住身份證字號,然後去跟警察說,
所有的身份證字號,都是我,我最大。
警察會說妳最大嗎?不會的,
警察還是會說,
在電腦裡面妳的身份證字號
仍然只有一組啊,
不會因為一張膠帶而改變的。
身份證壞掉只能花錢重新辦理。
所以這種事依法要花一些錢,
妳現在就要知道了,
未來遇到這個情況,就不會吃虧了。
刪除程式碼不是普通水桶裝水可以再裝,
而是身份證上面貼黑膠帶,
所以想的太簡單是無法獲利的。

Q: 這樣一來,程式碼減掉,也壓力太大了吧?
A: 當然,我們現在工作都使用英文名字,
不使用本名,以免遇到糾紛的時候被卡住。
工作都有他的風險,處理好就可以獲利,
處理不好就會虧損。
這時候當然是多問多學就可以了,
這個領域並不是要有產業標準,
如果有更好更彈性的工作方式,
都可以提出來,未來有機會,
成為產業標準喔。

//  --- End of Files ---

2025年7月11日 星期五

常見的未來發展預測

 常見的未來發展預測


電池:          花費時間 提供電力 節省人力

大公司:      節省時間 花費電力 花費人力

一人公司:  花費時間 花費電力 節省人力

睡覺:          節省時間 節省電力 節省人力


自動號碼產生器使用小問題

 


/*

//自動號碼產生器使用小問題

//20250712製作



為了常常使用VC++的朋友們,

我準備了下面這個簡單的表格:


作業系統       | XP虛擬機      | Windows 11

-------------------------------------------------------

是否可以       |  可以!             | 不可以!

使用VC++     |                       | 應使用VC++

2005             |                       | 2015以上版本 

--------------------------------------------------------

是否可以       |須使用SQL     | 須使用SQL   

使用MS         |Server2005    | Server2008以

SQL Server   |搭配VC2005   | 上搭配Win11   

--------------------------------------------------------


因為Visual C++ 2005 目前已經是

過時的技術!

所以Windows 11 電腦全面

不搭載Visual C++ 2005,

駭客就算是想癱瘓Visual C++ 2005,

也沒有任何一台windows 11可以安裝了,

各位使用Visual C++ 2005的小夥伴們! 

在虛擬機以個人進修的用途,

放心使用吧!

// --- End of Files  ---

*/


2025年7月6日 星期日

自動號碼產生器 FAQ Part 2

 /*

//FAQ Part 2: 不定的相同數
//
//20250618-20250707製作。
//這是一篇很長的文章,觀看時請耐心閱讀。
//20250707寫好了。
//搜尋“自動機編程”了解2025最新發展。
//(automata based programming)

Q: 有沒有可能有一種人具有移植這些演算法
的聰明頭腦呢?
A: 當然有可能啊。因為東京就在台灣隔壁的日本島上。你平常討論的太少了。
請看下面的討論來加以學習。

Q: 什麼是“不定的相同數”?
A: 在排列組合中,存在"不定的相同數"。
這裡英文稱為:the same numbers with uncertain quantities.
"不定的相同數",
是大量出現在計算組合與重複的問題之中。
本來在數學計算中,
只有計算相異數的先後次序,
才會使用排列去算,
但是如果要計算"不定的相同數",
就不是用排列算法,
而是用組合與重複的算法去算。

也許你會問:“計算組合的程式碼又在哪裡?”
這牽涉到查禁數學的議題。
通常在先進國家,
是不會去查禁‘‘不定的相同數’’。
因為查禁以後就沒有數學了,只剩下政治了。
其實計算"不定的相同數"這情況常常出現,
只要是先進國家,
是不會查禁數學這個科目的,
所以可以放心使用。
目前既然組合與重複的算法有爭議,
在台灣算法也可能被查禁,
就還不能公布技術細節。
在這個領域,輸給工業電腦是常有的事。
但是為了提升算力,當然要有所計算。

如果你想知道我的看法,
當然我說目前所有的發展都可以是錯的。
為什麼?
因為組合計算並沒有次序性,
所以不能用每年重複更新的方式去把它做工程。
這句話是什麼意思?
因為計算組合是討論一個所有情況下的組合的數字是多少,討論完計算完以後,就真的算完了。它不會有先後次序。如果你每年利用電腦更新,去調整那個固定數字,會發生“將組合問題計算成排列”的錯誤答案。這代表算錯了,簡單的說就是算錯。我們平常要避免把組合問題計算成排列,所以設立了高中數學,教導大家計算排列組合。組合數字因為古代就有數學家計算過了,未來它會是一個常數的資料庫,計算好了就固定而不變動。我建議你,沒有把握的時候不要開發任何組合數字排列化的技術,如果你知道複雜度會無限提高,就應該同意數學不是複雜就好。要把產生器的技術追加,視為是工程難題的筆記,我們如果說有些不好的技術筆記,先不要做筆記,反而要想的很簡單:
不要把任何組合,計算成排列,因為組合不是排列,高中有學過。我可以跟你保證,你只要持續的不要把組合計算成排列,你的工程專案成功機率就不會那麼低,這對於你計算組合的自信心,也會帶來幫助。組合不是排列,想簡單一點,運算快一點,這樣算術才會快。所謂有先後次序的,是工程難題與工程數量,考試要自己準備自己答案的題庫,應付千變萬化的工程問題,但是在面臨考驗的當下,要快速計算,就要快速判斷。這時候看清楚題目,排列不是組合,組合不是排列,運算快一點,利用這些原則去進行工程計算就可以了。至於自動號碼產生器,則是計算排列,而不是組合,用自動號碼產生器算排列是一種處理電腦常數的選用配備,依照你的需求來開發,記得做好成本管理。在複雜度無限延伸的工程問題上,排列出順序以後,應該以不虧損做為第一優先,時間充足,行有餘力,再追求專案的達成率。

Q: 如果我們利用每年更新,去把組合數字更新會怎樣呢?
A: 答案常常是:這個程式是可以用來調整公司流水線和作業流程的,至於對一般的電腦常數,只有一部分能調整,也有許多部份電腦常數不能調整。
所謂電腦常數是散布存在系統裡面,有很多無法更改也無法更新。因為更新等於是把組合數字給次序化了,原本沒有次序的組合數字,如果出現次序跟版本編號,會變成具有變數特性。但是組合數字是數學常數,不是數學變數,如果頻繁出現版本編號,系統會開始把你的常數比大小,數學常數就會變成數學變數,但是常數不可以是變數,所以這部份無法通過工程部門的檢驗。只有在進行改版工程的時候,有必要的常數才會有機會改寫成為變數。
這一部份才是工程學未來十幾年會討論的問題,你如果現在有時間,現在就可以開始研究。所以現在就要有這個觀念,組合不是排列,組合數字沒有次序性,不用排先後次序,也多半不需要每年更新,只有我們自己準備的筆記內容與技術細節要有次序,自己寫的筆記內容才需要有更新,那些算出來的常數則不用更新,
古代的外國人算公式多少就多少,
應該依法保留的常數都應該依法保留,
要改寫常數的,未來再提出案子未來處理,
想簡單一點,做好成本管理,
沒有案子的時候保守一點,避免虧損,
有改版的時候再進行人力的投入,這樣就對了。

Q: 那在設定演算法跟寫程式的時候,
我要怎麼知道"不定的相同數"有幾個?
數量多少?先後次序如何?要一個一個去算?
A: 答案是你要透過計算去歸類它。
依照你想追求的類型來歸類。
記憶體容量越大,類型越多,歸類越久。
數學本身就是個類型越多歸類越久的科目。
人們漸漸的發現了,
‘’不定的相同數‘’可以被人為安排
成為極大的數字組合,
而解碼這些組的數量龐大的‘’不定的相同數‘’,
也要花費宇宙無敵久的時間。
在千禧年以前的某個1980時期,
數學家的民怨沸騰:
‘‘算組合與重複缺乏次數標準,浪費時間!’’
“計算不定的相同數到底有幾次,複雜度怎麼可以無限延伸,花費過多時間,公司都要倒閉了!”
‘‘我不是有那個美國時間,要去計算那個重複
接近無限多次數的同一組數!讓電腦去算,
不要動用人力去算!’’
這些抱怨其實反過來代表人氣值很高。
如果你能夠發展出一個合理的獲利環境,
去處理這些一般數學職業上的抱怨,
比如說,建立一個規格,一口氣解決它,
就是有能力當公司了。
在某些公司產生無限多的虧損的時候,
另外一些公司則可以透過維持某種先進政策和策略來持續成長。
而且在現代的數學中,
計算組合本身不是計算排列,
不會有先後次序的問題,
比起古代數學已經有了很多進步。
但是也要知道,上一次的裁員減薪,
表示系統工程問題到達了無法突破的規模,
支出大於收入只能裁員。
常數雖然無法更改,但是你的技術筆記仍然
可以建議追加,只要以註解的方式記錄就可以了,
並且可註明,此時雖然裁員,
但是在未來可以追加人力。
寫個技術備忘錄,
讓未來接棒的團隊決定要不要一個一個算,
這樣比較好。

Q: 在國家中心的超級電腦,按個幾秒鐘它就出來了,你何必討論這麼多呢?沒有超級電腦在一個一個算的。
A: 那正好表示它有進步的空間。我不是要替那台品質未知的國家機器背書喔。你想想看,我們只接受了幾年的初中教育,難道有能力去判斷國家機器裡的運算公式嗎?事實上連專業的國家人員,都常常判別不出來那些電腦判斷式,不然台灣的地震跟颱風,早就沒事了。國家機器喜歡速算,國家機器談論細節的能力也不足,但是我們是來算普通人的數學,我們有我們嚴謹的做法。
為什麼?因為當你是一匹千里馬時,別人會用大象的規格要求你,而當你有了大象的規格以後,別人又會用大鯨魚的規格要求你,這個社群媒體就是這麼貪心。既然我們討論的是普通數學,就不會使用國家大鯨魚的規格在那裡討論複雜的速算法,我們就討論普通數學就好。普通數學是一種普世價值,當然要一個一個算,讓小學生也能懂一部份。未來這個程式做好編譯連結以後,可以跑一次以上,預計可以達到同時間重複執行一次以上的規模。比如說點兩次執行就會開兩個執行視窗,這些都保障了程式的基本品質,對於一個寫給新進人員的教學來說,這不會太差,也不是要追求高品質來累死新進人員的,這裡只使用了時間和電力,並沒有強迫要有人力的參與。人力的參與在本程式完全是自由的,因為它只使用了時間和電力,未來的人力完全有機會節省下來,讓新進人員去做別的事。你現在可以去國家中心,要求他們同樣只使用時間和電力,並且把人力節省到0人,要求他們要有這麼高的標準,看看他們答不答應,看看人力在0人的時候,是否會有“國家”的存在,或是“國家中心”的存在。我相信經過一陣辯論之後,你就能明白這個演算法背後驚人的優秀之處了。

Q: 我要怎麼處理這麼多的抱怨?
A: 其實網路文章從來就不是用來兌換國家貨幣的。如果有人抱怨賺不到錢,人氣值夠高,
未來只要利用人氣賺到錢以後就不會抱怨了。
因應眾多數學家的抱怨,自動號碼產生器
應運而生。自動號碼產生器只算排列,而且
為排列問題提供穩定而且簡單的解決方案,
適用於一般排列問題,並且公布原始碼,
方便加工為更難的專門程式。
只要你有無限多的加工時間,
它就能被你加工並解決無限難的問題。
基本上就是用時間和電力,
取代人力去解決問題的概念。
我到目前為止,確實只花費了時間和電力,
而且節省了人力。
你可以參考“機器學習演算法開發”這個另外一種新領域。
因為組合問題與重複問題,
可以被化簡為排列問題分布在
計算‘’不定的相同數‘’,
組合問題是‘‘不定的相同數’’的累積,
而重複問題是" 不定的相同數‘’的歸類。
未來掌握了計算‘’不定的相同數‘’的
所有計算以後,
一旦計算完成,算法所有解也就完成了,
並非不可能。這基本上就只是一個工程。
只要價格合理能獲利,有些案子會施作下去,
就能計算出成果,結案,獲利。
至於計算‘’不定的相同數‘’要花費多久時間,
準備多少成本,這就會成為一個工程問題,
至此,數學部門可以把案子交給工程部門,
抽象算法將轉交給實體計算機,
花費時間將由未來電腦與未來科技自動計算。
如果這個案子展望不錯,
它就會有機會超越時間,
在未來繼續成長。

Q: 那它會很貴嗎?
A: 答案是,有些裝置會貴一些。
有的裝置成本低,維護的人多,就便宜。
有的裝置成本高,維護的人少,費用就高。
這要看程式的pragma語法,
在繁體中文下是否能夠工業化成功。
你不一定要把費用視為負值或是支出,
反而可以看成是未來的經濟成長與動能。
通常值錢的不是最貴裝置,
而是每天都要用的那支裝置。
能讓你動起來的就是好裝置。
因此,我大膽預測,
省電的電池科技在未來將會有機會
為這個演算法產業降價,
因為這個程式需要電力,
所以會被電源供應程式管理,
未來也有可能會被寫進fast dormancy protocol裡面去整合,
在不久以後技術將會成熟,
fast dormancy protocol將有機會成為流行的技術,
而自動號碼產生器有了電力供應,
就可以把電腦常數改寫成電腦變數,
進行電腦進階功能的開發。
並且會有其他公司主導一些電池規格的改變。
不過電子效能雖然重要,
但是目前不斷電系統尚未普及。
比如說,不斷電系統壞掉的時候,
或是沒插電的時候,
裝置就沒有電了。
萬一停電,螢幕黑了,
螢幕的效能再好也沒有意義。
但是反過來說,螢幕如果不夠華麗,
光是有電,也還稱不上是一台裝置。
雖然這個演算法的裝置不一定像手機,
也可以是桌機與筆電與大型主機,
但是省電與效能兩個方向都會發展起來,
我們正處在天剛剛亮的時刻。

查詢歷史文獻,
文藝復興的早期只有手工藝,沒有織布機
與工廠。織布機與工廠是後來才有的。
只要市場價格合理,手工藝就會進步。
手工藝進步到登峰造極以後,什麼奇怪的織布機都做的出來。
所以現在的科技工藝當然也一樣,什麼機器都有可能做出來。
如果我們知道未來什麼機器都會有,
那是不是很適合現在就開始討論工程要怎麼做呢。

再回來看,
目前我這演算法只計算排列,
不計算重複與組合,
也只是因為目前的預估時間和龐大經費花費,不容許我們算出未來問題的所有未來工程解,
所以我們現在只算到這裡。
你要知道的是,
一般數學課本雖然有寫排列組合的公式解,
但是那個舊電腦系統是1980年,
不是現在的公式解。
你現在時代的排列組合公式解,
只有你自己算出來,
才是真正屬於你現在時代的排列組合公式解。
你要記得古代人是無法幫你做工程的,
因為古代人已經不在了。
你如果要做現代工程,就要找現代人。
經費數字也可以是千千萬萬的多,也可以是零,
所以你是否實作才是對你來說最重要的。
演算法就在這裡,未來費用一算就出來了,
不是一定賺也不是一定賠,
依照每個案子的規模大小來評估,
如果有獲利空間再接案就可以了。
人氣夠高賺到錢以後就不會抱怨了。

Q: 說到‘’已經不在了‘’,有些中文字,
在演算法裡動不了,
那我該怎麼做呢?
A: 我們繼續閒聊下去。
你也不用太擔心,
在演算法裡運算中文字是專業領域,
有的字不會動,可以評估一下未來處理價格,
雇用中文專業人員幫助你。
因為在某個工程規格跟另一個工程規格之間,
確定了規格大小以後就能把問題運算完成。
未來工程問題,應由未來工程人員解決。
雖然未來自動化十萬字以上的中文字,
難免有疏失,
但是對於10進位的自動化運算,
目前都可以使用。人類的數學,
要從10進位發展成為中文字進位,
還有一段距離。
我們沒有用那麼多的中文字進位,
或是有時一般單純的中文註解與參數動不了。
所以它有時候動不了,
只要是雇用工程師就能讓它動起來了。
工程師本身會說明註解,並且節省時間。
也許有一天會有產業標準。
這個領域是開放原始碼的,
我們也鼓勵機器學習。
為什麼從10進位擴張到中文字進位會卡卡的,
十萬字進位的工業化可能性到底有多少,
未來的小朋友是否能記憶住十萬字,
十萬字中文字系統到底是什麼規模。
或是從另一個方向來思考:
如果記不住三千中文常用字,
是否就應該不打字了,還是應該常常打字。
如果大家的小朋友都常常打字的話,
那未來中文字是否就會成長到十萬字。
那如果未來中文系統確定會成長到
十萬字的時候,
是不是我們會需要自動化,
是不是現在我們就應該開始討論
自動號碼產生器的實作方法。
自動化其實是這樣來的。
所以針對不同年齡的社群,安排不同的產品,
未來仍然很樂觀。
你不妨有空加以研究。
如果你要尋找工業化的廠商外包程式工作,
記得詢問案件價格,
並且貨比三家。

如果我當年開發了屬於查禁範圍的計算組合程式,等待我的只會是牢獄之災。再次提醒大家,當你是一匹千里馬時,別人會用大象的規格要求你,而當你有了大象的規格以後,別人又會用大鯨魚的規格要求你,這個社群媒體就是這麼貪心。但是,今天我記錄了這些話,以後用來提醒自己,指出一個未來想走這條路的人給他們一個方向跟故事。這個領域複雜度無限大,看起來會虧損,但是也有很高的人氣值,能不能上的去就看以後的人了。只要人氣值持續上升成長到工業規模,就會誕生工業品牌了,未來也可以很樂觀。

Q: 這一大堆未來算法,是否有什麼演算法
作為它的基礎或是核心或是起源或是藍圖,
有沒有現在就免費的?
A: 有的,那就是這一篇‘‘自動號碼產生器’’。
自動號碼產生器是用來算排列的,
計算組合的程式則是目前不提供,
要等待未來人氣值夠高,
等到很多人能在時間和電力前面工作的時候,
就可以進行新的開發了。
程式語法的相關法規有成熟的共識後再改版吧。
說不定未來有一天,在時間和電力前面,
會有很多人潮。
所以有空的網友,都歡迎來收看‘’自動號碼產生器‘’喔。

//---  End of files   ---//
*/

2023年12月20日 星期三

自動號碼產生器 FAQ

 /*

//---A N G E L Program FAQ---
FAQ (ANGEL program 10 years anniversary)
FAQ (自動號碼產生器10週年紀念)

Q: 自動號碼產生器是什麼?
A: 自動號碼產生器是基於電腦科學中
的八皇后問題而產生的演算法,
用來計算當使用者需要進行計算活動,
而計算活動適合排列演算法時,
可以用這個電腦程式自動產生所有解,
並且一個一個的秀出來!
未來可望應用在所有排列相關的問題上!

Q: MAXQUEEN字面翻譯是皇后數,
皇后數是什麼?
A:皇后數是八皇后問題與遞迴運算的
一種程式工程上的寫法,
它真正的意思是DIMENSION數,
也就是維度數字!
但是維度是相對於使用者而成立的,
如果使用者要求跟感受的維度不高,
就不需要非常多層次的維度,
也不需要那麼多的維度數字!
這個程式一開始的時候,
是來降低維度,降低難度的。

Q: 維度數字?難道宇宙真的是十一維度嗎?
最大值真的是11維嗎?
A: 並非如此!
我的程式因為有ARRAYSIZE,
SLOTNUMBER數字限制了
最大有10個SLOT,
所以加上數字0的維度,
一共只有11個維度。
未來工業化以後,
則可以提高成為更多的數字。
你只要把所有int變數改成long long
就可以擴充非常多維度。
未來還可以擴充到win32的size_t,
不同變數去進行各種改寫都有。
通常跑程式碼以後,是硬體跟不上,
不是軟體跟不上。
這個陽春版的宗運版產生器,
可以用各種方式向上擴充。
擴充的難點在於,
switch只有0到9這十個阿拉伯數字,
雖然可以像美國ASCII碼一樣,
多加幾個case,
擴充成16進位,
甚至unicode那種10萬以上的字符,
但是人類生命短暫,
如何不吃不喝不睡覺看完所有解呢?
因此本程式改成免費方式公布,
有多餘時間再來觀看就可以了!
並且可以自己修改數字,
1到10之內要算多少維度都可以。
至於宇宙是否為11維度,
要由物理學家來判定才對!

Q: 0階乘怎麼不是1呢?怎麼跑不出來?
A: 這有兩個原因:第一,
實際的工程問題並非學校裡的簡單數學。
這次產生器完成以後,
0階乘它是無解的,
既然跑成功了,它可以執行一次以上,
它就不需要拿來算0階乘。
函數大於等於1的時候它就不會是0函數。
妳若想擴充時,
都可以自己加入if-else或其他#define敘述
去額外定義0階乘會等於1這樣。
第二,0階乘不是1,
是因為MyErrorHandler的數學意義
直接改變了0的價值。
所以在本程式中,
0的意義和價值被分散了,
反而使得工程和數學,
在新的演算法下重新成立,
並且讓這個程式成為永遠可用的
新一代演算法程式。

Q: 為什麼不用linked-list來寫?
怎麼用陣列來寫呢?
A: 本程式引用的arrays.h
提供了可以push pop的新型陣列!
它在結構上不輸給linked-list而且
可以增加與刪減元素!
如果用linked-list來寫,
找尋元素速度上則會降低。
至於對工業界的人士來說
當然很慢!不合用!
因為他們用工業電腦特別快!
但是回頭來看,
這陽春程式碼可以在記憶體很小的
舊型電腦上面跑,
檔案大小也是超級小的!
並且時間過了多少,
就計算多少排列數裝進記憶體,
所以連小型計算機都有可能裝的下。
因此,有空的使用者,
都歡迎來使用本程式!


Q: 那些pragma是什麼?
MyErrorHandler是什麼?
A: 那是程式框架的一部份,
是一種提高安全性的寫法,
避免鍵盤和光碟機和工業電腦,
使用系統訊號
改寫程式裡的公用變數與數字,
造成不精準或是無法運算。
因為在國內沒有人這樣寫,
我在這裡把它稱為‘‘宗運框架’’。
在舊版的XP系統,
不使用MyErrorHandler
曾經是完全無法計算遞迴數字,
但是電腦計算機不可以連遞迴都算不出來,
所以我進行研究以後,
從外國文獻找到這個寫法,
經過工程化之後,
成功完成這個產生器。

Q: 不太能理解,這個框架會怎樣嗎?
A: 當時的鍵盤和光碟機常常
阻止與封印開發人員計算遞迴,
發出一種電子訊號使編譯不能成功,
經過測試以後!
這個框架可以有效阻擋你的光碟機
弄壞你的程式,是VC++2005的一種
安全性寫法。
隨著時間過去,
現在的光碟機越來越便宜,
如果你光碟機會影響編譯器亂跑,
都可以嘗試這個宗運框架的寫法。
當然!已經過時了,
只對WIN XP電腦
和2005年左右的光碟機有效!
現在仍然不穩定的編譯器雖然可以試試看,
不保證還能成功。

Q: pragma很討厭!
我要clean architecture不可以嗎?
A: 在遞迴運算,我只能這樣寫,
以符合XP電腦的VC++2005規格,
這是我的陽春作品!
我當時還連絡了兩三個其他的工程師
寫了一些其他程式碼,
妳可以多多詢問他人,
並且查閱現在20年後的文獻!
這個程式它不會是clean architecture,
因為當時的蘋果系統封印了微軟遞迴運算!
為了達成遞迴運算的教學和使用,所以
公布這個演算法這樣子。
我們如果寫成clean architecture,
蘋果公司又要封印微軟一次,
會有更多問題,
所以這次的程式碼不會是clean architecture。


Q: 可是你算的又慢又不準啊!
有組合跟重複的情形都沒有算!
A: 是否要計算重複要看需求,
我提供的是大量的可能性(possibilities)!
讓使用者有機會比對數學公式
與實際工程後的真正數量,
一個情況一個情況一個情況的算出來以後,
可以真正提高大家能力,
這才是這個教學系列的目標!
未來把int改寫成long long以後,
淘汰掉那些跑不動的硬體,
交給工業電腦的專業寫碼人員,
就可以開發更多也算的更多了!
維度可以提升的程式,
才是真正的程式。
我們都是主張多多討論,
如果只有酸民心態是無法團隊合作的。

Q: 宗運框架有實際用途嗎?
不要寫奇怪的pragma?
A: 要知道連接SQL2005,
一樣可以用這個框架!
雖然2005版以後有C#,更好用,
但是舊版電腦要連線要維護,
只有使用宗運框架。
如果有大量讀者詢問,
人氣夠多,我再另外寫文章敘述
如何連接宗運框架。
未來有時間,可能會寫?
一開始看起來很難,
但是這是工業級的遞迴程式,
工業化以後,
對電信業的工廠工頭來說不會是問題!


Q: 你的路走偏了!
現在已經進步到python了,誰還要C++啊?
A: 有哦!那就是簡單計算機:calculator。
不論是陽春的CASIO或是ARDUINO,
都採用類似電腦語言的程式在運作,
這些都是這個程式碼的潛在使用者!
語言要能讓它自己的話容量變小濃縮的,
才是真正的電腦語言。C語言就是這樣。
反觀python現在是龐大怪獸,容量巨大,
在濃縮自己語言這一點上面,
python還早咧。

Q: HASKELL一下子就算好遞迴了,
程式碼更精簡!
A: 很高興看到工業化
能夠做出更短篇幅的其他廠商程式!
只要是可以提高討論熱度,
我是不會反對這些未來工業發展的,
妳要想起來現在不是2005年,
已經過了很久了!

Q: VC++是單執行緒!
比不上python多執行緒!快停止開發吧!
A: 錯了!多執行緒會流行,
是因為有影片網路公司和
有線電視公司的寫碼人員。
但是簡單計算機不需要在短缺的記憶體,
儲存任何有線電視影片和程式吧?
越簡單越好!所以單執行緒跟超小EXE空間,
反而變成首選了。

Q: 那是EMBEDDED C++不是VC++ ?
A: 很高興20年後,
已經發展出EMBEDDED C++。
我樂觀看待未來發展。
至於VC++如何的比不過EMBEDDED C++,
其實不會啊!那都是C語言相容的,
妳要不要多借幾本教科書?
這些語言都有它的用途。

Q: 那麼到底是怎麼連接的?
A: EMBEDDED C++你要另外
查詢他們的技術書籍喔!
我樂觀看待未來發展。
別擔心!伺服器人員工作能力強大,
他們自然會發展其他新程式語言。
我已經沒有在工程師領域裡面了,
我還常常需要新書新知識呢!

Q: 那我不就要把它逆向工程
變成組合語言,
然後拿去裝在簡單計算機?
A: 當然有可能啊!
ARDUINO與逆向工程現在很有名。
我樂觀看待未來發展。

Q: 大家小台的都用iPhone,
簡單計算機也不需要算排列啊?
A: 嗯!2013年公布這個算法以後,
2023年的需求自然會降低囉!
任何工程問題計算好以後,
工業電腦就會拿去算新的問題,
不代表舊的計算沒有用啊!
這是時代會進步,應該樂觀看待!

Q: 到底幫助了哪家公司嗎?
A: 2013年公布算法以後,
現在不就需求變少了嗎?
演算法科技是否推動科技進步?
可以拿數據參考一下,
幫助電腦設備降價才是目標啊!

Q: 可是iPhone要貴一點啊!
A: VC++是微軟產品,微軟不是蘋果公司喔!
想通了嗎,
妳要不要參考更多教科書?
微軟現在市值比蘋果公司低,
蘋果比較貴,微軟比較便宜,
目標有達成喔!

Q: 這亂七八糟算法怎麼會是對的呢?
A: 階乘運算之所以會算出
無限多跟非常大的數字,
因為他在關鍵運算只用了乘法律和加法律!
而且他是正整數。
因為關鍵階乘運算沒有減沒有除,
所以正整數足夠加到無限多。
可以參考排列組合數學書籍的說明
來理解就可以了。
你要是改寫成亂除亂減,就會算錯囉!

Q: 最後請問怎麼沒有寫ASSERT?
A: 我沒有那麼多的工廠ASSERT技術哩!
這是一個陽春版的程式。
如果我來寫ASSERT,
還沒有機器就寫的話會是負面評價!
因為會減分!我不能寫,
要給下一棒接力,
交給工廠原廠工頭來寫才對!
而且,妳要不要多借幾本教科書?
iPhone現在太多人買,太貴了。
妳要不要考慮改用SAMSUNG手機?

Q: 找不到windows.h?
A: 可以下載並安裝微軟DirectX 9.0c SDK
安裝到windows XP系統。

//---End of Files---
*/





2018年3月31日 星期六

Re: n 取 n 逆時鐘旋轉排列法(水果盤排列程式)

// test004.cpp: 定義主控台應用程式的進入點。
//(水果盤排列程式)
//恭喜你設計出新的排列組合程式,
//我幫你做了一個有define變數的水果盤排列程式,
//n--->A , r--->B ,
//並且計算出Cnr的組合數字,取名為N3。
//設定組合總數為N2,排列所有組合的數量為N3,
//預估N = N3 + 1。
//詹宗運製作,版本: Visual C++ 2017 20180403新版
//

#include "stdafx.h"
#include <functional>  // std::function
#include <memory>    // std::shared_ptr
#include <vector>
#include <iostream>
#include <exception>    // exception
#include <stdexcept>    // exception
#include <new>          // exception
#include <typeinfo>     // exception
//#include <windows.h>//myerrorhandler
//#include <stdarg.h>//myerrorhandler
#include <stdio.h>//cout
//#include <rtcapi.h>//myerrorhandler

//#include <ostream>//fopen

#include <stdlib.h>//calloc
#include <iostream>//cout
using namespace std;
#include <iomanip>//setw()
//
//
//#include <fstream>//fopen
//#include <memory.h>//typeinfo
//#include <typeinfo>//typeinfo
//#include <string.h>//string
//#include <cstring>//string
//#include <cstddef>//string

//using namespace std;

#define A 10
#define B 5
#define SLOT_SIZE 10

//從1開始遞增
int N = 1;
//新增例外類別

const exception* Logic_Error = new exception("Logic_Error");

//if ((int)A > (int)SLOT_SIZE) throw Logic_Error;
//if ((int)B > (int)SLOT_SIZE) throw Logic_Error;


const char* Make_Slot(int);
//---
//儲存節目名稱的結構
struct show_slot
{
int id;
const char* name;
};


show_slot s_slot[SLOT_SIZE - 1];

void load_slot() {
for (int i = 0; i < (SLOT_SIZE - 1); i++)
{
s_slot[i].id = i;
}
//這裡是儲存水果名稱的結構
//可以透過修改字串來改變水果的名稱
s_slot[0].name = "蘋果";
s_slot[1].name = "香蕉";
s_slot[2].name = "番茄";
s_slot[3].name = "橘子";
s_slot[4].name = "柳丁";
s_slot[5].name = "西瓜";
s_slot[6].name = "芭樂";
s_slot[7].name = "哈密瓜";
s_slot[8].name = "火龍果";
s_slot[9].name = "葡萄";
}

// n 取 r 做排列
// 採用逆時旋轉排列法
// 必須 n >= r
class Permutation_nPn
{
// 回報結果
function<void(const shared_ptr<vector<unsigned char> > &, size_t)> m_Report;
// 放置要排列的數字
shared_ptr <vector<unsigned char> > m_Digital_Array;
// 要做排列的數目值
size_t m_r;

void v(size_t n, size_t r)
{
size_t i = n + 1;
while (i--)
{
if (r == 0)
m_Report(m_Digital_Array, m_r);
else
v(n - 1, r - 1);
unsigned char tmp = m_Digital_Array->at(n);
for (size_t j = n; j > 0; --j)
m_Digital_Array->at(j) = m_Digital_Array->at(j - 1);
m_Digital_Array->at(0) = tmp;
}
}

public:
// Permutation_nPn() {}

Permutation_nPn(const function<void(const shared_ptr<vector<unsigned char> > &, size_t)> &Receive)
:m_Report(Receive)
{}

void nPr(size_t n, size_t r)
{
m_r = r;
m_Digital_Array = shared_ptr<vector<unsigned char> >(new vector<unsigned char>(n));
size_t i = n;
while (i--)
{
m_Digital_Array->at(i) = i;
}
v(n - 1, r - 1);
}
};

void startmsg()
{
cout << "簡易水果排列程式!" << endl;
cout << "從" << A << "種水果任取" << B << "種水果的排列如下所示:" << endl;

}

void Show(const shared_ptr<vector<unsigned char> > &Digital_Array, size_t r)
{
cout << "第\t" << N << "組:\t\t";
for (size_t i = Digital_Array->size() - 1; r > 0; --i, --r)
cout << Make_Slot((int)Digital_Array->at(i)) << ' '; //利用此行輸出水果的種類
cout << endl;
++N;
}

const char* Make_Slot(int s)
{

if (s > SLOT_SIZE) throw Logic_Error;

int tmp003 = s;
if (tmp003 < 0) throw Logic_Error;

return s_slot[tmp003].name;

}

int cnt(int tmp001)
{
int i;
int num001 = 1;
for (i = 0; i < tmp001; i++)
num001 = num001 * (i + 1);
return num001;
}

int cntN(int tmpA, int tmpB)
{
int tmp002;
if (tmpA < tmpB)throw Logic_Error;
try {
int tmpC = cnt(tmpA);
int tmpD = cnt(tmpB);
int tmpE = cnt(tmpA - tmpB);
tmp002 = tmpC / (tmpD*tmpE);

//tmp002 = cnt(tmpA) / cnt(tmpB)*cnt(tmpA - tmpB);
}
catch (const exception& e) {
cout << e.what() << endl;
system("PAUSE");
exit(-1);
}
if (tmp002 > 0) {
return tmp002;
}
else { throw Logic_Error; }
}

int main()
{
//function<void(const shared_ptr<vector<unsigned char> > &, size_t)> Reprot(Show);
Permutation_nPn P(Show);

startmsg(); //秀出起始訊息
load_slot();   //載入水果結構名稱

   //進行計算
   //N從1開始遞增
N = 1;
int N2 = cntN(A, B);
int N3 = cnt(B)*N2;
//if (N2 != N) {
cout << "A=" << A << endl;
cout << "B=" << B << endl;
cout << "N2=" << N2 << endl;
cout << "N3=" << N3 << endl;

if (N3 > 40000) {
cout << "N3組合數字過大,取消顯示,程式結束。" << endl;
system("PAUSE");
exit(-1);
}
cout << "將開始計算,請準備。" << endl;

system("PAUSE");

//主程式
P.nPr(A, B);
//驗算
N2 = cntN(A, B);

cout << "A=" << A << endl;
cout << "B=" << B << endl;
cout << "N=" << N << "( = N3 + 1 )" << endl;  // N = N3+1 ,否則就是算錯了
cout << "N2=" << N2 << endl;
cout << "N3=" << N3 << endl;

cout << "計算完成。" << endl;


system("PAUSE");

return 0;
}

2018年3月27日 星期二

Re: n 取 n 逆時鐘旋轉排列法


// test002.cpp: 定義主控台應用程式的進入點。
//

#include "stdafx.h"
#include <functional>  // std::function
#include <memory>    // std::shared_ptr
#include <vector>
#include <iostream>
#include <exception>    // exception
#include <stdexcept>    // exception
#include <new>          // exception
#include <typeinfo>     // exception

using namespace std;

//下面是主要改數字的區域,A就是 Cnr 的n, B就是 Cnr 的r。
//可以透過更改A和B的數字來計算Cnr的結果。
//改成A和B變數可以符合國中數學的二元方程式教學以及帕斯卡三角形教學。

#define A 10
#define B 5

//從1開始遞增
int N = 1;
//新增例外類別
const exception* Logic_Error = new exception("Logic_Error");


// n 取 r 做排列
// 採用逆時旋轉排列法
// 必須 n >= r
class Permutation_nPn
{
// 回報結果
function<void(const shared_ptr<vector<unsigned char> > &, size_t)> m_Report;
// 放置要排列的數字
shared_ptr <vector<unsigned char> > m_Digital_Array;
// 要做排列的數目值
size_t m_r;

void v(size_t n, size_t r)
{
size_t i = n + 1;
while (i--)
{
if (r == 0)
m_Report(m_Digital_Array, m_r);
else
v(n - 1, r - 1);
unsigned char tmp = m_Digital_Array->at(n);
for (size_t j = n; j > 0; --j)
m_Digital_Array->at(j) = m_Digital_Array->at(j - 1);
m_Digital_Array->at(0) = tmp;
}
}

public:
Permutation_nPn() {}

Permutation_nPn(const function<void(const shared_ptr<vector<unsigned char> > &,\
 size_t)> &Receive):m_Report(Receive){}

void nPr(size_t n, size_t r)
{
m_r = r;
m_Digital_Array = shared_ptr<vector<unsigned char> >\
(new vector<unsigned char>(n));
size_t i = n;
while (i--)
{
m_Digital_Array->at(i) = i;
}
v(n - 1, r - 1);
}
};

void startmsg()
{
cout << A << "P" << B << "的排列:" << endl;
}

void Show(const shared_ptr<vector<unsigned char> > &Digital_Array, size_t r)
{
cout << N << ":\t";
for (size_t i = Digital_Array->size() - 1; r > 0; --i, --r)
cout << (int)Digital_Array->at(i) << ' ';
cout << endl;
++N;
}

int cnt(int tmp001)
{
int i;
int num001 = 1;
for (i = 0; i < tmp001; i++)
num001 = num001 * (i + 1);
return num001;
}

int cntN(int tmpA, int tmpB)
{
int tmp002;
if (tmpA < tmpB)throw Logic_Error;
try {
int tmpC = cnt(tmpA);
int tmpD = cnt(tmpB);
int tmpE = cnt(tmpA - tmpB);
tmp002 = tmpC / (tmpD*tmpE);

//tmp002 = cnt(tmpA) / cnt(tmpB)*cnt(tmpA - tmpB);//error
}
catch (const exception& e) {
cout << e.what() << endl;
system("PAUSE");
exit(-1);
}
if (tmp002 > 0) {
return tmp002;
}
else { throw Logic_Error; }
}


int main()
{

Permutation_nPn P(Show);

startmsg();
N = 1;


int N2 = cntN(A, B);
int N3 = cnt(B)*N2;

cout << "A=" << A << endl;
cout << "B=" << B << endl;
cout << "N2=" << N2 << endl;
cout << "N3=" << N3 << endl;

if (N3 > 40000) {
cout << "N3組合數字過大,取消顯示,程式結束。" << endl;
//為了方便展示所以取消顯示所有解
system("PAUSE");
exit(-1);
}
cout << "將開始計算,請準備。" << endl;

system("PAUSE");
//主程式
P.nPr(A, B);
//驗算

cout << "A=" << A << endl;
cout << "B=" << B << endl;
cout << "N=" << N << " ( = N3 + 1)" << endl;  // N = N3+1 ,否則就是算錯了
cout << "N2=" << N2 << endl;
cout << "N3=" << N3 << endl;

cout << "計算完成。" << endl;


system("PAUSE");

return 0;
}