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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.81
iliapl
11 / 11 / 1
Регистрация: 04.11.2009
Сообщений: 29
#1

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

04.11.2009, 22:12. Просмотров 5695. Ответов 6

Вобщем инициализируется матрица с клавиатуры и нужно её повернуть на 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 нет((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2009, 22:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поворот матрицыа на 90градусов (C++):

Поворот текста на 90градусов - MS Word
Уважаемые подскажите как можно печатать половину страницы горизонтально а половину с разворотом на 90 градусов и чтобы горизонтальный текст...

90градусов тепература цп - Процессоры
в холостую при стрессе стресс2.png Системная плата Gigabyte GA-M61P-S3, DualCore AMD Athlon 64 X2, 5600+(Brisbane), Geforce...

Не могу сделать поворот матрицы на каждое нажатие, и её нормальный поворот - Delphi
var Form1: TForm1; m, n: integer; i, j: byte; b, a: array of integer; implementation uses Unit2, Unit3;

Поворот - Delphi
Собсно есть треуголник в реальных координатах(отмасштабирован).Требуется повернуть его на N градусов(например 10:) ).Подскажите...

поворот на 90... - C++
Хочу повернуть матрицу по часовой стрелке на 90 градусов, но че-то не получается... Помогите найти ошибку... Вот мой код: #include...

Поворот - OpenGL
Добрый день! Нужно вращать изображение по оси X. Код вращения: glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); if (angle &gt;=...

6
insolent
826 / 344 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
05.11.2009, 00:05 #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;
    }
  }
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2009, 13:41 #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;
}
2
Миниатюры
Поворот матрицыа на 90градусов  
alibaba314
19 / 19 / 1
Регистрация: 22.03.2009
Сообщений: 58
05.11.2009, 15:20 #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
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2009, 15:29 #5
На сколько я помню математику, то повернуть по главной диагонали можно лишь квадратную матрицу, так что думая менять строки и столбци не имеет смысла...Но по сути замечание правильное
1
iliapl
11 / 11 / 1
Регистрация: 04.11.2009
Сообщений: 29
06.11.2009, 17:40  [ТС] #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 уже показал что нужно сделать для решения моей проблемы))
0
Dzhos
5 / 5 / 0
Регистрация: 17.12.2010
Сообщений: 34
17.12.2010, 13:41 #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;
}
0
17.12.2010, 13:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2010, 13:41
Привет! Вот еще темы с ответами:

Поворот DC - C++ WinAPI
Здравствуйте! Сегодня начал изучать gdi и решил написать простенькую игрушку. Какое-то изображение (танк, к примеру) ездит по фону по...

Поворот - Delphi
Почему в процедуре DrawTestObj если Scale написать раньше Rotate, то прямоугольник не повернется горизонтально(длинна сторона параллельна...

Поворот - OpenGL
Помогите пожалуйста, мне нужно повернуть фигуру, только я не знаю как это сделать если использовать glRotate(45, 0,0, 1) то фигуру...

Поворот 3D модели - XNA
Всем привет! Столкнулся с проблемой при повороте 3д модели. Пробую повернуть с помощью вот такого вот кода: ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru