Получение пустой строки в воскресенье (C #)

using System;
using System.Text.RegularExpressions;

namespace calendar
{
    class Program
    {
        static void Main()
        {
            int year;
            int day;
            string[] month = new string[] { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
            int[] days = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

            Console.Write("Enter the year for which you wish to generate the calendar >> ");
            int.TryParse(Console.ReadLine(), out year); // Validate //

            Console.Write("Enter the day of the week that January first is on >> ");
            int.TryParse(Console.ReadLine(), out day); // Validate //
            while (day > 31 || day < 1) // Reprompt for value if date is out of range //
            {
                Console.WriteLine("Enter a valid date >> ");
                Console.Write("Enter the day of the week that January first is on >> ");
                int.TryParse(Console.ReadLine(), out day); // Validate //

            }

            switch (LeapYear(year)) // Switch statement checks if Leap Year is true //
            {
                case true:
                    days[1] += 1;
                    Console.WriteLine("Calendar for year - {0}", year);
                    for (int i = 0; i < month.Length; i++)   
                    {
                        Console.WriteLine("
" + month[i]);
                        day = DisplayCalender(days[i], day);
                        Console.Write("
");

                    }
                    break; 
            }
        }


            public static int DisplayCalender(int days, int start) //Display Function//
        {
            int startDay = start;

            Console.WriteLine("Sun	Mon	Tue	Wed	Thu	Fri	Sat");
            for (int i = 0; i < start; i++)
                Console.Write("	");
            for (int i = 1; i <= days; i++)
            {
                if (startDay > 6)
                {
                    startDay = 0;
                    Console.WriteLine();
                }
                Console.Write(i + "	");
                startDay++;
            }

            return startDay;

        }
        public static Boolean LeapYear(int year)
        {
            if ((year % 400 == 0) || ((year % 4 == 0) && !(year % 100 == 0))) // Checks each OR AND statements and return true or false //
            {
                return true;
            }
            else
                return false;
            }

        }
    }

Всего 2 ответа


Я представляю себе проблему, которую вы описываете, потому что в месяце, который начинается в воскресенье, календарь пропускает всю строку. Понравилось изображение:

Февраль 2020

Это происходит потому, что ваш метод public static int DisplayCalender(int days, int start) получает параметр int start со значением 7 . Это заставляет писать вкладки на всю неделю для вашего первого for а затем пропустить строку для второго for .

Чтобы решить эту проблему, вы можете просто переназначить startDay с нуля, когда он равен 7 и проверить цикл вкладок для startDay вместо start :

public static int DisplayCalender(int days, int start) //Display Function//
{
    int startDay = start == 7 ? 0 : start;
    Console.WriteLine("Sun	Mon	Tue	Wed	Thu	Fri	Sat");
    for (int i = 0; i < startDay; i++)
        Console.Write("	");

    for (int i = 1; i <= days; i++)
    {
        if (startDay > 6)
        {
            startDay = 0;
            Console.WriteLine();
        }
        Console.Write(i + "	");
        startDay++;
    }

    return startDay;
}

Это даст вам ожидаемый результат:

введите описание изображения здесь

Что вы можете улучшить здесь?

Создание всего этого с нуля, вероятно, заставило вас многое узнать о цикле и потоке. Если у вас есть время, проверьте DateTime . Там у вас есть методы, чтобы найти високосные годы, день недели и месяц. Это поможет вам значительно упростить ваш код.

Добро пожаловать в StackOverflow!


Во-первых, я должен сказать, что вы слишком сильно усложняете, из коробки есть отличная библиотека дат, которую вы могли бы использовать. Например:

DateTime now = DateTime.Now;
bool isLeapYear = DateTime.IsLeapYear(now.Year);
int daysInCurrentMonth = DateTime.DaysInMonth(now.Year, now.Month);

Вместо этого:

    Console.WriteLine("Sun	Mon	Tue	Wed	Thu	Fri	Sat");
    for (int i = 0; i < start; i++)
        Console.Write("	");

Сделай это:

    Console.WriteLine("Sun	Mon	Tue	Wed	Thu	Fri	Sat");
    if (start < 7)
    {
        for (int i = 0; i < start; i++)
        {
            Console.Write("	");
        }
    }

И вместо этого:

if (startDay > 6)
{
  startDay = 0;
  Console.WriteLine();
}

сделай это:

        if (startDay > 6)
        {
            startDay = 0;
            if (i!=1)
            {
                Console.WriteLine();
            }                    
        }

Поэтому метод DisplayCalender должен выглядеть так:

public static int DisplayCalender(int days, int start) //Display Function//
{
    int startDay = start;

    Console.WriteLine("Sun	Mon	Tue	Wed	Thu	Fri	Sat");
    if (start < 7)
    {
        for (int i = 0; i < start; i++)
        {
            Console.Write("	");
        }
    }
    for (int i = 1; i <= days; i++)
    {
        if (startDay > 6)
        {
            startDay = 0;
            if (i != 1 )
            {
                Console.WriteLine();
            }
        }
        Console.Write(i + "	");
        startDay++;
    }

    return startDay;
}

Есть идеи?

10000