не удается получить ответ. в чём ошибка?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
irek
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 17.12.2012 (Пн) 13:18

не удается получить ответ. в чём ошибка?

Сообщение irek » 17.12.2012 (Пн) 13:24

Код: Выделить всё
Function f2(X) As Double
f2 = Log(X - 7) + 4 * Sin(X)
End Function
Function f3(Z) As Double
f3 = Z ^ 2 - Log(Z)
End Function
Private Sub Command1_Click()
Picture1.Cls
e = Val(Text1)
Z = e
Y = f2(30)

If e > 0 Then

For X = 30 To 50 Step e
If X <> 0 Then
  If f2(X) < Y Then
  Y = f2(X)
  tmp = Round(X, 15)
  End If
End If
Next X

Y = f3(e)
For Z = e To 1 Step e
If f3(Z) < Y Then
Y = f3(Z)
tmp2 = Z
End If
Next Z

Picture1.Print "Значение Х=" & tmp
Picture1.Print "Значение Z=" & tmp2
Picture1.Print "Минимальное значение целевой функции =" & f2(tmp) + f3(tmp2)
Else
Picture1.Print "Измените шаг"
End If
End Sub
Последний раз редактировалось irek 17.12.2012 (Пн) 20:05, всего редактировалось 1 раз.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: не удается получить ответ. в чём ошибка?

Сообщение ger_kar » 17.12.2012 (Пн) 18:27

Эх...
1) Приведи код в порядок, у тебя каша. Для читабельности кода применяются отступы, которые ставятся клавишей Tab. Кроме этого, что там за каракули внизу? Ты сам то хоть свой пост просматривал?
2) Вполне возможно, что отступы были, но движок форума их убрал, потому как пост оформлен неправильно. Для того что-бы оформить правильно примени тег Code. Т.е. выдели код и нажми на этот тег. Тогда и отступы сохраняться и читабельность увеличится и ... Вобщем исправляй оформление и сам все увидишь.
3) Далее у VB есть такая замечательная директива Option Explicit. Применяй ее всегда! И только так! Почему? Обязательно прочитай об этом. Про это написано столько, что повторяться смысла нет. И твоя ошибка как раз следствие не применения Option Explicit и отсутствия объявления переменных.
4) Конкретно твоя ошибка возникает здесь f2 = Log(X - 7) + 4 * Sin(X) и возникает абсолютно правильно ибо в момент возникновения ошибки переменная имеет значение не 0, а Empty, а имеет она это значение потому что она имеет тип Variant, а тип такой получился из за того, что нет явного объявления. А был бы Option Explicit ... Вобщем приводи все в порядок.

PS Поставь у PictureBox свойство AutoRedraw = True
Последний раз редактировалось ger_kar 17.12.2012 (Пн) 18:30, всего редактировалось 1 раз.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: не удается получить ответ. в чём ошибка?

Сообщение ger_kar » 17.12.2012 (Пн) 18:29

Пока писал ответ, с тегом Code Viper меня опередил :) Но насчет остального ...
Бороться и искать, найти и перепрятать

irek
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 17.12.2012 (Пн) 13:18

Re: не удается получить ответ. в чём ошибка?

Сообщение irek » 17.12.2012 (Пн) 19:58

просматривал. русский язык исказился. не стал исправлять, ибо не имеет смысла.
про табулирование знаю, дело не в красоте пока, а в самой программе. спасибо

irek
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 17.12.2012 (Пн) 13:18

Re: не удается получить ответ. в чём ошибка?

Сообщение irek » 17.12.2012 (Пн) 20:03

вот именно, что проблема именно в f2. вставляя другую функцию, программа работает.. вообщем хз.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: не удается получить ответ. в чём ошибка?

Сообщение ger_kar » 17.12.2012 (Пн) 20:18

irek писал(а):просматривал. русский язык исказился. не стал исправлять, ибо не имеет смысла.
Делать нормально всегда имеет смысл
irek писал(а):про табулирование знаю, дело не в красоте пока, а в самой программе. спасибо
Вот именно дело не в красоте, а в самой программе, код которой должен быть как минимум хотя-бы читаем. Именно для лучшей читаемости отступы и были придуманы. Отступы надо делать всегда, тем более если ты его на всеобщее обозрение выкладываешь. В хорошо оформленном коде можно сразу разобраться, а что-бы разобраться в твоем мне например пришлось его сначала приводить в читаемый вид.

irek писал(а):вставляя другую функцию, программа работает.. вообщем хз.
Ты видимо мой пост то ли не дочитал, то ли не знаю что. Я же четко сформулировал причину ошибки. Она возникает из за того что функция Log получает не числовое значение, а Empty. И получается это в следствии того что перемененные не объявлены надлежащим образом. Вобщем прочитай про то, почему необходимо ставить Option Explicit , про это пишется практически во всех советах по VB. И больше вообще никогда! не делай без этой директивы, объяви нормально переменные и все у тебя встанет на свои места.
Бороться и искать, найти и перепрятать

irek
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 17.12.2012 (Пн) 13:18

Re: не удается получить ответ. в чём ошибка?

Сообщение irek » 17.12.2012 (Пн) 20:24

объявил все переменные., которые VB запросил. тщетно..(

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: не удается получить ответ. в чём ошибка?

Сообщение ger_kar » 17.12.2012 (Пн) 20:57

Ну, показывай, что ты там наобъявлял :).
Бороться и искать, найти и перепрятать

irek
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 17.12.2012 (Пн) 13:18

Re: не удается получить ответ. в чём ошибка?

Сообщение irek » 17.12.2012 (Пн) 20:59

тупо объявил. давай, глумись...)

Код: Выделить всё
Option Explicit
Dim e As Double
Dim Z, Y, X, tmp, tmp2

Function f2(X) As Double
f2 = Log(X) + 4 * Sin(X)
End Function
Function f3(Z) As Double
f3 = Z ^ 2 - Log(Z)
End Function
Private Sub Command1_Click()
Picture1.Cls
e = Val(Text1)
Z = e
Y = f2(30)

If e > 0 Then

For X = 30 To 50 Step e
If X <> 0 Then
  If f2(X) < Y Then
  Y = f2(X)
  tmp = Round(X, 15)
  End If
End If
Next X

Y = f3(e)
For Z = e To 1 Step e
If f3(Z) < Y Then
Y = f3(Z)
tmp2 = Z
End If
Next Z

Picture1.Print "Çíà÷åíèå Õ=" & tmp
Picture1.Print "Çíà÷åíèå Z=" & tmp2
Picture1.Print "Ìèíèìàëüíîå çíà÷åíèå öåëåâîé ôóíêöèè =" & f2(tmp) + f3(tmp2)
Else
Picture1.Print "Èçìåíèòå øàã"
End If
End Sub


ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: не удается получить ответ. в чём ошибка?

Сообщение ger_kar » 17.12.2012 (Пн) 21:16

Dim Z, Y, X, tmp, tmp2Ну те же яйца, только вид сбоку. Ты тип не указал и по умолчанию опять имеем тип Variant, значение Empty и те же грабли.
А переносы так и не судьба расставить?
Бороться и искать, найти и перепрятать

irek
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 17.12.2012 (Пн) 13:18

Re: не удается получить ответ. в чём ошибка?

Сообщение irek » 17.12.2012 (Пн) 21:20

ger_kar писал(а):Dim Z, Y, X, tmp, tmp2Ну те же яйца, только вид сбоку. Ты тип не указал и по умолчанию опять имеем тип Variant, значение Empty и те же грабли.
А переносы так и не судьба расставить?


ставил дабл. разницы нет. ну что вы как преподаватель.. просто понимаю что в простом месте туплю, но по прежнему считаю что косяк в функции.. X задам как Double и что?? аргумент логарифма как был пустой, так и остался..

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: не удается получить ответ. в чём ошибка?

Сообщение ger_kar » 17.12.2012 (Пн) 21:57

Неужели невыносимо трудно Dim X As Double, tmp As Double написать? В Function f2(X As Double) As Double Указать тип аргумента? Далее ошибка будет уже потому, что функции передается 0, при этом естественно Log(0)будет вызывать ошибку так как ты хочешь вычислить логарифм от нуля. Ноль передается потому как tmp=0, а нулю он равен потому что вычисления Y = f2(X) tmp = Round(X, 15) никогда не выполняются, а не выполняются потому ...
Вобщем смотри внимательно на
Код: Выделить всё
  If f2(X) < Y Then
  Y = f2(X)
  tmp = Round(X, 15)
  End If
Бороться и искать, найти и перепрятать

irek
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 17.12.2012 (Пн) 13:18

Re: не удается получить ответ. в чём ошибка?

Сообщение irek » 17.12.2012 (Пн) 22:17

пардон. экспериментировал и потерял "-7"
вообщем функция такая
Код: Выделить всё
Function f2(X As Double) As Double
f2 = Log(X-7) + 4 * Sin(X)
End Function


т.е нужно исключить х=7?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.12.2012 (Пн) 23:11

Логарифм определён только для положительных аргументов.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33

    TopList