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

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
// https://www.linux.org.ru/forum/development/16099510/
// c++ шаблон zip-like итератора? 
// В python есть крайне полезные функции zip, enumerate, range. Мне нужно что-то подобное для cpp/cuda (c++17).
// Если c range и enumerate более менее понятно, то как реализовать zip не соображу. Семантически это должно быть variadic template

template<typename t, typename... ts>
class zip : zip<ts...>{
	zip(t arg, ts... args);
	struct iterator;
	begin() -> iterator;
	end()   -> iterator;
};

// Где итератор возвращает кортеж ссылок на элементы что с контейнерами можно было работать как:

for(auto [x,y,z] : zip(xs,ys,zs))

// Рекурсивное наследование должно быть ограничено тривиальным случаем одного аргумента.
//Но, кажется, я думаю не в правильную сторону, в частности, не соображу как рекурсивно вывести тип возвращаемых итератором кортежей:

using ret_type = tuple<decltype(begin(declval<t>())), decltype(???)>

Блять, как всё сложно. Какие-то рекурсивные выводы типов возвращаемых итераторов кортежей блядь.

Вот если б вместо ущербного триждыблядского типодрочерского шаблоноговна сделали что-то помощнее...

j123123 j123123, (Updated )

Комментарии (11, +11)

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

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>
using namespace std;
const char _Arr_Digit [] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'},
    _Arr_Mantissa [] = {'e', 'E'},
    _Arr_Sign [] = {'-', '+'},
    _Arr_Dot[] = {'.'},
    _Arr_Combo[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.'};
const bool DIGIT = false, SIGN = false, OTHER = true;  
bool _Call_Mantissa = false,  _flag_dot = false, _flag_mant = false;
int _position_mant;
bool Parse_symbol (char _symb, const char* _Arr, int _size_arr);
bool Parse_full_string (string _checking, int _offset, int _amount, bool _sec_cond, const char* _Arr, int _size_arr, bool _Drive);   
bool Parse_the_first_symbol (string _checking);
bool Parse_the_second_symbol (string _checking);
bool Control_result (int i, string _checking);
bool Parse_mantissa (string _checking);
bool Parse_full_string_before_mantissa (int i, string _checking);
bool Parse_the_first_symbol_after_mantissa (string _checking);
bool Parse_full_string_after_mantissa (string _checking);
long double Questioning (char s);
long double Questioning (char s) {
    string _checking;
    while (true) {  
        cout << "Введите значение " << s << ": ";
        getline(cin, _checking);  
        if (_checking.length() == 0) 
            cout << "Вы не ввели значение!" << endl;   
        else if (!Parse_the_first_symbol(_checking)) 
            cout << "Некорректное значение!" << endl;  
        else return strtold(_checking.c_str(), nullptr); }}
bool Parse_symbol (char _symb, const char* _Arr, int _size_arr) {
    for (int i = 0; i <= _size_arr; i++)  
        if (_symb == _Arr[i]) return true;
    return false; }
bool Parse_full_string (string _checking, int _offset, int _amount, bool _sec_cond, const char* _Arr, int _size_arr, bool _Drive) {  
    bool _parse_flag;
    int _parse_count = 0;
    for (int j = _offset; j < _amount; j++) {
        if (Parse_symbol(_checking[j], _Arr, _size_arr)) {
            _parse_count++;
            if (_sec_cond) return false;
            if (_Drive) {
                if (_Call_Mantissa)
                    _sec_cond = (j == (_amount-1));
                if (_parse_flag) return false;
                _parse_flag = true;
                if (_Call_Mantissa) {
                    _flag_mant = _parse_flag;
                    _position_mant = j; 
                }
            }
        }
    }
   if (!_Drive) { 
       if ((_amount - _offset) == _parse_count) return true;
       else return false; 
    }
   else return true; 
}
bool Parse_the_first_symbol (string _checking) {
  int LENGTH = _checking.length();
  bool _parse_cond = (LENGTH < 2);
  if (Parse_full_string (_checking, 0, 1, _parse_cond, _Arr_Sign, 1, SIGN)) 
      return Parse_the_second_symbol (_checking);
  else if (Parse_full_string (_checking, 0, 1, false, _Arr_Digit, 9, DIGIT))
      return Control_result (0, _checking);
  else return false; }
bool Parse_the_second_symbol (string _checking) {
    if (Parse_full_string (_checking, 1, 2, false, _Arr_Digit, 9, DIGIT)) 
        return Control_result (1, _checking);
    else return false; }
bool Control_result (int i, string _checking) {    
    if (!Parse_mantissa (_checking)) return false;    
    else if (_flag_mant) {
        string _before_mantissa = _checking.substr(0, _position_mant);
        string _after_mantissa = _checking.substr(_position_mant + 1);
        return (Parse_full_string_before_mantissa (i, _before_mantissa)
                && Parse_the_first_symbol_after_mantissa (_after_mantissa)); } 
    else return Parse_full_string_before_mantissa (i, _checking); }
bool Parse_mantissa (string _checking) {
    int LENGTH = _checking.length();
    _Call_Mantissa = true;   
    bool cash = Parse_full_string (_checking, 0, LENGTH, false, _Arr_Mantissa, 1, OTHER);
    _Call_Mantissa = false;
    return cash; }
bool Parse_full_string_before_mantissa (int i, string _checking) { // but the first symbol  
    int LENGTH = _checking.length();
    return Parse_full_string (_checking, i, LENGTH, false, _Arr_Dot, 0, OTHER) &&
        Parse_full_string (_checking, i, LENGTH, false, _Arr_Combo, 10, DIGIT); }
bool Parse_the_first_symbol_after_mantissa (string _checking) {
    int LENGTH = _checking.length();
    bool _parse_cond = (LENGTH < 2);
    if ((Parse_full_string (_checking, 0, 1, _parse_cond, _Arr_Sign, 1, SIGN)) ||
        (Parse_full_string (_checking, 0, 1, false, _Arr_Digit, 9, DIGIT)))
        return Parse_full_string_after_mantissa (_checking);
    else return false; }
bool Parse_full_string_after_mantissa (string _checking) {
    int LENGTH = _checking.length();
    return Parse_full_string (_checking, 1, LENGTH, false, _Arr_Digit, 9, DIGIT); }

Очередная говнопопытка оптимизации алгоритма.

Westnik_Govnokoda Westnik_Govnokoda, (Updated )

Комментарии (146, +146)

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

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 <cmath>
#include <iomanip>
#include "govno.h"
using namespace std;
void prnt_msg_start() {
    cout << endl << "Программа решения квадратного уравнения по формуле: ";
    cout << "aX^2 + bX + c = 0" << endl;
    cout << setprecision(69) << endl; }
long double ks[] = {1, 2, 1, 3, 10, 2};
class SqrtQual {
    const string msg_not_roots = "Нет корней!\n",
        msg_any_number = "X -- любое число.\n",
        msg_special_event = "Решение частного случая (bX + c = 0):\n",
        msg_discrim = "Дискриминант = ";
    long double A, B, C, D, X1, X2;
    bool flag_roots = true, flag_equal_zero, flag_special_event, flag_not_equal_zero,
        flag_any_number, flag_input = true, flag_abs_roots, flag_cubes_roots;
    void init_fields();
    string answer();
    bool to_decide();
    void to_start();
    public:
    SqrtQual ();
    SqrtQual (int z);
    SqrtQual (long double a, long double b, long double c);
};
void variation_task(int variant) {
    if (!variant) SqrtQual obj; 
    else {
        for (int i = 0, j = 0; i < 2; i++, j += 3) { 
            if (variant < 2) SqrtQual obj(ks[j], ks[j+1], ks[j+2]); 
            else SqrtQual obj(i);
        }
    }
}
int main() {
    prnt_msg_start();
    for (int i = 1; i < 3; i++) variation_task(i);
}
SqrtQual::SqrtQual(int z) {
    if (z) flag_abs_roots = true;
    else flag_cubes_roots = true; 
    to_start(); }
SqrtQual::SqrtQual() {
    to_start(); }
SqrtQual::SqrtQual(long double a, long double b, long double c) {
    A = a;
    B = b;
    C = c;
    flag_input = false;
    to_start(); }
void SqrtQual::to_start() {
    cout << endl;
    if (flag_input) Govnokod l_obj(A, B, C);
    init_fields();
    cout << answer(); }
void SqrtQual::init_fields() {
    flag_any_number = ((A == 0) && (B == 0) && (C == 0));
    flag_not_equal_zero = ((A == 0) && (B == 0) && (C != 0));
    flag_special_event = ((A == 0) && (B != 0) && (C != 0));
    bool equal_zero_v1 = ((A == 0) && (B != 0) && (C == 0));
    bool equal_zero_v2 = ((A != 0) && (B == 0) && (C == 0));
    flag_equal_zero = equal_zero_v1 || equal_zero_v2;
    D = B*B - 4*A*C;
    if ((D < 0) || flag_not_equal_zero) 
        flag_roots = false; }
string SqrtQual::answer() {
    string tmp = msg_discrim + to_string(D) + "\n";
    if (flag_special_event)
        tmp = msg_special_event + tmp; 
    if (flag_any_number)
        return msg_any_number;
    else if (not flag_roots)
        return msg_not_roots;
    else {
        bool flag_args = to_decide();
        string root1("X = "), root2("X2 = ");
        if (flag_abs_roots) {
            root1 = "| X | = ", root2 = "| X2 | = ";
            X1 = abs(X1), X2 = abs(X2);
        }
        else if (flag_cubes_roots) {
            root1 = "X ^3 = ", root2 = "X2 ^3 = ";
            X1 = pow(X1, 3), X2 = pow(X2, 3);
        }    
        tmp += root1 + to_string(X1) + "\n";
        if (flag_args) 
            tmp += root2 + to_string(X2) + "\n";
    }  
    return tmp;
}
bool SqrtQual::to_decide() /* if true then two roots else one root */ {  
    if (flag_equal_zero) X1 = 0;
    else if (flag_special_event) X1 = (-C/B); // special event
    else if (D == 0) X1 = (-B/2*A);
    else {
        X1 = ((-B + sqrt(D)) / 2*A), X2 = ((-B - sqrt(D)) / 2*A);
        return true; }
    return false; }

Немного расширил функционал говнокода с учётом замечаний (в том числе и по архитектуре).

Westnik_Govnokoda Westnik_Govnokoda, (Updated )

Комментарии (27, +27)

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

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
#include <iostream>
#include <cmath>
#include "govno.h"
using namespace std;

class SqrtQual {
    const string not_kor = "Нет корней!\n";
    long double A;
    long double B;
    long double C;
    long double D;
    void vspomog();
    void konez();
    public:
    void hello();
} obj;

int main() {
    obj.hello();
}

void SqrtQual::hello() { 
    cout << "Программа решения квадратного уравнения по формуле: ";
    cout << "aX^2 + bX + c = 0" << endl;
    Govnokod obj;
    A = obj.opros('a');
    B = obj.opros('b'); 
    C = obj.opros('c');                              
    cout << endl;
    konez(); 
}

void SqrtQual::vspomog() {
    D = B*B - 4*A*C;
    cout << "Дискриминант = " << D << endl;
    
    if (D < 0)
        cout << not_kor;
    
    else if (D == 0)
        cout << "X = " << (-B/(2*A));
    
    else {
        long double dsqrt = sqrt(D);
        cout << "X1 = " << ((-B + dsqrt) / 2*A) << endl;
        cout << "X2 = " << ((-B - dsqrt) / 2*A) << endl;
    }        
}

void SqrtQual::konez() {
    bool any_digit = ((A == 0) 
                  and (B == 0) 
                  and (C == 0));
    
    bool not_equal_zero = ((A == 0) 
                       and (B == 0) 
                       and (C != 0));
    
    bool equal_zero_v1 = ((A == 0) 
                      and (B != 0) 
                      and (C == 0));
    
    bool equal_zero_v2 = ((A != 0) 
                      and (B == 0) 
                      and (C == 0));
    
    bool equal_zero = equal_zero_v1
                   or equal_zero_v2;
                   
    bool bx_plus_c = ((A == 0) 
                  and (B != 0) 
                  and (C != 0));
    
    if (any_digit) 
        cout << "X -- любое число." << endl;
    
    else if (not_equal_zero) {
        cout << C << " != 0" << endl;
        cout << not_kor; 
    }
    
    else if (equal_zero) 
        cout << "X = 0" << endl;
    
    else if (bx_plus_c) {
        cout << "Решение частного случая (bX + c = 0):" << endl;
        cout << "X = " << (-C/B) << endl;
    }
    
    else vspomog(); 
}

Попытался убрать лишнее из кода, возможно стало немного лучше, но это не точно...

Westnik_Govnokoda Westnik_Govnokoda, (Updated )

Комментарии (6, +6)

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

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 <cmath>
#include "govno.h"
using namespace std;
class SqrtQual {
    const string not_kor = "Нет корней!\n";
    struct ABC {
        long double kA;
        long double kB;
        long double kC;
    } gABC;
    long double diskrim(long double a, long double b, long double c);
    void diskrim_zero(long double a, long double b);
    void diskrim_bolshe(long double a, long double b, long double d);
    void vspomog();
    void konez();
    void m_bx_plus_c();
    public:
    void hello();
} obj;
int main() {
    obj.hello();
}
void SqrtQual::hello() { 
    cout << "\nПрограмма вычисления корней квадратного уравнения по формуле: ";
    cout << "aX^2 + bX + c = 0\n";
    Govnokod obj;
    gABC.kA = obj.opros('a');
    gABC.kB = obj.opros('b'); 
    gABC.kC = obj.opros('c');                              
    cout << endl;
    konez(); 
}
long double SqrtQual::diskrim(long double a, long double b, long double c) {   
    long double ac4 = 4*a*c;
    long double bkv = pow(b, 2);
    long double d = bkv - ac4;
    cout << "Дискриминант = " << d << endl;
    return d; 
}
void SqrtQual::diskrim_zero(long double a, long double b) {
    if (a == 0)
        cout << not_kor;  
    else {
        long double x = -b/(2*a);
        cout << "X = " << x; 
    }
}
void SqrtQual::diskrim_bolshe(long double a, long double b, long double d) {
    if (a == 0)
        cout << not_kor;    
    else {
        long double dsqrt = sqrt(d);
        long double a2 = a * 2;
        long double x1 = (-b + dsqrt) / a2;
        long double x2 = (-b - dsqrt) / a2;
        cout << "X1 = " << x1 << endl;
        cout << "X2 = " << x2 << endl; 
        }
}
void SqrtQual::m_bx_plus_c() {
    long double x = -gABC.kC/gABC.kB;
    cout << "X = " << x << endl;
}
void SqrtQual::vspomog() {
    long double D = diskrim(gABC.kA, gABC.kB, gABC.kC);
    if (D < 0)
        cout << not_kor;
    else if (D == 0)
        diskrim_zero(gABC.kA, gABC.kB);
    else
        diskrim_bolshe(gABC.kA, gABC.kB, D);
}
void SqrtQual::konez() {
    bool any_digit = ((gABC.kA == 0) and 
    (gABC.kB == 0) and 
    (gABC.kC == 0));
    bool not_equal_zero = ((gABC.kA == 0) and 
    (gABC.kB == 0) and 
    (gABC.kC != 0));
    bool equal_zero_v1 = ((gABC.kA == 0) and 
    (gABC.kB != 0) and 
    (gABC.kC == 0));
    bool equal_zero_v2 = ((gABC.kA != 0) and 
    (gABC.kB == 0) and 
    (gABC.kC == 0));
    bool equal_zero = equal_zero_v1 or equal_zero_v2;
    bool bx_plus_c = ((gABC.kA == 0) and (gABC.kB != 0));
    if (any_digit) 
        cout << "X -- любое число."; 
    else if (not_equal_zero) {
        cout << gABC.kC << " -- Не равно нулю!";
        cout << not_kor; }
    else if (equal_zero) 
        cout << "X = 0";
    else if (bx_plus_c) 
        m_bx_plus_c();
    else vspomog(); 
}

Вот для этой проги я писал предыдущие говнокоды. Тут нет решений для множества комплексных чисел пока что.

Westnik_Govnokoda Westnik_Govnokoda, (Updated )

Комментарии (11, +11)

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

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) {
        if (stroka.length() == 0) return false;
        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; }}
    string cut_incorrect_symbol(const 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.push_back(stroka[j]); 
                break;
            default: i++; break; }}
    return buf; }
    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(cut_incorrect_symbol(argument))) cout << "Некорректное значение!" << endl;
            else return strtold(argument.c_str(), nullptr); }}};

Модифицированная версия говнокода проверки строки на корректность соответствия символов типу long double: изначально вырезаются все левые символы. А вообще этот модуль "govno.h", я написал для основной проги для решения квадратного уравнения.

Westnik_Govnokoda Westnik_Govnokoda, (Updated )

Комментарии (11, +11)

Кресты / Говнокод #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 )

Комментарии (9, +9)

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

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
#include <iostream>
#include <string>
using namespace std;
bool vetka1(bool &flag, int i, const string stroka) {    
    int j = 1;
    for (j += i; j < stroka.length(); j++) {            
            switch (stroka[j]) {              
            case '.':              
                if (flag) return false;
                flag = true;
                break;                        
       case '1' ... '9': break;    
            default: return false; } }    
    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; } }
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, bool &flag, int &index) {
    for (int j = 0; j < stroka.length(); j++) {       
        switch (stroka[j]) {         
        case 'e':
        case 'E':        
            if (flag) return false;
            if (j == (stroka.length() - 1)) return false;
            flag = true;
            index = j;
            break; } }
    return true; }
bool Dalshe(int i, const string stroka) {    
    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(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; } }
long double opros(char s) {    
    string argument;    
    do {
    cout << "Введите значение " << s << ": ";
    getline(cin, argument);
    if (argument.length() == 0) cout << "Вы не ввели значение!" << endl;    
    else if (not general_proverka(argument)) cout << "Некорректное значение!" << endl;          
    else break;
    } while (true);    
    return atof(argument.c_str()); } 
int main() {    
    for (char i = 'a'; i < 'd'; i++) {       
        long double a = opros(i);
        cout << "Значение: " << a << " - корректное!" << endl; 
} 
}

В общем, частично переписал некоторые куски кода. Отчасти тут предыдущая версия (с дублированием кода),
что, конечно, не менее говно, но зато стало чуть читабельнее и работает без очевидных багов, как в исходной версии,
например: если в исходной версии ввести - "3w", то значение отображалось, как корректное, что не верно.

Westnik_Govnokoda Westnik_Govnokoda, (Updated )

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