С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
#1

Конструктор копирования матриц, и заполнение лишнего нулями - C++

29.10.2012, 11:53. Просмотров 1617. Ответов 13
Метки нет (Все метки)

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

Воооот... Собственно, с последним пунтиком проблема. Копирования происходит,но про нули - неизвестно. Выводит он матрицу ровно той же разномерности, что и копируемая.

Код, относящийся к задаче:
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
class Matrix
{
private:int m,n; //Размерность матрицы (закрытый парамер)
public: int **M; //Двумерный массив.
public: Matrix() //Заполнение массива NULLом.
        {
            m=0;
            n=0;
            M=NULL;
        }
 
public: Matrix(int a,int b)
        {m=a;
        n=b;
        Count++;
            M=new int *[m]; //m строк в массиве
            for (int i=0; i<m; i++)
                M[i]=new int [n];//n столбцов.
            for (int i=0; i<m; i++)
            {
                for (int j=0; j<n; j++)
                {
                    M[i][j]=0;
                }
            }
        }
 public: Matrix (const Matrix &Q)
        {
            for (int i=0; i<Q.m; i++)
            {for (int j=0; j<Q.n; j++) M[i][j]=Q.M[i][j];}
        }
public: void PrintM()//Вывод матрицы.
        {
        for (int i=0; i<m; i++)
            {
                for (int j=0; j<n; j++)
                {
                    cout<<M[i][j]<<' ';
                }
                cout<<endl;
        }
            }
 
};
 
int main()
{ int a,b,a1,b1;
cout<<"Input A and B: ";
    cin>>a>>b;
    Matrix Q(a,b);
    Q.RandomGenerete(a);
    cout<<"First matrix:"<<endl;
   Q.PrintM();
    cout<<"Please input A1 and B1: ";
     cin>>a1>>b1;
     Matrix M(a1,b1);
     M.PrintM();
     cout<<endl<<endl;
    M=Q;
     M.PrintM();
    }
В цикле копирования используются значения матрицы Q (копируемой). Но ведь когда мы отправляем М на вывод, размерность же берется матрицы М, а не Q, как получается на практике.
Скажите, людь добрыя, чего-йт не так?

Добавлено через 16 часов 10 минут
Люди, подскажите пожалуйста!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2012, 11:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор копирования матриц, и заполнение лишнего нулями (C++):

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;math.h&gt; #include &lt;algorithm&gt; using...

Конструктор инициализации, конструктор копирования, деструктор - C++
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

Конструктор копирования - C++
Здравствуйте! Есть класс А с конструктором копирования и класс B, который содержит вектор указателей на А. Class A { ...

Конструктор копирования - C++
Помогите доделать задание. Создать иерархию классов транспорт – воздушный транспорт – вертолет. Определить конструктор копирования,...

13
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
29.10.2012, 12:37 #2
Тебе нужно рассмотреть три варианта:
1. Матрица копируется в точно такую же матрицу (ну, это самое простое).
2. Матрица копируется в матрицу большего размера. Тогда по условию недостающие элементы заполняются нулями.
3. Матрица копируется в матрицу меньшего размера - а вот что тут делать? Просто тупо отбрасывать лишние элементы? В задаче ничего об этом не сказано.
0
denys_l
52 / 52 / 4
Регистрация: 26.09.2011
Сообщений: 186
29.10.2012, 12:47 #3
не стоит писать спецификаторы доступа перед каждым данным-членом, конструктором, методами и прочими... достаточно одного раза. Это очень мозолит глаза.
Здравствуйте. Нужно создать конструктор, который копировал бы одну матрицу в другую. При нехватке размерности - заполнить остаток нулями.

Для этого не предназначен конструктор копий. Используй перегрузку оператора присваивания
Потом... В твоем случае в конструкторе копий следует выделять память под новый объект. Я сомневаюсь, что он тебя рабочий...
Попробуй такой... я его не прогонял, правда
C++
1
2
3
4
5
6
7
8
9
10
11
Matrix::Matrix( const Matrix&Q) {
    M= new int* [ Q.m];
    for ( int i = 0; i < Q.m; i++ ) {
        M[ i ] = new int [ Q.n];
        for ( int j = 0; j < Q.n; j++) {
            M[ i ] [ j ] = *Q(i,j);
        }
    }
    m= Q.m;
    n= Q.n;
}
Добавь пока методы получения кол-ва столбцоы и строк
1
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 12:49  [ТС] #4
CheshireCat, 1. Копирует, окей. С этим норм.
2. С этим проблема - оставшиеся элементы игнорируются компилятором при выводе. А это не есть гуд, это проблема, которую я не могу решить.
3. Не заморачиваемся, тут это неважно. Я бы просто вывел сообщение об ошибке.
0
denys_l
52 / 52 / 4
Регистрация: 26.09.2011
Сообщений: 186
29.10.2012, 13:03 #5
методы получения кол-ва столбцоы и строк
это бред я написал...
0
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 13:09  [ТС] #6
denys_l, denys_l, Эм?
У меня все работает и хорошо компилируется. Другое дело, что задача выполняется не полностью, а требуется именно конструктор копирования.

Про методы - да) Ниче, бывает.

запустил твой код, ниче не изменилось.
Тело конструктора дебагнул и ничего не изменилось. Размерность все равно задается как у копируемой матрицы. Чувствую, что где-то туплю, причем конкретно, но не могу понять, где...
0
denys_l
52 / 52 / 4
Регистрация: 26.09.2011
Сообщений: 186
29.10.2012, 13:17 #7
что-то я сутра совсем туплю...
Конструктор копирования в качестве параметра принимает ссылку на собственный тип класса
0
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 13:21  [ТС] #8
denys_l, У тебя разве не так?
0
denys_l
52 / 52 / 4
Регистрация: 26.09.2011
Сообщений: 186
29.10.2012, 13:25 #9
и да и нет...
Тебе нужно перегрузить оператор присваивания
1
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 13:30  [ТС] #10
denys_l, Вопрос. Что мне нужно сделать в перегрузке? Т.к. я думал, что все окажется проще, теперь я даже не знаю, что надо там закодить...
0
denys_l
52 / 52 / 4
Регистрация: 26.09.2011
Сообщений: 186
29.10.2012, 13:52 #11
Смотри у тебя создается копия объекта Q, он у тебя не присваивается. При передаче объекта в функцию, передается сам объект, не его копия... при выходе из функции этот объект уничтожится и далее он будет недоступен

Добавлено через 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
Matrix Matrix::operator= ( const Matrix &obj ) {
    if ( this == &obj )
        return *this;
    
 
    //если наша матрица меньше , то берем размер размер obj
    //иначе оставляем свой размер
int r = m < obj.m ?  obj.m : m;
    int c = n < obj.n ?  obj.n : n;
 
    //забиваем массив нулями
    for ( int i = 0; i < m; i++ ) {
        for ( int j = 0; j < n; j++) {
                M [ i ] [ j ] = 0;          
        }
    }
    //копируем obj
    for ( int i = 0; i < r; i++ ) {
        for ( int j = 0; j < c; j++) {
                M [ i ] [ j ] = obj.M[r][c];            
        }
    }
    
    return *this;
}
Добавлено через 1 минуту
ну и методы придется добавить, о которых я говорил, т.к. m и n - закрытые данные члены и прямого доступа мы к ним не имеем
1
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 15:54  [ТС] #12
denys_l, Вот спасибо, работает! В 20-ой строке только с коэффициентами намудрил чего-й то, ну это не важно.
Благодарю за помощь!
0
denys_l
52 / 52 / 4
Регистрация: 26.09.2011
Сообщений: 186
29.10.2012, 15:58 #13
Цитата Сообщение от Gregory_Mas Посмотреть сообщение
denys_l, Вот спасибо, работает! В 20-ой строке только с коэффициентами намудрил чего-й то, ну это не важно.
Благодарю за помощь!
точно, там i,j... я сегодня что-то совсем тормоз... моя ошибка
0
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 16:02  [ТС] #14
denys_l, Да ладно. Зато мне помог, буду знать, что идет "замена".
0
29.10.2012, 16:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2012, 16:02
Привет! Вот еще темы с ответами:

конструктор копирования - C++
Помогите вывести конструктор копирования #include &lt;iostream&gt; //библиотека C++, позволяющая использовать систему ввода-вывода C++ ...

Конструктор копирования - C++
Может быть глупый вопрос, а может я глупый... Конструктор копирования имеет такой синтаксис имякласса(const имякласса &amp;){ тело...

Конструктор копирования - C++
Добрый вечер. Начал изучать перегрузку операций и конструктор копирования. Лазил в инете и налепил такой код. Только вот не могу понять как...

Конструктор копирования - C++
Конструктор копирования в качестве параметра принимает ссылку на экземпляр типа класса. Вопрос заключается, почему именно...


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

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

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