W32 Gcm Lcm

最大公約数(GCM)と最小公倍数(LCM)を計算します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. [Windows デスクトップ アプリケーション] はメッセージループで描画する Win32 API に準じるプラットホームです。
    UWP の Platform はプログラムが難解で、個人的には Win32 API の方が使いやすいのですが、シングルタスクで実行されるようです。 (^_^;)
    但し、文字コードは ASCII(Shift-JIS) では無く Unicode(UTF-16) が使われています。
    (ソースファイルの文字コードは UTF-8 が使われているようです。)
    EditControl を貼り付けて、最大公約数(GCM)と最小公倍数(LCM)を計算してみましょう。
    GCM, LCM の説明は GCM LCM を参照して下さい。
    Visual Studio で [C++ Windows デスクトップ] のプロジェクトを作成します。
    プロジェクトの作成は W32 Hello を参照して下さい。
  2. WindowsProject1.cpp の [// グローバル変数:] に続いて Control の領域と作業領域を定義します。
    XAML が使えないので Control(Edit, Button, Static, etc) の数が多くなると結構面倒です。
    // グローバル変数:
    HINSTANCE hInst;                                // 現在のインターフェイス
    WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーのテキスト
    WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名
    HWND    g_hEdit1;           // EditControl
    HWND    g_hEdit2;
    HWND    g_hEdit3;
    HWND    g_hEdit4;
    HWND    g_hButton1;         // ボタン
    HWND    g_hButton2;
    HWND    g_hStatic1;         // 見出し
    HWND    g_hStatic2;
    HWND    g_hStatic3;
    HWND    g_hStatic4;
    WCHAR   str[80];            // 作業領域
    int     d1, d2, wk;
    
  3. 続いて後位参照が起こらないように gcm() 関数と lcm() 関数を定義します。
    int gcm(int v1, int v2)
    {   int w1 = v1;
        int w2 = v2;
        while(w1 != w2)
        {   if (w1 > w2)    w1-= w2;
            else            w2-= w1;
        }
        return w1;
    }
    
    int lcm(int v1, int v2)
    {
        return v1*v2/gcm(v1,v2);
    }
    
  4. WndProc() の WM_CREATE: でウインドウに Control を貼り付けます。
    L"STATIC" が見出しで、L"EDIT" が EditControl で、L"BUTTON" がボタンです。
    ページ先頭の画像を参考にして下さい。
    実際にプログラムするときは、WM_CREATE: を追加して実行結果を確認しながら座標とサイズを調整します。
        case WM_CREATE:
            g_hStatic1 = CreateWindow(L"STATIC", NULL, WS_CHILD | WS_VISIBLE,
                20, 20, 60, 25, hWnd, NULL, hInst, NULL);
            SetWindowText(g_hStatic1, L"DATA-1");
            g_hStatic2 = CreateWindow(L"STATIC", NULL, WS_CHILD | WS_VISIBLE,
                20, 60, 60, 25, hWnd, NULL, hInst, NULL);
            SetWindowText(g_hStatic2, L"DATA-2");
            g_hEdit1 = CreateWindow(L"EDIT", NULL, (WS_CHILD | WS_VISIBLE | WS_BORDER),
                100, 20, 80, 25, hWnd, NULL, hInst, NULL);
            g_hEdit2 = CreateWindow(L"EDIT", NULL, (WS_CHILD | WS_VISIBLE | WS_BORDER),
                100, 60, 80, 25, hWnd, NULL, hInst, NULL);
            g_hStatic3 = CreateWindow(L"STATIC", NULL, WS_CHILD | WS_VISIBLE,
                240, 20, 40, 25, hWnd, NULL, hInst, NULL);
            SetWindowText(g_hStatic3, L"GCM");
            g_hStatic4 = CreateWindow(L"STATIC", NULL, WS_CHILD | WS_VISIBLE,
                240, 60, 40, 25, hWnd, NULL, hInst, NULL);
            SetWindowText(g_hStatic4, L"LCM");
            g_hEdit3 = CreateWindow(L"EDIT", NULL, (WS_CHILD | WS_VISIBLE | WS_BORDER),
                300, 20, 80, 25, hWnd, NULL, hInst, NULL);
            g_hEdit4 = CreateWindow(L"EDIT", NULL, (WS_CHILD | WS_VISIBLE | WS_BORDER),
                300, 60, 80, 25, hWnd, NULL, hInst, NULL);
            g_hButton1 = CreateWindow(L"BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                80, 100, 80, 30, hWnd, (HMENU)IDOK, hInst, NULL);
            SetWindowText(g_hButton1, L"計算");
            g_hButton2 = CreateWindow(L"BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                240, 100, 80, 30, hWnd, (HMENU)IDCANCEL, hInst, NULL);
            SetWindowText(g_hButton2, L"終了");
            break;
    
  5. IDOK: で EditControl にタイプされた文字列(数字)を取得して GCM と LCM を計算します。
    GetWindowText() が EditControl から TEXT を取得するコードで SetWindowText() が設定するコードです。
    IDCANCEL: でプログラムを終了します。
    IDOK, IDCANCEL は定義の必要が無い既定のIDです。
                switch (wmId)
                {
                case IDOK:
                    GetWindowText(g_hEdit1,str,80);
                    d1 = _wtoi(str);
                    GetWindowText(g_hEdit2, str, 80);
                    d2 = _wtoi(str);
                    wk = gcm(d1, d2);
                    wsprintf(str, L"%d", wk);
                    SetWindowText(g_hEdit3, str);
                    wk = lcm(d1, d2);
                    wsprintf(str, L"%d", wk);
                    SetWindowText(g_hEdit4, str);
                    break;
                case IDCANCEL:
                    PostMessage(hWnd, WM_CLOSE, 0, 0);
                    return TRUE;
    
  6. x64 または x86 を選んで、右三角矢印(または F5 キー)でコンパイルします。
    DATA-1 と DATA-2 に整数値をタイプして"計算"をクリックすると GCM と LCM が計算されます。
    "終了"をクリックするとプログラムが終了します。
    Windows デスクトップ アプリケーションは UWP のように自動的にメニューに登録されることは無いようです。
    プログラムは Win32 API に準じるようです。詳細は[超初心者のプログラム入門(C言語 Windows)]を参照して下さい。

超初心者のプログラム入門(C/C++)

超初心者のプログラム入門(C言語 Windows)