大復活C#学習_干支(十干十二支)の算出

f:id:yasui_swift:20210216113830j:plain

二重の虹の架け橋

f:id:yasui_swift:20210216113528p:plain


西暦の年数から干支(十干十二支)を求めるプロジェクトを作ってみた。

十干は西暦を10で割った余り、十二支は西暦の年に8を足して12で割った余りから算出した(追記20210220:誤りがあったので修正した)。

干支とよく似た年号の数え方に民間信仰の「九星気学」という占術がある。

計算した1950年は「五黄の寅」と呼ばれるが、五黄とは五黄土星の意味で、これは九星気学によって年の周期を9年ごとに、一白水星(いっぱくすいせい)、二黒土星(じこくどせい)、三碧木星(さんぺきもくせい)、四緑木星(しりょくもくせい)、五黄土星(ごおうどせい)、六白金星(ろっぱくきんせい)、七赤金星(しちせききんせい)、八白土星(はっぱくどせい)、九紫火星(きゅうしかせい当てはめるもの。

「五黄の寅」(「ごおうのとら」、一般にはこれが訛って「ごうのとら」)は九星と十二支を組み合わせたもので、36年周期で巡ってくる「強運の運勢」をいう。

追記:ここで試してみると数字を全角文字で入力するとエラーになる。C#には全角を半角に変換するライブラリは用意されていないようだ。簡単に変換するにはMicrosoft.VisualBasicを参照してString.StrConvメソッドを使うとよいらしい

判定だけであれば、以下で処理できた。

if (System.Text.RegularExpressions.Regex.IsMatch(etoYear, "^[0-9]+$") == false)

 追記の追記の追記:干支の支の計算に誤りがあったので修正した。正しくは西暦年に8を足して12で割った値を配列[0]から数える。

追記の追記:修正してみた(未修正版は削除した)。2019版Visulal StudioではすでにクラスメソッドでMicrosoft.VisualBasic参照できるようになっているようだ。試しに最初にusing  Microsoft.VisualBasic;を記載してもエラーにはならなかった。最終版をつくるときにはwhile(true),try,catchを入れてエラー処置で全角を半角に変換するつもり(未実施)。

*******************

(修正版)

using System;
//using Microsoft.VisualBasic; //全角を半角の変換するときに使う予定

namespace eraEto_sample1
{
class Program
{
static void Main( )
{
Console.WriteLine("干支の計算");
/*
* 干支(子丑寅の順の場合)
 西暦年に8を足し12で割った余りが配列の順番(0から)
 子(ね)・丑(うし)・寅(とら)・卯(う)・辰(たつ)
 巳(み)・午(うま)・未(ひつじ)・申(さる)・酉(とり)
 戌(いぬ)・亥(い)」の12種類
*/

 string eraEtoSi = new string[12] {
   "子(ね)",
   "丑(うし)",
   "寅(とら)",
   "卯(う)",
   "辰(たつ)",
   "巳(み)",
   "午(うま)",
   "未(ひつじ)",
   "申(さる)",
   "酉(とり)",
   "戌(いぬ)",
   "亥(い)"
   };

/*
*十干(じっかん)の求め方:西暦の末尾の値(10で割った余り)
     0 1 2 3 4 5 6 7 8 9
     庚 辛 壬 癸 甲 乙 丙 丁 戊 己
*/
      
string eraEtoJikkan = new string[10]{
               "庚(かのえ)",
    "辛(かのと)",
    "壬(みずのえ)",
    "癸(みすのと)",
       "甲(きのえ)",
    "乙(きのと)",
    "丙(ひのえ)",
    "丁(ひのと)",
    "戊(つちのえ)",
    "己(つちのと)"
               };   

Console.WriteLine("================== 干支 ====================");
Console.WriteLine();
Console.Write(" 西暦の入力(半角数字)⇒ ");

string etoYear = Console.ReadLine();

//修正版で以下を追加。全角数字の入力で終了

if (System.Text.RegularExpressions.Regex.IsMatch(etoYear, "^[0-9]+$") == false)
{
Console.WriteLine(" エラー:半角数字を入力して再試行してください!");
Console.ReadKey();
return;
}


int year = int.Parse(etoYear);

int i = year % 10;
int j =(year +8) % 12 ;

string etoJikkan = eraEtoJikkan[i];
string etoSi = eraEtoSi[j];

Console.WriteLine(" 干支は " + etoJikkan + etoSi);
Console.ReadKey();

}
}
}

修正後のエラー処理画面(全角数字を入力した場合)

f:id:yasui_swift:20210217043818p:plain

修正後のエラー時画面

f:id:yasui_swift:20210217043911j:plain

花開く