Получение пустой строки в воскресенье (C#) - PullRequest
1 голос
/ 12 февраля 2020
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("\n" + month[i]);
                        day = DisplayCalender(days[i], day);
                        Console.Write("\n");

                    }
                    break; 
            }
        }


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

            Console.WriteLine("Sun\tMon\tTue\tWed\tThu\tFri\tSat");
            for (int i = 0; i < start; i++)
                Console.Write("\t");
            for (int i = 1; i <= days; i++)
            {
                if (startDay > 6)
                {
                    startDay = 0;
                    Console.WriteLine();
                }
                Console.Write(i + "\t");
                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 ]

1 голос
/ 12 февраля 2020

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

February 2020

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

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

public static int DisplayCalender(int days, int start) //Display Function//
{
    int startDay = start == 7 ? 0 : start;
    Console.WriteLine("Sun\tMon\tTue\tWed\tThu\tFri\tSat");
    for (int i = 0; i < startDay; i++)
        Console.Write("\t");

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

    return startDay;
}

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

enter image description here

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

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

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

0 голосов
/ 12 февраля 2020

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

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

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

    Console.WriteLine("Sun\tMon\tTue\tWed\tThu\tFri\tSat");
    for (int i = 0; i < start; i++)
        Console.Write("\t");

Сделайте это:

    Console.WriteLine("Sun\tMon\tTue\tWed\tThu\tFri\tSat");
    if (start < 7)
    {
        for (int i = 0; i < start; i++)
        {
            Console.Write("\t");
        }
    }

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

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\tMon\tTue\tWed\tThu\tFri\tSat");
    if (start < 7)
    {
        for (int i = 0; i < start; i++)
        {
            Console.Write("\t");
        }
    }
    for (int i = 1; i <= days; i++)
    {
        if (startDay > 6)
        {
            startDay = 0;
            if (i != 1 )
            {
                Console.WriteLine();
            }
        }
        Console.Write(i + "\t");
        startDay++;
    }

    return startDay;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...