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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2011, 21:17   #1
sasha502
Пользователь
 
Регистрация: 20.10.2011
Сообщений: 23
По умолчанию транспонирование матрици

создаю матрицу на СИ
Код:
#include <stdio.h>
#include <stdint.h>
#include <math.h>
int main()
{
	{
	int sk= 9;
	int sb= 3;
	int b[sk][sb];
	int  i,j;
	{
	 printf("Matrix B:\n\n");
	 for(i=0; i<sk;i++)
	{
		for(j=0; j<sb;j++)
		{
		b[i][0] = 1*i;
		b[i][1] = 3*i;
		b[i][2] = 3*i;
		
		printf("%3d",b[i][j]);
		}
	 printf("\n");
	}
     return 0;
	}
  }
}
не пойму как её транспонировать

вариант с

Код:
          temp=b[i][j];
          b[i][j]=b[j][i];
          b[j][i]=temp;
не прокатывает(

Последний раз редактировалось sasha502; 16.11.2011 в 21:33.
sasha502 вне форума Ответить с цитированием
Старый 16.11.2011, 21:35   #2
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

Код:
  temp=b[i][j];
          b[i][j]=b[j][i];
          b[j][i]=temp;
Дело точно не в этом. Стандартный свап не может не работать. Скорее всего ошибка в цикле.

Если вы использовали полный проход по матрице, то матрица остается прежней так как каждый элемент меняется два раза. Возьмите циклы по проходу выше главной диагонали.
---------------------
А нет это только для квадратной матрицы.

Надо создать новую матрицу.
Код:
int tr[sb][sk];
for(i=0; i<sk;i++)
       for(j=0; j<sb;j++)
             tr[j][i]=b[i][j];
И еще у вас не корректно написан код:
1)Две пары лишний фигурных скобок, которые совершенно не нужны;
2)Не целесообразный способ заполнения массива. Лучше сделать в два цикла: один заполняет, другой выводит. Так получается, что один и тот же элемент приравнивается к одному числу три раза.
3) И для этой программы достаточно подключить только одну библиотеку stdio.h, другие лишь занимают память и замедляют компиляцию.
Ёж птица гордая, пока не пнешь не полетит.

Последний раз редактировалось Ezhuk; 16.11.2011 в 21:47.
Ezhuk вне форума Ответить с цитированием
Старый 16.11.2011, 21:37   #3
sasha502
Пользователь
 
Регистрация: 20.10.2011
Сообщений: 23
По умолчанию

можно поподробней, где ошибка?
sasha502 вне форума Ответить с цитированием
Старый 16.11.2011, 21:45   #4
sasha502
Пользователь
 
Регистрация: 20.10.2011
Сообщений: 23
По умолчанию

как реализовать для прямоугольной матрици?
sasha502 вне форума Ответить с цитированием
Старый 16.11.2011, 22:09   #5
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

Как успехи?
Ёж птица гордая, пока не пнешь не полетит.
Ezhuk вне форума Ответить с цитированием
Старый 16.11.2011, 22:38   #6
sasha502
Пользователь
 
Регистрация: 20.10.2011
Сообщений: 23
По умолчанию

пробывал, в часть значений в мусор записывается
sasha502 вне форума Ответить с цитированием
Старый 16.11.2011, 23:08   #7
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

Выложите код.
Ёж птица гордая, пока не пнешь не полетит.
Ezhuk вне форума Ответить с цитированием
Старый 17.11.2011, 00:29   #8
sasha502
Пользователь
 
Регистрация: 20.10.2011
Сообщений: 23
По умолчанию

ну смысл в том что если если одну матрицу приравнивать к другой a[3][10]=b[10][3], то тогда вовремя цикла строки при переносе из столбца в строку и наоборот бедет не хватать данных
sasha502 вне форума Ответить с цитированием
Старый 17.11.2011, 00:47   #9
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

Код:
#include<iostream>
#include<cmath>
using namespace std;
int **matr(int &sk,int &sb);//инициализация
int in_m(int**m,int &sk,int &sb);//заполнения
int out_m(int**m,int &sk,int &sb);//вывод матрица
int** trasp(int**m,int &sk,int &sb);//транспортировка матрицы
int free(int **M,int &sk);//удаления матрицы
int main(){
	setlocale(LC_ALL,"Russian");
	int **M,**M_t; 
	int sk,sb;
	int sk_t,sb_t;
	cout<<"строки m= ";
	cin>>sk;
	cout<<"столбцы n= ";
	cin>>sb;
	M=matr(sk,sb);
	cout<<"заполним матрицу \n";
	in_m(M,sk,sb);
	out_m(M,sk,sb);

	cout<<"выведем транспорт матрицу\n";
	M_t=trasp(M,sk,sb);
	sk_t=sb;
	sb_t=sk;
	out_m(M_t,sk_t,sb_t);
	free(M,sk);
	free(M_t,sk_t);
	system("pause");
	return 0;
}
//////***иниц. матр.***////////////
int **matr(int &sk,int &sb){
	int **mass;
	mass =new int*[sk];
	for(int i=0;i<sk;i++)
		mass[i]=new int [sb];
	return mass;
}
///////***ввод данных***////////////
int in_m(int**m,int &sk,int &sb){
	for(int x=0;x<sk;x++)
		for(int y=0;y<sb;y++){
			cin>>m[x][y];	
		}
	return 0;
}

//////***вывод матр ***/////////////
int out_m(int**m,int &sk,int &sb){
	for(int x=0;x<sk;x++){
		for(int y=0;y<sb;y++)
			cout<<m[x][y]<<'\t';
		cout<<endl;
	}
	return 0;
}
//////***транспортировка  матр ***/////////////
int **trasp(int**m,int &sk,int &sb){
	int **temp=matr(sb,sk);
	for(int x=0;x<sk;x++){
		for(int y=0;y<sb;y++)
			temp[y][x]=m[x][y];
	}
	return temp;
}
//////***удалить матрицу ***/////////////
int free(int **M,int &sk){
	for(int x=0;x<sk;x++)
		delete[] M[x];
	delete[] M;
	return 0;
}
_kilik_ вне форума Ответить с цитированием
Старый 17.11.2011, 01:02   #10
sasha502
Пользователь
 
Регистрация: 20.10.2011
Сообщений: 23
По умолчанию

это плюсы ?
sasha502 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определител квадратной матрици... sllh_111 Фриланс 4 11.02.2010 09:35
умножить матрици alexz29 Общие вопросы C/C++ 1 11.12.2009 13:18
Поворот матрици(С++) Lemo Помощь студентам 1 21.10.2009 19:31
матрици Forro Паскаль, Turbo Pascal, PascalABC.NET 5 14.04.2008 20:31
Pascal. Матрици. ProPaL Помощь студентам 9 10.02.2008 01:13