Форум программистов, компьютерный форум CyberForum.ru

Удаление нулевой(-ых) строчки и столбца из матрицы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
Sid21
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 2
27.07.2012, 21:11     Удаление нулевой(-ых) строчки и столбца из матрицы #1
Доброго времени суток! Помогите написать программу, которая проверяла бы матрицу на нулевую строчку и столбец, и, если таковые присутствуют, удаляла бы их.Поясню: из матрицы
1 0 4
0 0 0
3 0 5
удалить 2 строчку и 2 столбец. Самое главное это "индекс" (то бишь n-ая строка и n-ый столбец)
Я попробовал написать код, но у меня мало чего получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <math.h>
#include <cstdlib>
 
using namespace std;
 
int main()
{
int i, j, k;
double count;
int N;
cout<<"Vvedite razmer matrizy \n";
cin>>N;
double A[N][N], Flak[N];
 
cout<<"Vvedite matrizy \n";
for (i=0; i<N; i++)
{for (j=0; j<N; j++)
{cin>>A[i][j];}
cout<<endl;}
 
//Поиск строчек и столбцов, "индекс" записывается в массив Flak
k=0;
for (i=0; i<N; i++)
{   count=0;
    for (j=0; j<N; j++)
{if (A[i][j]==0 && A[i][j]==A[j][i])
{count++;}
if (count==N)
{Flak[k]=i;
k++;}
}
}
for (k=0; k<N; k++)
{cout<<Flak[k]<<"\n";} //пытался вывести массив Flak и найти ошибку
system("PAUSE");
//Вывод массива без нулевых строчек
for (i=0; i<N; i++)
    {for (j=0; j<N; j++)
{k=j;
if (i!=Flak[k] && j!=Flak[k])
{cout<<A[i][j]<<" ";}
}
cout<<endl;
}
system("PAUSE");
return 0;
}
Строго не судите, первые шаги в изучении языка
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2012, 21:11     Удаление нулевой(-ых) строчки и столбца из матрицы
Посмотрите здесь:

C++ Поменять местами строчки матрицы
Удаление нужной строчки из файла C++
C++ Разделить элементы каждого столбца заданной матрицы на последний элемент столбца
Заданы матрицы А, В, С, D, каждая из которых содержит по три строчки и по три столбца. Перемножить матрицы Р и Q C++
Здесь есть удаление столбца, как добавить удаление строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 21:53     Удаление нулевой(-ых) строчки и столбца из матрицы #2
Что то вроде этого.
Не компиллил. Возможны небольшие баги. Но вроде - верно.
Оформил процедуру для строк. Для столбцов - попробуйте сами по аналогии.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    // Ввод данных
    // ...
    
    // Непосредственная обработка
    
    // Сначала - идем по строкам
    int *buf = new int(colCount);   // Массив нулевых строк
    int currentBufIndex = 0;
    for (int i = 0; i < rowCount; i++)
    {
        bool b = true;
        for (int j = 0; j < colCount; j++)
        {
            if (matr[i][j] != 0)
            {
                b = false;
                break;
            }
        }
        if (b == true)
        {
            // i - ая строка - нулевая
            // Занесем ее в массив для удаления
            buf[currentBufIndex] = i;
            currentBufIndex++;
        }
    }
    
    // Непосредственное удаление
    int currentBufIndex_1 = 0;
    int lineOffset = 0;
    for (int i = 0; i < rowCount - currentBufIndex; i++)
    {
        // Сдвигаемся построчно вверх
        if (i == buf[currentBufIndex_1])
        {
            // Увеличиваем счетчик сдвига
            lineOffset++;
            // Сдвигаемся к следующему элементу массива
            currentBufIndex_1++;
        } else {
            // Текущая строка - значимая
            // => сдвигаемся
            for (int j = 0; j < colCount; j++)
            {
                matr[i - lineOffset][j] = matr[i][j];
            }
        }
    }
    // Все сдвиги - произведены. Уменьшаем число строк
    rowCount -= currentBufIndex;
    
    delete buf;
    
    // Аналогично - со строками.
    // ...
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
27.07.2012, 21:56     Удаление нулевой(-ых) строчки и столбца из матрицы #3
Если в "лоб", то примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// Если zr[i] == ture, то строка r[i] содержит только нули.
int* zr = new int[N];
// Если zc[i] == true, то столбец c[i] содержит только нули.
int* zc = new int[N];
 
 
// Поиск индексов строки содержащей только нули.
for (int r = 0; r < N; ++r)
    zr[r] = true;
    for (int c = 0; c < N; ++c)
    {
        if (A[r][c] != 0)
        {
            zr[r] = false;
            break;
        }
    }
}
 
// Поиск индексов столбца содержащего только нули.
for (int c = 0; c < N; ++c)
{
    zr[c] = true;
    for (int r = 0; r < N; ++r)
    {
        if (A[c][r] != 0)
        {
            zc[c] = false;
            break;
        }
    }
}
Добавлено через 1 минуту
Цитата Сообщение от Sid21 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
int N;
cout<<"Vvedite razmer matrizy \n"; cin>>N;
double A[N][N], Flak[N];
cout<<"Vvedite matrizy \n";
for (i=0; i<N; i++) 
{for (j=0; j<N; j++)
{cin>>A[i][j];}
cout<<endl;}
Разберитесь с new и delete
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.07.2012, 22:22     Удаление нулевой(-ых) строчки и столбца из матрицы #4
Удаление всех нулевых строк без единого цикла. Аналогично можно и для столбцов сделать.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<stdio.h>
#include<time.h>
#define M 3
#define N 5
 
void Init(int *a, int *end)
{
   if (a < end)
   {
       *a = rand() % 100;
       Init(a + 1, end);
   }
}
 
void Print(int *a, int i, int *end)
{
   if (a < end)
   {
       printf("%d%c", *a, i%N ? ' ' : '\n');
       Print(a + 1, i + 1, end);
   }
}
 
int Check(int *a, int *end)
{
   return a < end ? (*a == 0 && Check(a + 1, end)) : 1;
}
 
void DellRows(int *a, int *end)
{
    if(a + N < end)
    {
        *a = *(a + N);
        DellRows(a + 1, end);
    }
}
 
 
void Dell(int *a, int *end, int *m)
{
   if (a < end)
   {
       if (Check(a, a + N))
       {
          DellRows(a, end);
          (*m)--;
          end -= N;
       }
       else ++a;
       Dell(a, end, m);
   }
}
 
int main()
{
   int m = M, a[M][N];
   srand(time(NULL));
   Init(*a, *a + M*N);
   Print(*a, 1, *a + M*N);
   Dell(*a, *a + M*N, &m);
   puts("\n");
   Print(*a, 1, *a + m*N);
   return 0;
}
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:23     Удаление нулевой(-ых) строчки и столбца из матрицы #5
Thinker, выпендрился. Заменил цикл рекурсией. Так держать!
Thinker
27.07.2012, 22:24
  #6

Не по теме:

что значит "выпендрился", для матриц это еще ухитриться надо.

HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:25     Удаление нулевой(-ых) строчки и столбца из матрицы #7
Цитата Сообщение от Thinker Посмотреть сообщение
для матриц это еще ухитриться надо
Глупостями занимаетесь, батенька...
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.07.2012, 22:28     Удаление нулевой(-ых) строчки и столбца из матрицы #8
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Глупостями занимаетесь, батенька...

Не по теме:

мне до "батенька" еще далеко (по возрасту), а по поводу глупостей, то это просто мыслительно полезно

no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 322
27.07.2012, 23:12     Удаление нулевой(-ых) строчки и столбца из матрицы #9
Ну, или самый простой и близкий вариант к заданию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream.h>
#include <conio.h>
 
void main()
{
const int N = 3;
int index_1 = 0, index_2 = 0, value_1 = N, value_2 = N;
double A[N][N] = {{0, 0, 0}, {1, 1, 0}, {4, 2, 0}}, array_1[N + N] = {0};
 
for(index_1 = 0; index_1 < N; ++index_1)
{
for(index_2 = 0; index_2 < N; ++index_2)
if(A[index_1][index_2] == 0)
++array_1[index_1];
 
for(index_2 = 0; index_2 < N; ++index_2)
if(A[index_2][index_1] == 0)
++array_1[N + index_1];
}
 
for(index_1 = 0; index_1 < N; ++index_1)
{
for(index_2 = 0; index_2 < N; ++index_2)
{
if(array_1[N + index_2] == N || array_1[index_1] == N)
continue;
cout<<A[index_1][index_2]<<" ";
}
cout<<endl;
}
 
getch();
}
Sid21
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 2
28.07.2012, 00:44  [ТС]     Удаление нулевой(-ых) строчки и столбца из матрицы #10
Всем огромнее спасибо за помощь!
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
28.07.2012, 16:34     Удаление нулевой(-ых) строчки и столбца из матрицы #11
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Thinker, выпендрился. Заменил цикл рекурсией. Так держать!
Цитата Сообщение от Thinker Посмотреть сообщение

Не по теме:

мне до "батенька" еще далеко (по возрасту), а по поводу глупостей, то это просто мыслительно полезно

HomeR_J_SimpsoN, ну, скажите честно, разве не полезно этот вопрос лишний раз поднять В ДАННОЙ теме???
Thinker, ну вы же не указали, что это решение для дальнейшего академического обсуждения.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
28.07.2012, 18:25     Удаление нулевой(-ых) строчки и столбца из матрицы #12
Цитата Сообщение от bigredcat Посмотреть сообщение
Thinker, ну вы же не указали, что это решение для дальнейшего академического обсуждения.

Не по теме:

не совсем понял о чем речь. мое решение это просто замена всех циклов рекурсией, все банально.

HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
28.07.2012, 19:32     Удаление нулевой(-ых) строчки и столбца из матрицы #13
Цитата Сообщение от bigredcat Посмотреть сообщение
разве не полезно этот вопрос лишний раз поднять
Нет, на мой взгляд не полезно. Рекурсия крайне противная штука, которая уменьшает быстродействие приложения в разы. Предпочитаю избегать ее где только это возможно.
А конкретно для ДАННОЙ темы это скорее во вред тк автор не может разобраться даже с простейшими циклическими алгоритмами, куда уж там до сложных рекурсивных алгоритмов, тем более, что
Цитата Сообщение от Thinker Посмотреть сообщение
для матриц это еще ухитриться надо
Thinker
28.07.2012, 19:39
  #14

Не по теме:

Я, кстати, согласен, и в реальных приложениях стараюсь только итеративные алгоритмы использовать. Просто скучная задача и хотелось что-то новое добавить, не более того, да и просто полезно

no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 322
29.07.2012, 15:04     Удаление нулевой(-ых) строчки и столбца из матрицы #15
Суть в занятиях программированием - развитие компьютерной логики!!! Рекурсия - это не противная штука, а полезная, где надо и сложная. И считается высшей школой программирования.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2012, 15:11     Удаление нулевой(-ых) строчки и столбца из матрицы
Еще ссылки по теме:

Удаление строки и столбца из матрицы C++
Удаление столбца с наибольшей по модулю суммой элементов из матрицы. Объясните принцип работы C++
C++ Удаление подстрочки из строчки

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
29.07.2012, 15:11     Удаление нулевой(-ых) строчки и столбца из матрицы #16
Цитата Сообщение от no_wearines Посмотреть сообщение
Рекурсия - это не противная штука, а полезная, где надо и сложная. И считается высшей школой программирования.
Не спорю. Тем не менее ее следует избегать. В 95% случаев нерекурсивное решение проблемы работает быстрее, с меньшими затратами памяти и меньшим числом багов чем ее циклический собрат. Да, конечно, многие алгоритмы гораздо проще оформить именно рекурсивно, однако проще не значит лучше.
А высшей школой, как Вы выразились, является поиск наиболее предпочтительного пути решения проблемы и рекурсия тут почти всегда проигрывает.
Yandex
Объявления
29.07.2012, 15:11     Удаление нулевой(-ых) строчки и столбца из матрицы
Ответ Создать тему
Опции темы

Текущее время: 07:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru