生年月日を入力して、曜日と生存日数を表示

VC++ の DialogBox から生年月日を入力して、生まれた曜日と生存日数を表示します。

カレンダの話

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクトから空のプロジェクト(Dlgyoubi)を作成して下さい。
  2. ページ先頭の画像を参考にして DialogBox を作成して [StaticText] と [EditControl] と [Button] を配置して下さい。
    「生年月日」や「西暦年」などの表示は [StaticText] で、隣のボックスは [EditControl] です。
    キャプションとIDを次のように設定して下さい。(EditControl の ID は規定値のままです)
    キャプション ID
    西暦年 IDC_EDIT1
    IDC_EDIT2
    IDC_EDIT3
    誕生曜日 IDC_EDIT4
    生存日数 IDC_EDIT5
    計算 IDOK
    終了 IDCANCEL
  3. Dlgyoubi.cpp をフォルダーに格納してプロジェクトに追加します。
    [デバッグ]を選択してビルドに続いて実行を行います。
    規定値の表示を確認して OK ボタンをクリックするとページ先頭の画面が表示されます。
    当然ながら生存日数はプログラムを実行した日時により変わります。
    生年月日にあなたの誕生日を設定して OK ボタンをクリックして下さい。

プログラムの説明

  1. WTBL[][4] は曜日のテーブルです。
    MTBL[12] は大の月と小の月のテーブルで、累積した日数を格納しています。
    st は今日(実行した日付)を求める領域です。
    yy,mm,dd は EditControl から入力した値を格納します。
    today には西暦1年1月1日から本日までの経過日数を格納します。
    count には西暦1年1月1日から生年月日までの経過日数を格納します。
        char    WTBL[][4]= { "日","月","火","水","木","金","土" };
        int     MTBL[12]=  { 0,31,59,90,120,151,181,212,243,273,304,334 };
        int     yy,mm,dd,yobi,today,count;
        SYSTEMTIME  st;
        
  2. 西暦1年1月1日からの通算日数を調べる関数です。
    uruu(yy) はうるう年の判定です。
        long  days(int yy, int mm, int dd)
        {   long    w;
            w=  (yy-1)*365L;            //年*365
            w+= (yy/4L - yy/100L + yy/400L + MTBL[mm-1] + dd);
            if (mm<3 && uruu(yy))  w--;
            return(w);
        }
        
  3. 閏(うるう)年を調べる関数です。
    うるう年の説明は カレンダの話 を参照して下さい。
        int   uruu(int year)
        {   if (year%400L==0L)  return(1);
            if (year%100L==0L)  return(0);
            if (year%4L==0L)    return(1);
            return(0);
        }
        
  4. WM_INITDIALOG: には DialogBox の初期化のときに制御が渡されます。
    今日の日付を取得して DialogBox のタイトルバーに表示します。
    生存日数を計算するために today を設定します。
    EditControl に規定値を設定します。
            case WM_INITDIALOG:
                GetLocalTime(&st);
                wsprintf(str,"%d年%d月%d日 %s曜日",st.wYear,st.wMonth,st.wDay,WTBL[st.wDayOfWeek]);
                SetWindowText(hDlg,str);
                today= days(st.wYear,st.wMonth,st.wDay);
                SetDlgItemText(hDlg,IDC_EDIT1,"1999");
                SetDlgItemText(hDlg,IDC_EDIT2,"1");
                SetDlgItemText(hDlg,IDC_EDIT3,"1");
                break;
        
  5. 計算ボタンがクリックされたとき、誕生曜日と生存日数を求めて表示します。
    EditControl の操作は EditControl を使ったデータ入力と表示 を参照して下さい。
        switch(LOWORD(wParam))
        {   case IDOK:
                GetDlgItemText(hDlg,IDC_EDIT1,str,sizeof(str));
                yy= atoi(str);
                GetDlgItemText(hDlg,IDC_EDIT2,str,sizeof(str));
                mm= atoi(str);
                GetDlgItemText(hDlg,IDC_EDIT3,str,sizeof(str));
                dd= atoi(str);
                count= days(yy,mm,dd);
                yobi= count%7L;
                wsprintf(str,"%d",today-count+1);
                SetDlgItemText(hDlg,IDC_EDIT4,WTBL[yobi]);
                SetDlgItemText(hDlg,IDC_EDIT5,str);
                break;
        
  6. Windows 10 でも W32 Calender で記念日をタイプして曜日と経過日数を計算します。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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