-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSquare_Equation.c
More file actions
151 lines (115 loc) · 3.37 KB
/
Square_Equation.c
File metadata and controls
151 lines (115 loc) · 3.37 KB
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <stdio.h>
#include <math.h>
#include <float.h>
#include <TXLib.h>
const int infinitely_roots = -1; ///< константа для провеки бесконечно ли корней у уравнения
/*!
\brief Знак больше
\param a, b Сравнивыемые значения
\return 0 - если "a" меньше или равно "b", 1 - если "a" больше "b"
Функция сранивает два числа с точностью до 2e-16
*/
int IsGreater(double a, double b)
{
return ((a - b) > DBL_EPSILON)? 1 : 0;
}
/*!
\brief Равенство
\param a, b Сравнивыемые значения
\return 0 - если "a" не равно "b", 1 - если "a" равно "b"
Функция сранивает два числа с точностью до 2e-16
*/
int DblEquals(double a, double b)
{
return (abs(a - b) < DBL_EPSILON) ? 1 : 0;
}
/*!
\brief Решение квадратного уравнения
\param [in] a, b, c Коэффиценты квадратного уравнения
\param [out] x1, x2 Корни уравнения
\return 0, 1, 2 - колличество корней; infinitely_roots(-1) - бессконечное количество корней
Функция решает квадратное уравнение, возращая количество корней и сами корни, учитывая все ситуации
*/
int SolveSquerEq(double a, double b, double c, double* x1, double* x2)
{
assert(x1);
assert(x2);
if (DblEquals(a, 0.0))
{
if (DblEquals(b, 0.0))
{
return (DblEquals(c, 0.0)) ? infinitely_roots : 0;
}
else // if (b =! 0)
{
*x1 = -c / b;
return 1;
}
}
else // if (a =! 0)
{
double D = b*b - 4*a*c;
if (DblEquals(D, 0.0))
{
*x1 = -b / 2*a;
return 1;
}
else if (IsGreater(D, 0.0))
{
double sqrt_D = sqrt(D);
*x1 = (-b + sqrt_D) / (2*a);
*x2 = (-b - sqrt_D) / (2*a);
return 2;
}
else return 0; // if (D < 0)
}
}
/*!
\brief Вывод уравнения на экран
\param a, b, c Коэффиценты квадратного уравнения
Функция выводит на экран квадратное уравнение, учитывая наличие или отсутствие коэффицента и его знак
*/
void DrawEquation(double a, double b, double c)
{
printf("Your equation: ");
if (!DblEquals(a, 0.0))
printf("%lgx^2", a);
if (!DblEquals(b, 0.0))
printf("%+lgx", b);
if ((!DblEquals(c, 0.0)) || (DblEquals(a, 0.0) && DblEquals(b, 0.0)))
printf("%+lg", c);
printf("=0\n");
}
/*!
\brief Главная функция
Функция вызывает все остальные функции, принимает коэффиценты квадратного уравнения от пользователя, и выводит на экран ответ
*/
int main()
{
printf("Square_Equation 2020\n");
printf("Enter a, b, c coefficients: ");
double a = 0, b = 0, c = 0;
scanf("%lg %lg %lg", &a, &b, &c);
DrawEquation(a, b, c);
double x1 = 0, x2 = 0;
int nRoots = SolveSquerEq(a, b, c, &x1, &x2);
switch (nRoots)
{
case 0:
printf("No roots\n");
break;
case 1:
printf("x = %lg\n", x1);
break;
case 2:
printf("x1 = %lg, x2 = %lg", x1, x2);
break;
case infinitely_roots:
printf("Any number");
break;
default:
printf("main(): ERROR: nRoots = %d\n", nRoots);
return 1;
}
return 0;
}