2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Сравнение нескольких переменных С\С++
Сообщение23.05.2010, 15:29 
Собственно решал задачки и возникла небольшая проблема, нужно сравнить несколько переменных по их значению. От 3 до $\infty$ переменных.
Понятно, что можно обойтись if'ами, но когда переменных много и нужно учитывать не только больше\меньшие значения, но еще и равные, код становится просто не читаемым.
Как временный вариант я сделал цикл, где каждая переменная декрементируется, каждую итерацию. Ну и соотвественно, чем раньше переменная вышла из гонки, тем она меньше.

Но это собственно от лукавого, должен быть нормальный способ, но я что то не как не могу его придумать :(
Помогите :(

P.S Вообще конечно можно организовать массив....Но это было бы не желательно.

 
 
 
 Re: Сравнение нескольких переменных С\С++
Сообщение23.05.2010, 15:49 
Нормальный способ --- это загнать их в массив (вектор) и отсортировать. Можно загнать в виде структур с полями [значение, ссылка на исходную переменную], тогда всегда можно будет установить связь. Непонятно, почему нежелательно. Жаба память душит, или что?

Есть ещё продвинутый способ. Написать кодогенератор варианта с ифами. После этого обфускаторы обычно не нужны...

 
 
 
 Re: Сравнение нескольких переменных С\С++
Сообщение23.05.2010, 16:05 
Цитата:
Нормальный способ --- это загнать их в массив (вектор) и отсортировать. Можно загнать в виде структур с полями [значение, ссылка на исходную переменную], тогда всегда можно будет установить связь. Непонятно, почему нежелательно. Жаба память душит, или что?

В массив нельзя по очень простой причине, эти переменные это длина чисел во внешнем файле. Числа идут по порядку и если я это загоню в массив и отсортирую ничего хорошего не получится. Можно конечно сделать два массива в одном значения в другом указатели на оригинальные переменные. Как вариант.

Кодогенератор с if'ами конечно не плохой вариант, но возможно этот кусок потом придется переписывать и я замучаюсь разбираться в этом.

Я просто думал, что я туплю где то и есть элементарный вариант....

 
 
 
 Re: Сравнение нескольких переменных С\С++
Сообщение23.05.2010, 16:20 
Nikita_b в сообщении #323073 писал(а):
В массив нельзя по очень простой причине, эти переменные это длина чисел во внешнем файле. Числа идут по порядку и если я это загоню в массив и отсортирую ничего хорошего не получится. Можно конечно сделать два массива в одном значения в другом указатели на оригинальные переменные. Как вариант.

Вы не поняли. Вам предложиди сделать массив пар (порядковый номер, значение), которые потом отсортировать по значению. Способ практически стандартный.

 
 
 
 Re: Сравнение нескольких переменных С\С++
Сообщение28.05.2010, 00:47 
Насколько я понял, надо отсортировать данные, или как?
Для сортировки произвольного количества данных, если ОС поддерживает проекцию файла в память, то можно поступить следующим образом.
1. Спроецировать файл данных в память.
2. Открыть файл и записать в него последовательно целые числа от 0 до [количество данных -1] (или offset каждого данного от начала файла)
3. Спроецировать этот файл в память.
4. Применить qsort(...) ко второму файлу, где значения посылаемые в qsort это ссылка на данные.
5. Во втором файле указан порядок следования данных.

Можно просто грузить данные в ОЗУ, организовывать еще один массив и сортировать второй массив по данным первого массива.

Если Вам надо использовать ОС не поддерживающей проекцию файла в память и количество данных очень велико, то это нетривиально. Хотя решал тоже.
Разбиваете свой входной массив на части, и решаете, как указано выше, загрузкой в память. Повторяете это несколько раз. Рано или поздно массив отсортируется.

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group