Решено 16 задач.
void CP11Doc::cg ()
{
int a, b, c;
double d;
// (3) 16.4. Дано целое положительное число n. Вычислить n!
a = 1;
for (b = 1; b < aa + 1; b++) a *= b;
bg [1] = a;
/* (4) 18.5. Даны два натуральных числа M и N. Вычислить их наибольший
общий делитель НОД (M, N). */
ad = aa; ae = ab; af = ac;
if (ad < 0) ad = -ad;
if (ae < 0) ae = -ae;
if (af < 0) af = -af;
if (!ad) ad = 1;
if (!ae) ae = 1;
if (!af) af = 1;
a = ad; b = ae;
while (a - b) if (a > b) a -= b; else b -= a;
bg [2] = a;
/* (5) 21.3.9. Даны три положительных числа. Составить алгоритм,
определяющий, могут ли они быть длинами сторон треугольника. */
if (aa > 0 && ab > 0 && ac > 0 && aa + ab > ac && aa + ac > ab && ab + ac > aa)
bd [2].Format ("5. Числа могут быть длинами сторон треугольника.");
else
bd [2].Format ("5. Числа не могут быть длинами сторон треугольника.");
/* (6) 21.4.10. Пусть компьютер способен выполнять только две
арифметические операции - сложение и вычитание. Составить алгоритмы:
а) умножения двух целых чисел;
б) целочисленного деления двух чисел;
в) получения остатка от целочисленного деления двух чисел. */
a = 0;
for (b = 0; b < ae; b++) a += ad;
bg [3] = a;
a = ad;
b = 0;
while (a >= ae) {a -= ae; b++;}
bg [4] = b;
bg [5] = a;
/* (7) 21.6.11. Составить алгоритм нахождения НОД трёх натуральных чисел,
используя вспомогательный алгоритм нахождения НОД двух чисел. */
a = ad; b = ae;
while (a - b) if (a > b) a -= b; else b -= a;
b = af;
while (a - b) if (a > b) a -= b; else b -= a;
bg [6] = a;
/* (8) 33.12. "Оттранслируйте" с алгоритмического языка алгоритм выбора
наибольшего значения из трёх. */
a = aa;
if (a < ab) a = ab;
if (a < ac) a = ac;
bg [7] = a;
/* (9) 48.9.21. Присвоить целой переменной h значение цифры, стоящей в
разряде сотен в записи положительного целого числа k. Например, если
k = 28796, то h = 7. */
bg [8] = aa / 100 % 10;
/* (10) 48.10.22. Целой переменной S присвоить значение суммы цифр
трёхзначного целого числа k. */
a = aa % 1000;
bg [9] = a / 100 + a / 10 % 10 + a % 10;
// (11) 63.1.31. По длинам трёх сторон треугольника вычислить его площадь.
d = (aa + ab + ac) / 2.;
d = d * (d - aa) * (d - ab) * (d - ac); // формула Герона
if (d < 0) d = 0;
bj [0] = sqrt (d);
/* (12) 64.2.32. Вычислить сумму конечного числа членов гармонического
ряда: 1 + 1/2 + 1/3 + … + 1/i.
Суммирование прекращается, когда очередное слагаемое становится меньше
epsilon или целая переменная i достигает значения maxint. */
a = aa;
if (a > 1000000) a = 1000000;
if (a < 0) a = 0;
d = 0;
while (a) d += 1. / a--;
bj [1] = d;
/* (13) 65.33. Вычислить сумму целых чисел от M до N путём прямого
суммирования. Здесь M и N - целые числа. */
a = 0;
for (b = aa; b <= ab; b++) a += b;
bg [10] = a;
/* (14) 70.1.41. Определите на вашем компьютере величину машинного
epsilon. */
d = 1;
while (1 + d > 1) d /= 2;
bj [2] = d;
/* (15) 71.47. Даны два натуральных числа a и b. Определить наибольший
общий делитель трёх величин: a + b, |a - b|, ab. */
a = bg [11] = aa + ab;
b = bg [12] = aa - ab;
if (a < 0) a = -a;
if (b < 0) b = -b;
if (!a) a = 1;
if (!b) b = 1;
while (a - b) if (a > b) a -= b; else b -= a;
b = bg [13] = aa * ab;
if (b < 0) b = -b;
if (!b) b = 1;
while (a - b) if (a > b) a -= b; else b -= a;
bg [14] = a;
/* (16) 80.3.50. Даны три целых числа. Определить, сумма цифр которого из
них больше. Подсчёт суммы цифр организовать через подпрограмму. */
a = cj (aa); b = cj (ab); c = cj (ac);
if (a >= b && a >= c)
bd [3] = "16. Сумма цифр первого числа больше.";
else
if (b >= a && b >= c)
bd [3] = "16. Сумма цифр второго числа больше.";
else
bd [3] = "16. Сумма цифр третьего числа больше.";
}
CP11Doc::cj (int a)
{
int b;
b = 0;
if (a < 0) a = -a;
while (a) {b += a % 10; a /= 10;}
return b;
}
- - - - - - - - - - - - - - - - - - - -
// Файл 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]);
a.Format ("3. %i! = %i.", pdoc -> aa, pdoc -> bg [1]);
pDC -> TextOut (10, 175, a);
a.Format ("4. НОД (%i, %i) = %i.", pdoc -> ad, pdoc -> ae, pdoc -> bg [2]);
pDC -> TextOut (10, 200, a);
pDC -> TextOut (10, 225, pdoc -> bd [2]);
a.Format ("6. %i * %i = %i, %i / %i = %i, %i %% %i = %i.",
pdoc -> ad, pdoc -> ae, pdoc -> bg [3],
pdoc -> ad, pdoc -> ae, pdoc -> bg [4],
pdoc -> ad, pdoc -> ae, pdoc -> bg [5]);
pDC -> TextOut (10, 250, a);
a.Format ("7. НОД (%i, %i, %i) = %i.",
pdoc -> ad, pdoc -> ae, pdoc -> af, pdoc -> bg [6]);
pDC -> TextOut (10, 275, a);
a.Format ("8. max (%i, %i, %i) = %i.",
pdoc -> aa, pdoc -> ab, pdoc -> ac, pdoc -> bg [7]);
pDC -> TextOut (10, 300, a);
a.Format ("9. Число сотен равно %i.", pdoc -> bg [8]);
pDC -> TextOut (10, 325, a);
a.Format ("10. Сумма цифр трёхзначного числа %i.", pdoc -> bg [9]);
pDC -> TextOut (10, 350, a);
a.Format ("11. Площадь треугольника %.4g.", pdoc -> bj [0]);
pDC -> TextOut (310, 125, a);
a.Format ("12. Сумма гармонического ряда %.6g.", pdoc -> bj [1]);
pDC -> TextOut (310, 175, a);
a.Format ("13. Сумма чисел от %i до %i равна %i.",
pdoc -> aa, pdoc -> ab, pdoc -> bg [10]);
pDC -> TextOut (310, 200, a);
a.Format ("14. Величина машинного epsilon %.6g.", pdoc -> bj [2]);
pDC -> TextOut (310, 275, a);
a.Format ("15. НОД (%i, %i, %i) = %i.",
pdoc -> bg [11], pdoc -> bg [12], pdoc -> bg [13], pdoc -> bg [14]);
pDC -> TextOut (310, 300, a);
pDC -> TextOut (310, 325, pdoc -> bd [3]);
}
}
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);
}
Присоединяйтесь — мы покажем вам много интересного
Присоединяйтесь к ОК, чтобы подписаться на группу и комментировать публикации.
Нет комментариев