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

  • А нельзя ли форматирование кода сделать еще более хуевым?
    Ответить
    • Видимо в сотню строк не входило.

      З.Ы. Почему мне так хочется натравить "AFL" на этот код?
      Ответить
      • > Видимо в сотню строк не входило.

        Эмм, "форматирование хуевое, потому что в 100 строк приходится укладываться", или "в 100 строках нельзя передать всю хуевость форматирования, и поэтому форматирование кода не сделать еще более хуевым"?

        Вообще, тут даже с идентацией косяки, нет отступов для do цикла
        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()); }

        А отступы никак на количество строк не влияют
        Ответить
        • Я про всякие default: return false; break; } } которыми явно под лимит строк подгоняли.
          Ответить
          • > return false; break; } }
            Так это смайлик.
            Какой break после return )))
            Ответить
            • Какой break }}}
              На самом деле писать break в любом не-fallthrough case — неплохая привычка. Сейчас там return, а через месяц его заменят на какой-нибудь вызов — и привет, дико неприятный и трудноуловимый баг.
              Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8