Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Транспонирование матрицы(двумерный массив), любого размера 
:(
    Опции темы
ДобренькийПапаша
Дата 22.2.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



Итак, я уже решил эту задачу в разделе Центр Помощи. Решил поместить сюда, и описать алгоритм.
Может есть короче и лучше, но я подумал, вдруг кого заинтересует.

Код

#include <iostream.h>
#include <iomanip.h>
#include <math.h>
#include <stdlib.h>
int transpose (int **a, int nrow, int ncol)
{
    int i,j,p;
    for(i=0; i<nrow; i++)    
    {    
        for(j=i; j<ncol; j++)
        {    
            p=a[i][j];    
            a[i][j]=a[j][i];    
            a[j][i]=p;    
        }
    }
    
    return **a;
}
int main()
{
    int i,j,p;
    int nrow,ncol;
    
    cout << "Input a size of matrix(nrow):";
    cin >> nrow;
    cout << "Input a size of matrix(ncol):";
    cin >> ncol;
    
    int b=nrow;
    int s=ncol;
    int counter=0;
    if(nrow<ncol)
            
        do
        {
            counter++;
            nrow++;
        }while(nrow<ncol);
    
    if(nrow>ncol)
        do
        {
            counter++;
            ncol++;
        }while(nrow>ncol);
        
    int **a = new int *[nrow];
    
    for(i=0; i<nrow; i++)
    {
        a[i] = new int [ncol];
    }
    for(i=0; i<nrow; i++)
    {
        int d=0;
        for(j=0; j<ncol; j++)
            a[i][j]=d;
    }
    cout << "Input elements of matrix:"<<endl;
    
    for(i=0; i<b; i++)
    {
        for(j=0; j<s; j++)
            cin >> a[i][j];
    }
    cout << " Your matrix:"<<endl;
        cout <<endl;
        
    if (b>s)
    for(i=0; i<nrow; i++)
    {
        for(j=0; j<ncol-counter; j++)
            cout << setw(4) << a[i][j]  << "  ";
        cout << endl;
    }
    cout << endl;
    
    if (b<s)
        for(i=0; i<nrow-counter; i++)
        {
            for(j=0; j<ncol; j++)
            cout << setw(4) << a[i][j]  << "  ";
            cout << endl;
        }
        cout << endl;
        if (b==s)
        for(i=0; i<nrow; i++)
    {
        for(j=0; j<ncol; j++)
            cout << setw(4) << a[i][j]  << "  ";
        cout << endl;
    }

    for(i=0; i<nrow; i++)    
    {    
        for(j=i; j<ncol; j++)
        {    
            p=a[i][j];    
            a[i][j]=a[j][i];    
            a[j][i]=p;    
        }
    }
    
    cout << "Transposed matrix:" << endl;
    cout << endl;
    
    if (b>s)
        for(i=0; i<nrow-counter; i++)
    {
        for(j=0; j<ncol; j++)
            cout << setw(4) << a[i][j]  << "  ";
        cout << endl;
    }
    
        if (b<s)
        for(i=0; i<nrow; i++)
        {
            for(j=0; j<ncol-counter; j++)
            cout << setw(4) << a[i][j]  << "  ";
            cout << endl;
        }
    
    if (s==b) **a=transpose(a,nrow, ncol);
    if (s==b) **a=transpose(a,nrow, ncol);
    if (s==b)for(i=0; i<nrow; i++)
    {
        for(j=0; j<ncol; j++)
            cout << setw(4) << a[i][j]  << "  ";
        cout << endl;
    }
        
    cout << endl;
    cout << endl;
    return 0;
    delete[]a;

}


Алгоритм следующий. Как транспонируется квадратная матрица пояснять не буду, ибо в функции всё понятно и так.
Если матрица неквадратная. Юзер вводит размер. Записывается размер в две переменные nrow и ncol. Создаются ещё две переменные b и s, для хранения этого размера, ибо nrow и ncol будут изменены.
С помощью двух циклов делаем nrow=ncol, для того чтобы оперировать с квадратной матрицей, при этом заводим счётчик - counter, который хранит количество добавленных строк или столбцов.
Создаём двумерный массив [nrow][ncol] - уже квадратный, набиваем нулями в цикле.
Даём возможность юзеру, заполнить массив самому, прописывая в цикле
(i=0; i<b; i++)
(j=0; j<s; j++) - таким образом заполняются те элементы которые хочет транспонировать пользователь, остальный элементы остаются нулями.
Далее при помощи того самого счётчика (counter) выводим матрицу без нулей, т.е. такую, какую хочет видеть пользователь. (Всё делается в зависимости от того, что больше, строк больше столбцов, или столбцов больше чем строк).
Далее в цикле матрица, уже забитая пользователем транспонируется как квадратная.
Потом выводится с помощью того же счётчика (counter) без нулей, но вычитается counter при b>s теперь не из i, а из j, если b<s, то вычитаем counter не из j, а из i, ибо матрица уже транспонирована.
Всё.
Исходный код можно уменьшить, если хотите оптимизируйте его, мне просто уже лень.



--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Dov
Дата 22.2.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ДобренькийПапаша @ 22.2.2006, 12:23 Найти цитируемый пост)
Итак, я уже решил эту задачу в разделе Центр Помощи.

Гениально, просто шедевр.

Цитата(ДобренькийПапаша @ 22.2.2006, 12:23 Найти цитируемый пост)
Решил поместить сюда, и описать алгоритм.

Абсолютно правильное решение, полностью поддерживаю. Только не забудь его запатентовать, если ещё этого не сделал, а то украдут.

Цитата(ДобренькийПапаша @ 22.2.2006, 12:23 Найти цитируемый пост)
Может есть короче и лучше

Ну, это врядли, чуть больше 100 строк, к тому же есть несколько пустых, которые можно смело удалить.


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


Шустрый
*


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

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



Эту тему я поднимал 2 месяца назад! Решение вот Транспонирование матрицы на месте

--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
ДобренькийПапаша
Дата 25.2.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



Вы для одномерного массива делали. А здесь двумерный и алгоритм совсем другой.


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Alagert
Дата 25.2.2006, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А избыточные алгоритмы писать прикольно, наверно?
Задумайся о сложности своего алгоритма! Юзер вводит столбец 1000000*1. И хочет получить строку. А ты делаешь матрицу 1000000*1000000 и траспонируешь ее! Мне кажется, что происходет несколько лишних операций! )
А еще в нормальных программах, не используются двумерные массивы! Они раскладываются по строкам/столбцам в одномерки.
И код веселый у тебя, улыбает!
--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
ДобренькийПапаша
Дата 25.2.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



Код лень оптимизировать)).
Никто вводить 1000000 не будет. Написано ради алгоритма.
Двумерные массивы никто не отменял, написано ради интереса, как транспонировать в одном двумерном.


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Alagert
Дата 25.2.2006, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ДобренькийПапаша @ 25.2.2006, 23:43 Найти цитируемый пост)
Никто вводить 1000000 не будет. Написано ради алгоритма.

И то правда! Юзера ваще лучше до прог не допускать ) А то еще чего недоброго начнет, чего нить туда вводить)

--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
ДобренькийПапаша
Дата 26.2.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



Кстати, буду премного благодарен если вы напишите прогу, которая будет транспоинровать любую матрицу с использованием одного двумерного массива.

Alagert: Ты лучше придумай другой, чем этот поливать.


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Alagert
Дата 26.2.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ДобренькийПапаша @ 26.2.2006, 17:25 Найти цитируемый пост)
Кстати, буду премного благодарен если вы напишите прогу, которая будет транспоинровать любую матрицу с использованием одного двумерного массива.

Я ссылку дал smile Прочитал бы хоть.

Цитата(ДобренькийПапаша @ 26.2.2006, 17:25 Найти цитируемый пост)
Alagert: Ты лучше придумай другой, чем этот поливать.

Извиняй, алгоритма не вижу...

Вообще совет на будующее: если ты придумываешь алгоритм, который пытаясь решить задачу, увеличивает размерность задачи в разы, лучше ни кому не показывай его! Я не говорю, что нет алгоритмов быстро решающих задачи, повышением их размерности. Ex: алгоритмы БПФ Ванга-Жу и циклотомический. Только они добавляют все лишь 1 элемент к вектору. Почитай Кормена про анализ алгоритмов!
--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
SoWa
Дата 26.2.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

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



Придумаем...
Действительно, оптимизируй код, ибо найдется юзверь, который введет нереальный массив.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

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


 




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


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

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