2018年7月7日 星期六

快速排序法改良版

因遞廻會有爆掉堆疊的危險,所以若有可能盡可能用廻圈,但是不是可以用廻圈取決於關鍵變數,在一個廻圈後是不是須要保留其值,若不須要則可以重設其值,進行下一個廻圈的運行

以下用快速排序法做進一步的說明,先說它的改良法是青衫教的,我一直銘記在心

因快速排序法運行一個回合後會由定位點分割成左右兩部份,若要重設關鍵變數再處理左邊部份,右邊就失去關鍵變數沒法處理,反過來做亦相同,因此就讓較短的那邊用遞廻,長的那邊用廻圈

2018年5月8日 星期二

猜數字 - ML 多國語言應用範例

這是一個實驗程式,有兩個實驗目標。

  1. 測試 ML 在 主程式 和 插件 是否能各別建立自己的多國語言能力,但兩者間又能互通,因插件可能和主程式在不同時期或不同人所開發,因此能否各別獨立建立自己的多國語言能力,勢必成為必須的目標。但還得讓插件可以隨主程式一起變動,這是可選擇性的,但卻是最常用的選項。這部份的實驗很成功,同時使用 "wxWidgets 的延伸控制件 for ML" 可以即時更動 GUI 的文字語言,結果很令人滿意。
  2. 測試 主程式 和 插件 間的非同步互動,這部份花了最多時間,也很雜亂,應該還有 bug 存在,因有時還是會出槌。因為是非同步處理所以抓 bug 又很麻煩,所以點到就好了,主要還是在 ML 的實驗。事後想想若一開始用圖靈機制規劃好應該會比較容易。
主程式所用的譯文檔置於 Lang 子目錄下,插件所用的譯文檔在 plugin\GuestCore_1_0\Lang,插件還提供機器人用的 密語,純好玩別當真,可用 MLedit 增修更多語言的譯文檔。

2018年5月7日 星期一

MLedit 多國語言編輯器

這是為 ML 插件製作譯文檔的輔助程式,本身所用的譯文檔置於 Lang 子目錄下,觀迎大家幫忙擴增更多語言的譯文。

下載點:

完整檔案包,可直接執行 MLedit.exe

MLedit_0.1.0_complete.7z


精簡檔案包,適用於已安裝 CxxlMan2 開發環境懶人包,執行 "MLedit.exe - 捷徑 "

MLedit_0.1.0_simplify.7z


原始檔案包,適用於已安裝 CxxlMan2 開發環境懶人包,解壓到 C:\MySrc,支援 CMake 建立編譯專案

MLedit_0.1.0_Src.7z






CxxlMan2 開發環境懶人包

這是以 CodeBlocks 為開發環境架構出來的懶人包,包含 CxxlMan2 程式庫和插件、MinGw 5.1 以及  wxWidgets 3.1.1,內含設置說明

CxxlMan2 開發環境懶人包 20180606.7z


以下是 wxWidgets 教程簡體中文譯文:
https://wizardforcel.gitbooks.io/wxwidgets-book/index.html


2018年5月6日 星期日

wxWidgets 的延伸控制件 for ML(多國語言插件)

延伸 wxWidgets 的控制件,達成和 ML 互動
延伸出的控制件的命名為原控制件名稱後多加 Ext,如:wxMenuExt
配合 CodeBlocks 的 wxSmith 的用法以順利取代原控件

目前提供的控制件如以下所列,可依樣畫葫蘆自己增加

2018年4月8日 星期日

instal 是 windows 執行檔名的特殊關鍵字

只要執行檔名含有 instal,無論位於哪個位置都會被視為安裝程式,不會用一般程式的方式啟動,害我抓 bug 抓了老半天

jhfcaginstalhfhgfg.exe 這個不是一般程式



2018年4月5日 星期四

nPr 排列法

這方法會比旋轉要來得快

#include <functional>   // std::function
#include <memory>       // std::shared_ptr
#include <vector>
#include <iostream>

using namespace std;

// n 取 r 做排列
// 採用逆時旋轉排列法
// 必須 n >= r
class Permutation_nPr
{
  // 回報結果
  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)
  {
    if (r == 0)
      m_Report(m_Digital_Array, m_r);
    else
      v(n - 1, r - 1);

    for (size_t j = n; j > 0; --j)
    {
      {
        unsigned char tmp = m_Digital_Array->at(n);
        m_Digital_Array->at(n) = m_Digital_Array->at(j-1);
        m_Digital_Array->at(j - 1) = tmp;
      }

      if (r == 0)
        m_Report(m_Digital_Array, m_r);
      else
        v(n - 1, r - 1);

      {
        unsigned char tmp = m_Digital_Array->at(n);
        m_Digital_Array->at(n) = m_Digital_Array->at(j-1);
        m_Digital_Array->at(j - 1) = tmp;
      }
    }
  }

public:
  Permutation_nPr(
   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);
  }
};



class MsgShow
{
  int N{1};
public:
  void ResetN(){N = 1;}
  void operator()(
    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 main()
{
  MsgShow Report;
  Permutation_nPr P(Report);

  cout << '\n' << "4P3 排列:" << endl;
  Report.ResetN();
  P.nPr(4,3);

  return 0;
}