Что нового

Нестандартный цикл при роботе с массивами. Рандомность в массивах

beliy

Продвинутый
Сообщения
372
Репутация
72
Версия AutoIt:последняя

Описание:

Заранее извиняюсь если названия темы не отвечает правилам форума - задача немного нестандартная для меня, поэтому мог не так обозвать... Если что не так не пинайте :smile:
Теперь ближе к сути проблемы;
Есть примерно такое GUI окно, в котором 2 диалога выбора файла, в Файл1 имеются данные с разделителем ";", которые нужно считать в массив (имеет несколько переменных). В Файл2 также имеются данные, но в каждой строчке по 1 переменной.
Также имеется элемент GUICtrlCreateUpdown, который делался для удобства, да и разобраться с ним хотелось бы. По нему только 1 вопрос - как запретить им ставить значения ниже 0? (как ни крути, но количество повторов не может быть минусовым)
И собственно основная проблема - постараюсь расписать максимально понятно, но не обессудьте :-\
Например, мы успешно перенесли содержимое txt файла в массив, в первой строчке которого будут переменные, обзовем их например var1 и var2. Так вот нужно что бы они использовались n раз подряд (указывается в $Input3), т.э допустим $Input3 = 3, значит var1 и var2 будут использованы для 2 массива с 1 по 3 строчку, после этого задействуется 2 строчка 1 массива для следующих 3 с 2 массива и так до окончания переменных в 2 массиве. Если же $Input3 = 0, то нужно что бы с 1 массива переменные брались с рандомной строчки. 2 масив всегда должен обрабативаться попорядку и обработаться все переменные.
Заранее, благодарю за помощь...

Примечания:

примерный скрин и набросок в koda:




скрипт сгенерированый в koda:
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 411, 175, 192, 124)
$Label1 = GUICtrlCreateLabel("Файл1 ", 15, 12, 42, 17)
$Input1 = GUICtrlCreateInput("", 66, 12, 283, 21)
$Button1 = GUICtrlCreateButton("... ", 354, 12, 28, 22, $WS_GROUP)
$Label2 = GUICtrlCreateLabel("Файл2", 15, 39, 39, 17)
$Input2 = GUICtrlCreateInput("", 66, 36, 283, 21)
$Button2 = GUICtrlCreateButton("...", 354, 36, 28, 22, $WS_GROUP)
$Label3 = GUICtrlCreateLabel("К-во повторов для переменных с Файл1", 15, 78, 210, 17)
$Input3 = GUICtrlCreateInput("0", 261, 75, 31, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
$Updown1 = GUICtrlCreateUpdown($Input3)
$Label4 = GUICtrlCreateLabel("Если равно 0, то повтора нет, но значения с Файл1 берутся рандомно", 15, 105, 363, 17)
$Button3 = GUICtrlCreateButton("Старт", 15, 135, 385, 31, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

EndSwitch
WEnd
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Как то так я это понял:

Код:
#include <Array.au3>

Dim $aArray1[10][2]

For $i = 0 To UBound($aArray1, 1)-1 Step +1
	For $j = 0 To UBound($aArray1, 2)-1 Step +1
		$aArray1[$i][$j] = 'var' & $i & $j
	Next
Next

_ArrayDisplay($aArray1, 'Первый массив')


Dim $aArray2[11][2]
Dim $iInput3Value = 0


If $iInput3Value = 0 Then
	Dim $iBlocked = 0
	For $i = 0 To UBound($aArray1, 1)-1 Step +1
		$iBlocked += 2^$i ;создаётся число, в котором каждый бит равный 1, означает, что соответствующий ему номер ячейки первого массива ещё не использовался
	Next

	For $i = 0 To UBound($aArray2, 1)-1 Step +1
		If $iBlocked = 0 Then ExitLoop ;использовались все ячейки первого массива

		$j = Random(0, UBound($aArray1)-1, 1)

		While BitAND($iBlocked, 2^$j) = 0 ;случайно выбранная ячейка первого массива уже была использована
			$j += 1 ;берём следующую ячейку
			If $j = UBound($aArray1, 1) Then $j = 0 ;когда достигнута последняя ячейка, начинаем с 0
		WEnd
		$iBlocked -= 2^$j ;изменяем бит выбранной ячейки на 0

		$aArray2[$i][0] = $aArray1[$j][0]
		$aArray2[$i][1] = $aArray1[$j][1]
	Next
Else
	For $i = 0 To UBound($aArray2, 1)-1 Step +1
		$j = Int($i/$iInput3Value)
		If $j = UBound($aArray1, 1) Then ExitLoop
		$aArray2[$i][0] = $aArray1[$j][0]
		$aArray2[$i][1] = $aArray1[$j][1]
	Next
EndIf

_ArrayDisplay($aArray2, 'Второй массив')


Зы:
GUICtrlSetLimit
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Спасибо большое!!! Но не совсем понял как это подвязать под скрипт в koda(( Можете на примере скрипта из koda навести пример в котором при нажатии на кнопку будут выводиться сообщения для каждой переменной из Файл2? Заранее благодарствую...
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Могу, дайте файлы для примера.
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
спасибо, примеры во вложении...
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
#include <Array.au3>

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 411, 175, 192, 124)
$Label1 = GUICtrlCreateLabel("Файл1 ", 15, 12, 42, 17)
$Input1 = GUICtrlCreateInput("file1.txt", 66, 12, 283, 21)
$Button1 = GUICtrlCreateButton("... ", 354, 12, 28, 22, $WS_GROUP)
$Label2 = GUICtrlCreateLabel("Файл2", 15, 39, 39, 17)
$Input2 = GUICtrlCreateInput("file2.txt", 66, 36, 283, 21)
$Button2 = GUICtrlCreateButton("...", 354, 36, 28, 22, $WS_GROUP)
$Label3 = GUICtrlCreateLabel("К-во повторов для переменных с Файл1", 15, 78, 210, 17)
$Input3 = GUICtrlCreateInput("0", 261, 75, 31, 21, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
$Updown1 = GUICtrlCreateUpdown($Input3)
GUICtrlSetLimit(-1, 2^14, 0)
$Label4 = GUICtrlCreateLabel("Если равно 0, то повтора нет, но значения с Файл1 берутся рандомно", 15, 105, 363, 17)
$Button3 = GUICtrlCreateButton("Старт", 15, 135, 385, 31, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button3
			Local $aArray1 = CreateFirstArray(GUICtrlRead($Input1))
			If @error = 1 Then
				MsgBox(16, '', 'Файл пуст/нет доступа')
			ElseIf @error = 2 Then
				MsgBox(16, '', 'Файл не отформатирован')
			EndIf
			_ArrayDisplay($aArray1)

			Local $aArray2 = CreateSecondArray($aArray1, GUICtrlRead($Input3), 10) ;10-длинна массива
			_ArrayDisplay($aArray2)

			$aArray1 = CreateFirstArray(GUICtrlRead($Input2))
			_ArrayDisplay($aArray1)
			$aArray2 = CreateSecondArray($aArray1, GUICtrlRead($Input3), 10)
			_ArrayDisplay($aArray2)
	EndSwitch
WEnd

Func CreateFirstArray($sFile)
	Local $sText, $hFile, $aLines, $aVars
	$hFile = FileOpen($sFile)
	$sText = FileRead($hFile)
	FileClose($hFile)
	If $sText = '' Then Return SetError(1)

	$aLines = StringRegExp(StringStripCR($sText), '.+', 3)
	$sText = ''

	$aVars = StringRegExp($aLines[0], '[^;]+', 3)

	Local $aResult[UBound($aLines)][UBound($aVars)]

	For $i = 0 To UBound($aResult, 1)-1 Step +1
		$aVars = StringRegExp($aLines[$i], '[^;]+', 3)

		If UBound($aVars) <> UBound($aResult, 2) Then Return SetError(2)

		For $j = 0 To UBound($aResult, 2)-1 Step +1
			$aResult[$i][$j] = $aVars[$j]
		Next
	Next

	Return $aResult
EndFunc

Func CreateSecondArray($aArray1, $iInput3Value, $iArray2Length)

	Dim $aArray2[$iArray2Length][UBound($aArray1, 2)]

	If $iInput3Value = 0 Then
		Local $iBlocked = 2^UBound($aArray1)-1

		For $i = 0 To UBound($aArray2, 1) - 1 Step +1
			If $iBlocked = 0 Then ExitLoop ;использовались все ячейки первого массива

			$j = Random(0, UBound($aArray1) - 1, 1)

			While BitAND($iBlocked, 2 ^ $j) = 0 ;случайно выбранная ячейка первого массива уже была использована
				$j += 1 ;берём следующую ячейку
				If $j = UBound($aArray1, 1) Then $j = 0 ;когда достигнута последняя ячейка, начинаем с 0
			WEnd
			$iBlocked -= 2 ^ $j ;изменяем бит выбранной ячейки на 0

			For $k = 0 To UBound($aArray1, 2)-1 Step +1
				$aArray2[$i][$k] = $aArray1[$j][$k]
			Next
		Next
	Else
		For $i = 0 To UBound($aArray2, 1) - 1 Step +1
			$j = Int($i / $iInput3Value)
			If $j = UBound($aArray1, 1) Then ExitLoop

			For $k = 0 To UBound($aArray1, 2)-1 Step +1
				$aArray2[$i][$k] = $aArray1[$j][$k]
			Next
		Next
	EndIf

	Return $aArray2
EndFunc
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Спасибо, огромное - все работает! Единственная просьба осталась, по поводу небольших поправок по поводу работы скрипта:
Код:
Local $aArray2 = CreateSecondArray($aArray1, GUICtrlRead($Input3), 10) ;10-длинна массива

Можно ли длину массива сделать равную количеству строк в $aArray1 или $aArray2 (незнаю как правельнее :() Просто если стоит меньше чем значений в 1 массиве, то обрезает и не все значения задействуются, если же заведомо больше, то появляется кучу пустых строк в массиве. Хотелось бы ооптимизировать...

Код:
For $i = 0 To UBound($aArray2, 1) - 1 Step +1
            If $iBlocked = 0 Then ExitLoop ;использовались все ячейки первого массива

            $j = Random(0, UBound($aArray1) - 1, 1)

            While BitAND($iBlocked, 2 ^ $j) = 0 ;случайно выбранная ячейка первого массива уже была использована
                $j += 1 ;берём следующую ячейку
                If $j = UBound($aArray1, 1) Then $j = 0 ;когда достигнута последняя ячейка, начинаем с 0
            WEnd
            $iBlocked -= 2 ^ $j ;изменяем бит выбранной ячейки на 0

            For $k = 0 To UBound($aArray1, 2)-1 Step +1
                $aArray2[$i][$k] = $aArray1[$j][$k]
            Next
        Next
    Else
        For $i = 0 To UBound($aArray2, 1) - 1 Step +1
            $j = Int($i / $iInput3Value)
            If $j = UBound($aArray1, 1) Then ExitLoop

            For $k = 0 To UBound($aArray1, 2)-1 Step +1
                $aArray2[$i][$k] = $aArray1[$j][$k]
            Next
        Next
    EndIf

в этом примере, если я правельно понял, то если по рандому обрабатывается - по окончанию значений в 1массиве, начнет обрабатываться заново столько сколько нужно, если же по количеству для каждого значения, то по окончанию значений в 1массиве скрипт просто завершится. Если так то, нужно что бы для каждого значения с 2 массива всегда нашлось значения с 1 массива. Т.э. обязательно все значения 2 массива должны обработаться.

И последнее, если не сложно наведите пример взаимодействия этих 2 массивов в этом скрипте, на примере
Код:
MsgBox(64, $aArray1, $aArray2)
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
#include <Array.au3>

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 411, 175, 192, 124)
$Label1 = GUICtrlCreateLabel("Файл1 ", 15, 12, 42, 17)
$Input1 = GUICtrlCreateInput("file1.txt", 66, 12, 283, 21)
$Button1 = GUICtrlCreateButton("... ", 354, 12, 28, 22, $WS_GROUP)
$Label2 = GUICtrlCreateLabel("Файл2", 15, 39, 39, 17)
$Input2 = GUICtrlCreateInput("file2.txt", 66, 36, 283, 21)
$Button2 = GUICtrlCreateButton("...", 354, 36, 28, 22, $WS_GROUP)
$Label3 = GUICtrlCreateLabel("К-во повторов для переменных с Файл1", 15, 78, 210, 17)
$Input3 = GUICtrlCreateInput("0", 261, 75, 31, 21, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
$Updown1 = GUICtrlCreateUpdown($Input3)
GUICtrlSetLimit(-1, 2^14, 0)
$Label4 = GUICtrlCreateLabel("Если равно 0, то повтора нет, но значения с Файл1 берутся рандомно", 15, 105, 363, 17)
$Button3 = GUICtrlCreateButton("Старт", 15, 135, 385, 31, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button3
            Local $aArray1 = CreateFirstArray(GUICtrlRead($Input1))
            If @error = 1 Then
                MsgBox(16, '', 'Файл пуст/нет доступа')
            ElseIf @error = 2 Then
                MsgBox(16, '', 'Файл не отформатирован')
            EndIf
            _ArrayDisplay($aArray1)

            Local $aArray2 = CreateSecondArray($aArray1, GUICtrlRead($Input3))
            _ArrayDisplay($aArray2)

            $aArray1 = CreateFirstArray(GUICtrlRead($Input2))
            _ArrayDisplay($aArray1)
            $aArray2 = CreateSecondArray($aArray1, GUICtrlRead($Input3))
            _ArrayDisplay($aArray2)
    EndSwitch
WEnd

Func CreateFirstArray($sFile)
    Local $sText, $hFile, $aLines, $aVars
    $hFile = FileOpen($sFile)
    $sText = FileRead($hFile)
    FileClose($hFile)
    If $sText = '' Then Return SetError(1)

    $aLines = StringRegExp(StringStripCR($sText), '.+', 3)
    $sText = ''

    $aVars = StringRegExp($aLines[0], '[^;]+', 3)

    Local $aResult[UBound($aLines)][UBound($aVars)]

    For $i = 0 To UBound($aResult, 1)-1 Step +1
        $aVars = StringRegExp($aLines[$i], '[^;]+', 3)

        If UBound($aVars) <> UBound($aResult, 2) Then Return SetError(2)

        For $j = 0 To UBound($aResult, 2)-1 Step +1
            $aResult[$i][$j] = $aVars[$j]
        Next
    Next

    Return $aResult
EndFunc

Func CreateSecondArray($aArray1, $iInput3Value)

    If $iInput3Value = 0 Then
		Local $aArray2[UBound($aArray1, 1)][UBound($aArray1, 2)]
        Local $sFree = '', $aFree

		For $i = 0 To UBound($aArray1)-1 Step +1
			$sFree &= $i & ';'
		Next

        For $i = 0 To UBound($aArray2, 1) - 1 Step +1
            $aFree = StringRegExp($sFree, '(\d+);', 3)

            $j = $aFree[Random(0, UBound($aFree)-1, 1)]
            $sFree = StringReplace($sFree, $j & ';', '', 1)

			MsgBox(64, '', '$aArray1[' & $j & '] -> $aArray2[' & $i & ']')

            For $k = 0 To UBound($aArray1, 2)-1 Step +1
                $aArray2[$i][$k] = $aArray1[$j][$k]
            Next
        Next
    Else
		Local $aArray2[UBound($aArray1, 1)*$iInput3Value][UBound($aArray1, 2)]

        For $i = 0 To UBound($aArray2, 1) - 1 Step +1
            $j = Int($i / $iInput3Value)
            If $j = UBound($aArray1, 1) Then ExitLoop

			MsgBox(64, '', '$aArray1[' & $j & '] -> $aArray2[' & $i & ']')

			For $k = 0 To UBound($aArray1, 2)-1 Step +1
                $aArray2[$i][$k] = $aArray1[$j][$k]
            Next
        Next
    EndIf

    Return $aArray2
EndFunc
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Спс, почти то что надо... Единственное можете пример взаимодействия этих 2 массивов навести по такому примеру как на скрине, где выводились бы значения из массива, а не номер строки. Сделал примерный скрин как надо (на примере взаимодействуют 1 строки массивов).
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
#include <Array.au3>


#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 411, 175, 192, 124)
$Label1 = GUICtrlCreateLabel("Файл1 ", 15, 12, 42, 17)
$Input1 = GUICtrlCreateInput("file1.txt", 66, 12, 283, 21)
$Button1 = GUICtrlCreateButton("... ", 354, 12, 28, 22, $WS_GROUP)
$Label2 = GUICtrlCreateLabel("Файл2", 15, 39, 39, 17)
$Input2 = GUICtrlCreateInput("file2.txt", 66, 36, 283, 21)
$Button2 = GUICtrlCreateButton("...", 354, 36, 28, 22, $WS_GROUP)
$Label3 = GUICtrlCreateLabel("К-во повторов для переменных с Файл1", 15, 78, 210, 17)
$Input3 = GUICtrlCreateInput("0", 261, 75, 31, 21, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
$Updown1 = GUICtrlCreateUpdown($Input3)
GUICtrlSetLimit(-1, 2^14, 0)
$Label4 = GUICtrlCreateLabel("Если равно 0, то повтора нет, но значения с Файл1 берутся рандомно", 15, 105, 363, 17)
$Button3 = GUICtrlCreateButton("Старт", 15, 135, 385, 31, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button3
			Local $aArray1 = CreateFirstArray(GUICtrlRead($Input1))
			If @error = 1 Then
				MsgBox(16, '', 'Файл пуст/нет доступа')
			ElseIf @error = 2 Then
				MsgBox(16, '', 'Файл не отформатирован')
			EndIf
			_ArrayDisplay($aArray1)

			Local $aArray2 = CreateSecondArray($aArray1, GUICtrlRead($Input3))
			_ArrayDisplay($aArray2)

			$aArray1 = CreateFirstArray(GUICtrlRead($Input2))
			_ArrayDisplay($aArray1)
			$aArray2 = CreateSecondArray($aArray1, GUICtrlRead($Input3))
			_ArrayDisplay($aArray2)
	EndSwitch
WEnd

Func CreateFirstArray($sFile)
	Local $sText, $hFile, $aLines, $aVars
	$hFile = FileOpen($sFile)
	$sText = FileRead($hFile)
	FileClose($hFile)
	If $sText = '' Then Return SetError(1)

	$aLines = StringRegExp(StringStripCR($sText), '.+', 3)
	$sText = ''

	$aVars = StringRegExp($aLines[0], '[^;]+', 3)

	Local $aResult[UBound($aLines)][UBound($aVars)]

	For $i = 0 To UBound($aResult, 1)-1 Step +1
		$aVars = StringRegExp($aLines[$i], '[^;]+', 3)

		If UBound($aVars) <> UBound($aResult, 2) Then Return SetError(2)

		For $j = 0 To UBound($aResult, 2)-1 Step +1
			$aResult[$i][$j] = $aVars[$j]
		Next
	Next

	Return $aResult
EndFunc

Func CreateSecondArray($aArray1, $iInput3Value)

	If $iInput3Value = 0 Then
		Local $aArray2[UBound($aArray1, 1)][UBound($aArray1, 2)]
		Local $sFree = '', $aFree, $j

		For $i = 0 To UBound($aArray1)-1 Step +1
			$sFree &= $i & ';'
		Next

		For $i = 0 To UBound($aArray2, 1) - 1 Step +1
			$aFree = StringRegExp($sFree, '(\d+);', 3)

			$j = $aFree[Random(0, UBound($aFree)-1, 1)]
			$sFree = StringReplace($sFree, $j & ';', '', 1)

			CopyLine($aArray1, $j, $aArray2, $i)
		Next
	Else
		Local $aArray2[UBound($aArray1, 1)*$iInput3Value][UBound($aArray1, 2)]
		Local $j

		For $i = 0 To UBound($aArray2, 1) - 1 Step +1
			$j = Int($i / $iInput3Value)
			CopyLine($aArray1, $j, $aArray2, $i)
		Next
	EndIf

	Return $aArray2
EndFunc

Func CopyLine(ByRef $aArray1, $iLine1, ByRef $aArray2, $iLine2)
	Local $sOutput1 = '', $sOutput2 = ''

	For $i = 0 To UBound($aArray1, 2)-1 Step +1
		$aArray2[$iLine2][$i] = $aArray1[$iLine1][$i]
		$sOutput1 &= '$aArray1[' & $iLine1 & '][' & $i & ']: ' & $aArray1[$iLine1][$i] & @CRLF
		$sOutput2 &= '$aArray2[' & $iLine2 & '][' & $i & ']: ' & $aArray2[$iLine2][$i] & @CRLF
	Next

	MsgBox(0, '', 'Массив 1:' & @CRLF & $sOutput1 & @CRLF & 'А массив 2 вообще пуст, пока туда что-нибудь из первого массива не скопировать.' & @CRLF & @CRLF & 'Теперь там: ' & @CRLF & $sOutput2)
EndFunc
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Извините, мб у меня не получается норм объяснить либо я не могу понять элементарного - , но можно ли как то из этих 2 массивов вывести 3 переменных. 1 - из массива 2 (file2.txt) и под нее 2 переменных из 1 массива (file1.txt) и все 3 переменные выводить в 1 сообщении.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Сделайте пожалуйста ещё раз два исходных файла, только чуть короче.
И нарисуйте массивы, которые должны получится в конце, в виде таблиц, типа:

Массив 1:
01
0var1var12
1var2var22
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
файлы переделал, а вот по поводу массивов затрудняюсь(
Постараюсь лучше более подробно объяснить как должно получиться в итоге...
вот у нас есть 2 массива:

Код:
var1;var12
var2;var22
var3;var32
var4;var42
var5;var52
и

Код:
111
222
333
444
555
666
777
888
999
При $input3=1 должно вывестись 9 сообщений такого вида:
Код:
MsgBox(0, '111', 'переменная1 - var1'&'переменная2 - var12')
MsgBox(0, '222', 'переменная1 - var2'&'переменная2 - var22')
MsgBox(0, '333', 'переменная1 - var3'&'переменная2 - var32')
MsgBox(0, '444', 'переменная1 - var4'&'переменная2 - var42')
MsgBox(0, '555', 'переменная1 - var5'&'переменная2 - var52')
MsgBox(0, '666', 'переменная1 - var1'&'переменная2 - var12')
MsgBox(0, '777', 'переменная1 - var2'&'переменная2 - var22')
MsgBox(0, '888', 'переменная1 - var3'&'переменная2 - var32')
MsgBox(0, '999', 'переменная1 - var4'&'переменная2 - var42')


при $input3=2 должно обработаться так:
Код:
MsgBox(0, '111', 'переменная1 - var1'&'переменная2 - var12')
MsgBox(0, '222', 'переменная1 - var1'&'переменная2 - var12')
MsgBox(0, '333', 'переменная1 - var2'&'переменная2 - var22')
MsgBox(0, '444', 'переменная1 - var2'&'переменная2 - var22')
; и так до окончания значений в массиве из file2.txt


при $input3=0 должно обработаться так:
Код:
MsgBox(0, '111', 'переменная1 - var3'&'переменная2 - var32')
MsgBox(0, '222', 'переменная1 - var1'&'переменная2 - var12')
MsgBox(0, '333', 'переменная1 - var5'&'переменная2 - var52')
MsgBox(0, '444', 'переменная1 - var2'&'переменная2 - var22')
MsgBox(0, '555', 'переменная1 - var4'&'переменная2 - var42')
; и так до окончания значений в массиве из file2.txt
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
#include <Array.au3>


#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 411, 175, 192, 124)
$Label1 = GUICtrlCreateLabel("Файл1 ", 15, 12, 42, 17)
$Input1 = GUICtrlCreateInput("file1.txt", 66, 12, 283, 21)
$Button1 = GUICtrlCreateButton("... ", 354, 12, 28, 22, $WS_GROUP)
$Label2 = GUICtrlCreateLabel("Файл2", 15, 39, 39, 17)
$Input2 = GUICtrlCreateInput("file2.txt", 66, 36, 283, 21)
$Button2 = GUICtrlCreateButton("...", 354, 36, 28, 22, $WS_GROUP)
$Label3 = GUICtrlCreateLabel("К-во повторов для переменных с Файл1", 15, 78, 210, 17)
$Input3 = GUICtrlCreateInput("0", 261, 75, 31, 21, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
$Updown1 = GUICtrlCreateUpdown($Input3)
GUICtrlSetLimit(-1, 2^14, 0)
$Label4 = GUICtrlCreateLabel("Если равно 0, то повтора нет, но значения с Файл1 берутся рандомно", 15, 105, 363, 17)
$Button3 = GUICtrlCreateButton("Старт", 15, 135, 385, 31, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button3
			Local $aArray1 = CreateFirstArray(GUICtrlRead($Input1))
			If @error = 1 Then
				MsgBox(16, '', 'Файл пуст/нет доступа')
			ElseIf @error = 2 Then
				MsgBox(16, '', 'Файл не отформатирован')
			EndIf
			_ArrayDisplay($aArray1)

			$aArray2 = CreateFirstArray(GUICtrlRead($Input2))
			If @error = 1 Then
				MsgBox(16, '', 'Файл пуст/нет доступа')
			ElseIf @error = 2 Then
				MsgBox(16, '', 'Файл не отформатирован')
			EndIf
			_ArrayDisplay($aArray2)

			$aResultArray = CreateSecondArray($aArray1, $aArray2, GUICtrlRead($Input3))
			If @error > 0 And < 3 Then
				MsgBox(16, '', 'Кривой массив')
			ElseIf @error = 3 Then
				MsgBox(16, '', '$input3<0')
			EndIf
			_ArrayDisplay($aResultArray)
	EndSwitch
WEnd

Func CreateFirstArray($sFile)
	Local $sText, $hFile, $aLines, $aVars
	$hFile = FileOpen($sFile)
	$sText = FileRead($hFile)
	FileClose($hFile)
	If $sText = '' Then Return SetError(1)

	$aLines = StringRegExp(StringStripCR($sText), '.+', 3)
	$sText = ''

	$aVars = StringRegExp($aLines[0], '[^;]+', 3)

	Local $aResult[UBound($aLines)][UBound($aVars)]

	For $i = 0 To UBound($aResult, 1)-1 Step +1
		$aVars = StringRegExp($aLines[$i], '[^;]+', 3)

		If UBound($aVars) <> UBound($aResult, 2) Then Return SetError(2)

		For $j = 0 To UBound($aResult, 2)-1 Step +1
			$aResult[$i][$j] = $aVars[$j]
		Next
	Next

	Return $aResult
EndFunc

Func CreateSecondArray(ByRef $aArray1, ByRef $aArray2, $iRepeat)
	If UBound($aArray1, 0) <> 2 Then Return SetError(1)
	If UBound($aArray2, 0) <> 2 Then Return SetError(2)
	If $iRepeat < 0 Then Return SetError(3)

	Local $aResultArray[UBound($aArray2, 1)][UBound($aArray1, 2)+UBound($aArray2, 2)]
	Local $j, $sOutput

	For $i = 0 To UBound($aResultArray, 1) - 1 Step +1
		If $iRepeat = 0 Then
			$j = Random(0, UBound($aArray1, 1)-1, 1)
		Else
			$j = Mod(Int($i / $iRepeat), UBound($aArray1, 1))
		EndIf

		For $k = 0 To UBound($aArray2, 2)-1 Step +1
			$aResultArray[$i][$k] = $aArray2[$i][$k]
		Next

		$sOutput = ''
		For $k = 0 To UBound($aArray1, 2)-1 Step +1
			$aResultArray[$i][UBound($aArray2, 2) + $k] = $aArray1[$j][$k]
			$sOutput &= 'Переменная' & $k+1	& ' - ' & $aArray1[$j][$k] & @CRLF
		Next

		MsgBox(64, $aArray2[$i][0], $sOutput)
	Next

	Return $aResultArray
EndFunc
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Спасибо огромное - скрипт практически идеально работает :smile:
Единственно помогите строку
Код:
MsgBox(64, $aArray2[$i][0], $sOutput)


вывести как

Код:
MsgBox(64, $aArray2[$i][0], 'Какойто текст ' & $sOutput1 & ' Какойто другой текст ' &  $sOutput2 )

т.э. значения каждой колонки 1 массива что б были в отдельной переменной...

И тему можно будет считать закрытой. dwerf, респект те...
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
#include <Array.au3>


#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 411, 175, 192, 124)
$Label1 = GUICtrlCreateLabel("Файл1 ", 15, 12, 42, 17)
$Input1 = GUICtrlCreateInput("file1.txt", 66, 12, 283, 21)
$Button1 = GUICtrlCreateButton("... ", 354, 12, 28, 22, $WS_GROUP)
$Label2 = GUICtrlCreateLabel("Файл2", 15, 39, 39, 17)
$Input2 = GUICtrlCreateInput("file2.txt", 66, 36, 283, 21)
$Button2 = GUICtrlCreateButton("...", 354, 36, 28, 22, $WS_GROUP)
$Label3 = GUICtrlCreateLabel("К-во повторов для переменных с Файл1", 15, 78, 210, 17)
$Input3 = GUICtrlCreateInput("0", 261, 75, 31, 21, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
$Updown1 = GUICtrlCreateUpdown($Input3)
GUICtrlSetLimit(-1, 2^14, 0)
$Label4 = GUICtrlCreateLabel("Если равно 0, то повтора нет, но значения с Файл1 берутся рандомно", 15, 105, 363, 17)
$Button3 = GUICtrlCreateButton("Старт", 15, 135, 385, 31, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button3
			Local $aArray1 = CreateFirstArray(GUICtrlRead($Input1))
			If @error = 1 Then
				MsgBox(16, '', 'Файл пуст/нет доступа')
			ElseIf @error = 2 Then
				MsgBox(16, '', 'Файл не отформатирован')
			EndIf
			_ArrayDisplay($aArray1)

			$aArray2 = CreateFirstArray(GUICtrlRead($Input2))
			If @error = 1 Then
				MsgBox(16, '', 'Файл пуст/нет доступа')
			ElseIf @error = 2 Then
				MsgBox(16, '', 'Файл не отформатирован')
			EndIf
			_ArrayDisplay($aArray2)

			$aResultArray = CreateSecondArray($aArray1, $aArray2, GUICtrlRead($Input3))
			If @error > 0 And @error < 3 Then
				MsgBox(16, '', 'Кривой массив')
			ElseIf @error = 3 Then
				MsgBox(16, '', '$input3<0')
			EndIf
			_ArrayDisplay($aResultArray)
	EndSwitch
WEnd

Func CreateFirstArray($sFile)
	Local $sText, $hFile, $aLines, $aVars
	$hFile = FileOpen($sFile)
	$sText = FileRead($hFile)
	FileClose($hFile)
	If $sText = '' Then Return SetError(1)

	$aLines = StringRegExp(StringStripCR($sText), '.+', 3)
	$sText = ''

	$aVars = StringRegExp($aLines[0], '[^;]+', 3)

	Local $aResult[UBound($aLines)][UBound($aVars)]

	For $i = 0 To UBound($aResult, 1)-1 Step +1
		$aVars = StringRegExp($aLines[$i], '[^;]+', 3)

		If UBound($aVars) <> UBound($aResult, 2) Then Return SetError(2)

		For $j = 0 To UBound($aResult, 2)-1 Step +1
			$aResult[$i][$j] = $aVars[$j]
		Next
	Next

	Return $aResult
EndFunc

Func CreateSecondArray(ByRef $aArray1, ByRef $aArray2, $iRepeat)
	If UBound($aArray1, 0) <> 2 Then Return SetError(1)
	If UBound($aArray2, 0) <> 2 Then Return SetError(2)
	If $iRepeat < 0 Then Return SetError(3)

	Local $aResultArray[UBound($aArray2, 1)][UBound($aArray1, 2)+UBound($aArray2, 2)]
	Local $j

	For $i = 0 To UBound($aResultArray, 1) - 1 Step +1
		If $iRepeat = 0 Then
			$j = Random(0, UBound($aArray1, 1)-1, 1)
		Else
			$j = Mod(Int($i / $iRepeat), UBound($aArray1, 1))
		EndIf

		For $k = 0 To UBound($aArray2, 2)-1 Step +1
			$aResultArray[$i][$k] = $aArray2[$i][$k]
		Next

		For $k = 0 To UBound($aArray1, 2)-1 Step +1
			$aResultArray[$i][UBound($aArray2, 2) + $k] = $aArray1[$j][$k]
		Next

		MsgBox(64, $aResultArray[$i][0], $aResultArray[$i][1] & @CRLF & $aResultArray[$i][2])
	Next

	Return $aResultArray
EndFunc
 
Верх