Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Master_C
0 / 0 / 0
Регистрация: 23.01.2015
Сообщений: 13
#1

Удалить все строки и столбцы, на пересечении которых находятся отрицательные элементы - C (СИ)

23.01.2015, 11:23. Просмотров 868. Ответов 11
Метки нет (Все метки)

задача - удалить все строки и столбцы на пересечении которых находятся отрицательные элементы

как ее лучше всего решить? это довольно таки не тривиальная задача...
прошу дать совет ориентируясь на то что это задача 1го курса университета
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2015, 11:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удалить все строки и столбцы, на пересечении которых находятся отрицательные элементы (C (СИ)):

Удалить строки и столбцы матрицы, на пересечении которых лежат нули
Как удалить строки и столбцы, на пересечение которых лежат нули. Не понятно как...

Удалить из матрицы строки и столбцы, последние элементы которых положительны
Доброго времени суток!Помогите пожалуйста написать программу, задание такое: ...

Определить позиции, в которых находятся отрицательные элементы
Задан одномерный массив В, состоящий из n вещественных элементов. Определить...

Определить позиции, в которых находятся отрицательные элементы массива
Здравствуйте. Задан одномерный массив В, состоящем из n вещественных...

Удалить элементы массива значения которых находятся в заданном интервале
Добрый вечер! Пожалуйста, помогите найти ошибку. При А>0 всё работает...

Найти min и max элементы квадратной матрицы и поменять местами строки, в которых находятся эти элементы
Здраствуйте, стыдно просить такую глупость для вас, но сам я не могу...

11
1XPLoade1
30 / 30 / 38
Регистрация: 23.01.2015
Сообщений: 174
23.01.2015, 13:08 #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
57
58
59
#include <stdio.h>
#include <conio.h>
 
#define N 10
 
int main(int argc, char* argv[])
{
    int M[N][N] = { { 2, 8,  5,  6,  4, 9,  3, 8, 5,  1 },
                    { 8, 1,  4,  5,  7, 6,  3, 9, 2,  5 },
                    { 7, 4,  6,  8,  3, 6,  4, 9, 1,  8 },
                    { 6, 4, -3,  1,  5, 6,  8, 9, 7,  4 },
                    { 2, 5,  7,  5,  3, 8,  4, 7, 1,  3 },
                    { 6, 4,  3,  2, -8, 5,  8, 6, 4,  8 },
                    { 9, 1,  8,  7,  4, 6,  3, 2, 5,  9 },
                    { 5, 9,  3,  5,  4, 3,  6, 7, 4, -2 },
                    { 3, 5,  4, -7,  8, 1,  9, 4, 6,  7 },
                    { 6, 4,  3,  9,  8, 2, -6, 4, 3,  2 } };
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            printf("%d ", M[i][j]);
 
        printf("\n");
    }
 
    printf("\n");
 
    int size_i = N, size_j = size_i;
    for (int i = 0; i < size_i; i++)
        for (int j = 0; j < size_j; j++)
            if (M[i][j] < 0)
            {
                int i1 = i, j1 = j;
                for (int n = 0; n < size_i; n++)
                    for (int k = j1; k < size_j; k++)
                        M[n][k] = k < size_j - 1 ? M[n][k + 1] : 0;
 
                size_j--; j--;
 
                for (int k = 0; k < size_j; k++)
                    for (int n = i1; n < size_i; n++)
                         M[n][k] = n < size_i - 1 ? M[n + 1][k] : 0;
 
                size_i--; i--;
            }
 
    for (int i = 0; i < size_i; i++)
    {
        for (int j = 0; j < size_j; j++)
            printf("%d ", M[i][j]);
 
        printf("\n");
    }
 
    _getch();
 
    return 0;
}
0
Master_C
0 / 0 / 0
Регистрация: 23.01.2015
Сообщений: 13
23.01.2015, 14:29  [ТС] #3
1XPLoade1
а ты попробуй на таком наборе данных)
C++
1
2
3
4
5
int M[N][N] = { { 2, 8, 5, 6, 4 },
    { 8, 1, -4, 5, 7 },
    { 7, 4, 6, 8, 3 },
    { 6, 4, -3, 1, 5 },
    { 2, 5, 7, 5, 3 } };
{ 6, 4, -3, 1, 5 } эта строка не удалится
0
1XPLoade1
30 / 30 / 38
Регистрация: 23.01.2015
Сообщений: 174
23.01.2015, 15:00 #4
1XPLoade1
а ты попробуй на таком наборе данных)

Код C++
1
2
3
4
5
int M[N][N] = { { 2, 8, 5, 6, 4 },
{ 8, 1, -4, 5, 7 },
{ 7, 4, 6, 8, 3 },
{ 6, 4, -3, 1, 5 },
{ 2, 5, 7, 5, 3 } };
Объясню почему: все это потому что отрицательный элемент матрицы M[3][2] == -3 находится в столбце, в котором присутствует еще один отрицательный элемент M[1][2] == -4. Поэтому при нахождении элемента M[1][2] удаляется столбец и вместе с ним удаляется и элемент M[3][2] == -3. В результате в строке i == 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <conio.h>
 
#define N 10
 
int main(int argc, char* argv[])
{
     int M[N][N] = { { 2, 8, 5, 6, 4 },
                             { 8, 1, -4, 5, 7 },
                   { 7, 4, 6, 8, 3 },
                   { 6, 4, -3, 1, 5 },
                             { 2, 5, 7, 5, 3 } };
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            printf("%d ", M[i][j]);
 
        printf("\n");
    }
 
    printf("\n");
 
    int size_i = N, size_j = size_i;
    for (int i = 0; i < size_i; i++)
        for (int j = 0; j < size_j; j++)
            if (M[i][j] < 0)
            {
                int i1 = i, j1 = j;
                for (int n = 0; n < size_i; n++)
                    for (int k = j1; k < size_j; k++)
                        M[n][k] = k < size_j - 1 ? M[n][k + 1] : 0;
 
                size_j--; j--;
 
                for (int k = 0; k < size_j; k++)
                    for (int n = i1; n < size_i; n++)
                         M[n][k] = n < size_i - 1 ? M[n + 1][k] : 0;
 
                size_i--; i--;
            }
 
    for (int i = 0; i < size_i; i++)
    {
        for (int j = 0; j < size_j; j++)
            printf("%d ", M[i][j]);
 
        printf("\n");
    }
 
    _getch();
 
    return 0;
}
Вот вывод результата:

2 8 5 6 4 0 0 0 0 0
8 1 -4 5 7 0 0 0 0 0
7 4 6 8 3 0 0 0 0 0
6 4 -3 1 5 0 0 0 0 0
2 5 7 5 3 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

2 8 6 4 0 0 0 0 0
7 4 8 3 0 0 0 0 0
6 4 1 5 0 0 0 0 0
2 5 5 3 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0
Master_C
0 / 0 / 0
Регистрация: 23.01.2015
Сообщений: 13
23.01.2015, 15:10  [ТС] #5
дак я понимаю почему так произошло, а мне то надо чтобы эта строчка тоже удалилась)
0
1XPLoade1
30 / 30 / 38
Регистрация: 23.01.2015
Сообщений: 174
23.01.2015, 15:16 #6
дак я понимаю почему так произошло, а мне то надо чтобы эта строчка тоже удалилась)
А почему она должна удалиться если в условии сказано, что необходимо удалять только те строки в которых есть отрицательное значение. Или, если можно, то поподробнее опишите НОВОЕ условие задачи. Плз.

Добавлено через 3 минуты
Хочу также сказать, что в данной задаче deadlock если удалить столбец то останется строка, а есть удалить строку останется столбец. Уточните критерий удаления, плз. ?!?!
0
Master_C
0 / 0 / 0
Регистрация: 23.01.2015
Сообщений: 13
23.01.2015, 15:32  [ТС] #7
потому что первоначально там стоит отрицательный элемент. должны удалиться 2ая и 4ая строки а потом 3ий столбец)
0
1XPLoade1
30 / 30 / 38
Регистрация: 23.01.2015
Сообщений: 174
23.01.2015, 15:46 #8
потому что первоначально там стоит отрицательный элемент. должны удалиться 2ая и 4ая строки а потом 3ий столбец)
Объясняю еще раз: если мы удалим 2-ю и 4-ю строку, то столбец НЕ будет удален, потому, что в нем не останется отрицательных элементов. это deadlock. Программа работает правильно. Если же удаление строк имеет более высокий приоритет чем удаление столбцов, то так и скажите.

Добавлено через 10 минут
Разве что вот так:
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
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <conio.h>
 
#define N 10
 
int main(int argc, char* argv[])
{
    int M[N][N] = { { 2, 8, 5, 6, 4 },
                    { 8, 1, -4, 5, 7 },
                    { 7, 4, 6, 8, 3 },
                    { 6, 4, -3, 1, 5 },
                    { 2, 5, 7, 5, 3 } };
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            printf("%d ", M[i][j]);
 
        printf("\n");
    }
 
    printf("\n");
 
    int size_i = N, size_j = size_i;
    for (int i = 0; i < size_i; i++)
        for (int j = 0; j < size_j; j++)
        if (M[i][j] < 0)
        {
            int i1 = i, j1 = j;
            for (int k = 0; k < size_j; k++)
                for (int n = i1; n < size_i; n++)
                    M[n][k] = n < size_i - 1 ? M[n + 1][k] : 0;
 
            size_i--; i--;
        }
 
 
    for (int i = 0; i < size_i; i++)
    {
        for (int j = 0; j < size_j; j++)
            printf("%d ", M[i][j]);
 
        printf("\n");
    }
 
    printf("\n");
 
    size_i = N; size_j = size_i;
    for (int i = 0; i < size_i; i++)
        for (int j = 0; j < size_j; j++)
            if (M[i][j] < 0)
            {
                int i1 = i, j1 = j;
                for (int n = 0; n < size_i; n++)
                    for (int k = j1; k < size_j; k++)
                        M[n][k] = k < size_j - 1 ? M[n][k + 1] : 0;
 
                size_j--; j--;
            }
 
    for (int i = 0; i < size_i; i++)
    {
        for (int j = 0; j < size_j; j++)
            printf("%d ", M[i][j]);
 
        printf("\n");
    }
 
    _getch();
 
    return 0;
}
Исходная матрица:

2 8 5 6 4 0 0 0 0 0
8 1 -4 5 7 0 0 0 0 0
7 4 6 8 3 0 0 0 0 0
6 4 -3 1 5 0 0 0 0 0
2 5 7 5 3 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

Результат удаления строк:

2 8 5 6 4 0 0 0 0 0
7 4 6 8 3 0 0 0 0 0
2 5 7 5 3 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

Результат удаление столбцов:

2 8 5 6 4 0 0 0 0 0
7 4 6 8 3 0 0 0 0 0
2 5 7 5 3 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0
Master_C
0 / 0 / 0
Регистрация: 23.01.2015
Сообщений: 13
23.01.2015, 15:49  [ТС] #9
хочешь сказать что невозможно сделать так как я хочу? можно же например пробежаться по всему массиву и запомнить номера строк и столбцов которые надо удалить а уже потом удалять)
0
1XPLoade1
30 / 30 / 38
Регистрация: 23.01.2015
Сообщений: 174
23.01.2015, 15:50 #10
см. ответ выше.

Добавлено через 39 секунд
там я выложил код, который выполняет примерно то что вам нужно.
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
23.01.2015, 15:53 #11
1XPLoade1,
Цитата Сообщение от Master_C Посмотреть сообщение
задача - удалить все строки и столбцы
почему бы не создать два новых массива: 1 - номера строк с отрицательными элементами, 2 - номера столбцов с отрицательными элементами, после чего просто удалить их?
0
1XPLoade1
30 / 30 / 38
Регистрация: 23.01.2015
Сообщений: 174
23.01.2015, 15:54 #12
так работает код который я выложил выше.
0
23.01.2015, 15:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2015, 15:54
Привет! Вот еще темы с решениями:

Переместить в конец массива все элементы, значения которых находятся в отрезке [a,b]
написать программу, которая перемещает в конец массива все элементы, значения...

Поменять местами строки матрицы, в которых находятся максимальный и минимальный элементы
Помогите пожалуйста, дана матрица, все элементы которой различны. Поменять...

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

Удалить все столбцы матрицы, содержащие только положительные элементы
Удалить все столбцы матрицы, содержащие только положитель- ные элементы.


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru