Potęgowanie macierzy.

0

Witam. Jestem początkującym programistą. Bardzo początkującym. :)
Za zadanie mam napisać program z potęgowaniem macierzy.
Niby coś starałem się napisać i myślałem, że ma to ręce i nogi, ale niestety mam nieprawidłowe wyniki.
Może ktoś zerknąć?

#include <iostream>

using namespace std;

int main()
{
    int n, p, y;
    cout << "To program do potegowania macierzy!\n\nPodaj wymiar macierzy kwadratowej(maksymalnie 5): " << endl;
    cin >> n;
    double macierz[5][5];
    for (int j = 0; j < n ; j++)
        for (int i = 0; i < n ; i ++)
        {
            cout << "Podaj wartosc liczby zapisanej w " << j+1 << "wierszu i " << i+1 << "kolumnie." << endl;
            cin >> macierz[j][i];
        }
    cout << "Oto podana macierz:" << endl;

    for (int j = 0; j < n ; j++)
    {
        for (int i = 0; i < n ; i ++)
        {
            cout << macierz[j][i] <<"\t\t" ;
        }
        cout << endl;
    }

    cout << "Ktora potege tej macierzy chcesz wyznaczyc?" << endl;
    cin >> p;

    double potega1[5][5];
    double potega2[5][5];
    double s;
    for (int j = 0; j < n ; j++)
        {
            for (int i = 0; i < n ; i ++)
            {
                for (int k = 0; k<n; k++) s += macierz[j][k] * macierz[k][i];
                potega1[j][i] = s;
            }
        }
    s=0;
    y=2;

    while (y <= p)
    {
        if (y%2==0)
        {
            for (int j = 0; j < n ; j++)
            {
                for (int i = 0; i < n ; i ++)
                {
                    for (int k = 0; k<n; k++) s += potega1[j][k] * macierz[k][i];
                    potega2[j][i] = s;
                }
            }
            s=0;
        }
        else
            {
                for (int j = 0; j < n ; j++)
                {
                    for (int i = 0; i < n ; i ++)
                    {
                        for (int k = 0; k<n; k++) s += potega2[j][k] * macierz[k][i];
                        potega1[j][i] = s;
                    }
                }
                s=0;
            }
        y++;
    }

    cout << "\n\nOto wynik potegowania:" << endl;

    if (y%2==0)
    {
        for (int j = 0; j < n ; j++)
        {
        for (int i = 0; i < n ; i ++)
        {
            cout << potega2[j][i]<<"\t\t" ;
        }
        cout << endl;
        }
    }
    else
        {
        for (int j = 0; j < n ; j++)
        {
        for (int i = 0; i < n ; i ++)
        {
           cout << potega1[j][i]<<"\t\t" ;
        }
        cout << endl;
        }
    }

    return 0;
}

Wiem, że ten kod to pewnie dla większości sieczka, ale tak do tego potęgowania umiałem tylko podejść.

edit: zmieniłem kod o 22:59.

0

Podziel to na funkcje!

  • drukujMacierz
  • wczytajMacierz
  • pomnozMacierze
  • potengujMacierz

a na pewno znajdziesz problem sam, względnie przy podziale na funkcje problem sam się wyeliminuje.

0

To zastosuj się do tego co napisał @MarekR22 lub zapoznaj się z http://www.cs.cmu.edu/~gilpin/tutorial/

0

Problem na bank jest gdzieś tu:

cout << "Ktora potege tej macierzy chcesz wyznaczyc?" << endl;
    cin >> p;

    double potega1[5][5];
    double potega2[5][5];
    double s;
    /*for (int j = 0; j < n ; j++)
        {*/
        int j =0;
            for (int i = 0; i < n ; i ++)
            {
                for (int k = 0; k<n; k++)
                {
                s += macierz[j][k] * macierz[k][i];
                }
                potega1[j][i] = s;
                j++;
            }
        //}
    s=0;
    y=2;

    while (y <= p)
    {
        if (y%2==0)
        {
            /*for (int j = 0; j < n ; j++)
            {*/
            j =0;
                for (int i = 0; i < n ; i ++)
                {
                    for (int k = 0; k<n; k++) s += potega1[j][k] * macierz[k][i];
                    potega2[j][i] = s;
                    j++;
                }
            //}
            s=0;
        }
        else
            {
                /*for (int j = 0; j < n ; j++)
                {*/
                j=0;
                    for (int i = 0; i < n ; i ++)
                    {
                        for (int k = 0; k<n; k++) s += potega2[j][k] * macierz[k][i];
                        potega1[j][i] = s;
                        j++;
                    }
                //}
                s=0;
            }
        y++;
    }

    cout << "\n\nOto wynik potegowania:" << endl;

    if (p%2==0)
    {
        for (int j = 0; j < n ; j++)
        {
        for (int i = 0; i < n ; i ++)
        {
            cout << potega2[j][i]<<"\t\t" ;
        }
        cout << endl;
        }
    }
    else
        {
        for (int j = 0; j < n ; j++)
        {
        for (int i = 0; i < n ; i ++)
        {
           cout << potega1[j][i]<<"\t\t" ;
        }
        cout << endl;
        }
    }

    return 0; 

Jakby ktoś to dojrzał, to proszę o radę.

0

brakuje s=0;, poza tym źle liczysz tą potęgę.
Naprawdę posłuchaj mojej rady i podziel to na funkcje! Nie musisz dużo przepisać, większość to będzie copy paste.
Zacznij od

typedef double Macierz[5][5];
void pomnozMacierze(Macierz a, Macierz b, int n, Macierz wynik) {
    for (int i=0; i<n; ++i) 
    for (int j=0; j<n; ++j) {
        ...
        for (int k=0; k<n; ++k) {
             ...
        }
        ...
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1