Помогите завершить программу в VBA word

Oleh

Новый пользователь
Сообщения
6
Реакции
0
Нужно вывести ответ в массиве

VB.NET / VBA:
Sub Task2()
'


Dim a As Single
Dim p As Single
Dim y As Single
Dim x As Single
Dim x0 As Single
Dim xn As Single
Dim dx As Single

a = InputBox("Ввести a")
p = InputBox("Ввести p")

x0 = InputBox("Ввести x0")
xn = InputBox("Ввести xn")
dx = InputBox("Ввести dx")


x = x0
While x <= xn

If x = 1.4 Then
y = a * x ^ 3 + 7 * Sqr(x)
MsgBox ("При x= " + Str(x) + "  значение y=  " + Str(y))
Else
If x < 1.4 Then
y = p * x ^ 2 - 7 / x ^ 2
MsgBox ("При x= " + Str(x) + "  значение y=  " + Str(y))
Else
y = Log(x + 7 * Sqr(Abs(x + a)) / Log(10))
MsgBox ("При x= " + Str(x) + "  значение y=  " + Str(y))
End If
End If
x = x + dx
Wend


End Sub
 
Последнее редактирование:

Sandor

Команда форума
Администратор
Супер-Модератор
Ассоциация VN/VIP
Преподаватель
Сообщения
10,940
Реакции
2,942
Оформляйте скрипт кодом и не будет смайликов )

И, кстати, опишите подробнее, пожалуйста - что уже делали и что не получается?
 

Oleh

Новый пользователь
Сообщения
6
Реакции
0
Алгоритм итерационной циклической структуры Следует вывести ответы функции в массиве (в одном окне).Ниже окна с ответом, а я хочу чтоб отвести булт в одном окне.
 

Вложения

  • 5.png
    5.png
    7 KB · Просмотры: 2
  • 7.png
    7.png
    5.7 KB · Просмотры: 3
  • 6.png
    6.png
    2 KB · Просмотры: 3

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,797
Реакции
6,262
При копировании кода, используйте специальную кнопку, иначе теряется стиль форматирования отступов.
А чтобы копировать русский текст, а не знаки вопросов, перед копированием переключайте раскладку клавиатуры на русский язык.
выходит, что при копировании кода из форума надо тоже включать русскую раскладку

VB.NET / VBA:
Option Explicit

Sub main()

    Dim a As Single
    Dim p As Single
    Dim y As Single
    Dim x As Single
    Dim x0 As Single
    Dim xn As Single
    Dim dx As Single
    Dim ret As String
  
    a = InputBox("?????? a")
    p = InputBox("?????? p")
    x0 = InputBox("?????? x0")
    xn = InputBox("?????? xn")
    dx = InputBox("?????? dx")
  
    x = x0
  
    While x <= xn
        If x = 1.4 Then
            y = a * x ^ 3 + 7 * Sqr(x)
            ret = ret & vbNewLine & ("??? x= " + Str(x) + "  ???????? y=  " + Str(y))
        Else
            If x < 1.4 Then
                y = p * x ^ 2 - 7 / x ^ 2
                ret = ret & vbNewLine & ("??? x= " + Str(x) + "  ???????? y=  " + Str(y))
            Else
                y = Log(x + 7 * Sqr(Abs(x + a)) / Log(10))
                ret = ret & vbNewLine & ("??? x= " + Str(x) + "  ???????? y=  " + Str(y))
            End If
        End If
        x = x + dx
    Wend
  
    MsgBox ret
  
End Sub

В коде не хватает проверки деления на ноль.
 
Последнее редактирование:

Oleh

Новый пользователь
Сообщения
6
Реакции
0
VB.NET / VBA:
Option Explicit

Sub main()

    Dim a As Single
    Dim p As Single
    Dim y As Single
    Dim x As Single
    Dim x0 As Single
    Dim xn As Single
    Dim dx As Single
    Dim ret As String
 
    a = InputBox("?????? a")
    p = InputBox("?????? p")
    x0 = InputBox("?????? x0")
    xn = InputBox("?????? xn")
    dx = InputBox("?????? dx")
 
    x = x0
 
    While x <= xn
        If x = 1.4 Then
            y = a * x ^ 3 + 7 * Sqr(x)
            ret = ret & vbNewLine & ("??? x= " + Str(x) + "  ???????? y=  " + Str(y))
        Else
            If x < 1.4 Then
                y = p * x ^ 2 - 7 / x ^ 2
                ret = ret & vbNewLine & ("??? x= " + Str(x) + "  ???????? y=  " + Str(y))
            Else
                y = Log(x + 7 * Sqr(Abs(x + a)) / Log(10))
                ret = ret & vbNewLine & ("??? x= " + Str(x) + "  ???????? y=  " + Str(y))
            End If
        End If
        x = x + dx
    Wend
 
    MsgBox ret
 
End Sub
В коны я вводив область [0,7;2], но в окне вывело только к 1,9 ,помогите сделать чтобы выводило 2.
1.png
 

Вложения

  • 1.png
    1.png
    4.7 KB · Просмотры: 1

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,797
Реакции
6,262
Нельзя напрямую приравнивать между собой 2 числа с плавающей точкой. Результат такой операции является неопределённым поведением и зависит от особенностей реализации процессорных инструкций и рандома.
Чтобы обойти данную проблему, вы можете добавить в код такую вспомогательную функцию:

Код:
Public Function AreFloatAlmostEqual(a As Single, b As Single, Optional precision As Single = 0.001)
    AreFloatAlmostEqual = Abs(a - b) <= precision
End Function

Затем модифицировать эту часть:
Код:
    While x <= xn
        If x = 1.4 Then

например, так:
Код:
    While (x < xn) Or (AreFloatAlmostEqual(x, xn))
        If AreFloatAlmostEqual(x, 1.4) Then
 
Последнее редактирование:

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,797
Реакции
6,262
Код:
Option Explicit

Sub main()

    Dim a As Single
    Dim p As Single
    Dim y As Single
    Dim x As Single
    Dim x0 As Single
    Dim xn As Single
    Dim dx As Single
    Dim ret As String
 
    a = InputBox("?????? a")
    p = InputBox("?????? p")
    x0 = InputBox("?????? x0")
    xn = InputBox("?????? xn")
    dx = InputBox("?????? dx")
 
    x = x0
 
    While (x < xn) Or (AreFloatAlmostEqual(x, xn))
        If AreFloatAlmostEqual(x, 1.4) Then
            y = a * x ^ 3 + 7 * Sqr(x)
            ret = ret & vbNewLine & ("??? x= " + Str(x) + "  ???????? y=  " + Str(y))
        Else
            If x < 1.4 Then
                y = p * x ^ 2 - 7 / x ^ 2
                ret = ret & vbNewLine & ("??? x= " + Str(x) + "  ???????? y=  " + Str(y))
            Else
                y = Log(x + 7 * Sqr(Abs(x + a)) / Log(10))
                ret = ret & vbNewLine & ("??? x= " + Str(x) + "  ???????? y=  " + Str(y))
            End If
        End If
        x = x + dx
    Wend
 
    MsgBox ret
 
End Sub

Public Function AreFloatAlmostEqual(a As Single, b As Single, Optional precision As Single = 0.001)
    AreFloatAlmostEqual = Abs(a - b) <= precision
End Function
 
Сверху Снизу