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

Многомерные динамические массивы

31.07.2019, 20:45. Показов 2581. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать программу, которая удаляет из двухмерного массива, заполненного случайными целыми числами, все строки и столбцы, на пересечении которых стоят нулевые элементы.

Делаю но не могу понять как правильно можете помочь?

Вот набросок
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
#include <iostream>
#include <ctime>
using namespace std;
 
void findzero(int** ptr, const int M, const int N)
{
    for (long i = 0; i != M; i++)
    {
        for (long j = 0; j != N; j++) 
        {
            if (ptr[i][j] == 0)
            {
            
            }
            
        }
    }
}
 
int main() {
    srand(time(NULL));
 
    int** ptr = NULL;
    const int M = 10, N = 10;
    ptr = new int* [M];
    for (long i = 0; i != M; i++)
        ptr[i] = new int[N];
    for (long i = 0; i != M; i++){
        for (long j = 0; j != N; j++) {
            ptr[i][j] = rand() % 10;
            cout << ptr[i][j]<< " ";
        }
    cout << endl;}
 
    findzero(ptr, M, N);
 
    delete[] ptr;
    ptr = NULL;
 
    system("pause");
    return 0;
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.07.2019, 20:45
Ответы с готовыми решениями:

Многомерные динамические массивы
Написать программу, которая дает пользователю ввести 5 фамилий студентов, а затем сортирует их по возрастанию длины фамилии.

Помогите с задачками по Многомерные динамические массивы
Здравствуйте все. Мне на универ надо две задачки по Си вот эти 1. Написать программу, которая осуществляет добавление строки или...

Многомерные массивы, как перебирать внутренние массивы
Здравствуйте. Такой учебный код и плохо понимаю как перебираются внутренние массивы, может кто пояснит подоходчивее. Именно внутренний...

15
Заблокирован
31.07.2019, 20:53
Цитата Сообщение от Nuril Посмотреть сообщение
void findzero(int** ptr, const int M, const int N)
почему const ? придется M-- и N--
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
31.07.2019, 21:24
Цитата Сообщение от Pvt Посмотреть сообщение
почему const ? придется M-- и N--
Потому что Nuril в findzero() хочет и искать, и удалять строки-столбцы. Что, правда, противоречит интуитивному восприятию названия функции

Nuril, я бы вам посоветовал разделить задачу на две части: (1) поиск координат нулевых элементов и (2) удаление строки и столбца по указанным координатам.

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

Более интересная реализация: сначала найти все координаты нулевых элементов, а затем в исходной матрице удалить все найденные строки-столбцы с нулевыми элементами. Вроде поэффективней будет.

Добавлено через 2 минуты
И да, Nuril, вы неправильно удаляете двумерный массив.
И не выводите на консоль результирующую матрицу, поэтому оценить работу по прореживанию будет сложно
0
3 / 3 / 0
Регистрация: 07.11.2018
Сообщений: 119
31.07.2019, 21:31  [ТС]
Цитата Сообщение от L0M Посмотреть сообщение
Примитивная реализация: первая функция ищет нулевой элемент и при нахождении такового вызывает вторую функцию, которая удаляет строки-столбцы, изменяя матрицу и изменяя размерность матрицы (это надо учитывать при сканировании матрицы).
Я приблизительно так и делал но я не могу понять как при удалении не задеть другие нули в данных рядах.
Цитата Сообщение от L0M Посмотреть сообщение
И не выводите на консоль результирующую матрицу, поэтому оценить работу по прореживанию будет сложно
Это только макет
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
31.07.2019, 21:50
Лучший ответ Сообщение было отмечено Nuril как решение

Решение

Цитата Сообщение от Nuril Посмотреть сообщение
Я приблизительно так и делал но я не могу понять как при удалении не задеть другие нули в данных рядах.
Сканируем матрицу построчно слева направо и сверху вниз (в естественном порядке индексов).
При нахождении нулевого элемента: если ниже (по столбцу) имеется другой нулевой элемент, то столбец не удалять; если правее (по строке) имеется другой нулевой элемент, то строку не удалять.
Т.е. строку удаляет самый правый нуль, а столбец - самый нижний.
Вроде так.
1
3 / 3 / 0
Регистрация: 07.11.2018
Сообщений: 119
31.07.2019, 21:54  [ТС]
Цитата Сообщение от L0M Посмотреть сообщение
Т.е. строку удаляет самый правый нуль, а столбец - самый нижний.
А понял спасибо.
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
01.08.2019, 05:00
Nuril, я немножко прикинул... Получилось, что "более интересная реализация", похоже, не только эффективнее, но и явно попроще, чем "примитивная".

В "примитивной реализации" будет геморрой с циклами по матрице из-за постоянно меняющихся размеров матрицы при удалении строк или столбцов. И циклов как-то многовато получается.

А в "более интересной" в самом худшем случае всё укладывается в два двойных цикла по матрице, если координаты нулей хранить в std::set. Так что подумайте в этом направлении.
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,360
01.08.2019, 10:01
удалять из статического массива - ну, такое
1
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
01.08.2019, 11:59
Может не эффективно и не элегантно, но...
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <locale>
#include <vector>
 
using namespace std;
 
void PrintArray(int ** arr, const unsigned int& n, const unsigned int& m)
{
    if (arr == NULL) return;
    for (unsigned int i = 0; i < n; ++i)
    {
        for (unsigned int j = 0; j < m; ++j)
            cout << arr[i][j] << " ";
        cout << endl;
    }
    cout << endl;
}
 
void TransformArray(int ** arr, unsigned int&n, unsigned int& m)
{
    vector<bool> x(n,true);
    vector<bool> y(m,true);
    
    unsigned int nchange = 0, mchange = 0;
    for (unsigned int i = 0; i < n; ++i)
    {
        for (unsigned int j = 0; j < m; ++j)
        {
            if (arr[i][j] == 0)
            {
                if (x[i])
                {
                    nchange++;
                    x[i] = false;
                }
                if (y[j])
                {
                    mchange++;
                    y[j] = false;
                }
            }
        }
    }
    // строим новый массив
    int** NewArray = new int*[n - nchange];
    for (unsigned int i = 0; i < n - nchange; ++i)
    {
        NewArray[i] = new int[m - mchange];
    }
    int ii = 0;
    for (unsigned int i = 0; i < n; ++i)
    {
        if (x[i])
        {
            int jj = 0;
            for (unsigned int j = 0; j < m; ++j)
            {
                if (y[j])
                {
                    NewArray[ii][jj] = arr[i][j];
                    ++jj;
                }
            }
            ++ii;
        }
    }
    n -= nchange;
    m -= mchange;
    // копируем новый массив поверх старого
    for (unsigned int i = 0; i < n; ++i)
        for (unsigned int j = 0; j < m; ++j)
            arr[i][j] = NewArray[i][j];
 
    delete[] NewArray;
}
 
int main()
{
    setlocale(LC_ALL, "ru-RU");
    srand(time(NULL));
    // Создаем и заполняем начальный массив;
    int** Array = NULL;
    unsigned int M = 0, N = 0;
    cout << "Введите размерность массива N M :";
    cin >> N >> M;
    cout << endl;
 
    Array = new int*[N];
    for (unsigned int i = 0; i < N; ++i)
        Array[i] = new int[M];
    // заполняем массив
    for (unsigned int i = 0; i < N; ++i)
        for (unsigned int j = 0; j < M; ++j)
        {
            Array[i][j] = rand() % 10;
        }
    PrintArray(Array, N, M);
    TransformArray(Array, N, M);
    PrintArray(Array, N, M);
    delete[] Array;
    system("Pause");
    return 0;
}
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
01.08.2019, 12:52
galeks1, у вас как раз вариация на тему "найти всё и убрать сразу". Только NewArray здесь лишний. Всё можно сделать на одном массиве.

Кстати, вы тоже удаляете двухмерные динамические массивы неправильно (и Array, и NewArray). Посмотрите как вы их создаёте.
0
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
01.08.2019, 15:13
Цитата Сообщение от L0M Посмотреть сообщение
Кстати, вы тоже удаляете двухмерные динамические массивы неправильно (и Array, и NewArray). Посмотрите как вы их создаёте.
на счет удаления таким способом черт попутал.
Обычно удаляю тоже в цикле.

Добавлено через 1 минуту
отладчик не ругался на утечки и подумал может компилятор сам определил что нужно удалить все N массивов

Добавлено через 1 час 25 минут
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
#include <locale>
#include <vector>
 
using namespace std;
 
void PrintArray(int ** arr, const unsigned int& n, const unsigned int& m)
{
    if (arr == NULL) return;
    for (unsigned int i = 0; i < n; ++i)
    {
        for (unsigned int j = 0; j < m; ++j)
            cout << arr[i][j] << " ";
        cout << endl;
    }
    cout << endl;
}
 
void TransformArray(int ** arr, unsigned int&n, unsigned int& m)
{
    vector<bool> x(n,true);
    vector<bool> y(m,true);
    
    unsigned int nchange = 0, mchange = 0;
    for (unsigned int i = 0; i < n; ++i)
    {
        for (unsigned int j = 0; j < m; ++j)
        {
            if (arr[i][j] == 0)
            {
                if (x[i])
                {
                    nchange++;
                    x[i] = false;
                }
                if (y[j])
                {
                    mchange++;
                    y[j] = false;
                }
            }
        }
    }
    // строим новый массив
    int** NewArray = new int*[n - nchange];
    for (unsigned int i = 0; i < n - nchange; ++i)
    {
        NewArray[i] = new int[m - mchange];
    }
    int ii = 0;
    for (unsigned int i = 0; i < n; ++i)
    {
        if (x[i])
        {
            int jj = 0;
            for (unsigned int j = 0; j < m; ++j)
            {
                if (y[j])
                {
                    NewArray[ii][jj] = arr[i][j];
                    ++jj;
                }
            }
            ++ii;
        }
    }
    n -= nchange;
    m -= mchange;
    // копируем новый массив поверх старого
    for (unsigned int i = 0; i < n; ++i)
        for (unsigned int j = 0; j < m; ++j)
            arr[i][j] = NewArray[i][j];
 
    for (unsigned int i = 0; i < n; ++i)
    {
        delete[] NewArray[i];
    }
    delete[] NewArray;
}
 
int main()
{
    setlocale(LC_ALL, "ru-RU");
    srand(time(NULL));
    // Создаем и заполняем начальный массив;
    int** Array = NULL;
    unsigned int M = 0, N = 0;
    cout << "Введите размерность массива N M :";
    cin >> N >> M;
    cout << endl;
 
    Array = new int*[N];
    for (unsigned int i = 0; i < N; ++i)
        Array[i] = new int[M];
    // заполняем массив
    for (unsigned int i = 0; i < N; ++i)
        for (unsigned int j = 0; j < M; ++j)
        {
            Array[i][j] = rand() % 10;
        }
    PrintArray(Array, N, M);
    TransformArray(Array, N, M);
    PrintArray(Array, N, M);
    for (unsigned int i = 0; i < N; ++i)
    {
        delete[] Array[i];
    }
    delete[] Array;
    system("Pause");
    return 0;
}
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
01.08.2019, 15:28
Nuril, привет!
Реализация кода на идею L0M. Ты это имел в виду?

Кликните здесь для просмотра всего текста

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
73
74
75
76
77
78
79
#include <iostream>
#include <string>
#include <windows.h>
#include <random>
#include <set>
#include <algorithm>
#include <iomanip>
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    std::random_device rd;
    std::mt19937 g{ rd() };
    std::uniform_int_distribution<> dist(0, 10);
    auto gen = [&g, &dist]() { return dist(g); };
    
    std::cout << "Введите размеры массива ";
    size_t n, m;
    std::cin >> n >> m;
 
    std::set<size_t> del_columns;
    std::set<size_t> del_rows;
 
    int** arr = new int*[n];
    std::cout << "Исходное содержание массива\n";
    for (size_t row = 0u; row < n; ++row)
    {
        int* line = new int[m];
        arr[row] = line;
        for (size_t column = 0u; column < m; ++column)
        {
            std::cout << std::setw(3u) << (arr[row][column] = gen()) << " ";
            if (!arr[row][column])
            {
                del_columns.insert(column);
                del_rows.insert(row);
            }
        }
        std::cout << "\n";
    }
    std::cout << "\n";
 
    int** arr2 = new int* [n - del_rows.size()];
    std::cout << "Содержание обработанного массива\n";
    size_t row_arr2 = 0u;
    for (size_t row_arr = 0u; row_arr < n; ++row_arr)
    {
        if (!del_rows.count(row_arr))
        {
            int* line = new int[m - del_columns.size()];
            arr2[row_arr2] = line;
            size_t column_arr2 = 0u;
            for (size_t column_arr = 0u; column_arr < m; ++column_arr)
            {
                if (!del_columns.count(column_arr))
                {
                    std::cout << std::setw(3u) << (arr2[row_arr2][column_arr2] = arr[row_arr][column_arr]) << " ";
                    ++column_arr2;
                }
            }
            std::cout << "\n";
            ++row_arr2;
        }
    }
 
    for (size_t row = 0u; row < n; ++row)
    {
        delete[] arr[row];
    }
    delete[] arr;
    for (size_t row = 0u; row < n - del_rows.size(); ++row)
    {
        delete[] arr2[row];
    }
    delete[] arr2;
 
    return 0;
}
Миниатюры
Многомерные динамические массивы  
0
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
01.08.2019, 15:47
Цитата Сообщение от L0M Посмотреть сообщение
Только NewArray здесь лишний. Всё можно сделать на одном массиве.
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <locale>
#include <vector>
 
using namespace std;
 
void PrintArray(int ** arr, const unsigned int& n, const unsigned int& m)
{
    if (arr == NULL) return;
    for (unsigned int i = 0; i < n; ++i)
    {
        for (unsigned int j = 0; j < m; ++j)
            cout << arr[i][j] << " ";
        cout << endl;
    }
    cout << endl;
}
 
void TransformArray(int ** arr, unsigned int&n, unsigned int& m)
{
    vector<bool> x(n,true);
    vector<bool> y(m,true);
    
    unsigned int nchange = 0, mchange = 0;
    for (unsigned int i = 0; i < n; ++i)
    {
        for (unsigned int j = 0; j < m; ++j)
        {
            if (arr[i][j] == 0)
            {
                if (x[i])
                {
                    nchange++;
                    x[i] = false;
                }
                if (y[j])
                {
                    mchange++;
                    y[j] = false;
                }
            }
        }
    }
    int ii = 0;
    for (unsigned int i = 0; i < n; ++i)
    {
        if (x[i])
        {
            int jj = 0;
            for (unsigned int j = 0; j < m; ++j)
            {
                if (y[j])
                {
                    arr[ii][jj] = arr[i][j];
                    ++jj;
                }
            }
            ++ii;
        }
    }
    n -= nchange;
    m -= mchange;
}
 
int main()
{
    setlocale(LC_ALL, "ru-RU");
    srand(time(NULL));
    // Создаем и заполняем начальный массив;
    int** Array = NULL;
    unsigned int M = 0, N = 0;
    cout << "Введите размерность массива N M :";
    cin >> N >> M;
    cout << endl;
 
    Array = new int*[N];
    for (unsigned int i = 0; i < N; ++i)
        Array[i] = new int[M];
    // заполняем массив
    for (unsigned int i = 0; i < N; ++i)
        for (unsigned int j = 0; j < M; ++j)
        {
            Array[i][j] = rand() % 10;
        }
    PrintArray(Array, N, M);
    TransformArray(Array, N, M);
    PrintArray(Array, N, M);
    for (unsigned int i = 0; i < N; ++i)
    {
        delete[] Array[i];
    }
    delete[] Array;
    system("Pause");
    return 0;
}
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
01.08.2019, 15:48
Подредактировал код.

Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <random>
#include <set>
#include <iomanip>
 
int main()
{
    setlocale(LC_ALL, "Rus");
    std::random_device rd;
    std::mt19937 g{ rd() };
    std::uniform_int_distribution<> dist(0, 10);
    auto gen = [&g, &dist]() { return dist(g); };
    std::set<size_t> del_columns, del_rows;
    
    std::cout << "Введите размеры массива ";
    size_t n, m;
    std::cin >> n >> m;
 
    std::cout << "Исходное содержание массива\n";
    int** arr = new int*[n];
    for (size_t row = 0u; row < n; ++row)
    {
        arr[row] = new int[m];
        for (size_t column = 0u; column < m; ++column)
        {
            std::cout << std::setw(3u) << (arr[row][column] = gen()) << " ";
            if (!arr[row][column])
            {
                del_columns.insert(column);
                del_rows.insert(row);
            }
        }
        std::cout << "\n";
    }
    std::cout << "\n";
 
    std::cout << "Содержание обработанного массива\n";
    int** arr2 = new int* [n - del_rows.size()];
    size_t row_arr2 = 0u;
    for (size_t row_arr = 0u; row_arr < n; ++row_arr)
        if (!del_rows.count(row_arr))
        {
            arr2[row_arr2] = new int[m - del_columns.size()];
            size_t column_arr2 = 0u;
            for (size_t column_arr = 0u; column_arr < m; ++column_arr)
                if (!del_columns.count(column_arr))
                    std::cout << std::setw(3u) << (arr2[row_arr2][column_arr2++] = arr[row_arr][column_arr]) << " ";
            std::cout << "\n";
            ++row_arr2;
        }
 
    for (size_t row = 0u; row < n; ++row)
        delete[] arr[row];
    delete[] arr;
    for (size_t row = 0u; row < n - del_rows.size(); ++row)
        delete[] arr2[row];
    delete[] arr2;
 
    return 0;
}
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
02.08.2019, 03:00
SomniPhobia, да, что-то типа такого, но на одном массиве. Посмотрите чуть выше у galeks1 сделано на одном.

Вообще данная задача, если её делать с двумя массивами - тривиальна. С одним массивом - уже надо шевелить мозгами. А если строго без дополнительных затрат памяти, то надо сильно потрахаться. Вот кстати это в этом комменте - как раз без дополнительной памяти: только стековые переменные.
0
3 / 3 / 0
Регистрация: 07.11.2018
Сообщений: 119
08.08.2019, 08:08  [ТС]
Я делал задание без векторов и получилось достаточно много ошибок можете подсказать как их исправить?

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <iostream>
#include <ctime>
using namespace std;
 
int dellzeroline(int** ptr, int* M, int* N, int x, int y)
{
    bool z = false;
    int** matrix;
    for (long j = y + 1; j < *N; j++)
    {
        if (ptr[x][j] == 0)
        {
            z = true;
        }
    }
    if (z == false)
    {
        *M -= 1;
        matrix = new int* [*M];
        for (long i = 0; i != *M; i++) {
            matrix[i] = new int[*N];
        }
        cout << endl;
        for (long i = 0; i < x; i++) {
            for (long j = 0; j < *N; j++) {
                matrix[i][j] = ptr[i][j];
                cout << matrix[i][j] << " ";
            }
            cout << endl;
        }
 
        for (long i = x + 1; i < *M + 1; i++) {
            for (long j = 0; j < *N; j++) {
                matrix[i - 1][j] = ptr[i][j];
                cout << matrix[i-1][j] << " ";
            }
                cout << endl;
        }
        for (unsigned int i = 0; i < *M; ++i)
            for (unsigned int j = 0; j < *N; ++j)
                ptr[i][j] = matrix[i][j];
        delete[] matrix;
    }
    return z;
}
 
int dellzerorow(int** ptr, int* M, int* N, int x, int y)
{
    bool z = false;
    int** matrix;
    for (long j = x+1; j < *M; j++)
    {
        if (ptr[j][y] == 0)
        {
            z = true;
        }
    }
    if (z == false)
    {
        *N -= 1;
        matrix = new int* [*M];
        for (long i = 0; i != *M; i++) {
            matrix[i] = new int[*N];
        }
        cout << endl;
 
        for (long i = 0; i < y; i++) {
            for (long j = 0; j < *M; j++) {
                matrix[j][i] = ptr[j][i];
                cout << matrix[j][i] << " ";
            }
            cout << endl;
        }
 
        for (long i = y + 1; i < *N+1; i++) {
            for (long j = 0; j < *M; j++) {
                matrix[j][i-1] = ptr[j][i];
                cout << matrix[j][i-1] << " ";
            }
            cout << endl;
        }
        for (unsigned int i = 0; i < *M; ++i)
            for (unsigned int j = 0; j < *N; ++j)
                ptr[i][j] = matrix[i][j];
        delete[] matrix;
    }
    return z;
}
 
void findzero(int** ptr, int* M, int* N)
{
    for (long i = 0; i < *M; i++)
    {
        for (long j = 0; j < *N; j++)
        {
            if (ptr[i][j] == 0)
            {
                if (!dellzeroline(ptr, M, N, i, j)&& i != 0||j == *N-1)
                {
                    --i;
                }
                if (!dellzerorow(ptr, M, N, i, j) && i != 0)
                {
                    --j;
                }
            }
 
        }
    }
}
 
int main() {
    srand(time(NULL));
    srand(24);
 
    int** ptr = NULL;
    int m = 5, n = 5;
    int *M = &m;
    int *N=&n;
    ptr = new int* [*M];
    for (long i = 0; i != *M; i++)
        ptr[i] = new int[*N];
    for (long i = 0; i != *M; i++) {
        for (long j = 0; j != *N; j++) {
            ptr[i][j] = rand() % 5;
            cout << ptr[i][j] << " ";
        }
        cout << endl;
    }
    findzero(ptr, M, N);
    cout << endl;
    for (long i = 0; i < *M; i++) {
        for (long j = 0; j < *N; j++) {
            cout << ptr[i][j] << " ";
        }
        cout << endl;
    }
    delete[] ptr;
    ptr = NULL;
 
 
 
 
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.08.2019, 08:08
Помогаю со студенческими работами здесь

Многомерные массивы
#include &lt;iostream&gt; #include &lt;random&gt; using namespace std; //тип_данных название(параметры) {} //void - неопределенный тип...

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

Многомерные массивы (матрицы)
Не могу понять как написать код. Если не сложно напишите подробнее цикл. Вот начало. srand(time(NULL)); const int SIZE =...

Многомерные массивы. Матрица.
Всем привет. Прошу помочь с заданием по программированию, не до конца понимаю кое-что… Задание: Дана матрица целых чисел N x M....

Задача на Многомерные Массивы
Фирма имеет 5 магазинов. Информация о доходе каждого магазина за каждый месяц хранится в двухмерном массиве (первого магазина – в первой...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru