Операции вычисления.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Операции вычисления.

Сообщение Saturn.65 » 17.06.2009 (Ср) 16:30

Столкнулся с проблемой при вычислении. Научите правильно работать. Например: Делим одно число на другое, получаем некоторое не целое число, например 4.367. Это число записывается в TextBox99.Text не через точку, а с запятой (4,367). Вот тут и начинаются проблемы с участием этого числа. Все математические операции с Val(TextBox99.Text) происходят не правильно. Всему виной запятая. С точкой проблем нет, но точка и не появляется. Что я не правильно делаю? И как делать правильно?
Главное, ребята, сердцем не стареть...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Операции вычисления.

Сообщение iGrok » 17.06.2009 (Ср) 16:59

label:
cli
jmp label

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Операции вычисления.

Сообщение Saturn.65 » 17.06.2009 (Ср) 17:46

...Кстати, простейший способ получить символ разделения целой и дробной частей – вызвать функцию Format следующим образом
Format$(0, ".")
Этот вызов вернет текущий разделитель целой и дробной частей числа.

И как ее пристроить к TextBox? Пристраивал -число удаляет, только запятая остается. Кто-нибудь ни сочтет за труд, чтоб показать простенький пример замены запятой в десятичных числах на точку? Ведь это вам раз плюнуть. Я понимаю, что google бесконечное и поиск рулит, но у меня нет времени. Все написано, но уперся в эту запятую...
Главное, ребята, сердцем не стареть...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Операции вычисления.

Сообщение Viper » 17.06.2009 (Ср) 18:16

Replace
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Операции вычисления.

Сообщение alibek » 17.06.2009 (Ср) 18:48

Saturn.65 писал(а):Всему виной запятая.

Всему виной кривизна рук.
Оперировать числами, используя вместо числовых переменных текстбоксы, это очень самобытно и необычно, но неправильно.
Столь же самобытное решение — задай в настройках использование в качестве десятичного разделителя точки. Именно эта проблема будет решена.
Lasciate ogni speranza, voi ch'entrate.

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Операции вычисления.

Сообщение Saturn.65 » 17.06.2009 (Ср) 19:13

alibek писал(а):
Saturn.65 писал(а):Всему виной запятая.

Оперировать числами, используя вместо числовых переменных текстбоксы, это очень самобытно и необычно, но неправильно.
Столь же самобытное решение — задай в настройках использование в качестве десятичного разделителя точки. Именно эта проблема будет решена.

Я понимаю, что где-то неправильно. Тогда бы пример привели и делов то. А где задать в настройках точку? А на другом компе как будет работать?
Главное, ребята, сердцем не стареть...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Операции вычисления.

Сообщение iGrok » 17.06.2009 (Ср) 19:22

Saturn.65 писал(а):Я понимаю, что где-то неправильно. Тогда бы пример привели и делов то. А где задать в настройках точку? А на другом компе как будет работать?

На другом компе будет работать, если там тоже будет точка. )
А если запятая - то не будет.
label:
cli
jmp label

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Операции вычисления.

Сообщение Saturn.65 » 17.06.2009 (Ср) 19:52

iGrok писал(а):
Saturn.65 писал(а):Я понимаю, что где-то неправильно. Тогда бы пример привели и делов то. А где задать в настройках точку? А на другом компе как будет работать?

На другом компе будет работать, если там тоже будет точка. )
А если запятая - то не будет.

Вот и я про что. Не будете ли столь любезны привести мне пример с этой гнусной точкой. Как мне правильно разделить два числа, чтоб точка была вместо запятой.
Нашел вот такой пример, но под Change не правильно работает: курсор после точки влево уходит. Как его сделать в право?
Код: Выделить всё
Private Sub Text1_Change()
Pointindex# = InStr(Text1, ",")
  If Pointindex# = 0 Then 'есть ли в тексте запятая?
  ' нет
   If IsNumeric(Text1) Then   'можно ли текст преобразовать в число?
   
   Else
 
   End If
  Else 'в тексте есть хотя бы одна запятая
  'замена первой запятая на точку:
   Text1 = Left(Text1, Pointindex# - 1) & "." & Mid(Text1, Pointindex# + 2)

  End If
End Sub
Главное, ребята, сердцем не стареть...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Операции вычисления.

Сообщение Viper » 17.06.2009 (Ср) 20:05

Вот зачем тебе Change обрабатывать? У тебя математические операции производятся при вводе каждого символа? Наверняка ведь есть какая-то кнопка, которая запускает математическую операцию? Вот в ней то и заменяй запятую на разделитель целой и дробной части установленый в системе. Как его получить уже написано.
З.Ы. Читать мою статью до просветления!
Весь мир матрица, а мы в нем потоки байтов!

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Операции вычисления.

Сообщение arthur2 » 17.06.2009 (Ср) 20:15

Ты проводишь вычисления не с числами, а со строками. А ты проводи с числами. А в тексбоксы выводи только результаты. И ВООБЩЕ не придётся разбираться с запятыми. Закрепи за каждым тексбоксом переменную, которая будет хранить его значение.

Код: Выделить всё
public valTxt99 as single 'вот в этой переменной храни результат

valTxt99 = что-то там поделить на чтототам
TextBox99.text=valtxt99


И затем "Все математические операции с Val(TextBox99.Text)", которые "происходят не правильно" производи с valTxt99. И тогда тебе будет поровну, запятая там разделителем, или точка.

А если надо прочитать число из текстбокса, то как-то так:
Код: Выделить всё
valTxt99 =val(replace(textbox99.text,",",".")))


А после всех вычислений каждому тексбокус присвоишь значение соответствующей ему числовой переменной, и запятые или точки сами поставятся как нужно в системе
Артур
 
   

Dimen
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 82
Зарегистрирован: 25.05.2009 (Пн) 15:10

Re: Операции вычисления.

Сообщение Dimen » 18.06.2009 (Чт) 6:27

Кто-нибудь ни сочтет за труд, чтоб показать простенький пример замены запятой в десятичных числах на точку? Ведь это вам раз плюнуть. Я понимаю, что google бесконечное и поиск рулит, но у меня нет времени. Все написано, но уперся в эту запятую...

Пример замены запятой на точку:
Код: Выделить всё
Private Sub Command1_Click()
iInput = Text1.Text
Text2.Text = Replace(iInput, ",", ".")
End Sub
Íå óïóñêàéòå øàíñ!

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Операции вычисления.

Сообщение arthur2 » 18.06.2009 (Чт) 7:37

alibek писал(а):Оперировать числами, используя вместо числовых переменных текстбоксы, это очень самобытно и необычно, но неправильно.
Столь же самобытное решение — задай в настройках использование в качестве десятичного разделителя точки. Именно эта проблема будет решена.


Человек пытается делать что-то через... излишнюю самобытность, а ему, вместо того, чтобы подсказать прямой путь без ям и ухабов, помогают "столь же самобытно" форсировать эти ямы.

Ещё раз по буквам: ОПЕРИРОВАТЬ НУЖНО ЧИСЛАМИ. А тексбоксы использовать только для вывода или ввода этих чисел. Но никак - не для хранения промежуточных значений. И НЕ БУДЕТ НИКАКИХ ПРОБЛЕМ С ЗАПЯТЫМИ.
Артур
 
   

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Операции вычисления.

Сообщение Saturn.65 » 18.06.2009 (Чт) 10:57

Dimen
arthur2
Огромное спасибо! Вот такой пример я и просил показать. Все свои проблемы решил.
С другой стороны я же Val ставлю перед текстбоксами. Это разве не тоже самое, что с числами работать? Хотя наверное нет, иначе бы проблем с запятой не было бы. Val видит число до запятой.
Главное, ребята, сердцем не стареть...

Dimen
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 82
Зарегистрирован: 25.05.2009 (Пн) 15:10

Re: Операции вычисления.

Сообщение Dimen » 18.06.2009 (Чт) 11:00

Всегда рад помочь!
Íå óïóñêàéòå øàíñ!

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Операции вычисления.

Сообщение arthur2 » 18.06.2009 (Чт) 11:36

Saturn.65 писал(а):С другой стороны я же Val ставлю перед текстбоксами. Это разве не тоже самое, что с числами работать?
Нет! Для работы с числами есть числовые переменные. Для работы со строками есть строковые переменные. А тексбоксы не нужно использовать ни для того, ни для другого.
Артур
 
   

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Операции вычисления.

Сообщение Saturn.65 » 18.06.2009 (Чт) 14:44

arthur2 писал(а):
Saturn.65 писал(а):С другой стороны я же Val ставлю перед текстбоксами. Это разве не тоже самое, что с числами работать?
Нет! Для работы с числами есть числовые переменные. Для работы со строками есть строковые переменные. А тексбоксы не нужно использовать ни для того, ни для другого.

Прочитал две книги уважаемых авторов и ни один не предупредил и даже не намекнул об этом. Я имею ввиду про переменные, делитель запятую и т.д. Все пишут как умножить Text1.Text на другой. Ладно еще хоть про Val что-то сказали.
Главное, ребята, сердцем не стареть...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Операции вычисления.

Сообщение Хакер » 18.06.2009 (Чт) 14:46

Надо читать MSDN.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Операции вычисления.

Сообщение Saturn.65 » 18.06.2009 (Чт) 15:17

Хакер писал(а):Надо читать MSDN.

Все мечтал его скачать. Но все никак не попадалась ссылка "Download". Все вокруг да около.
Главное, ребята, сердцем не стареть...

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Операции вычисления.

Сообщение Saturn.65 » 19.06.2009 (Пт) 20:34

Еще не понимаю, что за штука такая? Сперва все работает и вдруг выдает ошибку 13 о несоответствии видов. Ставлю везде Val. Все начинает работать. Успокаиваюсь. Вроде программу дописал и вдруг перестает вычислять. Оказывается надо кое-где убрать Val, хотя я ничего не трогал и 5 минут назад все работало без проблем. Уже и боюсь. Вдруг опять проблемы с этой функцией. В чем может быть причина?
Главное, ребята, сердцем не стареть...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Операции вычисления.

Сообщение Viper » 19.06.2009 (Пт) 21:02

Saturn.65 писал(а):Еще не понимаю, что за штука такая? Сперва все работает и вдруг выдает ошибку 13 о несоответствии видов. Ставлю везде Val. Все начинает работать. Успокаиваюсь. Вроде программу дописал и вдруг перестает вычислять. Оказывается надо кое-где убрать Val, хотя я ничего не трогал и 5 минут назад все работало без проблем. Уже и боюсь. Вдруг опять проблемы с этой функцией. В чем может быть причина?
Причина в том, что Val всегда преобразовывает свой аргумент в число. Если аргумент не может быть преобразован в число, то возвращается 0. Если в аргументе (в строке) есть символ недопустимый для числа, то Val вернет в качестве результата часть аргумента до недопустимого символа. Если же вместо Val использовать, например, CVal, то в случае наличия недопустимых символов в аргументе, CVal вернет ошибку.
Весь мир матрица, а мы в нем потоки байтов!

HiddenMan
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 13.12.2006 (Ср) 20:58
Откуда: от туда

Re: Операции вычисления.

Сообщение HiddenMan » 19.06.2009 (Пт) 21:09

я ничего не трогал и 5 минут назад все работало без проблем

ты хоть кусочек коду то покажи, интересно же :)
С уважением, я.

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Операции вычисления.

Сообщение Saturn.65 » 19.06.2009 (Пт) 22:01

Например вот такая формула и к ней такие переменные:
Label56.Caption = (Rast * Norma) + (((Rast * Tonn) / 100) * 1.3)
Код: Выделить всё
Dim Rast As Single
Dim Norma As Single
Dim NormaZ As Single
Dim Tonn As Single
Tonn = Combo2.Text
Norma = Text7.Text
Rast = Label78.Caption
TonnM = Combo1.Text

И вот сперва ставил в переменных Val(....), работало, но после ошибка 13 выскочила и пришлось Val убрать. Сейчас опять работает. Вот меня и берут сомнения по поводу надежности. А то на вычисляешь...
Главное, ребята, сердцем не стареть...

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Операции вычисления.

Сообщение pronto » 20.06.2009 (Сб) 5:21

Вариант, конечно, кривой, так как здесь уже неоднократно намекали на использование числовых типов в математических действиях. Дело всё в том, что «присвоение» (Например, Norma = Text7.Text) тоже относится к мат. действию, так как Norma имеет тип Single. Если бы Norma имела тип String, то всё было бы корректно. Поэтому, чтобы «выправить» данное «присвоение», то необходимо корректно преобразовать Text7.Text к числу. И здесь мало одной функции Val(), так как числа могут быть дробными. Получается следующий алгоритм решения проблемы.
    Получить и запомнить системный разделитель целой и дробной части.
    В текстовой переменной, в которой хранится необходимое число (чувствуется несуразность?), заменить системный разделитель на «точку».
    Преобразовать текст в число функцией Val().

Криво? Да...
Поэтому для работы и хранения чисел используй соответствующие типы переменных и/или массивов.
O, sancta simplicitas!

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Операции вычисления.

Сообщение Saturn.65 » 20.06.2009 (Сб) 6:18

pronto писал(а): Если бы Norma имела тип String, то всё было бы корректно. Поэтому, чтобы «выправить» данное «присвоение», то необходимо корректно преобразовать Text7.Text к числу. И здесь мало одной функции Val(), так как числа могут быть дробными. Получается следующий алгоритм решения проблемы.
Поэтому для работы и хранения чисел используй соответствующие типы переменных и/или массивов.

Раньше у меня вообще было только Dim без всяких String. Т.е. если я перепишу на String, то будет нормально работать? С дробными числами я поступил, как мне прислали пример. Т.е. запятая автоматически заменяется на точку. После этого ошибок в вычислении не было.
Код: Выделить всё
Private Sub Text1_Change()
iInput = Text1.Text
Text1.Text = Replace(iInput, ",", ".")
End Sub
Главное, ребята, сердцем не стареть...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Операции вычисления.

Сообщение arthur2 » 20.06.2009 (Сб) 9:09

Твоя проблема в том, что ты хранишь промежуточные результаты в свойствах объектов. Заведи же наконец отдельную переменную для промежуточных результатов, а не преобразуй взад-вперед
Код: Выделить всё
'Вместо
'Label56.Caption = (Rast * Norma) + (((Rast * Tonn) / 100) * 1.3)

'вот так
val56= (Rast * Norma) + (((Rast * Tonn) / 100) * 1.3)
Label56.Caption = val56

И потом, когда тебе понадобится значение этого лейбла, просто возьмешь из val56
Артур
 
   

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Операции вычисления.

Сообщение Saturn.65 » 20.06.2009 (Сб) 9:17

arthur2
Спасибо! Коротко и ясно и с примером. Буду теперь знать.
Провел эксперимент:
Код: Выделить всё
Private Sub Command1_Click()
Dim Aaaa As Single
Dim Bbbb As Single
Aaaa = Val(Text1.Text)
Bbbb = Val(Text2.Text)

L1 = Aaaa - Bbbb
Label1.Caption = L1
End Sub

Private Sub Command2_Click()
Dim Aaaa As String
Dim Bbbb As String
Aaaa = Val(Text1.Text)
Bbbb = Val(Text2.Text)

L1 = Aaaa + Bbbb
Label1.Caption = L1
End Sub

Private Sub Command3_Click()
Dim Aaaa As Single
Dim Bbbb As Single
Aaaa = Text1.Text
Bbbb = Text2.Text

L1 = Aaaa - Bbbb
Label1.Caption = L1
End Sub


Все работают по разному. Command3 позволяет делать операции с разделителем десятичных -запятая, но выдает ошибку 13 при разделении десятичных точкой. Вывод такой, что если используется запятая, то Val ставить не надо. А если точка, то надо. И еще зависит от String или Single... Короче говоря каши в голове стало еще больше. :D
А есть универсальное средство, которое любые математические действия делает правильно, независимо от региональных настроек запятой или точки? Т.е. любые цифры вставляй, хоть дели, хоть складывай и умножай и будет правильно?
Главное, ребята, сердцем не стареть...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Операции вычисления.

Сообщение arthur2 » 20.06.2009 (Сб) 11:28

Saturn.65 писал(а):А есть универсальное средство, которое любые математические действия делает правильно, независимо от региональных настроек запятой или точки? Т.е. любые цифры вставляй, хоть дели, хоть складывай и умножай и будет правильно?


Есть :) Используй не строки, а числа и дели-умножай сколько хочешь.

arthur2 писал(а):Command3 позволяет делать операции с разделителем десятичных -запятая, но выдает ошибку 13 при разделении десятичных точкой. Вывод такой, что если используется запятая, то Val ставить не надо. А если точка, то надо.


Перед использованием val просто заменяй все запятые на точки - и не придётся думать о региональных настройках. Я же писал:
arthur2 писал(а):
Код: Выделить всё
valTxt99 =val(replace(textbox99.text,",",".")))

(обрати внимание - в самом текстбоксе от этого кода запятая никуда не денется, но val сработает правильно)
Артур
 
   


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

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

Сейчас этот форум просматривают: Google-бот и гости: 67

    TopList