FizzBuzz問題の解答例 Win32 API編

Win32 API+C言語によるFizzBuzz問題の解答例。

解答例

実行結果をエディットコントロールに表示するプログラム:

/*
  fizzbuzz.c
*/

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int FizzBuzz(int, HWND);

HINSTANCE hInst;

/* エントリポイント */
int WINAPI WinMain(
  HINSTANCE hCurInst, 
  HINSTANCE hPrevInst,
  LPSTR lpsCmdLine,
  int nCmdShow)
{
  HWND hWnd;
  WNDCLASSEX wc;
  MSG msg;
  BOOL bRet;

  hInst = hCurInst;

  /* ウィンドウクラスの定義 */
  wc.cbSize = sizeof(WNDCLASSEX);
  wc.style = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc = WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = hCurInst;
  wc.hIcon = (HICON)LoadImage(
    NULL, 
    IDI_APPLICATION, 
    IMAGE_ICON, 
    0, 
    0, 
    LR_DEFAULTSIZE | LR_SHARED);
  wc.hCursor = (HCURSOR)LoadImage(
    NULL, 
    IDC_ARROW, 
    IMAGE_CURSOR, 
    0, 
    0, 
    LR_DEFAULTSIZE | LR_SHARED);
  wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  wc.lpszMenuName = NULL;
  wc.lpszClassName = _T("FizzBuzzClass");
  wc.hIconSm = (HICON)LoadImage(
    NULL, 
    IDI_APPLICATION, 
    IMAGE_ICON, 
    0, 
    0, 
    LR_DEFAULTSIZE | LR_SHARED);

  /* ウィンドウクラスの登録 */
  if(RegisterClassEx(&wc) == 0)
    return FALSE;

  /* ウィンドウの作成 */
  hWnd = CreateWindow(
    wc.lpszClassName,
    _T("FizzBuzz"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,
    NULL,
    hCurInst,
    NULL);

  /* ウィンドウの表示 */
  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);

  /* メッセージループ */
  while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
    if (bRet == -1)
      break;
    else {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }

  return (int)msg.wParam;
}

/* ウィンドウプロシージャ */
LRESULT CALLBACK WndProc(
  HWND hWnd,
  UINT msg,
  WPARAM wp,
  LPARAM lp)
{
  static HWND hEdit;

  switch (msg) {
    case WM_CREATE:
      /* エディットコントロールの作成 */
      hEdit = CreateWindow(
        _T("EDIT"), 
        NULL,
        WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | 
        ES_WANTRETURN | ES_MULTILINE | 
        ES_AUTOHSCROLL | ES_AUTOVSCROLL,
        0, 
        0, 
        0, 
        0, 
        hWnd, 
        NULL, 
        hInst, 
        NULL);
      SendMessage(hEdit, EM_SETLIMITTEXT, 0, 0);
      FizzBuzz(100, hEdit);
      break;
    case WM_SIZE:
      MoveWindow(hEdit, 0, 0, LOWORD(lp), HIWORD(lp), TRUE);
      break;
    case WM_SETFOCUS:
      SetFocus(hEdit);
      break;
    case WM_CLOSE:
      DestroyWindow(hEdit);
      DestroyWindow(hWnd);
      break;
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    default:
      return DefWindowProc(hWnd, msg, wp, lp);
  }

  return 0;
}

/* FizzBuzz */
int FizzBuzz(int n, HWND hEdit)
{
  int i;
  TCHAR szBuf[20];

  for (i = 1; i <= n; i++) {
    if (i % 3 == 0 && i % 5 == 0)  /* iが3の倍数かつ5の倍数 */
      SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)_T("Fizz,Buzz\r\n"));
    else if (i % 3 == 0)  /* iが3の倍数(かつ5の倍数でない) */
      SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)_T("Fizz\r\n"));
    else if (i % 5 == 0)  /* iが5の倍数(かつ3の倍数でない) */
      SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)_T("Buzz\r\n"));
    else {  /* iが3の倍数でも5の倍数でもない */
      _sntprintf(szBuf, sizeof(szBuf), _T("%d\r\n"), i);
      SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)szBuf);
     }
  }

  return 0;
}

関連記事

FizzBuzz問題の解答例 まとめ

【theme : プログラミング
【genre : コンピュータ

プロフィール

よしいず

Author:よしいず
MATHEMATICS.PDFというウェブサイトを運営しています。

管理の都合上、トラックバックとコメントはオフにしてあります。ブログ経験者なら分かっていただけると思いますが、スパム(アダルトやその他の宣伝)ばかりなのが現実です。

リンクは自由です。当サイトの記事に対する間違いの指摘・意見・感想などを述べた記事からのリンクは歓迎です。ただし、ブログ記事アップ直後はミスが多く、頻繁に修正します。場合によっては削除する可能性もあります。その際、何も断りもなく修正・削除しますがご了承ください。内容を参考にする場合には投稿後一週間ほど様子を見てからにしてください(笑)。

記事の間違いを指摘するときは、その具体的箇所、理由(仕様に反するなど)・根拠(参考にした文献など)、代替案(同じ結果を得るための正しいやり方)も教えてください。そうしないと、(指摘される側および第三者はその時点では無知の状態なので、)どこが間違いなのか分かりませんし、本当に間違っているのかどうかが判断・検証できません。実際、間違いだと指摘されたことが結局は正しかったというケースもありますので。

このブログのタイトル一覧

リンク
月別アーカイブ
カテゴリ
最新記事
検索フォーム
RSSリンクの表示