'''
ЛБ5: Cумма бесконечного ряда

Назначение:
Вычисление суммы бысконечного ряда
y = 1 + x^2/2! - 3*x^4/4! + ... + (-1)^n*(2n-1)x^(2n) / ((2n)!) + ...
с заданной точностью

Переменные:
x - аргумент ряда
esp - точность
m - максимальное число итераций
n - номер члена ряда
n_start - номер члена ряда для вывода
step - шаг
a - первый множитель элемента ряда
b - второй множитель элемента ряда
item - элемент ряда 
y - сумма ряд
q - число знаков после запятой при выводе

Тестовый пример:
x = 1
eps = 1
m = 1
n_start = 1
step = 1
Число членов: 1
Сумма ряда: 1.5
'''

from math import floor, log10

print('\ny = 1 + x^2/2! - 3*x^4/4! + ... + (-1)^n * \
(2n-1)x^(2n) / ((2n)!) + ...')

#Ввод данных

x = float(input('\nВведите значение аргумента x: '))
while x == 0:
    print('Аргумент X не может быть равен 0\nПопробуйте ещё')
    x = float(input('\nВведите значение аргумента x: '))

eps = float(input('Введите точность вычисляемой суммы ряда: '))
while eps <= 0:
    print('Значение точности должно быть положительным\nПопробуйте ещё')
    eps = float(input('\nВведите точность вычисляемой суммы ряда: '))

m = int(input('Введите максимальное число итераций: '))
while m <= 2:
    print('Число итерайций должно быть больше 1\nПопробуйте ещё')
    m = int(input('\nВведите максимальное число итераций: '))

n_start = int(input('Введите номер первого члена ряда для вывода в таблицу: '))
while n_start <= 0 or n_start > m:
    if n_start <= 0:
        print('Номер первого члена ряда должен быть положительным\nПопробуйте \
ещё')
    if n_start > m:
        print('Номер первого члена не может быть больше максимального числа \
итераций\nПопробуйте ещё')
    n_start = int(input('\nВведите номер первого члена ряда для вывода в \
таблицу: '))

step = int(input('Введите значение шага: '))
while step < 1:
    print('Значение шага должно быть положительым\nПопробуйте ещё')
    step = int(input('\nВведите значение шага: '))

#Формирование нулевого и первого члена ряда

n_start -= 1
m -= 1
y = 1

a = -1
b = 1

n = 0

item = eps+1
#Вычисление членов ряда
while abs(item) >= eps and n <= m-1:
    if n >= n_start and (n-n_start)%step == 0:
        if n == n_start:
            #Вывод шапки таблицы
            print('\n┌'+'─'*16+'┬'+ '─'*(11+2)+'┐')
            print('│'+'{:^16s}'.format('Число')+'│'+ '{:^13s}'\
.format('Текущая')+'│')
            print('│'+'{:^16s}'.format('просуммированных')+'│'+ '{:^13s}'\
.format('cумма')+'│')
            print('│'+'{:^16s}'.format('членов')+'│'+' '*(11+2)+'│')
            print('├'+'─'*16+'┼'+ '─'*(11+2)+'┤')
        
        sn = '│' + ' {:>14d} '.format(n+1) + '│'
        if abs(y) == 0:
            sSum = ' {:>11} '.format(0)
        elif abs(y) >= 10000000:
            sSum = ' {:>11.3e} '.format(y)
        elif abs(y) >= 1000000:
            sSum = ' {:>11d} '.format(int(y))
        elif abs(y) < 1:
            sSum = ' {:>11.7f} '.format(y)
        else:
            q = 7 - (1 + floor(log10(abs(y))))
            sSum = (' {:>11.'+str(q)+'f} ').format(y)
        sSum += '│'
        print(sn+sSum)
    
    n += 1

    #Вычисление n-го элемента и прибавление к сумме
    if n == 1:
        a = 1
    else:
        a = -(abs(a) + 2)*(abs(a)//a)
    b = b*x*x/(2*n-1)/(2*n)
    item = a*b
    y += item

#Вывод подвала таблицы
if n > n_start:
    print('└'+'─'*16+'┴'+ '─'*(11+2)+'┘')

#Вывод результата
if n <= m-1:
    print('\nЧисло членов:',n+1)
    if abs(y) == 0:
        sSum = ' {} '.format(0)
    elif abs(y) >= 10000000:
        sSum = ' {:.3e} '.format(y)
    elif abs(y) >= 1000000:
        sSum = ' {:d} '.format(int(y))
    elif abs(y) < 1:
        sSum = ' {:.7f} '.format(y)
    else:
        q = 7 - (1 + floor(log10(abs(y))))
        sSum = (' {:.'+str(q)+'f} ').format(y)
    print('Сумма ряда: ' + sSum)
else:
    print('\nРяд не сошелся за количество циклов {}'.format(m + 1))
