0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 20
1

Удалить k-й столбец матрицы из одномерного массива

12.05.2016, 17:09. Показов 5796. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья, доброго времени суток! Снова есть задача: Матрица размещена в одномерном массиве по строкам.
Удалить k-й столбец матрицы из одномерного массива. Результат напечатать по строкам.
Как организовать матрицу я разобралась, k-й столбец решила не удалять, а заменить, скажем, символом *. Возникли проблемы с типами данных, посему было решено при нахождении элемента с нужным индексом выводить *, но не знаю, как грамотно внедрить это в программу, дабы выводилось все целостно, а не по частям: "звезздочки", следом "матрица". Наработки прилагаю:
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
#include <iostream> 
#include <cmath> 
#include <string> 
#include <cstdlib> 
#include <ctime> 
#include <iomanip> 
#include <conio.h>
 
using namespace std;
int main()
 
{
    setlocale(0, "");
    int n, k;
    cout << "Введите размерность N матрицы... ";
    cin >> n;
    cout << "Введите столбец для удаления...";
    cin >> k;
 
    double**ary;
    ary = new double *[n];
    for (int i = 0; i < n; i++)
        ary = new double *[n];
 
    for (int i = 0; i < n; i++)
    {
        ary[i] = new double[n];
    }
    srand(time(NULL));
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            ary[i][j] = 1 + rand() % 99;
            cout << setw(3) << ary[i][j];
        }
        cout << endl;
int P; //начало кода с проблемой
cout « "Введите номер столбца для удаления:" « endl; 
 
cin » P; 
 
for (int i = 0; i < n; i++) 
{ 
i = P*i + (P - 1); 
 
} 
cout « "*" « i « endl; 
cout « M[i] « endl;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2016, 17:09
Ответы с готовыми решениями:

Удалить K-й столбец матрицы из одномерного массива
Матрица размещена в одномерном массиве по строкам. Удалить K -й столбец матрицы (K задано) из...

Найти столбец матрицы с наименьшей суммой элементов и записать его в виде одномерного массива
Для произвольного двумерного массива найти столбец с наименьшей суммой элементов и записать его в...

Удалить k-ю строку матрицы из одномерного массива
Матрица расположена в одномерном массиве по строкам. Уда-лить k-ю строку матрицы из одномерного...

Поэлементно вычесть k-й столбец матрицы из всех столбцов, кроме него самого. После чего удалить k-й столбец
Пусть дана действительная матрица размером n*m. Требуется преобразовать матрицу: поэлементно...

11
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
12.05.2016, 18:31 2
Ponpon, написал для вас программу. Смотрите ниже.

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
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
int N, M, p, k, t, x;
cout << "Введите размеры матрицы:" << endl;
cout << "N = ";
cin >> N;
cout << "M = ";
cin >> M;
int **A = new int* [N];
for (int i = 0; i < N; i++)
{
A[i] = new int [M];
}
int *B = new int [N * M];
cout << "Введите матрицу:" << endl;
p = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cin >> A[i][j];
B[p] = A[i][j];
p++;
}
}
cout << "Введите номер удаляемого столбца:" << endl;
cout << "k = ";
cin >> k;
k--;
t = x = 0;
while (t < N)
{
for (int i = k + x; i < p - t; i++)
{
B[i] = B[i+1];
}
t++;
x += M - 1;
}
cout << "Матрица после удаления:" << endl;
k = 0;
for (int i = 0; i < p - t; i++)
{
cout << B[i] << " ";
k++;
if (!(k % (M - 1))) cout << endl;
}
system("pause");
return 0;
}
0
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 20
12.05.2016, 19:00  [ТС] 3
Здравствуйте, большое спасибо за готовую программу, но там сказано, что матрица задано в ОДНОМЕРНОМ массиве, т.е. элементы идут в строку. Вы же делаете двумерный, насколько я понимаю, с помощью указателей.
С помощью указателей и двумерного массива здесь действительно просто, но задание другое. Помогите, пожалуйста, если можете, подправить мою программу. Либо переделать ее.

Добавлено через 51 секунду
Укажите на ошибки, пожалуйста. Может, подход у меня неверный.
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
12.05.2016, 19:06 4
Ponpon, я перевожу матрицу в одномерный массив B и обрабатываю массив. Матрица у вас квадратная или N * M?

Добавлено через 3 минуты
Ponpon, вы просто можете взять мой массив B и программа будет готова. Приведите, пожалуйста, пример на конкретных числах. Ввод и вывод.
0
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 20
12.05.2016, 19:09  [ТС] 5
У меня есть только текст задания, увы. Дана матрица, судя по всему, не квадратная. Не совсем поняла, как у вас осуществляется перевод в одномерный массив. Одномерный массив ведь это, например, a[n]. Двумерный - a [i][j].
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
12.05.2016, 19:15 6
Ponpon, я перевожу матрицу в массив размера N x M. Вам сделать программу для одномерного массива, который затем превращается в матрицу с удаленным столбцом? А саму матрицу до удаления выводить не надо?
0
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 20
12.05.2016, 19:17  [ТС] 7
Думаю, можно не выводить, но для наглядности - желательно. Опять же, имеется только текст..
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
12.05.2016, 19:21 8
Ponpon, я сейчас сделаю для одномерного массива. Но матрица, судя по вашему коду квадратная.
0
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 20
12.05.2016, 19:34  [ТС] 9
Нет, в моем коде не квадратная. Там число строк и столбцов вводится пользователем. Млжно сделать как квадратную, так и не квадратную.
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
12.05.2016, 19:43 10
Ponpon, вот код программы. Размер массива при извлечении корня должен быть целым. Например, такие размеры массива: 4, 9, 16, 25 и т. д. Я не помещаю одномерный массив в матрицу. Просто вывожу по строкам. Или вам нужно разместить одномерный массив в двумерном?

Добавлено через 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
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
int N, k, a, t, x;
cout << "Введите размер массив:" << endl;
cout << "N = ";
cin >> N;
int *B = new int [N];
a = sqrt(N);
cout << "Введите массива:" << endl;
for (int i = 0; i < N; i++)
{
cin >> B[i];
}
cout << "Матрица до удаления:" << endl;
k = 0;
for (int i = 0; i < N; i++)
{
cout << B[i] << " ";
k++;
if (!(k % a)) cout << endl;
}
cout << "Введите номер удаляемого столбца:" << endl;
cout << "k = ";
cin >> k;
k--;
t = x = 0;
while (t < a)
{
for (int i = k + x; i < N - t; i++)
{
B[i] = B[i+1];
}
t++;
x += a - 1;
}
cout << "Матрица после удаления:" << endl;
k = 0;
for (int i = 0; i < N - t; i++)
{
cout << B[i] << " ";
k++;
if (!(k % (a - 1))) cout << endl;
}
system("pause");
return 0;
}
1
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 20
12.05.2016, 20:01  [ТС] 11
К этой задаче, видимо, можно подходить с различных сторон. Я предложила свой вариант и попросила исправить, что не так, ибо не совсем понятно, как сие организовать приемлемо, либо предложить другой подход. Все, что имею - текст задачи. =)

Добавлено через 16 минут
Большое спасибо за помощь! Не могли бы вы откомментировать свои действия?х)
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
12.05.2016, 21:35 12
Ponpon, задачу, правда, можно решать по разному. Судя по вашей программе, вы задаете матрицу и просто хотите удалить заданный столбец. Для этого не обязательно помещать матрицу в массив, а просто удалить столбец матрицы сдвинув сами столбцы (но в задании сказано другое). Вот комментарии к последней программе. Надеюсь, разберетесь.

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
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
int N, k, a, t, x;
cout << "Введите размер массива:" << endl;
cout << "N = ";
cin >> N; //Здесь задаем разменость массива
int *B = new int [N];
a = sqrt(N); //Это размерность нашей матрицы (то есть, корень из N - целое или не получим размеры матрицы)
cout << "Введите массив:" << endl;
for (int i = 0; i < N; i++)
{
cin >> B[i]; //Вводим наш одномерный массив
}
cout << "Матрица до удаления:" << endl;
k = 0;
for (int i = 0; i < N; i++)
{
cout << B[i] << " "; //Выводим наш массив по строкам (длина строки - корень из N)
k++; //Накапливаем k для каждого элемента массива
if (!(k % a)) cout << endl; //Если k кратно длине строки (то есть корню из N) переходим на следуюшую строку 
}                           //Таким образом, получаем матрицу
cout << "Введите номер удаляемого столбца:" << endl;
cout << "k = ";
cin >> k; //Вводим номер удаляемого столбца (по строкам у нас получилась матрица)
k--; //Уменьшаем k на единицу, так как нам нужен индекс элемента массива, а не номер
t = x = 0; //Здесь начинается сдвиг элементов (для удаления) 
while (t < a) //Число сдвигов - это размер нашей матрицы (то есть удаляем и сдвигаем корень из N раз)
{
for (int i = k + x; i < N - t; i++) //Добавляем к позиции удаляемого элемента (это k) число x
{                                   //k + x - это очередная позиция удаляемого элемента
B[i] = B[i+1]; //Сдвигаем элементы для удаления (стандартный метод для удаления элемента из массива, метод сдвига)
}
t++; //Накапливаем число удалений (оно меньше a (корень из N) или числа стобцов нашей матрицы)
x += a - 1; //Это величина на которую мы увеличиваем наше k чтобы удалить очередной элемент массива (столбца) 
}
cout << "Матрица после удаления:" << endl;
k = 0;
for (int i = 0; i < N - t; i++)
{
cout << B[i] << " "; //Вводим наш одномерный массив (матрицу) по строкам, удалив элементы заданного столбца
k++;                 //Выводим по строкам (но k теперь кратно a - 1, так как мы удалили столбец)
if (!(k % (a - 1))) cout << endl; 
}
system("pause");
return 0;
}
Добавлено через 23 минуты
Ponpon, прошу прощения за ошибки в комментариях. Торопился.

Ошибки:

1. В строке 11 - размерность (а не разменость)
2. В строке 45 - Выводим (а не Вводим)

Добавлено через 23 минуты
Ponpon, вот программа для прямоугольной матрицы. Но размер одномерного массива (число элементов) должен быть кратен числам N и M (то есть, N x M. Например, если матрица 3 x 4 или 4 x 3, то 12).

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 <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
int N, M, k, a, t, x, size;
cout << "Введите размеры матрицы:" << endl;
cout << "N = ";
cin >> N;
cout << "M = ";
cin >> M;
int *B = new int [N * M];
size = N * M;
a = size / N;
cout << "Введите массив:" << endl;
for (int i = 0; i < size; i++)
{
cin >> B[i];
}
cout << "Матрица до удаления:" << endl;
k = 0;
for (int i = 0; i < size; i++)
{
cout << B[i] << " ";
k++;
if (!(k % a)) cout << endl;
}
cout << "Введите номер удаляемого столбца:" << endl;
cout << "k = ";
cin >> k;
k--;
t = x = 0;
while (t < size / M)
{
for (int i = k + x; i < size - t; i++)
{
B[i] = B[i+1];
}
t++;
x += a - 1;
}
cout << "Матрица после удаления:" << endl;
k = 0;
for (int i = 0; i < size - t; i++)
{
cout << B[i] << " ";
k++;
if (!(k % (a - 1))) cout << endl;
}
system("pause");
return 0;
}
0
12.05.2016, 21:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2016, 21:35
Помогаю со студенческими работами здесь

Найти столбец массива с наибольшей суммой элементов и записатьегох в виде одномерного массива
1 Для произвольного двумерного массива найти столбец с наибольшей суммой элементов и записать их в...

Преобразование матрицы (удалить из матрицы столбец с наибольшей по модулю суммой элементов)
Всем привет, есть программа для ввода матрицы и вывода на экран. Нужно удалить из матрицы столбец с...

[emu8086] Найти максимальный по модулю элемент матрицы. Удалить строку и столбец матрицы.
Найдите наибольший элемент по модулю в целочисленной квадратной матрице n-го порядка. Получить...

Удалить столбец матрицы, содержащий минимальный элемент матрицы
Дана матрица размера 5х10.Удалить строку1|столбец2, содержащий минимальный3|максимальный4 элемент...


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

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

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