LINUX.ORG.RU

int avg(int a, int b)
{
    if (sign(a) != sign(b))
        return (a + b) / 2;
    else
        return a + (b - a) / 2;
}

Это идеал кода? Бугагагага...

anonymous
()

Больше всего в статье радует апломб автора, в милинноый раз открывающего нам америку. Оч интересно.

Burbaka ★★
()
Ответ на: комментарий от php-coder

>Да-да. Боян :) Но статья хорошая.

чем же она хорошая? очередной дежурный коммент;)? помню читал где то твою цитату "не понял что за прога, но автор молодец". ))) жжошь пых

anonymous
()

Дрянь статья. Бросил читать после совета использовать HTTP везде.

welkam ★★
()
Ответ на: комментарий от anonymous

> Это идеал кода? Бугагагага...

Михаил, перелогинтесь! / Анонимус, не позорь имя — напиши код лучше.

anonymous
()
Ответ на: комментарий от anonymous

>int avg(int a, int b) { if (sign(a) != sign(b)) return (a + b) / 2; else return a + (b - a) / 2; }

>Это идеал кода? Бугагагага...

Код как код... Откуда мы знаем, что имел ввиду автор, когда писал это.

yz
()

правильная статья, достойные люди сами дошли до этих выводов, за исключением виндузятников и жабистов, которые в линукс лезут со своим bloatware, особенно жабофилы, насуют везде бездумно xml-я, soap, и проч. херь, потом и их программа тормозит и жрет всю память еще ничего не делая.

anonymous
()
Ответ на: комментарий от anonymous

> Анонимус, не позорь имя — напиши код лучше.

Как два пальца...

int avg(int a, int b) { return a/2 + b/2 + a & b & 1; }

Но в большинстве случаев хватит (a+b)/2

anonymous
()

В принципе весь смысл статьи умещается в единственной фразе: "Почитайте The Art of UNIX Programming, поизучайте вообще UNIX"

shumer
()

>"Почитайте The Art of UNIX Programming, поизучайте вообще UNIX, если вы этого еще не делали, и погрузитесь в мир, в котором программирование является утонченным, интеллектуальным ремеслом, или даже искусством. Уроки, которые вы извлечете оттуда, помогут писать более вменяемый код даже под Windows, если у вас после этого еще будет охота возвращаться к этому стилю и программным интерфейсам, созданным скорее для роботов, чем для людей".

ttnl ★★★★★
()
Ответ на: комментарий от anonymous

ну да, как два пальца. Может, с тремя пальцами получиться ? :)

int avg1(int a, int b) { return a/2 + b/2 + a & b & 1; }
int avg2(int a, int b) { return a/2 + b/2 + (a & b & 1); }

#define sign(a) (a > 0 ? 1 : 0)

int avg3(int a, int b)
{
    if(sign(a) != sign(b))
        return (a + b) / 2;
    else
        return a + (b - a) / 2;
}

int main(int argc, char **argv)
{
    printf("%d\n", avg1(3, -5));
    printf("%d\n", avg2(3, -5));
    printf("%d\n", avg3(3, -5));

    return 0;
}

[alex:alex tmp]$ gcc -o 1 1.c
[alex:alex tmp]$ ./1
0
0
-1

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

версия 0.2:

-#define sign(a) (a > 0 ? 1 : 0)
+ #define sign(a) (a > 0 ? 1 : (a < 0 ? -1 : 0))

alex_custov ★★★★★
()
Ответ на: комментарий от anonymous

>Как два пальца...
>int avg(int a, int b) { return a/2 + b/2 + a & b & 1; }
>Но в большинстве случаев хватит (a+b)/2

А можно так?

int avg(int a, int b){
   long sum = a+b;
   return (int)sum/2;
}

ftor
()

Да ладно, нашел к чему придираться, подумаешь - переполнение не учли. Мне вчера, например, попался такой вот код:

if(a < 0 || a > max || a == 1 || a == 2)

а еще раньше видел вот такое:

if(a < 0 || a > 2)

а - в обоих случаях целое.

А вы говорите - переполнение :)

shumer
()

Автор статьи долпайоп. 10 строчек скрипта в котором навреняка заюзан rcp/scp стравнивать со с нуля написанным софтом (который еще надо посмотреть что за софт вообще) - это сравнение жопы с пальцем. Если так, то любой гоблин может установить на маздайку SSH и в 10-строчный cmd, сделать тоже самое. А то что сейчас в моде индусс-код, так этим никого не удивишь.

КГ/АМ

cathode
()
Ответ на: комментарий от cathode

>Если так, то любой гоблин может установить на маздайку SSH и в 10-строчный cmd, сделать тоже самое.

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

anonymous
()
Ответ на: комментарий от ftor

> Объясни, я учусь )

Видимо, он имел в виду, что (по причине идиотских Цешных правил приведения целых) a+b справа переполнится, ничего не зная о левой части присваивания.

Die-Hard ★★★★★
()
Ответ на: комментарий от anonymous

>>Если так, то любой гоблин может установить на маздайку SSH и в 10-строчный cmd, сделать тоже самое.

> вот так и надо было сделать.

Гы! Ты когда-нибудь пробовал лить дивидишник посредством scp?

Мы не знаем всех тонкостей -- может, там какая левая сетка была, или требовалось нечто одновременно суперсекретное и инкрементальное?

Но вообще ИМХО статья интересная, хотя и спорная во многих местах...

Die-Hard ★★★★★
()
Ответ на: комментарий от ftor

> Объясни, я учусь )

в дополнение к тому, что каст к (long) нужно внутри выражения делать, в стандарте Си нет гарантии что sizeof(long) > sizeof(int). есть только гарантия что sizeof(long) >= sizeof(int)

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> в стандарте Си нет гарантии что sizeof(long) > sizeof(int).

О Боже!

Извиняюсь, я этого даже и не заметил! Я подумал про гнутый long long. А sizeof(long) на 32 битах обычно равен sizeof(int).

Die-Hard ★★★★★
()
Ответ на: комментарий от ftor

Во-первых стандарт не гарантирует, что sizeof(long) > sizeof(int), он всего лишь требует чтобы sizeof(long) >= sizeof(int). И на 32-битных машинах, как правило, sizeof(int)==sizeof(long).

Вторую причину уже озвучил оратор выше.

anonymous
()
Ответ на: комментарий от Die-Hard

> Видимо, автор имел в виду if(a < 0 && a > 2)

сорри, я неправильно написал, там было строгое неравенство:

if(a <= 0 || a >= 2)

shumer
()

>>В общем случае, программа - это функция, которая берет аргументы и возвращает некий результат; сама программа состоит из функций, каждая из которых решает некоторую часть задачи.

А side-effects? Хорошо жить в мире, где есть только сферические кони в вакууме.

Morgendorffer
()
Ответ на: комментарий от Morgendorffer

Сорри, не дочитал.

>>Но, опять же, мы упростим наше исследование тем, что назовем все это "побочными эффектами".

Да, ограничимся только рассмотрением сферических коней. Влиянием воздуха тоже пренебрежём. Так что можно считать, что они находятся в вакууме.

Узнаю коллегу.

Morgendorffer
()
Ответ на: комментарий от shumer

>> Видимо, автор имел в виду if(a < 0 && a > 2) > сорри, я неправильно написал, там было строгое неравенство: > if(a <= 0 || a >= 2)

Ты тупой? Что (a < 0 || a > 2), что (a <= 0 || a >= 2) - что тут неправильного???

anonymous
()
Ответ на: комментарий от anonymous

> Ты тупой? Что (a < 0 || a > 2), что (a <= 0 || a >= 2) - что тут неправильного???

Рискну предположить, что, т.к. а - целое, то автор предполагал, что нужно писать if (a != 1)...

SOmni ★★
()
Ответ на: комментарий от anonymous

> Вероятно в том, что вместо if (a <= 0 || a >= 2) {} проще было бы записать if (a != 1) {}

Но не факт, что потом было бы проще это читать. Как раз об этом и говорится в статье, на которую ссылается топикстартер - если с точки зрения изложения человеческим языком значимо то, что "а" входит в одно из двух множеств (от минус бесконечности по нуль включительно и от 2 до бесконечности), а не то, что оно не равно единице - то так и следует записывать.

anonymous
()
Ответ на: комментарий от anonymous

>автор - вендозадрот, помешанный на "технологиях" от MS

тролли, проследуйте, пожалуйста на выход

автор статьи давно уже фор ван пишет библиотеку ptypes - объектно-ориетированную обертку для юниксовых интерфейсов а если почитаешь его другие статьи, то поймешь, что он совсем не фанат винды

anonymous
()

Статья целиком высосана из пальца. Если он уж так начитался книжек и так боялся переполнения,
почему не написал просто

int avg(int a, int b)
{
return ((long long)a + b) / 2;
}

Вместо этого целую кучу костылей напридумывал...

Agent666
()
Ответ на: комментарий от Agent666

> Вместо этого целую кучу костылей напридумывал...

"Боги, дайте мне яду!"

Попробую пояснить:

Представь, что тебе нужна функция long long avg(long long a, long long b)

Так проблема понятна, надеюсь? :-)

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> Представь, что тебе нужна функция long long avg(long long a, long long b)
> Так проблема понятна, надеюсь? :-)

Не понятна

long long avg(long long a, long long b)
{
float res = ((float)a + b) * 0.5;
return (long long)res;
}

Agent666
()
Ответ на: комментарий от Die-Hard

Любой код, который при одинаковой функциональности сложнее, не является хорошим
(если, конечно, тут нет критичных требований к скорости выполнения; а его код ещё
и медленнее будет работать).

Это-то правило хорошего стиля автор явно подзабыл (и которое в книге Art of The Unix
Programming должно быть упомянуто). Нет, ну если вам, конечно, нравится изобретать
велосипеды с квадратными колёсами, то делайте так. Я против ничего не имею, лишь бы
мне с таким кодом работать не приходилось. А автор статьи пусть лучше физикой занимается.

Agent666
()
Ответ на: комментарий от Agent666

> а его код ещё и медленнее будет работать

В случае, если я использую float, а не long long.

Agent666
()
Ответ на: комментарий от Die-Hard

я все-таки продолжу агент666, если нужна функция long double avg(long doublea, long double b), что будешь делать?

а вообще, схб

anonymous
()
Ответ на: комментарий от Agent666

>Любой код, который при одинаковой функциональности сложнее, не является хорошим

Любой код, который не работает в не которых ситуациях, всегда хуже того, который работает всегда.

>А автор статьи пусть лучше физикой занимается.

Вот кто бы говорил! Учитывая что переводе long long -> float можно потерять точность, код становится более похожим на костыли, а решение - по типу "не хватает памяти? ну купи еще 4 гигабайта, или ты нищеброд?"

generatorglukoff ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.