macierz w C

moniac91
Użytkownik
Użytkownik
Posty: 83
Rejestracja: 6 lis 2010, o 12:35
Płeć: Kobieta
Podziękował: 1 raz

macierz w C

Post autor: moniac91 »

Mam do zrobienia takie zadanie w C.
1.Napisz program który odczyta wymiary dwóch macierzy, a następnie ich współczynniki i (jeśli można) obliczy i wypisze ich iloczyn.
Narazie zatrzymalam się przy wypisaniu współczynników. Programuję od miesiąca i nie mam pojęcia co robić :/ ktoś pomoże?
a oto co napisałam:

Kod: Zaznacz cały

#include <stdio.h>

main()
{
int WMA, KMA, WMB, KMB; /*WMA - wiersze macierzy A, KMA- kolumny macierzy A itd. */
	printf("Podaj liczbe wierszy macierzy A 	");
	scanf("%d", & WMA);
	printf("Podaj liczbe kolumn macierzy A 	");
	scanf("%d", & KMA);
	printf("Wymiar macierzy A to %d x %d 
", WMA, KMA);
		
		printf("Podaj liczbe wierszy macierzy B 	");
		scanf("%d", & WMB);
		printf("Podaj liczbe kolumn macierzy B 	");
		scanf("%d", & KMB);
		printf("Wymiar macierzy B to %d x %d 
", WMB, KMB);
		
int macierzA[WMA][KMA];
int macierzB[WMB][KMB];

printf("A = %d 
", macierzA[WMA][KMA]);	
printf("B = %d 
", macierzB[WMB][KMB]);	
}
Ostatnio zmieniony 17 mar 2011, o 20:28 przez Crizz, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości. Kod programu, pseudokod itp. proszę umieszczać wewnątrz klamer [code][/code].
mis02
Użytkownik
Użytkownik
Posty: 30
Rejestracja: 15 gru 2009, o 17:19
Płeć: Mężczyzna
Lokalizacja: ///
Podziękował: 6 razy
Pomógł: 3 razy

macierz w C

Post autor: mis02 »

int macierzA[WMA][KMA];
int macierzB[WMB][KMB];
Tu masz źle, rozmiar musi być znany przy kompilacji. Możesz ewentualnie użyć dynamicznej alokacji, z tego co pamiętam to w C służyły do tego funkcje malloc i free.

printf("A = %d
", macierzA[WMA][KMA]);
printf("B = %d
", macierzB[WMB][KMB]);
To nie zadziała ponieważ w tablicach nie ma elementów o podanych indeksach (ostatni element w a to: macierzA[WMA-1][KMA-1])
Jesli chcesz wypisać całą zawartość tablicy dwuwymiarowej najwygodniej Ci będzie użyć dwóch zagnieżdżonych pętli, np for

Kod: Zaznacz cały

int i=0;
int j=0;

for(i=0; i<WMA; ++i)
{
    for(j=0; j<KMA; ++j) printf("%d ", macierzA[i][j]);
     printf("
");
}
jakoś tak powinno działać
moniac91
Użytkownik
Użytkownik
Posty: 83
Rejestracja: 6 lis 2010, o 12:35
Płeć: Kobieta
Podziękował: 1 raz

macierz w C

Post autor: moniac91 »

Kompiluje sie ale nie działa. Gdzie robie błąd? Ktoś moze mnie poprawić? A mam cos takiego:

Kod: Zaznacz cały

#include <stdio.h>

main()
{
int WMA, KMA, WMB, KMB; /*WMA - wiersze macierzy A, KMA- kolumny macierzy A itd. */
	printf("Podaj liczbe wierszy macierzy A 	");
	scanf("%d", & WMA);
	printf("Podaj liczbe kolumn macierzy A 	");
	scanf("%d", & KMA);
	printf("Wymiar macierzy A to %d x %d 
", WMA, KMA);
		
		printf("Podaj liczbe wierszy macierzy B 	");
		scanf("%d", & WMB);
		printf("Podaj liczbe kolumn macierzy B 	");
		scanf("%d", & KMB);
		printf("Wymiar macierzy B to %d x %d 
", WMB, KMB);
		
		void macierzA (A,WMA,KMA)
		int A[WMA][KMA];
		{
		int i,j;
		for (i = 0; i < WMA; i++) {
            for (j = 0; j < KMA; j++) {
                

                printf("A= %d ", A[i][j]);
            }
            printf("
");
	}}
	void macierzB (B,WMB,KMB)
		int B[WMB][KMB];
		{
		int i,j;
		for (i = 0; i < WMB; i++) {
            for (j = 0; j < KMB; j++) {
                

                printf("B= %d ", B[i][j]);
            }
            printf("
");
	}}
		
}
Ostatnio zmieniony 18 mar 2011, o 13:22 przez Afish, łącznie zmieniany 1 raz.
Powód: Brak znaczników code
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

macierz w C

Post autor: wawek91 »

A co ma robic linijka

Kod: Zaznacz cały

void macierzA (A,WMA,KMA)
? Wygląda to na wywołanie funkcji, tylko jakiej funkcji ?
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6909
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

macierz w C

Post autor: Mariusz M »

Ja proponuję użyć wskaźników a do alokacji pamięci i jej zwalniania użyć funkcji malloc() i free()
Własną funkcję można napisać która by realizowała mnożenie macierzy
(W C++ można by było użyć operatorów new i delete
a samą macierz zrealizować jako klasę)
moniac91
Użytkownik
Użytkownik
Posty: 83
Rejestracja: 6 lis 2010, o 12:35
Płeć: Kobieta
Podziękował: 1 raz

macierz w C

Post autor: moniac91 »

mariuszm pisze:Ja proponuję użyć wskaźników a do alokacji pamięci i jej zwalniania użyć funkcji malloc() i free()
Własną funkcję można napisać która by realizowała mnożenie macierzy
(W C++ można by było użyć operatorów new i delete
a samą macierz zrealizować jako klasę)

Nie mam o tym wszystkim pojęcia... Może napiszesz ten fragment? Dodam, że 'programuje' od miesiaca i to nie może być zbyt skomplikowane. Nie mialam funkcji malloc i free....
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6909
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

macierz w C

Post autor: Mariusz M »

Kod: Zaznacz cały

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

void multiply(double**,double**,double**,int,int,int);

int main()
{
int i,j,m,n,p,r;
char ch;
double **A,**B,**C;
do{
printf("Podaj wymiary pierwszej macierzy
");
scanf("%d %d",&m,&n);
printf("Podaj wymiary drugiej macierzy
");
scanf("%d %d",&r,&p);
   if(n!=r) main();
A=(double**)malloc(m*sizeof(double));
for(i=0;i<m;i++)
A[i]=(double*)malloc(n*sizeof(double));

B=(double**)malloc(n*sizeof(double));
for(i=0;i<n;i++)
B[i]=(double*)malloc(p*sizeof(double));
C=(double**)malloc(m*sizeof(double));
for(i=0;i<m;i++)
C[i]=(double*)malloc(p*sizeof(double));

for(i=0;i<m;i++)
for(j=0;j<n;j++){
printf("A[%d][%d]=",i+1,j+1);
scanf("%lf",&A[i][j]);
}
for(i=0;i<n;i++)
for(j=0;j<p;j++){
printf("B[%d][%d]=",i+1,j+1);
scanf("%lf",&B[i][j]);
}
multiply(C,A,B,m,p,n);
printf("A*B=
");
for(i=0;i<m;i++){
for(j=0;j<p;j++){
printf("%.12lf %s",C[i][j]," ");
}
printf("
");
}
for(i=0;i<m;i++)
free(A[i]);
free(A);
for(i=0;i<n;i++)
free(B[i]);
free(B);
for(i=0;i<m;i++)
free(C[i]);
free(C);
ch=getch();
}
while(ch!=27);
return 0;
}

void multiply(double**C,double**A,double**B,int m,int p,int n)
{
int i,j,k;
double s;
for(i=0;i<m;i++)
for(k=0;k<p;k++){
s=0.0;
for(j=0;j<n;j++)
s+=A[i][j]*B[j][k];
C[i][k]=s;
}
}


A oto kod z zapisem wyników do pliku
(jeszcze trzeba sprawdzić czy nie ma jakichś błędów)

Kod: Zaznacz cały

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

void multiply(double**,double**,double**,int,int,int);

int main()
{
int i,j,m,n,p,r;
char ch;
double **A,**B,**C;
FILE *fout;
if ((fout = fopen("C:\mulmat.txt", "at"))
    == NULL)
{
   fprintf(stderr, "Nie mozna otworzyc pliku do dopisywania
");
   return 1;
}

do{     
printf("Podaj wymiary pierwszej macierzy
");
scanf("%d %d",&m,&n);
printf("Podaj wymiary drugiej macierzy
");
scanf("%d %d",&r,&p);
   if(n!=r) main();
A=(double**)malloc(m*sizeof(double));
for(i=0;i<m;i++)
A[i]=(double*)malloc(n*sizeof(double));

B=(double**)malloc(n*sizeof(double));
for(i=0;i<n;i++)
B[i]=(double*)malloc(p*sizeof(double));
C=(double**)malloc(m*sizeof(double));
for(i=0;i<m;i++)
C[i]=(double*)malloc(p*sizeof(double));

for(i=0;i<m;i++)
for(j=0;j<n;j++){
printf("A[%d][%d]=",i+1,j+1);
scanf("%lf",&A[i][j]);
}
fprintf(fout,"A=
");
for(i=0;i<m;i++){
for(j=0;j<n;j++)
fprintf(fout,"%.12lf %s",A[i][j]," ");
fprintf(fout,"
");
}
for(i=0;i<n;i++)
for(j=0;j<p;j++){
printf("B[%d][%d]=",i+1,j+1);
scanf("%lf",&B[i][j]);
}
fprintf(fout,"B=
");
for(i=0;i<n;i++){
for(j=0;j<p;j++)
fprintf(fout,"%.12lf %s",B[i][j]," ");
fprintf(fout,"
");
}
multiply(C,A,B,m,p,n);
printf("A*B=
");
for(i=0;i<m;i++){
for(j=0;j<p;j++){
printf("%.12lf %s",C[i][j]," ");
}

printf("
");
}
fprintf(fout,"A*B=
");
for(i=0;i<m;i++){
for(j=0;j<p;j++){
fprintf(fout,"%.12lf %s",C[i][j]," ");
}
fprintf(fout,"
");
}
fprintf(fout,"
");
for(i=0;i<m;i++)
free(A[i]);
free(A);
for(i=0;i<n;i++)
free(B[i]);
free(B);
for(i=0;i<m;i++)
free(C[i]);
free(C);
ch=getch();
}
while(ch!=27);
fclose(fout);
return 0;
}

void multiply(double**C,double**A,double**B,int m,int p,int n)
{
int i,j,k;
double s;
for(i=0;i<m;i++)
for(k=0;k<p;k++){
s=0.0;
for(j=0;j<n;j++)
s+=A[i][j]*B[j][k];
C[i][k]=s;
}
}
Można jeszcze wszystkim liczbom całkowitym dodać modyfikator unsigned
moniac91
Użytkownik
Użytkownik
Posty: 83
Rejestracja: 6 lis 2010, o 12:35
Płeć: Kobieta
Podziękował: 1 raz

macierz w C

Post autor: moniac91 »

Wow...! Dzieki wielkie
ODPOWIEDZ