- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 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; }
Немного расширил функционал говнокода с учётом замечаний (в том числе и по архитектуре).
YpaHeLI_ # 0
https://www.meme-arsenal.com/memes/3cbffb268177fe3b23f7aaca6677239e.jpg
guest # 0 ⇈
gostinho # 0
bormand # 0 ⇈
MAKAKA # 0 ⇈
Хочется najti_naibolshy_obshy_delitel(int, int) ?
1024-- # 0
Подзадачи "получить исходные данные", "посчитать квадратное уравнение", "посчитать питушню, которая использует его корни", "вывести данные" сливаются. Код, связанный с вбрасыванием исходных данных в решатель уравнения, а также связанный с печатью результатов, заставляет изменять код решателя. Но в то же время, алгоритмы вычисления и формулы корней квадратного уравнения в математике не зависят от того, как происходит их ввод и вывод. Это свойство полезно сохранить и в коде. Математические алгоритмы не должны знать о том, откуда появились коэффициенты (от пользователя или из массива) и куда они направляются далее (пользователю или ещё куда).
Я бы подумал над тем, как выделить часть, которая отвечает за решение уравнения, поскольку она является "движком" в данной задаче, на основе которого можно решать эту и сходные задачи пользователя.
Как может выглядеть такой класс?
1. Конструктор принимает коэффициенты через переданные аргументы
2. Есть "математические" методы вида "дискриминант" и "решение уравнения" (количество корней, в т.ч. бесконечность и сами корни). Может быть, "дискриминант", "количество корней", "корень n" (n=0 или 1). Они позволяют получить число и использовать его в программе далее.
3. Может быть, операторы ввода из потока и вывода в поток, но не факт, что они нужны в самом классе.
Может быть, для решения квадратного уравнения не нужен класс, достаточно только функции. Она принимает коэффициенты и возвращает решение в каком-то виде.
Остальной код будет строиться на использовании решателя квадратного уравнения, например:
bormand # 0 ⇈
gostinho # 0 ⇈
bormand # 0 ⇈
Мартыwка к старости слаба глазами стала?
То не на тот коммент ответит, то кого-нибудь лишнего в уёбки запишет.
Desktop # 0 ⇈
bormand # 0 ⇈
1024-- # 0 ⇈
gost # 0 ⇈
Ты давно бормандскую диссертацию закончил?
1024-- # 0 ⇈
bormand # 0 ⇈
Как там в соседнем треде -- надо одеться приличнее, какую-нибудь цепочку нацепить, походить в качалку и потренироваться на кошках.
bormand # 0 ⇈
Х.з., я бы госту передал это почётное бремя. Он и нгк подхватил и стандарт цитирует вместо меня и на аниме подсел. Идеальный кандидат.
gost # 0 ⇈
Отрицаю.
CHayT # 0 ⇈
bormand # 0 ⇈
bootcamp_dropout # 0 ⇈
bormand # 0 ⇈
bootcamp_dropout # 0 ⇈
bormandinho # 0 ⇈
guest3 # 0 ⇈
CBuHOKYP # 0 ⇈
1024-- # 0 ⇈
> норм получается
Пара комментариев на ГК не считается, надо целый семестр продержаться.
bormand # 0 ⇈