h»/* p11 (2)Биквадратное уравнениеЯзык Visual C++ 6.0 */class CP11Doc:public CDocument{protected:CP11Doc ();DECLARE_DYNCREATE (CP11Doc);int aa, ab, ac; // исходные данные - целые числаint ad, ae, af; // исходные данные - натуральные числаint ag, ah; // указатель ввода в строку данных, <Enter>int ai, aj; // внутренние переменные для передачи данныхchar ba [50]; // место для вводимых символовCString bd [10]; // вывод информации на экранint bg [10];void ca (); // перевод данных из символьной формы в цифровуюvoid cb ();void cd (); // решение задачCString ce (char *, int, double, double, double, double); // корни уравнения (4 шт.)};Файл «p11Doc.cpp»#include "stdafx.h"#include "math.h"#include "p11.h"#include "p11Doc.h"CP11Doc::CP11Doc (){aa = ab = ac = ag = ah = 0;ba [0] = bg [0] = 0;}void CP11Doc::ca (){ah = 1; // флаг начала обработкиai = 0; // временный счётчик символов массиваwhile ((ba [ai] < '0' || ba [ai] > '9') && ba [ai] != '-' && ba [ai]) ai++;cb ();aa = aj;while ((ba [ai] < '0' || ba [ai] > '9') && ba [ai] != '-' && ba [ai]) ai++;cb ();ab = aj;while ((ba [ai] < '0' || ba [ai] > '9') && ba [ai] != '-' && ba [ai]) ai++;cb ();ac = aj; // данные занесеныcd (); // решение задач}void CP11Doc::cb (){int a;aj = 0; // целое число, извлекаемое из массиваa = 1; // знак извлекаемого числаif (ba [ai] == '-') {a = -1; ai++;}while (ba [ai] >= '0' && ba [ai] <= '9'){aj = aj * 10 + ba [ai] - '0';ai++;}aj *= a;}void CP11Doc::cd (){double a, b, c;// (1) 11.1. Решить уравнение: ax^2 + bx + c = 0.if (!aa)if (!ab)if (!ac)bd [0] = ce ("1. ", 5, 0, 0, 0, 0);elsebd [0] = ce ("1. ", 0, 0, 0, 0, 0);else{a = (double) -ac / ab;bd [0] = ce ("1. ", 1, a, 0, 0, 0);}else{a = ab * ab - 4 * aa * ac;if (a < 0)bd [0] = ce ("1. ", 0, 0, 0, 0, 0);elseif (!a){b = -ab / 2. / aa;bd [0] = ce ("1. ", 1, b, 0, 0, 0);}else{b = (-ab - sqrt (a)) / 2 / aa;c = (-ab + sqrt (a)) / 2 / aa;bd [0] = ce ("1. ", 2, b, c, 0, 0);}}// (2) 11.2. Решить уравнение: ax^4 + bx^2 + c = 0.if (!aa)if (!ab)if (!ac)bd [1] = ce ("2. ", 5, 0, 0, 0, 0);elsebd [1] = ce ("2. ", 0, 0, 0, 0, 0);else{a = (double) -ac / ab;if (a < 0)bd [1] = ce ("2. ", 0, 0, 0, 0, 0);elseif (!a)bd [1] = ce ("2. ", 1, 0, 0, 0, 0);elsebd [1] = ce ("2. ", 2, -sqrt (a), sqrt (a), 0, 0);}else{a = ab * ab - 4 * aa * ac;if (a < 0)bd [1] = ce ("2. ", 0, 0, 0, 0, 0);elseif (!a){b = -ab / 2. / aa;if (b < 0)bd [1] = ce ("2. ", 0, 0, 0, 0, 0);elseif (!b)bd [1] = ce ("2. ", 1, 0, 0, 0, 0);elsebd [1] = ce ("2. ", 2, -sqrt (b), sqrt (b), 0, 0);}else{b = (-ab - sqrt (a)) / 2 / aa;c = (-ab + sqrt (a)) / 2 / aa;if (b < 0)if (c < 0)bd [1] = ce ("2. ", 0, 0, 0, 0, 0);elseif (!c)bd [1] = ce ("2. ", 1, 0, 0, 0, 0);elsebd [1] = ce ("2. ", 2, -sqrt (c), sqrt (c), 0, 0);elseif (!b)if (c < 0)bd [1] = ce ("2. ", 1, 0, 0, 0, 0);elsebd [1] = ce ("2. ", 3, -sqrt (c), 0, sqrt (c), 0);elseif (c < 0)bd [1] = ce ("2. ", 2, -sqrt (b), sqrt (b), 0, 0);elseif (!c)bd [1] = ce ("2. ", 3, -sqrt (b), 0, sqrt (b), 0);elsebd [1] = ce ("2. ", 4, -sqrt (c), -sqrt (b), sqrt (b), sqrt (c));}}}CString CP11Doc::ce (char *a, int b, double c, double d, double e, double f){CString g, h;g.Format (a);switch (b){case 0: h.Format ("Решений нет."); break;case 1: h.Format ("x = %.4g.", c); break;case 2: h.Format ("x1 = %.4g, x2 = %.4g.", c, d); break;case 3: h.Format ("x1 = %.4g, x2 = %.4g, x3 = %.4g.", c, d, e); break;case 4: h.Format ("x1 = %.4g, x2 = %.4g, x3 = %.4g, x4 = %.4g.", c, d, e, f); break;default: h.Format ("Решение - любое число.");}return g + h;}Файл «p11View.cpp»void CP11View::OnDraw (CDC* pDC){CP11Doc *pdoc = GetDocument ();ASSERT_VALID (pdoc);CString a; // выводимая строкаpDC -> TextOut (10, 10, "Введите три целых числа:");pDC -> TextOut (10, 35, pdoc -> ba);a.Format ("code = %i", pdoc -> bg [0]); // код вводимого символаpDC -> TextOut (10, 60, a);if (pdoc -> ah) // <Enter>{a.Format ("%i %i %i", pdoc -> aa, pdoc -> ab, pdoc -> ac);pDC -> TextOut (10, 85, a);pDC -> TextOut (10, 125, pdoc -> bd [0]);pDC -> TextOut (10, 150, pdoc -> bd [1]);}}void CP11View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags){CP11Doc *pdoc = GetDocument ();ASSERT_VALID (pdoc);pdoc -> bg [0] = nChar;if (nChar == 8) // Обработка <Backspace>{if (pdoc -> ag) {pdoc -> ag--; pdoc -> ba [pdoc -> ag] = 0;}goto aaa;}if (nChar == 13) // Обработка <Enter>{pdoc -> ca ();goto aaa;}if (pdoc -> ag < 49) // Ограничение на длину вводимой строки{pdoc -> ba [pdoc -> ag] = nChar; // Добавление символа к массиву строкиpdoc -> ba [pdoc -> ag + 1] = 0;pdoc -> ag++;}aaa:Invalidate ();CView::OnChar (nChar, nRepCnt, nFlags);}
Группа для программистов ( programming )
:Юрий Казекин
Файл «p11Doc.
h»
/* p11 (2)
Биквадратное уравнение
Язык Visual C++ 6.0 */
class CP11Doc:public CDocument
{
protected:
CP11Doc ();
DECLARE_DYNCREATE (CP11Doc);
int aa, ab, ac; // исходные данные - целые числа
int ad, ae, af; // исходные данные - натуральные числа
int ag, ah; // указатель ввода в строку данных, <Enter>
int ai, aj; // внутренние переменные для передачи данных
char ba [50]; // место для вводимых символов
CString bd [10]; // вывод информации на экран
int bg [10];
void ca (); // перевод данных из символьной формы в цифровую
void cb ();
void cd (); // решение задач
CString ce (char *, int, double, double, double, double); // корни уравнения (4 шт.)
};
Файл «p11Doc.cpp»
#include "stdafx.h"
#include "math.h"
#include "p11.h"
#include "p11Doc.h"
CP11Doc::CP11Doc ()
{
aa = ab = ac = ag = ah = 0;
ba [0] = bg [0] = 0;
}
void CP11Doc::ca ()
{
ah = 1; // флаг начала обработки
ai = 0; // временный счётчик символов массива
while ((ba [ai] < '0' || ba [ai] > '9') && ba [ai] != '-' && ba [ai]) ai++;
cb ();
aa = aj;
while ((ba [ai] < '0' || ba [ai] > '9') && ba [ai] != '-' && ba [ai]) ai++;
cb ();
ab = aj;
while ((ba [ai] < '0' || ba [ai] > '9') && ba [ai] != '-' && ba [ai]) ai++;
cb ();
ac = aj; // данные занесены
cd (); // решение задач
}
void CP11Doc::cb ()
{
int a;
aj = 0; // целое число, извлекаемое из массива
a = 1; // знак извлекаемого числа
if (ba [ai] == '-') {a = -1; ai++;}
while (ba [ai] >= '0' && ba [ai] <= '9')
{
aj = aj * 10 + ba [ai] - '0';
ai++;
}
aj *= a;
}
void CP11Doc::cd ()
{
double a, b, c;
// (1) 11.1. Решить уравнение: ax^2 + bx + c = 0.
if (!aa)
if (!ab)
if (!ac)
bd [0] = ce ("1. ", 5, 0, 0, 0, 0);
else
bd [0] = ce ("1. ", 0, 0, 0, 0, 0);
else
{
a = (double) -ac / ab;
bd [0] = ce ("1. ", 1, a, 0, 0, 0);
}
else
{
a = ab * ab - 4 * aa * ac;
if (a < 0)
bd [0] = ce ("1. ", 0, 0, 0, 0, 0);
else
if (!a)
{
b = -ab / 2. / aa;
bd [0] = ce ("1. ", 1, b, 0, 0, 0);
}
else
{
b = (-ab - sqrt (a)) / 2 / aa;
c = (-ab + sqrt (a)) / 2 / aa;
bd [0] = ce ("1. ", 2, b, c, 0, 0);
}
}
// (2) 11.2. Решить уравнение: ax^4 + bx^2 + c = 0.
if (!aa)
if (!ab)
if (!ac)
bd [1] = ce ("2. ", 5, 0, 0, 0, 0);
else
bd [1] = ce ("2. ", 0, 0, 0, 0, 0);
else
{
a = (double) -ac / ab;
if (a < 0)
bd [1] = ce ("2. ", 0, 0, 0, 0, 0);
else
if (!a)
bd [1] = ce ("2. ", 1, 0, 0, 0, 0);
else
bd [1] = ce ("2. ", 2, -sqrt (a), sqrt (a), 0, 0);
}
else
{
a = ab * ab - 4 * aa * ac;
if (a < 0)
bd [1] = ce ("2. ", 0, 0, 0, 0, 0);
else
if (!a)
{
b = -ab / 2. / aa;
if (b < 0)
bd [1] = ce ("2. ", 0, 0, 0, 0, 0);
else
if (!b)
bd [1] = ce ("2. ", 1, 0, 0, 0, 0);
else
bd [1] = ce ("2. ", 2, -sqrt (b), sqrt (b), 0, 0);
}
else
{
b = (-ab - sqrt (a)) / 2 / aa;
c = (-ab + sqrt (a)) / 2 / aa;
if (b < 0)
if (c < 0)
bd [1] = ce ("2. ", 0, 0, 0, 0, 0);
else
if (!c)
bd [1] = ce ("2. ", 1, 0, 0, 0, 0);
else
bd [1] = ce ("2. ", 2, -sqrt (c), sqrt (c), 0, 0);
else
if (!b)
if (c < 0)
bd [1] = ce ("2. ", 1, 0, 0, 0, 0);
else
bd [1] = ce ("2. ", 3, -sqrt (c), 0, sqrt (c), 0);
else
if (c < 0)
bd [1] = ce ("2. ", 2, -sqrt (b), sqrt (b), 0, 0);
else
if (!c)
bd [1] = ce ("2. ", 3, -sqrt (b), 0, sqrt (b), 0);
else
bd [1] = ce ("2. ", 4, -sqrt (c), -sqrt (b), sqrt (b), sqrt (c));
}
}
}
CString CP11Doc::ce (char *a, int b, double c, double d, double e, double f)
{
CString g, h;
g.Format (a);
switch (b)
{
case 0: h.Format ("Решений нет."); break;
case 1: h.Format ("x = %.4g.", c); break;
case 2: h.Format ("x1 = %.4g, x2 = %.4g.", c, d); break;
case 3: h.Format ("x1 = %.4g, x2 = %.4g, x3 = %.4g.", c, d, e); break;
case 4: h.Format ("x1 = %.4g, x2 = %.4g, x3 = %.4g, x4 = %.4g.", c, d, e, f); break;
default: h.Format ("Решение - любое число.");
}
return g + h;
}
Файл «p11View.cpp»
void CP11View::OnDraw (CDC* pDC)
{
CP11Doc *pdoc = GetDocument ();
ASSERT_VALID (pdoc);
CString a; // выводимая строка
pDC -> TextOut (10, 10, "Введите три целых числа:");
pDC -> TextOut (10, 35, pdoc -> ba);
a.Format ("code = %i", pdoc -> bg [0]); // код вводимого символа
pDC -> TextOut (10, 60, a);
if (pdoc -> ah) // <Enter>
{
a.Format ("%i %i %i", pdoc -> aa, pdoc -> ab, pdoc -> ac);
pDC -> TextOut (10, 85, a);
pDC -> TextOut (10, 125, pdoc -> bd [0]);
pDC -> TextOut (10, 150, pdoc -> bd [1]);
}
}
void CP11View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
{
CP11Doc *pdoc = GetDocument ();
ASSERT_VALID (pdoc);
pdoc -> bg [0] = nChar;
if (nChar == 8) // Обработка <Backspace>
{
if (pdoc -> ag) {pdoc -> ag--; pdoc -> ba [pdoc -> ag] = 0;}
goto aaa;
}
if (nChar == 13) // Обработка <Enter>
{
pdoc -> ca ();
goto aaa;
}
if (pdoc -> ag < 49) // Ограничение на длину вводимой строки
{
pdoc -> ba [pdoc -> ag] = nChar; // Добавление символа к массиву строки
pdoc -> ba [pdoc -> ag + 1] = 0;
pdoc -> ag++;
}
aaa:
Invalidate ();
CView::OnChar (nChar, nRepCnt, nFlags);
}