Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] транспонирование матрицы в функции


Автор: Ardour 10.6.2007, 13:57
Задан массив второй степени a[8][8]  в главной функции. Нужно с помощью функции вывести исходный массив на экран, а затем транспонировать его (опять же с помощью функции) (//a[i][j]==a[j][i]) и опять вывести на экран.

Автор: Voldemar2004 10.6.2007, 14:30
Код
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>

void T(void){

int array[8][8];

/* çàäàäèì ïðîèçâîëüíûé ìàññèâ: */

for(int i=0; i<8; i++)
{
 for(int j=0; j<8; j++)
 {
 array[i][j]=rand();
 }
}

cout<<"Random Matrix: "<<"\n";

/* âûâîä ìàòðèöû: */

for(int i=0; i<8; i++)
{
  for(int j=0; j<8; j++)
  {
   cout<<array[i][j]<<"\t";
   if(j==7){cout<<"\n";};
  }
}

cout<<"\n\nT Matrix: "<<"\n";

/* âûâîä ìàòðèöû: */

for(int i=0; i<8; i++)
{
  for(int j=0; j<8; j++)
  {
   cout<<array[j][i]<<"\t";
   if(j==7){cout<<"\n";};
  }
}

cin.get();

clrscr();

}


//---------------------------------------------------------------------------
int main()
{

T();

return 0;
}
//---------------------------------------------------------------------------
Так?

Автор: DigitSphinx 10.6.2007, 14:35
Можно так (на VS2005)
Код

#include <stdlib.h>
void PrintMass(double **a);
void TransMass(double **a);
int _tmain(int argc, _TCHAR* argv[])
{
    double **a;
    a = new double *[8];
    for (int i = 0; i < 8; i++)
        a[i] = new double [8];

    for (int i = 0; i < 8; i++)
        for (int j = 0; j < 8; j++)
            a[i][j] = rand();

    PrintMass(a);
    printf("\n\n");
    TransMass(a);
    PrintMass(a);
    scanf("A");
    for (int i = 0; i < 8; i++)
        delete [] a[i];
    delete [] a;
    return 0;
}
void PrintMass(double **a)
{
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
            printf("%.2f ", a[i][j]);
        printf("\n");
    }
}
void TransMass(double **a)
{
    double buff[8][8];
    for (int i = 0; i < 8; i++)
        for (int j = 0; j < 8; j++)
            buff[j][i] = a[i][j];
    for (int i = 0; i < 8; i++)
        for (int j = 0; j < 8; j++)
            a[i][j] = buff[i][j];
}


Автор: DigitSphinx 10.6.2007, 14:51
кстати здесь за тебя никто делать не будет !
для этого существует центр помощи !
а если у тебя определенный вопрос по си-си++ тогда тебе сюда !

Добавлено через 7 минут и 48 секунд
Voldemar2004, 
Цитата(Voldemar2004 @  10.6.2007,  14:30 Найти цитируемый пост)

for(int i=0; i<8; i++)
    {  for(int j=0; j<8; j++)  
        {   cout<<array[i][j]<<"\t";
             if(j==7){cout<<"\n";//Это не самый быстрый способ !
        };
    }


гораздо лучше так
Код

for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
            printf("%.2f ", a[i][j]);
        printf("\n");
    }

Автор: Ardour 10.6.2007, 15:34
   Что-то вроде этого


#include <stdio.h>

float print(float *a)   //печать двумерного массива
{
   int i, j;
   printf("\nИсходный массив:\n\n");
   for(i=0;i<6;i++)
   {
      for(j=0;j<6;j++)
      {
     printf("%4.0f ", *a);
         a++;
      }
      printf("\n");
   }
   printf("\n");
   return (0);
}
/*float transp(float *a)
{
   int i, j;
   int c;
   printf("\nТранспонированный массив:\n\n");
   for(i=0;i<6;i++)
   {
      for(j=0;j<6;j++)
      {
            c=*a;
        //  *a=a[j][i];
    //  a[j][i]=c;
            printf("%4.0f ", *a);
            a++;
      }
      printf("\n");
   }
   printf("\n\n");
   return (0);
}*/

int main()
{
   float a[6][6]={
               {0,0,0,0,49,18},
           {0,0,85,0,0,39},
           {0,85,0,17,0,0},
           {0,0,17,0,0,12},
               {49,0,0,0,0,9},
               {18,39,0,12,9,0},
           };

   //int i,j,;
   print(*a);        
   transp(*a);
   print(*a); 

Автор: DigitSphinx 10.6.2007, 16:14
Цитата(Ardour @  10.6.2007,  15:34 Найти цитируемый пост)
float print(float *a)   //печать двумерного массива

 smile 
Зачем float ?
Цитата(Ardour @  10.6.2007,  15:34 Найти цитируемый пост)
printf("%4.0f ", *a);

 smile
Зачем 4.0 ?? Сразу бы сделал массив int’ов !

Автор: TimeBreak 18.3.2009, 14:55
Возник почти аналогичный вопрос ! Подскажите плз .... вот квадратную матрицу Транспонировать без проблем а вот как транспонировать Не Квадратную матрицу скажем 3х4 ??? 
Заранее Благодарен !

Автор: zim22 18.3.2009, 16:01
Цитата(TimeBreak @  18.3.2009,  14:55 Найти цитируемый пост)
т как транспонировать Не Квадратную матрицу

http://ru.wikipedia.org/wiki/Транспонированная_матрица

Автор: vinter 18.3.2009, 16:36
Цитата(TimeBreak @  18.3.2009,  15:55 Найти цитируемый пост)
вот как транспонировать Не Квадратную матрицу скажем 3х4 ??? 

Ты не поверишь. ТОЧНО ТАК ЖЕ!!! И знаешь, что самое интересное? В любом, самом захудалом учебнике, в котором есть матрицы, есть описание транспонирования. И если уж ты решил взаимодействовать с матрицами, так открой учебник и прочитай про них, прежде чем писать на форум. 
Достали всякие ### ### ### ########### ###### и #### ## #### ########

Автор: andrew_121 18.3.2009, 16:48
Цитата(vinter @  18.3.2009,  16:36 Найти цитируемый пост)
Ты не поверишь. ТОЧНО ТАК ЖЕ!!! И знаешь, что самое интересное? В любом, самом захудалом учебнике, в котором есть матрицы, есть описание транспонирования. И если уж ты решил взаимодействовать с матрицами, так открой учебник и прочитай про них, прежде чем писать на форум. 
Достали всякие ### ### ### ########### ###### и #### ## #### ########

Солидарен. По этому и отвечать не стал!

Автор: Ln78 18.3.2009, 17:16
TimeBreak, уточни: язык C или C++, размерности известны заранее или нет, нужно ли сохранять исходную матрицу, в чём именно у тебя проблема?

Цитата(vinter @  18.3.2009,  16:36 Найти цитируемый пост)
Ты не поверишь. ТОЧНО ТАК ЖЕ!!! И знаешь, что самое интересное? В любом, самом захудалом учебнике, в котором есть матрицы, есть описание транспонирования. И если уж ты решил взаимодействовать с матрицами, так открой учебник и прочитай про них, прежде чем писать на форум. 

vinter, ты не поверишь, но в программировании случай квадратной матрицы и прямоугольной могут отличаться весьма существенно. Например, для прямоугольной может потребаться динамическое выделение памяти, когда для квадратной этого делать не нужно, и задача упрощается на порядок. И знаешь, что самое интересное? В математических книгах об этом нет ни слова. Хорошо, что разобраться в этом помогают форумы, в которых к новичкам относятся дружелюбно. smile 

Автор: Anikmar 18.3.2009, 17:20
ИМХО
Если вопрос я считаю тупым, а задающего вопрос круглым дураком - я либо шучу либо не отвечаю.
Так что Ln78 где-то прав
 smile 

Автор: TimeBreak 18.3.2009, 17:33
2 Ln78 : нужен на С++ ! Размерности задаются с клавиатуры ! Трансформировать квадратную матрицу - без проблем , а вот тот же код для не квадратной матрицы не работает и работать не будет - поетому и задал вопрос ! Сохранять исходную матрицу не обязательно ! 

По моему из всех умников посылающих в книгу понял вопрос только ты ) 
2 Anikmar  - по моему дурило здесь ты ! Такшто шути дальше КЛОУН )

Автор: Earnest 18.3.2009, 17:45
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: andrew_121 18.3.2009, 17:45
Цитата(vinter @  18.3.2009,  16:36 Найти цитируемый пост)
### ### ### ########### ###### и #### ## #### ######## 

А можно расшифровочку в приват?  smile 

Автор: zim22 18.3.2009, 17:56
Цитата(TimeBreak @  18.3.2009,  17:33 Найти цитируемый пост)
Трансформировать квадратную матрицу - без проблем

если нет проблем с квадратной - с прямоугольной тоже у тебя проблем не будет.
вот алгоритм: увеличь матрицу до большей размерности. и получишь квадратную. только в которой не нужно обрабатывать определённые значения в строках-столбцац.

Автор: vinter 18.3.2009, 18:50
Цитата(Ln78 @  18.3.2009,  18:16 Найти цитируемый пост)
vinter, ты не поверишь, но в программировании случай квадратной матрицы и прямоугольной могут отличаться весьма существенно

алгоритмы универсальны, и воспроизводятся универсально. А не отдельно для квадратной, отдельно для не квадратной. Это делается элементарно. Так, что не надо сказок про разные случаи.
Цитата(Ln78 @  18.3.2009,  18:16 Найти цитируемый пост)
 Например, для прямоугольной может потребаться динамическое выделение памяти, когда для квадратной этого делать не нужно, и задача упрощается на порядок

сделай транспонирование матрицы любого размера без динамической памяти на С++, будь добр.
Цитата(Ln78 @  18.3.2009,  18:16 Найти цитируемый пост)
Хорошо, что разобраться в этом помогают форумы, в которых к новичкам относятся дружелюбно

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

Цитата(Anikmar @  18.3.2009,  18:20 Найти цитируемый пост)
Если вопрос я считаю тупым, а задающего вопрос круглым дураком - я либо шучу либо не отвечаю.

я тоже обычно так делаю, сегодня вот решил ответить smile

Цитата(TimeBreak @  18.3.2009,  18:33 Найти цитируемый пост)
2 Anikmar  - по моему дурило здесь ты ! Такшто шути дальше КЛОУН )

ты за, что так бедного Anikmar'a то? Он просто перевел на твой язык, то, что я написл в своем посту smile 

Цитата(andrew_121 @  18.3.2009,  18:45 Найти цитируемый пост)
А можно расшифровочку в приват?   

да там нет ничего, я просто решёток наставил smile

Автор: Anikmar 18.3.2009, 19:34
Цитата

По моему из всех умников посылающих в книгу понял вопрос только ты ) 
2 Anikmar  - по моему дурило здесь ты ! Такшто шути дальше КЛОУН ) 




TimeBreak,  прежде чем оскорблять - внимательно прочитайте в каком контексте я написал свой пост. Я выступил в поддержку Ln78 против резкого ответа vinter.

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

Добавлено через 3 минуты и 34 секунды
vinter, 
Ln78, 

Давате будем жить дружно. Все нормально - просто помягче надо (это я vinter). Проехали, я ни на кого не обижаюсь, но спасибо за поддержку.

Автор: Ln78 19.3.2009, 06:11
Цитата(vinter @  18.3.2009,  18:50 Найти цитируемый пост)
алгоритмы универсальны, и воспроизводятся универсально. А не отдельно для квадратной, отдельно для не квадратной. Это делается элементарно. Так, что не надо сказок про разные случаи.

Универсальность ценой оптимальности нужна далеко не всегда. А то получится как в том анекдоте: выльем воду и сведём задачу к предыдущей. Если у меня входной массив допускает двойную индексацию , оригинал не нужно сохранять, и я знаю, что матрица квадратная, я просто напишу:
Код

      for( i = 0; i < N; ++i )
         for( j = 0; j < i; ++j )
         {
            tmp = a[i][j];
            a[i][j] = a[j][i];
            a[j][i] = tmp;
         }

Цитата(Anikmar @  18.3.2009,  19:34 Найти цитируемый пост)
Давате будем жить дружно. 

Да я и не собирался ни с кем ссориться. И к vinter’у обратился с миролюбивой просьбой. Тем более, учитывая, что спрашивающий оказался хамом, желание помочь и у меня ушло напрочь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)