КИТА unofficial

Ваши интересы => Викторины и конкурсы => Тема начата: Артем от Август 05, 2012, 01:21:29



Название: Искусство программирования - 10
Отправлено: Артем от Август 05, 2012, 01:21:29
Вполне вероятно, что это старый баян, но лично я был приятно удивлен, когда увидел, как коротко и красиво может быть реализована функция strcpy. Предполагается, что передаются заведомо корректные значения и в строке destination достаточно места, чтобы произвести копирование.

Код:
char *strcpy (char *destination, const char *source)
{
      // Коротко и красиво
}


Название: Re: Искусство программирования - 10
Отправлено: LazarusLong от Август 05, 2012, 01:31:12
Если мне не изменяет склероз этот, и другие алгоритмы я рассказывал в рамках курса "Алгоритмы и структуры данных", когда еще преподавал))
Код:
char *strcpy (char *destination, const char *source)
{
    for(int i = 0; (destination[i] = source[i]) != 0;  i++);
    return destination;
}

Аналогичные в одну строчку алгоритмы есть и для strlen, strcmp и т.д.
Кстати подозреваю, что именно так strcpy и реализована.


Название: Re: Искусство программирования - 10
Отправлено: Артем от Август 05, 2012, 01:39:38
LazarusLong, хороший вариант реализации, короткий, и визуально сразу понятный, но есть еще способ, более короткий, но менее понятный на первый взгляд.


Название: Re: Искусство программирования - 10
Отправлено: LazarusLong от Август 05, 2012, 08:40:06
LazarusLong, хороший вариант реализации, короткий, и визуально сразу понятный, но есть еще способ, более короткий, но менее понятный на первый взгляд.
хм, был уверен, что речь шла именно о том варианте, что я предложил) завтра подумаю, сейчас уже глаза слипаются)
(Отправлено в: Август 05, 2012, 02:41:22 )
 вспомнил еще такой вариант
Код:
char *strcpy (char *destination, const char *source)
{
    char *temp = destination;
    while(*destination++ = *source++);
    return temp;
}


Название: Re: Искусство программирования - 10
Отправлено: Артем от Август 06, 2012, 09:34:11
Да, именно его я и имел ввиду) По количеству строк он на одну больше, чем предыдущий вариант, но строка, в которой происходит копирование, смотрится всё же компактнее (имхо).


Название: Re: Искусство программирования - 10
Отправлено: LazarusLong от Август 06, 2012, 09:48:01
Вообще мне кажется оба варианта примерно равнозначны, что по использованию памяти. что по вычислительной сложности))


Название: Re: Искусство программирования - 10
Отправлено: tos от Август 07, 2012, 05:23:05
Ребята, вы правда считаете, что код
for(int i = 0; (destination = source) != 0;  i++);
    return destination;
хорошо понятен с первого взгляда? я вот не понял с первого раза, а где же собственно копирование.

Ну а
char *temp = destination;
    while(*destination++ = *source++);
    return temp;

вообще адовый угар.
Но, все-таки, если такое написано где-нибудь в недрах Буста, то ладно, а вот если в коде именно проекта - то надо давать по шапке


Название: Re: Искусство программирования - 10
Отправлено: LazarusLong от Август 07, 2012, 07:40:03
Ребята, вы правда считаете, что код
Код:
for(int i = 0; (destination[i] = source[i]) != 0;  i++);
    return destination;
хорошо понятен с первого взгляда? я вот не понял с первого раза, а где же собственно копирование.

Ну а
Код:
char *temp = destination;
    while(*destination++ = *source++);
    return temp;
вообще адовый угар.
Но, все-таки, если такое написано где-нибудь в недрах Буста, то ладно, а вот если в коде именно проекта - то надо давать по шапке

я тебя понимаю, но я нигде не заметил в тексте темы призывов так писать на реальных проектах. Тема называется искусство программирования. Причем здесь ремесло промышленной разработки софта?

З.Ы. И да, я считаю, что оба варианта достаточно просты и понятны для любого человека мало-мальски знакомого с тем, как работает адресная арифметика и оператор присваивания.

З.Ы. 2. И да, я согласен с тем, что на реальных проектах так писать нельзя.