Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Vlad12
0 / 0 / 3
Регистрация: 08.02.2015
Сообщений: 25
#1

Проверить корректность заданной даты - C++

08.02.2015, 22:21. Просмотров 1008. Ответов 9
Метки нет (Все метки)

задана дата в пределах годах (число - от 1 до 31, месяц -от 1 до 12). Проверить корректность введенных данных и в случае ошибки вывести соответствующее сообщение

Добавлено через 45 секунд
Помогите пожалуйста, буду очень благодарен
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2015, 22:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проверить корректность заданной даты (C++):

Проверить корректность числа в заданной системе счисления и перевести в другую систему счисления
На вычислительной практике дали такое задание: С клавиатуры вводятся 2...

Функция проверки даты на корректность
Проверить дату на корректность. Помогите, где ошибка? bool isrightdata(int...

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

Проверить корректность ввода
Постройте функции для запроса и чтения ФИО, почтового адреса и даты, и...

Проверить код на корректность
Сделал лабу, все работает отлично.... Но я не уверен что она написана...

Проверить корректность расположения скобок
Код #include <iostream> #include <stack> #include <fstream> using namespace...

9
nmcf
6245 / 5557 / 2527
Регистрация: 14.04.2014
Сообщений: 23,361
09.02.2015, 10:41 #2
Где программа? Как вводишь эти данные?
0
Khelleos
38 / 38 / 25
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
09.02.2015, 11:34 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
bool IsRange(int value, int min, int max)
{
    if (value < min) return false;
    if (value > max) return false;
    return true;
}
 
bool CheckDate(int day, int month, int year)
{
    if (year < 0)
        return false;
 
    switch(month)
    {
        case 1:  //JANUARY
        case 3:  //MARCH
        case 5:  //MAY
        case 7:  //JULY
        case 8:  //AUGUST
        case 10: //OCTOBER
        case 12: //DECEMBER
            return IsRange(day, 1, 31);
        case 2:
            if (year % 4 == 0)
                return IsRange(day, 1, 29);
            else
                return IsRange(day, 1, 28);
        case 4:  //APRIL
        case 6:  //JUNE
        case 9:  //SEPTEMBER
        case 11: //NOVEMBER
            return IsRange(day, 1, 30);
        default:
            return false;
    }
}
1
Байт
Эксперт C
17771 / 11796 / 2450
Регистрация: 24.12.2010
Сообщений: 23,718
09.02.2015, 11:46 #4
Цитата Сообщение от Khelleos Посмотреть сообщение
if (year % 4 == 0)
* *return IsRange(day, 1, 29);
else
* *return IsRange(day, 1, 28);
Это не совсем так. Високосный год определяется похитрее
год является високосным в двух случаях: либо он кратен 4, но при этом не кратен 100, либо кратен 400. Год не является високосным, если он не кратен 4, либо он кратен 100, но при этом не кратен 400.
https://ru.wikipedia.org/wiki/%D0%92...B3%D0%BE%D0%B4
1
Khelleos
38 / 38 / 25
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
09.02.2015, 11:55 #5
Спасибо, не знал.
Тогда условие должно быть следующим
C++
1
2
3
4
5
case 2:
if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
    return IsRange(day, 1, 29);
else
    return IsRange(day, 1, 28);
1
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16744 / 6635 / 860
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
09.02.2015, 12:00 #6
Как вариант, можно без switch сделать. Например, с помощью find
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <algorithm>
 
bool IsRange(std::size_t value, std::size_t min, std::size_t max)
{
    return value >= min && value <= max;
}
 
bool isLeapYear(std::size_t year)
{
    return year % 4 == 0 && year % 100 || year % 400 == 0;
}
 
bool CheckDate(std::size_t day, std::size_t month, std::size_t year)
{
    const int months[] = {1,3,5,7,8,10,12,4,6,9,11};
    const int MONTH_WITH_31 = 7;
    
    if(month < 1 || month > 12)
        return false;
    if(month == 2)
        return IsRange(day, 1, 28 + isLeapYear(year));
    return IsRange(day, 1, 30 + (std::find(months, months + MONTH_WITH_31, month) != std::end(months)));
}
 
int main(int argc, char *argv[])
{
    std::cout << std::boolalpha << CheckDate(28, 2, 2015) << std::endl
                                << CheckDate(29, 2, 2015) << std::endl;
}
http://ideone.com/ejrUol
0
Khelleos
38 / 38 / 25
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
09.02.2015, 23:03 #7
У вас не верно инициализирован массив months (http://ideone.com/NQQw9Y). Должно быть так
C++
1
const int months[] = {1,3,5,7,8,10,12};
Иначе
C++
1
std::find(months, months + MONTH_WITH_31, month) != std::end(months))
всегда возращяет true
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16744 / 6635 / 860
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
09.02.2015, 23:06 #8
Цитата Сообщение от Khelleos Посмотреть сообщение
У вас не верно инициализирован массив months
Можно и так сказать. Хотя я бы сказал, что не верна проверка в find.
0
Khelleos
38 / 38 / 25
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
09.02.2015, 23:12 #9
На http://www.cplusplus.com/reference/algorithm/find/
Returns an iterator to the first element in the range [first,last) that compares equal to val. If no such element is found, the function returns last.
Вы перечислили все месяцы в массиве, так что только указав месяц вне диапазона [1;12] std::find вернет итератор на std::end.
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16744 / 6635 / 860
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
09.02.2015, 23:23 #10
Khelleos, я знаю, что возвращает find, спасибо. Но я уже говорил про неверную проверку в find (что вы, почему-то, пропустили). Пусть будет с кодом:
C++
1
std::find(months, months + MONTH_WITH_31, month) != months + MONTH_WITH_31)
0
09.02.2015, 23:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2015, 23:23
Привет! Вот еще темы с решениями:

Распарсить ввод структуры, проверить на корректность
Мне нужно сделать такую вот программу &quot;С клавиатуры задается текст. Написать...

Проверить корректность реализации нескольких задач
Добрый вечер всем. Вопрос относиться к опытным программистам С++. Вопрос...

Проверить корректность ввода элементов матрицы
Ввод элементов матрицы А(m, n) осуществляется в произвольном порядке тройками...

Решение уравнения - проверить код на корректность
Написал рещение небольшого уровнения а=корень из (2а+sin|2a|)/3,56 #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru