Showing posts with label alocare dinamica. Show all posts
Showing posts with label alocare dinamica. Show all posts

Sunday, March 6, 2016

23) Ridicarea unei matrice la o putere data - alocare dinamica


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

void citireMatrice(int ***a, int *n) {
    int i,j;
    printf("Numarul de linii & coloane: "); scanf("%d", &(*n));
    (*a) = (int**)malloc((*n)*sizeof(int));
    for(i=0;i<(*n);i++) {
        (*a)[i] = (int*)malloc((*n)*sizeof(int));
    }
    for(i=0;i<*n;i++) {
        for(j=0;j<*n;j++) {
            printf("a[%d][%d] = ",i,j); scanf("%d", &(*a)[i][j]);
        }
    }
}

void afisareMatrice(int **a, int n) {
    int i,j;
    for(i=0;i<n;i++) {
        for(j=0;j<n;j++) {
            printf(" %d ", a[i][j]);
        }
        puts(" ");
    }

}



void putere(int **a, int ***b, int ***c, int n, int p) {
    int i,j,q,k;

    //alocare dinamica pentru matricele B si C
    (*b) = (int**)malloc(n*sizeof(int));
    for(i=0;i<n;i++) {
        (*b)[i] = (int*)malloc(n*sizeof(int));
    }

    (*c) = (int**)malloc((n)*sizeof(int));
    for(i=0;i<n;i++) {
        (*c)[i] = (int*)malloc((n)*sizeof(int));
    }



     //generarea matricei unitate de ordin n
    for(i=0;i<n;i++)
        for(j=0;j<n;j++) {
            (*b)[i][j]=(i==j);
    }


    for(q=0;q<p;q++) {
        for(i=0;i<n;i++)
            for(j=0;j<n;j++) {
                (*c)[i][j]=0;
                for(k=0;k<n;k++)
                    (*c)[i][j] = (*c)[i][j]+(*b)[i][k]*a[k][j];
            }
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                (*b)[i][j]=(*c)[i][j];
    }


    //afisarea matricei rezultate
    printf("Matricea ridicata la puterea %d este: \n", p);
    for(i=0;i<n;i++) {
        for(j=0;j<n;j++) {
            printf(" %d ", (*b)[i][j]);
        }
        puts(" ");
    }





}

void eliberare(int **a, int **b, int **c, int n) {
    int i;
    for(i=0;i<n;i++) {
        free(a[i]);
    }
    free(a);

    for(i=0;i<n;i++) {
        free(b[i]);
    }
    free(b);

    for(i=0;i<n;i++) {
        free(c[i]);
    }
    free(c);

}

void main(){
    int **a, **b, **c;
    int i,j,n,p;
    citireMatrice(&a,&n);
    afisareMatrice(a,n);
    printf("Puterea este: "); scanf("%d", &p);
    putere(a,&b,&c,n,p);


    eliberare(a,b,c,n);

}



Thursday, January 7, 2016

17) Determinarea elementului maxim dintr-un vector + aparitiile sale (subprogram)

Sa se scrie programul care afiseaza elementul maxim dintr-un vector precum si pozitiile pe care apare acesta. Vectorul va fi alocat dinamic iar elementele acestuia se vor citi de la tastatura.

  

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

void maxim(float *v, float *max, float *aparitii_maxim, int dim) {
    int i, k=0;
    *max = -99999;
    for(i=0;i<dim;i++) {
        if(v[i]>*max) {
            *max = v[i];
            k=1;
            aparitii_maxim[0] = i;
        }
        else if (v[i]==*max) {
            aparitii_maxim[k++] = i;
        }
    }

    printf("Elementul maxim este: %6.1f \n", *max);

    if(k>0) {
        for(i=0;i<k;i++) {
           printf("Maximul apare pe pozitiie: %6.0f \n", aparitii_maxim[i]);
        }
   }

}


int main() {
    float *v, element_maxim, aparitii[20];
    int i, dim;
    printf("Dimensiune vector: "); scanf("%d", &dim);
    v = (float*)malloc(dim*sizeof(float));
    for(i=0;i<dim;i++) {
        printf("v[%d] = ", i); scanf("%f", &v[i]);
    }

    maxim(v, &element_maxim, aparitii, dim);


}







16) Inmultirea unui a doua matrice (subprogram+alocare dinamica)

Sa se scrie programul care afiseaza rezultatul inmultirii unei matrice A cu o matrice B folosind un subprogram. Elementele ambelor matrice se vor citi de la tastatura.

  

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


float **produsF(float a[20][20], float b[20][20], int n, int k) {
    float **produs;
    int i,j,x;
    produs = (float**) malloc(n*sizeof(float));
    for(i=0;i<k;i++) {
        produs[i] = (float**) malloc(k*sizeof(float));
    }

    for(i=0;i<n;i++) {
        for(j=0;j<k;j++) {
            produs[i][j]=0;
            for(x=0;x<n;x++) {
                produs[i][j] += a[i][x]*b[x][j];
            }
        }
    }
    return produs;
}


int main() {
    float a[20][20], b[20][20], **c;
    int i,j,n,size,k;
    printf("Linii A: "); scanf("%d", &n);
    printf("Coloane A = Linii B: "); scanf("%d", &size);
    printf("Coloane B: "); scanf("%d", &k);

    for(i=0;i<n;i++) {
        for(j=0;j<size;j++) {
            printf("a[%d][%d] = ", i, j); scanf("%f", &a[i][j]);
        }
    }

    for(i=0;i<size;i++) {
        for(j=0;j<k;j++) {
            printf("b[%d][%d] = ", i, j); scanf("%f", &b[i][j]);
        }
    }

    c = produsF(a, b, n, k);
    puts("Matrice rezultat: ");
    for(i=0;i<n;i++) {
        for(j=0;j<size;j++) {
            printf(" %f ", c[i][j]);
        }
        puts(" ");
    }



}






Wednesday, January 6, 2016

13) Inmultirea unui vector cu o matrice (subprogram+alocare dinamica)

Sa se scrie programul care afiseaza rezultatul inmultirii unui vector cu o matrice folosind un subprogram. Elementele matricei si ale vectorului se vor citi de la tastatura.

  

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

void produs(int a[20][20], int b[], int *c, int dim) {
    int j,k;
    for(j=0;j<dim;j++) {
        c[j] = 0;
        for(k=0;k<dim;k++) {
            c[j] += b[k]*a[k][j];
        }
    }
}


int main() {
    int a[20][20], b[20], *c;
    int i,j,n,m;
     c = (int*)malloc(m*sizeof(int));
    printf("Numar linii: "); scanf("%d", &n);
    printf("Numar coloane: "); scanf("%d", &m);

    for (i=0;i<n;i++) {
        for(j=0;j<m;j++) {
            printf("a[%d][%d] =", i,j); scanf("%d", &a[i][j]);
        }
    }

    for(i=0;i<m;i++) {
        printf("b[%d] =", i); scanf("%d", &b[i]);
    }

    produs(a, b, c, m);
    puts("Vectorul rezultat: ");
    for(i=0;i<m;i++) {
        printf("c[%d] = %d \n",i,c[i]);
    }

    free(c);

}