星屑雑記

ただのパワプロ好きの雑記です

週数カウントプログラム ※言語はC#です

週数カウントプログラムを作成したので上げてみた💪
処理自体はややこしい上に少しばかり重いけど誰かの助けになれば嬉しいで~す👼
動きおかしかったらその時はごめんなさい🙇

ファイル名:WeekOfMonthCountClass.cs

using System;

namespace WeekOfMonthCount
{
    class WeekOfMonthCountClass
    {
        #region 変数

        string[,] array = new string[6, 7];         // カレンダー配列
        int i = 0;                                  // カレンダー配列.週数用変数
        int j = 0;                                  // カレンダー配列.曜日配列用変数
        string[] daysArray = new string[31];        // カレンダー用日付対応曜日配列
        DateTime date = new DateTime(2000, 01, 01); // 日付
        string yearOfDate = "年";                   // 日付で使用する年
        string monthOfDate = "月";                  // 日付で使用する月
        string dayOfDate = "日";                    // 日付で使用する日
        string day = "曜日";                        // 曜日
        int startOfDay = 1;                         // 週を求める変数

        #endregion

        // ==================================================================================================
        // 週数カウントメソッド
        // ==================================================================================================

        public int Count()
        {
            #region カウント対象日付作成

            // ==================================================================================================
            // カウント対象日付作成
            // ==================================================================================================

            Console.WriteLine("\n" + "カウント対象月の週数をカウントします。");
            
            Console.WriteLine("\n" + "カウント対象年を入力してください。");
            yearOfDate = Console.ReadLine();

            Console.WriteLine("\n" + "カウント対象月を入力してください。");
            monthOfDate = Console.ReadLine();

            Console.WriteLine("\n" + "カウント対象日を入力してください。");
            dayOfDate = Console.ReadLine();

            // カウント対象日付作成
            date = DateTime.Parse(yearOfDate + "/" + monthOfDate + "/" + dayOfDate);

            // カウント対象日付の最終日
            var lastDayOfMonth = new DateTime(date.Year,date.Month,DateTime.DaysInMonth(date.Year, date.Month)).Day;

            #endregion

            #region カレンダー配列作成

            // ==================================================================================================
            // カレンダー配列作成
            // ==================================================================================================

            for (int i = 1; i <= int.Parse(lastDayOfMonth.ToString()); i++)
            {
                // 曜日判定用日付
                var arraySetDate = new DateTime(date.Year, date.Month,
                                                DateTime.Parse(yearOfDate + "/" + monthOfDate + "/" + i.ToString()).Day);

                // 曜日
                day = arraySetDate.ToString("ddd");
                daysArray[i - 1] = day;
            }

            #region 曜日配列いづれかの値が空の場合

            // 月末が28日の場合
            if (daysArray[28] == null)
            {
                // 仮の値を設定
                daysArray[28] = "日付無";
                daysArray[29] = "日付無";
                daysArray[30] = "日付無";
            }

            // 月末が29日の場合
            if (daysArray[29] == null)
            {
                // 仮の値を設定
                daysArray[29] = "日付無";
                daysArray[30] = "日付無";
            }

            // 月末が30日の場合
            if (daysArray[30] == null)
            {
                // 仮の値を設定
                daysArray[30] = "日付無";
            }

            #endregion

            foreach (var dayOfMonthArray in daysArray)
            {
                switch (startOfDay)
                {
                    case 1:
                        i = 0;
                        break;

                    case 2:
                        i = 1;
                        break;

                    case 3:
                        i = 2;
                        break;

                    case 4:
                        i = 3;
                        break;

                    case 5:
                        i = 4;
                        break;

                    case 6:
                        i = 5;
                        break;

                    default:
                        break;
                }

                switch (dayOfMonthArray)
                {
                    case "月":
                        j = 0;
                        break;

                    case "火":
                        j = 1;
                        break;

                    case "水":
                        j = 2;
                        break;

                    case "木":
                        j = 3;
                        break;

                    case "金":
                        j = 4;
                        break;

                    case "土":
                        j = 5;
                        break;

                    case "日":
                        j = 6;
                        break;

                    default:
                        break;
                }

                array[i, j] = dayOfMonthArray;

                // 日曜日の場合
                if (j == 6)
                {
                    startOfDay += 1;
                }
            }

            #endregion

            #region 週数判定

            // ==================================================================================================
            // 週数判定
            // ==================================================================================================

            // 6週目判定
            for (int i = 0; i < 7; i++)
            {
                // 6週目に値が有る場合
                if (!string.IsNullOrEmpty(array[5, i]))
                {
                    // 週数は6
                    return 6;
                }
            }

            // 5週目判定
            for (int i = 0; i < 7; i++)
            {
                // 5週目に値が有る場合
                if (!string.IsNullOrEmpty(array[4, i]))
                {
                    // 週数は5
                    return 5;
                }
            }

            // 週数は4
            return 4;

            #endregion
        }
    }
}