Что нового

[Данные, строки] Пропущенные номера страниц

IgRo

Знающий
Сообщения
65
Репутация
5
Есть массив номеров страниц
01, 02, 05, 06
как получить пропущенные страницы: 03, 04
 
Автор
I

IgRo

Знающий
Сообщения
65
Репутация
5
Спасибо WSWR
немного допилил :smile:
Код:
#include <Array.au3>
$s = ''
$sTring1 = '02,05,06,07,09,12'
$aText1 = StringSplit($sTring1, ',')

For $i = 1 To $aText1[UBound($aText1) - 1]
	$s0= ""
	if $i<10 then $s0='0'
	If _ArraySearch($aText1, $s0&$i, 1) = -1 Then
	  $s &=  $s0&$i & ','
	EndIf
Next
ConsoleWrite(StringTrimRight($s, 1) & @LF)


Существует более сложный случай
01,02,02а,02б,02г,03,04,05б
Пропущены 02в,05,05а :shok:
Может в этом случае с начало буквы заменить цифрами
02а=2.1
02б=2.2
02в=2.3
02г=2.4
и далее искать пропуски ? :stars:
 
Автор
I

IgRo

Знающий
Сообщения
65
Репутация
5
Спасибо madmasles
немного унифицировал
Код:
Local $sMissed
Local $sStr = '002,005,006,007,011'
;Local $sStr = '02,05,06,07,11'

$sEnd=StringRegExpReplace($sStr, '^.*,', '')
$iL=StringLen($sEnd)
$iEnd = Int($sEnd)
    For $i = 1 To $iEnd
        $sTmp = StringFormat('%0'&$iL&'d', $i)
        If StringInStr($sStr, $sTmp) Then ContinueLoop
        $sMissed &= $sTmp & ','
    Next
ConsoleWrite(StringTrimRight($sMissed, 1) & @LF)

Помогите со страницами с буквами
Код:
01,02,02а,02б,02г,03,04,05б
Пропущены 02в,05,05а
 

InnI

AutoIT Гуру
Сообщения
4,970
Репутация
1,459
IgRo [?]
Помогите со страницами с буквами
А почему не считаются пропущенными 01а, 01б, 05в ?
Как узнать у каких номеров могут быть буквы и в каком диапазоне?
 
Автор
I

IgRo

Знающий
Сообщения
65
Репутация
5
А почему не считаются пропущенными 01а, 01б, 05в ?
Как узнать у каких номеров могут быть буквы и в каком диапазоне?

Диапазон по последней букве или её отсутствии
например у 01 нет буквы считаем, что страницы 01а нет (утверждение вероятностное).
02,02а,02б,02г диапазон от 02 до 02г (02, 02а, 02б, 02в, 02г)
05б диапазон от 05 до 05б (05, 05а, 05б)


Добавлено:
Сообщение автоматически объединено:

ГОСТ 2.503-90
При добавлении нового листа документа допускается присваивать ему номер предыдущего листа с добавлением очередной строчной буквы русского алфавита или через точку арабской цифры, например 3а или 3.1. При этом на первом (заглавном) листе изменяют общее количество листов.


Спасибо InnI за вопрос по диапазонам :smile:
который навёл на мысль действовать с конца и

Код:
$sStr = '01,02,02а,02б,02г,03,04,05б'
$sStr = StringReplace($sStr,"а",".1")
$sStr = StringReplace($sStr,"б",".2")
$sStr = StringReplace($sStr,"в",".3")
$sStr = StringReplace($sStr,"г",".4")
$sStr = StringReplace($sStr,"д",".5")
$aStr = StringSplit($sStr, ',')
$sMissed=""
$iGrupaStr=$aStr[$aStr[0]]
For $i=$aStr[0] To 1 Step -1
	$fStr=Number($aStr[$i])
	if $iGrupaStr<$fStr Then ContinueLoop
	$iGrupaStr=Int($fStr)
	While $fStr >= $iGrupaStr
		$sMissed = $fStr  & ',' & $sMissed
		$fStr = $fStr - 0.1
	WEnd
Next
$sMissed = StringReplace($sMissed,".1","а")
$sMissed = StringReplace($sMissed,".2","б")
$sMissed = StringReplace($sMissed,".3","в")
$sMissed = StringReplace($sMissed,".4","г")
$sMissed = StringReplace($sMissed,".5","д")

ConsoleWrite(StringTrimRight($sMissed, 1) & @LF)


Получаем порядок страниц без пропуска
Код:
1,2,2а,2б,2в,2г,3,4,5,5а,5б
осталось сравнить
 

InnI

AutoIT Гуру
Сообщения
4,970
Репутация
1,459
IgRo
Пробуйте
Код:
$String = "01,02,02а,02б,02г,03,04,05б"
$Missed = ""

$Array = StringSplit($String, ",")

For $i = 1 To $Array[0]
  If Number($Array[$i]) <= 0 Then
    ConsoleWrite("Некорректный формат строки" & @CRLF)
    Exit
  EndIf
Next

$i = 1
While Number($Array[1]) <> $i
  $Missed &= StringFormat("%.2d", $i) & ","
  $i += 1
WEnd
$GroupNumber = $i

$i = 1
While $i <= $Array[0]
  $Group = ""
  Do
    $Group &= $Array[$i] & ","
    $i += 1
    If $i > $Array[0] Then ExitLoop
  Until $GroupNumber <> Number($Array[$i])

  While Number(StringLeft($Group, 2)) <> $GroupNumber
    $Missed &= StringFormat("%.2d", $GroupNumber) & ","
    $GroupNumber += 1
  WEnd

  $tmp = StringLeft($Group, 2)
  If Not StringInStr($Group,  $tmp & ",") Then $Missed &= $tmp & ","
  $delta = Asc(StringRight($Group, 2)) - 224
  For $j = 0 To $delta
    If Not StringInStr($Group, $tmp & Chr(224 + $j)) Then $Missed &= $tmp & Chr(224 + $j) & ","
  Next

  $GroupNumber += 1
WEnd
ConsoleWrite(StringTrimRight($Missed, 1) & @CRLF)

Или так (без проверки формата исходной строки)
Код:
$String = "01а,02,02а,02б,02г,03,04,05б,08б,09,12в"
$Missed = ""

$tmp = StringRegExp($String, "\d{2}[а-я]*$", 3)
$Last = Number($tmp[0])

For $i = 1 To $Last
  $Fmt = StringFormat("%.2d", $i)
  $Array = StringRegExp($String, $Fmt & "(,|$)", 3)
  If @error = 1 Then $Missed &= $Fmt & ","
  $Array = StringRegExp($String, $Fmt & "[а-я]", 3)
  If @error = 1 Then ContinueLoop
  $tmp = ""
  For $j = 0 To UBound($Array) - 1
    $tmp &= $Array[$j] & ","
  Next
  $delta = Asc(StringRight($Array[UBound($Array) - 1], 1)) - 224
  For $j = 0 To $delta
    If Not StringInStr($tmp, $Fmt & Chr(224 + $j)) Then $Missed &= $Fmt & Chr(224 + $j) & ","
  Next
Next

ConsoleWrite(StringTrimRight($Missed, 1) & @CRLF)
 
Верх