C # Преобразование значений, переданных в качестве аргументов в переменные - PullRequest
0 голосов
/ 06 октября 2018

У меня проблемы с пониманием связи между переменными и аргументами, передаваемыми методу.Предполагается, что приведенная ниже программа берет три целых числа из основного метода (M, D, Y) и использует различные методы для проверки правильности даты.Это включает в себя гарантию того, что год находится между 1900 и 2100, а также гарантию того, что месяц - 1-12, и день находится в диапазоне дней этого месяца (включая 29 февраля в високосные годы).Если дата из основного метода недействительна, программа должна сказать об этом и распечатать дату по умолчанию 01.01.1900.Код ниже всегда печатает значение по умолчанию независимо от того, какие аргументы предоставлены.Я полагаю, что это потому, что есть проблема с тем, как я использую переменные M, D, Y или переменные Month, Day, Year.Эта программа для задания, в котором я должен использовать все методы и конструкторы в коде ниже.Я не уверен, как аргументы M, D, Y могут быть превращены в переменные Month, Day и Year, чтобы они могли быть напечатаны методом ShowDate, который былпредусмотрено для меня.

class Date
{
    private int Month;
    private int Day;
    private int Year;

    // Sets date to 1/1/1900
    public Date()
    {
        Month = 1;
        Day = 1;
        Year = 1900;
    }

    public Date(int M, int D, int Y)
    {
        SetDate(M, D, Y);
    }

    public Boolean SetDate(int M, int D, int Y)
    {

        if (ValidateDate(M, D, Y))
        {
            Month = M;
            Day = D;
            Year = Y;
            return true;

        }
        else
        {
            Console.WriteLine("Invalide date");
            SetDefaultDate();
            return false;
        }

    }

    private void SetDefaultDate()
    {
        Month = 1;
        Day = 1;
        Year = 1900;
    }
    // Determines if date is valid.
    public Boolean ValidateDate(int M, int D, int Y)
    {
        ValidateMonth();
        ValidateDay();
        ValidateYear();

        if (ValidateMonth() && ValidateDay() && ValidateYear())
        {
            ShowDate();
            return true;
        }
        else
        {
            return false;
        }


    }
        // Determines if month is valid.
    public Boolean ValidateMonth()
    {
        if (Month >= 1 && Month <= 12)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
        // Determines if year is valid.
    public Boolean ValidateYear()
    {
        if(Year >= 1900 && Year <= 2100)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
        // Determines if day is valid
    public Boolean ValidateDay()
    {
        IsLeapYear();

        if(Month == 1 || Month == 3 || Month == 5 || Month == 7 || Month == 8 || Month == 10 || Month == 12)
        {
            if (Day >= 1 && Day <= 31)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else if (Month == 4 || Month == 6 || Month == 9 || Month == 11)
        {
            if (Day >= 1 && Day <= 30)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else if (Month == 2 && IsLeapYear())
        {
            if (Day >= 1 && Day <= 29)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else if (Month == 2 && !IsLeapYear())
        {
            if (Day >= 1 && Day <= 28)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }

    // Determine if year is a leap year
    public Boolean IsLeapYear()
    {
        if ((Year % 4 == 0 && Year % 100 != 0) || (Year % 400 == 0))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

        // Print date to screen in format M/D/Y
    public void DisplayDate()
    {
        Console.WriteLine(ShowDate());
    }

    public String ShowDate()
    {
        StringBuilder myStringBuilder = new StringBuilder();
        myStringBuilder.AppendFormat("{0} / {1} / {2}", Month, Day, Year);
        Console.WriteLine("{0}", myStringBuilder);
        return (myStringBuilder.ToString());

    }

    static void Main(string[] args)
    {

        Date NewDate = new Date();
        NewDate.SetDate(11,11,2011);

        Console.ReadLine();
    }

}

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Ваш конструктор должен инициализировать класс указанными значениями.В настоящее время ваш конструктор по умолчанию инициализирует M, D и Y, но конструктор, принимающий аргументы, этого не делает.

Вы можете решить эту проблему, изменив конструкторы так:

public Date() : this(1,1,1900)
{
}

public Date(int M, int D, int Y)
{
    Month = M;
    Day = D;
    Year = Y;
}

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

public bool IsValid
{
    get
    {
        return ValidateDay() && ValidateMonth() && ValidateYear();
    }
}

А в вашей основной программе:

Date newDate = new Date(11,11,2011);
if (newDate.IsValid)
{
    Console.WriteLine("Date is valid.");
}
else
{
    Console.WriteLine("Date is not valid.");
}
0 голосов
/ 06 октября 2018

Вы никогда не присваиваете M, D или Y своим полям Month, Day и Year, поэтому вы проверяете значения по умолчанию, которые по умолчанию будут равны нулю.Вы можете назначить M, D и Y их соответствующим предполагаемым переменным, но тогда вы не станете проверять ввод, просто проверяя свои поля.Вместо этого вы можете сделать так, чтобы ваши методы принимали параметры и проверяли, что вы передаете ему:

public Boolean ValidateMonth(int month)
{
    if (month >= 1 && month <= 12)
    {
        return true;
    }
    else
    {
        return false;
    }
}

И затем, когда вы вызываете его

 ValidateMonth(M);

И затем вы можете сделать то же самое длядва других метода.

Также в вашем методе ValidateDate() есть три бесполезных вызова ValidateMonth(), ValidateDay() и ValidateYear().Вы вызываете каждый из этих методов дважды.(Один раз в начале, а затем снова в операторе if.) Вы можете удалить их:

 public Boolean ValidateDate(int M, int D, int Y)
{
    //Remove these:
    //ValidateMonth();
    //ValidateDay();
    //ValidateYear();

    if (ValidateMonth() && ValidateDay() && ValidateYear())
    {
        ShowDate();
        return true;
    }
    else
    {
        return false;
    }


}
...