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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2013, 05:34   #1
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию Оптимизировать или сделать код немножко красивее)

Код:
#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

struct date_struct
{
    int day;
    int month;
    int year;
};

bool Date_func( date_struct &sdate, char *date);
bool rozb(int len, char *day, date_struct &s, char *sym);


int main()
{
    date_struct sdate;
    char date[13];
    bool oz;
    int vvid = 1;
    bool logic =1;
    
    cout << "vvid - 1 if you want contine, 0 - if you want stop\n";
    while (vvid)
    {
        cout << "date = ";
        cin >> date;
        oz = Date_func(sdate,date);
        if (oz)
        {
            if (sdate.month<8)
            {
                if (sdate.month % 2 == 0)
                {
                    if (!(sdate.day <= 30))
                        logic = 0;
                }
                else
                    if (!(sdate.day <=31))
                        logic = 0;

            }
            else
                if(sdate.month % 2 == 0)
                {
                    if (!(sdate.day <= 31))
                        logic = 0;
                }
                else
                {
                    if (!(sdate.day <= 30))
                        logic = 0;
                }

            if (logic)
                cout << "Yes, date is right\n";
            else
                cout << "No, this string is not date\n";
        }
        else
            cout << "No, this string is not date\n";
        cout << "vvid = ";
        cin >> vvid;
    }
    return 0;
}

bool Date_func( date_struct &sdate, char *date)
{
    int len;
    char day[5];
    char *sym;
    int number;
    bool oz;

    len = strlen(date);
    sym = date;

    if (*(sym+2) == *(sym+5) && (*(sym+2)=='-' || *(sym+2)=='/' ||*(sym+2)=='.' ))
    {
        if (len == 8)
            oz = rozb(len-6, day, sdate,sym);
        else

            if (len == 10)
                oz = rozb(len-6, day, sdate,sym);
            else
                return false;
        }
        else
            return false;

    return oz;
}

bool rozb(int par, char *day, date_struct &s, char *sym)
{
    int number;
    strncpy(day, sym,2);
    if (atoi(day) && atoi(day)>0 && atoi(day)<=31)
    {

        number = atoi(sym);
        s.day = number;
        strncpy(day,sym+3,2);
        number = atoi(day);
        if (number>0 && number<=12)
            s.month = number;
        else
            return false;
        strncpy(day,sym+6,par);
        number = atoi(day);
        if (number>0)
            s.year = number;
        else
            return false;
    }
}
Задание такое: пользователь вводит строку. Нужно проверить является ли введенная строка коректным записом даты. Датой щитаетса строка формата dd.mm.yy. або dd.mm.yyyy., так же разделителями могут выступать -/. Если кому не сложно проверте код и скажите что можно исправить)
Pein95 вне форума Ответить с цитированием
Старый 06.01.2013, 12:40   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Жуть...
Код:
	char s[]="12.26.2013";
	int d=0,m=0,y=0;
	if(sscanf(s,"%2d.%2d.%4d",&d,&m,&y)==3) printf("Ok\n day = %d\nmonth = %d\nyear = %d\n",d,m,y);
	else printf("no");
Проще, не правда ли?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2013, 13:53   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Pein95

Если кому не сложно проверте код и скажите что можно исправить)

Если коротко - всё.
Код - полный ужоснах и убиться апстену(((Ж



не контролируется размер буфера при работе с символьными данными, дебильные названия переменных и функций (vvid, rozb), переменные, которые не используются (number), присвоение числа логической переменной (logic (имя переменной - Кэп одобряет(((Ж ) ), антипаттерн "магические числа", обе вспомогательные фунции могут вернуть не-инициализированную переменную, мутная и перегруженая (четые вызова atoi(day) в rozb) логика кода, от которой хочется см. картинко

Stilet

Проще, не правда ли?

Оно, конечно, может и проще, только не соответствует исходному условию (Ж

так же разделителями могут выступать -/.
Rififi вне форума Ответить с цитированием
Старый 06.01.2013, 14:33   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
так же разделителями могут выступать -/.
Вой-вой-вой... Напугалъ дедулю. нистыдно, ась?
Добавить такое же в if но с другим разделителем и сам автор может.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2013, 15:20   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,317
По умолчанию

Stilet, нужно еще полученные значения проверять, т.к. программа говорит ОК и на 12.26.213.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.01.2013, 15:45   #6
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

ну уж Извините за такой код))
scanf использовать нельзя)

Последний раз редактировалось Pein95; 06.01.2013 в 16:01.
Pein95 вне форума Ответить с цитированием
Старый 06.01.2013, 16:18   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
нужно еще полученные значения проверять
Ну это потом. Согласен.
Цитата:
scanf использовать нельзя)
Тогда условие в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2013, 16:27   #8
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

С клавиатуры задается последовательность символов. Написать программу, которая проверяет,является ли эта последовательность является корректным записью даты (датой считаем запись, где первым указанное число, после - месяц, а потом год (4 или 2 цифры, прри чем раздельными могут быть символы "/", "." и "-"). Про scanf ничеого не сказано, но в универе мы ни разу его не использовали.
Pein95 вне форума Ответить с цитированием
Старый 06.01.2013, 18:52   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но в универе мы ни разу его не использовали.
Хы. Это не отмазка. В Универе много чего не используют, это не значит что преподавателю нельзя доказать что задача решаема более легким путем при использовании оптимальных проверенных временем алгоритмов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2013, 21:03   #10
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

Я не отмазываюсь. Окей буду использовать ваш алгоритм) Спасибо за помощь)
Pein95 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизировать или сделать код немножко красивее) Pein95 Помощь студентам 0 09.12.2012 18:20
Оптимизировать код satka Microsoft Office Access 2 01.12.2011 14:36
Как сделать программу красивее? sult9191 Общие вопросы по Java, Java SE, Kotlin 2 16.11.2010 20:14
проверьте плз код!можно ли его оптимизировать или упростить? -ushёl- Помощь студентам 10 23.04.2009 21:07
Оптимизировать код. Манжосов Денис :) Общие вопросы Delphi 1 20.10.2008 19:06