Что нового

[Данные, строки] Проблема с ArraySort и Random: сгенерированные числа отображаются как попало

fortages

Новичок
Сообщения
81
Репутация
3
Здравствуйте! Помогите, пожалуйста, разобраться...
Возникла проблема с правильностью сортировки, но я не понимаю, из-за чего именно: или из-за Random, или из-за _ArraySort.

Задача следующая: нужно рандомно сгенерировать числа в "формате часов ", то есть 12:10, 00:05, 06:35 и т.д. Затем их нужно упорядочить по возрастанию и результат записать в файл.

Проблема в том, что в "формате часов" сгенерировать не получается: вместо нужного 02:42 получается 2:42, а вместо нужного 03:01 получается вообще 3:1... :stars:
Но помимо этого еще какая-то проблема с сортировкой: часть массива сортируется правильно, а часть как попало. На картинке видно, что 02:42 (которые еще и неправильно записаны) вместо того, чтобы стоять после 1:13, находятся вообще в середине списка, то же самое и с 4:26 и т.д...

60ca8a767a47.png


Вот код программы:
Код:
#include <File.au3>
;-----------------------------------------------------------------
																;|
for $i=1 to 24 	;создаем 24 записей								;|
$RandomHour = Random(00, 23, 1) 								;|
$RandomMinute = Random(00, 59, 1) 								;|
																;|
$File = FileOpen ("time.txt",1)									;|
FileWrite ($File, $RandomHour & ":" & $RandomMinute & @CRLF)	;|
FileClose($File)												;|
next															;|
																;|
MsgBox(0, "Random Time", "Готово!")								;|
																;|
;-----------------------------------------------------------------

;-------- работа с массивом --------------------------------------
Local $TimeRecords

; проверяем на ошибки
If Not _FileReadToArray("time.txt", $TimeRecords) Then
    MsgBox(4096, "Ошибка", " Ошибка чтения файла в массив     Ошибка = " & @error)
    Exit
EndIf

_ArrayDisplay($TimeRecords, "Какой получился массив (перед сортировкой)") ;смотрим, что получилось
_ArraySort($TimeRecords) ;сортируем
_ArrayDisplay($TimeRecords, "Массив после сортировки") ;смотрим, что получилось в итоге



$Sorted = FileOpen ("sorted.txt",1)	 ; куда сохраняем результат
_FileWriteFromArray($Sorted,$TimeRecords ) ;записываем получившийся массив в файл

Из-за чего возникает подобное? Из-за неправильно заданного параметра для Random? Тогда какой же он должен быть? Как это исправить?
Спасибо!
 

Вложения

  • time.txt
    155 байт · Просмотры: 2
  • sorted.txt
    159 байт · Просмотры: 2

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
из за того, что сортируются данные, как текст- вначале все первые цифры "1" , потом "2" итд. Воспользуйтесь функцией
Код:
StringFormat
для приведения строки в нужный вид.
Вот так, например:
Код:
#include <File.au3>
;-----------------------------------------------------------------
                                                                ;|
for $i=1 to 24  ;создаем 24 записей                               ;|
$RandomHour = Random(00, 23, 1)                                 ;|
$RandomMinute = Random(00, 59, 1)                               ;|
$Time= StringFormat("%02d:%02d", $RandomHour, $RandomMinute )                                                                ;|
$File = FileOpen ("time.txt",1)                                 ;|
FileWrite ($File, $Time& @CRLF)    ;|
FileClose($File)                                                ;|
next                                                            ;|
                                                                ;|
MsgBox(0, "Random Time", "Готово!")                               ;|
                                                                ;|
;-----------------------------------------------------------------

;-------- работа с массивом --------------------------------------
Local $TimeRecords

; проверяем на ошибки
If Not _FileReadToArray("time.txt", $TimeRecords) Then
    MsgBox(4096, "Ошибка", " Ошибка чтения файла в массив     Ошибка = " & @error)
    Exit
EndIf

_ArrayDisplay($TimeRecords, "Какой получился массив (перед сортировкой)") ;смотрим, что получилось
_ArraySort($TimeRecords) ;сортируем
_ArrayDisplay($TimeRecords, "Массив после сортировки") ;смотрим, что получилось в итоге



$Sorted = FileOpen ("sorted.txt",1)  ; куда сохраняем результат
_FileWriteFromArray($Sorted,$TimeRecords ) ;записываем получившийся массив в файл
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
fortages [?]
Из-за чего возникает подобное?
дай угадаю. из-за тебя? как напрограммировал, то и получаешь. а именно

1.
Код:
$RandomHour = Random(00, 23, 1)
$RandomMinute = Random(00, 59, 1)

функция Random выдает числа. числа 01 нет, есть число 1. хочешь чтобы у чисел был нулевой префикс - запрограммируй. либо ручками, используя If, либо используй
Код:
StringFormat
.

2.
Код:
_ArraySort($TimeRecords)

ArraySort нормально сортирует только числа. 01:05 - как ты можешь догадаться не число. если аргумент сортировки не числовой, я полагаю сравнивается Unicode код посимвольно. поэтому сортировку придется делать тоже ручками.
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
ra4o огромное спасибо за помощь!
Kaster спасибо, теперь поняла свою ошибку. :-[
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Пожалуйста :smile:
поэтому сортировку придется делать тоже ручками
Kaster, если привести строку к одному формату , то и сортировка проходит как нужно .Достаточно было дописать всего одну строку....
и без разницы 01:15 это строка или цифра - на сортировку не повлияет никак
 
Верх