0% found this document useful (0 votes)
72 views

Inmultire Matrice in C

Proiectul are ca scop inmultirea a doua matrice care sunt preluate din 2 fisiere date ca argumente. Fisierele au pe prima linie scris cu spatiu intre ele doar numarul de linii din matrice si numarul de coloane, iar apoi datele propriu-zise ale matricei scrise la fel, cu spatiu intre ele. Datele sunt de tip double(vor fi scrise in fisier cu cel putin o cifra dupa punct). Numarul de linii, respectiv numarul de coloane nu trebuie sa depaseasca valoarea 30 si nu trebuie sa fie mai mici ca 1 ( num

Uploaded by

Daniel Adrian
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
72 views

Inmultire Matrice in C

Proiectul are ca scop inmultirea a doua matrice care sunt preluate din 2 fisiere date ca argumente. Fisierele au pe prima linie scris cu spatiu intre ele doar numarul de linii din matrice si numarul de coloane, iar apoi datele propriu-zise ale matricei scrise la fel, cu spatiu intre ele. Datele sunt de tip double(vor fi scrise in fisier cu cel putin o cifra dupa punct). Numarul de linii, respectiv numarul de coloane nu trebuie sa depaseasca valoarea 30 si nu trebuie sa fie mai mici ca 1 ( num

Uploaded by

Daniel Adrian
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 7

#include<stdio.

h>
#include<stdlib.h>
#include <errno.h>
#include <string.h>
struct matrix {
int l;
int c;
double **data;
};

void freeSpace(struct matrix **m)


{
int i = 0;
if(*m != NULL && (*m)->l > 0 && (*m)->l < 30)
{
if((*m)->data != NULL)
{
for(i = 0; i < (*m)->l; i++)
{
if((*m)->data[i] != NULL)
free((*m)->data[i]);

}
free((*m)->data);
}
free(*m);
}
}

void display(struct matrix *m)


{
int l,c, i, j;
double d;

if(m != NULL && m->l > 0 && m->l < 30 && m->c > 0 && m->c < 30)
{
l = m->l;
c = m->c;
printf("Numarul de linii = %d \nNumarul de coloane = %d ",l,c);
for(i = 0; i < l; i++)
{
printf("\n");
for(j = 0; j < c; j++)
{
d = m->data[i][j];
printf("%4.2lf ", d);
}
}
}
else printf("Nu sunt date de afisat\n");
}
void allocateMemory(struct matrix **m, int linii, int coloane){

int i;

*m = (struct matrix*)malloc(sizeof(*m));
(*m)->l = linii;
(*m)->c = coloane;
(*m)->data = (double**)malloc(linii * sizeof(double*));
for(i = 0; i < linii; i++)
{
(*m)->data[i] = (double*)calloc(coloane, sizeof(double));
}
}

void readMatrix(struct matrix **m, char *file)


{
int i, j, errnum, linii, col;
char lines[1024], *aux;
double d;

FILE *in = fopen(file, "rt");

if(in == NULL)
{
errnum = errno;
fprintf(stderr, "Error opening file %s : %s\n",file,
strerror( errnum ));
*m = NULL;
return;
}

fgets(lines, sizeof lines, in); // citesc prima linie pe care sunt salvate
nr de linii si nr de coloane
if ( ( lines[0] < '0' || lines[0] > '9') && lines[0] != '\n' )
{
printf("\n In fisierul %s, sunt si alte caractere\n", file);
*m = NULL;
return;
}
i = strtol(lines, &aux, 10);
linii = i;

strcpy(lines,aux);
// printf("%d '%s'", i, lines);
if( ( lines[0] != ' ' || lines[1] < '0' || lines[1] > '9') && lines[0] !=
'\n')
{
printf("\n In fisierul %s, sunt si alte caractere \n", file);
*m = NULL;
return;
}

i = strtol(lines, &aux, 10);


if( ( lines[0] != ' ' || lines[1] < '0' || lines[1] > '9') && lines[0] !=
'\n')
{
printf("\n In fisierul %s, sunt si alte caractere \n", file);
*m = NULL;
return;
}
col = i;

if (linii > 30)


{
printf("\n In fisierul %s, numarul de linii depaseste valoare maxima
admisa(30)!\n", file);
*m = NULL;
return;
}

if(col > 30)


{
printf("\n In fisierul %s, numarul de coloane depaseste valoare maxima
admisa(30)!\n", file);
*m = NULL;
return;
}
if(linii < 1)
{
printf("\n In fisierul %s, numarul de linii trebuie sa fie cel putin
egal cu 1!\n", file);
*m = NULL;
return;
}
if(col < 1)
{
printf("\n In fisierul %s, numarul de coloane trebuie sa mai mare decat
1!\n", file);
*m = NULL;
return;
}

allocateMemory(m, linii, col);


i = 0;

while(fgets(lines,sizeof lines, in) != NULL)


{
i++;
j = 0;
if(i > linii)
{
printf("\nIn fisierul %s, sunt mai multe linii decat ar trebui sa
fie.\n", file);
freeSpace(m);
*m = NULL;
return;
}

while(lines[0] != '\n')
{
if(j == col)
{
printf("\nIn fisierul %s, pe linia %d, sunt mai multe elemente
decat este declarat la inceput ca ar trebui sa fie.\n",file, i);
freeSpace(m);
*m = NULL;
return;
}

d = strtod(lines, &aux);
strcpy(lines, aux);
if((lines[0] != ' ' || lines[1] < '0' || lines[1] > '9') &&
lines[0] != '\n' && lines[1] != '-' && lines[1] != '+' && lines[1] != '.')
{
if ( lines[0] == ' ' && (lines[1] =='-' || lines[1] == '+') &&
lines[2] != '.' )
{
printf("\n In fisierul %s, sunt si alte caractere
%d'%s'\n", file,i, lines);
freeSpace(m);
*m = NULL;
return;
}
}
(*m)->data[i-1][j] = d;
j++;
}

if(j < col)


{
printf("\nIn fisierul %s, pe linia %d, sunt mai putine elemente
decat este declarat la inceput ca ar trebui sa fie.\n",file, i);
freeSpace(m);
*m = NULL;
return;
}

if(i < linii)


{
printf("\nIn fisierul %s, sunt mai putine linii decat ar trebui sa
fie.\n", file);
freeSpace(m);
*m = NULL;
return;
}
display(*m);

fclose(in);

void saveFile(char *fisier, struct matrix *m)


{
int i, j, l, c, errnum;
double d;
FILE *out = fopen(fisier, "wt");

if(out == NULL)
{
errnum = errno;
printf("\nError opening file %s : %s\n",fisier, strerror( errnum ));
exit(0);
}

l = m->l;
fprintf(out, "%d ", l);
c = m->c;
fprintf(out, "%d\n", c);
for(i = 0; i < l; i++)
{
for(j = 0; j < c; j++)
{
d = m->data[i][j];
fprintf(out, "%.2lf", d);
if(j < c-1)
{
fprintf(out, " ");
}
else
fprintf(out,"\n");
}
}
fclose(out);
}

void multiply(struct matrix *mat1, struct matrix *mat2, struct matrix **rez)
{
int i, j, k, l1, c1, c2;

if(mat1 == NULL || mat2 == NULL)


{
printf("\nNu exista date");
*rez = NULL;
return;
}
if(mat1->c != mat2->l)
{
printf("\nNu se poate efectua inmultirea, nr de coloane din prima
matrice trebuie sa fie egal cu nr de linii din a doua matrice.\n");
*rez = NULL;
return;
}

l1 = mat1->l;
c1 = mat1->c;

c2 = mat2->c;

allocateMemory(rez,l1,c2);

for(i = 0; i < l1; i++)


for(j = 0; j < c2; j++)
for(k = 0; k < c1; k++)
{
(*rez)->data[i][j] = (*rez)->data[i][j] + (mat1->data[i][k]) *
(mat2->data[k][j]);
}

display(*rez);
}

int main(int argc, char *argv[])


{
struct matrix *mat1;
struct matrix *mat2;
struct matrix *rezultat;
printf("Matricea 1: \n\n");
readMatrix(&mat1, argv[1]);
if(mat1 == NULL)
return 0;
printf("\n\nMatricea 2: \n\n");
readMatrix(&mat2, argv[2]);
if(mat2 == NULL)
{
freeSpace(&mat1);
return 0;
}
printf("\n\nMatricea rezultata: \n\n");
multiply(mat1, mat2, &rezultat);
if(rezultat == NULL)
{
freeSpace(&mat1);
freeSpace(&mat2);
return 0;
}

saveFile(argv[3], rezultat);
freeSpace(&mat1);
freeSpace(&mat2);
freeSpace(&rezultat);

return 0;
}

You might also like