大復活C#学習_干支(十干十二支)の算出
西暦の年数から干支(十干十二支)を求めるプロジェクトを作ってみた。
十干は西暦を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();
}
}
}
修正後のエラー処理画面(全角数字を入力した場合)