Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с матрицами 
V
    Опции темы
Ripper
Дата 22.10.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


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

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



Задана таблица размерности N*N. С помощью процедуры выполнить перестановку K-того столбца таблицы на место L-ого столбца, а также перестановку K-й и L-й строк в соответсвии с запросом на обработку таблицы. 
+ Ещё меня интересует как развернуть полученную матрицу на 90 градусов. По часовой и против
Код

program laba4;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
 N = 3; //Ðàçìåð ìàòðèöû

type
arr=array [1..N, 1..N] of integer;
var
 table:arr;
 i,j:integer;
 k,l:integer;

procedure PrintArray (table:arr);
var j,m:integer;
begin
 for j:=1 to N do
 begin
  for m:=1 to N do
   write (table[j,m], ' ');
  writeln;
  end;
end;

procedure swap(var a,b:integer);
var
 x:integer;
begin
 x:=a;
 a:=b;
 b:=x;
end;

procedure SwapKLCols(var table:arr; k,l:integer);
var
 m:integer;
begin
 for m:=1 to N do
  swap(table[m,k],table[m,l]);
end;

procedure SwapKLRows(var table:arr; k,l:integer);
var
 m:integer;
begin
 for m:=1 to N do
  swap(table[k,m],table[l,m]);
end;


begin
 randomize;
 readln(k);
 readln(l);
 while ((k>N) or (l>N)) do
  begin
   writeln('k and l must be < N!');
   readln(k);
   readln(l);
  end;

 for i:=1 to N do
  for j:=1 to N do
   table[i,j]:=random(10);

 PrintArray(table);
 readln;

 SwapKLCols(table,k,l);
 PrintArray(table);
 readln;

 SwapKLRows(table,k,l);
 PrintArray(table);

 readln;
end.

Вот что  у меня получилось, но НИКАК не могу перевернуть таблицу smile Помогите, умоляю %) и почему не работает
for i:=1 to N
 for j:=1 to N
  swap(table[i,j],table[j,i]); - матрица остается такой какая была 



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Kuvaldis
Дата 22.10.2006, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Ripper, 
как-то писал на С, думаю, разберешься
На всякий случай пояснения
Функция поворачивает матрицу на углы, кратные 90
входные параметры: матрица, размер стороны (матрица квадратная, угол поворота)
в функции используем вспомогательную матрицу buf:
Код

void matr_angle(int** a, int n, int deg)
{
    int  i, j;
    int** buf;

    if(deg % 90)
    {
       puts("wrong angle for matrix");
       getch();
       return;
    }
    if (!(buf = matr_create(n, n)))
    {
       puts("Not enough memory");
       getch();
       return;
    }
    while(deg >= 360)
         deg -= 360;

    for(deg; deg > 0; deg-= 90)
    {
       for(i = 0; i < n; i++)
       for(j = 0; j < n; j++)
          buf[i][j] = a[i][j];

       for(i = 0; i < n; i++)
       for(j = 0; j < n; j++)
           a[i][j] = buf[j][n - i - 1];
    }
    
    matr_free(buf, n);
    return;
}


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

Это сообщение отредактировал(а) Kuvaldis - 22.10.2006, 20:05


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Palladin
Дата 22.10.2006, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

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



Цитата(Ripper @  22.10.2006,  19:12 Найти цитируемый пост)
Вот что  у меня получилось, но НИКАК не могу перевернуть таблицу  Помогите, умоляю %) и почему не работает
for i:=1 to N
 for j:=1 to N
  swap(table[i,j],table[j,i]); - матрица остается такой какая была


потомучто надо 

Код

for i:=1 to N
//или здесь begin а там ненадо 
for j:=1 to N
begin
  swap(table[i,j],table[j,i]);


так попробуй smile 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
XupyprMV
Дата 23.10.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 16.10.2006
Где: Сыктывкар, Россия

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



RooR, сорри, но и тут ошибка не в этом...

Цитата(Ripper @  22.10.2006,  19:12 Найти цитируемый пост)

Код

for i:=1 to N
 for j:=1 to N
  swap(table[i,j],table[j,i]);
 


Что  здесь получается: например i=2 j=3 => элементы [2,3] и [3,2] поменяются местами.
НО Когда i=3 j=2 элементы [3,2] и [2,3] поменяются местами (т. е. произойдёт обратная перестановка) Из чего следует что результатом работы будет первоначальная матрица  smile  

Но это ещё не всё... даже если менять один раз получится не разворот на 90 градусов, а транспонирование (т. е. строки поменяются местами со столбцами). 

Я бы сделал так:

1. Завёл ещё один элемент arr

var table2:arr;

2. Тогда всё получается просто:

Код

 for i:=1 to N do
  for j:=1 to N do
    table2[i,j]:=table[N-j+1,i];


 В table2 будет ничто иное как table повёрнутый на 90 градусов по часовой стрелке.

3. Тоже самое для поворота против часовой стрелки:

Код

for i:=1 to N do
  for j:=1 to N do
    table2[i,j]:=table[j,N-i+1];


Это сообщение отредактировал(а) XupyprMV - 23.10.2006, 13:32
PM MAIL WWW ICQ   Вверх
Kuvaldis
Дата 23.10.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



XupyprMV, 
Цитата

Я бы сделал так:

1. Завёл ещё один элемент arr

не хочу тебя расстаивать, но я это уже давно предложил
Читай, пожалуйста, посты внимательнее smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
XupyprMV
Дата 23.10.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 16.10.2006
Где: Сыктывкар, Россия

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



Kuvaldis, ну человек может C не знает... пишу на "родном" ему языке... Ты бы ещё на ассмемблере или на BrainFuck'е ему пример написал  smile 
PM MAIL WWW ICQ   Вверх
volvo877
Дата 23.10.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



XupyprMV, а ведь пример от Kuvaldis один в один переводится на "родной" язык, так что не надо про BrainFuck ...

Ripper, можно и без доп. массива. Здесь я делал:
Модификация двумерных массивов. Поворот матрицы на 90 градусов
PM MAIL   Вверх
Ripper
Дата 23.10.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


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

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



Спасибо всем. Щас все посмотрю, к сожалению я не знаю Си, например int** что такое (в памяти плавает указатель на указатель на указатель... но это ничего не дает. или puts() getch())
Но тут достаточно пояснений


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

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

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


 




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


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

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