Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/37: Рейтинг темы: голосов - 37, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 2
1

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

27.07.2012, 21:11. Показов 7664. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Помогите написать программу, которая проверяла бы матрицу на нулевую строчку и столбец, и, если таковые присутствуют, удаляла бы их.Поясню: из матрицы
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;
}
Строго не судите, первые шаги в изучении языка
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2012, 21:11
Ответы с готовыми решениями:

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

Заданы матрицы А, В, С, D, каждая из которых содержит по три строчки и по три столбца. Перемножить матрицы Р и Q
Заданы матрицы А, В, С, D, каждая из которых содержит по три строчки и по три столбца. Перемножить...

Вывести на экран номер столбца, в котором находится нулевой элемент матрицы
Дана матрица M размером m n´ . Вывести на экран номер столбца, в котором находится нулевой элемент...

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

15
60 / 60 / 8
Регистрация: 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;
    
    // Аналогично - со строками.
    // ...
1
374 / 321 / 32
Регистрация: 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
1
Эксперт С++
4267 / 2241 / 203
Регистрация: 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;
}
2
60 / 60 / 8
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:23 5
Thinker, выпендрился. Заменил цикл рекурсией. Так держать!
0
Thinker
27.07.2012, 22:24
  #6

Не по теме:

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

0
60 / 60 / 8
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:25 7
Цитата Сообщение от Thinker Посмотреть сообщение
для матриц это еще ухитриться надо
Глупостями занимаетесь, батенька...
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.07.2012, 22:28 8
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Глупостями занимаетесь, батенька...

Не по теме:

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

0
56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
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();
}
1
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 2
28.07.2012, 00:44  [ТС] 10
Всем огромнее спасибо за помощь!
0
374 / 321 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
28.07.2012, 16:34 11
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Thinker, выпендрился. Заменил цикл рекурсией. Так держать!
Цитата Сообщение от Thinker Посмотреть сообщение

Не по теме:

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

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

Не по теме:

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

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

Не по теме:

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

0
56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
29.07.2012, 15:04 15
Суть в занятиях программированием - развитие компьютерной логики!!! Рекурсия - это не противная штука, а полезная, где надо и сложная. И считается высшей школой программирования.
0
60 / 60 / 8
Регистрация: 15.10.2010
Сообщений: 356
29.07.2012, 15:11 16
Цитата Сообщение от no_wearines Посмотреть сообщение
Рекурсия - это не противная штука, а полезная, где надо и сложная. И считается высшей школой программирования.
Не спорю. Тем не менее ее следует избегать. В 95% случаев нерекурсивное решение проблемы работает быстрее, с меньшими затратами памяти и меньшим числом багов чем ее циклический собрат. Да, конечно, многие алгоритмы гораздо проще оформить именно рекурсивно, однако проще не значит лучше.
А высшей школой, как Вы выразились, является поиск наиболее предпочтительного пути решения проблемы и рекурсия тут почти всегда проигрывает.
0
29.07.2012, 15:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2012, 15:11
Помогаю со студенческими работами здесь

Удаление столбца из матрицы
Добрый день. Прошу ткнуть носом, где я опять дурак. Есть матрица на основе ArrayList задача простая...

Удаление столбца матрицы
Здравствуйте. Есть матрица N*M, в ней нужно удалить k-ый столбец. Все эти данные вводятся с...

Удаление столбца матрицы
Пожалуйста, помогите решить задачу!!! Тема: &quot;Действия над строками и столбцами матрицы&quot; Задача:...

Удаление строки и столбца из матрицы
Добрый день. у Меня возникла проблема, не могу понять, как удалить из массива строку и столбец с...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru