Си диез / Говнокод #25527 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
static class MathParser
{
    static double getFunc(char op, double a, double b)
    {
        switch (op)
        {
            case '+': return a + b;   case '-': return a - b;
            case '*': return a * b;   case '/': return a / b;   case '%': return a % b;
            case '^': return Pow(a, b);   default: return double.NaN;
        }       
    }
    static char[][] ops = { new char[] { '+', '-' }, new char[] { '*', '/', '%' }, new char[] { '^' } };
    public static double Eval(string str) => Eval(ref str, 0, str.Length);
    private static double Eval(ref string str, int z, int l, int i = 0)
    {
        for (; i < 3; i++)
            for (int v = l - 1; v >= z; v--)
                for (int j = ops[i].Length - 1; j >= 0; j--)
                    if (str[v] == ops[i][j])
                        return getFunc(str[v], 
                            Eval(ref str, z, v, i),
                            Eval(ref str, v + 1, l, i + 1));
        return double.Parse(str.Substring(z, l - z));
    }
}

Какой-то укуренный калькулятор получился...
MathParser.Eval("3,1346") => 3.1346
MathParser.Eval("3+2*5") => 13
MathParser.Eval("2^5-1") => 31
MathParser.Eval("1/2^3") => 0.125
MathParser.Eval("2^2^2^2") => 256
MathParser.Eval("7,2%3") => 1.2

Запостил: groser groser, (Updated )

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

        • А это уже деталь конкретной реализации. Сегодня читает, а завтра насрёт. Я бы не стал на это полагаться.
          Ответить
          • Вдруг мы решим добавить в калькулятор поддержку самомодифицирующегося кода.
            Ответить
      • А еще можно объекты портить, прямо внутри конструктора!
        Пользуйтесь константными констукторами.
        Ответить
    • В сисярпе стринги тоже иммутабельные? Какой онскилл )))
      Ответить
      • Проще сказать где они мутабельны - а хуй его знает, где.
        Везде идёт подмена блока.
        Ответить
          • в си литералы немууууууутабельны
            Ответить
            • Речь о строках. А они могут быть const и не-const, литералы всегда const.
              Ответить
            • В старых gcc можно было включить мутабельные литералы. Весь ужас в том, что иногда это реально юзали...
              Ответить
              • В Lazarus можно даже константы менять, не говоря уже о литералах.
                Но ничего, с выходом бесплатной делфи этому уёбищё настал конец. Я верю в это.
                Ответить
                • В «Python» нет никаких «констант». Именно поэтому я за «Python».
                  Ответить
                • Ору с очередного (шестой по счету обосрамс будет чи какой?) потуга броланда сделать freemium
                  Ответить
                  • Напоил тебя своей спермой, а то, что не влезло, размазал по твоему смазливому личику, проверь.
                    Ответить
          • Но буфер при этом скопируется и кроме тебя никто эти изменения не увидит. Там же cow.
            Ответить
              • Но в тот же миг слоны и бегемоты
                Вдруг замычали тоже отчего-то,
                За ними львы, жирафы, кашалоты,
                Орлы, гориллы, крокодилы — все твердили «Му»!
                Ответить
            • Ну, естественно. Изменения увидит только тот объект класса QString, от которого мы вызвали data. Если у нас void foo(QString arg), то с arg мы можем делать что угодно.
              Ответить
                • Чем std::string Удобный API, в котором есть все основные операции, а также низкоуровневые функции типа создания из указателя. Форматирование. Поддержка unicode. Thread-safe implicit sharing with copy-on-write.
                  Ответить
                • Как массив байтиков std::string нормально себя показывает. Но класс строки, в котором нет даже ёбанных toLower()/toUpper() — это какой-то… багор.
                  Ответить
                  • Имхо, строка и должна быть просто контейнером символов. А все эти toLower(), join() и прочая поебень - внешними функциями.

                    Иначе строка превращается в какой-то ебучий god object.
                    Ответить
                    • Возможно, но всё равно же должен быть какой-то упрощённый интерфейс для часто используемых операций. Вот эти вот «std::transform(str.begin(), str.end(), [](unsigned char c) { return ::tolower(c); })» — это ж пиздец ёбанный!
                      Ответить
                      • И ещё я забыл указать выходной итератор, блядь.

                        >>> str = 'HeLLo'
                        >>> str.lower()
                        'hello'
                        Ответить
                        • Хотя бы так. Но Комитет, видимо, очень не любит функции, принимающие ссылки на контейнеры — слишком невербозно для крестов. Возможно, через десяток лет доведут до ума эти ваши концепты и ренджи, тогда-то и заживём!
                          Ответить
                      • > str.begin()
                        std::begin(str) же! Чтобы для массивов тоже работало.
                        Ответить
                  • Ты вроде сам кидал примеры, из-за которых нельзя сделать правильные toLower/toUpper
                    Ответить
                    • Это в крестах нельзя. В нормальных языках — можно.
                      Ответить
                    • во всем мире нижни регистр это lower case

                      и только в руби у нас
                      downcase
                      Ответить
                      • К слову “up” антоним “down”.
                        К слову “low” антоним “high”.

                        С точки зрения Руби всё правильно (принцип наименьшей неожиданности или как там).
                        Ответить
                        • Всё верно.
                          Руби очень сильно отличается от всех остальных языков.
                          Ответить
                          • Antonyms for upper
                            
                            low
                            unimportant
                            below
                            inferior
                            junior
                            lower
                            under


                            Какая неконсистентность (((
                            Ответить
        • Тип string в «Трубопаскакале» был мутабельным: заранее выделялось 256 байт (один под длину, 255 под символы) или сколько укажешь (если в квадратных скобочках указываешь максимальную длину).

          Поскольку длина ограничена, реаллокация не нужна.

          Правда, толку от таких коротеньких строк немного...
          Ответить
          • А ещё они всегда ограничивались CRLF, и чтобы хранить многострочные строки использовали массивы строк. Именно поэтому я за array of char и pchar.
            Ответить
            • Схуяли? Броландстроки интересны тем, что они binary safe, никаких магических значений.
              Ответить
            • Не было такого. В борландовских строках можно было хранить произвольный массив байтиков, включая нулевые байты.

              Это при чтении из файловой переменной типа Text файл разбивался на строки по CRLF, но так и было задумано. Для произвольных файлов были типы file и file of byte.
              Ответить
              • P.S. Типичный пример строковой константы:
                const stihi: string = 'Какой хардкор)))'#13#10'Какой багор)))';


                #13#10 вне апострофов –— это и есть вставка CRLF.
                Ответить
              • >включая нулевые байты.
                потому что там в носу байт длины?
                Ответить
                • Именно так. Длина идёт отдельным полем, поэтому нам не нужны специальные значения символов.
                  Ответить
        • в руби


          за это надо платить понятием символ
          Ответить
          • А в 'J' можно менять элементы массива, в том числе строки:
            NB. всегда будет создаваться копия:
               s =: 'alala'
               'ooo' (0 2 4)} s
            ololo
               NB. но если результату даётся то же имя, модификация будет инплэйс:
               ]s =: 'zz' (1 3)} s
            azaza
            Ответить
    • В делфях можно так: function lol(const s:string);

      Это будет означать передачу по указателю. Счётчик ссылок при этом не работает и память не выделяется. Короче, чисто для оптимизации.
      Ответить
      • Вообще для любых переменных var и const означают передачу по ссылке без копирования. «По ссылке» –— это такой синтаксический сахар: на самом деле передаётся указатель, но разыменовывать его не нужно. Разница между var и const в том, что в случае const компилятор проверяет, что в теле функции отсутствуют попытки изменить значение переменной.

        Для параметров без var и const вызывается «копирующий конструктор»: скалярные значения пушатся в стек (или передаются через регистры в случае fastcall), для структурированных же в стеке создаётся копия, а потом отправляется указатель на копию.

        С const всё ясно: поскольку запретили изменять, то и указатель не будет изменяться.

        Интереснее, что происходит со строками в случае var и в случае передачи по значению.
        Ответить
        • К сожалению, я не знаю, что происходит под капотом на уровне асма, но знаю, что при обращении к строке по значению (
          procedure lol(s:string)
          ), будет создана ее копия, с помощью неявно вызываемой UniqueString. Если же попытаться обратиться к этой строке по указателю, ее память легко можно изменять - и похуй, ссылка ли там, const или var. Компилятор полагает, раз программист юзает указатель - он знает, чтоон делает.
          Ответить
          • Совсем по-другому обстоят дела с литералами; линкер помещает их в область памяти, доступную только для чтения. Любые попытки изменить ее приведут к краху. Поэтому, UniqueString нужно вызывать уже явно.
            Ответить
            • Какое же всё-таки ональное говно, эти Ваши строки.
              Оставили бы просто PChar - и горя б не знали.
              Ответить
              • PChar имеет фатальные недостатки:
                1. В нём нельзя хранить байт с кодом 0 (ноль).
                2. Как следствие, в нём нельзя хранить строки в кодировке UCS-2 (хотя это не проблема, ведь существует PWideChar).
                3. Операция определения длины строки очень медленная, ведь требуется каждый раз сканировать всю строку в поисках байта с кодом 0.

                Как следствие возможны утечки памяти, если случайно в строку поместить байт с кодом 0. Значит, при получении данных из сторонних источников нужно проверять содержимое строки.
                Ответить
                • @1. В нём нельзя хранить байт с кодом 0 (ноль).
                  Пиздец, какой недостаток, особенно для делфи под Windows! О-о-о! Всё, выбрасываем делфи.

                  @2
                  ...

                  @3. Операция определения длины строки очень медленная, ведь требуется каждый раз сканировать всю строку в поисках байта с кодом 0.

                  Длину можно хранить по отрицательному смещению. см.
                  function StrAlloc(Size: Cardinal): PChar;
                  begin
                    Inc(Size, SizeOf(Cardinal));
                    GetMem(Result, Size);
                    Cardinal(Pointer(Result)^) := Size;
                    Inc(Result, SizeOf(Cardinal));
                  end;


                  Года два-три назад я долго вникал в смысл этого черезжопия, пока не додуплил, что на выходе будет совместимый PChar, и для определения длины необязательно искать нулевой символ.
                  Ответить
                  • >> Пиздец, какой недостаток, особенно для делфи под Windows! О-о-о! Всё, выбрасываем делфи.

                    Зря смеёшься. У некоторых программ были уязвимости, связанные с особой трактовкой байта, равного нулю.
                    Ответить
                • В классическом пускале длина строки хранилась впервом байте ограничвая длину строки до 256 символов и превращая операцию узнавания дионы из O(N) в O(1).

                  Это был важный пук в холиваре паскалистов и сишников сереидны 90-х.


                  Декартовы точки,
                  Паскалевы строчки,
                  Идеи обоих Кюри...
                  Ответить
                    • Вроде, до двух байт увеличили?
                      Ответить
                      • Старую строку с ограничением длины до 255 символов (256-1, потому что диапазон значений беззнакового байта 0..255) ещё в старых дельфях переименовали в ShortString.

                        «Длинные строки» стали называться AnsiString и WideString (разница между AnsiString и WideString в логике работы функций стандартной библиотеки, выделяющих подстроку по позиции символа, а не байта). У них индикатор длины вроде бы не два байта, а четыре, т. е. длина строки ограничена четырьмя гигами. Надо добыть исходники SYSTEM.PAS и посмотреть.
                        Ответить
                        • >потому что диапазон значений беззнакового байта 0..255
                          лол, бывает строка длиной 0 символов?

                          погодите-ка... так это же 0!
                          Ответить
                          • В «Паскале» бывают строки длиной 0 символов. Эта строка в памяти занимает один байт: байт длины, в котором хранится 0.

                            В «Си» аналогичная ситуация: там тоже пустая строка занимает один байт: в нём хранится терминатор, по нелепому совпадению тоже равный 0.
                            Ответить
                            • Какой холивар )))
                              Им бы справку читать, а не выпендриваться.
                              Ответить
                            • То-есть у "си" и "паскаля" пустая строка кодируется одинаково?

                              В чем тогда разница между языками?
                              Ответить
                            • Лишнехромосомный инканус даже старое говно не может пережевывать нормально. String[0] - 5уптах еггог
                              Ответить
                              • Недохромосомный Сёма не знает, чего хочет. Пустые строки в Паскале бывают:
                                const s: string = '';


                                Возможно, тип string[0] объявить нельзя, но мы об этом и не говорили. Мне такой тип данных ни разу не понадобился.

                                Вот пустые записи (структуры) обычное дело, когда нужно застолбить указатель на конец чего-то крупного:
                                type nemyx = record
                                    field1, field2 : Integer;
                                    pointer_to_end: record end;
                                en;
                                Ответить
                                • >Недохромосомный
                                  попытка перефорса. Русьня, плес.
                                  Ответить
                                • ахаха, это в сисичке я такое встречал
                                  struct petuh { 
                                    char tail[0]
                                  }


                                  а на самом деле tail там указателем на чото может быть
                                  Ответить
                                • Пид­орашка снова серет под себя, минимальная пассалевская строка это
                                  { хуй знает кому такое нужно }
                                  type NullableChar = ShortString[1];
                                  , а это значит, что
                                  SizeOf(NullableChar) = 2

                                  Лучше бы переживал за свой дегенеративный подвид, бомбимых пенсиями хунтой dumbass people.
                                  Ответить
                        • Посмотрел. У AnsiString, WideString байт длины занимает ровно 4 байта и в 32-битных дельфях, и в 64-битных. Поскольку длина беззнаковая, в таких строках можно хранить 4 гига символов.
                          Ответить
                        • WideString - это обертка над стандартным BStr, AnsiString - чисто делфёвая приблуда. В более новых делфях ввели новый тип по умолчанию - UnicodeString, отвязанный от BStr.
                          Ответить
                          • Между UnicodeString и WideString очень тонкая разница (у UnicodeString отсутствуют некоторые специальные поля по отрицательным смещениям).
                            Ответить
                          • Гляжу, зоосад вы там развели по-круче крестушков
                            Ответить
                            • Это еще что, они даже красивую концепцию fundamental vs. generic types проебали и вместо этого развели зао парк интов.
                              Ответить
        • ты так-то описял семантику крестов.Уверен что в поцкале так же?
          Ответить
          • Я описал, как было сделано в Turbo Pascal и в Delphi. Это всё проверяется: пишешь небольшую функцию, компилируешь и смотришь результат дизассемблирования.
            Ответить
            • Ахах, контракты для самых маленьких да визуальненьких
              • пишешь небольшую функцию
              • компилируешь
              • смотришь результат дизассемблирования
              Ответить
  • Блять, как сложно... Именно поэтому я за алгоритм рекурсивного спуска.
    Ответить
  • Что вы тут обсуждаете, гыгыки ебучие? паскалевские/сишные строки в деталях? Блядь, да кого это ебет вообще? Хоть копейку денег этим знанием заработаешь?
    Ответить
    • Вообще-то я благодаря этому ем свой хлеб.
      Когда в конце 5 курса медынститута я начал учить делфи ради забавы, то и представить не мог, что мне придется впахивать сисадминцем в какой-то гнилой больнице.
      Ответить
      • Нормальную работу найти не пробовал?
        Ответить
        • Ну что значит - "нормальную"? В сосетии страшная безработица, устроиться можно лишь по знакомству либо за взятку. С приходом к власти гамсика-Битарова, в республику хлынули толпы искателей, которые заняли все рабочие места. Куда ни глянь - всюду одни гамсики.

          Самое смешное, что зав. главного врача в нашей гнилушке- тоже гамсик. Не зная моего бравого прошлого, он пытался брызгать на меня слюной как на простого опа, а когда получил отповедь - заткнулся, спеси поубавилось.
          Ответить
          • Нормальную - где платят нормально. Или у тебя частная больничка?
            Уверен, что даже в сосетии есть IT-конторы. А если и нет, то съебаться может быть не поздно.
            Ответить
            • Лол, разумеется за программированеи на дельфи платят не очень хорошо, а если вдруг и платят нормально, то уж точно не в Алании
              Ответить
              • Я на ней пишу всевозможные парсеры и утилиты для автоматизации.
                Ответить
                          • Это необходимо по роду деятельности. Мне удалось повысить продуктивность труда в нашем отделе раз в 5. Но этим неблагодарным ебанашкам всё побоку.
                            Ответить
                              • Я не могу пиздеть тут слишком много, это угрожает моей онанимности.
                                Ответить
                            • Ну так составь резюме и напиши там про это. Хуже когда ты делаешь, не приносящую никому пользу, хуйню, и не гордишься результатами своей работы.
                              Ответить
                              • Хуже когда ты делаешь не приносящую никому пользу хуйню и гордишься результатами своей работы.
                                Ответить
                                • Я сру на говнокодике 24x7 вот уже много лет. Не знаю насколько это полезная хуйня, но я этим очень горжусь
                                  Ответить
              • Не обязательно вообще программировать. Можно быть менеджером.
                Да и какая разница на чём программировать. Если умеешь программировать хоть на чём-то, то легко переучиться на любой язык.
                Ответить
                • >Да и какая разница на чём программировать. Если умеешь программировать хоть на чём-то, то легко переучиться на любой язык.


                  Ну такое;)

                  Если ты действительно хороший программист то скорее всего да, если ты макакий , то может быть и нет
                  Ответить
                • Под программированием наверно имеется в виду software engineering?
                  Ответить
                  • Нет, имеется ввиду нейро-линвистическое программирование конечно
                    Ответить
                    • Ну просто за умение хуярить код который как-то работает тебе много денег не дадут.
                      Ответить
                      • За умение хуярить код, который как-то работает, платят какое-то количество денег кому-то
                        Ответить
                        • Ну я хз как у вас там в рашке, может у вас за любые потуги прогать платят столько что на жизнь хватает.
                          Ответить
                          • На какую-то жизнь кому-то хватает
                            Ответить
              • Открою для тебя страшную тайну. Диплом никого не ебёт, разве что только в гос. конторах.
                Ответить
          • Там намного хуёвее чем в рус нявой рашке?
            Ответить
      • >Вообще-то я благодаря этому ем свой хлеб.
        сладкий?
        Ответить
      • Стертор, сисадмином в больнице в нищей части рашки - это не уровень сайта программистов, даже такого как этот.
        Ответить
        • Сёма вообще безработный. Лучше хоть так.
          Ответить
          • Сёма и то больше получает. Так что не лучше.
            Ответить
            • У стертора спонсора нету, он сам спонсирует семилетних мальчиков
              Ответить
            • И экономит на лампочках? Больше получать != лучше жить.
              Ответить
                • Его сильно волнует, сколько ватт потребляет прибор. Значит, ему приходится экономить на лепестричестве, смотреть телевизор при свечке.
                  Ответить
                  • >смотреть телевизор при свечке.
                    Это ты сильно пошутил, руснепидор. Светодиодка на 10 ватт светит так, что глаза болят. А у вас в спидозной лепестричесвто можно не экономить? Ну хоть где-то вперде.
                    Ответить
                    • Да это вообще хуйня какая-то для тупой ваты. Дешевое электричество в сраной рашке - такой же миф, как и низкие налоги. До обвала ру бля ру­сня так вообще платила на 30% дороже, чем в континентальных штатах.
                      Ответить
                      • Я нейбу сколько в штатах платят, но гермашка тут вперде.
                        Ответить
                        • У ру­сни тут выгодное положение - электромобили запрещены, климат-контроля нет, стирают вручную, сушками не пользуются, даже теплый пол не делают себе. Ты обрати внимание, каких потребителей перечислил пид­орашка, сидящий под лампочкой ильича.
                          Ответить
                          • Я из этого тоже ничем не пользуюсь. Теплый пол это что? Электрообогрев?
                            Тем не менее, я более чем уверен, что на немецком/английском ты не нагуглишь, как ремонтировать светодиодки, перепаивая диоды. А вот на русьнявом - вполне.
                            Ответить
                            • >> Теплый пол это что?

                              Ты поди ещё не знаешь, что такое евроремонт?
                              Ответить
                  • А ты уже перепаял сгоревшие светодиодики на светодиодке?
                    Ответить
        • Ну ебать. По крайней мере я не книжник и реализую накопленное говно на практике.
          Ответить
          • >книжник
            Это те люди, которые обсуждают выше строки?
            Ответить
            • Это кто не читает умных книжек, а берет и хуярит задачу.
              Ответить
              • А потом думает "ёб твою мать, я в своей проге уже нихуя понять не могу"?
                Ответить
                • Ну если книжки по проектированию и дизайну, то да. А если "PHP за 21 день" или "Глубокое обучение на Python", но нахуй они нужны? Просто берёшь и делаешь, что понадобится - изучаешь по мере надобности.
                  Ответить
                  • А потом не понимаешь как работают циклы или еще какая-то базовая хуйня. Что делать? идти в инет спрашивать? Там такие как ты нахуй не нужны.
                    Ответить
                  • потом у тебя протекает абстрация, и ты такой: "оой, тут что-то упало в нативном коде, я этово не нипонимаю, пусть кто-то другой починит"
                    Ответить
                    • В чьем нативном коде? Интерпретатора? Ну так это пыхопроблемки 🙂
                      Ответить
                      • ну так тыж сам написал про PHP и Python
                        Ответить
                        • Это не я. И в питоне изкаробочный функционал у меня еще ни разу не сегфолтил.
                          Ответить
                          • а, ну раз у тебя не сегфолтил, значит проблемы нет
                            Ответить
              • >Это кто не читает умных книжек, а берет и хуярит задачу.
                И потом еще ходит на ebanoe.it ныть, как его заебали галеры?
                Ответить
                • На ебаном ноют хохлы, у которых работа на аутсорс. У вас в спидозной есть понятие бадишоп, не обязательно только у программистов?
                  Ответить
                  • Не пойму, почему ебаное ит популярнее говнокода? На нём пишут реже даже. Это всё из-за стертора?
                    Ответить
                    • Я там не сижу и не собираюсь. Реально никчемный сайт.
                      Ты никак не можешь понять, что вреда от тебя ничуть не меньше, ноешь, флудишь, срешь где попало. Мудак ты.
                      Ответить
    • ага, давайте лучше обсуждать алиэкспресс
      Ответить
  • ахахахахаха!!!

    Another thing that will force the hypervisor on is Virtualization-Based Security, which goes by the acronym VBS. This is confusing because to most people VBS stands for VBScript.
    Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8