Код
// p14
// Язык Visual C++ 6.0
// Основы информатики
// Input 3 int, no input
class CP14Doc:public CDocument
{
protected:
CP14Doc ();
DECLARE_DYNCREATE (CP14Doc);
int aa, ab, ac; // input data
char ad [50];
int ag, ah, ai, aj;
int am [30]; // output data
double an [10];
CString ao [10];
void bb (); // ввод данных
void bc ();
void bd (); // решение задач
void be (); // решение задач - нет ввода чисел
};
#include <math.h>
CP14Doc::CP14Doc ()
{
ad [0] = 0;
ag = ah = 0;
}
void CP14Doc::bb ()
{
ah = 1;
ai = 0;
while ((ad [ai] < '0' || ad [ai] > '9') && ad [ai] != '-' && ad [ai]) ai++;
bc ();
aa = aj;
while ((ad [ai] < '0' || ad [ai] > '9') && ad [ai] != '-' && ad [ai]) ai++;
bc ();
ab = aj;
while ((ad [ai] < '0' || ad [ai] > '9') && ad [ai] != '-' && ad [ai]) ai++;
bc ();
ac = aj;
bd (); // решение задач
}
void CP14Doc::bc ()
{
int a;
aj = 0;
a = 1;
if (ad [ai] == '-') {a = -1; ai++;}
while (ad [ai] >= '0' && ad [ai] <= '9')
{
aj = aj * 10 + ad [ai] - '0';
ai++;
}
aj *= a;
}
void CP14Doc::bd () // решение задач
{
int a, b, c, g;
double d, e;
CString j;
// 10.3.1 Сумма
am [0] = aa + ab;
// 13.3.2 Максимум
if (aa > ab) am [1] = aa; else am [1] = ab;
// 15.4.3
a = aa + 1;
b = 0;
if (a > 1000000) a = 1000000;
for (c = 0; c < a; c++) b += c;
am [2] = b;
// 28.1.4
a = 0;
if (aa == 0) a = 1;
if (aa > 0) a = 2;
am [3] = a;
// 29.2.5
switch (aa)
{
case 1: ao [0] = "5. Плохо."; break;
case 2: ao [0] = "5. Неудовлетворительно."; break;
case 3: ao [0] = "5. Удовлетворительно."; break;
case 4: ao [0] = "5. Хорошо."; break;
case 5: ao [0] = "5. Отлично."; break;
default: ao [0] = "5. Такой отметки нет.";
}
// 44.1.6 Модуль
if (aa > 0) am [4] = aa; else am [4] = -aa;
// 46.3.7 Максимум из трёх чисел
a = aa;
if (a < ab) a = ab;
if (a < ac) a = ac;
am [5] = a;
// 49.5.8 Факториал числа n!
a = aa + 1;
b = 1;
if (a > 13) a = 1;
for (c = 1; c < a; c++) b *= c;
am [6] = b;
// 50.7.9 Квадрат числа
a = aa + 1;
b = 0;
if (a > 1000000) a = 1;
for (c = 1; c < a; c++) b = b + c + c - 1;
am [7] = b;
// 58.1.10 Квадратное уравнение
if (aa == 0)
if (ab == 0)
if (ac == 0)
ao [1] = "10. Решение - любое число.";
else
ao [1] = "10. Решений нет.";
else
ao [1].Format ("10. x = %.4g.", (double) -ac / ab);
else
{
a = ab * ab - 4 * aa * ac;
if (a < 0) ao [1] = "10. Решений нет.";
if (a == 0) ao [1].Format ("10. x = %.4g.", -ab / 2. / aa);
if (a > 0)
{
d = (-ab - sqrt (a)) / 2 / aa;
e = (-ab + sqrt (a)) / 2 / aa;
ao [1].Format ("10. x1 = %.4g, x2 = %.4g.", d, e);
}
}
// 60.1.11 Алгоритм Евклида
a = aa;
b = ab;
if (a < 0) a = -a;
if (b < 0) b = -b;
if (a == 0 || a > 1000000) a = 1;
if (b == 0 || b > 1000000) b = 1;
while (a - b) if (a > b) a -= b; else b -= a;
am [8] = a;
// 61.2.12 Формула Герона
d = (aa + ab + ac) / 2.;
e = d * (d - aa) * (d - ab) * (d - ac);
if (e < 0) e = 0;
an [0] = sqrt (e);
// 74.1.13
if (aa > ab) am [9] = 5; else am [9] = 10;
am [10] = aa;
// 75.3.14
if (aa == 1)
ao [2] = "14. Возраст Коли 12 лет.";
else
ao [2] = "14. Возраст Пети 10 лет.";
// 77.4.15
am [11] = aa + ab + ac;
// 107.4.16
ao [3] = "16. Небольшое.";
if (aa > 10) ao [3] = "16. Большое.";
if (aa > 100) ao [3] = "16. Очень большое.";
// 108.5.17
a = aa;
if (a > 1000000) a = 0;
while (a >= 10) a -= 10;
am [12] = a;
// 113.7.18 Алгоритм деления чисел
a = aa; // делимое
b = ab; // делитель
c = 0; // частное
if (a < 0) a = -a;
if (b < 0) b = -b;
if (b == 0) b = 1;
if (a > 1000000) a = 1000000;
while (a >= b)
{
a -= b;
c++;
}
am [13] = c; // частное
am [14] = a; // остаток от деления
// 114.9.19
if (aa > 0) a = (int) sqrt (aa); else a = 0; // верхняя граница проверяемых чисел
b = 2; // проверяемое число
while (b <= a)
if (aa % b == 0) // проверка на делимость
break;
else
b++;
if (aa % b || aa < 2) b = aa;
am [15] = b;
// 19.5.20 Возведение в степень a ^ b
b = ab; // показатель степени a ^ b
if (b < 0) b = -b;
if (b > 1000000) b = 0;
a = 1;
for (c = 0; c < b; c++) a *= aa; // возведение в степень
d = a; // результат
if (ab < 0)
if (d) d = 1 / d;
an [1] = d;
// 65.1.21
a = aa;
b = ab;
if (a < -1000000) a = -1000000;
if (b < -1000000) b = -1000000;
if (a > 1000000) a = 1000000;
if (b > 1000000) b = 1000000;
g = 0;
for (c = a; c <= b; c++) g += c;
am [16] = g;
// 71.1.22
a = aa + ab;
b = aa - ab;
if (a < 0) a = -a;
if (b < 0) b = -b;
if (a == 0) a = 1;
if (b == 0) b = 1;
if (a > 1000000) a = 1000000;
if (b > 1000000) b = 1000000;
while (a - b) if (a > b) a -= b; else b -= a; // алгоритм Евклида
b = aa * ab;
if (b < 0) b = -b;
if (b == 0) b = 1;
if (b > 1000000) b = 1000000;
while (a - b) if (a > b) a -= b; else b -= a;
am [17] = a;
// 82.1.23
a = aa;
if (a > 1000000) a = 1000000;
b = 1;
for (c = 1; c < a; c++) b += 2;
am [18] = b;
// 83.2.24
a = aa;
if (a > 1000) a = 1000;
b = 1; // член геометрической прогрессии
c = 0; // сумма геометрической прогрессии
for (g = 0; g < a; g++) // счётчик элементов прогрессии
{
c += b;
b *= 2;
}
am [19] = c;
// 83.3.25 Числа Фибоначчи
ao [4] = "25. ";
if (aa > 0) ao [4] += "1";
a = 1; // первое число Фибоначчи
b = 1; // второе число Фибоначчи
g = aa; // количество чисел Фибоначчи
if (g > 30) g = 30;
while (g > 1)
{
g--;
j.Format (" %i", b);
ao [4] += j;
c = a + b; // вычисление числа Фибоначчи
a = b;
b = c;
}
// 101.3.26
ao [5] = "26. ";
for (a = 0; a < aa && a < 100; a++) ao [5] += '*';
// 117.3.27 Простые числа
ao [6] = "27. ";
for (a = 2; a <= aa && a < 120; a++) // проверка числа
{
b = 1; // флаг, является ли число простым
c = (int) sqrt (a) + 1;
for (g = 2; g < c; g++)
if (a % g == 0) b = 0; // проверка делимости
if (b)
{
j.Format ("%i ", a);
ao [6] += j;
}
}
// 186.3.28
a = aa;
b = ab;
a > b ? a : b = 1;
am [20] = a;
am [21] = b;
// 199.3.29
am [22] = aa;
am [23] = ab;
if (aa > ab)
{
am [22] = ab;
am [23] = aa;
}
// 200.5.30
switch (aa)
{
case 2: ao [7] = "30. Это неудовлетворительно."; break;
case 3: ao [7] = "30. Это удовлетворительно."; break;
case 4: ao [7] = "30. Это хорошо."; break;
case 5: ao [7] = "30. Это отлично."; break;
default: ao [7] = "30. Нет такой оценки.";
}
// 201.6.31 c = a ^ b
a = 1;
switch (ab)
{
case 5: a *= aa;
case 4: a *= aa;
case 3: a *= aa;
case 2: a *= aa;
case 1: a *= aa; break;
default: a = 0;
}
am [24] = a;
// 207.1.32 Максимум
a = aa;
if (a < ab) a = ab;
if (a < ac) a = ac;
am [25] = a;
}
void CP14Doc::be () // решение задач - нет ввода чисел
{
int a, b, c, j;
int d [10], e [10];
CString g;
double m;
char *p = "величина";
char *q = "строка";
ao [1] = "";
for (a = 0; a < 10; a++) // создание массива случайных данных
{
d [a] = rand () % 11 - 5;
g.Format ("%i ", d [a]);
ao [1] += g;
}
// 33.1.1
ao [0] = "1. ";
for (a = 0; a < 10; a++)
{
e [a] = 0;
g.Format ("%i ", e [a]);
ao [0] += g;
}
// 34.2.2 Сумма элементов массива
b = 0;
for (a = 0; a < 10; a++) b += d [a];
am [0] = b;
// 36.4.3
ao [2] = "3. ";
for (a = 0; a < 10; a++)
{
e [a] = d [a];
g.Format ("%i ", e [a]);
ao [2] += g;
}
// 37.4.4
ao [3] = "4. ";
for (a = 0; a < 10; a++)
{
e [a] = d [9 - a];
g.Format ("%i ", e [a]);
ao [3] += g;
}
// 37.5.5
a = b = c = 0;
for (j = 0; j < 10; j++)
{
if (d [j] < 0) a++;
if (d [j] == 0) b++;
if (d [j] > 0) c++;
}
am [1] = a; am [2] = b; am [3] = c;
// 40.8.6
a = 0;
for (b = 11; b < 100; b += 2) a += b;
am [4] = a;
// 48.4.7 Среднее арифметическое
// 49.5.8
a = 0; // сумма факториалов
b = 1; // факториал b = n!
for (c = 1; c < 11; c++)
{
b *= c;
a += b;
}
am [5] = a;
// 71.1.9
ao [4] = "9. Температура 36.6.";
// 108.6.10
b = 0;
for (a = -2; a <= 11; a += 3) b += a;
am [6] = b;
// 108.7.11
b = 0;
for (a = 1; a <= 10; a++) b += a;
am [7] = b;
// 70.1.12 Машинное эпсилон
m = 1;
while (1 + m > 1) m /= 2;
an [0] = m;
// 101.1.13
ao [5] = "13. ";
ao [5] = ao [5] + p [6] + p [7] + p [2] + p [3] + p [4] + p [5] + p [1];
// 101.2.14
ao [6] = "14. ";
ao [6] = ao [6] + q [0] + 'е' + q [1] + q [4] + q [5];
// 109.1.15
m = 0;
for (a = 0; a < 10; a++) m += d [a];
m /= 10;
an [1] = m; // среднее значение
ao [7] = "";
for (a = 0; a < 10; a++)
{
g.Format ("%g ", d [a] - m);
ao [7] += g;
}
// 110.2.16
a = 0;
for (b = 1; b < 10; b++)
if (d [a] < d [b]) a = b;
am [8] = a;
am [9] = d [a];
// 111.3.17
for (a = 0; a < 10; a++) e [a] = d [a];
for (a = 0; a < 9; a++)
for (b = 0; b < 9; b++)
if (e [b] > e [b + 1])
{
c = e [b];
e [b] = e [b + 1];
e [b + 1] = c;
}
ao [8] = "17. ";
for (a = 0; a < 10; a++)
{
g.Format ("%i ", e [a]);
ao [8] += g;
}
// 171.1.18
}
void CP14View::OnDraw (CDC *pDC)
{
CP14Doc *pdoc = GetDocument ();
ASSERT_VALID (pdoc);
CString a;
pDC -> TextOut (10, 10, "Введите 3 целых числа:");
pDC -> TextOut (10, 35, pdoc -> ad);
if (pdoc -> ah == 1) // flag - user pressed <Enter>
{
a.Format ("%i %i %i", pdoc -> aa, pdoc -> ab, pdoc -> ac);
pDC -> TextOut (10, 60, a);
a.Format ("1. Сумма %i.", pdoc -> am [0]);
pDC -> TextOut (10, 110, a);
a.Format ("2. Большее %i.", pdoc -> am [1]);
pDC -> TextOut (10, 135, a);
a.Format ("3. Сумма %i.", pdoc -> am [2]);
pDC -> TextOut (10, 160, a);
a.Format ("4. Число корней %i.", pdoc -> am [3]);
pDC -> TextOut (10, 185, a);
pDC -> TextOut (10, 210, pdoc -> ao [0]);
a.Format ("6. Модуль числа %i.", pdoc -> am [4]);
pDC -> TextOut (10, 235, a);
a.Format ("7. Максимум %i.", pdoc -> am [5]);
pDC -> TextOut (10, 260, a);
a.Format ("8. %i! = %i.", pdoc -> aa, pdoc -> am [6]);
pDC -> TextOut (10, 285, a);
a.Format ("9. Квадрат числа %i.", pdoc -> am [7]);
pDC -> TextOut (10, 310, a);
pDC -> TextOut (10, 335, pdoc -> ao [1]);
a.Format ("11. %i.", pdoc -> am [8]);
pDC -> TextOut (10, 360, a);
a.Format ("12. Площадь треугольника %.4g.", pdoc -> an [0]);
pDC -> TextOut (10, 385, a);
a.Format ("13. %i, %i.", pdoc -> am [9], pdoc -> am [10]);
pDC -> TextOut (10, 410, a);
pDC -> TextOut (10, 435, pdoc -> ao [2]);
a.Format ("15. Сумма %i.", pdoc -> am [11]);
pDC -> TextOut (10, 460, a);
pDC -> TextOut (10, 485, pdoc -> ao [3]);
a.Format ("17. %i.", pdoc -> am [12]);
pDC -> TextOut (10, 510, a);
a.Format ("18. Частное %i, остаток %i.", pdoc -> am [13], pdoc -> am [14]);
pDC -> TextOut (10, 535, a);
a.Format ("19. Делитель %i.", pdoc -> am [15]);
pDC -> TextOut (10, 560, a);
a.Format ("20. %i ^ %i = %g.", pdoc -> aa, pdoc -> ab, pdoc -> an [1]);
pDC -> TextOut (10, 585, a);
a.Format ("21. Сумма %i.", pdoc -> am [16]);
pDC -> TextOut (10, 610, a);
a.Format ("22. НОД %i.", pdoc -> am [17]);
pDC -> TextOut (10, 635, a);
a.Format ("23. %i.", pdoc -> am [18]);
pDC -> TextOut (10, 660, a);
a.Format ("24. Сумма прогрессии %i.", pdoc -> am [19]);
pDC -> TextOut (10, 685, a);
pDC -> TextOut (10, 710, pdoc -> ao [4]);
pDC -> TextOut (350, 10, pdoc -> ao [5]);
pDC -> TextOut (350, 35, pdoc -> ao [6]);
a.Format ("28. %i, %i.", pdoc -> am [20], pdoc -> am [21]);
pDC -> TextOut (350, 60, a);
a.Format ("29. %i, %i.", pdoc -> am [22], pdoc -> am [23]);
pDC -> TextOut (350, 85, a);
pDC -> TextOut (350, 110, pdoc -> ao [7]);
a.Format ("31. %i.", pdoc -> am [24]);
pDC -> TextOut (350, 135, a);
a.Format ("32. Максимум %i.", pdoc -> am [25]);
pDC -> TextOut (350, 160, a);
}
if (pdoc -> ah == 2) // menu command <No input>
{
pDC -> TextOut (10, 60, pdoc -> ao [1]); // создание массива случайных данных
pDC -> TextOut (10, 110, pdoc -> ao [0]);
a.Format ("2. Сумма элементов %i.", pdoc -> am [0]);
pDC -> TextOut (10, 135, a);
pDC -> TextOut (10, 160, pdoc -> ao [2]);
pDC -> TextOut (10, 185, pdoc -> ao [3]);
a.Format ("5. %i, %i, %i.", pdoc -> am [1], pdoc -> am [2], pdoc -> am [3]);
pDC -> TextOut (10, 210, a);
a.Format ("6. Сумма %i.", pdoc -> am [4]);
pDC -> TextOut (10, 235, a);
a.Format ("7. Среднее арифметическое %g.", pdoc -> am [0] / 10.);
pDC -> TextOut (10, 260, a);
a.Format ("8. Сумма факториалов %i.", pdoc -> am [5]);
pDC -> TextOut (10, 285, a);
pDC -> TextOut (10, 310, pdoc -> ao [4]);
a.Format ("10. Сумма %i.", pdoc -> am [6]);
pDC -> TextOut (10, 335, a);
a.Format ("11. Сумма %i.", pdoc -> am [7]);
pDC -> TextOut (10, 360, a);
a.Format ("12. Машинное эпсилон %.4g.", pdoc -> an [0]);
pDC -> TextOut (10, 385, a);
pDC -> TextOut (10, 410, pdoc -> ao [5]);
pDC -> TextOut (10, 435, pdoc -> ao [6]);
a.Format ("15. Среднее %g.", pdoc -> an [1]);
pDC -> TextOut (10, 460, a);
pDC -> TextOut (10, 485, pdoc -> ao [7]);
a.Format ("16. %i - %i.", pdoc -> am [8], pdoc -> am [9]);
pDC -> TextOut (10, 535, a);
pDC -> TextOut (10, 560, pdoc -> ao [8]);
pDC -> TextOut (10, 585, "18. Привет, мир.");
}
}
void CP14View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
{
CP14Doc *pdoc = GetDocument ();
ASSERT_VALID (pdoc);
if (nChar == 8)
{
if (pdoc -> ag) {pdoc -> ag--; pdoc -> ad [pdoc -> ag] = 0;}
goto aaa;
}
if (nChar == 13)
{
pdoc -> bb ();
goto aaa;
}
if (pdoc -> ag < 49)
{
pdoc -> ad [pdoc -> ag] = nChar;
pdoc -> ad [pdoc -> ag + 1] = 0;
pdoc -> ag++;
}
aaa:
Invalidate ();
CView::OnChar (nChar, nRepCnt, nFlags);
}
void CP14View::OnCommandNoinput ()
{
CP14Doc *pdoc = GetDocument ();
ASSERT_VALID (pdoc);
pdoc -> ah = 2;
pdoc -> be ();
Invalidate ();
}