Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Проблема с арифметикой.

Ответить
Настройки темы
[решено] Проблема с арифметикой.

Аватара для sashadeg

Старожил


Сообщения: 379
Благодарности: 6

Профиль | Отправить PM | Цитировать


Здравствуйте. Как можно попроще найти числа, которые находятся в каком либо числовом промежутке и КРАТНЫЕ 0,5

Например.

Дано 2 числа:
"7.90" и "8.66"

Программы выведет 2 результата:
"8.0" и "8.5"

Помогите пожалуйста... Пишу программу для расчетов в инженерной геодезии...

P.S. Границы промежутка будут вводиться не очень большие - чисел, кратных 0.5 будет максимум 3-4....

-------
Ну вы ребята даёте...


Отправлено: 20:27, 28-11-2010

 

Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


sashadeg,
Попробуйте так, у меня работает:
Код: Выделить весь код
#include <Array.au3>

$iStart = 7.92
$iEnd = 28.69
$iStep = 0.01
$iDivisor = 0.5
$j = 0

Dim $aResult[$j + 1]
$iUBound = Ceiling(($iEnd - $iStart) / $iStep)
For $i = 0 To $iUBound
    $iTemp = $iStart + $i * $iStep
    If Not Mod($iTemp, $iDivisor) Then
        $j += 1
        ReDim $aResult[$j + 1]
        $aResult[$j] = StringFormat('%.2f', $iTemp)
    EndIf
Next
$aResult[0] = $j ;кол-во искомых чисел
_ArrayDisplay($aResult)
Этот вариант, если у шага или у делителя много знаков после запятой, выдает ошибочный результат.

Последний раз редактировалось madmasles, 29-11-2010 в 02:31.


Отправлено: 01:40, 29-11-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Yashied

Старожил


Сообщения: 206
Благодарности: 88

Профиль | Отправить PM | Цитировать


С одной стороны, задачка конечно простая, но работать с вещественными числами нужно очень аккуратно. По возможности нужно избегать операций сравнения, и уж тем более не использовать такие выражения, как $X0 = $X0 + $DX, дабы не накапливать ошибку...

Код: Выделить весь код
$Xmin = 7.9
$Xmax = 8.66
$DX = 0.5

; Первое минимальное число, которое делится на DX
$X0 = (Floor(($Xmin + $DX) / $DX) - Not($Xmin - (Floor(($Xmin + $DX) / $DX) - 1) * $DX)) * $DX

; Количество искомых чисел в из промежутка от X0 до Xmax включительно
$NX = 1 + Floor(($Xmax - $X0) / $DX)

; X0, X0+DX, X0+2*DX, ... , X0+(NX-1)*DX
For $i = 1 To $NX
    ConsoleWrite($X0 + ($i - 1) * $DX & @CR)
Next
madmasles

Долго, потому что Sleep()... Он в основном нужен только для GUI, где необходимо обрабатывать события от пользователя. Использование в расчетах Sleep() - это просто преступление.


Последний раз редактировалось Yashied, 29-11-2010 в 02:36.

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:26, 29-11-2010 | #3


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Yashied,
Я второй свой вариант удалил, так как он еще первое и последнее значения выдавал не правильные. А Sleep(1) у меня был вставлен для разгрузки процессора, а то он у меня без паузы на 100% грузился, а с ней - около 10%. Ваш вариант отрабатывает практически мгновенно и без ошибок.

Отправлено: 02:46, 29-11-2010 | #4


Аватара для sashadeg

Старожил


Сообщения: 379
Благодарности: 6

Профиль | Отправить PM | Цитировать


Спасибо за ответы!
madmasles, Ваш вариант выдает не 2 числа, а целую кучу 0_О

Yashied, Ваш вариант работает, но почему то кроме "8" и "8,5" выдает ещё и "7,5"... Странно...
Решил проблему просто заменив в единицу на двойку в конце кода
Код: Выделить весь код
For $i = 2 To $NX
    ConsoleWrite($X0 + ($i - 1) * $DX & @CR)
Next

-------
Ну вы ребята даёте...


Отправлено: 16:41, 29-11-2010 | #5


Аватара для gregaz

Пользователь


Сообщения: 88
Благодарности: 19

Профиль | Отправить PM | Цитировать


Вот еще похожий вариант с кодом попроще :
Код: Выделить весь код
$Xmin = 7.9
$Xmax = 8.66
$DX = 0.5

$D0=0.1
$Xmin-=0.1
Do 
  $Xmin+=$D0
Until StringIsInt ($Xmin/ $DX)

For $i=$Xmin To $Xmax Step $DX
	ConsoleWrite(Round($i,1) & @LF)
Next

Последний раз редактировалось gregaz, 29-11-2010 в 17:28.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:11, 29-11-2010 | #6


Аватара для SyDr

Старожил


Сообщения: 215
Благодарности: 62

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
$Xmin = 7.9
$Xmax = 8.66

For $i = Round($Xmin*2) To Round($Xmax*2)
    ConsoleWrite($i/2 & @CR)
Next

-------

"Что мы думаем, знаем или во что верим в конце концов не так уж и важно.
Важно лишь то, что мы делаем."
Джон Раскин

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:24, 29-11-2010 | #7


Аватара для gregaz

Пользователь


Сообщения: 88
Благодарности: 19

Профиль | Отправить PM | Цитировать


SyDr, Красиво ,но не совсем корректно.
Скажем для :
Код: Выделить весь код
$Xmin = 7.5
$Xmax = 8.4
???

Отправлено: 18:52, 29-11-2010 | #8


Аватара для sashadeg

Старожил


Сообщения: 379
Благодарности: 6

Профиль | Отправить PM | Цитировать


В результате я использовал код Yashied. Всем спасибо! Решено.

-------
Ну вы ребята даёте...


Отправлено: 18:54, 29-11-2010 | #9


Аватара для SyDr

Старожил


Сообщения: 215
Благодарности: 62

Профиль | Отправить PM | Цитировать


gregaz, скорее совсем не корректно
Правильно так:
Код: Выделить весь код
$Xmin = 7.1
$Xmax = 8.4

For $i = Ceiling($Xmin*2) To Floor($Xmax*2)
    ConsoleWrite($i/2 & @CR)
Next

-------

"Что мы думаем, знаем или во что верим в конце концов не так уж и важно.
Важно лишь то, что мы делаем."
Джон Раскин


Отправлено: 20:50, 29-11-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Проблема с арифметикой.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интернет - Wireless Проблема( или проблема совместимости) Ahimanu Microsoft Windows 7 0 06-03-2010 16:05
2008 - [решено] Проблема с ГП в AD., проблема при создании ГП к отдельным OU kozemit Windows Server 2008/2008 R2 2 15-07-2009 10:52
Разное - Проблема установки Adobe Flash Player и проблема Windows Live RubinSky Microsoft Windows 7 3 26-03-2009 21:23
Ошибка - Странная проблема с кодировкой(похоже проблема с преобразованием кодировок) Mertvii Microsoft Windows 2000/XP 1 13-07-2008 16:05
Как быстро и точно определить, в чём проблема? Явная проблема в железе UTU Непонятные проблемы с Железом 16 22-05-2006 01:27




 
Переход