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

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    #include <iostream>
    #include <string>
    using namespace std;
    long double opros(char s);
    bool proverka(string stroka, int i, bool (*func)(int, string, bool &));
    bool magia(string stroka, int i, bool (*func)(int, string, bool &));
    int main() {
        long double a;
        for (char i = 'a'; i < 'd'; i++) { a = opros(i);
            cout << "\n\nЗначение:\n" << a << " - корректное!\n";}}
    bool f_break(int i, string s, bool &z){
     return true;}
    bool sub_func_mantissa(int j, string stroka, bool &flag, int &index) {
        switch (stroka[j]) {
            case 'e':
            case 'E':
                if ((flag) or (j == (stroka.length() - 1))) return false;
                flag = true;
                index = j;
                break;
    } return true;
    }
    bool sub_func_vetka1(int j, string stroka, bool &flag) {
        if (stroka[j] == '.') {
            if (flag) return false;
            flag = true;
        }
        return true;
    }
    bool zikl_vetka(string stroka, int i, bool &flag, int &index, bool (*p_base_func)(int, string, bool &), char Drive) {
        int j = 1;
        bool flag_zikla = true;
        for (j += i; j < stroka.length(); j++) {
            if (not (Drive == 'M')) {
                if (not ((flag_zikla) or (p_base_func(j, stroka, flag)))) return false;
                flag_zikla = proverka(stroka, j, f_break);
            } else {
                if (not sub_func_mantissa(j, stroka, flag, index)) return false;
            }
        }
        return true;
    }
    bool vetka1(bool &flag, int i, string stroka) {
       int index;
        return zikl_vetka(stroka, i, flag, index, sub_func_vetka1, 'O');
    }
    bool vetka2_dalshe(int i, string stroka, bool &z) {
        bool flag = false;
        int index;
        return zikl_vetka(stroka, i, flag, index, f_break, 'O');
    }
    bool vetka2(string stroka) {
        return magia(stroka, 1, vetka2_dalshe);
    }
    bool mantissa(string stroka, bool &flag, int &index) {
        return zikl_vetka(stroka, -1, flag, index, f_break, 'M');
    }
    bool Dalshe(int i, string stroka, bool &z) {
        int index_mant;
        bool flag_dot = false;
        bool flag_mant = false;
        if (not mantissa(stroka, flag_mant, index_mant)) return false;
        else {
            if (flag_mant)  {
                string sub1 = stroka.substr(0, index_mant);
                string sub2 = stroka.substr(index_mant+1);
                return (vetka1(flag_dot, i, sub1) and vetka2(sub2));}
            else return vetka1(flag_dot, i, stroka);}}
    bool proverka(string stroka, int i, bool (*func)(int, string, bool &)) {
        cout << " ---> proverka ";
        bool z = true;
        switch (stroka[i]) {
        case '0': case '1': case '2':case '3':case '4': case '5': case '6': case '7': case '8': case '9': return func(i, stroka, z); break;
        default:
            return false;
            break;}}
    bool magia(string stroka, int i, bool (*func)(int, string, bool &)) { //3
        switch (stroka[0]) {
        case '-':
        case '+': if (stroka.length() > 1) return proverka(stroka, i, func);
            else return false; break;
        default:
            return proverka(stroka, 0, func); break;}}
    bool general_proverka(string stroka) {
        return magia(stroka, 1, Dalshe);}
    long double opros(char s) { //1
        string argument;
        cout << "\nВведите значение: " << s << ": ";
        getline(cin, argument);
        if (argument.length() == 0) {
            cout << "Вы не ввели значение!\n";
            return opros(s);
        }
        else if (not general_proverka(argument)) {
            cout << "\n\nНекорректное значение!\n";
            return opros(s);
        }
        else return strtold(argument.c_str(), nullptr);
    }

    Проверяет введённую строку на корректность соответствия символов,
    входящих в тип - long double. Если введённая строка корректна, приводит
    данную строку к типу - long double. Иначе - просит заново ввести значение.

    Запостил: Westnik_Govnokoda, 21 Декабря 2020

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

    • Laba.
      Ответить
      • Забавно, что в реализации ПХП когда-то пошли примерно тем же путём, что и в этой лабе. Ну и обосрались, само собой, распарсив 0+2 как 4. Там они, правда, ещё ведущие нули зачем-то скипнуть решили.
        Ответить
    • А зачем всё это, если внизу один фиг strtold(), который и сам справится с проверкой?
      Ответить
      • Это всё просто для тренировки мышления. От strtold() мне нужно было лишь само преобразование (без проверки на корректность), но пока я ещё не придумал - как реализовать преобразование, однако в планах позже постараюсь реализовать и само преобразование. Да, наверняка намного эффективнее было бы обойтись библиотечными функциями, но сравнительно недавно начал изучать C++, и поэтому решил пойти сложным путём.
        Ответить
    • > return opros(s)

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

      кстати, а строку почему не по констрефу?
      Ответить
      • Больше тебя ничего не смущает?
        Ответить
        • 73-я строка еще понравилась очень
          Ответить
          • Зато в любой кодировке работает!

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

        Я, кстати, за «std::string_view».
        Ответить
        • знаешь багор про сабстринг и седьмую джаву?
          Ответить
          • Который substring(0)?
            Ответить
            • Который сначала держал ссылку на сурс, а потом стал копировать
              Ответить
              • А багор какой?
                Ответить
                • Пирфоманс всяких парсеров по пизде пошёл, вестимо.
                  Ответить
                • Багор такой, что поменялось поведение, и стало нужно переписать весь код, чтобы не засирать память
                  Ответить
                  • Наоборот же, раньше память засиралась всякими мегабайтными блобами из которых выпарсили маленькую строчку. А теперь стало дрочить кучу и процессор, зато компактнее и предсказуемее.

                    З.Ы. В целом, если забить на поломавшийся код, мне новый вариант больше нравится. Он более интуитивный для программиста.
                    Ответить
                    • Раньше засиралась по одному, а теперь по другому: если я итерируюсь по строке длинною в метр, и делаю сабстринг, то раньше это было бесплатно, а теперь стало генерировать кучу мусора.

                      Не нужно только вот про бесплатное удаление молодого поколения: тысяча запусков ГЦ даже для молодняка это не бесплатно для интерактивного приложения.

                      Но да: удержать в ГЦ метровую строку, повесив ее на сабстинг из двух чаров стало невозможно.

                      Правильное решение было бы иметь И такой метод И такой (С++сник бы наверное так и сделал?), но увы: джавари слишком тупы
                      Ответить
                      • Ну есть же аналог string_view. CharSequence или как там его.

                        З.Ы. Ну т.е. просто subSequence() позвать вместо subString() если нужно старое поведение, лол.

                        Только не говори, что сиквенсы тоже копируются.
                        Ответить
                        • Вот тебе реализация этого метода в классе String
                          public CharSequence subSequence(int beginIndex, int endIndex) {
                                  return this.substring(beginIndex, endIndex);
                              }
                          Ответить
                          • Блядь. А zero-copy реализацию этого интерфейса не завезли?
                            Ответить
                            • можыш сам написать. У тебя есть же ``char[]``
                              Ответить
                              • Ну в каком нибудь бусте апаче коммонс оно же есть?

                                З.Ы. CharBuffer + slice() или subSequence() походу должен прокатить. У них в доке есть гарантия что буфера расшарены.
                                Ответить
                      • Помнится, разработчики «V8» знатно поебались над такой же проблемой, но в итоге таки смогли: теперь в ЙАЖАСцрипте строки хранятся в хитрых деревьях, и взятие подстроки там — что-то вроде логарифма, причём не таскающего за собой исходную строку. Правда, ЕМНИП, сборка строки тоже стала O(NlogN) занимать, но этого никто не заметил.
                        Ответить
                        • ropes что ли?
                          Ответить
                          • Да, точно, спасибо: https://github.com/component/rope https://en.wikipedia.org/wiki/Rope_(data_structure).
                            Но я таки напиздел, логарифмический там только random access, а подсрока осталась O(N).

                            UPD: Тьфу, не посмотрел на ссылку внимательно, там какая-то питушня.
                            Ответить
                            • > не посмотрел на ссылку

                              Надо было ещё что-нибудь про сборку SOAP запросов с помощью этой Rope скинуть, чтобы роскомнадзор забанил за пропаганду.
                              Ответить
                        • А ведь чего проще было бы сделать два API.

                          Неужели все (кроме си и си плюс плюс) программисты недостаточно умны, чтобы ответить на вопрос: вы хотите копию, или указатель на кусочек данных?
                          Ответить
                          • В тред призывается Uncaught SyntaxError: invalid increment/decrement operand.

                            Прикладной программист не обязан думать над такими низкоуровневыми вещами.
                            Ответить
                  • Ну тот, кто завязался на сложность substring по времени O(1) вместо O(len(substr)) - соснул, верно?
                    Ответить
                    • Да, и это тоже, ведь копирование тоже не бесплатное.
                      Но в джава есть ГЦ, так что нужно еще учесть время на удаление
                      Ответить

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