Дамы и господа.
В предыдущем участке кода я продемонстрировал ввод с клавиатуры трех целых чисел, а также вычисления, для который не нужен ввод данных.
В следующей программе я реализовал ввод трех рациональных чисел. Также решены задачи, где нужен не ввод чисел, а ввод строки. И наконец третья часть программы посвящена расчетам, в которых ввод данных не нужен, но для вывода нужна обширная площадь - так называемые таблицы.
Код
// p29
// Язык Visual C++ 6.0
// Основы информатики - 2
// Ввод рациональных чисел
class CP29Doc:public CDocument
{
protected:
CP29Doc ();
DECLARE_DYNCREATE (CP29Doc);
double aa, ab, ac;
char ad [50];
int ag, ah, ai;
double aj;
double am [10]; // результаты
CString an [10];
int ao [20];
void bb ();
void bc ();
void bd (); // решение задач - input 3 float
};
#include <math.h>
CP29Doc::CP29Doc ()
{
ad [0] = 0;
ag = ah = 0;
}
void CP29Doc::bb ()
{
ah = 1; // flag - user pressed <Enter>
ai = 0;
while ((ad [ai] < '0' || ad [ai] > '9') && ad [ai] != '-' && ad [ai] != '.' && ad [ai]) ai++;
bc ();
aa = aj;
while ((ad [ai] < '0' || ad [ai] > '9') && ad [ai] != '-' && ad [ai] != '.' && ad [ai]) ai++;
bc ();
ab = aj;
while ((ad [ai] < '0' || ad [ai] > '9') && ad [ai] != '-' && ad [ai] != '.' && ad [ai]) ai++;
bc ();
ac = aj;
bd (); // решение задач - input 3 float
}
void CP29Doc::bc ()
{
int a;
double b;
aj = 0;
a = 1;
b = .1;
if (ad [ai] == '-') {a = -1; ai++;}
while (ad [ai] >= '0' && ad [ai] <= '9')
{
aj = aj * 10 + ad [ai] - '0';
ai++;
}
if (ad [ai] == '.')
{
ai++;
while (ad [ai] >= '0' && ad [ai] <= '9')
{
aj += (ad [ai] - '0') * b;
ai++;
b /= 10;
}
}
aj *= a;
}
void CP29Doc::bd ()
{
int a, b, c, j;
double d, e, f;
CString g, h;
// 29.3.1
am [0] = aa;
if (aa < 0) am [0] = 0;
if (aa > 1) am [0] = 1;
// 45.1.2
am [1] = fabs (2 * aa + 1) - fabs (3 * aa + 7);
// 47.3.3 y = sign (x)
am [2] = 0;
if (aa < 0) am [2] = -1;
if (aa > 0) am [2] = 1;
// 104.1.4 Квадратное уравнение
if (aa == 0)
if (ab == 0)
if (ac == 0)
an [0] = "4. Решение - любое число.";
else
an [0] = "4. Решений нет.";
else
an [0].Format ("4. x = %.4g.", -ac / ab);
else
{
d = ab * ab - 4 * aa * ac;
if (d < 0)
an [0] = "4. Решений нет.";
else
if (d == 0)
an [0].Format ("4. x = %.4g.", -ab / 2 / aa);
else
{
e = (-ab - sqrt (d)) / 2 / aa;
f = (-ab + sqrt (d)) / 2 / aa;
an [0].Format ("4. x1 = %.4g, x2 = %.4g.", e, f);
}
}
// 59.1.5
ao [0] = aa < 2 * ab;
ao [1] = true;
ao [2] = (int) aa;
ao [3] = (int) aa % 2;
ao [4] = !!aa;
ao [5] = !(aa > ab / 2);
ao [6] = ac && (aa != ab);
ao [7] = aa == ab || !ac;
// 63.1.6 Формула Герона
d = (aa + ab + ac) / 2;
e = d * (d - aa) * (d - ab) * (d - ac);
if (e < 0) e = 0;
am [3] = sqrt (e);
// 64.2.7 Сумма гармонического ряда
d = aa; // предельная точность
if (d < 1e-7) d = 1e-7;
a = (int) (1 / d); // число членов ряда
if (a > 1000000) a = 1000000;
d = 0; // сумма гармонического ряда
while (a) d += 1. / a--;
am [4] = d;
// 84.4.8 Сумма экспоненциального ряда
a = 0;
d = ab; // предельная точность
e = 0; // сумма ряда
f = 1; // слагаемое
if (d < 1e-7) d = 1e-7;
while (fabs (f) > d)
{
e += f; // сумма ряда
a++;
f = f * aa / a;
if (fabs (e) > 1e10) break;
}
am [5] = e;
// 85.5.9
d = aa;
e = 0; // элемент последовательности
a = (int) ab; // число элементов последовательности
if (a > 100) a = 100;
if (d < 0) d = 0;
while (a > 0)
{
e = sqrt (d + e);
a--;
}
am [6] = e;
// 53.1.10
a = b = 0;
while (ad [b])
{
if (ad [b] == 'а') a++;
b++;
}
ao [8] = a;
// 54.2.11 Алгоритм обращения слова
g = "11. ";
a = ag; // указатель на текущую позицию символа в строке
while (a)
{
a--;
g += ad [a];
}
an [1] = g;
// 55.3.12
a = 0;
g = "12. ";
while (ad [a])
{
if (ad [a] == 'а')
g += 'б';
else
g += ad [a];
a++;
}
an [2] = g;
// 102.4.13
a = b = 0;
while (ad [a] && ad [a] != '!')
{
if (ad [a] >= '0' && ad [a] <= '9') b++;
a++;
}
ao [9] = b;
// 102.5.14
if (ag > 4)
{
a = ad [0] - '0';
b = ad [4] - '0';
if (a < 0) a = 0;
if (b < 0) b = 0;
if (a > 9) a = 9;
if (b > 9) b = 9;
switch (ad [2])
{
case '-': c = a - b; break;
case '*': c = a * b; break;
default: c = a + b;
}
}
else c = 0;
ao [10] = c;
// 116.1.15
a = b = 0;
while (ad [a])
{
if (ad [a] == '.' || ad [a] == '-' || ad [a] == ',' || ad [a] == ';' ||
ad [a] == ':' || ad [a] == '!' || ad [a] == '*' || ad [a] == '?') b++;
a++;
}
ao [11] = b;
// 116.2.16
a = 0;
while (ad [a] && ad [a] != ' ') a++; // позиция пробела
g = "16. ";
for (b = 'a'; b <= 'z'; b++) // проверяемый символ
{
for (c = 0; c < a; c++) // поиск символа в первой строке
if (ad [c] == b) // символ найден
{
j = a;
while (ad [j])
{
if (ad [j] == b) // символ найден
{
h.Format ("%c", b);
g += h;
goto aaa;
}
j++;
}
}
aaa: j = 0;
// Выход из вложенных циклов
// и переход к поиску следующего символа
}
an [3] = g;
// 232.1.17 Длина строки
// 233.3.18 Вставка символа в строку
// ad [0] - вставляемый символ
// a - позиция начала строки
// b - позиция вставки
// c - добавляемый символ
// g - собираемая строка
a = 0;
while (ad [a] && ad [a] != ' ') a++;
if (ad [a])
{
a++;
while (ad [a] && ad [a] != ' ') a++;
}
if (ad [a]) a++;
b = (int) aa - 1;
c = 0;
g = "18. ";
while (ad [a + c])
{
if (b == c)
g += ad [0];
g += ad [a + c];
c++;
}
if (b == c)
g += ad [0];
an [4] = g;
}
#include <math.h>
CDC *z;
void y (); // решение задач - no input
void CP29View::OnDraw (CDC *pDC)
{
CP29Doc *pdoc = GetDocument ();
ASSERT_VALID (pdoc);
CString a, b;
int d;
z = pDC;
if (pdoc -> ah < 2)
{
pDC -> TextOut (10, 10, "Введите три рациональных числа:");
pDC -> TextOut (10, 35, pdoc -> ad);
}
if (pdoc -> ah == 1) // flag - user pressed <Enter>
{
a.Format ("%g %g %g", pdoc -> aa, pdoc -> ab, pdoc -> ac);
pDC -> TextOut (10, 60, a);
a.Format ("1. %g.", pdoc -> am [0]);
pDC -> TextOut (10, 110, a);
a.Format ("2. %g.", pdoc -> am [1]);
pDC -> TextOut (10, 135, a);
a.Format ("3. sign (%g) = %g.", pdoc -> aa, pdoc -> am [2]);
pDC -> TextOut (10, 160, a);
pDC -> TextOut (10, 185, pdoc -> an [0]);
a = "5. ";
for (d = 0; d < 8; d++)
{
b.Format ("%i ", pdoc -> ao [d]);
a += b;
}
pDC -> TextOut (10, 210, a);
a.Format ("6. Площадь треугольника %.4g.", pdoc -> am [3]);
pDC -> TextOut (10, 235, a);
a.Format ("7. Сумма гармонического ряда %g.", pdoc -> am [4]);
pDC -> TextOut (10, 260, a);
a.Format ("8. Сумма экспоненциального ряда %g.", pdoc -> am [5]);
pDC -> TextOut (10, 285, a);
a.Format ("9. %g.", pdoc -> am [6]);
pDC -> TextOut (10, 310, a);
a.Format ("10. Число букв 'а' %i.", pdoc -> ao [8]);
pDC -> TextOut (10, 335, a);
pDC -> TextOut (10, 360, pdoc -> an [1]);
pDC -> TextOut (10, 385, pdoc -> an [2]);
a.Format ("13. %i.", pdoc -> ao [9]);
pDC -> TextOut (10, 410, a);
a.Format ("14. %i.", pdoc -> ao [10]);
pDC -> TextOut (10, 435, a);
a.Format ("15. %i.", pdoc -> ao [11]);
pDC -> TextOut (10, 460, a);
pDC -> TextOut (10, 485, pdoc -> an [3]);
a.Format ("17. Длина строки %i символов.", pdoc -> ag);
pDC -> TextOut (10, 510, a);
pDC -> TextOut (10, 535, pdoc -> an [4]);
}
if (pdoc -> ah == 2) y (); // решение задач - no input
}
void CP29View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
{
CP29Doc *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 CP29View::OnCommandNoinput ()
{
CP29Doc *pdoc = GetDocument ();
ASSERT_VALID (pdoc);
pdoc -> ah = 2; // решение задач - no input
Invalidate ();
}
void y () // решение задач - no input
{
int a, b, c, m, n;
CString d;
double g, h;
int j [10] [12], k [10];
// 35.3.1 Таблица Пифагора
for (a = 0; a < 10; a++)
for (b = 0; b < 10; b++)
{
d.Format ("%i", a * b);
z -> TextOut (a * 35 + 100, b * 25 + 10, d);
}
// 67.3.2 Кодировка символов алфавита
for (a = 0; a < 26; a++)
{
d.Format ("%c", 'a' + a);
z -> TextOut (10, a * 25 + 10, d);
d.Format ("%i", 'a' + a);
z -> TextOut (30, a * 25 + 10, d);
}
// 87.6.3 Таблица похудения
g = exp (1. / 30 * log (70. / 96)); // коэффициент снижения массы
h = 96;
b = 100;
for (a = 0; a < 31; a++)
{
d.Format ("%i", a);
z -> TextOut (b, a * 25 % 400 + 310, d);
d.Format ("%.4g", h);
z -> TextOut (b + 35, a * 25 % 400 + 310, d);
h *= g;
if (a == 15) b = 210;
}
// 111.4.4 Средняя температура летних месяцев
// Заполняем массив случайными числами
for (a = 0; a < 10; a++)
for (b = 0; b < 12; b++)
{
j [a] [b] = rand () % 51 - 20;
d.Format ("%i", j [a] [b]);
z -> TextOut (490 + b * 40, 10 + a * 25, d);
}
b = 0;
for (a = 0; a < 10; a++)
{
k [a] = j [a] [5] + j [a] [6] + j [a] [7];
d.Format ("%.3g", k [a] / 3.);
z -> TextOut (1000, 10 + a * 25, d);
if (k [a] > k [b]) b = a;
}
d.Format ("Самое тёплое лето было в %i-ом году.", b + 1);
z -> TextOut (330, 285, d);
d.Format ("Средняя температура %.3g градусов.", k [b] / 3.);
z -> TextOut (330, 310, d);
// 205.2.5 Вывод чётных чисел
c = 0;
for (a = 0; a < 3; a++)
for (b = 0; b < 23; b++)
{
d.Format ("%i", c * 2);
c++;
if (c < 52)
z -> TextOut (330 + b * 35, 360 + a * 25, d);
}
// 221.5.6
m = n = c = 0; // поиск максимального значения j [m] [n] = c
for (a = 0; a < 5; a++)
for (b = 0; b < 5; b++)
{
j [a] [b] = rand () % 100;
d.Format ("%i", j [a] [b]);
z -> TextOut (330 + b * 35, 460 + a * 25, d);
if (c < j [a] [b])
{
m = a;
n = b;
c = j [a] [b];
}
}
d.Format ("Максимальное значение j [%i] [%i] = %i.", n + 1, m + 1, c);
z -> TextOut (330, 610, d);
}