IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Численный эквивалент строки
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 100
Пол: Мужской

Репутация: -  0  +


Доброе время суток!

Есть такая проблема. Существуют некая последовательность строк(номера товара). Номера обычно имеют вид:
100 100а 100б 101 1000 ну и так далее. Т.е. могут быть и числа и буквы. Необходимо сделать чтобы набор вида: [100,100а,100б,101] перевести в строку "100-101". Т.е. указать интервалами. Как это можно сделать. Пока что придумал только следующее: считываем по одному символу из названия товара, затем проверяем цифра ли это. Если цифра то добавляем ее в целую часть числа, если же нет, то добавляем код символа ASCII в дробную часть. Например: 100a - переведется в число 100,102 (вроде код русской "а" - 102). Соответственно если 100аб - то будет 100.102103. Но тогда проблема если большие названия(не хватит цифр после запятой) и как быть если вдруг встретится буква в началае.


Есть идеи?? заранее благодарен
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Я бы делал не так... А сразу хранил бы верхнюю и нижнюю границы интервала. Смотри: допустим, твой же интервал: [100, 100а, 100б, 101].
Интервал пустой, берем "100" - начало и конец интервала = "100"
Интервал "100" - "100", берем "100а". проверяем, не входит ли число в интервал (больше или равно верхней границе, и меньше или равно нижней) - нет, не входит. Тогда еще две проверки: больше верхней? Тогда верхняя граница интервала меняется. Меньше нижней? Тогда меняется нижняя граница. В нашем случае - "больше верхней", интервал становится "100" - "100а"

И так далее. В конце просто запишешь начало/конец интервала в одну строку и поставишь между ними тире...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 100
Пол: Мужской

Репутация: -  0  +


Так не пойдет. Если будет массив [100, 100а, 100б, 200а, 200б, 200в], то должно получится 2 интервала:
[100-100б], [200а-200в];

Проблема только в представлении строки как числа. Чтобы каким то образом можно было определить подряд ли идут номра или нет.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
то должно получится 2 интервала
С чего это? Ты тогда приводи полностью задание, а не то, КАК ТЫ ДУМАЕШЬ, что это задание надо решать... Вот тебе "вопрос на засыпку": [100, 100а, 100б, 200а, 200б, 200в, 101, 101а, 101б] - что должно получиться на выходе? Два интервала, или уже 3? Другими словами, какова "чувствительность" интервала?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 100
Пол: Мужской

Репутация: -  0  +


Да задание то в том штобы пользователю удобно было просматривать большие группы товара. чтобы он сразу видел 100-200 а не большой список. Лучше бы чтобы было 2 интервала в твоём примере. Т.е. нету никакого конкретного задания. Просто думаю, как будет удобней пользователю.

Сообщение отредактировано: kosyak -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Тогда тебе надо разделить правило и алгоритм.
Правило говорит, что должно получиться в результате преобразования, а алгоритм - как выполнение этого правила реализовать на практике.
Сначала постарайся точно сформулировать правило.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






kosyak, в качестве псевдокода возможного решения твоей проблемы (все-таки, раздел - теоретический):
procedure main is
type Vector is array(Natural range <>) of String(1 .. 4);

function Divide_To_Intervals(V: in Vector) return String is
type R is record
Val: Integer;
st: String(1 .. 20);
end record;

type RVType is array(Natural range <>) of R;

function Convert(s: in String) return R is
i: Integer;
mySt: String(1 .. 20) := (others => ' ');
begin
i := 1;
while (s(i) >= '0') and then (s(i) <= '9') loop
i := i + 1;
end loop;
mySt(mySt'First .. s'Last - (i - 1)) := s(i .. s'Last);
return R'(Val => Integer'Value(s(s'First .. i - 1)), st => mySt);
end Convert;

function Image(Rec: in R) return String is
begin
return Integer'Image(Rec.Val) & Trim(Source => Rec.st, Side => Both);
end Image;

function "<" (Lt, Rg: R) return Boolean is
begin
return ((Lt.Val < Rg.Val) or ((Lt.Val = Rg.Val) and (Lt.st < Rg.st)));
end "<";

procedure Sort is
new Ada.Containers.Generic_Array_Sort(
Index_Type => Natural, Element_Type => R, Array_Type => RVType
);

RV: RVType(V'First .. V'Last);
Sens: Float;

start: Integer;
res: Unbounded_String;
begin
for i in V'Range loop
RV(i) := Convert(V(i));
end loop;
Sort(RV);

Sens := Float(RV(V'Last).Val - RV(V'First).Val) / 10.0;
Start := V'First;

for i in V'First + 1 .. V'Last + 1 loop
if (i = V'Last + 1) or else (Float(RV(i).Val - RV(i - 1).Val) > Sens) then
res := res & Image(RV(start)) & "-" & Image(RV(i - 1)) & ";";
start := i;
end if;
end loop;
return To_String(res);
end Divide_To_Intervals;

Vec: constant Vector := ("100 ", "100a", "100b", "200a", "200b", "200v", "101 ", "101a", "101b");
begin
Put_Line(Divide_To_Intervals(Vec));
end;
(сама идея понятна, или требуются объяснения? Как ты уже догадался, это выдержки из абсолютно рабочего кода. Тестировался он на всех массивах, которые ты привел, и еще на десятке других. Сбоев не дал нигде)
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 17:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name