Задачи из справочника по математике
Конечные суммы

Код
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
namespace cnslSecond
{
class SomeSums
{
/// <summary>
/// Хранит текущее значение числа слагаемых
/// </summary>
static double n;
/// <summary>
/// Вычисляет текущий член суммы
/// </summary>
/// <param name="problem">
/// Номер задачи
/// </param>
/// <param name="k">
/// Номер слагаемого
/// </param>
/// <returns>
/// Текущий член суммы
/// </returns>
static double curTerm(int problem, double k)
{
switch (problem)
{
case 1: return k;
case 2: return 2 * k - 1;
case 3: return k * k;
case 4: return (2 * k - 1) * (2 * k - 1);
case 5: return k * k * k;
case 6: return (2 * k - 1) * (2 * k - 1) * (2 * k - 1);
default: return Double. NaN;
}
}
/// <summary>
/// Аналитическая формула результата суммирования
/// </summary>
/// <param name="problem">
/// Номер задачи
/// </param>
/// <returns>
/// результат суммирования
/// </returns>
static double precRes(int problem)
{
switch (problem)
{
case 1: return n * (n + 1) / 2;
case 2: return n * n;
case 3: return n * (n + 1) * (2 * n + 1) / 6;
case 4: return n * (4 * n * n - 1) / 3;
case 5: return n * n * ( n + 1) * (n + 1) * .25;
case 6: return n * n * (2 * n * n - 1);
default: return Double. NaN;
}
}
static void Main(string[] args)
{
Random rnd = new Random();// Хранит объект, создающий последовательность псевдослучайных чисел
// Цикл вариантов счета до нажатия клавиши esc
do
{
//Возможен вариант, в котором номер задачи вводится с клавиатуры
//Console. Write("Введите номер задачи ");
// текущий номер задачи в интервале [1;6]
int nmb = rnd. Next(6) + 1; //int. Parse(Console. ReadLine());
// Возможен вариант, в котором число слагаемых вводится с клавиатуры
//Console. Write("Введите n ");
// число суммируемых слагаемых в интервале [10;1000000]
n = rnd. Next(999991) + 10; //int. Parse(Console. ReadLine());
Console. WriteLine
("Номер задачи = {0}; Число слагаемых = {1}", nmb, n);
double myRes = 0;// Сумматор результата вначале обнуляется
// Цикл суммирования в интервале [1;n]
for (int k = 1; k <= n; k++)
myRes += curTerm(nmb, k);
// Распечатываем результат, сравнивая с результатом по аналитической формуле
Console. WriteLine(
"Полученный результат = {0}; точный результат = {1}",
myRes, precRes(nmb));
Console. WriteLine("Нажмите esc для выхода или другую клавишу для продолжения");
}
while (Console. ReadKey(true).Key!= ConsoleKey. Escape);
}
}
}
Суммы числовых последовательностей
Код
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
namespace cnslThird
{
class SomeSeries
{
/// <summary>
/// вычисляет текущий множитель, на который отличаются члены ряда
/// </summary>
/// <param name="problem">
/// номер задачи
/// </param>
/// <param name="k">
/// номер члена ряда
/// </param>
/// <returns>
/// текущий множитель
/// </returns>
static double curFactor(int problem, double k)
{
switch (problem)
{
case 1: return k;
case 2: return - k;
case 3: return (2 * k - 1) * 2 * k;
case 4: return -(2 * k - 1) * 2 * k;
case 5: return k == 1 ? 1 : (2 * k - 2) * (2 * k - 1);
case 6: return k == 1 ? 1 : -(2 * k - 2) * (2 * k - 1);
default: return Double. NaN;
}
}
/// <summary>
/// Вычисляет точную сумму ряда
/// </summary>
/// <param name="problem">
/// номер задачи
/// </param>
/// <returns>
/// сумма ряда
/// </returns>
static double precRes(int problem)
{
switch (problem)
{
case 1: return Math. E;
case 2: return 1.0 / Math. E;
case 3: return Math. Cosh(1);
case 4: return Math. Cos(1);
case 5: return Math. Sinh(1);
case 6: return Math. Sin(1);
case 7: return Math. PI * Math. PI / 6;
case 8: return Math. PI * Math. PI / 8;
case 9: return Math. PI * Math. PI / 12;
case 10: return Math. PI * Math. PI * Math. PI * Math. PI / 90;
case 11: return Math. Pow(Math. PI, 6) / 945;
case 12: return Math. Pow(Math. PI, 8) / 9450;
default: return Double. NaN;
}
}
/// <summary>
/// вычисляет текущий член ряда
/// </summary>
/// <param name="problem">
/// номер задачи
/// </param>
/// <param name="k">
/// номер члена ряда
/// </param>
/// <returns>
/// текущий член ряда
/// </returns>
static double Term(int problem, double k)
{
switch (problem)
{
case 7: return 1 / k / k;
case 8: return 1 / (2 * k - 1) / (2 * k - 1);
case 9: return (k % 2 == 1 ? 1 : -1) * 1 / k / k;
case 10: return 1 / k / k / k / k;
case 11: return Math. Pow(k, -6);
case 12: return Math. Pow(k, -8);
default: return Double. NaN;
}
}
static void Main(string[] args)
{
// предельные значения погрешности вычисления суммы ряда
double epsMin = 1e-14, epsMax = .001;
Random rnd = new Random();// хранит объект случайных чисел
do
{
int nmb = rnd. Next(1,13); // случайный номер задачи
Console. WriteLine("Номер задачи: {0}",nmb);
// случайное значение погрешности
double eps = (epsMax - epsMin) * rnd. NextDouble() + epsMin;
Console. WriteLine("eps = {0}",eps);
// начальное значение суммы и текущего члена
double
myRes = nmb < 5 ? 1 : 0, curTerm = 1;
int k = 1;// начальный номер слагаемого
while (Math. Abs(curTerm / myRes) > eps)
// пока относительная погрешность больше заданной
{
if (nmb < 7)
// в первых 6-ти задачах текущий член ряда вычисляет
// путем умножения на соответствующий множитель
curTerm /= curFactor(nmb, k);
else
// в задачах с 7 по 12 вычисляется текущий член ряда
curTerm = Term(nmb, k);
k++;// на единицу увеличивается номер члена ряда
myRes += curTerm;// текущий член добавляется к сумматору
}
Console. WriteLine(
"Приближенный результат = {0:r};" +
" точный результат = {1:f5};{1:g7};{1:e8}",
myRes, precRes(nmb));
Console. WriteLine("Press esc to exit or any key to redo");
}
while (Console. ReadKey(true).Key!= ConsoleKey. Escape);
}
}
}



