Программа с матрицами

Тема в разделе "Общие вопросы по С и С++", создана пользователем koka278, 12 дек 2010.

  1. koka278

    koka278 New Member

    Регистрация:
    12 дек 2010
    Сообщения:
    3
    Симпатии:
    0
    Здравствуйте, помогите пожалуйста дописать. Нужно было реализовать в виде модуля, программку, которая выполняет действия над квадратными матрицами:
    1) нахождение определителя матрицы
    2) сложение 2х матриц
    3) умножение 2х матриц
    4) транспонирование матрицы

    Как не пробывал, но что-то 2,3,4 не получается
    вот что уже написал:
    Код (C++):
    #include <iostream.h>
    #include <math.h>
    #include <windows.h>


    char FileName[256];
    char Stroka[100];
    char RusText[100];
    char *slovo;

    double **Matrix,**Matrix2,Osndet;
    int i,j,N=0;
    double Determinant()
    {
    int maxl,k;
    double del, det=1,d;

    //приведение матрицы к треугольному виду
    for(k=0;k<N-1;k++)
    {            
    maxl=k;
    for(i=k+1;i<N;i++)
    {
    if(abs(Matrix[i][k])>abs(Matrix[k][k]))
    {
    maxl=i;
    }
    }
    if(maxl!=k)//если максимальный элемент не на диагонали, тогда переставляем строки с учетом изменения определителя
    {
    det=det*(-1);
    for(j=0;j<N;j++)
    {
    d=Matrix[k][j];
    Matrix[k][j]=Matrix[maxl][j];
    Matrix[maxl][j]=d;
    }
    }
    if(Matrix[k][k]!=0)
    {
    for(i=k+1;i<N;i++)
    {
    del=Matrix[i][k]/Matrix[k][k];
    for(j=0;j<N;j++)
    {
    Matrix[i][j]=Matrix[i][j]-del*Matrix[k][j];//вычитание верхней строки от нижних
    }

    }
    }
    else
    {
    return 0;
    }
    }
    //вычисление определителя путем премножения диагональных элементов
    for(i=0;i<N;i++)
    det*=Matrix[i][i];   
    return det;
    }


    main()
    {
    char RusMatrVvd[20],RusMatrStr[15],RusMatrStlb[15];
    CharToOem("Введите элемент ",RusMatrVvd);
    CharToOem("-ой стоки ",RusMatrStr);
    CharToOem("-ого столбца: ",RusMatrStlb);
    CharToOem("Введите размерность квадратной матрицы : ",RusText);               
    cout<<RusText;
    cin>>N;
    Matrix=new double*[N];           
    for(i=0;i<N;i++)               
    {    
    Matrix[i]=new double[N];
    for(j=0;j<N;j++)
    {
    cout<<RusMatrVvd<<i+1<<RusMatrStr<<j+1<<RusMatrStlb;
    cin>>Matrix[i][j];
    }
    }

    CharToOem("Исходная матрица:",RusText);
    cout<<endl<<RusText<<endl;
    for(i=0;i<N;i++)
    {
    for(j=0;j<N;j++)
    {
    cout<<Matrix[i][j]<<"\t";
    }
    cout<<endl;
    }

    CharToOem("Что делать? ",RusText);                  
    cout<<endl<<RusText<<endl;
    CharToOem("1 - Вычисление определителя матрицы",RusText);
    cout<<endl<<RusText<<endl;
    CharToOem("2 - Сложение двух матриц ",RusText);
    cout<<endl<<RusText<<endl;
    CharToOem("3 - Умножение одной матрицы на другую ",RusText);
    cout<<endl<<RusText<<endl;
    CharToOem("4 - Нахождение транспонированной матрицы ",RusText);
    cout<<endl<<RusText<<endl<<endl;
    int vop1;
    cin>>vop1;
    switch(vop1)
    {
    case 1:
    {
    Osndet = Determinant();
    CharToOem("Определитель равен: ",RusText);
    cout<<endl<<RusText<<Osndet<<endl;
    break;
    }

    case 2:
    {
    CharToOem("Введите элементы второй матрицы : ",RusText);       
    cout<<RusText<<endl;
    Matrix2=new double*[N];          
    for(i=0;i<N;i++)           
    {    
    Matrix2[i]=new double[N];
    for(j=0;j<N;j++)
    {
    cout<<RusMatrVvd<<i+1<<RusMatrStr<<j+1<<RusMatrStlb;
    cin>>Matrix2[i][j];
    }
    }

    CharToOem("Вторая матрица:",RusText);
    cout<<endl<<RusText<<endl;
    for(i=0;i<N;i++)
    {
    for(j=0;j<N;j++)
    {
    cout<<Matrix2[i][j]<<"\t";
    }
    cout<<endl;
    }
    //дальше не знаю как сложить
    }
    break;
    }
    case 3:
    {
    //помогите умножить

    case 4:
    {
    //помогите найти транспонированную матрицу
    }
    getch();
    return 0;
    }
    и еще чтобы, после выполнения программа не завершала работу, а спрашивала "выполнить что-нибудь еще?"
     
  2. koka278

    koka278 New Member

    Регистрация:
    12 дек 2010
    Сообщения:
    3
    Симпатии:
    0
    Вот я доделал,если кому-то пригодится
    Код (C++):
    #include <iostream.h>
    #include <math.h>
    #include <windows.h>



    char FileName[256];
    char Stroka[100];
    char RusText[100];
    char *slovo;

    double **Matrix,**Matrix2,**Matrix3,**Matrix4,**Matrix5,**Matrix6,det;
    int i,j,N=0,vop;

    //вычисление определителя
    double Determinant()
    {
    int maxl,k;
    double del, det=1,d;

    //приведение матрицы к треугольному виду
    for(k=0;k<N-1;k++)
    {            
    maxl=k;
    for(i=k+1;i<N;i++)
    {
    if(fabs(Matrix[i][k])>fabs(Matrix[k][k]))
    {
    maxl=i;
    }
    }
    if(maxl!=k)//если максимальный элемент не на диагонали, тогда переставляем строки с учетом изменения определителя
    {
    det=det*(-1);
    for(j=0;j<N;j++)
    {
    d=Matrix[k][j];
    Matrix[k][j]=Matrix[maxl][j];
    Matrix[maxl][j]=d;
    }
    }
    if(Matrix[k][k]!=0)
    {
    for(i=k+1;i<N;i++)
    {
    del=Matrix[i][k]/Matrix[k][k];
    for(j=0;j<N;j++)
    {
    Matrix[i][j]=Matrix[i][j]-del*Matrix[k][j];//вычитание верхней строки от нижних
    }

    }
    }
    else
    {
    return 0;
    }
    }
    //вычисление определителя путем премножения диагональных элементов
    for(i=0;i<N;i++)
    det*=Matrix[i][i];   
    return det;
    }


    //транспонирование
    double transpon()
    {
    Matrix6=new double*[N];
    for (int i=0; i<N; i++)
    {
    Matrix6[i]=new double[N];
    for (int j=0; j<N; j++)
    {
    Matrix6[i][j] = Matrix[j][i];
    cout<<Matrix6[i][j]<<"\t";
    }
    cout<<endl;
    }

    return 0;
    }
    // сложение двух матриц
    double slozhenie()
    {

    Matrix3=new double*[N];
    for (int i=0; i<N; i++)
    {
    Matrix3[i]=new double[N];
    for (int j=0; j<N; j++)
    {
    Matrix3[i][j] = Matrix[i][j] + Matrix2[i][j];
    cout<<Matrix3[i][j]<<"\t";
    }
    cout<<endl;
    }

    return 0;
    }

    // умножение двух матриц
    double umnozhenie()
    {

    Matrix5=new double*[N];  
    for (int i=0; i<N; i++)
    {                  
    Matrix5[i]=new double[N];
    for (int j=0; j<N; j++)
    {
    Matrix5[i][j]=0;
    for(int k=0;k<N;k++)
    Matrix5[i][j] +=Matrix[i][k]*Matrix4[k][j];
    }
    }


    return 0;
    }


    main()
    {
    do
    {
    char RusMatrVvd[20],RusMatrStr[15],RusMatrStlb[15];
    CharToOem("Введите элемент ",RusMatrVvd);
    CharToOem("-ой стоки ",RusMatrStr);
    CharToOem("-ого столбца: ",RusMatrStlb);
    CharToOem("Введите размерность квадратной матрицы : ",RusText);               
    cout<<RusText;
    cin>>N;
    Matrix=new double*[N];           
    for(i=0;i<N;i++)               
    {    
    Matrix[i]=new double[N];
    for(j=0;j<N;j++)
    {
    cout<<RusMatrVvd<<i+1<<RusMatrStr<<j+1<<RusMatrStlb;
    cin>>Matrix[i][j];
    }
    }

    CharToOem("Исходная матрица:",RusText);
    cout<<endl<<RusText<<endl;
    for(i=0;i<N;i++)
    {
    for(j=0;j<N;j++)
    {
    cout<<Matrix[i][j]<<"\t";
    }
    cout<<endl;
    }


    CharToOem("Что делать? ",RusText);                  
    cout<<endl<<RusText<<endl;
    CharToOem("1 - Вычисление определителя матрицы",RusText);
    cout<<endl<<RusText<<endl;
    CharToOem("2 - Сложение двух матриц ",RusText);
    cout<<endl<<RusText<<endl;
    CharToOem("3 - Умножение одной матрицы на другую ",RusText);
    cout<<endl<<RusText<<endl;
    CharToOem("4 - Нахождение транспонированной матрицы ",RusText);
    cout<<endl<<RusText<<endl<<endl;
    int vop1;
    cin>>vop1;
    switch(vop1)
    {
    case 1:
    {
    det = Determinant();
    CharToOem("Определитель равен: ",RusText);
    cout<<endl<<RusText<<det<<endl;
    break;
    }

    case 2:
    {
    CharToOem("Введите элементы второй матрицы : ",RusText);       
    cout<<RusText<<endl;
    Matrix2=new double*[N];          
    for(i=0;i<N;i++)           
    {    
    Matrix2[i]=new double[N];
    for(j=0;j<N;j++)
    {
    cout<<RusMatrVvd<<i+1<<RusMatrStr<<j+1<<RusMatrStlb;
    cin>>Matrix2[i][j];
    }
    }

    CharToOem("Вторая матрица:",RusText);
    cout<<endl<<RusText<<endl;
    for(i=0;i<N;i++)
    {
    for(j=0;j<N;j++)
    {
    cout<<Matrix2[i][j]<<"\t";
    }
    cout<<endl;
    }
    CharToOem("Сумма:",RusText);
    cout<<endl<<RusText<<endl;
    slozhenie();
    break;
    }
    case 3:
    {
    CharToOem("Введите элементы второй матрицы : ",RusText);       
    cout<<RusText<<endl;
    Matrix4=new double*[N];          
    for(i=0;i<N;i++)           
    {    
    Matrix4[i]=new double[N];
    for(j=0;j<N;j++)
    {
    cout<<RusMatrVvd<<i+1<<RusMatrStr<<j+1<<RusMatrStlb;
    cin>>Matrix4[i][j];
    }
    }

    CharToOem("Вторая матрица:",RusText);
    cout<<endl<<RusText<<endl;
    for(i=0;i<N;i++)
    {
    for(j=0;j<N;j++)
    {
    cout<<Matrix4[i][j]<<"\t";
    }
    cout<<endl;
    }
    CharToOem("Произведение:",RusText);
    cout<<endl<<RusText<<endl;
    umnozhenie();
    for(i=0;i<N;i++)
    {
    for(j=0;j<N;j++)
    {
    cout<<Matrix5[i][j]<<"\t";
    }
    cout<<endl;
    }
    break;
    }
    case 4:
    {
    CharToOem("Транспонированная матрица:",RusText);
    cout<<endl<<RusText<<endl;
    transpon();
    break;
    }
    }




    CharToOem("Завершить работу?",RusText);
    cout<<endl<<RusText<<endl;
    CharToOem("1 - Да",RusText);
    cout<<endl<<RusText<<endl;
    CharToOem("2 - Нет ",RusText);
    cout<<endl<<RusText<<endl;
    cin>>vop;
    }
    while(vop!=1);

    return 0;
    }
     
  3. ensane

    ensane Гость

    koka278, зачем матрицу к треугольному виду при нахождении определителя приводишь? Это в задании так сказано?
    Плюс технический вопрос: вы классы уже проходили?
     
Загрузка...

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