Šta je novo?

molim pomoc oko zadatka u c-u!HITNO!!!

chalka

Slavan
Učlanjen(a)
12.12.2005
Poruke
3
Poena
301
mucio sam se poprilicno dugo ali ne ide
nesto sam napisao ali ne radi kako treba
sta nevelja
zadatak glasi:

1. Napisati C program koji će učitati dimenzije (RA x KA) realne matrice A (maksimalno
10 x 10) , dimenzije (RB x KB) realne matrice B (maksimalno 10 x 10), te učitati
elemente tih matrica. Program zatim treba izračunati matricu C koja je proizvod
matrica A i B. Na kraju program treba ispisati sve tri matrice: A, B i C.
- RA, RB označavaju broj redova matrica A i B, respektivno;
- KA, KB označavaju broj kolona matrica A i B, respektivno.
Prilikom unosa dimenzija matrica program treba provjeriti da li su unesene dimenzije
u dozvoljenim granicama, tj. da li je
RA<=10, RB<=10, KA<=10, KB<=10,
te isto tako program treba provjeriti da li se matrice mogu množiti, tj. da li je
ispunjeno:
KA=RB

moj pokusaj:

Kod:
#include <stdio.h>
int main()
{
	/*deklaracija polja i varijabli*/
	int A[10][10],B[10][10],C[10][10],i,j,k,m,RA,KA,RB,KB,RC,KC;
	/*unos dimenzije matrica*/
	do
	{
		printf("\nUnesite dimenzije prve matrice: ");
		scanf("%d %d", &RA,&KA);
		printf("\nUnesite dimenzije druge matrice: ");
		scanf("%d %d", &RB,&KB);
	}while (RA<1||RA>10||RB<1||RB>10||KA<1||KA>10||KB<1||KB>10);
	/*uslov za mnozenje matrica*/
	if (KA==RB)
	{
	/*Unos matrice A*/
	for (i=0;i<RA;i++)
	{
		for(j=0;j<KA;j++)
		{
			printf("\nUnesite element [%d][%d] matrice A: ", i,j);
			scanf("%d", &A[i][j]);
		}
	}
	/*Unos matrice B*/
	for (i=0;i<RB;i++)
	{
		for(j=0;j<KB;j++)
		{
			printf("\nUnesite element [%d][%d] matrice B: ", i,j);
			scanf("%d", &B[i][j]);
		}
	}
	/*izracubavanje matrice C i ucitavanje njenih vrijednosti*/
	m=0;
	for(i=0;i<RA;i++)
	{
		for(k=0;k<KA;k++)
		{
			for(j=0;j<KB;j++)
			{
				m+=A[i][j]*B[j][k];
			}
			C[i][k]=m;
		}
	}
	/*ispis matric A*/
	printf("\nMatrica A igleda ovako:\n");
	for(i=0;i<RA;i++)
	{
		for(j=0;j<KA;j++)
		{
			printf("%6d", A[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	/*ispis matric B*/
		printf("\nMatrica B igleda ovako:\n");
	for(i=0;i<RB;i++)
	{
		for(j=0;j<KB;j++)
		{
			printf("%6d", B[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	/*ispis matric C*/
		printf("\nMatrica C igleda ovako:\n");
	for(i=0;i<RA;i++)
	{
		for(j=0;j<KB;j++)
		{
			printf("%6d", C[i][j]);
		}
		printf("\n");
	}
	printf("\n");
		
	}
	else 
	{
		printf("\nOve matrice nisu ulancene"); 
		printf("\njer dimenzije koje ste unijeli ne dozvoljavaju njihovo mnozenje");
		printf("\nzbog toga sto broj kolona prve matrice nije jednak broju vrsta druge mantrice!\n");
	}

	return 0;

	
}
 
pogledao sam na brzinu:
-m promenljivu si samo na pocetku stavio na 0, a ona treba da ti se pre svakog izracunavanja broja matrice c postavi na 0, ti si na prvi izracunati broj matrice c dodavao drugi, pa na drugi trece itd. , zato si dobijao na kraju astronomske brojeve... obrati paznju uvek na takvim mestima jer se tu najlakse gresi
-ove for petlje pri izracunavanju elemenata matrice c ti ne valjaju...

Mrzi me sad da radim, kasno je, poslacu ti ujutru ceo zadatak...

Poz
 
Samo da ne bude zabune jel mnozenje matrica izgleda ovako:
1 2 3 1 2 3 1 4 9
4 5 6 * 4 5 6 = 16 25 36
7 8 9 7 8 9 49 64 81


?
 
Samo da ne bude zabune jel mnozenje matrica izgleda ovako:
a1 a2 a3 * b1 b2 b3 = a1*b1 a2*b2 a3*b3
a4 a5 a6 * b4 b5 b6 = a4*b4 a5*b5 a6*b6
a7 a8 a9 * b7 b8 b9 = a7*b7 a8*b8 a9*b9

?
 
Poslednja izmena:
hvala puno za ono m=0 pri svakom prolasku sada radi bez problema

a mnozenje matrica izgleda ovako
a11 a12 * b11 b12 = a11*b11+a12*b21 a11*b12+a12*b22
a21 a22 b21 b22 a21*b11+a22*b21 a21*b12+a22*b22
 
oprosti ove matrice izadjose uzasno evo ponovo:
a11 a12*b11 b12=a11*b11+a12*b21 a11*b12+a12*b22
a21 a22*b21 b22=a21*b11+a22*b21 a21*b12+a22*b22
 
Ja mislim da njemu nije problem bila metematika, ali hvala inace, ocigledno mi je potreban mali pocetnik iz mate :d
 
da mi je samo jasno ko pise ove zadatke i zasto, kada sve moze da e kaze i lakse i razumljivije... stvarno ti profesori...

pazi, mozda sam lupio, ali da li pretvaras matricu u niz prilikom mnozenja?!?
 
Poslednja izmena:
Moze to i drukcuije, neko ti pokaze, neko ne, ali nisam hteo da ga zamaram sa nekom mojom verzijom zadatka jer je coveku bilo hitno...
 
CamBieL je napisao(la):
pazi, mozda sam lupio, ali da li pretvaras matricu u niz prilikom mnozenja?!?

Rezultat mnozenja matrica je opet matrica.
A matrica je dvodimenzionalni niz.
(valjda nisam lupio :d )
 
n dimenzionalni...

za matrice kao tip podataka nisam cuo da postoje osim ako ga sam nisi kreirao, uostalom kome to treba? osim profesorima koji u 99% slucajeva vezuju matematiku i programiranje.

ali ovo mnozenje matrica ste nesto slabo odradili...
na stranici http://lavica.fesb.hr/mat1/ imate na dnu strane u PDF-u predavanja i vezbe lepo odradjene, posto vec vecinu vremena provodite pored racunara uzaludno bacite se na citanje!

e ako vas i to mrzi, evo konkretnog odgovora:

http://lavica.fesb.hr/mat1/predavanja/node26.html
 
Poslednja izmena:
Kod:
#include <stdio.h>


int main()
{
	int dim_a,dim_ax,dim_b,dim_bx;
	dim_a=dim_ax=dim_b=dim_bx = 0;

	int A[10][10];
	int B[10][10];
	int C[10][10]; 

	while(1)
	{
		printf("\nUnesite dimenzije prve matrice: ");
		scanf("%d %d", &dim_a,&dim_ax);
		printf("\nUnesite dimenzije druge matrice: ");
		scanf("%d %d", &dim_b,&dim_bx);

		if(dim_a < 1 || dim_ax > 10 || dim_b < 1 || dim_bx > 10)
		{
			printf("\ngreska , minimalna i maksimalna velicina su 1 i 10\n");
			continue;
		}

		break;
	}
	
	int a,b,ax,bx;
	
	/*Unos matrice A*/
	for (a=0;a<dim_a;a++)
	{
		for(ax=0;ax<dim_ax;ax++)
		{
			printf("\nUnesite element A[%d][%d] : ", a,ax);
			scanf("%d", &A[a][ax]);
		}
	}

	/*Unos matrice B*/
	for (b=0;b<dim_b;b++)
	{
		for(bx=0;bx<dim_bx;bx++)
		{
			printf("\nUnesite element B[%d][%d] : ", b,bx);
			scanf("%d", &B[b][bx]);
		}
	}


	for(ax=0;ax<dim_ax;ax++)
	{
		for(b=0 ; b<dim_b ; b++)
		{
			int c=0;

			for(a=0,bx=0;a<dim_a && bx<dim_bx ;a++,bx++)
			{
				c+= A[a][ax] * B[b][bx];
			}

			C[b][ax] = c;
		}
	}

	printf("\npregled matrice A\n\n");

	// pregled matrice !
	for (ax=0;ax<dim_ax;ax++)
	{
		for(a=0;a<dim_a;a++)
			printf(" %2d",A[a][ax]);
		
		printf("\n");
	}

	printf("\npregled matrice B\n\n");

	// pregled matrice B
	for (bx=0;bx<dim_bx;bx++)
	{
		for(b=0;b<dim_b;b++)
			printf(" %2d",B[b][bx]);
		
		printf("\n");
	}

	// rezultirajuca matrica
	printf("\nrezultirajuca matrica:\n\n");
	
	for(ax=0 ; ax<dim_ax ; ax++)
	{
		for(b=0 ; b<dim_b ; b++)
		{
			printf(" %2d",C[b][ax]);
		}

		printf("\n");
	}

	return 0;
}

poz...
 
Poslednja izmena:
Jedan hint!

Pre bilo kakvog mnozenje matrica ispitati KOMPATIBILNOST matrica, odn. da bi matrice mogle da se mnoze njihove "unutrasnje dimenzije moraju da se poklapaju.

Mnozenjem matrice A dimenzija m x n i B dimenzija n x k dobiaj se matrica C dimenzija m x k. Ukoliko nisu takvog "formata" mnozenje je besmisleno!!

Ajde malo teoretski da potkrepimo objasnjenje:

Sematski se najboljeshvata ako se posmatra mnozenje dve matrice 3 x3
Kod:
|a11  a12  a13|         |b11  b12  b13|     
|a21  a22  a23|    x    |b21  b22  b23|   = 
|a31  a32  a33|         |b31  b32  b33|     




 |(a11*b11)+(a12*b21)+(a13*b31)         (a11*b12)+(a12*b22)+(a13*b32)   (a11*b13)+(a12*b23)+(a13*b33)  |
 |                                                                                                     |
=|(a21*b11)+(a22*b21)+(a23*b31)         (a21*b12)+(a22*b22)+(a23*b32)    (a21*b13)+(a22*b23)+(a23*b33) |
 |                                                                                                     |
 |(a31*b11)+(a32*b21)+(a33*b31)         (a31*b12)+(a32*b22)+(a33*b32)    (a31*b13)+(a32*b23)+(a33*b33) |

Znaci trebaju ti tri najobicnije "brojacke" (ili for ) ugnjezdene petlje za formiranje elemenata matrice:

- za obican "obilazak" bilo koje matrice trebaju ti dve SPOLJNE,
njih koristis za "cupanje" elemenata iz A i B matrice po redovima ili kolonama (kako ti drago), to valjda znas da uradish.
One idu od 1 do n i od 1 do k (do spoljnih granica matrica)

- unutrasnja petlja ti treba za formiranje "parcijalnih" suma a(i,j)*b (j,i) i njihovo sabiranje i ona se vrti m puta, to je tzv. unutrasnja dimenzija.
Obrati paznju da su indeksi elemenata ovde PERMUTOVANI po principu: vrsta<->kolona.
 
Poslednja izmena:
Nazad
Vrh Dno