Что нового

Как получить диапазон из последовательности чисел. Есть пример в С#

bigarN

Новичок
Сообщения
50
Репутация
0
Собственно говоря название темы отображает суть. Из чисел надо получит диапазон. Типа

0,1,2,4,6,7,8,11
0-2
4-4
6-8
11-11

Пользовалься поиском по форуму. Нашел похожую тематику.
http://autoit-script.ru/index.php?topic=17913.msg109755#msg109755

Изменил этот скрипт для своей нужды, работает, но проблема в том, что скрипт не до конца выполняет условие.

По гуглу нашел пример. То, что надо. Но он в С#.
http://www.cyberforum.ru/csharp-beginners/thread1684401.html


Код:
#include <Array.au3>
Global $Array[15] = [0, 1, 2, 4, 6, 7, 8, 14, 17, 18, 19, 20, 22, 23, 24]
                   
$min = $Array[0]
$max = $Array[UBound($Array) - 1]
Global $Diap_1[0]
Global $Diap_2[0]

_Area($Array, $min)
_Diap()

Func _Area($arr, $minn)
	$j = 0
	While $j < UBound($arr) - 1

		If $arr[$j + 1] - $arr[$j] > 1 Then
			_ArrayAdd($Diap_1, $minn)
			_ArrayAdd($Diap_2, $arr[$j])
			$minn = $arr[$j + 1]
		EndIf

		$j = $j + 1

	WEnd
	ConsoleWrite('$j= ' & $j & @CRLF)

;~	If $arr[$j + 1] > 15 Then 
;~ 		_ArrayAdd($Diap_1, $arr[$j])
;~ 		_ArrayAdd($Diap_2, $max)
;~ 	EndIf

EndFunc   ;==>_Area

Func _Diap()
	For $j = 0 To UBound($Diap_1) - 1
		ConsoleWrite($Diap_1[$j] & " - " & $Diap_2[$j] & @CRLF)
	Next
EndFunc   ;==>_Diap
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
Global $a[] = [0,1,2,4,6,7,8,11]

For $i = 0 To UBound($a) - 2
  If $a[$i] >= $a[$i + 1] Then Exit ConsoleWrite("Некорректный массив" & @CRLF)
Next

ReDim $a[UBound($a) + 1]

$Range = $a[0] & "-"
For $i = 0 To UBound($a) - 2
  If $a[$i + 1] = $a[$i] + 1 Then
    ContinueLoop
  Else
    $Range &= $a[$i]
    ConsoleWrite($Range & @CRLF)
    $Range = $a[$i + 1] & "-"
  EndIf
Next
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
ОК. Как будет корректно, сохранит данные в цикле или создать функцию
Код:
Else
		$Range &= $a[$i]
		;--------------------------------------
		$out_file = FileOpen("out_data.txt", 1)
		FileWriteLine($out_file, $Range & @CRLF)
		FileClose($out_file)
		;--------------------------------------
		ConsoleWrite($Range & @CRLF)
		$Range = $a[$i + 1] & "-"

EndIf
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
bigarN
сохранит данные в цикле или создать функцию
Если вы собираетесь вызывать функцию из цикла, то разницы никакой.
Лучше собрать все диапазоны в строку с разделителем @CRLF и один раз при выходе записать в файл.
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
InnI
Если вы собираетесь вызывать функцию из цикла, то разницы никакой.
OK.

InnI
Лучше собрать все диапазоны в строку с разделителем @CRLF и один раз при выходе записать в файл.
Чесгря не понял и навалял. На выходе не могу получить файл с данными - только пустой.
Код:
Else
		$Range &= $a[$i]
           ;-----------------------------------		
                ;$aAllText &= $Range & @CRLF
                ;$aAllText[$i] &= $Range & @CRLF
                $aAllText[$i] = $Range & @CRLF
           ;-----------------------------------
		$Range = $a[$i + 1] & "-"

	EndIf
Next
 _ArrayDisplay($aAllText)
$vse =StringSplit($aAllText , @CRLF)
$file = FileOpen(@ScriptDir & "\out_data.txt", 2)
FileWrite($file, $vse)
FileClose($file)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
bigarN
получить файл с данными
Код:
Global $a[] = [0,1,2,4,6,7,8,11]

For $i = 0 To UBound($a) - 2
  If $a[$i] >= $a[$i + 1] Then Exit ConsoleWrite("Некорректный массив" & @CRLF)
Next

ReDim $a[UBound($a) + 1]

Global $Range = $a[0] & "-", $Data = ""

For $i = 0 To UBound($a) - 2
  If $a[$i + 1] = $a[$i] + 1 Then
    ContinueLoop
  Else
    $Range &= $a[$i]
    $Data &= $Range & @CRLF
    $Range = $a[$i + 1] & "-"
  EndIf
Next

FileWrite("out_data.txt", $Data)
 
Верх