Решено 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); }
Группа для программистов ( programming )
:Юрий Казекин
Продолжаем читать книгу и решать задачи.
Решено 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);
}