Задача: Транспонирование матриц (любого размера)

  • Автор темы Rivass
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Rivass

Гость
#1
Задача:
Вводится матрица целых чисел A размерами N × M (N - количество строк, M - ко-личество столбцов). Вывести транспонированную матрицу. Динамическое выделе-ние памяти для матрицы и освобождение выделенной памяти реализовать в виде двух функций.

Подскажите пожалуйста в чем ошибка моего кода?

C++:
#include <stdio.h>
#include <iostream>
int n,m;
void main()
{
setlocale(LC_ALL,"Russian");

int mn[50][50];
printf_s("Введите размеры матрицы NxM:\n");
scanf_s("%d %d",&n,&m);
printf_s("Введите значения массива, %d на %d:\n",n,m);
for (int i=0; i<n; i++) 
for (int j=0; j<m; j++) 
scanf_s("%d",&mn[i][j]);

for (int i = 0; i < n; i++) 
for (int j = 0; j < m; j++) 
{ 
int tm = mn[i][i]; 
mn[i][j] = mn[j][i]; 
mn[j][i] = tm; 
}
printf_s("Транспорированная матрица:\n");

for (int i=0; i<n; i++) 
for (int j=0; j<m; j++)
printf_s("%d ",mn[j][i]);
printf_s("\n");
}
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#3
Динамики действительно тут нет.... А как я понимаю это главная суть задания...

Вот, посмотри код, должен разобратся, если будут вопросы то пиши...
А вообще задания такого рода решаются на уровне классов... Посмотри на форуме, я описывал класс TMatrix.
C++:
/*
codeby.net
Autor: DarkKnight125
*/

#include <iostream>
#include <time.h>

using namespace std;

//Функция выделения памяти для матрицы
int** InitMatrix (int n, int m) 
{
int **Matrix = new int*[n];
for (int i=0; i<n; i++)
Matrix[i] = new int [m];
return Matrix;
}

//Функция освобождения памяти для матрицы
void DeleteMatrix (int **Matrix, int n, int m)
{
for (int i = 0; i<n; i++)
delete[] Matrix[i];
delete[] Matrix;
}

//Функция транспонирования матрицы
int** TranspMatrix (int **Matrix, int& n, int& m)
{
int **tMatrix = InitMatrix(m,n);

for (int i = 0; i<m; i++)
for (int j=0; j<n; j++)
tMatrix[i][j] = Matrix[j][i];
int temp = n;
n = m;
m = temp;

return tMatrix;
}

//Функция вывода матрицы на экран
void PrintMatrix (int **Matrix, int n, int m)
{
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
cout<<Matrix[i][j]<<" ";
cout<<endl;
}
}

//Основная функция программы
void main(void)
{
setlocale(LC_ALL,"Russian"); //Установим локаль в .1251
srand(time(NULL)); //Инициализация генератора случайно величины
int n,m; //размерность матрицы
int **Matrix; //Наша матрица
cout<<"Введите кол-во строк в матрицы n = ";
cin>>n; //Введем n
cout<<"Введите кол-во столбцов матрицы m = ";
cin>>m; //Введем m
Matrix = InitMatrix(n,m); //Выделим память для матрицы

//Заполним матрицу случайными величинами
for (int i = 0; i<n; i++)
for (int j=0; j<m; j++)
Matrix[i][j] = rand()%100;

cout<<"Получена Матрица:"<<endl;
PrintMatrix(Matrix,n,m); //Выведим на экран матрицу

Matrix = TranspMatrix(Matrix,n,m); //Транспонирование матрицы

cout<<endl<<"Транспонированная матрица:"<<endl;
PrintMatrix(Matrix,n,m); 
DeleteMatrix(Matrix,n,m); //Очистим память матрицы

}
 

Вложения

A

Araneus

Гость
#4
to DarkKnight125
скажи пожалуйста, в какой среде ты компилишь проги. Просто уже не первый пост от тебя, где есть такая строчка:

Код:
 setlocale(LC_ALL,"Russian");
Я так понял, что это должно дать поддержку кириллици в консольном приложении.
Я попробовал сделать также, но у меня в C++ Builder 2010 почему-то кириллица всё-равно выводиться крякозябрами разными.
Или ты что-то еще изменяешь в настройках самой проги?
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#5
Я так понял, что это должно дать поддержку кириллици в консольном приложении.
Я попробовал сделать также, но у меня в C++ Builder 2010 почему-то кириллица всё-равно выводиться крякозябрами разными.
Или ты что-то еще изменяешь в настройках самой проги?
Нет, просто в Borland C++ Builder действительно есть проблемы с реализацией локали.... У них свое собственное интересное определение идет какое то, далекое от стандарта, так что если хочешь получить кириллицу в консоле все же придется юзать:
#include <windows.h>
CharToOem();
Ну или для консольных приложений выбрать другую среду...

P.S. Я пишу в MS Visual Studio 2010... Но setlocale() - будет работать на всем кроме Buildera....
 
A

Araneus

Гость
#6
ясно, спасибо.
Хотя самое интересное, что билдер на эту строчку даже не ругаеться
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#7
ясно, спасибо.
Хотя самое интересное, что билдер на эту строчку даже не ругаеться
Я вам даже больше скажу, он не только не ругается, он даже понимает что выставил нужную кодовую страницу ;-)
можете проверить
ввести
std::cout<<setlocale(LC_ALL,"Russian")

Но каким то внутринним алгоритмом он игнорирует локаль во всех ее проявлениях....
даже cout.imbue он тоже игнорирует
 
A

Araneus

Гость
#8
что если хочешь получить кириллицу в консоле все же придется юзать:
#include <windows.h>
CharToOem();
можно об этом поподробнее, то есть подключаю

#include <windows.h>

а потом в самой проге пишу нечто типа:

cout<<CharToOem("мой текст");

???
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#9
Нет чуть чуть не так.... Принцип функции заключается в том, что она копирует из сорса в дестинэтион... Как и strcpy
Тоесть примерно так...
Определяешь буфер какой нить...
Код:
char buffer[128] = {0};
strcpy(buffer,"Введите размер массива : ");
CharToOem(buffer,buffer);
cout<<buffer;
 
A

Araneus

Гость
#10
А метода попроще нету?
Допустим моё задание по лабе выглядит так :Написать программу, которая выводит сумму квадратов первых чётных числел:

Вот моё решение:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">без кириллицы</div></div><div class="sp-body"><div class="sp-content">
Код:
//---------------------------------------------------------------------------
#include <conio.h>  
#include <iostream.h>
#include <stdio.h>  
//---------------------------------------------------------------------------
void main ()
{
int sum=0;
for (int i = 1; i <= 10; i++)
{
sum=sum+i*2*i*2;
}
clrscr();
cout << "Sum of quad of 10 first pair numbers is \t" << sum;
getch();
}
Но с использованием кириллицы этот код должен выглядеть так:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">с кириллицей</div></div><div class="sp-body"><div class="sp-content">
Код:
//---------------------------------------------------------------------------
#include <conio.h>  
#include <iostream.h>
#include <stdio.h> 
#include <windows.h>
//---------------------------------------------------------------------------
void main ()
{
int sum=0;
for (int i = 1; i <= 10; i++)
{
sum=sum+i*2*i*2;
}
clrscr();

char buffer[128] = {0};
strcpy(buffer,"Сумма квадратов первых чётных чисел равняеться :");
CharToOem(buffer,buffer);
cout<<buffer<< "\t" << sum;

getch();
}
так оно работает, но при попытке сделать это в виде функции:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">как функция</div></div><div class="sp-body"><div class="sp-content">
Код:
#include <conio.h> 
#include <iostream.h>
#include <stdio.h>  
#include <windows.h> 
//---------------------------------------------------------------------------
char* showcyr(char* i)
{
char buffer[256] = {0};
strcpy(buffer,i);
CharToOem(buffer,buffer);
return buffer;
}
//---------------------------------------------------------------------------
void main ()
{
int sum=0;
for (int i = 1; i <= 10; i++)
{
sum=sum+i*2*i*2;
}
clrscr();
cout<<showcyr("Сума квадратов первых десяти чётных чисел =")<<"\t"<<sum;
getch();
}
вылазит что-то не совсем то:
Untitled_1.jpg
и даже если сменить текст например на "Сума квадратов чётных чисел =":
Untitled_2.jpg
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#11
C++:
Вот так реализуй черещ функцию.... Буферная переменная тут излишняя....
char* showcyr(char* i)
{
CharToOem(i,i);
return i;
}
//---------------------------------------------------------------------------
void main ()
{
int sum=0;
for (int i = 1; i <= 10; i++)
{
sum=sum+i*2*i*2;
}
clrscr();
cout<<showcyr("ТестTest")<<sum;
getch();
}
Добавлено: Или динамичски помять под буффер нужно выделить

C++:
char* showcyr(char* i)
{
char *buffer = new char[1024];
memset(buffer,0,1024);
strcpy(buffer,i);
CharToOem(buffer,buffer);
return buffer;
}
 
R

Rivass

Гость
#12
DarkKnight125
Огромное тебе спасибо)) Побольше бы таких программистов которые помогают начинающим)
 
Статус
Закрыто для дальнейших ответов.