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

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
  100. 100
#include <iostream>
#include <string>
using namespace std;
class Govnokod {
    bool _flag_dot;
    bool _flag_mant;
    int _index_mant;
    bool vetka1(int i, const string stroka) {
        for (int j = i++; j < stroka.length(); j++) {
            switch (stroka[j]) {
            case '.':  
                if (_flag_dot) return false;
                _flag_dot = true;
                break;     
            case '0' ... '9': break; 
            default:
                return false;
                break; }}
        return true;}
    bool vetka2_dalshe(const string stroka) {
        for (int j = 1; j < stroka.length(); j++) {
            switch (stroka[j]) {
            case '0' ... '9': break;
            default:
                return false;
                break; }} 
        return true; }
    bool vetka2(const string stroka) {
        switch (stroka[0]) {
        case '+':
        case '-':
            if (stroka.length() < 2) return false;  
            return vetka2_dalshe(stroka);
            break;   
        case '0' ... '9':
            return vetka2_dalshe(stroka);
            break;
        default:
            return false;
            break; }}
    bool mantissa(const string stroka) {
       for (int j = 0; j < stroka.length(); j++) {
           switch (stroka[j]) {
           case 'e':
           case 'E':            
               if ((_flag_mant) or (j == (stroka.length() - 1))) return false;
               _flag_mant = true;
               _index_mant = j;
               break; }}
       return true; }
    bool Dalshe(int i, const string stroka) {
        _flag_dot = false;
        _flag_mant = false;
        if (not mantissa(stroka)) return false;
        else if (_flag_mant) {
            string sub1 = stroka.substr(0, _index_mant);
            string sub2 = stroka.substr(_index_mant+1);
            return (vetka1(i, sub1) and vetka2(sub2)); }
        else return vetka1(i, stroka); }
    bool proverka(const string stroka) {
        switch (stroka[1]) {
        case '0' ... '9':
            return Dalshe(1, stroka);
            break;   
        default:
            return false;
            break; }}
    bool general_proverka(const string stroka) {
        switch (stroka[0]) {
        case '-':
        case '+':
            if (stroka.length() > 1) return proverka(stroka);
            else return false;
            break;  
        case '0' ... '9':
            return Dalshe(0, stroka);
            break; 
        default:
            return false;
            break; }}
    public:
    long double opros(char s) {
        string argument;
        while (true) {
            cout << "Введите значение " << s << ": ";
            getline(cin, argument);
            if (argument.length() == 0)
                cout << "Вы не ввели значение!" << endl;
            else if (not general_proverka(argument))
                cout << "Некорректное значение!" << endl;
            else 
                return strtold(argument.c_str(), nullptr); }
    }
    } obj;
int main() {
    for (char c = 'a'; c < 'd'; c++) {
        long double result = obj.opros(c);
        cout << "Значение: " << result << " -- корректное!" << endl;
    }
}

Решил попробовать в стиле ООП переписать.

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

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

  • Также решил написать функцию, которая бы вырезала все левые символы из строки, а затем результат этой функции передать аргументом методу general_proverka(). Однако столкнулся со странными багами: в cout без преобразования в Си-строку не отображается результат, но даже если и преобразование осуществить, все равно будто бы в переменной buf сохраняются её старые значения от предыдущих вызовов функции, но эта переменная не объявлена, как статичная...

    string cut_incorrect_symbol(string stroka) {
    int j, i;
    string buf;
    for (j = 0, i = 0; j < stroka.length(); j++) {
    switch (stroka[j]) {
    case '0' ... '9':
    case '-':
    case '+':
    case '.':
    case 'e':
    case 'E':
    buf[j-i] = stroka[j];
    break;
    default:
    i++;
    break;
    }
    }
    cout << "Значение buf == " << buf << endl;
    return buf;
    }
    Ответить
    • > string buf;
      > buf[j-i] = stroka[j];

      Типичный вылет за границы буфера. В данном случае buf[...] вообще нельзя трогать т.к. конструктор по-умолчанию создаёт строку пустой (нулевой длины). Иначе ты перетираешь чужую память и получаешь неопределённое поведение.

      Можешь добавлять в неё символы push_back()'ом. Либо resize()'нуть до нужного размера перед тем как лезть к ней скобочками.
      Ответить
      • такая хуйня со строками даже в руби не сработает, лол. А вот с массивом/списком чаров в скриптушне должна сработать
        Ответить
  • - Саламатина, закрыла бы ты рот свой лесбийский, - чуть не кинулся на неё Серый.
    Ответить

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

Из-за тебя ушел bormand, guest!

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


    8