1. C++ / Говнокод #27678

    +1

    1. 1
    for (double x = xn, p = 1, n = 0, y = 0; x > xk ? cout<<p<<' '<<n, false : true; x += dx, y = cos(x) + x*5. / 2, y > 0 ? p *= y : y < 0 ? n++ : n );

    Попросили помочь с задачей:
    > Определить произведение негативных и количество позитивных значений функции y=cos(x)+x*5./2, если значение x изменяется от xn до xk с шагом dx.
    Я постарался, как мог, всё-таки язык мне не очень близок (немного помогли). Возможно, ещё есть, куда "улучшить".

    Запостил: MetallDoctor, 23 Сентября 2021

    Комментарии (90) RSS

    • Мне кажется, что любой код на «python» или «C++» Полина сможет улучшить как минимум вдвое.
      Ответить
    • > Попросили помочь
      > немного помогли
      Сколько там уровней вложенности?
      Ответить
      • Попросили помощи на форуме. Я выдал первую версию навскидку, потом были замечания от участников форума, я их устранил, а потом код ещё поправили по сишным стандартам, всё в той же теме.
        Нечестно было бы после этого присваивать все лавры реализации себе, мои тут -- идея и основная часть кода, но у меня сразу получилось скучнее.
        Ответить
        • в чем смысл делать нечитабельный код? быстрее - нет. легко читать - нет. а в чем смысл
          Ответить
          • экономит место на диске
            Ответить
          • По совокупности причин.
            Потренировать голову. Это вам не пайтон, где "должен существовать один и, желательно, только один очевидный способ сделать это". Тем более, что на сях ни на каких я не писал уже много лет и просто было интересно, как получится.
            Показать мощь, "красоту" и "изящество" сей. И вообще очень интересно было бы увидеть глаза препода, которому это сдают.
            Ну и просто если человек несёт такую задачку на форум, то, наверное, он слишком многого не понял. Если повезёт, этот пример его чему-то научит, если нет... ну незнаю, может, ему стоит заняться чем-то ещё. Я учился сам, по бумажным книжкам, без Интернета и что-то освоил. Если бы у меня был Интренет и бескорыстные честные советчики, то освоил бы меньше.
            Ответить
            • > Это вам не пайтон, где "должен существовать один и, желательно, только один очевидный способ сделать это

              В питоне это уже давно не так
              Ответить
              • И никогда не было. Еще на этапе придумывания как бы сделать составной оператор этот лозунг оказался полной хуйней.
                Ответить
              • Ну, скажем, для всех вопросов, которые у меня возникли достаточно быстро находилось достаточно очевидное решение. Один единственный способ — нет, а вот один очевидный способ — почему бы и нет? Будет больше? Не так круто, но тоже хорошо.
                Почему сейчас Пистон стало модно использовать для прототипирования? На нём можно не сражаясь с языком написать первую версию, обновить её, ещё обновить, понять, что зашёл в тупик, переписать КЕМ с нуля (и всё это сделать раньше, чем у сишников выйдет версия 0.2) и когда будешь доволен результатом — отдать на переписывание на Кресты или Шарп какой-нибудь для скорости (а то и провести замеры и понять, что переписывание даст 5-кратный прирост производительности, но это будет «0,02с вместо 0,1с» на самой дорогой из обычных манипуляций и запустить в прод прямо так или переписать 10% самых узких мест и получить время в 0,027с).
                Ответить
            • > увидеть глаза препода, которому это сдают

              Я бы уебала с вертушки в щи на месте препода...

              Программирование -- оно только на 10% о написании говна для компа, остальные 90% посвящены будушим читателям.

              Иногда хочется поприкалываться, конечно. Но для этого есть специальные места: ГК, к примеру, или личный бложек какой-нибудь. Не надо это тащить в лабы и тем более в продакшен.
              Ответить
              • Дык.
                Я вообще категорически против того, чтобы давать готовые ответы на лабораторки. Что получится из того, кто с первого дня ищет готовые ответы по форумам?
                Ответить
              • А, впрочем, я не соглашусь с раскладкой 10% на 90%.
                Если бы это было так, то свои пэт-проекты писались бы в 10 раз быстрее и кто-нибудь давно придумал бы, как это поменять в кровавом энтерпрайзе (нашлись ведь те, кто придумал кусок Г под названием «Agile»).
                На самом деле, не так. Ты просто зубришь принятый code-style и быстро начинаешь писать по его канонам, даже не отвлекаясь на такое. По крайней мере когда я пишу на своём любимом Python, я просто пишу код, который будет выполнять задачу, примерно держа в голове PEP8, а за деталями (типа соглашения по наименованию, кто его помнит наизусть вообще?) смотрит IDE. Так что не заботу о читаемости уходит ~5% времени. А забота о последующей возможности расширения это вообще отдельная индивидуальная тема, которая требует понимания, что это за проект, куда он идёт и куда можно прийти, но это часть ПРОГРАММИРОВАНИЯ, не имеющая отношения к КОДУ и этим давно занимаются отдельные люди.
                Ответить
                • Адекватные имена и логичный код IDE за тебя не сделает. А для архитектора это слишком низкий уровень, он не будет с этим заморачиваться.

                  > пэт-проекты

                  Они из-за перфекционизма зачастую пишутся медленнее.

                  > расширения

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

                  И если я говорю себе, что это просто прототип, который пойдёт на выброс -- я действительно ебашу на порядок быстрее. Но кому-то показывать это стыдно.
                  Ответить
                  • Осмысленные названия переменным даются не для потенциальных потомков, а для того, чтобы ты не забыл, как назвал её в промежутке между объявлением и использованием (и использование бессмысленной мешанины из букв и цифр не ускорит разработку). IDE просто отследит, чтобы при взгляде на неё было понятно: это -- переменная (а не класс/функция/etc) и, в случае чего, сможет отследить её по всему проекту и одновременно переименовать.

                    Про перфекционизм -- ладно, пусть. Но тут ведь как -- если бы можно было ускорить разработку В ДЕСЯТЬ РАЗ, пусть и ценой лютых проблем с дальнейшей поддержкой вплоть до её абсолютной невозможности (при 10-кратном ускорении не проблема каждую версию с нуля переписывать) на это 100% нашёлся бы спрос. Но его не видно.
                    Ответить
                    • Ты сейчас парировал свой собственный нахрюк?
                      Ответить
                      • Ты сейчас продемонстрировало неумение читать.
                        Ответить
                        • > Осмысленные названия переменным даются не для потенциальных потомков

                          > Но тут ведь как -- если бы можно было ускорить разработку В ДЕСЯТЬ РАЗ, пусть и ценой лютых проблем с дальнейшей поддержкой вплоть до её абсолютной невозможности (при 10-кратном ускорении не проблема каждую версию с нуля переписывать) на это 100% нашёлся бы спрос. Но его не видно.

                          Прочитало тебе взаимоисключающие параграфы за щеку, проверь.
                          Ответить
                    • > нашёлся бы спрос

                      И он есть, к сожалению...

                      > ты не забыл, как назвал её в промежутке между объявлением и использованием

                      Ну вот назову я их p и n, как это делает типичный сишник. Или напишу какую-нибудь поебень в духе if (usbrd(0x183) == 0x01). Во время написания кода это никаких проблем не вызывает, да и через пару дней тоже. Жопа начинает гореть именно через месяц-другой, особенно если подобный код написал не ты.

                      Т.е. внятные имена -- они именно для будущего читателя, чтобы ему не приходилось заниматься прикладной археологией.
                      Ответить
                      • Если это мелкое приложение, где переменные упоминается трижды -- при объявлении, получении значения и выводе (да ещё и в пределах экрана) -- то там по-барабану, хоть иероглифом зашифруй, это ни на что не повлияет, в том числе на отладку при условии, что код пишется в какой-никакой IDE. Если хоть сколько-нибудь вменяемый проект, хотя бы на 5 экранов текста, то придётся регулярно скроллить, чтобы посмотреть "а что вообще такое adih3sr" и именно чтобы избежать этого названия даются сколь-нибудь вменяемые.

                        Если в приведённом говнокоде видимость p и n ограничена одной строкой, то не важно, как они называются, это не скажется на понимании кода (пушто ты ткнул в переменную и видишь все её вхождения, как бы она не называлась). А вот то, как сам код написан -- скажется, но как было уже справедливо замечено выше, код из примера написать не проще и не быстрее, чем более очевидный правильный вариант, который и править впоследствии будет легче.
                        Ответить
                        • > мелкое приложение

                          Ха-ха-ха. Я видела множество реальных примеров, где переменные и, самое ужасное, поля широко используемых структур назывались в духе nc (т.е. network_connection) или pc (т.е. packet_counter). Их имена очевидны когда ты уже в теме, скроллить ради них ничего не нужно. Но с нуля въезжать в эти nc->pc очень весело...
                          Ответить
                          • Какой-то жиденький бульк. С нуля надо въехать в предметную область, а не в код.

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

                            А вот зная, что и как называется (и сокращается, да) в данной предметной области я буду только рад, что мне достаточно коснуться двух кнопок (не, в хорошей IDE, конечно, тоже есть умные подсказки, но нажать две кнопки и выбрать из списка -- дольше, чем просто нажать две кнопки, да ещё и отвлекает, сильнее отвлекает только исправление опечатки посреди строки).

                            Вообще считать, что другое именование переменных может заметно ускорить или замедлить разработку -- это такое себе... Прям представляю себе "чтобы разрабатывать быстрее называйте переменные так: ***"
                            Ответить
                            • Контрпример: как-то раз пришлось исправлять ошибку при создании документа в 1С (какой-то реквизит выставлялся неверно при создании документа на основании другого документа). Тогда код на 1С я видел впервые, в бухгалтерской терминологии не разбирался, но, благодаря понятным названиям функций и переменных, и по путанному объяснению проблемы, я нашёл место, где этот реквизит выставлялся явно, немного погуглил, выдрал его из оригинального документа и выставил в результирующем на его основе. Если бы переменные выглядели как " рез[6]= "61.01" ", проблем у меня было бы куда больше.

                              Не зная принципа работы драйверов, зная приблизительно проблему, после поверхностного сканирования хорошо написанного кода, можно представить приблизительную структуру программы, найти места, где потенциально эта проблема может возникнуть, и изучить их поглубже.
                              Незнание принципа работы тебя сильно подкосит только, если ошибка находится, скажем, на границе взаимодействия драйвера с ОС или реально в предметной области — банально перепутаны байты местами в подготовленной структуре. Тут без знания протокола общения с железкой ничего не сделаешь.
                              Ответить
                        • > пушто ты ткнул в переменную и видишь все её вхождения, как бы она не называлась

                          Удачи с разбором какого-нибудь матана или битоёбского алгоритма. Далеко не всегда по вхождениям переменной очевидно что в ней лежит.
                          Ответить
                          • А вот тут зачастую и название хрен подберёшь.
                            Какое название дать переменной со значением
                            0x5f3759df - ( i >> 1 );
                            ?
                            Ответить
                            • first_approximation? :)
                              Ответить
                            • n
                              Ответить
                              • В оригинале она называется y.
                                Ответить
                                • В моей любимой книжке Вирта "Алгоритмы и структуры данных" можно встретить выражения типа
                                  P := F(x) + Q(y - z)

                                  и типа это считалось хорошо наверное
                                  Ответить
                                  • Есть два стула:
                                    1) p, i, t, U, z
                                    2) arrayLoopIteratorFactoryDecorator
                                    Ответить
                                    • Твой идентификатор движок Пастора Свитера не порвал. Смотри, как надо: AccessCheckByTypeResultListAndAuditAlarm ByHandle.

                                      Или так: outputImageProviderFromBufferWithPixelFo rmat.
                                      Ответить
                                      • Твой идентификатор движок Петра Сёмафора порвал.

                                        Смотри, как надо: AccessCheckByTypeResultListAndAuditAlarmByHandle

                                        Или так: outputImageProviderFromBufferWithPixelFormat
                                        Ответить
                                        • AccessCheckByTypeResultListAndAuditAlarmByHandleWithOutputImageProviderFromBufferWithPixelFormatFactoryBuilderLoopIteratorDecoratorSingleton
                                          Ответить
                                          • > IteratorDecoratorSingleton

                                            И животноводство!
                                            Ответить
                                          • AbstractAccessFactoryWhichCheckByTypeResultListAndAuditAlarmByHandleWithOutputImageProviderFromBufferWithPixelFormatFactoryBuilderLoopIteratorBeanProxyDecoratorOfRandomPixelFutureTaskFromSingletonCall

                                            https://ideone.com/hNpKZu
                                            Ответить
                                  • > и типа это считалось хорошо наверное

                                    Если кратковременная память хорошая, то хорошо, быстрее парсится. Длинные имена и привели нашу профессию к упадку.
                                    Ответить
                                    • Да там скорее техничские ограничения были.

                                      Когда у тебя 80x25 экран, как-то не тянет на AbstractStrategyGeneratorFactoryImpl
                                      Ответить
                                    • > кратковременная память хорошая
                                      7 ячеек там максимум, вроде
                                      Ответить
                                    • Хрук-хрук!
                                      Ответить
                            • В одной из контор был мем ``magic_chicken''. Половина служебных сообщений для синхронизации всякой питушни называлась так.
                              Ответить
                        • >IDE

                          Код должен быть читаем без IDE (например для ревью его или для просмотра через браузер, для изучения патча итд)
                          Ответить
                          • Кому должен?
                            Ответить
                            • Прежде всего тебе.
                              Ответить
                            • Тому, кто будет его поддерживать
                              Ответить
                              • А если его будет поддерживать психопат, который знает где живёт автор...
                                Ответить
                                • Тогда надо вставить в код свой адрес и ФИО, чтобы ему было легче тебя искать.
                                  Ответить
                              • Если что-то будет поддерживать мой код без IDE, то это его половые трудности.
                                Ответить
                        • > adih3sr

                          Analog to Digital Interface Handle 3 Status Register?

                          Вполне читаемо, если постоянно с этим работаешь. Скроллить и искать не придётся.
                          Ответить
                    • как говорил один умный человек если будешь писать программу так что при ее просмотре ты читаешь книгу...
                      Ответить
            • > И вообще очень интересно было бы увидеть глаза препода, которому это сдают.
              Так как я работал в универе, вёл лабораторные и практики, я квалифицирован ответить на этот вопрос.

              Для начала проверка на работоспособность на тестовых значениях (которое она не пройдёт, потому что считает произведение положительных и количество отрицательных значений), затем, если всё ОК, задам пару вопросов в стиле «а зачем этот кусок» и «что случится, если это поменять». Затем попрошу поменять код, или рассказать что, где и как будешь менять для того, чтобы, скажем, код делал ровно 2999 итераций, включая xn и xk, и поменять функцию на другую, заданную кусками.

              Затем, если это непрофильный предмет, посмотрю в эти пустые глаза, попрошу попробовать делать самостоятельно и отпущу человека со своей тройкой/сданной лабой. А если профильный, то в зависимости от того, как человек будет отвечать, может уйти с любой оценкой. Или отправится изучать "собственный" код повнимательней.
              Ответить
              • >> задам пару вопросов в стиле «а зачем этот кусок»

                Ассистенты экзаменатора повторяют: «Зачем? Зачем?»

                >> «что случится, если это поменять»

                Затем код меняют.
                Ответить
              • > если это непрофильный предмет, ... отпущу человека со своей тройкой/сданной лабой

                – главное, что часы капают тебе и кафедре, правильно?
                Ответить
                • 1) Проблема образовательной программы. Человеку это реально нахуй не нужно. Он никогда этим не воспользуется. Но в программе есть.

                  2) Если ты не какая большая шишка (а такие непрофильникам обычно не преподают) то к тебе придёт декан и спросит, почему ему декан с кафедры того хера интересуется, почему у него нет допуска к экзаменам?

                  3) Неписанное правило, что за неуспеваемость отчисляют только по профильным предметам. По непрофильным либо за полную тупость, либо за забитие хуя.
                  Ответить
                  • > Человеку это реально нахуй не нужно
                    – человеку нет, вузу и кафедре да

                    > а такие непрофильникам обычно не преподают
                    – странно, у нас непрофильные предметы и завкафедрой вёл. и наш декан вёл у гуманитариев.

                    > Неписанное правило, что за неуспеваемость отчисляют только по профильным предметам
                    – отчисляют за неоплату контракта лол
                    Ответить
                    • > странно, у нас непрофильные предметы и завкафедрой вёл. и наш декан вёл у гуманитариев.
                      Везде по-разному. Не могу говорить за всех.

                      > отчисляют за неоплату контракта лол
                      За успеваемость тоже выгодно — ещё раз семестр оплатит.
                      Ответить
                    • > – отчисляют за неоплату контракта лол
                      Вообще-то отсчисляют всех: любой студент в итоге будет отчислен.
                      Ответить
                  • > Неписанное правило, что за неуспеваемость отчисляют только по профильным предметам.

                    О, значит вместо лекции по философии пойду пивко пить с пацами в понедельник, всё равно после неё физра)
                    Ответить
                    • В нашем вузе одну студентку-отличницу отчислили за то, что физру прогуляла.
                      Ответить
                      • Пидоры.

                        А вообще преподаватели непрофильных нинужно от осознания своей нинужности довольно часто впадают в маразм и начинают требовать от студентов чуть ли не дословной зубрёжки нинужных лекций. Такая себе компенсация.
                        Ответить
                        • Я знаю историю как студентам околотехнической специальности читали курс про С++, и препод сказал писать в CodeBlocks, и жестоко ебал тех, кто писал в чем-то другом
                          Ответить
                          • А нельзя пожаловаться на пидора куда-нибудь?
                            Ответить
                          • > и препод сказал писать в CodeBlocks

                            А он тоже считал себя 14-ти летней девочкой-лолечкой-волшебницей? Мы бы с ним подружились, ведь кодеблокс это мой любимый редактор... Был.
                            Ответить
                        • Нас препод по истории физики заставил на экзамен принести тетради с рукописным конспектом лекции. Без наличия конспекта экзамен не принимал. После проверки конспекта делал на нём пометку фломастером, чтобы студент не смог его передать следующему студенту.

                          Часть профильных предметов нам преподавали не профессиональные преподаватели, а научные сотрудники академических институтов. Они всё делали наоборот. Разрешали во время подготовки к экзамену списывать из учебников, пользоваться подсказкой соседа — в общем, никаких запретов, никаких формальностей. А после вызова начинали спрашивать всё, кроме билета. Они реально выясняли, насколько студент владеет предметом, а не может ли он вызубрить билет.
                          Ответить
                          • У нас на старших курсах после вытягивания билета во время подготовки давали пользоваться книжкой. Один хрен, если не знаешь вопрос, то за n минут, данных на решение задачки и подготовку к теоретическому вопросу, ты две темы с нуля не освоишь.
                            На экзамене по ОТО (непрофильный предмет для нашей специальности девочек-волшебниц) препод дал тянуть билет на консультации в вечер перед экзаменом. Эта теория требует требует очень много муторных, трудно автоматизируемых вычислений даже для простых задачек, а препод её зело любил, и ему не хотелось смотреть на кривые потуги. Мне метрика Шварцшильда выпала, для неё одни только связности надо выводить пару часов, а так я вспоминаю о нём с удовольствием, а не с ужасом.
                            Ответить
                            • Ме́трика Шва́рцшильда — это единственное в силу теоремы Биркхофа сферически симметричное точное решение уравнений Эйнштейна без космологической константы в пустом пространстве. В частности, эта метрика достаточно точно описывает гравитационное поле уединённой невращающейся и незаряженной чёрной дыры и гравитационное поле снаружи от уединённого сферически симметричного массивного тела.
                              Ответить
                              • Метрика Воренности — это единственное в силу теоремы Царя сферически симметричное точное решение уравнений Зелибобы без питулической константы в пустой запарте. В частности, эта метрика достаточно точно описывает питуляционное поле уединённой невращающейся и незаряженной чёрной дыры заедушного питуха и питуляционное поле снаружи от уединённого сферически симметричного массивного куска говна.
                                Ответить
                            • Кокококой кошмар.

                              Мы в основном изучали СТО, а ОТО только поверхностно.

                              А на квантовой физике очень долго решали уравнения Шрёдингера, а до векторной модели атомов не дошли.
                              Ответить
                              • > очень долго решали уравнения Шрёдингера
                                А потом открыли и посмотрели ответ
                                Ответить
                          • > делал пометку фломастером

                            А не пошёл бы он нахуй? Зачем позволяли портить свой конспект?
                            Ответить
                            • Мы тогда боялись преподов на хуй посылать. У нас за «иди на хуй» отчисляли, да ещё в холле публиковали на доске позора.

                              *****

                              Вспомнил ещё одну историю, связанную с отчислением. На одной кафедре отчислили студента за неуспеваемость. Ему пришла повестка. Откосить он не смог. Сразу после учебки его отправили в Чечню, а там в первом же бою лишним телом заложили котлован, ведь солдатами не рождаются.

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

                              К слову, та кафедра специализировалась на проектировании микропроцессоров.
                              Ответить
                              • > котлован

                                Не знаешь матан -- пойдёшь на метан.
                                Ответить
                              • Точнее даже так: не знаешь матан -- пойдёшь в котлован.
                                Ответить
                              • А цинк всем потоком собирали?

                                Надо было как в современной пидорашке прописать в стенгазете, что уволился и воообще никогдане воевали с океанией
                                Ответить
                      • у нас был скандал, что нескольких студентов и студенток на курс старше чуть не отчислили перед самой защитой, потому что у них были какие-то проблемы с преддипломной практикой

                        при том, что там были люди, претендующие на красный
                        Ответить
                      • Вуз не нужен.
                        Ответить
          • Защита от копирования
            Ответить
    • Исправил ошибки, перевёл на «Python».
      import math
      
      
      dx = 0.1
      xn = -5
      xk = 5
      
      
      while ((x := locals().get('x', xn - dx) + dx) <= xk) and \
          ((p := locals().get('p', 0)) or True) and \
          ((n := locals().get('n', 0)) or True) and \
          ((y := math.cos(x) + x * 2.5) or True) and \
          (locals().__setitem__('np'[y > 0], locals()['pn'[y <= 0]] + 1) or True) or \
          print(p, n): pass

      Именно поэтому я за «моржовый оператор».
      Ответить

    Добавить комментарий