誕生日の曜日

生年月日= YYYY/MM/DD を入力(Enter のみで終了)
1991/7/10
1991年 7月 10日 (水曜日)  通算日数=7695
生年月日= YYYY/MM/DD を入力(Enter のみで終了)

誕生日の曜日と生まれてからの日数を計算します。

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

プログラムの説明

  1. Object Class を使ったアプリケーションのサンプルです。
    コンソールから生年月日をタイプ入力して、曜日と生まれてからの日数を表示します。
    この方法は Maneged Mode の String でしか使えないようです。
    /*★ 誕生日の曜日     前田 稔 ★*/
    using namespace System;
    
    ref class KOYOMI
    {   static  String^     WTBL = "日月火水木金土";
        static  array<int>^ MTBL = { 0,31,59,90,120,151,181,212,243,273,304,334 };
        int     yy,mm,dd;
        int     Today,cnt,wek;
    
      public:
        // Constructor
        KOYOMI()
        {  //西暦1年1月1日から今日までの日数を調べる
           yy= DateTime::Today.Year;
           mm= DateTime::Today.Month;
           dd= DateTime::Today.Day;
           Today= Days();
        }
        // 生年月日を入力して曜日と通算日数を計算
        bool GetDate()
        {   String^ str;
            array<String^>^ ymd;
            array<String^>^ sep= {"/", ","};
            Console::WriteLine("生年月日= YYYY/MM/DD を入力(Enter のみで終了)");
            str = Console::ReadLine();
            if (str==String::Empty)  return false;
            ymd= str->Split(sep, StringSplitOptions::None);
            yy= int::Parse(ymd[0]);
            mm= int::Parse(ymd[1]);
            dd= int::Parse(ymd[2]);
            cnt= Days();
            wek= cnt%7;
            cnt= Today-cnt+1;
            return true;
        }
        // 生年月日と曜日と通算日数を印字
        void Print()
        {   Console::WriteLine("{0}年 {1}月 {2}日 ({3}曜日)  通算日数={4}",
                yy, mm, dd, WTBL[wek], cnt);
        }
        // 西暦1年1月1日からの通算日数を調べる関数
        int  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  Uruu(int year)
        {   if (year%400L==0L)  return(true);
            if (year%100L==0L)  return(false);
            if (year%4L==0L)    return(true);
            return(false);
        }
    };
    
    static int main()
    {   KOYOMI^  koyomi = gcnew KOYOMI();
        while(true)
        {   if (koyomi->GetDate()==false)   break;
            koyomi->Print();
        }
        return 0;
    }
    
  2. WTBL は曜日の配列で、MTBL は月の通算日数です。
    配列に初期値を設定するときは static 宣言して下さい。
    Today は、西暦1年1月1日から今日までの通算日数です。
    誕生日の通算日数と Today の差が生まれてからの日数です。
        static  String^     WTBL = "日月火水木金土";
        static  array<int>^ MTBL = { 0,31,59,90,120,151,181,212,243,273,304,334 };
        int     yy,mm,dd;
        int     Today,cnt,wek;
        
  3. Constructor で今日の日付を取得して Today を計算します。
    Days() が西暦1年1月1日からの通算日数を計算する関数です。
    Uruu() が閏年を調べる関数です。
  4. GetDate() 関数で誕生日をタイプ入力して、曜日と日数を計算します。
    入力された年月日(文字列)は String^ str に格納されます。
    Enter のみがタイプされると終了です。
            String^ str;
            str = Console::ReadLine();
            if (str==String::Empty)  return false;
        
    年月日は「/」で区切られ、次の形式でタイプされます。
    1987/7/1
    String 型には、区切り文字で文字列を切り分ける Split メソッドが用意されています。
    これを使えば年,月,日の切り分けは簡単です。
    次の例では "/" または "," で区切られた年月日を切り分けて、yy, mm, dd に数値として格納します。
            String^ str;
            array<String^>^ ymd;
            array<String^>^ sep= {"/", ","};
              ・・・
            ymd= str->Split(sep, StringSplitOptions::None);
            yy= int::Parse(ymd[0]);
            mm= int::Parse(ymd[1]);
            dd= int::Parse(ymd[2]);
        
  5. Print() 関数で曜日と通算日数を印字します。
    カレンダの説明は カレンダの話 を参照して下さい。
    C#でも 曜日と経過日数 を作成しています。
    Split や Substring などは便利なメソッドですが、残念ながら Windows8 の String では使えないようです。
    Program Guid でストリング関係のページを抜粋しています。

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