Создание и использование конструкторов в C # вместе с логическими методами - PullRequest
0 голосов
/ 05 октября 2018

У меня возникли проблемы с конструкторами в присваивании C #.Первый блок кода ниже содержит некоторые инструкции для назначения.По сути, насколько я понимаю, я должен создать два конструктора, один для установки даты по умолчанию, а другой для проверки даты у пользователя.Кроме того, есть метод SetDate, который, кажется, делает то же самое.Они кажутся излишними, но в соответствии с инструкциями назначения, оба обязательны.Я ОЧЕНЬ новичок в объектно-ориентированном программировании, поэтому я не уверен, как «передать» материал конструктору или действительно использовать и вызывать его в методе main.Второй блок кода - это то, что я написал до сих пор.Все методы проверки даты выглядят хорошо.Но я понятия не имею, что делать с конструктором public Date(int M, int D, int Y) и методом SetDate.Что должен делать каждый из них?Кроме того, почему мне дают указание использовать целочисленные переменные M, D, Y, когда мне также говорят объявить месяц, день и год выше?Буду очень признателен за любые идеи, которые могут помочь мне понять, как использовать этот Конструктор и как он связан и отличается по функциям от метода SetDate.

 //Create a Date Class
 //This class holds:
private int Month;
private int Day;
private int Year;
    //Include the following constructors/methods. Include others/more if you 
    //need them.

    // Sets date to 1/1/1900
public Date()

    // Sets date to user’s input.
    // Checks to see the date is valid
    // If it isn’t valid, print message and set date to 1/1/1900
public Date(int M, int D, int Y)

     // Sets date to user’s input.
     // Checks to see the date is valid
     // If it isn’t valid, print message and set date to 1/1/1900
public Boolean SetDate(int M, int D, int Y)ere

// ******************************************************************************

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)
    {
        Month = M;
        Day = D;
        Year = Y;
    }

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

        int valDate = 0;

        Console.WriteLine("You will be prompted to enter three(3) numbers to represent a month, " +
            "day, and year. Only dates between 1/1/1900 and 12/31/2100 are valid.");

        Console.WriteLine("");

        while (valDate < 1)
        {
            Console.WriteLine("Enter the number for the month.");
            M = int.Parse(Console.ReadLine());
            Console.WriteLine("");

            Console.WriteLine("Enter the number for the day.");
            D = int.Parse(Console.ReadLine());
            Console.WriteLine("");

            Console.WriteLine("Enter the number for the year.");
            Y = int.Parse(Console.ReadLine());
            Console.WriteLine("");

            ValidateDate();

            if (ValidateDate())
            {
                DisplayDate();
                valDate++;
                return true;
            }
            else
            {

                Console.WriteLine("Please enter a valid date.");
                Console.WriteLine("");
                Month = 1;
                Day = 1;
                Year = 1900;
                return false;
            }


        }
        return false;
    }
        // Determines if date is valid.
    public Boolean ValidateDate()
    {
        ValidateMonth();
        ValidateDay();
        ValidateYear();

        if (ValidateMonth() && ValidateDay() && ValidateYear())
        {
            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);
        return (myStringBuilder.ToString());
    }

    static void Main(string[] args)
    {
        Date NewDate = new Date();
        NewDate.Date();

        Console.ReadLine();
    }
}

Ответы [ 2 ]

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

Похоже, вас попросили создать метод и конструктор, которые делают одно и то же.В этом случае проще всего сделать так, чтобы конструктор вызвал метод.

Единственный комментарий, который я хотел бы сделать по поводу вашего кода, заключается в том, что показанная вами постановка задачи не требует сбора входных данных в SetDate.метод.Принимая во внимание утверждение, кажется, что входные данные от пользователя будут собираться за пределами вашего класса.

Я не знаю, каковы ваши требования к сообщению об ошибке.Это может иметь смысл и в его собственном методе.

Вот пример:

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

    public Date()
    {
        SetDefaultDate();
    }

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

    public void SetDate(int M, int D, int Y)
    {
        if (IsValidDate(M, D, Y))
        {
            Month = M;
            Day = D;
            Year = Y;
        }
        else
        {
            SetDefaultDate();
        }
    }

    private bool IsValidDate(int M, int D, int Y)
    {
        // validation logic.. return true if all parameters result in valid date
        // false if they do not.  If it is an invalid date print the failure message.

        return true;
    }

    private void SetDefaultDate()
    {
        Month = 1;
        Day = 1;
        Year = 1900;
    }
}
0 голосов
/ 05 октября 2018

Если вы хотите сделать какое-то реальное приложение, использующее дату, то я бы посоветовал взглянуть на структуру DateTime в пространстве имен System.Она имеет функцию TryParse , которая будет возвращать вам истину или ложь независимо от того, был ли ввод верным или нет.

Однако кажется, что вы выполняете какое-то упражнение по программированию, поэтому в этом случае мой ответ будетbe: Не очень хорошо иметь аргументы в конструкторе, которые могут привести к недопустимому объекту - в вашем случае недопустимая дата.Это потому, что после вызова конструктора у вас будет объект тем или иным способом, за исключением случаев, когда вы вызываете исключение в конструкторе.Тем не менее, если вы все еще хотите, чтобы это было так, вам нужно иметь свойство или общедоступную переменную с именем «IsValid» в классе / структуре, которая сообщает, была ли указана правильная дата с помощью конструктора.Более хороший вариант - следовать подходу DateTime - иметь открытую статическую функцию, которая возвращает действительный объект Date.Как это:

public bool TryParse(int m, int d, int y, out Date date)
{
   // validate

   // if valid then return Date object like that:
   date = new Date()
   {
      Month = m,
      Day = d,
      Year = y
   };
   return true;

   // Or like that:
   date = new Date(m, d, y);
   return true;

   // if not valid then return null (because have to return something)
   date = null;
   return false;
}
...