Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Класс для транспонирования матрицы, Размерность n*m, память динамически 
:(
    Опции темы
stella_betelgeize
  Дата 30.11.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.11.2007

Репутация: нет
Всего: нет



Задание сначала было такое: 

Написать программу, выполняющую в матрице размерностью n*m перестановку строк и столбцов (транспонирование матрицы). Значения m и n программа должна запрашивать в диалоговом режиме, память под матрицу следует распределять динамически. Написать функции:

1.-заполнения двумерного массива случайными числами из диапазона –100, +100;
2.-вывода двумерного массива;
3.-перестановки строк и столбцов  матрицы.

С этим я благополучно справилась. 

Но затем задание преобразовалось в такое: 

На основе предыдущего задания необходимо написать класс, имеющий конструкторы (без параметров, с параметрами, копировщик), деструктор, функции ввода-вывода, функции, решающие поставленную задачу.

Здесь тоже всё неплохо, кроме самой функции транспонирования. Теперь она перестала переворачивать матрицу:

Ishodnaya matritsa:
-29     99      75
-84     84      -34

Transponirovannaya matritsa:

-29     -84     99
84      75      -34
Press any key to continue


Подскажите пожалуйста, в чем проблема! 

Код

#include <iostream.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

class Cmas_2D
{
private:
    
    int n; 
    int m;
    int *A;

public:
    
    Cmas_2D (void);
    Cmas_2D (int nn, int mm);
    Cmas_2D (Cmas_2D &);
             
    
    void scan_2D ();
    void print_2D ();
    void transp_2D ();

    ~Cmas_2D (void);
};
/////////////////////////////////////////////////////////////
//konstruktory, destruktor//
Cmas_2D::Cmas_2D ()
{
    cout<<"Vvedite kolichestvo strok n\n";
    cin>>n;
    cout<<endl;
    cout<<"Vvedite kolichestvo stolbtsov m\n";
    cin>>m;
    cout<<endl;
    A=new int [n*m];
}

Cmas_2D::Cmas_2D (int nn, int mm)    
{
    n=nn; 
    n=mm;
}

Cmas_2D::Cmas_2D (Cmas_2D &the)
{
    n=the.n;
    m=the.m;
    A=new int [n*m];
}
/////////////////////////////////////////////////////////
//funktsii//
void Cmas_2D::scan_2D ()
{
    srand((unsigned)time(NULL));
    int i, j;
    int min=-100, max=100;
    for (i=0; i<n; i++)
        { for (j=0; j<m; j++)
            A[i*m+j]=rand()%(max-min+1)+min;
        }
}

void Cmas_2D::print_2D ()
{
    int i, j;
    for (i=0; i<n; i++)
        { for (j=0; j<m; j++)
            cout<<A[i*m+j]<<"\t";
            cout<<endl;
        }
}

void Cmas_2D::transp_2D ()
{
    int i, j;
    int *B;
    B=new int [m*n];
    for (i=0; i<n; i++)
    { for (j=0; j<m; j++)
        { 
            B[j*n+i]=A[i*m+j];
                         }
            }
    for (i=0; i<n*m; i++)
        A[i]=B[i];

    delete[] B;
    B=0;
}

Cmas_2D::~Cmas_2D (void) 
{
    delete[] A;
    A=NULL;
}

///////////////////////////////////////
    void main (void)
{    
    Cmas_2D A; 
    A.scan_2D ();
    cout<<"Ishodnaya matritsa:"<<endl;
    A.print_2D ();    
    cout<<endl;
    A.transp_2D ();
    cout<<"Transponirovannaya matritsa:"<<endl;
    cout<<endl;
    A.print_2D (); 
 }

PM MAIL   Вверх
under_sun
Дата 30.11.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 3.10.2007
Где: Ебург

Репутация: 7
Всего: 17



Когда ты печатаешь транспонированную матрицу, размерность у тебя сохраняется n x m, а надо m x n.
Код

void Cmas_2D::print_transp_2D ()
{
    for (int i=0; i<m; i++)
    {
         for (int j=0; j<n; j++)
               cout << A[i*n+j] << "\t";
         cout << endl;
    }
}

--------------------
TMTOWTDI
PM MAIL ICQ   Вверх
orthrus
Дата 30.11.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

Репутация: 5
Всего: 16



Еще у тебя конструктор копирования реализован не до конца.


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
stella_betelgeize
Дата 1.12.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.11.2007

Репутация: нет
Всего: нет



under_sun, спасибо за помощь! smile  Оно заработало.  smile 
orthrus, а чего в нем не хватает? В копировщике нужно каждый объект класса копировать, а я только n и m..? Вот это наверное не то  A=new int [n*m]; smile 
PM MAIL   Вверх
orthrus
Дата 1.12.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

Репутация: 5
Всего: 16



Массив нужной размерности создали а вот данные из the в него скопированы небыли. После того как была выделенна область памяти для массива A=new int [n*m]; в нем будет содержаться все что угодно но не копируемый массив.

Это сообщение отредактировал(а) orthrus - 1.12.2007, 13:37


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
stella_betelgeize
Дата 11.12.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.11.2007

Репутация: нет
Всего: нет



Разобралась! Добавила цикл: 

Код

Cmas_2D::Cmas_2D (Cmas_2D &the)
{
    n=the.n;
    m=the.m;
    int i;
    A=new int [n*m];
    for (i=0; i<n*m; i++)
        A[i]=the.A[i];
}



Спасибо! smile


PM MAIL   Вверх
stella_betelgeize
Дата 14.12.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.11.2007

Репутация: нет
Всего: нет



Теперь к задаче потребовалось добавить операторы : +, =, * на число, (когда число находится справа и слева, т. е. метод и друг), операторы ввода-вывода.

Вот, что у меня получилось: 


Код

#include <iostream.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

class Cmas_2D
{
    
    int n; 
    int m;
    int *A;

public:
    
    Cmas_2D (void);
    Cmas_2D (int nn, int mm);
    Cmas_2D (Cmas_2D &);
             
    
    void scan_2D ();
    void print_2D ();
    void print_2Dt ();
    void transp_2D ();

    ~Cmas_2D (void);

///>>, <<, =, +, x*A, A*x ///

friend istream& operator >> (istream &in, Cmas_2D &t);
friend ostream& operator << (ostream &out, Cmas_2D &t);
Cmas_2D& operator = (const Cmas_2D &);
Cmas_2D operator + (Cmas_2D);
friend Cmas_2D operator * (int x, Cmas_2D & B);
Cmas_2D operator * (int x);
};
//konstruktory//

Cmas_2D::Cmas_2D ()
{
    cout<<"Vvedite kolichestvo strok n\n";
    cin>>n;
    cout<<endl;
    cout<<"Vvedite kolichestvo stolbtsov m\n";
    cin>>m;
    cout<<endl;
    A=new int [n*m];
}

Cmas_2D::Cmas_2D (int nn, int mm)    
{
    n=nn; 
    n=mm;
    A=new int [n*m];
}

Cmas_2D::Cmas_2D (Cmas_2D &the)
{
    n=the.n;
    m=the.m;
    int i;
    A=new int [n*m];
    for (i=0; i<n*m; i++)
        A[i]=the.A[i];
}

//////////////////////////////////////////////////////
//friendy & operatory//

istream& operator >> (istream &in, Cmas_2D &t)
{ 
    cout<<"Vvedite matritsu"<<endl;
    for (int i=0; i<t.n; i++) 
    {
        for (int j=0; j<t.m; j++) 
        in>>t.A[i*t.n+j];
    }    
    return in;
};

ostream& operator << (ostream &out, Cmas_2D &t)
{
    int i, j;
    for (i=0; i<t.n; i++)
        { for (j=0; j<t.m; j++)
            out<<t.A[i*t.m+j]<<"\t";
            out<<endl;
        }
    return out;
};

    Cmas_2D& Cmas_2D::operator = (const Cmas_2D &B)
{    n=B.n;
    m=B.m;
    for (int i=0; i<n; i++) 
    {
        for (int j= 0; j<m; j++) 
        {
            A[i*n+j]=B.A[i*n+j]; 
        }
    }
    return *this;
}

    Cmas_2D Cmas_2D::operator + (Cmas_2D C)
{int i=0, j=0;
    Cmas_2D B; 

    
        
            for (i=0; i<n; i++)
            {    
                for ( j=0; j<m; j++)
                {
                B.A[i*n+j]=A[i*n+j]+B.A[i*n+j];         
                }
            }
    return C;
}

    Cmas_2D operator * (int x, Cmas_2D & B) 
{
    cout<<"Vvedite chislo"<<endl;
    cin>>x;
    int i, j;
    Cmas_2D C;
    for (i=0; i<C.n; i++)
        {                            
            for (j=0; j<C.m; j++)
            {
                C.A[i*C.n+j]=B.A[i*C.n+j]*x;
            }
        }    
    return C;
}

    Cmas_2D Cmas_2D::operator * (int x)
{    
    cout<<"Vvedite chislo"<<endl;
    cin>>x;
    Cmas_2D B;
    int i;
    for (i=0; i<n; i++)
        {
            for (int j=0; j<m; j++)
            {
                B.A[i*n+j]=A[i*n+j]*x;
            }
        }    
    return B;
}
/////////////////////////////////////////////////////////////
//funktsii//

void Cmas_2D::transp_2D ()
{
    int i, j;
    int *B;
    B=new int [m*n];
    for (i=0; i<n; i++)
    { for (j=0; j<m; j++)
        { 
            B[j*n+i]=A[i*m+j];
        }
    }
    for (i=0; i<n*m; i++)
        A[i]=B[i];

    delete[] B;
    B=0;
}

void Cmas_2D::scan_2D ()
{
    srand((unsigned)time(NULL));
    int i, j;
    int min=-100, max=100;
    for (i=0; i<n; i++)
        { for (j=0; j<m; j++)
            A[i*m+j]=rand()%(max-min+1)+min;
        }
}

void Cmas_2D::print_2D ()
{
    int i, j;
    for (i=0; i<n; i++)
        { for (j=0; j<m; j++)
            cout<<A[i*m+j]<<"\t";
            cout<<endl;
        }
}

void Cmas_2D::print_2Dt ()
{
    int i, j;
    for (i=0; i<m; i++)
        { for (j=0; j<n; j++)
            cout<<A[i*n+j]<<"\t";
            cout<<endl;
        }
}
/////////////////////////////////////////////////////////////
//destruktor//

Cmas_2D::~Cmas_2D (void) 
{
    delete[] A;
    A=NULL;
}

/////////////////////////////////////////////////////////////

    void main (void)
{
    cout<<"*transponirovanie*"<<endl;
    cout<<"Ishodnaya matritsa:"<<endl;
    Cmas_2D A;
    A.scan_2D();
    cout<<A;    
    cout<<endl;
    A.transp_2D ();
    cout<<"Transponirovannaya matritsa:"<<endl;
    cout<<endl;
    A.print_2Dt (); 
///////////slozhenie
    cout<<"*slozhenie matrits*"<<endl;
    Cmas_2D B;
    B.scan_2D();
    cout<<B;
    Cmas_2D C;
    C.scan_2D();
    cout<<C;
    A=B+C;  //ne chitaet... 
    cout<<"B + C= "<<endl<<A<<endl;
///////////x*A
    int x;
    cout<<"*umnozhenie*"<<endl;
    cout<<"(friend)"<<endl;
    cin>>B;
    B=B*x;
    cout<<"B * x = "<<B;
///////////A*x    
    cout<<"*umnozhenie*"<<endl;
    cout<<"(method)"<<endl;
    cin>>B;
    B=x*B;
    cout<<"x * B = "<<B;
}



Почему конструктор работает перед строкой 235? 

*slozhenie matrits*
Vvedite kolichestvo strok n
2

Vvedite kolichestvo stolbtsov m
2

-20     -54
61      30
Vvedite kolichestvo strok n
2

Vvedite kolichestvo stolbtsov m
2

-17     41
36      -31
Vvedite kolichestvo strok n
2

Vvedite kolichestvo stolbtsov m
2

B + C=
-17     41
36      -31


А еще не складывает матрицы... =( 

И здесь тоже конструктор выскакивает (241 и 247): 

*umnozhenie*
(friend)
Vvedite matritsu
2 2
3 3
Vvedite chislo
4
Vvedite kolichestvo strok n
2

Vvedite kolichestvo stolbtsov m
2


B * x =
8       8
12      12
*umnozhenie*
(method)
Vvedite matritsu
3 3
4 4
Vvedite chislo
5
Vvedite kolichestvo strok n
2

Vvedite kolichestvo stolbtsov m
2


x * B =
15      15
20      20
Press any key to continue

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.