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

Поворот матрицыа на 90градусов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.81
iliapl
11 / 11 / 1
Регистрация: 04.11.2009
Сообщений: 29
04.11.2009, 22:12     Поворот матрицыа на 90градусов #1
Вобщем инициализируется матрица с клавиатуры и нужно её повернуть на 90градусов)
Вот код программы:
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
#include <iostream>
#include <conio.h>
#include <locale>
using namespace std;
void ReadData_SizeMatrix(int &n,int &m)
{
        cout<<"Введите количество строк матрицы А: "<<endl;
        cin>>n;
        cout<<"Введите количество столбцов матрицы А: "<<endl;
        cin>>m;
}
void ReadData_Matrix(int **A,int &n,int &m)
{
        for (int i=0;i<n;i++)
                for(int j=0;j<m;j++)
                {
                        cout<<"введите элемент A["<<i<<"]["<<j<<"]";
                        cin>>A[i][j];
                }
}
void OutputData(int **A,int n,int m)
{
        for (int i=0;i<n;i++)
                {
                for(int j=0;j<m;j++)
                {
                        cout<<A[i][j]<< " ";
                                }
                                cout<<" "<<endl;
                }
}
void Povorot(int **A,int **B,int n,int m)
{
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            B[i][j]=A[j][n+1-i];
}
int main ()
{
        setlocale(LC_ALL,"Russian");
        int **A,**B,n,m;
        ReadData_SizeMatrix(n,m);
        A=new int*[n];
        for(int i=0; i<n; i++)
            A[i]=new int[m];
        B=new int*[n];
        for(int i=0; i<n; i++)
            B[i]=new int[m];
        ReadData_Matrix(A,n,m);
        Povorot(A,B,n,m);
        OutputData(B,n,m);
        getch();
        return 0;
}
Вообщем помогите найти ошибочку)На 270градусов(если в 37 строчке поменять [n+1-i] на [n-1-i]) всё хорошо поворачивает,а на 90 нет((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2009, 22:12     Поворот матрицыа на 90градусов
Посмотрите здесь:

C++ поворот на 90...
C++ Поворот фигуры
Поворот фигуры C++
поворот массива на 90° C++
C++ Поворот матрицы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insolent
 Аватар для insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
05.11.2009, 00:05     Поворот матрицыа на 90градусов #2
iliapl,
Попробуй 37 строчку
C++
1
B[i][j]=A[j][n+1-i];
заменить на
C++
1
B[i,j]=A[n-j+1][i];
Добавлено через 8 минут
или так...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int tmp = 0;
...
for (int i=1; i < n/2;++i) 
{
  for (int k=i; k < n-i;++k)
  {
    tmp = a[i][k];
    a[i][k] = a[n-k+1][i];
    a[n-k+1][i] = a[n-i+1][n-k+1];
    a[n-i+1][n-k+1] = a[k][n-i+1];
    a[k][n-i+1] = tmp;
    }
  }
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2009, 13:41     Поворот матрицыа на 90градусов #3
Вот подправил твой код для поворота матрицы,
ещё с универа использовал для этого простое условие
B[i][j] = A[j][i]

В функциях на всякий случал ввёл условия по проверке
наличия выделенной памяти для указателей А и В, можно
просто исключить из кода, на работоспособности это
не отразиться

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <locale>
#include <conio.h>
 
using namespace std;
 
void ReadData_SizeMatrix(int &n,int &m)
{
        cout<<"Введите количество строк матрицы А: "<<endl;
        cin>>n;
        cout<<"Введите количество столбцов матрицы А: "<<endl;
        cin>>m;
}
 
void ReadData_Matrix(int **A,int &n,int &m)
{
    if(A)
    {
        for(int i=0,j;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                cout<<"введите элемент A["<<i<<"]["<<j<<"] : ";
                cin>>A[i][j];
            }
        }
    }
}
 
void OutputData(int **A,int n,int m)
{
    if(A)
    {
        for (int i=0,j;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                cout<<A[i][j]<< " ";
            }
            cout<<" "<<endl;
        }
    }
}
 
void Povorot(int **A,int **B,int n,int m)
{
    if(A && B)
    {
        for(int i = 0,j; i < n; i++)
        {
           for( j = 0; j < m; j++)
              B[j][i]=A[i][j];
        }
    }
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    int **A,**B,n,m;
    ReadData_SizeMatrix(n,m);
    A = new int*[n];
    B = new int*[n];
 
    //Тут экономим на числе циклов
    for(int i=0; i<n; i++)
    {
        A[i]=new int[m];
        B[i]=new int[m];
    }
    ReadData_Matrix(A,n,m);
    //Покажем исходную матрицу
    cout<<"\tMatrix A\r\n";
    OutputData(A,n,m);
    Povorot(A,B,n,m);
    //Вывод транспонированной матрицы
    cout<<"\tMatrix B\r\n";
    OutputData(B,n,m);
    getch();
    return 0;
}
Миниатюры
Поворот матрицыа на 90градусов  
alibaba314
18 / 18 / 1
Регистрация: 22.03.2009
Сообщений: 58
05.11.2009, 15:20     Поворот матрицыа на 90градусов #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот подправил твой код для поворота матрицы,
ещё с универа использовал для этого простое условие
B[i][j] = A[j][i]

В функциях на всякий случал ввёл условия по проверке
наличия выделенной памяти для указателей А и В, можно
просто исключить из кода, на работоспособности это
не отразиться

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <locale>
#include <conio.h>
 
using namespace std;
 
void ReadData_SizeMatrix(int &n,int &m)
{
        cout<<"Введите количество строк матрицы А: "<<endl;
        cin>>n;
        cout<<"Введите количество столбцов матрицы А: "<<endl;
        cin>>m;
}
 
void ReadData_Matrix(int **A,int &n,int &m)
{
    if(A)
    {
        for(int i=0,j;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                cout<<"введите элемент A["<<i<<"]["<<j<<"] : ";
                cin>>A[i][j];
            }
        }
    }
}
 
void OutputData(int **A,int n,int m)
{
    if(A)
    {
        for (int i=0,j;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                cout<<A[i][j]<< " ";
            }
            cout<<" "<<endl;
        }
    }
}
 
void Povorot(int **A,int **B,int n,int m)
{
    if(A && B)
    {
        for(int i = 0,j; i < n; i++)
        {
           for( j = 0; j < m; j++)
              B[j][i]=A[i][j];
        }
    }
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    int **A,**B,n,m;
    ReadData_SizeMatrix(n,m);
    A = new int*[n];
    B = new int*[n];
 
    //Тут экономим на числе циклов
    for(int i=0; i<n; i++)
    {
        A[i]=new int[m];
        B[i]=new int[m];
    }
    ReadData_Matrix(A,n,m);
    //Покажем исходную матрицу
    cout<<"\tMatrix A\r\n";
    OutputData(A,n,m);
    Povorot(A,B,n,m);
    //Вывод транспонированной матрицы
    cout<<"\tMatrix B\r\n";
    OutputData(B,n,m);
    getch();
    return 0;
}
а это Транспонированная матрица

Добавлено через 2 минуты
OutputData(B,n,m);
и последний надо писать так:
C++
1
OutputData(B,m,n);
plz
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2009, 15:29     Поворот матрицыа на 90градусов #5
На сколько я помню математику, то повернуть по главной диагонали можно лишь квадратную матрицу, так что думая менять строки и столбци не имеет смысла...Но по сути замечание правильное
iliapl
11 / 11 / 1
Регистрация: 04.11.2009
Сообщений: 29
06.11.2009, 17:40  [ТС]     Поворот матрицыа на 90градусов #6
Ну собственно транспонировать относительно главной диагонали и я могу)))ув.-=ЮрА=- вы видимо просто не так поняли задачу)
Вообщем нужно не транспонировать,а именно повернуть матрица на 90градусов по часовой(забл добавить в самом начале), т.е. если у нас была вначале такая матрица:
1 2 3
4 5 6
7 8 9
то мы должны получить:
7 4 1
8 5 2
9 6 3
а не то,что у вас получается:
1 4 7
2 5 8
3 6 9

Но всё равно спасибо за внимание.Собственно ув.insolent уже показал что нужно сделать для решения моей проблемы))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2010, 13:41     Поворот матрицыа на 90градусов
Еще ссылки по теме:

C++ Поворот массива на 45%
Поворот изображения C++
C++ Поворот матрицы

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

Или воспользуйтесь поиском по форуму:
Dzhos
 Аватар для Dzhos
5 / 5 / 0
Регистрация: 17.12.2010
Сообщений: 34
17.12.2010, 13:41     Поворот матрицыа на 90градусов #7
попробуй этот код
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
#include <iostream>
 
using namespace std;
 
int main (){
 
    int b=0;
  int c[100][100];
  int m , n ;
  cin >>   n>>m;
  for (int i = 0; i <n; i++){
    for (int j = 0; j <  m; j++){
       c[i][j] = ++b;
    }
  }
  int k=0;
  while(k!=m){
    for(int i=n-1;i>=0;i--){
    cout<<c[i][k]<<" ";
    }
    k++;
    cout<<endl;
    
  }
 
  
     
return 0;
}
Yandex
Объявления
17.12.2010, 13:41     Поворот матрицыа на 90градусов
Ответ Создать тему

Метки
Марица, Поворот на 90 градусов
Опции темы

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