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 ?
- Rejestracja:około 11 lat
- Ostatnio:prawie 11 lat
- Postów:14
- Rejestracja:około 11 lat
- Ostatnio:prawie 11 lat
- Postów:14
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.


- Rejestracja:ponad 19 lat
- Ostatnio:3 miesiące
#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.
- Rejestracja:około 11 lat
- Ostatnio:prawie 11 lat
- Postów:14
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);
}
}
}
}

- Rejestracja:ponad 19 lat
- Ostatnio:3 miesiące
_13th_Dragon napisał(a):
... reszta podobnie.
Którego słowa nie zrozumiałeś.

- Rejestracja:ponad 19 lat
- Ostatnio:3 miesiące
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.
- Rejestracja:około 11 lat
- Ostatnio:prawie 11 lat
- Postów:14
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 :/
- Rejestracja:około 11 lat
- Ostatnio:prawie 11 lat
- Postów:14
Fajna kula :) 13 to wiersz to funkcja main () z tego co widzę. Możesz nakierować dokładniej z czym jest błąd ?


- Rejestracja:ponad 11 lat
- Ostatnio:8 miesięcy
- Lokalizacja:Genewa
- Postów:597
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.
- Rejestracja:około 11 lat
- Ostatnio:prawie 11 lat
- Postów:14
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;
}
}

- Rejestracja:ponad 11 lat
- Ostatnio:8 miesięcy
- Lokalizacja:Genewa
- Postów:597
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!".

- Rejestracja:ponad 19 lat
- Ostatnio:3 miesiące
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.


- Rejestracja:około 11 lat
- Ostatnio:prawie 11 lat
- Postów:14
@_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}

- Rejestracja:ponad 19 lat
- Ostatnio:3 miesiące
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ę.
- Rejestracja:około 11 lat
- Ostatnio:prawie 11 lat
- Postów:14
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;
}
}