VBA: Найти сумму с заданной точностью, чтобы выполнялось неравенство |An| < E

Автор only_vitka, 18 декабря 2017, 21:19

only_vitka

Привет всем. Пока только учу VBA. Можете помочь с одним заданием? Никак не могу понять, как это сделать. Пожалуйста.
Нужно найти сумму с заданной точностью, где An = n^(корень n) - x / n!
E=10^(-7)

[вложение удалено администратором]

Администратор

При каких значениях "x" надо тестировать, я не знаю. Это вам надо смотреть математику.
Сумма считается до тех пор, пока очередное слагаемое (абсолютное значение, т.е. без учёта знака) не станет меньше заданной точности.
Последнее слагаемое, которое меньше заданной точности, не приплюсовывается.

Макрос
Sub макрос()

    ' Создание в оперативной памяти компьютера поименованной области - переменной "sum".
        ' Переменная нужна, чтобы в неё что-нибудь записывать. Переменную можно сравнить
        ' с файлом, но файл находится на жёстком диске компьютера, а переменная в оперативной памяти.
    ' Double означает, что в переменной могут быть только числа (текст не может быть).
        ' Причём числа могут быть как целые, так и дробные.
    Dim sum As Double, slagaemoe As Double, x As Double
    ' Long означает, что в переменной могут быть только числа. Причём числа могут быть только целые.
    ' String означает, что данные, которые будут в переменной, будут считаться текстом.
    Dim n As Long, InputText As String, factorial As Double
    ' Создание в оперативной памяти компьютера константы "e". Константа это такая же переменная,
        ' только в неё можно записать данные один раз.
    Const e As Double = 10 ^ (-7)
   
   
    '1. Юзер записывает "x" в переменную "InputText".
    InputText = InputBox("Введите ""x"":")
    ' Если юзер щёлкнул "Cancel", то выход из процедуры "макрос" и тем самым завершение работы макроса.
        ' If ... Then ... End If используется для выбора действия.
    If InputText = "" Then
        Exit Sub
    End If
   
    '2. Копирование данных из переменной "InputText" в переменную "x", чтобы
        ' число было в виде числа, а не в виде текста, чтобы было логично.
    x = InputText
   
    '3. Сразу записываем в переменную "factorial" число 1. По умолчанию там ноль.
        ' А если будет ноль, то далее при расчётах факториала всегда будет ноль,
        ' т.к. при умножении на ноль будет ноль.
    factorial = 1
   
    '4.
    ' Do .. Loop - это цикл. Цикл используется, чтобы запускать одну и ту же команду несколько раз.
    Do
        '1) Запись в переменную "n" числа. В неё записывается число из переменной "n" плюс 1.
        n = n + 1
        '2) Расчёт факториала.
        factorial = factorial * n
        '3) Расчёт слагаемого для текущего "n".
        slagaemoe = n ^ Sqr(n) - x / factorial
        '4) Если абсолютное значение слагаемого меньше заданной точности.
        If Abs(slagaemoe) < e Then
            ' Сумма рассчитана и выход из цикла с Do.
            Exit Do
        '5)  Если абсолютное значение слагаемого не меньше заданной точности.
        Else
            ' Добавление слагаемого к имеющейся сумме.
            sum = sum + slagaemoe
        End If
    Loop
   
    '5. Сообщение.
    MsgBox "Сумма равна: " & sum, vbInformation
   
End Sub
[свернуть]

only_vitka


Администратор

Если x заранее задан, то пункт 1 удалите, а в пункте 2 в переменную x просто запишите нужное число.
И удалите переменную "InputText ", чтобы не было лишнего и не усложняло восприятие макроса.


Администратор

Ну или вообще не используйте переменную "x", а подставьте число вместо "x" в пункте 4.3.
Да, если сразу нужно записать число в переменную "x", то это уже оформите как константу. В макросе есть уже одна константа, поэтому можете сделать по аналогии.