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


Автор: Гусь 13.3.2007, 12:59
Осущиствите "поворот" матрицы на 90 градусов (первая строка становится последним столбцом и т.д.), на 180 градусов (первая строка становится последней, но элементы этой строки расположены в обратном порядке и т.д.).

Автор: Rodman 13.3.2007, 13:24
Код

#include <stdio.h>
#define N 20
void main(void)
{
int a[N][N],i,j,tmp;
for (i=1;i<N;i++)
     for (j=1;j<N;j++)
        {
            printf("Vvedite element");
            scanf("%i", a[i][j]);
        } 
for (i=1;i<N;i++)/*90 gradusov*/
     for (j=1;j<N;j++)
    { 
              tmp=a[i][j]; 
              a[i][j]=a[j][i];
              a[j][i]=tmp;
    } 
for (i=1;i<N;i++)/*180 gradusov*/
     for (j=1;j<N;j++)
    { 
              tmp=a[i][j]; 
              a[j][i]=a[N-i+1][N+1-j];
              a[N-i+1][N+1-j]=tmp;
    } 

getch();
}


вроде так

Автор: Гусь 13.3.2007, 13:48
Большое спасибо))

Автор: MBo 13.3.2007, 15:15
Rodman, 
for (i=1;i<N;i++)/*90 gradusov*/
     for (j=1;j<N;j++)
    { 
              tmp=a[i][j]; 
              a[i][j]=a[j][i];
              a[j][i]=tmp;
    } 

это транспонирование (отражение матрицы относительно главной диагонали)
Для поворота на 90 градусов нужно запомнить элемент, и 4 раза перенести элементы, находящиеся на эквивалентном при повороте на (-90) градусов месте, т.е., например. t  := A[1,1]; A[1,1] := A[N, 1]; A[N, 1] := A[N,N]; A[N,N] := A[1, N]; A[1,N] := t;
При этом нужно обходить в циклах не все ячейки, а четверть.

Автор: Гусь 13.3.2007, 15:23
спсб

Автор: Гусь 14.3.2007, 14:32
[QUOTE=MBo,13.3.2007,  15:15]Rodman, 
for (i=1;i<N;i++)/*90 gradusov*/
     for (j=1;j<N;j++)
    { 
              tmp=a[i][j]; 
              a[i][j]=a[j][i];
              a[j][i]=tmp;
    } 

это транспонирование (отражение матрицы относительно главной диагонали)
Для поворота на 90 градусов нужно запомнить элемент, и 4 раза перенести элементы, находящиеся на эквивалентном при повороте на (-90) градусов месте, т.е., например. t  := A[1,1]; A[1,1] := A[N, 1]; A[N, 1] := A[N,N]; A[N,N] := A[1, N]; A[1,N] := t;
При этом нужно обходить в циклах не все ячейки, а четверть.


А как это записать, чтоб задача полностью решена была.
Спасибо заранее


Автор: Dov 14.3.2007, 15:19
Код
int main(void)
{
    int matrix[3][3] = {
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };
    int temp[3][3];
    int i, j;
    
    // выводим исходную матрицу
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 3; j++)                
            cout << matrix[i][j] << ' ';       
        cout << endl;
    }    
    cout << endl;
    
    // поворачиваем на 90 градусов    
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 3; j++)
        {
            temp[i][j] = matrix[2 - j][i];
            cout << temp[i][j] << ' ';
        }
        cout << endl;
    }
    
    // и ещё на 90, т.е. всего на 180
    cout << endl;    
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 3; j++)
        {
            matrix[i][j] = temp[2 - j][i];
            cout << matrix[i][j] << ' ';
        }
        cout << endl;
    }
            
    return 0;
}

Автор: Гусь 14.3.2007, 17:04
Не пашет-[C++ Error] Unit1.cpp(19): E2451 Undefined symbol 'endl'  , [C++ Error] Unit1.cpp(18): E2451 Undefined symbol 'cout'

Автор: zkv 14.3.2007, 17:25
Цитата(Гусь @  14.3.2007,  17:04 Найти цитируемый пост)
Не пашет-[C++ Error] Unit1.cpp(19): E2451 Undefined symbol 'endl'  , [C++ Error] Unit1.cpp(18): E2451 Undefined symbol 'cout' 

вообщето std::cout и std::endl - фишки из с++. Так что если прога д.б. на Си то меняйте cout на printf, а endl на вывод '\n'. Если можно на цпп то подключайте iostream и стандартное пространство имен.

Автор: Dov 14.3.2007, 17:27
Гусь, замени cout на printf(). Ты что, маленький что-ли?

Добавлено @ 17:35 
Держи

Код
#include<stdio.h>

int main(void)
{
    int matrix[3][3] = {
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };
    int temp[3][3];
    int i, j;
    
    // выводим исходную матрицу
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 3; j++)                
            printf("%d ", matrix[i][j]);       
        puts("");
    }    
    puts("");
    
    // поворачиваем на 90 градусов    
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 3; j++)
        {
            temp[i][j] = matrix[2 - j][i];
            printf("%d ", temp[i][j]);
        }
        puts("");
    }
    puts("");
    
    // и ещё на 90, т.е. всего на 180       
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 3; j++)
        {
            matrix[i][j] = temp[2 - j][i];
            printf("%d ", matrix[i][j]);
        }
        puts("");
    }
    
    getchar();
            
    return 0;
}

Автор: Dov 15.3.2007, 03:02
Это без использования дополнительной матрицы, т.е. поворот матрицы осуществляется в ней самой
Код
#include <stdio.h>

#define N  4

// функция обмена между эл-ми матрицы
void swap(int* a, int* b)
{
    int tmp;
    
    tmp = *a;
    *a  = *b;
    *b  = tmp;
}

void povorot_na_90_gradusov(int matrix[][N])
{
    int i, j;

    // поворачиваем матрицу на 90 градусов по часовой стрелке, делая сначала её транспонирование    
    // а затем построчный обмен между элементами левой и правой частями матрицы    
    for(i = 0; i < N; i++)
    {
        for(j = i; j < N; j++)
            swap(&matrix[i][j], &matrix[j][i]);
        for(j = 0; j < N / 2; j++)
            swap(&matrix[i][j], &matrix[i][N - j - 1]);
    }
}

void print_matrix(int matrix[][N])
{
    int i, j;

    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
            printf("%3d", matrix[i][j]);
        puts("");
    }
    puts("");
}

int main()
{
    int matr[][N] = {
        { 1,  2,  3,  4},
        { 5,  6,  7,  8},
        { 9, 10, 11, 12},
        {13, 14, 15, 16}
    };

    puts("Ishodnaya matrica: ");
    print_matrix(matr);

    puts("Povorot na 90 gradusov: ");
    povorot_na_90_gradusov(matr);        
    print_matrix(matr);

    puts("Povorot na 180 gradusov: ");
    povorot_na_90_gradusov(matr);        
    print_matrix(matr);
    
    printf("\nPress any key to quit...\n");
    getch();
    
    return 0;
}

Автор: Гусь 15.3.2007, 18:04
спасибо всем, я сам как то умудрился написать рпограмму.(конечно с помощью ваших подсказок и кодов в программе).

Добавлено @ 18:09 
 smile 

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