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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 11:53     Конструктор копирования матриц, и заполнение лишнего нулями #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
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 минут
Люди, подскажите пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2012, 11:53     Конструктор копирования матриц, и заполнение лишнего нулями
Посмотрите здесь:

C++ Конструктор копирования.
C++ Конструктор копирования
Конструктор копирования C++
C++ Конструктор копирования в c++
C++ Конструктор копирования
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
29.10.2012, 12:37     Конструктор копирования матриц, и заполнение лишнего нулями #2
Тебе нужно рассмотреть три варианта:
1. Матрица копируется в точно такую же матрицу (ну, это самое простое).
2. Матрица копируется в матрицу большего размера. Тогда по условию недостающие элементы заполняются нулями.
3. Матрица копируется в матрицу меньшего размера - а вот что тут делать? Просто тупо отбрасывать лишние элементы? В задаче ничего об этом не сказано.
denys_l
51 / 51 / 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;
}
Добавь пока методы получения кол-ва столбцоы и строк
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 12:49  [ТС]     Конструктор копирования матриц, и заполнение лишнего нулями #4
CheshireCat, 1. Копирует, окей. С этим норм.
2. С этим проблема - оставшиеся элементы игнорируются компилятором при выводе. А это не есть гуд, это проблема, которую я не могу решить.
3. Не заморачиваемся, тут это неважно. Я бы просто вывел сообщение об ошибке.
denys_l
51 / 51 / 4
Регистрация: 26.09.2011
Сообщений: 186
29.10.2012, 13:03     Конструктор копирования матриц, и заполнение лишнего нулями #5
методы получения кол-ва столбцоы и строк
это бред я написал...
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 13:09  [ТС]     Конструктор копирования матриц, и заполнение лишнего нулями #6
denys_l, denys_l, Эм?
У меня все работает и хорошо компилируется. Другое дело, что задача выполняется не полностью, а требуется именно конструктор копирования.

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

запустил твой код, ниче не изменилось.
Тело конструктора дебагнул и ничего не изменилось. Размерность все равно задается как у копируемой матрицы. Чувствую, что где-то туплю, причем конкретно, но не могу понять, где...
denys_l
51 / 51 / 4
Регистрация: 26.09.2011
Сообщений: 186
29.10.2012, 13:17     Конструктор копирования матриц, и заполнение лишнего нулями #7
что-то я сутра совсем туплю...
Конструктор копирования в качестве параметра принимает ссылку на собственный тип класса
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 13:21  [ТС]     Конструктор копирования матриц, и заполнение лишнего нулями #8
denys_l, У тебя разве не так?
denys_l
51 / 51 / 4
Регистрация: 26.09.2011
Сообщений: 186
29.10.2012, 13:25     Конструктор копирования матриц, и заполнение лишнего нулями #9
и да и нет...
Тебе нужно перегрузить оператор присваивания
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 13:30  [ТС]     Конструктор копирования матриц, и заполнение лишнего нулями #10
denys_l, Вопрос. Что мне нужно сделать в перегрузке? Т.к. я думал, что все окажется проще, теперь я даже не знаю, что надо там закодить...
denys_l
51 / 51 / 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 - закрытые данные члены и прямого доступа мы к ним не имеем
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 15:54  [ТС]     Конструктор копирования матриц, и заполнение лишнего нулями #12
denys_l, Вот спасибо, работает! В 20-ой строке только с коэффициентами намудрил чего-й то, ну это не важно.
Благодарю за помощь!
denys_l
51 / 51 / 4
Регистрация: 26.09.2011
Сообщений: 186
29.10.2012, 15:58     Конструктор копирования матриц, и заполнение лишнего нулями #13
Цитата Сообщение от Gregory_Mas Посмотреть сообщение
denys_l, Вот спасибо, работает! В 20-ой строке только с коэффициентами намудрил чего-й то, ну это не важно.
Благодарю за помощь!
точно, там i,j... я сегодня что-то совсем тормоз... моя ошибка
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2012, 16:02     Конструктор копирования матриц, и заполнение лишнего нулями
Еще ссылки по теме:

C++ Конструктор копирования
Конструктор копирования C++
C++ Конструктор копирования

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

Или воспользуйтесь поиском по форуму:
Gregory_Mas
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 26
29.10.2012, 16:02  [ТС]     Конструктор копирования матриц, и заполнение лишнего нулями #14
denys_l, Да ладно. Зато мне помог, буду знать, что идет "замена".
Yandex
Объявления
29.10.2012, 16:02     Конструктор копирования матриц, и заполнение лишнего нулями
Ответ Создать тему
Опции темы

Текущее время: 02:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru