Mnożenie macierzy w ANSI C

0

Witam! Mam problem z dopisaniem funkcji która mnożyła by dwie macierze.

#include<stdio.h>
#include<stdlib.h>
#define S 10

int wczytajA(int A[][S], int m, int n)
{
	int i, j;
	printf("Podaj elementy macierzy A:\n");
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("(%i,%i)->", i + 1, j + 1); scanf("%i", &A[i][j]);
		}
	}
}
int wczytajB(int B[][S], int k, int l)
{
	int i, j;
	printf("Podaj elementy macierzy B:\n");
	for (i = 0; i < k; i++)
	{
		for (j = 0; j < l; j++)
		{
			printf("(%i,%i)->", i + 1, j + 1); scanf("%i", &B[i][j]);
		}
	}
}
void wypiszA(int A[][S], int m, int n)
{
	int i, j;
	printf("Macierz A:\n");
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%i ", A[i][j]);
		}
		printf("\n");
	}
}
void wypiszB(int B[][S], int k, int l)
{
	int i, j;
	printf("Macierz B:\n");
	for (i = 0; i < k; i++)
	{
		for (j = 0; j < l; j++)
		{
			printf("%i ", B[i][j]);
		}
		printf("\n");
	}
}
int iloczyn(int A[][S], int B[][S], int m, int l)
{
	int i, j, s=0;
	for (j = 0; j < n; j++)
	{
		for (i = 0; i < m; i++)
		{
			s = s + (A[i][j] * B[i][j]);

		}
	}
}

int main()
{
	int m, n, A[S][S];
	int k, l, B[S][S];
	printf("Podaj rozmiar macierzy A: "); scanf("%i%i", &m, &n);
	wczytajA(A, m, n);
	wypiszA(A, m, n);
	printf("Podaj rozmiar macierzy B: "); scanf("%i%i", &k, &l);
	wczytajB(B, k, l);
	wypiszB(B, k, l);
	system("pause");
	return 0;
} 

Będę bardzo wdzięczny za pomoc.

0
int iloczyn(int A[][S], int B[][S], int r1, int c1, int r2, int c2)
{  
    int i, j, k, sum, C[S][S];
       for(i=0; i<r1; ++i)
          for(j=0; j<c2; ++j)
          {
             C[i][j]=0;
          }
       for(i=0; i<r1; ++i)
          for(j=0; j<c2; ++j)
             for(k=0; k<c1; ++k)
            {
               C[i][j]+=A[i][k]*B[k][j];
            }
       wypiszA(C, r1, c2);
}

Mnoże i po wymnożeniu wypisuję metodą A.

0

Dziękuje bardzo.

0

Mam jeszcze jeden problem. Chciałem napisać ten sam program tyle, że za pomocą tablic dynamicznych. Jednakże nie doszedłem jeszcze do mnożenia tych dwóch macierzy ponieważ mam problem z jedną, a mianowicie wyskakuje mi

Unhandled exception at 0x581EC28C (msvcr120d.dll) in ANSI C.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC
.
Poniżej kod.

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

int alokujA(int *(*A), int w1, int k1)
{
	int i, j;
	A = (int **)malloc(w1*sizeof(int*));
	for (i = 0; i < w1; i++)
	{
		A[i] = (int **)malloc(k1*sizeof(int));
	}
	return A;
}
void wczytajA(int *(*A), int w1, int k1)
{
	int i, j;
	alokujA(&A, w1, k1);
	printf("Podaj elementy macierzy A:\n");
	for (i = 0; i < w1; i++)
	{
		for (j = 0; j < k1; j++)
		{
			printf("(%i,%i)->", i + 1, j + 1); scanf("%i", &A[i][j]);
		}
	}
}
void wypiszA(int *(*A), int w1, int k1)
{
	int i, j;
	printf("Macierz A:\n");
	for (i = 0; i < w1; i++)
	{
		for (j = 0; j < k1; j++)
		{
			printf("%i ", A[i][j]);
		}
		printf("\n");
	}
}

void main()
{
	int **A;
	int w1, k1, i, j;
	printf("Podaj rozmiar macierzy A: "); scanf("%i%i", &w1, &k1);
	wczytajA(&A, w1, k1);
	wypiszA(&A, w1, k1);
	system("pause");
	return 0;
}

Będę wdzięczny za pomoc.

1
  1. Jak zwracasz z main() 0 to zmień sobie na int main()
  2. Masz w funkcjach nieużywane zmienne
  3. Wydaje mi się, że lepiej jest alokować w main() niż w środku funkcji (u Cb wczytajA()) wywoływać dopiero tamtą funkcję.
    Tak jest bardziej uniwersalnie:
#include<stdio.h>
#include<stdlib.h>

int** arr_alloc(unsigned rows,unsigned cols) {
	int **array = (int**)malloc(rows * sizeof(int*));
	unsigned i;
	for(i=0;i<rows;i++)
		array[i] = (int*)malloc(cols * sizeof(int));
	return array;
}

void arr_fill(unsigned rows, unsigned cols, int **array) {
	unsigned i,j;
	for(i=0;i<rows;i++)
		for(j=0;j<cols;j++)
			scanf("%d",&array[i][j]);
}

void arr_print(unsigned rows, unsigned cols, int **array) {
	unsigned i,j;
	for(i=0;i<rows;i++) {
		for(j=0;j<rows;j++)
			printf("%d ",array[i][j]);
		printf("\n");
	}
}

int main(void)
{
	unsigned rows,cols;
	printf("Podaj rozmiar macierzy A\n"); scanf("%u %u", &rows, &cols);

	int **matrixA = arr_alloc(rows,cols);
    arr_fill(rows,cols,matrixA);
    arr_print(rows,cols,matrixA);

    unsigned i;
    for(i=0;i<rows;i++)
    	free(matrixA[i]);
    free(matrixA);

    return 0;
}

Pozdrawiam

0

Dziękuje za pomoc.
Pozdrawiam

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