Aplikacja do macierzy w języku C

0

Witajcie,
mam do napisania projekt z informatyki polegający na stworzeniu aplikacji liczącą: iloczyn macierzy, wyznacznik macierzy i macierz odwrotną. Napisałem już 2 osobne aplikacje które liczą iloczyn macierzy oraz wyznacznik macierzy, jednak mam spory problem ze złożeniem tego w 1 cały program(masa błędów, źle powstawiane nawiasy {}, 2 funkcje main itd) . Ma ktoś doświadczenie z takimi problemami i może podpowiedzieć jakieś rozwiązanie ?

0

Pokaz co juz zrobiles.

0

Napisz do mnie na priv odnośnie tego.

0

Mnożenie macierzy 4x4:

 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

     int tab1[4][4];
     int tab2[4][4];
     int tab3[4][4];
     int a,i,j,k;
main ()
{
{     int a,i,j,k;
      printf("Aby obliczyc:\n Iloczyn macierzy 4x4 wpisz:1\n ");
      scanf("%f",&a);
}
      printf("uzupelnij pierwsza macierz \n");
      for(i=0; i<4; i++){
      for(j=0; j<4; j++){
      scanf("%d",&tab1[i][j]);
}
}
      printf("uzupelnij druga macierz \n");
      for(i=0; i<4; i++){
      for(j=0; j<4; j++){
      scanf("%d",&tab2[i][j]);
}
}
     for(i=0; i<4; i++)
     for(j=0; j<4; j++)
        {
     tab3[i][j]=0;
     for(k=0; k<4; k++)
     tab3[i][j]=tab3[i][j]+tab1[i][k]*tab2[k][j];
        }
     printf ("Wyniki (wiersz,kolumna):\n");
     for(i=0; i<4; i++)
     for(j=0; j<4; j++)
     printf("c%d%d=%d\n",i+1,j+1,tab3[i][j]);
     getch();
     return 0;
}

Wyznacznik macierzy kwadratowej:

 
#include <conio.h>
#include <stdio.h>



//Program oblicza wartoϾ wyznacznika

int n;

void wprowadz (int n, double tab[n][n]);
void wypisz (int n, double tab[n][n]);
double wyznacznik(int n, double m1[n][n]);
void minor(int k1, int n, double m1[n][n], double m2[n-1][n-1]);
int potega(int k1);

main()
{
printf("Podaj wymiar macierzy kwadratowej\n");
scanf("%d",&n);

double a[n][n];
double b[n][n];

if (n>0)
   {
   wprowadz(n, a);
   wypisz(n, a);
  printf("Wartosc wyznacznika wynosi: %lf\n",wyznacznik(n, a));
   }
else
    {
    printf("Wymiar wyznacznika musi byæ > 0 !!!\n");
    }

system("PAUSE");
}


//Funkcja do wprowadzenia elementów macierzy
void wprowadz (int n, double tab[n][n])
{
     printf("Wprowadzanie wyrazow macierzy (wiersz,kolumna)\n");
     int i,j;
     for (i=0; i<n; i++)
     {
         for (j=0; j<n; j++)
         {
             printf("Wprowadz wyraz %d, %d: ",i+1,j+1);
             scanf("%lf",&tab[i][j]);
         }
     }
}

//Funkcja wypisuj¹ca macierz
void wypisz (int n, double tab[n][n])
{
     printf("\n");
     int i,j;
     for (i=0; i<n; i++)
     { for (j=0; j<n; j++)
       {
       printf("%lf ", tab[i][j]);
       }
       printf("\n");
       }
}

//Funkcja obliczaj¹ca wartoœæ wyznacznika
double wyznacznik(int n, double m1[n][n])
{
 int k1; //kolumna wzglêdem której rozwijamy
 double m2[n-1][n-1]; //macierz na minor
 double det=0; //wartoϾ wyznacznika

       if (n==1) return m1[0][0]; //je¿eli stopieñ wyznacznika =1 to det|a| = a (a to liczba)
       else
       {
           for (k1=0; k1<n; k1++)
           {
               minor(k1, n, m1, m2); //obliczenie minoru m2 aby przekazaæ poni¿ej do funkcji wyznacznik
               det = det + potega(k1) * m1[0][k1] * wyznacznik(n-1,m2); //wzór Laplasa
           }
       }
return det;
}


//Funkcja obliczaj¹ca minor z macierzy
void minor(int k1, int n, double m1[n][n], double m2[n-1][n-1])
{
int u,v;
    for(v=0; v<n-1; v++)
         {
             for(u=0; u<k1; u++)
                 {
                 m2[v][u] = m1[v+1][u];
                 }
             for(u=k1+1; u<n; u++)
                 {
                 m2[v][u-1] = m1[v+1][u];
                 }
         }
}

//Funkcja obliczaj¹ca potêgê (-1)^(i+j)
int potega(int k1)
{
if ((k1%2)==1) return -1;
else return 1;

}

Sorry za bałagan w kodzie, ale to dopiero wersja robocza.

2
#define MAXSIZE 4
typedef double MAT[MAXSIZE][MAXSIZE];
 
void wprowadz (unsigned n,MAT tab)
  {
   unsigned y,x;
   printf("Wprowadzanie macierzy\n");
   for(y=0;y<n;++y)
     {
      for(x=0;x<n;++x)
        {
         printf("T[%d][%d]:",y+1,x+1);
         scanf("%lf",&tab[y][x]);
        }
     }
  }

reszta podobnie.

0

Dzięki wielkie

0

Witam, w dalszym ciągu piszę aplikację. Tym razem pojawił się problem z użyciem instrukcji if, wyrzuca błąd "undefined reference to wypisz/wprowadz/wyznacznik". Od razu zaznaczam, że dopiero się uczę więc nie krytykujcie za ostro :)

 #include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAXSIZE 4
     typedef double MAT[MAXSIZE][MAXSIZE];
     double wyznacznik(int n, double m1[n][n]);
     void minor(int k1, int n, double m1[n][n], double m2[n-1][n-1]);
     int potega(int k1);
     int tab1[4][4];
     int tab2[4][4];
     int tab3[4][4];
     int a,i,j,k,n;
main ()
{     printf("Aby obliczyc:\n Iloczyn macierzy 4x4 wpisz: 1\n Wyznacznik macierzy kwadratowej: 2\n ");
{

      scanf("%d",&a);
}
if (a==1)
{
      printf("uzupelnij pierwsza macierz \n");
      for(i=0; i<4; i++){
      for(j=0; j<4; j++){
      scanf("%d",&tab1[i][j]);
}
}
      printf("uzupelnij druga macierz \n");
      for(i=0; i<4; i++){
      for(j=0; j<4; j++){
      scanf("%d",&tab2[i][j]);
}
}
     for(i=0; i<4; i++)
     for(j=0; j<4; j++)
        {
     tab3[i][j]=0;
     for(k=0; k<4; k++)
     tab3[i][j]=tab3[i][j]+tab1[i][k]*tab2[k][j];
        }
     printf ("Wyniki (wiersz,kolumna):\n");
     for(i=0; i<4; i++)
     for(j=0; j<4; j++)
     printf("T[%d][%d]=%d\n",i+1,j+1,tab3[i][j]);
     getch();
     return 0;
if (a==2)
{
{printf("Podaj wymiar macierzy kwadratowej\n");
scanf("%d",&n);

double a[n][n];
double b[n][n];
{

}
if (n>0)
   {
   wprowadz(n, a);
   wypisz(n, a);
  printf("Wartosc wyznacznika wynosi: %lf\n",wyznacznik(n, a));
   }
else
    {
    printf("Wymiar wyznacznika musi byæ > 0 !!!\n");
    }

system("PAUSE");
}

void wprowadz (unsigned n,MAT tab)
  {
   unsigned y,x;
   printf("Wprowadzanie macierzy\n");
   for(y=0;y<n;++y)
     {
      for(x=0;x<n;++x)
        {
         printf("T[%d][%d]:",y+1,x+1);
         scanf("%lf",&tab[y][x]);
        }
     }
  }

void wypisz (unsigned n,MAT tab){
     printf("\n");
     unsigned y,x;
      for(y=0;y<n;++y)
     {  for(x=0;x<n;++x)
       {
       printf("%lf ", tab[x][y]);
       }
       printf("\n");
       }
}

double wyznacznik(int n, double m1[n][n])
{
 int k1;
 double m2[n-1][n-1];
 double det=0;

       if (n==1) return m1[0][0];
       else
       {
           for (k1=0; k1<n; k1++)
           {
               minor(k1, n, m1, m2);
               det = det + potega(k1) * m1[0][k1] * wyznacznik(n-1,m2);
           }
       }
return det;
}
void minor(int k1, int n, double m1[n][n], double m2[n-1][n-1])
{
int u,v;
    for(v=0; v<n-1; v++)
         {
             for(u=0; u<k1; u++)
                 {
                 m2[v][u] = m1[v+1][u];
                 }
             for(u=k1+1; u<n; u++)
                 {
                 m2[v][u-1] = m1[v+1][u];
                 }
         }
}
int potega(int k1)
{
if ((k1%2)==1) return -1;
else return 1;
}
}
else {
printf("Aby obliczyc:\n Iloczyn macierzy 4x4 wpisz:1\n ");
{

      scanf("%d",&a);
}
}
}
}
0
_13th_Dragon napisał(a):

... reszta podobnie.
Którego słowa nie zrozumiałeś.

0

No szczerze mówiąc to nie bardzo wiem jak przenieść zaproponowany przez Ciebie kod do funkcji dotyczącej wyznacznika, minora i potęgi :/

0

Do potęgi - nie trzeba tego przenosić możesz ją zapisać:

int potega(int k1)
  {
   return 1-((k1&1)<<1)
  }

ale może zostać jak jest.
Natomiast do minoru dla drugiej tablicy użyj tego samego typu.
Zauważ że MAXSIZE może być np 20 zaś działasz nadal nadal na macierzach 4x4.

0

Mam zapisać to w takiej postaci ? :

 void minor(unsigned n, MAT tab)
{
unsigned u,v;
    for(v=0; v<n-1; v++)
         {
             for(u=0; u<k1; u++)
                 {
                 m2[v][u] = m1[v+1][u];
                 }
             for(u=k1+1; u<n; u++)
                 {
                 m2[v][u-1] = m1[v+1][u];
                 }
         }
}
0

Czy cokolwiek rozumiesz we fragmencie który podałem?

void minor(int k1, int n, MAT m1, MAT m2) ...
0

Zmieniłem ten minor, pozmieniałem wszystkie wielkości macierzy na zależne MAXSIZE i nadal przy próbie skompilowania całego programu pojawia się błąd "undefined reference to wypisz/wprowadz/wyznacznik" ... Chodzi mi o to żeby za pomocą przycisku 1 wywołać mnożenie macierzy a za pomocą 2 wyznacznik macierzy. Chciałem to zrobić za pomocą funkcji if (a==1) {instrukcja do wykonania mnożenia} if (a==2) {instrukcja do wyliczenia wyznacznika] i ciągle wyrzuca wyżej wspomniany błąd :/

0

Kryształowa kula podpowiada że błąd masz w 13-tym wierszu.

0

Fajna kula :) 13 to wiersz to funkcja main () z tego co widzę. Możesz nakierować dokładniej z czym jest błąd ?

1

Czemu nie sprawdzisz co może powodować błąd "undefined reference"? Jeśli nie będziesz rozpoznawał komunikatów kompilatora, to będziesz się zawsze męczył.

Podpowiem tak: w funkcji main(), kompilator nie wie jeszcze, że istnieją takie funkcje jak wypisz/wyznacznik itp. Pomyśl dlaczego.

0

Na chwilę obecną wygląda to tak : uzależniłem wielkość macierzy od zmiennej MAXSIZE. W dalszym ciągu próbuję za pomocą instrukcji if umożliwić za pomocą wpisywania z klawiatury obliczać wyznacznik i iloczyn...

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAXSIZE 4
     typedef double MAT[MAXSIZE][MAXSIZE];
     int tab1 [MAXSIZE][MAXSIZE];
     int tab2 [MAXSIZE][MAXSIZE];
     int tab3 [MAXSIZE][MAXSIZE];
     int a,i,j,k,n;
     double wyznacznik(int n, double m1[n][n]);

 int main()
{
{printf("Aby obliczyc:\n Iloczyn macierzy 4x4 wpisz:2\n Wyznacznik macierzy:1\n");
      scanf("%d",&a);
}
if (a==1)
{
    printf("Podaj wymiar wyznacznika\n");
scanf("%d",&n);

double a[n][n];
double b[n][n];

if (n>0)
   {
   wprowadz(n, a);
   wypisz(n, a);
  printf("Wartosc wyznacznika wynosi: %lf\n",wyznacznik(n, a));
   }
else
    {
    printf("Wymiar wyznacznika musi byæ > 0 !!!\n");
    }

system("PAUSE");

typedef double MAT[MAXSIZE][MAXSIZE];

void wprowadz (unsigned n,MAT tab)
  {
   unsigned y,x;
   printf("Wprowadzanie macierzy\n");
   for(y=0;y<n;++y)
     {
      for(x=0;x<n;++x)
        {
         printf("T[%d][%d]:",y+1,x+1);
         scanf("%lf",&tab[y][x]);
        }
     }
  }
void wypisz (unsigned n, MAT tab)
{
     printf("\n");
     int i,j;
     for (i=0; i<n; i++)
     { for (j=0; j<n; j++)
       {
       printf("%lf ", tab[i][j]);
       }
       printf("\n");
       }
}
double wyznacznik(int n, double m1[n][n])
{
 int k1;
 double m2[n-1][n-1];
 double det=0;

       if (n==1) return m1[0][0];
       else
       {
           for (k1=0; k1<n; k1++)
           {
               minor(k1, n, m1, m2);
               det = det + potega(k1) * m1[0][k1] * wyznacznik(n-1,m2);
           }
       }
return det;
}
void minor(int k1, int n, MAT m1, MAT m2)
{
int u,v;
    for(v=0; v<n-1; v++)
         {
             for(u=0; u<k1; u++)
                 {
                 m2[v][u] = m1[v+1][u];
                 }
             for(u=k1+1; u<n; u++)
                 {
                 m2[v][u-1] = m1[v+1][u];
                 }
         }
}
int potega(int k1)
{
if ((k1%2)==1) return -1;
else return 1;
}
}
if (a==2)
{
      printf("uzupelnij pierwsza macierz \n");
      for(i=0; i<MAXSIZE; i++){
      for(j=0; j<MAXSIZE; j++){
      scanf("%d",&tab1[i][j]);
}
}
      printf("uzupelnij druga macierz \n");
      for(i=0; i<MAXSIZE; i++){
      for(j=0; j<MAXSIZE; j++){
      scanf("%d",&tab2[i][j]);
}
}
     for(i=0; i<MAXSIZE; i++)
     for(j=0; j<MAXSIZE; j++)
        {
     tab3[i][j]=0;
     for(k=0; k<MAXSIZE; k++)
     tab3[i][j]=tab3[i][j]+tab1[i][k]*tab2[k][j];
        }
     printf ("Wyniki (wiersz,kolumna):\n");
     for(i=0; i<MAXSIZE; i++)
     for(j=0; j<MAXSIZE; j++)
     printf("T[%d][%d]=%d\n",i+1,j+1,tab3[i][j]);
     getch();
     return 0;
}
}
 
1

Używasz funkcji minor(k1, n, m1, m2); która pojawia się dopiero dalej.
Jeżeli nie rozumiesz co to jest deklaracja to wstawiaj funkcje przed pierwszym użyciem.

1

To jeszcze inaczej - programy działają sekwencyjnie. W pliku w danej linii jest znane tylko to. co było wyżej (chyba, że są w tej samej przestrzeni nazw czy tam klasie). A Twój kompilator znajduje wywołanie funkcji wyznacznik(), zatem patrzy 'w górę' pliku i myśli "hm... nie ma nigdzie wyżej funkcji wyznacznik, to rzucę temu programiście undefined reference!".

0

Chodzi o ten fragment tak ? :

f (n==1) return m1[0][0];
       else
       {
           for (k1=0; k1<n; k1++)
           {
               minor(k1, n, m1, m2);
               det = det + potega(k1) * m1[0][k1] * wyznacznik(n-1,m2);
           }
       } 
1

A masz jeszcze gdzieś wywołanie: minor(k1, n, m1, m2); ?
Zasada jest jedna:

  • albo musisz mieć deklaracje przed pierwszym wywołaniem
  • albo musisz mieć deklaracje połączoną z definicją przed pierwszym wywołaniem.
0

Może ktoś z Was napisać fragment kodu którego dotyczy problem ? Bo ja już nie mam pojęcia co robić...

1

Napisać deklarację funkcji przed funckją main(), albo całą jej definicję przenieść przed maina.
+Poczytaj trochę o C/C++. Od siebie polecę standardowo "Od zera do gier kodera".

0

@_13th_Dragon Czy o to chodziło z tymi deklaracjami funkcji ? :

 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAXSIZE 4
     void wypisz (unsigned n, MAT tab);
     void wprowadz (unsigned n,MAT tab);
     typedef double MAT[MAXSIZE][MAXSIZE];
     int tab1 [MAXSIZE][MAXSIZE];
     int tab2 [MAXSIZE][MAXSIZE];
     int tab3 [MAXSIZE][MAXSIZE];
     int a,i,j,k,n;
     double wyznacznik(int n, double m1[n][n]);
{dalszy kod z wcześniejszego posta}
1

Zasada deklaracja musi być przed - dotyczy wszystkiego w tym deklaracji typów (np MAT):

     typedef double MAT[MAXSIZE][MAXSIZE];
     void wypisz (unsigned n, MAT tab);
     void wprowadz (unsigned n,MAT tab);
     double wyznacznik(int n,MAT m1);
     MAT tab1,tab2,tab3;
     int a,i,j,k,n;

Weź przeczytaj byle jaki kurs na szybko, programowanie metodą prób i błędów z góry skazane na porażkę.

0

Wrzucam stan kodu na daną chwilę. Jeśli dobrze zrozumiałem to deklaracje są już (chyba) wpisane przed main () a nadal pojawia się ten sam komunikat...

 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAXSIZE 4
     typedef double MAT[MAXSIZE][MAXSIZE];
     void wypisz (unsigned n, MAT tab);
     void wprowadz (unsigned n,MAT tab);
     void minor(int k1, int n, MAT m1, MAT m2);
     double wyznacznik(int n,MAT m1);
     MAT tab1,tab2,tab3;
     int a,i,j,k,n;

main()
{
{printf("Aby obliczyc:\n Iloczyn macierzy 4x4 wpisz:1\n Wyznacznik macierzy:2\n");
      scanf("%d",&a);
}
if (a==2)
{
    printf("Podaj wymiar wyznacznika\n");
scanf("%d",&n);

double a[n][n];
double b[n][n];
{
if (n>0)
   {
   wprowadz(n, a);
   wypisz(n, a);
  printf("Wartosc wyznacznika wynosi: %lf\n",wyznacznik(n, a));
   }
else
    {
    printf("Wymiar wyznacznika musi byæ > 0 !!!\n");
    }

}
void wprowadz (unsigned n,MAT tab)
  {
   unsigned y,x;
   printf("Wprowadzanie macierzy\n");
   for(y=0;y<n;++y)
     {
      for(x=0;x<n;++x)
        {
         printf("T[%d][%d]:",y+1,x+1);
         scanf("%lf",&tab[y][x]);
        }
     }
  }
void wypisz (unsigned n, MAT tab)
{
     printf("\n");
     int i,j;
     for (i=0; i<n; i++)
     { for (j=0; j<n; j++)
       {
       printf("%lf ", tab[i][j]);
       }
       printf("\n");
       }
}
double wyznacznik(int n, MAT m1)
{
 int k1;
 double m2[n-1][n-1];
 double det=0;

       if (n==1) return m1[0][0];
       else
       {
           for (k1=0; k1<n; k1++)
           {
               minor(k1, n, m1, m2);
               det = det + potega(k1) * m1[0][k1] * wyznacznik(n-1,m2);
           }
       }
return det;
}
void minor(int k1, int n, MAT m1, MAT m2)
{
int u,v;
    for(v=0; v<n-1; v++)
         {
             for(u=0; u<k1; u++)
                 {
                 m2[v][u] = m1[v+1][u];
                 }
             for(u=k1+1; u<n; u++)
                 {
                 m2[v][u-1] = m1[v+1][u];
                 }
         }
}
int potega(int k1)
{
if ((k1%2)==1) return -1;
else return 1;
}
}
if (a==1)
{
      printf("uzupelnij pierwsza macierz \n");
      for(i=0; i<MAXSIZE; i++){
      for(j=0; j<MAXSIZE; j++){
      scanf("%d",&tab1[i][j]);
}
}
      printf("uzupelnij druga macierz \n");
      for(i=0; i<MAXSIZE; i++){
      for(j=0; j<MAXSIZE; j++){
      scanf("%d",&tab2[i][j]);
}
}
     for(i=0; i<MAXSIZE; i++)
     for(j=0; j<MAXSIZE; j++)
        {
     tab3[i][j]=0;
     for(k=0; k<MAXSIZE; k++)
     tab3[i][j]=tab3[i][j]+tab1[i][k]*tab2[k][j];
        }
     printf ("Wyniki (wiersz,kolumna):\n");
     for(i=0; i<MAXSIZE; i++)
     for(j=0; j<MAXSIZE; j++)
     printf("T[%d][%d]=%d\n",i+1,j+1,tab3[i][j]);
     getch();
     return 0;
}
}
0

Temat do zamknięcia, problem rozwiązany. Dzięki za pomoc i sorry za ułomne rozumienie :)

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