// копирование строки b в строку a
void insert (char *a, int b, int c, char *d); // в строку 'd' добавить 'c' символов из строки 'a', начиная с символа 'b'
void CP88Doc::ha ()
{
int a, b, c;
double d, e, f, g;
CString j, k;
char m [30], n [20];
int p [20];
if (af == 1)
{
/* 88.1.1. Рекуррентная последовательность определена следующим образом: a(i) = 1, если i = 0; a(i) = a(i-1) * i + 1 / i, если i > 0. Для данного натурального n получить значение a(n). */
d = 1;
for (a = 1; a <= ka && a < 101; a++) d = d * a + 1. / a;
ib [0] = d;
/* 101.3.10. Составить программу, которая формирует символьную строку, состоящую из n звёздочек. */
copy (m, "10. ");
for (a = 0; a < ka && a < 20; a++) insert ("*", 0, 1, m);
ic [3] = m;
/* 119.4.12. Составить программу подсчёта количества различных значащих цифр в десятичной записи натурального числа. */
for (a = 0; a < 10; a++) p [a] = 0;
a = ka;
while (a > 0)
{
p [a % 10]++;
a /= 10;
}
a = 0;
for (b = 0; b < 10; b++) if (p [b] == 1) a++;
ia [0] = a;
}
if (af == 2)
{
/* 88.2.2. Дана последовательность: a(i) = 1, если i = 0, i = 1; a(i) = a(i-2) + a(i-1) / (i - 1), если i > 1. Вычислить произведение элементов с 1-го по 20-ый. */
d = e = 1; // f - следующий элемент
g = 1; // g - искомое произведение элементов
for (a = 3; a <= 20; a++)
{
f = d + e / (a - 1);
g *= f;
d = e;
e = f;
}
ib [1] = g;
/* 88.5.5. Вычислить и вывести все члены числового ряда, превышающие значение 10^-5: 1, 1/2!, 1/3!, …, 1/N!. */
ic [0] = "5. ";
a = 1;
d = 1;
while (1)
{
j.Format ("%g", d);
ic [0] += j;
d /= ++a;
if (d < .00001) break;
ic [0] += ", ";
}
/* 70.1.7. Определите на вашем компьютере величину машинного epsilon. */
d = 1;
while (1 + d > 1) d /= 2;
ib [5] = d;
/* 101.1.8. Из слова "величина" составить слово "наличие". */
copy (m, "величина");
copy (n, "8. ");
insert (m, 6, 2, n);
insert (m, 2, 4, n);
insert (m, 1, 1, n);
ic [1] = n;
/* 101.2.9. Из слова "строка" составить слово "сетка". */
copy (m, "строка");
copy (n, "9. ");
insert (m, 0, 1, n);
insert ("е", 0, 1, n);
insert (m, 1, 1, n);
insert (m, 4, 2, n);
ic [2] = n;
/* 111.3.11. В одномерном массиве X из N элементов произвести перестановку значений так, чтобы они расположились по возрастанию, то есть X(1) <= X(2) <= … <= X(N). */
k = "11.";
for (a = 0; a < 20; a++)
{
p [a] = rand () % 100;
j.Format (" %i", p [a]);
k += j;
}
ic [4] = k;
for (a = 0; a < 19; a++)
for (b = 0; b < 19 - a; b++)
if (p [b] > p [b + 1])
{
c = p [b];
p [b] = p [b + 1];
p [b + 1] = c;
}
k = "";
for (a = 0; a < 20; a++)
{
j.Format ("%i", p [a]);
k += j;
if (a < 19) k += " ";
}
ic [5] = k;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 2 */
if (af == 3)
{
/* 88.3.3. Используя рекуррентный подход, вычислить сумму многочлена 10-ой степени по формуле Горнера, где x - данное вещественное число: 10x^10 + 9x^9 +8x^8 + … + 2x^2 + x = ((…((10x + 9)x + 8)x + … + 2)x + 1)x. */
d = 0;
for (a = 10; a; a--) d = (d + a) * ca;
ib [2] = d;
/* 88.4.4. Для данного вещественного x и натурального N вычислить цепную дробь: x / (1 + x / (2 + x / (3 + x / (… / (N + x))…). */
d = ca;
b = (int) cb;
if (b > 100) b = 100;
for (a = b; a > 0; a--)
{
e = a + d;
if (!e) break;
d = ca / e;
}
ib [3] = d;
/* 88.6.6. Функцию y = sqrt (x) можно вычислить как предельное значение последовательности, определяемой рекуррентной формулой: y(k) = 1 / 2 (y(k-1) + x / y(k-1)); k = 1, 2, … . Начальное значение y(0) задаётся произвольно (желательно ближе к sqrt (x)). За приближённое значение корня с точностью epsilon берётся первое y(k), для которого выполняется условие: |y(k) - y(k-1)| < epsilon. Составить программу вычислений. */
// ca = x, cb = y(0), cc = epsilon.
e = d = cb;
a = 0;
while (1)
{
if (!d) break;
e = .5 * (d + ca / d);
if (cc <= 0) break;
if (fabs (e - d) < cc) break;
d = e;
if (a++ > 100) break;
}
ib [4] = e;
}
}
void copy (char *a, char *b)
{
int c = 0;
do a [c] = b [c]; while (b [c++]);
}
void insert (char *a, int b, int c, char *d)
{
int e, f;
e = f = 0;
while (d [e]) e++; // e - длина строки 'd'
while (f < c) {d [e + f] = a [b + f]; f++;}
d [e + f] = 0;
}
Присоединяйтесь — мы покажем вам много интересного
Присоединяйтесь к ОК, чтобы подписаться на группу и комментировать публикации.
Нет комментариев