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

Тема в разделе "C/C++/C#", создана пользователем Rivass, 16 ноя 2010.

Статус темы:
Закрыта.
  1. Rivass

    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");
    }
     
  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    1)

    mn[j];
    2) не видно вроде дин. выделения памяти.
     
  3. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Динамики действительно тут нет.... А как я понимаю это главная суть задания...

    Вот, посмотри код, должен разобратся, если будут вопросы то пиши...
    А вообще задания такого рода решаются на уровне классов... Посмотри на форуме, я описывал класс 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
      Размер файла:
      69,3 КБ
      Просмотров:
      79
  4. Araneus

    Araneus Гость

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

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

    DarkKnight Well-Known Member
    C\C++ Team

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

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

    Araneus Гость

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Я вам даже больше скажу, он не только не ругается, он даже понимает что выставил нужную кодовую страницу ;-)
    можете проверить
    ввести
    std::cout<<setlocale(LC_ALL,"Russian")

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

    Araneus Гость

    можно об этом поподробнее, то есть подключаю

    #include <windows.h>

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

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

    ???
     
  9. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Нет чуть чуть не так.... Принцип функции заключается в том, что она копирует из сорса в дестинэтион... Как и strcpy
    Тоесть примерно так...
    Определяешь буфер какой нить...
    Код (Text):
    char buffer[128] = {0};
    strcpy(buffer,"Введите размер массива : ");
    CharToOem(buffer,buffer);
    cout<<buffer;
     
  10. Araneus

    Araneus Гость

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

    Вот моё решение:
    <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">
    Код (Text):
    //---------------------------------------------------------------------------
    #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">
    Код (Text):
    //---------------------------------------------------------------------------
    #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">
    Код (Text):
    #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
     
  11. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (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;
    }
     
  12. Rivass

    Rivass Гость

    DarkKnight125
    Огромное тебе спасибо)) Побольше бы таких программистов которые помогают начинающим)
     
Загрузка...
Похожие Темы - Задача Транспонирование матриц
  1. Янчик
    Ответов:
    0
    Просмотров:
    491
  2. TrishaRay
    Ответов:
    1
    Просмотров:
    783
  3. elzim
    Ответов:
    0
    Просмотров:
    932
  4. ShaoKahn
    Ответов:
    0
    Просмотров:
    1.131
  5. eremin-sanek
    Ответов:
    3
    Просмотров:
    1.108
Статус темы:
Закрыта.

Поделиться этой страницей