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);
}
Присоединяйтесь — мы покажем вам много интересного
Присоединяйтесь к ОК, чтобы подписаться на группу и комментировать публикации.
Нет комментариев