сортировки по 3-м переменным пример
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > сортировки по 3-м переменным пример

сортировки по 3-м переменным пример

Ответ
Поиск в этой теме
Непрочитано 05.09.2005, 16:23 #1
сортировки по 3-м переменным пример
Chapay
 
Регистрация: 15.08.2005
Сообщений: 35

Ребята, подскажите пожалуста что нужно сделать?
в акаде пишу прогу сортировки по 3-м переменным пример:
1-210001 (всегда 6-и значная) 2-1 (2 значная) 3-2 (2 значная)
strcat в "2100010102"
сортирую по одному уже!
но получается слишком длинное число делаю запятую но
тогда тоже облом:
если (Atof "210001.0102") то 210001.0
что нужно сделать чтоб было нормально 210001.0102
отличие иногда только по последней цифре?
мож какие идеи у кого еще есть?
(прога только под 14-акад)
Просмотров: 3960
 
Непрочитано 05.09.2005, 18:09
#2
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Код:
[Выделить все]
(Atof "210001.0102")
(Atof "210001.0103")
у вас выдаст два одинаковых 210001.0
но это ничего не значит, это только режим отображения, на самом деле цифры разные, и это можно проверить:

Код:
[Выделить все]
(< (Atof "210001.0102") (Atof "210001.0103"))
вернет T - значит первое меньше - ессесно! Сортируйте на здоровье!

А вчем вообще проблема? Зачем вам возвращенное число с этой точностью - если нужна строка, то:

Код:
[Выделить все]
(rtos (Atof "210001.0102") 2 4)
то есть сливаете строки,преобразуете в числа, сортируете, преобразуете в строки....

а может я что-то не понял, тогда объясните суть подробнее. :roll:
Apelsinov вне форума  
 
Непрочитано 06.09.2005, 10:13
#3
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>Chapay
У меня, честно говоря, по написанному, сложилось очень смутное представление о задаче, но напомню, что в функциях сравнения и сортировки можно использовать строки без преобразования.



Код:
[Выделить все]
Command: (VL-SORT  '("210001.0102" "210001.0103" "210001.0101") '<)
("210001.0101" "210001.0102" "210001.0103")

Command: (VL-SORT  '("2100010102" "2100010103" "2100010101") '<)
("2100010101" "2100010102" "2100010103")

Command: (< "2100010102" "2100010103")
T

Command: (< "2100010103" "2100010102")
nil
AY вне форума  
 
Автор темы   Непрочитано 06.09.2005, 10:24
#4
Chapay


 
Регистрация: 15.08.2005
Сообщений: 35
<phrase 1=


О да! без преобразования!
примного благодарю!
Chapay вне форума  
 
Автор темы   Непрочитано 06.09.2005, 14:01
#5
Chapay


 
Регистрация: 15.08.2005
Сообщений: 35
<phrase 1=


да вот... на это что скажете? что та я не догоняю

Command: (setq a "65001")
"65001"

Command: (setq b "10000000000000")
"10000000000000"

Command: (< a b)
nil

Command: (> a b)
T
Chapay вне форума  
 
Непрочитано 06.09.2005, 14:14
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


А преобразовать типы? Ведь как тут сравнение производится - одному каду известно (подозреваю, что по коду символа, но не уверен)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.09.2005, 14:38
#7
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Chapay
да вот... на это что скажете? что та я не догоняю

Command: (setq a "65001")
"65001"

Command: (setq b "10000000000000")
"10000000000000"

Command: (< a b)
nil

Command: (> a b)
T
Акад сортирует строки (а у тебя именно строки) так:
(acad_strlsort '("65001" "10000000000000" "8"))
-> ("10000000000000" "65001" "8") и тут все правильно

А в твоем примере нужно сначала преобразовать типы
(setq a (atoi "65001") b (atoi "10000000000000"))
(< a b) -> T
fixo вне форума  
 
Непрочитано 06.09.2005, 14:52
#8
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Chapay, имейте в виду, что в примере о котором я говорил происходит сравнение строк, а не чисел, и сравнение идет посимвольно начиная с первых. БOльшим считается символ с бОльшим кодом. Большей считается строка в которой найден символ бОльший соответствующего символа другой строки. Для чисел представленных строкой сравнение (с точки зрения восприятия их именно как чесел) без преобразование будет корректно только для случаяя одинакового количества символов в стоках (как это было в вашем и моем примерах).
AY вне форума  
 
Автор темы   Непрочитано 06.09.2005, 14:54
#9
Chapay


 
Регистрация: 15.08.2005
Сообщений: 35
<phrase 1=


Пардон, задача изменилась первое не всегда 6-и значное.
В итоге все свелось приблизительно к этому:
нада отсортировать по возрастанию список типа:
'(("61010200302" "xxx" "xxxx")("2100010102" "xxx" "xxxx")("310001010212" "xxx" "xxxx")("650010104" "xxx" "xxxx")("2100010105" "xxx" "xxxx"))
а в акаде ограничения! действительные свыше 2147483647 не понимает!
функции типа vl-.... не понимает 14 акад, а компилировать влом -не разбирался, да и отладки еще будет ого-го!
да и скиньте пожалуста доки на русском с описанием vl-...
какие они хоть бывают? ничто про них низнаю. мож начну все
по-человечески писать. ))
Chapay вне форума  
 
Непрочитано 06.09.2005, 15:22
#10
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>Chapay
У меня в 2000-ном такой код вполне работоспособен
Код:
[Выделить все]
Command: (< 214748364700001 214748364700002)
T
Но если у вас подобное не прохдит, можно в начало всех строк меньших стоки наибольшей длины добавить нули, чтоб сравнение работало правильно. А если в 14-ом не работает vl-sort используйте acad_strlsort как предлагает Fatty.
AY вне форума  
 
Автор темы   Непрочитано 06.09.2005, 16:06
#11
Chapay


 
Регистрация: 15.08.2005
Сообщений: 35
<phrase 1=


Да, все заработало, спасибо всем!
а доки уж скиньте пожалуста? an-rud@yandex.ru
Chapay вне форума  
 
Непрочитано 06.09.2005, 16:10
#12
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Chapay
В итоге все свелось приблизительно к этому:
нада отсортировать по возрастанию список типа:
'(("61010200302" "xxx" "xxxx")("2100010102" "xxx" "xxxx")("310001010212" "xxx" "xxxx")("650010104" "xxx" "xxxx")("2100010105" "xxx" "xxxx"))
Мне кажется, что проще использовать acad_strlsort для сортировки строк, но, так как длина строки у тебя не определена, то ограничь ее, например, 20 символами, и а зависимости от реальной длины добавляй в начало строки нужное количество нулей (или пробелов) перед сортировкой.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > сортировки по 3-м переменным пример