PDA

Показать полную графическую версию : [решено] Проблема с арифметикой.


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

Например.

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

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

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

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

madmasles
29-11-2010, 01:40
sashadeg,
Попробуйте так, у меня работает:#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <Array.au3>

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

Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aResult[$j + 1]
$iUBound = Ceiling (http://www.autoitscript.com/autoit3/docs/functions/Ceiling.htm)(($iEnd - $iStart) / $iStep)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 0 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $iUBound
$iTemp = $iStart + $i * $iStep
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) Mod (http://www.autoitscript.com/autoit3/docs/functions/Mod.htm)($iTemp, $iDivisor) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$j += 1
ReDim (http://www.autoitscript.com/autoit3/docs/keywords.htm#ReDim) $aResult[$j + 1]
$aResult[$j] = StringFormat (http://www.autoitscript.com/autoit3/docs/functions/StringFormat.htm)('%.2f', $iTemp)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
$aResult[0] = $j ;кол-во искомых чисел
_ArrayDisplay (http://dundats.mvps.org/help/html/libfunctions/_arraydisplay.htm)($aResult)
Этот вариант, если у шага или у делителя много знаков после запятой, выдает ошибочный результат.

Yashied
29-11-2010, 02:26
С одной стороны, задачка конечно простая, но работать с вещественными числами нужно очень аккуратно. По возможности нужно избегать операций сравнения, и уж тем более не использовать такие выражения, как $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() - это просто преступление.

:)

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

sashadeg
29-11-2010, 16:41
Спасибо за ответы!
madmasles, Ваш вариант выдает не 2 числа, а целую кучу 0_О

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

gregaz
29-11-2010, 17:11
Вот еще похожий вариант с кодом попроще :

$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

SyDr
29-11-2010, 18:24
$Xmin = 7.9
$Xmax = 8.66

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

gregaz
29-11-2010, 18:52
SyDr, Красиво ,но не совсем корректно.
Скажем для :
$Xmin = 7.5
$Xmax = 8.4

???

sashadeg
29-11-2010, 18:54
В результате я использовал код Yashied. Всем спасибо! Решено.

SyDr
29-11-2010, 20:50
gregaz, скорее совсем не корректно :)
Правильно так:
$Xmin = 7.1
$Xmax = 8.4

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

Yashied
30-11-2010, 06:04
Ваш вариант работает, но почему то кроме "8" и "8,5" выдает ещё и "7,5"... »

Не может он этого выдавать. Какие $Xmin и $Xmax?

gregaz
30-11-2010, 06:24
Еще один простой вариант : не корректен !!!!!

For $i = $Xmin*10 To $Xmax*10
If IsInt($i/5) Then ConsoleWrite($i/10 & @CR)
Next

SyDr
30-11-2010, 09:22
Еще один простой вариант : »
$Xmin = 7.52
$Xmax = 8.5
:)

gregaz
30-11-2010, 17:35
SyDr, Да туфта получилась. Надо кончать заниматься извращением

sashadeg
30-11-2010, 18:44
Не может он этого выдавать. Какие $Xmin и $Xmax? »
те же самые... прямо код взял и скопировал... в консольку выкинуло 3 значения.
В любом случае спасибо!!! Благодаря Вам я написал очень и очень полезную удобную и нужную программу для расчета контрольной работы по геодезии Архитектурно - строительного факультета Южно уральского государственного университета =)




© OSzone.net 2001-2012