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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Поворот матрицы 
V
    Опции темы
Гусь
Дата 13.3.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Осущиствите "поворот" матрицы на 90 градусов (первая строка становится последним столбцом и т.д.), на 180 градусов (первая строка становится последней, но элементы этой строки расположены в обратном порядке и т.д.).
PM MAIL   Вверх
Rodman
Дата 13.3.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 26
Всего: 122



Код

#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();
}


вроде так
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Гусь
Дата 13.3.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо))
PM MAIL   Вверх
MBo
Дата 13.3.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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;
При этом нужно обходить в циклах не все ячейки, а четверть.

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


Новичок



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

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



спсб
PM MAIL   Вверх
Гусь
Дата 14.3.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



[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;
При этом нужно обходить в циклах не все ячейки, а четверть.


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



Это сообщение отредактировал(а) Гусь - 14.3.2007, 14:34
PM MAIL   Вверх
Dov
Дата 14.3.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Код
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;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Гусь
Дата 14.3.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не пашет-[C++ Error] Unit1.cpp(19): E2451 Undefined symbol 'endl'  , [C++ Error] Unit1.cpp(18): E2451 Undefined symbol 'cout'
PM MAIL   Вверх
zkv
Дата 14.3.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 21
Всего: 92



Цитата(Гусь @  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 и стандартное пространство имен.
PM MAIL   Вверх
Dov
Дата 14.3.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Гусь, замени 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;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Dov
Дата 15.3.2007, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Это без использования дополнительной матрицы, т.е. поворот матрицы осуществляется в ней самой
Код
#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;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Гусь
Дата 15.3.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

Это сообщение отредактировал(а) Гусь - 15.3.2007, 18:06
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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