Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 05.04.2018, 16:37   #1
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
Репутация: 10
По умолчанию Проверка строки на правильность даты.

Здравствуйте. Столкнулся с простой задачкой как мне казалось, но не могу решить второй день.
Нужно проверить строку на правильность формата даты. На форме можно использовать только один Edit и кнопку.
Edit принимает строку, предположительно содержащую дату в формате дд.мм.гггг, разделитель может быть любым не числовым символом и значения дня, месяца и года может не совпадать с форматом.
Функция проверяет на корректность введенной даты и возвращает строку в строго определенном формате дд.мм.гггг.
По возможности не использовать стандартные функции. Если дата введена не корректно - возвращает пустую строку.
Например функция принимает 28/3-18 возвращает 28.03.2018.
YARK0S вне форума   Ответить с цитированием
Старый 05.04.2018, 17:17   #2
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,613
Репутация: 5352
По умолчанию

Цитата:
Сообщение от YARK0S Посмотреть сообщение
Столкнулся с простой задачкой как мне казалось
На самом деле - это нелогичная и очень странная задача.

И, она может вообще не иметь решения.

Ну, во-первых,
Цитата:
Сообщение от YARK0S Посмотреть сообщение
значения дня, месяца и года может не совпадать с форматом.
порядок чисел всегда совпадает с форматом? всегда первым идёт день, потом месяц, потом год?

во-вторых, по каким правилам двухзначное значение года превращается в чётырёхзначное? например, 9:005:45 - это какая дата

в-третьих, лишние символы могут быть в строке и что с ними делать?
например,
01.09.17.1
(/day=01/)-(alpha="0005").[17]
?

в-четвертых, чем вызвано требование
Цитата:
Сообщение от YARK0S Посмотреть сообщение
По возможности не использовать стандартные функции.
?
Это какая-то извращённая учебная задача?
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 05.04.2018, 20:07   #3
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
Репутация: 10
По умолчанию

Решил задачу, делюсь кодом:
Код:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
#include <cstdio>
#include "Unit1.h"
using namespace std;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}

bool valid_date(int _Year, int _Month,int _DayNo )
{
    int days_in_month[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    
    if( _Year % 4 == 0 )
        days_in_month[2] = 29;
    
    if (( _Month < 1)||(_Month > 12 ))
        return false;
    
    if (( _DayNo < 1)||( _DayNo > days_in_month[_Month] ))
        return false;
    
    return true;
}



void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String s = Edit1->Text;
    int d, m, y;
    char ch;
    std::_stscanf(s.c_str(), _T("%d%c%d%c%d"), &d, &ch, &m, &ch, &y);
    y += (y < 100) * 2000; 
    if (valid_date(y, m, d))
        Edit1->Text=(FormatDateTime("dd.mm.yyyy", EncodeDate(y, m, d)));
    else
        {ShowMessage(_T("Некорректная дата"));
    }
}

//---------------------------------------------------------------------------

YARK0S вне форума   Ответить с цитированием
Старый 06.04.2018, 00:33   #4
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,613
Репутация: 5352
По умолчанию

во-первых, Вы не ответили ни один мой вопрос.

во-вторых, EncodeDate - это стандартная функция, её вполне достаточно для решения всей вашей задачи (см. обработку исключений - пример - тут )

в-третьих, любопытно, что ваша функция вернёт для такого варианта строки:
1.2.-2000


p.s. впрочем, это всё неважно, главное, что Вы решили свою проблему и, судя по всему, ваш код Вас устраивает.

Последний раз редактировалось Serge_Bliznykov; 06.04.2018 в 00:36.
Serge_Bliznykov вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка на правильность введении строки(С++) ЕКатерина4545 Помощь студентам 2 14.12.2015 13:53
Определить правильность даты, введенной с клавиатуры (Паскаль) галина01 Помощь студентам 1 02.12.2014 21:15
Проверка даты (строки) (начальный уровень) joi Общие вопросы по Java, Java SE, Kotlin 1 03.11.2012 21:31
DateEdit из Библиотеки RX. Как проверить правильность даты? Vit@L Компоненты Delphi 2 22.02.2010 12:11
Проверка строки на правильность данных haros Microsoft Office Excel 10 28.02.2009 17:39


10:05.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru