# Данная программа считает значения суммы ряда
# Рисует таблицу с номером операции, исходным X,
# X текущим и текущей суммой
# Определяет, сходится ли ряд к заданной точности Eps или нет

# x - начальное значение
# k - максимальное количество шагов
# step - шаг функции

# Вводим значения
x = float(input('Введите начальное значение '))
k = int(input('Введите максимальное количество шагов '))
step = float(input('Введите шаг '))
eps = float(input('Введите точно Eps '))

# Проставляем начальные значения
y = [0]*(k + 2)
y[0] = x
y[1] = - x ** 3 / 3
sum = y[0]
i = 0
flag = True

# Шапка таблицы
print('\u250C', 6 * '\u2500', '\u252C', 11 * '\u2500', '\u252C', 19 * '\u2500',
       '\u252C', 15 * '\u2500', '\u2510', sep='')
print('\u2502', '  ', 'N  ', '\u2502', 4 * ' ', 'X', 5 * ' ', '\u2502', 4 * ' ', 'Xтек', 7 * ' ',
      '\u2502', ' ' * 3, 'Sum ', 7 * ' ', '\u2502', sep='')
print('\u251C', 6 * '\u2500', '\u253C', 11 * '\u2500', '\u253C', 19 * '\u2500',
       '\u253C', 15 * '\u2500', '\u2524', sep='')

# Первая строчка
print('\u2502', '{:3d}'.format(i), '\u2502', '{:8.2f}'.format(x), '\u2502',
          '{:13.5f}'.format(y[i]),  '\u2502', '{:12.5f}'.format(sum), '\u2502')

# Высчитываем результат
while abs(y[i + 1] - y[i]) > eps:
    if i < k:
        i += 1
        i2 = 2 * i + 1
        y[i] = ((- 1) ** i) * x ** i2 / i2
        sum += y[i]
        if abs(y[i + 1] - y[i]) > step:
            print('\u2502', '{:3d}'.format(i), '\u2502', '{:8.2f}'.format(x), '\u2502',
                  '{:13.5f}'.format(y[i]),  '\u2502', '{:12.5f}'.format(sum), '\u2502')
    else:
        flag = False
        break

# Окончание таблицы
print('\u2514', 6 * '\u2500', '\u2534', 11 * '\u2500', '\u2534', 19 * '\u2500',
       '\u2534', 15 * '\u2500', '\u2518', sep='')

if flag == True:
    print('Ряд сходится к точности', eps, 'за', i, 'операций')
else:
    print('Ряд не сходится к точности', eps, 'за', i, 'операций')


