Скрытый текст
/* p11 Язык Visual C++ 6.0 Основы программирования */ // Файл p11Doc.h 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 [20]; double bj [10]; void ca ( ); // перевод данных из символьной формы в цифровую void cb ( ); void cd ( ); // решение задач CString ce (char *, int, double, double, double, double ); // корни уравнения (4 шт. ) void cg ( ); cj (int ); // сумма цифр целого числа }; - - - - - - - - - - - - - - - - - - - - // Файл 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 ( ); // решение задач cg ( ); } 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; } 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 ); }