Week Class

Week Class を使って、誕生日の曜日を求めます。

カレンダの話

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

Windows8

  1. Windows8(Metro Style)では、従来の C++ とは Object Class の様子が違うようです。
    Week Class を使って誕生日の曜日を計算してみましょう。
  2. ベースとなるプロジェクト Blank App(XAML) を構築して下さい。
    手順は Windows8 C++(Store App) を参照して下さい。
  3. プロジェクトのフォルダに WeekClass のソースファイルを格納します。
    WeekClass.h です。
    Constructor は internal: で宣言します。
    yy, mm, dd は、年月日の領域です。
    Today は、西暦1年1月1日から今日までの通算日数です。
    cnt は、誕生日から今日までの生きてきた日数です。
    wek は、曜日テーブルの Index です。
    /* Week class  Header File    前田 稔 */
    using namespace Platform;
    
    namespace App1
    {
        ref class Week
        { private:
            int     yy,mm,dd;
            int     Today,cnt,wek;
    
          internal:
            Week();
    
          private:
            int  Days();
            bool  Uruu(int year);
    
          public:
            void Compute(String^ sy, String^ sm, String^ sd);
            String^ GetDate();
            String^ GetWeek();
        };
    }
    
  4. WeekClass.cpp です。
    "pch.h" を include しなければならないようです。
    WTBL は曜日のテーブルで、MTBL は各月の累積日数です。
    初期値を設定する領域は、ヘッダーファイルは使えないので、ここで定義しています。
    Constructor で西暦1年1月1日から今日までの通算日数を計算します。
    Compute で西暦1年1月1日から誕生日までの通算日数を計算します。
    文字列から int への変換には _wtoi(sy->Data()); を使っています。
    /* Week class  Program File    前田 稔 */
    #include "pch.h"
    #include "WeekClass.h"
    
    namespace App1
    { 
        static  Platform::Array^ WTBL =
        { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
        static  Platform::Array^ MTBL =
        { 0,31,59,90,120,151,181,212,243,273,304,334 };
    
        // 今日の日付を取得して、西暦1年1月1日からの日数を計算
        Week::Week()
        {    Windows::Globalization::Calendar^ cal =
                 ref new Windows::Globalization::Calendar();
             yy = cal->Year;
             mm = cal->Month;
             dd = cal->Day;
             Today= Days();
        }
        // 生年月日(str)から、曜日と通算日数を計算
        void  Week::Compute(String^ sy, String^ sm, String^ sd)
        {   yy= _wtoi(sy->Data());
            mm= _wtoi(sm->Data());
            dd= _wtoi(sd->Data());
            cnt= Days();
            wek= cnt%7;
            cnt= Today-cnt+1;
        }
        // 西暦1年1月1日からの通算日数を調べる関数
        int  Week::Days()
        {   int     w;
            w=  (yy-1)*365;         //年*365
            w+= (yy/4 - yy/100 + yy/400 + MTBL[mm-1] + dd);
            if (mm<3 && Uruu(yy))   w--;
            return(w);
        }
        // 閏年を調べる関数
        bool  Week::Uruu(int year)
        {   if (year%400L==0L)  return(true);
            if (year%100L==0L)  return(false);
            if (year%4L==0L)    return(true);
            return(false);
        }
        // 生年月日の文字列
        String^  Week::GetDate()
        {   String^ msg;
            msg= yy.ToString();
            msg+= "/";
            msg+= mm.ToString();
            msg+= "/";
            msg+= dd.ToString();
            return msg;
        }
        // 曜日の文字列
        String^ Week::GetWeek()
        {   return WTBL[wek];  }
    }
    
  5. MainPage.xaml をダブルクリックして、レイアウトウインドウを表示します。
    ツールボックスから TextBox を貼り付けます。
    文字列の切り分けが面倒なので、年月日を分けてタイプ入力します。
    それと 曜日を計算するメソッドを呼び出す Button を貼り付けます。
    ボタンクリックの Event Handler("Button_Click") を設定して下さい。
    コントロール 名前 説明
    TextBox yy 西暦年の入力
    TextBox mm 月の入力
    TextBox dd 日の入力
    TextBox datebox 生年月日の確認表示
    TextBox weekbox 誕生日の曜日を表示
    Button Button_Click Event Handler
  6. データを取得して曜日を計算するメソッド(Button_Click)をコーディングします。
    Week Class の生成は gcnew では無く ref new Week() を使います。
    yy->Text, mm->Text, dd->Text は TextBox にタイプされた文字列を参照します。
    week->Compute() で曜日を計算して TextBox に表示します。
    void App1::MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
    {
        Week^   week;
        week = ref new Week();
        week->Compute(yy->Text,mm->Text,dd->Text);
        datebox->Text= week->GetDate();
        weekbox->Text= week->GetWeek();
    }
    
  7. 従来のプログラムを「超初心者のプログラム入門(C++)/誕生日の曜日」に掲載しています。
    年月日を「/」で切り分けられたら良いのですが、Windows8 の String^ では Split() メソッドや Parse() メソッドが使えないようです。
    同様のプログラムを「超初心者のプログラム入門(C#)/曜日と経過日数」にも掲載しています。

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