КИТА unofficial
Апрель 20, 2024, 04:47:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: [1]   Вниз
  Печать  
Автор Тема: Искусство программирования - 10  (Прочитано 9895 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« : Август 05, 2012, 01:21:29 »

Вполне вероятно, что это старый баян, но лично я был приятно удивлен, когда увидел, как коротко и красиво может быть реализована функция strcpy. Предполагается, что передаются заведомо корректные значения и в строке destination достаточно места, чтобы произвести копирование.

Код:
char *strcpy (char *destination, const char *source)
{
      // Коротко и красиво
}
Записан
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6133


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #1 : Август 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 и реализована.
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #2 : Август 05, 2012, 01:39:38 »

LazarusLong, хороший вариант реализации, короткий, и визуально сразу понятный, но есть еще способ, более короткий, но менее понятный на первый взгляд.
Записан
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6133


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #3 : Август 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;
}
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #4 : Август 06, 2012, 09:34:11 »

Да, именно его я и имел ввиду) По количеству строк он на одну больше, чем предыдущий вариант, но строка, в которой происходит копирование, смотрится всё же компактнее (имхо).
Записан
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6133


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #5 : Август 06, 2012, 09:48:01 »

Вообще мне кажется оба варианта примерно равнозначны, что по использованию памяти. что по вычислительной сложности))
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #6 : Август 07, 2012, 05:23:05 »

Ребята, вы правда считаете, что код
for(int i = 0; (destination = source) != 0;  i++);
    return destination;
хорошо понятен с первого взгляда? я вот не понял с первого раза, а где же собственно копирование.

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

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

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6133


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #7 : Август 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. И да, я согласен с тем, что на реальных проектах так писать нельзя.
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.09 секунд. Запросов: 29.