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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.68
ArtSL
8 / 7 / 0
Регистрация: 14.02.2010
Сообщений: 40
#1

Удалить столбец матрицы(а не просто невыводить) - C++

16.02.2010, 20:21. Просмотров 6463. Ответов 28
Метки нет (Все метки)

Помогите удалить столбец матрицы в которой содержится максимальный элемент.
массив динамический. главное не просто не выводить, а именно удалить и указать номер удаленного столбца.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2010, 20:21     Удалить столбец матрицы(а не просто невыводить)
Посмотрите здесь:
C++ Преобразование матрицы (удалить из матрицы столбец с наибольшей по модулю суммой элементов)
Удалить столбец из матрицы C++
Удалить столбец матрицы с номером K C++
Удалить из матрицы строку и столбец C++
C++ Удалить столбец матрицы с номером K.
Удалить столбец и строку из матрицы C++
Удалить строку и столбец матрицы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
16.02.2010, 22:26     Удалить столбец матрицы(а не просто невыводить) #2
ArtSL, что мешает сместится на один столбец влево, и сделать -- количества столбцов?
ArtSL
8 / 7 / 0
Регистрация: 14.02.2010
Сообщений: 40
16.02.2010, 23:09  [ТС]     Удалить столбец матрицы(а не просто невыводить) #3
Цитата Сообщение от M128K145 Посмотреть сообщение
ArtSL, что мешает сместится на один столбец влево, и сделать -- количества столбцов?
задача стоит именно удалить столбец. если из массива А копировать в массив Б все, исключая ненужный столбец, как думаешь это можно назвать удалением? если после копирования массив А стирается, по сути то удаляется=)) если да, то тему можно закрывать, только что доделал:
x-это номер макс-го столбца.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for(j = x; j < x+1; ++j)
    for(i = 0; i < n; ++i)
    {
        a[i][j] = 'b';
    }
 
for (i = 0; i < n; i++)
{t=0;
        for (j = 0; j < n; j++)
        {
            if(a[i][j] != 'b')
            {
                b[i][t]=a[i][j];
                t=t+1;
            }
        }
}
норм работает, альтернатива есть попроще? можно как-нибудь типо delete()a[i][j] (я вкурсе что так нельзя) сделать удаление элементов массива или столбца целиком??
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,465
16.02.2010, 23:23     Удалить столбец матрицы(а не просто невыводить) #4
К сожалению столбцы нельзя, потому как такого для компьютера нету, а вот строка - ближе для него т.к. элементы массива лежат подряд в памяти и можно через memset скопировать нужные участки
kazak
3033 / 2354 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.02.2010, 12:20     Удалить столбец матрицы(а не просто невыводить) #5
Незнаю проще будет или нет, но можно использовать перераспределение памяти, копируешь основной массив во временный, удаляешь основной, выделяешь память размером -1 столбец (или больше, если надо), копируешь из временного в основной за исключением не нужного столбца, удаляешь временный. Все.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,421
17.02.2010, 12:52     Удалить столбец матрицы(а не просто невыводить) #6
НУ, я думаю, все тут понимают, что
int mass [3] [5]= {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 0 }, {11, 12, 13, 14, 15}} ;

есть просто-напросто одномерный (условно, конечно) массив вот такой
1 2 3 4 5 6 7 8 9 0 11 12 13 14 15

НАша задача получить адрес элемента 1
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
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdlib.h> 
int main () {
 int mass [3] [5]= {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 0 }, {11, 12, 13, 14, 15}} ; 
 for (int i= 0; i< 3; i++) {
  for (int j= 0; j< 5; j++) {
   printf ("%d ", mass [i] [j]);
  }
  printf ("\n");
 }
 
 printf ("%x\n", &mass [0] [0]);
 
 int* ukaz= &mass [0] [0];
 for (int i= 0; i< 15; i++) {
  printf ("%d ",*ukaz);
  ukaz++;
 }
 printf ("\n");
 
 
 getchar ();
 return 0;
}
Ну вот, а теперь имеем как бы "строчку" и мы можеи именно удалить из неё один стобюец никуда её не копируя. Для этого надо просто напросто перебором добьраться до первого "ненужного" элемента и сдвинуть все элементы, которые расположены за ним и перед следующим ненужным на оджну единицу влево. Потом на 2 единицы, потом на три и так далее.
то есть мы действительно удалим столбец.

Но возникает вопрос: а как быть с размерностью массива? Ведь она как была [3] [5] так она [3] [5], хотя одного столбца в ней не будет. ТО есть тут замучаешься корректно выводить значения.

То есть проще сделать, как было предложено. Копируем массив в другое место, удаляя ненужный столбец вот и всё.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
17.02.2010, 13:51     Удалить столбец матрицы(а не просто невыводить) #7
ArtSL, Вы наверное не до конца поняли о чем писал M128K145.
Я Вам на примере массива kravam объясню.
Итак имеем массив:
1 2 3 4 5
6 7 8 9 0
11 12 13 14 15
размерность у него 3*5 (n=3, m=5)
Например нужно удалить второй столбец (у которого элементы - 2, 7, 12). Для этого выполняем
Цитата Сообщение от M128K145 Посмотреть сообщение
сместится на один столбец влево,
и в итоге получаем:
1 3 4 5 5
6 8 9 0 0
11 13 14 15 15
После этого выполняем:
Цитата Сообщение от M128K145 Посмотреть сообщение
и сделать -- количества столбцов
т.е. m уменьшаем на единицу. В итоге получаем n*m = 3*4. Лишний столбец остался за границей массива, он нам не мешает.
kazak
3033 / 2354 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.02.2010, 13:59     Удалить столбец матрицы(а не просто невыводить) #8
valeriikozlov, под условие задачи не попадаете

Цитата Сообщение от ArtSL Посмотреть сообщение
массив динамический

Цитата Сообщение от ArtSL Посмотреть сообщение
главное не просто не выводить, а именно удалить
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
17.02.2010, 14:04     Удалить столбец матрицы(а не просто невыводить) #9
kazak, А при чем здесь
Цитата Сообщение от kazak Посмотреть сообщение
массив динамический
?
Для такого массива тоже можно описанную операцию проводить.

Цитата Сообщение от kazak Посмотреть сообщение
главное не просто не выводить, а именно удалить
Кстати после выполнения такой операции покажите мне где этот столбец остался?
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,421
17.02.2010, 14:13     Удалить столбец матрицы(а не просто невыводить) #10
Цитата Сообщение от valeriikozlov Посмотреть сообщение
т.е. m уменьшаем на единицу.
Очень интересный вопрос. А как это сделать?
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
17.02.2010, 14:14     Удалить столбец матрицы(а не просто невыводить) #11
kravam, пишем:
C
1
m--;
kazak
3033 / 2354 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.02.2010, 14:15     Удалить столбец матрицы(а не просто невыводить) #12
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Кстати после выполнения такой операции покажите мне где этот столбец остался?
А куда он денется? m то мы уменьшили, но размерность массива не изменилась, "спрятанный столбец" попрежнему доступен.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
17.02.2010, 14:19     Удалить столбец матрицы(а не просто невыводить) #13
Цитата Сообщение от kazak Посмотреть сообщение
спрятанный столбец" попрежнему доступен.
Вот как раз для приведенного примера он недоступен абсолютно. Вы уже никаким способом не сможете получить значения которые были во втором столбце изначально (2, 7, 12).
kazak
3033 / 2354 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.02.2010, 14:23     Удалить столбец матрицы(а не просто невыводить) #14
Как это не смогу, если столбец все еще присутствует в памяти)?
arr[(0..n-1)][m];
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
17.02.2010, 14:37     Удалить столбец матрицы(а не просто невыводить) #15
Как тяжело.
kazak,
Вот код:
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
#include<iostream>
using namespace std;
 
int main()
{
    int n=3, m=5, ** mas, i, j;
    mas = new int*[n];
    for(i=0; i<n; i++)
        mas[i]=new int[m];
    for(i=0; i<n; i++)
        for(j=0; j<m; j++)
        {
            cout<<"mas["<<i<<"]["<<j<<"]= ";
            cin>>mas[i][j];
        }
    cout<<"Nachalni massiv:"<<endl;
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
            cout<<mas[i][j]<<"  ";
        cout<<endl;
    }
    // удаляем второй столбец
    for(j=1; j<m-1; j++)
        for(i=0; i<n; i++)
            mas[i][j]=mas[i][j+1];
    m--;
    // вот здесь второй столбец массива удален.
    cout<<"Poluchenni massiv:"<<endl;
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
            cout<<mas[i][j]<<"  ";
        cout<<endl;
    }    
    system("PAUSE");
    return 0;
}
После строки где написано что второй столбец удален, напишите код который покажет чему были равны элементы второго столбца до удаления.
kazak
3033 / 2354 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.02.2010, 14:45     Удалить столбец матрицы(а не просто невыводить) #16
C++
1
2
for(i=0; i<n; i++)
   cout<< mas[i][m] << "  " ;
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,421
17.02.2010, 14:46     Удалить столбец матрицы(а не просто невыводить) #17
Ну так-то да, я упустил из вида что массив динамический. ТОгда действительно, размерность легко изменяется.
kazak, я поинтеерсуюсь осторожно- не имеешь ли ты ввиду, что ячейки памяти, по которым были записаны значения удалённого столбца никуда не делись? Если ты про это- тогда да, ячейки это действительно никуда не делись и не денутся.
kazak
3033 / 2354 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.02.2010, 14:48     Удалить столбец матрицы(а не просто невыводить) #18
Цитата Сообщение от kravam Посмотреть сообщение
не имеешь ли ты ввиду, что ячейки памяти, по которым были записаны значения удалённого столбца никуда не делись?
Именно.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
17.02.2010, 14:55     Удалить столбец матрицы(а не просто невыводить) #19
Цитата Сообщение от kazak Посмотреть сообщение
Код C++
1
2
for(i=0; i<n; i++)
cout<< mas[i][m] << " "
Так выведутся значения последнего столбца, но никак не удаленного второго.

Добавлено через 2 минуты
Цитата Сообщение от kazak Посмотреть сообщение
не имеешь ли ты ввиду, что ячейки памяти, по которым были записаны значения удалённого столбца никуда не делись?
Ячейки памяти (именно сами ячейки памяти, а не значения, которые были в них записаны), можно удалять только физическим путем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2010, 15:01     Удалить столбец матрицы(а не просто невыводить)
Еще ссылки по теме:
C++ Удалить столбец матрицы с номером K.
C++ Удалить k-й столбец матрицы из одномерного массива
Удалить заданную строку и столбец матрицы со сдвигом C++
C++ Удалить столбец, содержащий максимальный элемент матрицы
Удалить строку и столбец целочисленной квадратной матрицы C++

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

Или воспользуйтесь поиском по форуму:
kazak
3033 / 2354 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.02.2010, 15:01     Удалить столбец матрицы(а не просто невыводить) #20
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Так выведутся значения последнего столбца, но никак не удаленного второго.
Да, точно. Но размер массива останется тот же.
Yandex
Объявления
17.02.2010, 15:01     Удалить столбец матрицы(а не просто невыводить)
Ответ Создать тему
Опции темы

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