Что нового

[Математика] Получить общий процент выполнения

joiner

Модератор
Локальный модератор
Сообщения
3 362
Репутация
586
Нужно получить общий процент прогресса счета
пример
Код:
HotKeySet('{ESC}', '_Close')
Local $Num1 = 45; отдельные 100%
Local $Num2 = 768; отдельные 100%
Local $Num3 = 132; отдельные 100%
Local $AllNum = $Num1 + $Num2 + $Num3; Общие 100%
Local $OneAll = Floor($AllNum / 100); один процент от общих 100%

ProgressOn('', 'Прогресс', '', -1, -1, 16)
Local $perc = Floor($Num1 / 100)
Local $percs
For $i = 1 To $Num1
	$percs = Floor($i / $perc)
	If $percs >= $OneAll Then
		ProgressSet($OneAll, $OneAll & '%', 'Прогресс')
		$OneAll = $percs
	EndIf
	Sleep(100)
Next
$perc = Floor($Num2 / 100)
For $i = 1 To $Num2
	$percs = Floor($i / $perc)
	If $percs >= $OneAll Then
		ProgressSet($OneAll, $OneAll & '%', 'Прогресс')
		$OneAll = $percs
	EndIf
	Sleep(10)
Next
$perc = Floor($Num3 / 100)
For $i = 1 To $Num3
	$percs = Floor($i / $perc)
	If $percs >= $OneAll Then
		ProgressSet($OneAll, $OneAll & '%', 'Прогресс')
		$OneAll = $percs
	EndIf
	Sleep(100)
Next
ProgressOff()

Func _Close()
	ProgressOff()
	Exit
EndFunc   ;==>_Close
понимаю, что решение где-то рядом, но ухватить не могу :smile:
 

xXx

Меценат
Меценат
Сообщения
200
Репутация
70
Код:
HotKeySet('{ESC}', '_Close')
Local $Num1 = 45
Local $Num2 = 768
Local $Num3 = 130
Local $AllNum = $Num1 + $Num2 + $Num3; Общие 100%
Local $OneAll = $AllNum / 100; один процент от общих 100%
Local $percNum1 = $Num1/$OneAll; отдельные 100%
Local $percNum2 = $Num2/$OneAll; отдельные 100%
Local $percNum3 = $Num3/$OneAll; отдельные 100%
Local $percIn, $percTo

ProgressOn('', 'Прогресс', '', -1, -1, 16)
$percIn = 0
$percTo = $percNum1
For $i = $percIn To $percTo
	ProgressSet($i, Ceiling($i) & '%', '$Num1')
    Sleep(100)
Next

$percIn = $percTo
$percTo += $percNum2
For $i = $percIn To $percTo
	ProgressSet($i, Ceiling($i) & '%', '$Num2')
    Sleep(100)
Next

$percIn = $percTo
$percTo += $percNum3
For $i = $percIn To $percTo
	ProgressSet($i, Ceiling($i) & '%', '$Num3')
	Sleep(100)
Next

Sleep(1000)
ProgressOff()

Func _Close()
    ProgressOff()
    Exit
EndFunc   ;==>_Close
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3 362
Репутация
586
xXx, спасибо. это как раз и мелькало в мозгу. ошибка моя была в том, что "смешал людей и коней" :smile:



оказалось, я даже пример с ошибкой выложил. задача немного другая стояла
но так или иначе все равно была ошибка в вычислении отдельных ста процентов. Спасибо еще раз xXx за подсказку
ошибка в примере была в том, что во всех циклах одинаковое количество шагов должно было быть
Код:
For $i = 0 To 100

а уже в цикле вычислять общий процент.
ниже пример, как я решил эту задачу. код имитирует распаковку файлов. $Num это размеры файлов. Распаковка идет в общем цикле, каждый файл отдельно по очереди. Естественно, что распаковщик дает проценты от 0 до 100 только для очередного файла. вот и появилась задача все проценты свести к общему. В общем, все получилось :smile:
Код:
HotKeySet('{ESC}', '_Close')
Local $Num1 = 450
Local $Num2 = 768
Local $Num3 = 130
Local $Num4 = 5
Local $AllNum = $Num1 + $Num2 + $Num3 + $Num4; Общие 100%
Local $OneAll = $AllNum / 100; один процент от общих 100%
Local $percNum1 = $Num1 / $OneAll; отдельные 100%
Local $percNum2 = $Num2 / $OneAll; отдельные 100%
Local $percNum3 = $Num3 / $OneAll; отдельные 100%
Local $percNum4 = $Num4 / $OneAll; отдельные 100%
Local $curentPerc, $percPart, $setPerc

ProgressOn('', 'Прогресс', '', -1, -1, 16)

$percPart = 100 / $percNum1
For $i = 1 To 100
	$setPerc = $i / $percPart + $curentPerc
	ProgressSet($setPerc, $setPerc & '%', '$Num1')
	Sleep(100)
Next

$curentPerc += $percNum1
$percPart = 100 / $percNum2
For $i = 1 To 100
	$setPerc = $i / $percPart + $curentPerc
	ProgressSet($setPerc, $setPerc & '%', '$Num2')
	Sleep(100)
Next

$curentPerc += $percNum2
$percPart = 100 / $percNum3
For $i = 1 To 100
	$setPerc = $i / $percPart + $curentPerc
	ProgressSet($setPerc, $setPerc & '%', '$Num3')
	Sleep(100)
Next

$curentPerc += $percNum3
$percPart = 100 / $percNum4
For $i = 1 To 100
	$setPerc = $i / $percPart + $curentPerc
	ProgressSet($setPerc, $setPerc & '%', '$Num4')
	Sleep(100)
Next

Sleep(1000)
ProgressOff()

Func _Close()
	ProgressOff()
	Exit
EndFunc   ;==>_Close


Вот как это выглядит, если все циклы свести в один.
ниже код практически полностью имитирует структуру цикла, в котором у меня была проблема подсчета
Код:
HotKeySet('{ESC}', '_Close')
Local $Num1 = 450
Local $Num2 = 768
Local $Num3 = 130
Local $Num4 = 5
Local $AllNum = $Num1 + $Num2 + $Num3 + $Num4; Общие 100%
Local $OneAll = $AllNum / 100; один процент от общих 100%
Local $percNum1 = $Num1 / $OneAll; отдельные 100%
Local $percNum2 = $Num2 / $OneAll; отдельные 100%
Local $percNum3 = $Num3 / $OneAll; отдельные 100%
Local $percNum4 = $Num4 / $OneAll; отдельные 100%
Local $curentPerc, $percPart, $setPerc, $c
Local $aPartPerc[4] = [$percNum1, $percNum2, $percNum3, $percNum4]
ProgressOn('', 'Прогресс', '', -1, -1, 16)

For $n = 0 To 3
	$c = 0
	$percPart = 100 / $aPartPerc[$n]
	Do
		$c += 1
		$setPerc = $c / $percPart + $curentPerc
		ProgressSet($setPerc, $setPerc & '%', 'Общий прогресс')
		Sleep(100)
	Until $c = 100
	$curentPerc += $aPartPerc[$n]
Next

Sleep(1000)
ProgressOff()

Func _Close()
	ProgressOff()
	Exit
EndFunc   ;==>_Close
 
Верх