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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> транспонирование матрицы, помогите разобраться 
:(
    Опции темы
TaNK
  Дата 12.12.2006, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



необходимо ввести квадратную матрицу, и в функции  ее транспонировать, я написал код, но есть мысль что ошибка в самом транспонировании, так как выводится матрица, которую я ввел, как правильно реализовать, вот код, кому инетересно - помогите плиз!
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused


   int **tr_matrix(int n)
     {
       int **p,**p_vspm,i,j;
       // Dannaia matrix
       p = new int *[n];
       for (i=0; i<n; i++)
         {
           p[i] = new int [n];
         }
        // New matrix dla obmena
       p_vspm = new int *[n];
       for (i=0; i<n; i++)
         {
           p_vspm[i] = new int [n];
         }


       // Zapolnenie
       for (i=0; i<n; i++)
           for (j=0; j<n; j++)
             {
               cout << "Vvedite elmenti matr = ";
               cin >> p[i][j];
             }


       // Transponirovanie
       for (i=0; i<n; i++)
           for (j=0; j<n; j++)
             {
               if (j!=i)
                        { // Вот тут где неправильно реализовал, как правиьно сделать?
                          for (i=0; i<n; i++)
                            for (j=0; j<n; j++)
                              p_vspm[i][j] = p[j][i]; //Meniaem ctolbci mestami
                        }
               else
                        {
                         for (i=0; i<n; i++)
                            for (j=0; j<n; j++)
                              p_vspm[i][j] = p[i][j]; // Kopiruem diagonal bez izmenenii
                        }

             }
        return p_vspm;
     }

    void main()
     {
        int **ma;
        int n;
        cout << "Vvedite poriadok matr = " << endl;
        cin >> n;
        ma = tr_matrix(n);

        for (int i=0; i<n; i++)
         {
           cout<< "ctroka  - " << i+1<< ":";
           for (int j=0; j<n; j++)
           cout << "\t" << ma[i][j];
           cout << endl;
         }
      /* for (int i=0; i<n; i++)
         {
           delete ma[i];
           delete ma;
         }  */
       getch();
     }

//---------------------------------------------------------------------------



--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
TaNK
Дата 12.12.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вроде я додумал как сделать, при нескольких прогонов, вроде ошибки не видно, но все равно взгляните, может что нодо будет подправить?
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused


   int **tr_matrix(int n)
     {
       int **p,**p_vspm,i,j;
       // Dannaia matrix
       p = new int *[n];
       for (i=0; i<n; i++)
         {
           p[i] = new int [n];
         }
        // New matrix dla obmena
       p_vspm = new int *[n];
       for (i=0; i<n; i++)
         {
           p_vspm[i] = new int [n];
         }


       // Zapolnenie
       for (i=0; i<n; i++)
           for (j=0; j<n; j++)
             {
               cout << "Vvedite elmenti matr = ";
               cin >> p[i][j];
             }


       // Transponirovanie
       for (i=0; i<n; i++)
           for (j=0; j<n; j++)
             {
               p_vspm[i][j] = p[j][i]; // Транспонирование вот так сделал, на много проще, а то сильно было замудрено!

             }
        return p_vspm;
     }

    void main()
     {
        int **ma;
        int n;
        cout << "Vvedite poriadok matr = " << endl;
        cin >> n;
        ma = tr_matrix(n);

        for (int i=0; i<n; i++)
         {
           cout<< "ctroka  - " << i+1<< ":";
           for (int j=0; j<n; j++)
           cout << "\t" << ma[i][j];
           cout << endl;
         }
      /* for (int i=0; i<n; i++)
         {
           delete ma[i];
           delete ma;
         }  */
       getch();
     }


//---------------------------------------------------------------------------



--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


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


Опытный
**


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

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



возник другой вопрос как освободить память из под динамического массива, для массива p[i] удаляется, а как освободить для массива p_vspm
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused


   int **tr_matrix(int n); // Prototype


    void main()
     {
        int **ma;
        int n;
        cout << "Vvedite poriadok matr = " << endl;
        cin >> n;
        ma = tr_matrix(n);

        for (int i=0; i<n; i++)
         {
           cout<< "ctroka  - " << i+1<< ":";
           for (int j=0; j<n; j++)
           cout << "\t" << ma[i][j];
           cout << endl;
         }

       getch();
     }

    int **tr_matrix(int n)
     {
       int **p,**p_vspm,i,j;
       // Dannaia matrix
       p = new int *[n];
       for (i=0; i<n; i++)
         {
           p[i] = new int [n];
         }
        // New matrix dla obmena
       p_vspm = new int *[n];
       for (i=0; i<n; i++)
         {
           p_vspm[i] = new int [n];
         }


       // Zapolnenie
       for (i=0; i<n; i++)
           for (j=0; j<n; j++)
             {
               cout << "Vvedite elmenti matr = ";
               cin >> p[i][j];
             }


       // Transponirovanie
       for (i=0; i<n; i++)
           for (j=0; j<n; j++)
             {
               p_vspm[i][j] = p[j][i];

             }

      for (i=0; i<n; i++)

         delete p[i];
         delete p;
 // тут освобождается, а как для p_vspm
      return p_vspm;
    }
//---------------------------------------------------------------------------


Это сообщение отредактировал(а) TaNK - 12.12.2006, 14:26


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Транспонирование матрицы можно сделать без использования промежуточного массива (если исходная матрица не нужна)
PM MAIL ICQ   Вверх
JackYF
Дата 12.12.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



в такой реализации - только в самой функции main().
Она же должна что-то увидеть, прежде чем транспонированная матрица исчезнет.

Но вообще это плохая практика.
Динамические объекты лучше удалять в том же блоке, где они и создавались, иначе может неразбериха получиться.

Пишешь на плюсах? Оберни в контейнер.
Пропиши конструктор и деструктор.

Добавлено @ 14:40 
Цитата(Anikmar @  12.12.2006,  14:35 Найти цитируемый пост)
промежуточного массива


А у него не промежуточный массив. Посмотри на реализацию. Он возвращает новый объект.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Anikmar
Дата 12.12.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата

А у него не промежуточный массив. Посмотри на реализацию. Он возвращает новый объект.


Я неправильно выразился. 
Просто хотел сказать, что если задача не требует сохранения исходной матрицы транспонировать можно без использования выделения памяти под вторую матрицу (соответственно освобождать вторую матрицу не придется).

А вообще, конечно правильно - надо стараться выделять и освобождать в одном блоке, хотя не всегда это получается.
PM MAIL ICQ   Вверх
JackYF
Дата 12.12.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Anikmar @  12.12.2006,  14:49 Найти цитируемый пост)
Просто хотел сказать, что если задача не требует сохранения исходной матрицы транспонировать можно без использования выделения памяти под вторую матрицу (соответственно освобождать вторую матрицу не придется).


Да, согласен.
Но процедура транспонирования будет более сложной.

TaNK, к тебе общий вопрос: тебе нужно сохранять старую матрицу?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
TaNK
Дата 12.12.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(JackYF @ 12.12.2006,  14:56)
Цитата(Anikmar @  12.12.2006,  14:49 Найти цитируемый пост)
Просто хотел сказать, что если задача не требует сохранения исходной матрицы транспонировать можно без использования выделения памяти под вторую матрицу (соответственно освобождать вторую матрицу не придется).


Да, согласен.
Но процедура транспонирования будет более сложной.

TaNK, к тебе общий вопрос: тебе нужно сохранять старую матрицу?

нет не нужно, и тогда вопрос как реализовать без 2 матрицы, и как освободить память когда исходная матрица должна быть оставлена (ради интереса) и когда можно обойтись одной матрицой


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(TaNK @  12.12.2006,  15:10 Найти цитируемый пост)
и как освободить память когда исходная матрица должна быть оставлена


Так же, как ты и делал, только в конце main(). В процедуре - никак, тебе же еще обращаться к этой матрице надо будет.

Как реализовать без 2-ой матрицы - к Anikmar. В этом случае освобождать дополнительную матрицу не потребуется, так как она и создаваться не будет( может, правда, будет что-то еще... )


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
TaNK
Дата 12.12.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(JackYF @ 12.12.2006,  15:17)
Цитата(TaNK @  12.12.2006,  15:10 Найти цитируемый пост)
и как освободить память когда исходная матрица должна быть оставлена


Так же, как ты и делал, только в конце main(). В процедуре - никак, тебе же еще обращаться к этой матрице надо будет.

Как реализовать без 2-ой матрицы - к Anikmar. В этом случае освобождать дополнительную матрицу не потребуется, так как она и создаваться не будет( может, правда, будет что-то еще... )

Код

void main()
     {
        int **ma;
        int n;
        cout << "Vvedite poriadok matr = " << endl;
        cin >> n;
        ma = tr_matrix(n);

        for (int i=0; i<n; i++)
         {
           cout<< "ctroka  - " << i+1<< ":";
           for (int j=0; j<n; j++)
           cout << "\t" << ma[i][j];
           cout << endl;
         }
       for (i=0; i<n; i++)

         delete p_vspm[i]; // но тут будет ошибка она не понимает что за вызов,  как по ссылке удалять или как?
         delete p_vspm;
    
   getch();
     }



--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Код

for (i=0; i<n; i++)
{
         delete [] p_vspm[i];
}
delete [] p_vspm;    



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Anikmar
Дата 12.12.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(JackYF @ 12.12.2006,  15:17)
Как реализовать без 2-ой матрицы - к Anikmar. В этом случае освобождать дополнительную матрицу не потребуется, так как она и создаваться не будет( может, правда, будет что-то еще... )

Уф, чуть что - так косой  smile 
Это ж вспомнить надо! Просто помню - на лабораторке делали.
Если я правильно помню - транспонированная, это та, у каторой строки стали столбцами - т.е. отражение относительно диагонали...

Тогда, наверное так:

Код

int i,j,temp;
// N - порядок матрицы
for (i=1;i<N;i++) // Это цикл по строкам, начинаем со 2-й строки
  for(j=0;j<i;j++) // Это цикл по столбцам - начинаем с первого столбца и идем до диагонали
    {
       Temp = Mas[i][j];
       Mas[i][j] = Mas[j][i];
       Mas[j][i] = Temp;
    }


Не бейте меня - не проверял!
PM MAIL ICQ   Вверх
TaNK
Дата 12.12.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Anikmar @ 12.12.2006,  15:58)
Цитата(JackYF @ 12.12.2006,  15:17)
Как реализовать без 2-ой матрицы - к Anikmar. В этом случае освобождать дополнительную матрицу не потребуется, так как она и создаваться не будет( может, правда, будет что-то еще... )

Уф, чуть что - так косой  smile 
Это ж вспомнить надо! Просто помню - на лабораторке делали.
Если я правильно помню - транспонированная, это та, у каторой строки стали столбцами - т.е. отражение относительно диагонали...

Тогда, наверное так:

Код

int i,j,temp;
// N - порядок матрицы
for (i=1;i<N;i++) // Это цикл по строкам, начинаем со 2-й строки
  for(j=0;j<i;j++) // Это цикл по столбцам - начинаем с первого столбца и идем до диагонали
    {
       Temp = Mas[i][j];
       Mas[i][j] = Mas[j][i];
       Mas[j][i] = Temp;
    }


Не бейте меня - не проверял!

бить не будем, но проверим кодик твой!

Добавлено @ 16:18 
Цитата(JackYF @ 12.12.2006,  15:44)
Код

for (i=0; i<n; i++)
{
         delete [] p_vspm[i];
}
delete [] p_vspm;    

ругаетя что undefined simbol p_vspm, может как нить по другому вызывать надо?


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
JackYF
Дата 12.12.2006, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(TaNK @  12.12.2006,  16:10 Найти цитируемый пост)
undefined simbol


Так а ты его объявил с таким именем в main()? или по другому объявил?
Если ты объявляешь как раньше - ma,
то и пиши ma место p_vspm.




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
TaNK
Дата 12.12.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(JackYF @ 12.12.2006,  16:30)
Цитата(TaNK @  12.12.2006,  16:10 Найти цитируемый пост)
undefined simbol


Так а ты его объявил с таким именем в main()? или по другому объявил?
Если ты объявляешь как раньше - ma,
то и пиши ma место p_vspm.

respect - помогло, спасибо большое!


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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