:: Visual Foxpro, Foxpro for DOS
последовательность
dimuhametov
Автор

Сообщений: 1562
Откуда: Костанай
Дата регистрации: 01.11.2008
Уважаемы форумчане!
Есть последовательность '1,2,3,4,5,7,9,10,11,12,25' (каждое последующее больше предыдущего) надо превратить '1-5,7,9-12,25'.
Башка что-то не варит. Спасибо.


------------------
Незнание делает жизнь такой интересной.
Ratings: 0 negative/0 positive
Re: последовательность
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Решение "в лоб" простое. Узнать, сколько всего чисел - хотя бы по количеству запятых. Далее в цикле "от первого до последнего" числа проверять, насколько отличается последующее число от предыдущего. Если на 1, то перемещаться по числам до тех пор, пока разница не станет > 1. И т.д.

Возможно,есть более "красивый" способ.
Ratings: 0 negative/0 positive
Re: последовательность
vnkor

Сообщений: 324
Дата регистрации: 04.10.2007
Используем функции:
GETWORDCOUNT() - для определения количества чисел
GETWORDNUM() - для определения каждого числа
Ratings: 0 negative/0 positive
Re: последовательность
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
Чтоб меньше чего помнить и пр. я бы не разбирал строку, а предварительно загнал её в массив. Мелочь конечно.
Ratings: 0 negative/0 positive
Re: последовательность
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Вот это делает подобное...
Ratings: 0 negative/0 positive
Re: последовательность
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Ахренеть!

Чего так сложно-то?

Там же должно быть пару простеньких циклов, и всё.
Ratings: 0 negative/0 positive
Re: последовательность
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
of63
.Вот это делает подобное... .

Суров ты, тезка.
Там кода 20 строк даже при изменении исходной строки.
Код готов, но комп без инета.
Ratings: 0 negative/0 positive
Re: последовательность
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
Вот зачем вы так с Оффой? Он засмущается и опять перестанет свой код выкладывать в паблик. ;)


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 1 раз(а). Последнее : Божья_коровка, 27.05.20 12:54
Ratings: 0 negative/0 positive
Re: последовательность
dimuhametov
Автор

Сообщений: 1562
Откуда: Костанай
Дата регистрации: 01.11.2008
Всем спасибо. Код из 20 строк написал.


------------------
Незнание делает жизнь такой интересной.
Ratings: 0 negative/1 positive
Re: последовательность
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
А можно код выложить?
Ratings: 0 negative/0 positive
Re: последовательность
dimuhametov
Автор

Сообщений: 1562
Откуда: Костанай
Дата регистрации: 01.11.2008
? GetListStr('1,2,3,4,5,7,9,10,11,12,25')
? GetListStr('1,3,5,7,9,11,25')
? GetListStr('1,2,3,4,5')
? GetListStr('3,5,7,9,11,25,26,27,30,33,34')
? GetListStr('3')
PROCEDURE GetListStr
LPARAMETERS lclist
LOCAL m._lpriz,m._lctext,m._lcold,m._lcval,m._lcnew
STORE '' TO m._lctext,m._lcold
FOR m._jk=1 TO GETWORDCOUNT(m.lclist,',')
m._lcval=GETWORDNUM(m.lclist,m._jk,',')
IF VAL(m._lcval)=VAL(m._lcold)+1 AND m._lcold#''
m._lpriz=.T.
ELSE
m._lctext=m._lctext+IIF(EMPTY(m._lctext),'',',')+IIF(m._lpriz,m._lcnew+'-','')+m._lcold
m._lcnew=m._lcval
m._lpriz=.F.
ENDIF
m._lcold=m._lcval
ENDFOR
m._lctext=m._lctext+IIF(EMPTY(m._lctext),'',',')+IIF(m._lpriz,m._lcnew+'-','')+m._lcold
RETURN m._lctext
ENDPROC


------------------
Незнание делает жизнь такой интересной.
Ratings: 0 negative/0 positive
Re: последовательность
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
dimuhametov
Код из 20 строк написал.

А в чем вообще была суть-то задачи?
По приведенному коду у меня например, что вводишь в параметры - то же самое и выводится.
Один в один.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: последовательность
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
dimuhametov
Уважаемы форумчане!
Есть последовательность '1,2,3,4,5,7,9,10,11,12,25' (каждое последующее больше предыдущего) надо превратить '1-5,7,9-12,25'.
Башка что-то не варит. Спасибо.

Страничность?

dimuhametov
Всем спасибо. Код из 20 строк написал.

Так, по моему, изящней будет и практичней, так сказать, унифицировано

LPARAMETERS itog
FOR n=1 TO IIF(!EMPTY(itog),ALINES(ara,itog+", ",1,",")-1,0)
IF n=1
mcrs='ara(n)+IIF(VAL(ara(n+1))-VAL(ara(n))=1,"-",IIF(ALEN(ara)>n+1,",",""))'
itog=&mcrs
ENDIF
IF ALEN(ara)>2
itog = IIF(VAL(ara(n+1))-VAL(ara(n))=1,IIF(RIGHT(itog,1)=",",itog+&mcrs,itog),itog+&mcrs)
ENDIF
ENDFOR
RETURN itog

С наступающими именинами

, кстати!
:beer2:


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.




Исправлено 3 раз(а). Последнее : Chemberzhy, 27.05.20 17:50
Ratings: 0 negative/0 positive
Re: последовательность
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
А без макроподстановки ведь никак, да?

? GetListStr('1,2,3,4,5,7,9,10,11,12,25')
#define mcrs ara(n)+IIF(VAL(ara(n+1))-VAL(ara(n))=1,"-",IIF(ALEN(ara)>n+1,",",""))
PROCEDURE GetListStr
LPARAMETERS itog
FOR n=1 TO IIF(!EMPTY(itog),ALINES(ara,itog+", ",1,",")-1,0)
IF n=1
itog = mcrs
ENDIF
IF ALEN(ara)>2
itog = IIF(VAL(ara(n+1))-VAL(ara(n))=1,IIF(RIGHT(itog,1)=",",itog+ mcrs,itog),itog+ mcrs)
ENDIF
ENDFOR
RETURN itog


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: последовательность
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
ssa
А без макроподстановки ведь никак, да?

Я так всю сознательную, начиная с 2.6-го делал, не переучить уже, тем более, когда и не зарабатываю этим

Но, за поправочку Спасибо!
Если кому приглянется такая функция, современнее будет ее использовать именно так ;)


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.




Исправлено 1 раз(а). Последнее : Chemberzhy, 27.05.20 18:56
Ratings: 0 negative/0 positive
Re: последовательность
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
ssa
А без макроподстановки ведь никак, да?

Все конечно круто. А смысл? Строка mcrs в откомпилированный Файл войдёт трижды.
Iif ы, тем более вложенные, ну не читается абсолютно.
Не проще явно разложить на do case под каждый случай?

Ну и собственно, если первый элемент одиночный, то результат не правильный. Типа "1,3". Выдаст "1,1,3"
Ratings: 0 negative/0 positive
Re: последовательность
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Taran
Ну и собственно, если первый элемент одиночный, то результат не правильный. Типа "1,3". Выдаст "1,1,3"

Ты прав
По случаю подправлю
Ну, а iif просто всегда быстрее работал, потому еще со старой привычки я его активно использую


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/0 positive
Re: последовательность
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Может так попробовать:
PROCEDURE GetListStr
LPARAMETERS itog
FOR N=1 TO ALINES(ara,itog+", ",1,",")-1
mcrs = ara(N)+IIF(VAL(ara(N+1))-VAL(ara(N))=1,"-",IIF(ALEN(ara)>N+1,",",""))
itog = IIF(N=1,mcrs,IIF(VAL(ara(N+1))-VAL(ara(N))=1,IIF(RIGHT(itog,1)=",",itog+ mcrs,itog),itog+ mcrs))
ENDFOR
RETURN itog
Ratings: 0 negative/0 positive
Re: последовательность
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Taran
А смысл? Строка mcrs в откомпилированный Файл войдёт трижды.

В отличие от макро здесь mcrs - это не строка, а выражение.
В fxp это выражение будет уже откомпилировано, а строки не будет вовсе.
Так что если сравнивать с макро, то смысл очевиден - скорость выполнения.



Исправлено 2 раз(а). Последнее : akvvohinc, 27.05.20 20:44
Ratings: 0 negative/0 positive
Re: последовательность
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
lulgu
Может так попробовать:
PROCEDURE GetListStr
LPARAMETERS itog
FOR N=1 TO ALINES(ara,itog+", ",1,",")-1
mcrs = ara(N)+IIF(VAL(ara(N+1))-VAL(ara(N))=1,"-",IIF(ALEN(ara)>N+1,",",""))
itog = IIF(N=1,mcrs,IIF(VAL(ara(N+1))-VAL(ara(N))=1,IIF(RIGHT(itog,1)=",",itog+ mcrs,itog),itog+ mcrs))
ENDFOR
RETURN itog

О! Цинус!
Вроде работает и совсем стал миниатюрный. Люблю разумный минимализм!


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 18 (Гостей: 18)

© 2000-2024 Fox Club 
Яндекс.Метрика