Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2012, 15:29   #1
che91
Пользователь
 
Аватар для che91
 
Регистрация: 25.11.2010
Сообщений: 15
Вопрос транспонирование прямоугольной матрицы

Вроде простая задачка, но я сообразить не могу
Пишу:
Код:
program M_N_K;

uses wincrt;

const row=4;
      col=3;

type matr=array [1..row,1..col] of integer;
     vect=array [1..row] of integer;

var i,j : byte;
	X, B: vect;
	A, A_T, A_O: matr;
    k,n: integer;

BEGIN
k:=0;
for i:=1 to col do
  begin
    clrscr;
    for j:=1 to row do
      begin
      k:=k+1;
      A[j,i]:=k;

      end;
  end;
for i:=1 to row do
  begin
    for j:=1 to col do
      write(A[i,j]:4);
      writeln;
  end;

writeln('col ', col);
writeln('row ',row);
writeln;

i:=0;
J:=0;


for i:=1 to row do
  begin
    for j:=1 to col do
       begin
         A_T[j,i]:=A[i,j];
       end;
  end;

writeln;
for i:=1 to col do
  begin
    for j:=1 to row do
      write(A_T[i,j]:4);
      writeln;
  end;

END.
Вывод последней матрицы:
1 2 3 4
4 6 7 8
8 10 11 12

Как преобразовать эту часть:
Код:
for i:=1 to row do
  begin
    for j:=1 to col do
       begin
         A_T[j,i]:=A[i,j];
       end;
  end;
для получения результата?
Заранее благодарен

Последний раз редактировалось che91; 11.02.2012 в 16:31.
che91 вне форума Ответить с цитированием
Старый 11.02.2012, 16:16   #2
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Вот сообщение подходящее, правда для с++.
Цитата:
Сообщение от Гром Посмотреть сообщение
Код:
for (int i = 0; i < n - 1; i++)
 for (int j = i + 1; j < n; j++)
  swap(a[i][j], a[j][i]);
Ну а уж как реализовать функцию обмена значений между двумя переменными (swap) - оставляется читателю в качестве несложного домашнего упражнения. Благо задача эта даже не классическая, а боянистая.
На Pascal будет примерно так:
Код:
for i:=1 to n-1 do
for j:=1 to n do
swap (a[i,j],a[j,i]
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 11.02.2012, 16:26   #3
che91
Пользователь
 
Аватар для che91
 
Регистрация: 25.11.2010
Сообщений: 15
По умолчанию

Матрица прямоугольная, n -- это число строк или столбцов?
И есть подозрение, что я пару часов назад это уже пробовал, и не дало желаемого
Я уже как только не извращался, гугл не дает однозначной и полезной инфы(
che91 вне форума Ответить с цитированием
Старый 11.02.2012, 16:26   #4
che91
Пользователь
 
Аватар для che91
 
Регистрация: 25.11.2010
Сообщений: 15
По умолчанию

С синтаксисом Си я знаком, можно и на Си, если вам так удобнее
che91 вне форума Ответить с цитированием
Старый 11.02.2012, 16:32   #5
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Во 2м цикле заменить n на m, ошибся. n - строки, m - столбцы.
Главный вопрос и он же проблема - в том, что матрицу (даже прямоугольную) в паскале нужно изначально объявлять квадратной с размером max(n,m), чтобы не было выхода за границы массива.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 11.02.2012, 16:35   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

che91, ничего не получится у Вас при таком подходе.

очевидно же, что если исходная матрица не квадратная (прямоугольная) и имеет размерность row x col
то транспонированная будет иметь размерность col x row

Ну и переменные для соответствующие матриц должны иметь такие размерности.
В вашем же случае исходная и траспонированная имеют одинаковую размерность. Это неправильно!

Добавлено

Цитата:
Главный вопрос и он же проблема - в том, что матрицу (даже прямоугольную) в паскале нужно изначально объявлять квадратной с размером max(n,m), чтобы не было выхода за границы массива.
или так.
или делать различные объявления (разную размерность) для исходной и траспонированной матриц:
Код:

var A : array [1..row,1..col] of integer;
     A_T : array [1..col,1..row] of integer;

Последний раз редактировалось Serge_Bliznykov; 11.02.2012 в 16:38.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.02.2012, 16:36   #7
che91
Пользователь
 
Аватар для che91
 
Регистрация: 25.11.2010
Сообщений: 15
По умолчанию

Но если её объявит квадратной, то при замене эл-ты не встанут на нужные места, была идея в текстовый документ записать и считывать оттуда. но это как то совсем по-нупски
Код:
for i:=1 to col do
  begin
    for j:=1 to row do
       begin
         A_T[i,j]:=A[j,i];
       end;
  end;
это не решает проблемы.. или я туплю уже просто.

Последний раз редактировалось che91; 11.02.2012 в 16:40.
che91 вне форума Ответить с цитированием
Старый 11.02.2012, 16:43   #8
che91
Пользователь
 
Аватар для che91
 
Регистрация: 25.11.2010
Сообщений: 15
По умолчанию

Спасибо, товарищи! глаза мне открыли, туплю сижу весь вечер.
che91 вне форума Ответить с цитированием
Старый 11.02.2012, 16:45   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Но если её объявит квадратной, то при замене эл-ты не встанут на нужные места,
глупости! Встанут куда надо.
Нужно только помнить, что у Вас есть число строк (row) и число столбцов (col). В транспонированной матрице они взаимно поменяют свой смысл (число строк станет числом столбцов и наоборот), но значения у них останутся! Нужно не забывать их использовать в циклах и всё у Вас получится!


p.s. кстати, а зачем Вам траспонировать матрицу то?!
Если вы будете к исходной обращаться в обратном порядке. и не нужно никакой дополнительной структуры!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.02.2012, 16:46   #10
che91
Пользователь
 
Аватар для che91
 
Регистрация: 25.11.2010
Сообщений: 15
По умолчанию

Всё работает, свою глупейшую ошибку исправил, как мне вас отблагодарить?
che91 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транспонирование матрицы Vally Помощь студентам 0 28.12.2011 20:37
Программа вычисления прямоугольной матрицы на вектор. Настёнка1512 Помощь студентам 1 02.01.2011 08:53
транспонирование матрицы 6*6 на си fatefighter Общие вопросы C/C++ 1 17.03.2010 21:12
Упорядочить строку целочисленной прямоугольной матрицы Woodyy Паскаль, Turbo Pascal, PascalABC.NET 8 06.06.2009 17:15
Задача на элементы прямоугольной матрицы Knife Помощь студентам 3 08.04.2009 22:00