Сдвиг элементов

timurufa
Offline
Зарегистрирован: 08.08.2013

Задача следующая:
есть пиктограммы отображающие определенный процесс на экране (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 , выставляет в определенном порядке и если в ряде функций сменился статус она сдвинула остальные!

 

Smith2007
Offline
Зарегистрирован: 30.10.2017

Не очень понятен вопрос. 

А если принять, что одна пиктограмма это один бит в байте. Тогда так и будете задавать 11001

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015
// 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++

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

timurufa, вопрос, конечно, сформулирован непонятно, но что есть - то есть.

Могу предположить, что Вам нужно выводить не каждый параметр с фиксированной позиции, а начиная с правого края. После каждого вывода обновлять пизицию, с которой начинается вывод.

Т.е.

0. Позиция вывода - правый край.

1. Определяем длину для первого вывода. Вычитаем ее из прошлой позиции вывода, позицию запоминаем и по ней выводим.

2. Определяем длину второго вывода. Вычитаем ее из запомненного на шаге 1 значения, выводим.

3. Третий вывод пропускаем - ничего не делаем (ну либо вычисляем длину вывод - 0 и вычитаем 0).

4. Определяем длину четвертого вывода. Вычитаем ее из запомненного на шаге 2 значения, выводим.

...

timurufa
Offline
Зарегистрирован: 08.08.2013

Верно при выводе пиктограмм идет просто заполнение подряд (пусть будет с права на лево), но только активных процессов! пусть будет например процессы 145 - они отображаутся подрят с права на лево, при активации процесса 2 - будет так 2145 , но при деактивации процесса например 4 должно стать: 215 и все подрят т.е. сдвиг 21 вправо на оди, а если например все активны 12453 и при деактивации 2 и 5, то 1 сместится в право на 2, и 4 на 1 ... как то так вот и надо реализовать сей процесс... ума не хватает((

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

timurufa, Вы путаете между собой две различные операции - порядок опроса процедур и отображение результатов со сдвигом.

Я Вам описал алгоритм только отображения со сдвигом.

Судя по всему, у Вас возмникли проблемы с порядком опроса, который и определяет взаимное положение на экране.

Могу порекомендовать использовать массив-очередь (очередь - не в программистским, а в бытовом смысле). Перед каждым циклом опроса складываете в этот массив номера процессов в том порядке, который нужен. Например, при добавлении процесса он помещается на первое свободное место в массиве, а при удалении - все последующие сдвигаются на одну позицию к началу.

Массив использовать на 6 элементов. Процессы так и обозначаются: 1, 2, 3, 4, 5. Еще нужен 0-й элемент, используемый как индикатор конца перебора. При помещении процесса в конец - после него записывается 0, а при удалении - сдвигаются все элементы до конца, что гарантирует правильное подложение нулевого элемента.

timurufa
Offline
Зарегистрирован: 08.08.2013

DIYMan пишет:

// 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++

 

код- то что нужно, вы прям как буд то бы под меня писали! вот только бы под ардуино ... ) 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

timurufa пишет:
код- то что нужно, вы прям как буд то бы под меня писали! вот только бы под ардуино ... ) 

https://www.youtube.com/watch?v=_nOAe7cubzs

https://www.youtube.com/watch?v=pX3NeMaiosg

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

timurufa пишет:

код- то что нужно, вы прям как буд то бы под меня писали! вот только бы под ардуино ... ) 

Это С++ - выкиньте ненужные выводы в cout , функцию main, оставьте только мои функции - и всё скомпилируется в ардуино. Или за вас и это делать?

timurufa
Offline
Зарегистрирован: 08.08.2013

DIYMan пишет:

timurufa пишет:

код- то что нужно, вы прям как буд то бы под меня писали! вот только бы под ардуино ... ) 

Это С++ - выкиньте ненужные выводы в cout , функцию main, оставьте только мои функции - и всё скомпилируется в ардуино. Или за вас и это делать?

Добрый день!! 

Действительно .... сказывается неопытность и лень((( простите! 

Щас попробую все сделать

P.S.  Всех с НОВЫМ ГОДОМ!

timurufa
Offline
Зарегистрирован: 08.08.2013

qwone пишет:

timurufa пишет:
код- то что нужно, вы прям как буд то бы под меня писали! вот только бы под ардуино ... ) 

https://www.youtube.com/watch?v=_nOAe7cubzs

https://www.youtube.com/watch?v=pX3NeMaiosg

что есть то есть)))