1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

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

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

    Rivass Гость

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

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

    Код:
    #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 *

    Репутация:
    0
    Регистрация:
    18 май 2009
    Сообщения:
    2.442
    Симпатии:
    8
    1)

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

    DarkKnight Well-Known Member

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

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

    Araneus Гость

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

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

    DarkKnight Well-Known Member

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

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

    Araneus Гость

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

    DarkKnight Well-Known Member

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

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

    Araneus Гость

    Репутация:
    0
    можно об этом поподробнее, то есть подключаю

    #include <windows.h>

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

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

    ???
     
  9. DarkKnight

    DarkKnight Well-Known Member

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

    Araneus Гость

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

    Вот моё решение:
    <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();
    }
    вылазит что-то не совсем то:
    Задача: Транспонирование матриц (любого размера)
    и даже если сменить текст например на "Сума квадратов чётных чисел =":
    Задача: Транспонирование матриц (любого размера)
     
  11. DarkKnight

    DarkKnight Well-Known Member

    Репутация:
    0
    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код:
    Вот так реализуй черещ функцию.... Буферная переменная тут излишняя....
    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();
    }
    Добавлено: Или динамичски помять под буффер нужно выделить

    Код:
    char* showcyr(char* i)
    {
    char *buffer = new char[1024];
    memset(buffer,0,1024);
    strcpy(buffer,i);
    CharToOem(buffer,buffer);
    return buffer;
    }
     
  12. Rivass

    Rivass Гость

    Репутация:
    0
    DarkKnight125
    Огромное тебе спасибо)) Побольше бы таких программистов которые помогают начинающим)
     
Загрузка...
Похожие Темы - Задача Транспонирование матриц
  1. petiablack
    Ответов:
    0
    Просмотров:
    64
  2. disub
    Ответов:
    1
    Просмотров:
    177
  3. Kazua
    Ответов:
    1
    Просмотров:
    192
  4. Rina
    Ответов:
    0
    Просмотров:
    127
  5. School_Information

    Решите Задача

    Ответов:
    2
    Просмотров:
    254
Статус темы:
Закрыта.

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