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

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

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

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

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

Помогите удалить столбец матрицы в которой содержится максимальный элемент.
массив динамический. главное не просто не выводить, а именно удалить и указать номер удаленного столбца.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2010, 20:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удалить столбец матрицы(а не просто невыводить) (C++):

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

Удалить столбец из матрицы - C++
Ввести матрицу размером m на n и число k. Удалить k-й столбец из матрицы. Вывести полученную матрицу

Удалить из матрицы строку и столбец - C++
Привет всем ,помогите пожалуйста написать программу : Заранее спасибо всем. Добавлено через 11 часов 45 минут Никто не...

Удалить столбец матрицы с номером K. - C++
Дана матрица размера M × N и целое число K (1 ≤ K ≤ N). Удалить столбец матрицы с номером K.

Удалить строку и столбец матрицы - C++
#include <iostream> using namespace std; void ReadMatr(int **a, int n, int m);//Ввод матрицы с клавиатуры void PrintMatr(int...

Удалить столбец и строку из матрицы - C++
Пытаюсь удалить из матрицы x строку strI и столбец stlbI путем создания "временной матрицы" a, удаления матрицы x, и перезаписывания a в x....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
M128K145
Эксперт С++
8286 / 3505 / 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
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
16.02.2010, 23:23 #4
К сожалению столбцы нельзя, потому как такого для компьютера нету, а вот строка - ближе для него т.к. элементы массива лежат подряд в памяти и можно через memset скопировать нужные участки
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
17.02.2010, 12:20 #5
Незнаю проще будет или нет, но можно использовать перераспределение памяти, копируешь основной массив во временный, удаляешь основной, выделяешь память размером -1 столбец (или больше, если надо), копируешь из временного в основной за исключением не нужного столбца, удаляешь временный. Все.
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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++
4670 / 2496 / 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
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
17.02.2010, 13:59 #8
valeriikozlov, под условие задачи не попадаете

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

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

Цитата Сообщение от kazak Посмотреть сообщение
главное не просто не выводить, а именно удалить
Кстати после выполнения такой операции покажите мне где этот столбец остался?
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
17.02.2010, 14:13 #10
Цитата Сообщение от valeriikozlov Посмотреть сообщение
т.е. m уменьшаем на единицу.
Очень интересный вопрос. А как это сделать?
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
17.02.2010, 14:14 #11
kravam, пишем:
C
1
m--;
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
17.02.2010, 14:15 #12
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Кстати после выполнения такой операции покажите мне где этот столбец остался?
А куда он денется? m то мы уменьшили, но размерность массива не изменилась, "спрятанный столбец" попрежнему доступен.
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
17.02.2010, 14:19 #13
Цитата Сообщение от kazak Посмотреть сообщение
спрятанный столбец" попрежнему доступен.
Вот как раз для приведенного примера он недоступен абсолютно. Вы уже никаким способом не сможете получить значения которые были во втором столбце изначально (2, 7, 12).
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
17.02.2010, 14:23 #14
Как это не смогу, если столбец все еще присутствует в памяти)?
arr[(0..n-1)][m];
valeriikozlov
Эксперт C++
4670 / 2496 / 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;
}
После строки где написано что второй столбец удален, напишите код который покажет чему были равны элементы второго столбца до удаления.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2010, 14:37
Привет! Вот еще темы с ответами:

Удалить столбец матрицы с номером K - C++
Дана матрица размера M × N и целое число K (1 ≤ K ≤ N ). Удалить столбец матрицы с номером K. #include &quot;stdafx.h&quot; #include...

Удалить столбец матрицы с номером K. - C++
Дана матрица размера M × N и целое число K (1 ≤ K ≤ M). Удалить столбец матрицы с номером K.:wall: Добавлено через 21 минуту ...

Удалить k-й столбец матрицы из одномерного массива - C++
Друзья, доброго времени суток! Снова есть задача: Матрица размещена в одномерном массиве по строкам. Удалить k-й столбец матрицы из...

Удалить столбец, содержащий максимальный элемент матрицы - C++
Дана матрица размера M × N. Удалить столбец, содержащий максимальный элемент матрицы


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.02.2010, 14:37
Ответ Создать тему
Опции темы

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