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

    0

    1. 001
    2. 002
    3. 003
    4. 004
    5. 005
    6. 006
    7. 007
    8. 008
    9. 009
    10. 010
    11. 011
    12. 012
    13. 013
    14. 014
    15. 015
    16. 016
    17. 017
    18. 018
    19. 019
    20. 020
    21. 021
    22. 022
    23. 023
    24. 024
    25. 025
    26. 026
    27. 027
    28. 028
    29. 029
    30. 030
    31. 031
    32. 032
    33. 033
    34. 034
    35. 035
    36. 036
    37. 037
    38. 038
    39. 039
    40. 040
    41. 041
    42. 042
    43. 043
    44. 044
    45. 045
    46. 046
    47. 047
    48. 048
    49. 049
    50. 050
    51. 051
    52. 052
    53. 053
    54. 054
    55. 055
    56. 056
    57. 057
    58. 058
    59. 059
    60. 060
    61. 061
    62. 062
    63. 063
    64. 064
    65. 065
    66. 066
    67. 067
    68. 068
    69. 069
    70. 070
    71. 071
    72. 072
    73. 073
    74. 074
    75. 075
    76. 076
    77. 077
    78. 078
    79. 079
    80. 080
    81. 081
    82. 082
    83. 083
    84. 084
    85. 085
    86. 086
    87. 087
    88. 088
    89. 089
    90. 090
    91. 091
    92. 092
    93. 093
    94. 094
    95. 095
    96. 096
    97. 097
    98. 098
    99. 099
    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, 27 Декабря 2020

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

    • > Кодстайл
      https://www.meme-arsenal.com/memes/3cbffb268177fe3b23f7aaca6677239e.jpg
      Ответить
    • Что-то давно вестник говнокода не вещал.
      Ответить
    • У Вас получается нехорошая питушня с точки зрения архитектуры в некоторых местах.

      Подзадачи "получить исходные данные", "посчитать квадратное уравнение", "посчитать питушню, которая использует его корни", "вывести данные" сливаются. Код, связанный с вбрасыванием исходных данных в решатель уравнения, а также связанный с печатью результатов, заставляет изменять код решателя. Но в то же время, алгоритмы вычисления и формулы корней квадратного уравнения в математике не зависят от того, как происходит их ввод и вывод. Это свойство полезно сохранить и в коде. Математические алгоритмы не должны знать о том, откуда появились коэффициенты (от пользователя или из массива) и куда они направляются далее (пользователю или ещё куда).

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

      Как может выглядеть такой класс?
      1. Конструктор принимает коэффициенты через переданные аргументы
      2. Есть "математические" методы вида "дискриминант" и "решение уравнения" (количество корней, в т.ч. бесконечность и сами корни). Может быть, "дискриминант", "количество корней", "корень n" (n=0 или 1). Они позволяют получить число и использовать его в программе далее.
      3. Может быть, операторы ввода из потока и вывода в поток, но не факт, что они нужны в самом классе.

      Может быть, для решения квадратного уравнения не нужен класс, достаточно только функции. Она принимает коэффициенты и возвращает решение в каком-то виде.

      Остальной код будет строиться на использовании решателя квадратного уравнения, например:
      Equation equation(1, 10, 4);
      double x1, x2;
      if (equation.solve(x1, x2) == 2) { // 2 корня
        Equation equation2(x1, 2*x2, 0.5); // корни одного уравнения как коэффициенты другого
        if (equation2.D() > 0) {
          std::cout << x1 << " and " << x2 << " are cool numbers." << std::endl;
        }
      }
      Ответить
      • Не думал в преподы податься? Вроде норм получается.
        Ответить
        • 1024--, ты давно пед окончил?
          Ответить
          • > 1024--

            Мартыwка к старости слаба глазами стала?

            То не на тот коммент ответит, то кого-нибудь лишнего в уёбки запишет.
            Ответить
        • мне иногда кажется, что тут половина гк это преподы
          Ответить
          • Да ну. Разве что репетитором к кому-то кто реально хочет научиться... Обычное преподавательство это ж пиздец и бюрократия.
            Ответить
          • Я вообще думал, что учился в вузе у Борманда. Но оказалось, что я у него учился только на ГК. У кандидата в борманды нет времени читать все эти сайты.
            Ответить
            • > кандидата в борманды
              Ты давно бормандскую диссертацию закончил?
              Ответить
              • Говорят, бормандскую премию не дают ма-те-ма-ти-кам из раш-ки. Какая несправедливость )))
                Ответить
                • > не дают

                  Как там в соседнем треде -- надо одеться приличнее, какую-нибудь цепочку нацепить, походить в качалку и потренироваться на кошках.
                  Ответить
            • > кандидата в борманды

              Х.з., я бы госту передал это почётное бремя. Он и нгк подхватил и стандарт цитирует вместо меня и на аниме подсел. Идеальный кандидат.
              Ответить
        • Если говорить о постоянной работе, то нет. Соотношение нагрузка/зарплата очень неудачное плюс сезонные обострения питушни, когда заканчивается семестр (отметим, что каждый год приходят разные студенты одного и того же возраста, и сколько ни преподавай, они никогда не повзрослеют и не станут разбираться с учёбой вовремя), либо грядёт новая питушня с документами (а официалушня никогда не меняется). Если преподавать больше двух курсов за семестр, то можно поехать кукухой.

          > норм получается
          Пара комментариев на ГК не считается, надо целый семестр продержаться.
          Ответить
          • Ну ты один семестр продержись, а дальше 50 лет копипастой. Пофиг, что не актуально.
            Ответить

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