Nano Hash - криптовалюты, майнинг, программирование

И & Или операторы в операторах if

Я сделал программу даты рождения, которая отображает ваш DoB, она также будет учитывать високосные годы, поэтому, если вы введете год как 1995, месяц 2, день 29, она будет выполнена с ошибкой, потому что это не был високосный год. Также учитывается, сколько дней в каждом месяце, и это та часть, с которой мне нужна помощь. В настоящее время это так:

           if (month == 1 / && day > 31)
            {
                Console.WriteLine("January only has 31 days - Enter again");
                validDay = false;
            }
            else if (day >= 29 && !IsLeapYear(year) && month == 2)
            {
                Console.WriteLine("You were not born on a leap year or February only has 28 days - Enter again");
                validDay = false;
            }
           //And so on for each month

Итак, я попробовал это так:

if (month == 1 || month == 3 || month == 5 || month == 7 || 
                month == 8 || month == 10 || month == 12 && day > 31)
            {
                Console.WriteLine("Your birth month only has 31 days - Enter again");
                validDay = false;
            }
            else if (day >= 29 && !IsLeapYear(year) && month == 2)
            {
                Console.WriteLine("You were not born on a leap year or February only has 28 days - Enter again");
                validDay = false;
            }
            else if (month == 3 || month == 6 || month == 9 || month == 11 && day > 30)
            {
                Console.WriteLine("Your birth month only has 30 days - Enter again");
                validDay = false;
            }

И по какой-то причине он всегда будет выдавать сообщение об ошибке, даже если вы введете 1997, 5, 28. Месяц выбран в 5, но день не> 31, так почему он это делает? Я также открыт для разных способов сделать это, потому что у меня есть ощущение, что есть другой способ - может быть, массивы?


  • Поскольку ваш AND применяется только к последнему OR. 22.11.2013
  • Спасибо, ребята, использование скобок решило проблему. Я также изменил его, чтобы использовать дату и время, но я подумал, что использование такого рода лишит программу создания удовольствия. Все равно вытащил две новые вещи из него, так что еще раз спасибо :) 22.11.2013
  • Правильно ли вы обрабатываете високосные годы века? Существует DateTime.DaysInMonth метод, который заставит этот уродливый блок кода исчезнуть (и устранит скрытые в нем ошибки). 22.11.2013
  • Это работает: This Works: public static bool IsLeapYear(int year) { if (year % 4 == 0 || year % 100 == 0 && year % 400 == 0) return true; else return false; } 22.11.2013

Ответы:


1

Попробуйте добавить пару скобок

if ((month == 1 || month == 3 || month == 5 || month == 7 || 
month == 8 || month == 10 || month == 12) && day > 31)

Без скобок последний && относится только к последнему месяцу.

Вы также можете использовать конструктор DateTime и посмотреть, выдает ли он исключение (http://msdn.microsoft.com/en-us/library/xcfzdy4x(v=vs.110).aspx) или используйте DateTime.TryParse.

22.11.2013

2

Я бы порекомендовал вам использовать DateTime.TryParse — он автоматически проверит все даты, тогда вы можете просто вернуть пользователю что-то вроде «Неверная дата».

22.11.2013

3

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

22.11.2013

4

Почему бы не использовать DateTime.TryParse.

Пожалуйста, ознакомьтесь также со следующими ссылками:

Дата проверки (високосный год или нет) перед вставкой в ​​базу данных

Проверить DateTime в C#

22.11.2013

5

Я бы рекомендовал использовать DateTime.TryParseExact следующим образом...

string year = "1997";
string month = "5";
string day = "28";
string dateText = string.Format("{0}/{1}/{3}", year, month, day);
DateTime date;

if (!DateTime.TryParseExact(dateText, "yyyy/MM/dd", null, DateTimeStyles.None, out date))
{
    Console.WriteLine("Date is invalid");
}

Удачи!

22.11.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..