Witam, dostałem na zadanie napisać program w ANSI C który będzie wykonywał operacje dodawania mnożenia lub potęgowania macierzy.
Program na przykładowym teście działa ok, ale dla innych już mi nie znanych wywala Runtime error:
6
ADD
1 1 //rozmiar macierzy 1
3
1 1 //rozmiar macierzy 2
5
ADD
3 2
1 2
3 4
1 1
3 2
3 3
3 3
2 2
MULTIPLY
2 3
1 1 1
1 1 2
3 3
3 3 1
3 3 1
2 2 1
MULTIPLY
2 2
1 1
1 1
3 2
3 3
3 3
3 3
POWER 4 // 4 znaczy, że do 4 potęgi
2 2
3 3
3 3
POWER 8
2 3
1 2 1
3 1 2
Oto mój kod:
#include <stdlib.h>
#include <stdio.h>
int** load (int *m, int *n)
{
int i,j;
scanf ("%d %d", &(*m), &(*n));
int **A = (int**) malloc( (*m) * sizeof (int) );
for (i = 0; i < *m; i++)
{
A[i] = (int*) malloc ((*n) * sizeof (int));
for (j = 0; j < *n; j++)
scanf ("%d", &A[i][j]);
}
return A;
}
void DISPLAY (int **C, int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
printf ("%d ", C[i][j]%1000);
printf ("\n");
}
}
void FreeMemory (int **A, int m)
{
int i;
if (A != NULL)
{
for (i = 0; i < m; i++)
free (A[i]);
free(A);
}
}
void ADD (int **A, int **B, int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
printf ("%d ", (A[i][j] + B[i][j])%1000);
printf ("\n");
}
}
int** MULTIPLY (int **A, int **B, int m, int n, int m1, int n1)
{
int i, j, k;
int **C = (int**) malloc( (m) * sizeof (int) );
for (i = 0; i < m; i++)
C[i] = (int*) malloc ((n1) * sizeof (int));
for (i = 0; i < m; i++)
for (j = 0; j < n1; j++)
C[i][j] = 0;
for (i = 0; i < m; i++)
for (k = 0; k < n; k++)
for (j = 0; j < n1; j++)
C[i][j] += A[i][k] * B[k][j];
return C;
}
int ** POWER (int** A, int m, int p)
{
int i,j;
int **W = (int**) malloc( (m) * sizeof (int) );
for (i = 0; i < m; i++)
W[i] = (int*) malloc ((m) * sizeof (int));
for (i = 0; i < m; i++)
for (j = 0; j < m; j++)
W[i][j] = 0;
for (i = 0; i < m; i++)
W[i][i] = 1;
while ( p > 0)
{
if (p % 2 == 1)
W = MULTIPLY(W, A, m, m, m, m);
p = p / 2;
A = MULTIPLY(A, A, m, m, m, m);
}
return W;
}
int main ()
{
char command[10];
int p, z, i;
scanf ("%d",&z);
for (i = 0; i < z; i ++)
{
scanf ("%s",command);
if (command[0] == 'P')
scanf ("%d", &p);
int m, n;
int **A = load(&m, &n);
//*********ADD*******//
if (command[0] == 'A')
{
int m1, n1;
int **B = load(&m1, &n1);
if (m != m1 || n != n1)
printf ("ERROR");
else
ADD(A, B, m, n);
FreeMemory (B, m);
}
//*********MULTIPLY********//
if (command[0] == 'M')
{
int m1, n1;
int **B = load(&m1, &n1);
if (n != m1)
printf ("ERROR\n");
else
{
int **C = MULTIPLY (A, B, m, m1, n, n1);
DISPLAY (C, m, n1);
FreeMemory (C, m);
}
FreeMemory (B, m);
}
//*********POWER********//
if (command[0] == 'P')
{
if (m == n)
{
int** C = POWER (A, m, p);
DISPLAY(C, m, m);
FreeMemory (C, m);
}
else
printf ("ERROR\n");
}
FreeMemory (A, m);
}
return 0;
}
Proszę o pomoc w znalezieniu błędu, pozdrawiam i z góry dziękuję.