Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Проблема с арифметикой. (http://forum.oszone.net/showthread.php?t=192527)

sashadeg 28-11-2010 20:27 1553676

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

Например.

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

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

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

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

madmasles 29-11-2010 01:40 1553847

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)

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

Yashied 29-11-2010 02:26 1553858

С одной стороны, задачка конечно простая, но работать с вещественными числами нужно очень аккуратно. По возможности нужно избегать операций сравнения, и уж тем более не использовать такие выражения, как $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 1553863

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

sashadeg 29-11-2010 16:41 1554260

Спасибо за ответы!
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 1554292

Вот еще похожий вариант с кодом попроще :
Код:

$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 1554346

Код:

$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 1554376

SyDr, Красиво ,но не совсем корректно.
Скажем для :
Код:

$Xmin = 7.5
$Xmax = 8.4

???

sashadeg 29-11-2010 18:54 1554378

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

SyDr 29-11-2010 20:50 1554496

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 1554762

Цитата:

Цитата sashadeg
Ваш вариант работает, но почему то кроме "8" и "8,5" выдает ещё и "7,5"... »

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

gregaz 30-11-2010 06:24 1554766

Еще один простой вариант : не корректен !!!!!
Код:

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


SyDr 30-11-2010 09:22 1554834

Цитата:

Цитата gregaz
Еще один простой вариант : »

Код:

$Xmin = 7.52
$Xmax = 8.5

:)

gregaz 30-11-2010 17:35 1555223

SyDr, Да туфта получилась. Надо кончать заниматься извращением

sashadeg 30-11-2010 18:44 1555260

Цитата:

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

те же самые... прямо код взял и скопировал... в консольку выкинуло 3 значения.
В любом случае спасибо!!! Благодаря Вам я написал очень и очень полезную удобную и нужную программу для расчета контрольной работы по геодезии Архитектурно - строительного факультета Южно уральского государственного университета =)


Время: 06:27.

Время: 06:27.
© OSzone.net 2001-