Сдвиг элементов
- Войдите на сайт для отправки комментариев
Задача следующая:
есть пиктограммы отображающие определенный процесс на экране (5 пиктограмм):
[....{1}{2}{3}{4}{5}] - это все пиктограммы когда все процессы активны
[....{1}{.}{3}{.}{5}] - это когда процессы 2 и 4 не активны
Так то проблем нет, но на экране смотрится нелаконично.
Как сделать так:
[....{.}{.}{1}{3}{5}]
а при активации процесса 2
[....{.}{2}{1}{3}{5}]
чтобы он просто занял пустое не занятое место.
P.S.
я примерно представляю так 5 функций (пиктограмм bool fn_1(int x1, bool status_1) .... bool fn_5(int x5, bool status_5) принимают координаты по икс и возвращают статус ) над ними функция проверяющая статусы всех функций и те у которых возвратилась 1 , выставляет в определенном порядке и если в ряде функций сменился статус она сдвинула остальные!
|
я примерно представляю так 5 функций (пиктограмм bool fn_1(int x1, bool status) .... bool fn_5(int x5, bool status) принимают координаты по икс и возвращают статус ) над ними функция проверяющая статусы всех функций и те у которых возвратилась 1 , выставляет в определенном порядке и если в ряде функций сменился статус она сдвинула остальные!
|
Не очень понятен вопрос.
А если принять, что одна пиктограмма это один бит в байте. Тогда так и будете задавать 11001
// Example program #include <iostream> #include <string> typedef unsigned char byte; const int MAX_PROCESSES = 5; byte processes[MAX_PROCESSES] = {0}; byte emptySlot = 0; void print(byte processNumber) { std::cout << '{' << (int) processNumber << '}'; } bool addProcess(byte processNumber) { // есть ли у нас ещё свободные места? if(emptySlot >= MAX_PROCESSES) return false; // проверяем - не существует ли такой процесс уже? for(byte i=0;i<emptySlot;i++) { if(processes[i] == processNumber) return false; } // добавляем processes[emptySlot] = processNumber; emptySlot++; return true; } void removeProcess(byte processNumber) { for(byte i=0;i<emptySlot;i++) { if(processes[i] == processNumber) { for(byte k=i+1;k<MAX_PROCESSES;k++) { processes[k-1] = processes[k]; } emptySlot--; break; } } } void showProcesses(bool reverseOrder) { std::cout << "show: processes running - " << (int) emptySlot << '\n'; if(!emptySlot) return; for(byte i=0;i<emptySlot;i++) { print(processes[ reverseOrder ? emptySlot-i-1 : i]); } std::cout << std::endl; } int main() { std::cout << "Process test\n"; showProcesses(true); addProcess(5); showProcesses(true); addProcess(2); addProcess(4); showProcesses(true); addProcess(1); removeProcess(2); showProcesses(true); addProcess(3); showProcesses(true); }
Пробовал вот прям здесь, работает как вы описали: https://www.jdoodle.com/online-compiler-c++
timurufa, вопрос, конечно, сформулирован непонятно, но что есть - то есть.
Могу предположить, что Вам нужно выводить не каждый параметр с фиксированной позиции, а начиная с правого края. После каждого вывода обновлять пизицию, с которой начинается вывод.
Т.е.
0. Позиция вывода - правый край.
1. Определяем длину для первого вывода. Вычитаем ее из прошлой позиции вывода, позицию запоминаем и по ней выводим.
2. Определяем длину второго вывода. Вычитаем ее из запомненного на шаге 1 значения, выводим.
3. Третий вывод пропускаем - ничего не делаем (ну либо вычисляем длину вывод - 0 и вычитаем 0).
4. Определяем длину четвертого вывода. Вычитаем ее из запомненного на шаге 2 значения, выводим.
...
Верно при выводе пиктограмм идет просто заполнение подряд (пусть будет с права на лево), но только активных процессов! пусть будет например процессы 145 - они отображаутся подрят с права на лево, при активации процесса 2 - будет так 2145 , но при деактивации процесса например 4 должно стать: 215 и все подрят т.е. сдвиг 21 вправо на оди, а если например все активны 12453 и при деактивации 2 и 5, то 1 сместится в право на 2, и 4 на 1 ... как то так вот и надо реализовать сей процесс... ума не хватает((
timurufa, Вы путаете между собой две различные операции - порядок опроса процедур и отображение результатов со сдвигом.
Я Вам описал алгоритм только отображения со сдвигом.
Судя по всему, у Вас возмникли проблемы с порядком опроса, который и определяет взаимное положение на экране.
Могу порекомендовать использовать массив-очередь (очередь - не в программистским, а в бытовом смысле). Перед каждым циклом опроса складываете в этот массив номера процессов в том порядке, который нужен. Например, при добавлении процесса он помещается на первое свободное место в массиве, а при удалении - все последующие сдвигаются на одну позицию к началу.
Массив использовать на 6 элементов. Процессы так и обозначаются: 1, 2, 3, 4, 5. Еще нужен 0-й элемент, используемый как индикатор конца перебора. При помещении процесса в конец - после него записывается 0, а при удалении - сдвигаются все элементы до конца, что гарантирует правильное подложение нулевого элемента.
// Example program #include <iostream> #include <string> typedef unsigned char byte; const int MAX_PROCESSES = 5; byte processes[MAX_PROCESSES] = {0}; byte emptySlot = 0; void print(byte processNumber) { std::cout << '{' << (int) processNumber << '}'; } bool addProcess(byte processNumber) { // есть ли у нас ещё свободные места? if(emptySlot >= MAX_PROCESSES) return false; // проверяем - не существует ли такой процесс уже? for(byte i=0;i<emptySlot;i++) { if(processes[i] == processNumber) return false; } // добавляем processes[emptySlot] = processNumber; emptySlot++; return true; } void removeProcess(byte processNumber) { for(byte i=0;i<emptySlot;i++) { if(processes[i] == processNumber) { for(byte k=i+1;k<MAX_PROCESSES;k++) { processes[k-1] = processes[k]; } emptySlot--; break; } } } void showProcesses(bool reverseOrder) { std::cout << "show: processes running - " << (int) emptySlot << '\n'; if(!emptySlot) return; for(byte i=0;i<emptySlot;i++) { print(processes[ reverseOrder ? emptySlot-i-1 : i]); } std::cout << std::endl; } int main() { std::cout << "Process test\n"; showProcesses(true); addProcess(5); showProcesses(true); addProcess(2); addProcess(4); showProcesses(true); addProcess(1); removeProcess(2); showProcesses(true); addProcess(3); showProcesses(true); }
Пробовал вот прям здесь, работает как вы описали: https://www.jdoodle.com/online-compiler-c++
код- то что нужно, вы прям как буд то бы под меня писали! вот только бы под ардуино ... )
код- то что нужно, вы прям как буд то бы под меня писали! вот только бы под ардуино ... )
Это С++ - выкиньте ненужные выводы в cout , функцию main, оставьте только мои функции - и всё скомпилируется в ардуино. Или за вас и это делать?
код- то что нужно, вы прям как буд то бы под меня писали! вот только бы под ардуино ... )
Это С++ - выкиньте ненужные выводы в cout , функцию main, оставьте только мои функции - и всё скомпилируется в ардуино. Или за вас и это делать?
Добрый день!!
Действительно .... сказывается неопытность и лень((( простите!
Щас попробую все сделать
P.S. Всех с НОВЫМ ГОДОМ!
что есть то есть)))