• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

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

Rivass

Задача:
Вводится матрица целых чисел 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");
}
 
Динамики действительно тут нет.... А как я понимаю это главная суть задания...

Вот, посмотри код, должен разобратся, если будут вопросы то пиши...
А вообще задания такого рода решаются на уровне классов... Посмотри на форуме, я описывал класс 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); //Очистим память матрицы

}
 

Вложения

  • zd22.jpg
    zd22.jpg
    40,2 КБ · Просмотры: 1 122
to DarkKnight125
скажи пожалуйста, в какой среде ты компилишь проги. Просто уже не первый пост от тебя, где есть такая строчка:

Код:
 setlocale(LC_ALL,"Russian");

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

P.S. Я пишу в MS Visual Studio 2010... Но setlocale() - будет работать на всем кроме Buildera....
 
ясно, спасибо.
Хотя самое интересное, что билдер на эту строчку даже не ругаеться
 
ясно, спасибо.
Хотя самое интересное, что билдер на эту строчку даже не ругаеться
Я вам даже больше скажу, он не только не ругается, он даже понимает что выставил нужную кодовую страницу ;-)
можете проверить
ввести
std::cout<<setlocale(LC_ALL,"Russian")

Но каким то внутринним алгоритмом он игнорирует локаль во всех ее проявлениях....
даже cout.imbue он тоже игнорирует
 
Нет чуть чуть не так.... Принцип функции заключается в том, что она копирует из сорса в дестинэтион... Как и strcpy
Тоесть примерно так...
Определяешь буфер какой нить...
Код:
char buffer[128] = {0};
strcpy(buffer,"Введите размер массива : ");
CharToOem(buffer,buffer);
cout<<buffer;
 
А метода попроще нету?
Допустим моё задание по лабе выглядит так :Написать программу, которая выводит сумму квадратов первых чётных числел:

Вот моё решение:
<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
 
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;
}
 
DarkKnight125
Огромное тебе спасибо)) Побольше бы таких программистов которые помогают начинающим)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!