Кресты / Говнокод #27170 Ссылка на оригинал

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
  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 Westnik_Govnokoda, (Updated )

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

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

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

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

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

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

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

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

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

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

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

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

                              З.Ы. CharBuffer + slice() или subSequence() походу должен прокатить. У них в доке есть гарантия что буфера расшарены.
                              Ответить
                    • Помнится, разработчики «V8» знатно поебались над такой же проблемой, но в итоге таки смогли: теперь в ЙАЖАСцрипте строки хранятся в хитрых деревьях, и взятие подстроки там — что-то вроде логарифма, причём не таскающего за собой исходную строку. Правда, ЕМНИП, сборка строки тоже стала O(NlogN) занимать, но этого никто не заметил.
                      Ответить
                          • > не посмотрел на ссылку

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

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

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

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

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

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


    8