曜日と経過日数

C#の Console.ReadLine で年月日を入力して、曜日と経過日数を表示します。
何曜日に生まれたの(スマホ対応)

カレンダの話

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

プロジェクトの設定

  1. C#の Console.ReadLine から年月日を入力して、曜日と経過日数を表示します。
  2. このプログラムは、次のメソッドから成り立っています。
    1. コンソールから年月日を入力して、数値に変換するメソッドです。
      タイプ入力された年,月,日を数値に変換して yy, mm, dd に格納します。
      コンソール入力する形式は、西暦年で次のようにタイプします。
      1987/7/1
    2. 西暦1年1月1日から yy, mm, dd までの通算日数を調べるメソッドです。
      カレンダの話で説明したようにグレゴリオ暦に西暦1年などは存在しませんが、便宜上あるものとして計算します。
    3. 閏年を調べるメソッドです。
      c# には専用のメソッドが用意されているようですが、簡単なので自作してみました。
    4. 最後はこれらのメソッドを利用して、曜日と経過日数を表示する Main() メソッドです。
  3. それぞれのメソッドから共通にアクセスする共有領域を定義します。
    1. string WTBL は曜日のテーブルです。
      C# では半角文字も全角文字も一文字として扱われます。
      配列にしないで string で定義していますが、配列と同じように添え字で参照することが出来ます。
      static string WTBL= "日月火水木金土";
      char 配列で定義する場合は次のようになります。
      static char[] WTBL= { '日','月','火','水','木','金','土' };
    2. MTBL[12] は大の月と小の月のテーブルで、累積した日数を格納します。
      static int[] MTBL= { 0,31,59,90,120,151,181,212,243,273,304,334 };
    3. 年,月,日の領域です。
      static int yy, mm, dd;
  4. 私が作成したプログラムの実行結果です。
    最後の経過日数はプログラムを実行した日によって異なります。
    このプログラムは何年何月何日に実行したでしょう? (^_^;
      1999/1/1  金  3086
      1945/1/10 水  22800
      1991/1/15 火  5994
    

【ヒント】

  1. コンソールから年月日を入力するメソッドです。
    入力された年月日(文字列)は string 型に格納されます。
    1987/7/1
    string 型には、区切り文字で string を切り分ける Split メソッドが用意されています。
    これを使えば年,月,日の切り分けは簡単です。
        string str;
        string[] ymd;
        Console.WriteLine("年月日= YYYY/MM/DD");
        str = Console.ReadLine();
        ymd= str.Split(new char[] {'/'});
        yy= int.Parse(ymd[0]);
        mm= int.Parse(ymd[1]);
        dd= int.Parse(ymd[2]);
        
  2. 西暦1年1月1日から yy, mm, dd までの通算日数を調べるメソッドです。
        w=  (yy-1)*365;         //年*365
        w+= (yy/4 - yy/100 + yy/400 + MTBL[mm-1] + dd);
        if (mm<3 && uruu(yy))  w--;
        return(w);
        
  3. 閏年を調べるメソッドは「カレンダの話」を参考に作成して下さい。
    c# には専用のメソッドが用意されているようなので、これを使っても構いません。
  4. Main() メソッドでは、最初に今日の日付を設定して西暦1年1月1日から通算日数を調べます。
    次に年月日を入力して、通算日数を調べます。
    その差が事件発生日から本日までの経過日数です。
    曜日は、年月日の通算日数を7で割った剰余を添え字にして WTBL で求めます。
  5. あまり詳しく説明すると考える所が無くなるので、これぐらいに留めます。
    ちょっとサービス過剰でしょうか? (^_^;)
  6. このプログラムを簡単に作成する DLL を提供します。
    詳細は こよみ DLL を参照して下さい。
    C/C++ でも 誕生日の曜日 を作成しています。
  7. 記念日抜粋
    日付 経過日数 曜日 説明
    1/1/1 738202 西暦元年元旦
    1995/1/17 9893 阪神淡路大震災
    1997/8/31 8936 ダイアナ妃交通事故死
    2001/9/11 7464 アメリカ航空機テロ
    2011/3/11 3996 東日本大震災
    1945/1/10
    1951/9/11
    1983/2/27
    1989/1/15

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

何曜日に生まれたの
C#のソースコードです。
/*★ 西暦1年1月1日からの通算日数を計算     前田 稔 ★*/
using System;

class Text
{
    static int[]    MTBL= { 0,31,59,90,120,151,181,212,243,273,304,334 };
    static string[] WTBL= { "日","月","火","水","木","金","土" };
    static int      yy,mm,dd;

    //★ Main()
    public static void Main()
    {   int     today,count,week;

        //西暦1年1月1日から今日までの日数を調べる
        yy= DateTime.Today.Year;
        mm= DateTime.Today.Month;
        dd= DateTime.Today.Day;
        today= days();
        GetDate();
        count= days();
        week= count%7;
        count= today-count+1;
        Console.WriteLine("{0}年 {1}月 {2}日 ({3}曜日)  通算日数={4}",
                yy, mm, dd, WTBL[week], count);
        Console.ReadLine();
    }
    //★ 生年月日を入力して yy,mm,dd に設定
    static void GetDate()
    {
        string str;
        string[] ymd;
        Console.WriteLine("生年月日= YYYY/MM/DD");
        str = Console.ReadLine();
        ymd= str.Split(new char[] {'/'});
        yy= int.Parse(ymd[0]);
        mm= int.Parse(ymd[1]);
        dd= int.Parse(ymd[2]);
    }
    //★ 西暦1年1月1日からの通算日数を調べる関数
    static 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);
    }
    //★ 閏年を調べる関数
    static bool  uruu(int year)
    {   if (year%400L==0L)  return(true);
        if (year%100L==0L)  return(false);
        if (year%4L==0L)    return(true);
        return(false);
    }
}