Mnożenie macierzy w ANSI C

Mnożenie macierzy w ANSI C
zeed94
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 9 lat
  • Postów:22
0

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

Kopiuj
#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.

spartanPAGE
Dlaczego tworzysz identyczne funkcje dla każdego z obiektów?
szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:5 dni
  • Lokalizacja:Kraków
  • Postów:1694
0
Kopiuj
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.

_13th_Dragon
To jest bardzo brzydkie rozwiązanie. Ta funkcja nie liczy iloczynu, ta funkcja wypisuje iloczyn. Czyli o kant ... potłuc.
zeed94
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 9 lat
  • Postów:22
0

Dziękuje bardzo.

zeed94
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 9 lat
  • Postów:22
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.

Kopiuj
 
#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.

KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:1683
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:
Kopiuj
#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


PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
BA
Alokować za pomocą malloc można gdziekolwiek. Jedynym przeciwwskazaniem może być czytelność
zeed94
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 9 lat
  • Postów:22
0

Dziękuje za pomoc.
Pozdrawiam

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.