Программа создана для решения учебных задач в среде Visual C++ 6.0.
Реализованы ввод данных, а также вывод результатов. В приложении рабочая версия программы и архив проекта.
За основу взята архитектура программы MFC.
Код
// Файл p11Doc.h
class CP11Doc:public CDocument
{
protected:
CP11Doc ();
DECLARE_DYNCREATE (CP11Doc);
int aa, ab, ac;
int ad, ae, af;
int ia [10];
int ka, kb, kc, kd;
int la, lb, lc;
double ib [10];
CString ic [10];
double ca, cb;
double da;
/* aa - режим отображения */
/* ab - код введённого символа */
/* ac - указатель на введённый символ */
/* ad - внутренний указатель обрабатываемого символа в строке в функции ga () */
/* ae - введённое целое число в функции ga () */
/* af - выбор режима программы */
/* da - введённое рациональное число в функции ga () */
/* ca ... cb - исходные данные, рациональные числа */
/* ka ... kd - исходные данные, целые числа */
/* la ... lc - исходные данные, натуральные числа */
/* ia [10] - массив целых чисел (результатов) для вывода на экран */
char ea [50]; // место для вводимых символов
void ga (); // перевод данных из символьной формы в цифровую
void gb (); // сборка целого числа из строки
void gc (); // сборка рационального числа из строки
void ha (); // решение задач
};
- - - - - - - - - - - - - - - - - - - -
// Файл p11Doc.cpp
#include "stdafx.h"
#include <math.h>
#include "p11.h"
#include "p11Doc.h"
CP11Doc::CP11Doc ()
{
aa = ab = ac = 0;
ea [0] = ia [0] = 0;
}
void CP11Doc::ga ()
{
if (aa == 0)
{
aa = 1;
ad = 0;
while ((ea [ad] < '0' || ea [ad] > '9') && ea [ad]) ad++;
gb ();
af = ae;
if (af < 2 || af > 3) aa = 2;
ac = ea [0] = 0;
return;
}
aa = 2;
ad = 0;
if (af == 2)
{
while ((ea [ad] < '0' || ea [ad] > '9') && ea [ad] != '-' && ea [ad]) ad++;
gb ();
ka = ae;
while ((ea [ad] < '0' || ea [ad] > '9') && ea [ad] != '-' && ea [ad]) ad++;
gb ();
kb = ae;
while ((ea [ad] < '0' || ea [ad] > '9') && ea [ad] != '-' && ea [ad]) ad++;
gb ();
kc = ae;
while ((ea [ad] < '0' || ea [ad] > '9') && ea [ad] != '-' && ea [ad]) ad++;
gb ();
kd = ae;
}
if (af == 3)
{
while ((ea [ad] < '0' || ea [ad] > '9') && ea [ad] != '-' && ea [ad] != '.' && ea [ad]) ad++;
gc ();
ca = da;
while ((ea [ad] < '0' || ea [ad] > '9') && ea [ad] != '-' && ea [ad] != '.' && ea [ad]) ad++;
gc ();
cb = da;
}
ha ();
}
void CP11Doc::gb ()
{
int a; // знак числа
ae = 0;
a = 1;
if (ea [ad] == '-') {a = -1; ad++;}
while (ea [ad] >= '0' && ea [ad] <= '9')
{
ae = ae * 10 + ea [ad] - '0';
ad++;
}
ae *= a;
}
void CP11Doc::gc ()
{
int a;
double b;
da = 0; // собираемое рациональное число
a = 1; // знак числа
b = .1; // множитель в дробной части числа
if (ea [ad] == '-') {a = -1; ad++;}
while (ea [ad] >= '0' && ea [ad] <= '9')
{
da = da * 10 + ea [ad] - '0';
ad++;
}
if (ea [ad] == '.')
{
ad++;
while (ea [ad] >= '0' && ea [ad] <= '9')
{
da += (ea [ad] - '0') * b;
ad++;
b /= 10;
}
}
da *= a;
}
void CP11Doc::ha ()
{
int a, b, c;
double d, e;
if (af == 2)
{
/* 11.1.1. */
ia [0] = ka * kd;
ia [1] = kb * kc;
/* 13.1.2. Составить алгоритм решения квадратного уравнения: ax^2 + bx + c = 0. */
if (ka == 0)
if (kb == 0)
if (kc == 0)
a = 3;
else
a = 0;
else
{
a = 1;
d = (double) -kc / kb;
}
else
{
b = kb * kb - 4 * ka * kc;
if (b < 0)
a = 0;
else
if (b == 0)
{
a = 1;
d = -kb / 2. / ka;
}
else
{
a = 2;
d = (-kb - sqrt (b)) / 2 / ka;
e = (-kb + sqrt (b)) / 2 / ka;
}
}
switch (a)
{
case 0: ic [0].Format ("2. Нет решений."); break;
case 1: ic [0].Format ("2. x = %.4g.", d); break;
case 2: ic [0].Format ("2. x1 = %.4g, x2 = %.4g.", d, e); break;
default: ic [0].Format ("2. Решение - любое число.");
}
/* 16.1.3. Вычислить n! */
a = 1;
b = ka + 1;
if (b > 20) b = 20;
for (c = 1; c < b; c++) a *= c;
ia [2] = a;
/* 18.1.4. Даны два натуральных числа M и N. Вычислить их наибольший общий делитель НОД (M, N). */
la = ka; lb = kb; lc = kc;
if (la < 0) la = -la; if (!la) la = 1;
if (lb < 0) lb = -lb; if (!lb) lb = 1;
if (lc < 0) lc = -lc; if (!lc) lc = 1;
a = la; b = lb;
while (a - b) if (a > b) a -= b; else b -= a;
ia [3] = a;
} // конец функции (af = 2)
if (af == 3)
{
/* 19.1.5. Вычислить степенную функцию с целым показателем y = x^k, где k - целое число, x != 0. */
ia [4] = a = b = (int) cb;
if (b < 0) b = -b;
if (ca == 0)
ib [0] = 0;
else
{
d = 1;
for (c = 0; c < b; c++) d *= ca;
if (a < 0) d = 1 / d;
ib [0] = d;
}
} // конец функции (af = 3)
}
- - - - - - - - - - - - - - - - - - - -
// Файл p11View.cpp
void CP11View::OnDraw (CDC *pDC)
{
CP11Doc *pdoc = GetDocument ();
ASSERT_VALID (pdoc);
CString a;
if (pdoc -> aa == 0)
{
pDC -> TextOut (10, 10, "Введите целое число:");
pDC -> TextOut (10, 35, pdoc -> ea);
a.Format ("code = %i", pdoc -> ab);
pDC -> TextOut (10, 60, a);
pDC -> TextOut (10, 85, "1. Нет ввода.");
pDC -> TextOut (10, 110, "2. Ввод целых чисел.");
pDC -> TextOut (10, 135, "3. Ввод рациональных чисел.");
return;
}
if (pdoc -> aa == 1)
{
pDC -> TextOut (10, 10, "Введите целое число:");
a.Format ("%i", pdoc -> af);
pDC -> TextOut (10, 35, a);
a.Format ("code = %i", pdoc -> ab);
pDC -> TextOut (10, 60, a);
pDC -> TextOut (10, 85, "1. Нет ввода.");
pDC -> TextOut (10, 110, "2. Ввод целых чисел.");
pDC -> TextOut (10, 135, "3. Ввод рациональных чисел.");
if (pdoc -> af == 2)
{
pDC -> TextOut (10, 160, "Введите четыре целых числа:");
pDC -> TextOut (10, 185, pdoc -> ea);
}
if (pdoc -> af == 3)
{
pDC -> TextOut (10, 160, "Введите два рациональных числа:");
pDC -> TextOut (10, 185, pdoc -> ea);
}
return;
}
if (pdoc -> af == 2)
{
pDC -> TextOut (10, 10, "Введите целое число:");
a.Format ("%i", pdoc -> af);
pDC -> TextOut (10, 35, a);
a.Format ("code = %i", pdoc -> ab);
pDC -> TextOut (10, 60, a);
pDC -> TextOut (10, 85, "1. Нет ввода.");
pDC -> TextOut (10, 110, "2. Ввод целых чисел.");
pDC -> TextOut (10, 135, "3. Ввод рациональных чисел.");
pDC -> TextOut (10, 160, "Введите четыре целых числа:");
pDC -> TextOut (10, 185, pdoc -> ea);
a.Format ("%i %i %i %i", pdoc -> ka, pdoc -> kb, pdoc -> kc, pdoc -> kd);
pDC -> TextOut (10, 210, a);
a.Format ("1. %i / %i : %i / %i = %i / %i.", pdoc -> ka, pdoc -> kb, pdoc -> kc, pdoc -> kd, pdoc -> ia [0], pdoc -> ia [1]);
pDC -> TextOut (10, 260, a);
pDC -> TextOut (10, 285, pdoc -> ic [0]);
a.Format ("3. %i! = %i.", pdoc -> ka, pdoc -> ia [2]);
pDC -> TextOut (10, 310, a);
a.Format ("4. НОД (%i, %i) = %i.", pdoc -> la, pdoc -> lb, pdoc -> ia [3]);
pDC -> TextOut (10, 335, a);
}
if (pdoc -> af == 3)
{
pDC -> TextOut (10, 10, "Введите целое число:");
a.Format ("%i", pdoc -> af);
pDC -> TextOut (10, 35, a);
a.Format ("code = %i", pdoc -> ab);
pDC -> TextOut (10, 60, a);
pDC -> TextOut (10, 85, "1. Нет ввода.");
pDC -> TextOut (10, 110, "2. Ввод целых чисел.");
pDC -> TextOut (10, 135, "3. Ввод рациональных чисел.");
pDC -> TextOut (10, 160, "Введите два рациональных числа:");
pDC -> TextOut (10, 185, pdoc -> ea);
a.Format ("%g %g", pdoc -> ca, pdoc -> cb);
pDC -> TextOut (10, 210, a);
a.Format ("5. %g ^ %i = %g.", pdoc -> ca, pdoc -> ia [4], pdoc -> ib [0]);
pDC -> TextOut (10, 260, a);
}
}
void CP11View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
{
CP11Doc *pdoc = GetDocument ();
ASSERT_VALID (pdoc);
pdoc -> ab = nChar;
if (nChar == 8)
{
if (pdoc -> ac) {pdoc -> ac--; pdoc -> ea [pdoc -> ac] = 0;}
goto aaa;
}
if (nChar == 13)
{
pdoc -> ga ();
goto aaa;
}
if (pdoc -> ac < 49)
{
pdoc -> ea [pdoc -> ac] = nChar;
pdoc -> ea [pdoc -> ac + 1] = 0;
pdoc -> ac++;
}
aaa:
Invalidate ();
CView::OnChar (nChar, nRepCnt, nFlags);
}