Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2011, 18:36   #1
Raspad
Новичок
Джуниор
 
Регистрация: 16.05.2011
Сообщений: 2
По умолчанию Перевод даты в строковый формат

Уважаемые программисты, хотел бы почитать ваши советы по данной программе. Задача такова: Необходимо написать программу, переводящую дату из формата дд.мм.гггг в строковый формат дд. месяц гггг. В принципе написал прогу, но не могу никак осуществить проверку исходных данных. Каким образом наложить ограничения на ввод левых символов и ненужных чисел? Заранее благодарен

#include <iostream>
#include <iomanip>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
using namespace std;

void main( void )
{

char str[11]; // объявление строки символов
setlocale(LC_ALL,"rus");
// просим пользователя ввести строку символов
cout << "\nВведите дату в формате дд.мм.гггг: ";
cin >> str;

cout <<str[0]<<str[1]<<"\t";
if ((str[3]=='0') && (str[4]=='1'))
{cout << "Январь\t"<< str[6]<<str[7]<< str[8]<<str[9];}
if ((str[3]=='0') &&(str[4]=='2'))
{cout << "Февраль\t"<< str[6]<<str[7]<< str[8]<<str[9];}
if ((str[3]=='0') && (str[4]=='3'))
{cout << "Март\t"<< str[6]<<str[7]<< str[8]<<str[9];}
if ((str[3]=='0') && (str[4]=='4'))
{cout << "Апрель\t"<< str[6]<<str[7]<< str[8]<<str[9];}
if ((str[3]=='0')&& (str[4]=='5'))
{cout << "Май\t"<< str[6]<<str[7]<< str[8]<<str[9];}
if ((str[3]=='0') && (str[4]=='6'))
{cout << "Июнь\t"<< str[6]<<str[7]<< str[8]<<str[9];}
if ((str[3]=='0') && (str[4]=='7'))
{cout << "Июль\t"<< str[6]<<str[7]<< str[8]<<str[9];}
if ((str[3]=='0') &&(str[4]=='8'))
{cout << "Август\t"<< str[6]<<str[7]<< str[8]<<str[9];}
if ((str[3]=='0') && (str[4]=='9'))
{cout << "Сентябрь\t"<< str[6]<<str[7]<< str[8]<<str[9];}
if ((str[3]=='1') && (str[4]=='0'))
{cout << "Октябрь\t"<< str[6]<<str[7]<< str[8]<<str[9];}
if ((str[3]=='1') && (str[4]=='1'))
{cout << "Ноябрь\t"<< str[6]<<str[7]<< str[8]<<str[9];}
if ((str[3]=='1') && (str[4]=='2'))
{cout << "Декабрь\t"<< str[6]<<str[7]<< str[8]<<str[9];}
// выводим результат на экран
_getch();
}
Raspad вне форума Ответить с цитированием
Старый 27.12.2011, 01:13   #2
Mikola-TEAM
Пользователь
 
Регистрация: 31.05.2008
Сообщений: 34
Сообщение

Код:
#include <iostream>
#include <conio.h>
#include <cstdlib>

using namespace std;

int main()
{
    setlocale(LC_ALL,"rus");
    cout << "Введите дату в формате дд.мм.гггг: ";
    char ch[8];//массив символов типа char: 2шт для дня, 2шт для месяца, 4шт для года
    int month, year;//численное значение года нам понадобится для нахождения високосного года

    for (int i=0; i<8; i++)
    {
        cout << (ch[i]=getch());//каждому элементу массива по очереди присваиваем значение нажатой кнопки и тут же его выводим на экран
        year=(int(ch[4]-48)*1000 + int(ch[5]-48)*100 + int(ch[6]-48)*10 + int(ch[7]-48));
        // *1000 кол-во тысяч, *100 кол-во сотен, *10 кол-во десятков, кол-во единиц
        //Т.к. код цифры больш её целочисленного значения на 48, поэтому отнимаем 48 и получаем цифру вместо символа, а затем переводим её в int

        //проверка вводимой информации
        if (
            ch[i]<'0' || ch[i]>'9' ||//проверяем, является ли наш символ цифрой

            //проверка введённого дня (ввели 2 числа, т.е. i=1)
            i==1 && (ch[0]=='0'&&ch[1]=='0' ||//0-го дня
                     ch[0]=='3'&&ch[1]>'1'  ||//и больше 31-го дня
                     ch[0]>'3') ||            //не бывает

            //проверка месяца (ввели 4 числа, т.е. i=3)
            i==3 && (ch[2]=='0'&&ch[3]=='0' ||//0-го месяца
                     ch[2]=='1'&&ch[3]>'2'  ||//и больше 12-го месяца
                     ch[2]>'1') ||            //не бывает

            i==3 && ch[0]=='3'&&ch[1]>'0' && (ch[2]=='0'&&ch[3]=='4' ||//в апреле
                                              ch[2]=='0'&&ch[3]=='6' ||//в июне
                                              ch[2]=='0'&&ch[3]=='9' ||//в сентябре
                                              ch[2]=='1'&&ch[3]=='1') ||//и в ноябре больше 30 дней быть не может

            i==3 && ch[0]=='3'&&              ch[2]=='0'&&ch[3]=='2' ||//а в феврале больше 29 дней не бывает
            //проверка февраля невисокосного года, для этого нужно дождаться ввода года, т.е. всех 8-ми цифр (i=7)
            i==7 && ch[0]=='2'&&ch[1]>'8' &&  ch[2]=='0'&&ch[3]=='2'//а в феврале невисокосного года и больше 28 дней не бывает
            &&(year%4!=0 || year%100==0 && year%400!=0)//год невисокосный, т.е. не кратен 4 либо кратен 100 и при этом не кратен 400
            )
        {
            //если условие выполнилось (ввели неверную дату), то
            system("cls");//очистим консоль
            i=-1;//в конце тела цикла будет i++  получим i=0 т.е. начнём писать с начала
            ch={'0','0','0','0','0','0','0','0'};
            cout << "Введите дату в формате дд.мм.гггг: ";//предложим написать по новой
        }
        if (i==1 || i==3) cout << '.';//после ввода даты и месяца ставим разделитель - точку

    }
    cout << ":\n";

    cout << ch[0] << ch[1];
    month=(int(ch[2]-48)*10 + int(ch[3]-48));

    switch (month)
    {
        case 1: cout << " января ";//вместо номера месяца запишем его название
            break;
        case 2: cout << " февраля ";
            break;
        case 3: cout << " марта ";
            break;
        case 4: cout << " апреля ";
            break;
        case 5: cout << " мая ";
            break;
        case 6: cout << " июня ";
            break;
        case 7: cout << " июля ";
            break;
        case 8: cout << " августа ";
            break;
        case 9: cout << " сентября ";
            break;
        case 10: cout << " октября ";
            break;
        case 11: cout << " ноября ";
            break;
        case 12: cout << " декабря ";
            break;
    }

    cout << year;

    getch();

    return 0;
}

Последний раз редактировалось Mikola-TEAM; 27.12.2011 в 20:05.
Mikola-TEAM вне форума Ответить с цитированием
Старый 28.12.2011, 14:07   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Для уменьшения строк кода, предлагаю замену (как у K&R).

Вот этот код:
Код:
    switch (month)
    {
        case 1: cout << " января ";//вместо номера месяца запишем его название
            break;
        case 2: cout << " февраля ";
            break;
        case 3: cout << " марта ";
            break;
        case 4: cout << " апреля ";
            break;
        case 5: cout << " мая ";
            break;
        case 6: cout << " июня ";
            break;
        case 7: cout << " июля ";
            break;
        case 8: cout << " августа ";
            break;
        case 9: cout << " сентября ";
            break;
        case 10: cout << " октября ";
            break;
        case 11: cout << " ноября ";
            break;
        case 12: cout << " декабря ";
            break;
    }
Заменить на:
Код:
cout << month_name(month);
Реализация month_name:
Код:
// month_name: возвращает имя n-го месяца
char* month_name(int n) {
    static char* name[] = {
        "",
        " января ", " февраля ", " марта ",
        " апреля ", " мая ", " июня ",
        " июля ", " августа " , " сентября ",
        " октября ", " ноября ", " декабря "};

    return name[n];
}
8Observer8 вне форума Ответить с цитированием
Старый 29.12.2011, 00:08   #4
Mikola-TEAM
Пользователь
 
Регистрация: 31.05.2008
Сообщений: 34
По умолчанию

Хм, прикольное решение. Делаем массив из строк и выводим строку, соответствующую номеру месяца.
Ещё чуток "оптимизировал" и получим вот так (0-й месяц "" не нужен, просто отнимем от номера месяца 1 при выборе name)
Код:
string name[] = {
    " января ", " февраля ", " марта ",
    " апреля ", " мая ", " июня ",
    " июля ", " августа " , " сентября ",
    " октября ", " ноября ", " декабря "};
cout << name[month-1];

Последний раз редактировалось Mikola-TEAM; 29.12.2011 в 00:12.
Mikola-TEAM вне форума Ответить с цитированием
Старый 29.12.2011, 00:32   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Raspad

Необходимо написать программу, переводящую дату из формата дд.мм.гггг в строковый формат дд. месяц гггг. В принципе написал прогу ...

[десятки строк абсолютно ненужного кода поскипаны]

мдэ... и на что только не идут люди, лишь бы не использовать функцию strftime... :lol:

Код:
#include <iostream>
#include <locale>
#include <time.h>

int main()
{
	setlocale(LC_ALL, "");

	time_t t;
	time(&t);

	tm* local = localtime(&t);


	char szTime[1000] = {0};
	strftime(szTime, sizeof(szTime)/sizeof(szTime[0]), "%d %B %Y", local);

	std::cout << szTime << std::endl;
}
Rififi вне форума Ответить с цитированием
Старый 29.12.2011, 18:43   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Rififi, не могу придумать, как грамотно заполнить структуру locale, имея строку с датой (инициализация остальных полей). Есть ли какая-нибудь функция для этого?

И ещё, чуть не забыл, нужно будет менять "Декабрь" на "декабря". А это дополнительные затраты на строки кода. Хотя можно подумать, как это сделать с минимальными затратами. А пока бы инициализировать locale.

Mikola-TEAM, проверка у вас отличная получилась.

Последний раз редактировалось 8Observer8; 29.12.2011 в 19:05.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод даты в строковый формат Raspad Общие вопросы C/C++ 1 29.12.2011 00:19
Как перевести число в строковый формат. в PHP Ast Помощь студентам 8 12.06.2011 08:52
Формат даты. agregator Microsoft Office Excel 3 21.01.2011 14:55
VBA,преобразование в строковый формат DimR Помощь студентам 0 07.04.2010 23:03
Формат даты Iskin Microsoft Office Excel 5 16.04.2009 14:49