Минор матрицы с помощью статически-созданных массивов
Может у кого есть рабочий код/алгоритм, как вычислить, или хотя бы отделить минор матрицы(просто вычеркнуть лишние строки и столбцы) !максимальное внимание!Запрещено использовать указатели, динамические массивы, операторы new, delete, любые стандартные шаблоны stl, итераторы, контейнеры, библиотеки для обработки матриц. Если более кратко, только двумерные и не только массивы и ничего больше.
Ответы (1 шт):
Логика цикла, пропускающего элементы
инициализация;
while( условие продолжения )
{
if( надо пропустить итерацию? ) continue;
// действия итерации
}
циклы for() и do-while работает так же. Для многомерных массивов вложенность цикла будет выше.
инициализация;
while( условие продолжения по строкам)
{
if( надо пропустить итерацию? ) continue;
// действия итерации
инициализация;
while( условие продолжения по столбцам )
{
if( надо пропустить итерацию? ) continue;
// действия итерации
}
}
В упрощенном случае, для копирования массива:
строка = столбец = ист_строка = ист_столбец = 0;
while( ист_строка < число_строк_источника )
{
if(ист_строка в списке пропускаемых ) {
ист_строка += 1;
continue;
}
else
{
while( ист_столбец меньше чем число_столбцов_источника )
{
if( ист_столбец в списке пропускаемых ) {
ист_столбец += 1;
continue;
else {
цель[строка][столбец] = источник[ист_строка][ист_столбец]
ист_столбец += 1;
столбец += 1;
}
}
ист_строка += 1;
строка += 1;
}
}
По-моему нигде не ошибся. Тяжесть все это еще в том что проверка , пропускаем ли мы столбец или строку - тоже цикл. В виде функции желательно. "Облегчить" это можно введя статический массив с флагом в элементе, соответствующим пропускному столбцу или строке.
Можно обойтсь более простым и эффективным циклом по строкам и столбцам целевого минора, но дляэтого надо сначала сформировать "карты" соответсвия индексов. Пусть макс. размер массива равен 10, тогда надо заранее сформировать массивы со следующими значениями на основе ввода пользователя:
//пропущены столбцы с индексами 2 и 4
int столбцы[10] = { 0, 1, 3, 5, -1 };
// взяты только строки с индексами 1 и 2
int строки[10] = { 1, 2, -1 };
Тогда цикл выглядит так
// -1 является концом списка индексов.
int ист_строка, ист_столбец;
for(int строка = 0; (ист_строка = строки[строка]) != -1; ++строка )
{
for(int столбец = 0; (ист_столбец = столбцы[столбец]) != -1; ++столбец )
цель[строка][столбец] = источник[ист_строка][ист_столбец]
}
PS. В реальности стараются избегать необходимости использовать вложенные циклы с ветвлениями как первый пример т.к. современные процессоры справляются с ними хуже чем с непрерывным копированием, что отражается на организации используемых данных. В данном случае сами условия задачи форсируют использование такого кода.