Форум программистов, компьютерный форум CyberForum.ru

Правильность ввода даты - C++

Восстановить пароль Регистрация
 
s3lf
 Аватар для s3lf
26 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 60
25.11.2013, 00:36     Правильность ввода даты #1
Всем привет.
Хотелось бы узнать способ проверки правильности формата введенной даты в строке.
Т.е. на вход подается строка, необходимо проверить, является ли она датой в формате ЧЧ.ММ.ГГГГ.
Необходимо учитывать то, что существует високосный год, а также количество дней в остальных месяцах.
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2013, 00:36     Правильность ввода даты
Посмотрите здесь:

Определить правильность даты,введенной с клавиатуры C++
Проверка на правильность ввода значения. C++
Проверка на правильность ввода с клавиатуры C++
C++ Как контролировать правильность ввода?
циклические алгоритмы (проверять правильность ввода данных) C++
C++ Вывести возраст пользователя после ввода им даты рождения
Добавить в программу функцию проверки правильности ввода даты C++
На основе введенной даты рождения и текущей даты сообщить пользователю, сколько он прожил дней C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
caiman
 Аватар для caiman
11 / 11 / 1
Регистрация: 17.11.2013
Сообщений: 39
25.11.2013, 04:02     Правильность ввода даты #2
Писал когда-то класс для обработки дат:
Date.h:
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
#ifndef DATE_H
#define DATE_H
 
#include <iostream>
 
using namespace std;
 
class Date {
    private:
        unsigned short int day;
        unsigned short int month;
        int year;
 
    public:
        Date();
        Date(unsigned short int, unsigned short int, int);
        unsigned short int getDay() const;
        unsigned short int getMonth() const;
        int getYear() const;
        Date* getDate();
};
 
ostream& operator<<(ostream& out, const Date& date);
 
#endif
Date.cpp:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include "date.h"
#include <iomanip>
#include <ctime>
 
class DayException{};
class MonthException{};
class FebruaryToHighException{};
 
Date::Date() {
    time_t t = time(0);
    
    struct tm * now = localtime( & t );
    year = (now->tm_year + 1900);
    month = (now->tm_mon + 1);
    day = now->tm_mday;
}
 
Date::Date(unsigned short int day, unsigned short int month, int year) {
    int leapYear = year % 4;
 
    if ( day < 1 || day > 31 ) {
        throw DayException();
    }
 
    if ( month < 1 || month > 12 ) {
        throw MonthException();
    }
 
    if ( month == 2 && day > 29 - leapYear ) {
        throw FebruaryToHighException();
    }
 
    if ( day > 30 + month % 2 ) {
        throw DayException();
    }
 
    this->day = day;
    this->month = month;
    this->year = year;
}
 
unsigned short int Date::getDay() const {
    return this->day;
}
 
unsigned short int Date::getMonth() const {
    return this->month;
}
 
int Date::getYear() const {
    return this->year;
}
 
ostream& operator<<(ostream& out, const Date& date) {
    out << setfill('0') << setw(2) << date.getDay() << '.';
    out << setw(2) << date.getMonth() << '.';
    out << setw(4) << date.getYear();
}
Разберешься.

Добавлено через 1 минуту
Считаешь строку, разобьешь по "." - отдашь объекту - он тебе провалидирует.

Добавлено через 30 минут
Не согласен с собственным классом! ))
Вот программка для проверки:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string>
#include <cstdlib>
 
#define LIMIT 3
 
int main() {
    std::string date;
    std::string array[LIMIT];
    size_t position = 0;
    int index = 0;
    bool isLeap = false;
    bool isValidDate = true;
    int day, month, year;
 
    std::cin >> date;
 
    while ( (position = date.find('.')) != std::string::npos ) {
        std::string token = date.substr(0, position);
        array[index] = token;
        date.erase(0, position + 1);
        index += 1;
    }
    array[index] = date;
 
    day = atoi(array[0].c_str());
    month = atoi(array[1].c_str());
    year = atoi(array[2].c_str());
 
    if ( year % 4 == 0 ) {
        isLeap = true;
    }
    if ( day < 1 || day > 31 ) {
        isValidDate = false;
    }
    if ( month < 1 || month > 12 ) {
        isValidDate = false;
    }
    if ( month == 2 && day > 29 && isLeap == true ) {
        isValidDate = false;
    }
    if ( month == 2 && day > 28 && isLeap == false ) {
        isValidDate = false;
    }
    if ( month == 4 || month == 6 || month == 9 || month == 11 ) {
        if ( day > 30 ) {
            isValidDate = false;    
        }
    }
 
    if ( isValidDate ) {
        std::cout << "Date valid!" << std::endl;
    } else {
        std::cout << "Invalid date!" << std::endl;
    }
 
    return 0;
}
Yandex
Объявления
25.11.2013, 04:02     Правильность ввода даты
Ответ Создать тему
Опции темы

Текущее время: 07:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru