Advertisement
frentzy

Eliminare zero-uri din matrice cu pointeri

Dec 7th, 2017
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6. int ** Alocare(int linii, int coloane) { // Alocare spatiu pt dublu pointer
  7.     int **pointer;
  8.     if ((pointer = (int **)malloc(sizeof(int *)*linii)) == NULL) {
  9.         printf("Nu s-a gasit memorie.");
  10.         _getch();
  11.         exit(0);
  12.     }
  13.     for (int i = 0; i <linii; i++)
  14.         if ((pointer[i] = (int *)malloc(sizeof(int)*coloane)) == NULL) {
  15.             printf("nu s-a gasit memorie.");
  16.             _getch();
  17.             exit(0);
  18.         }
  19.  
  20.     return pointer;
  21. }
  22.  
  23. int *AlocareSimplu(int linii) { // Alocare spatiu pt pointer simplu
  24.     int *p;
  25.     if ((p = (int *)malloc(sizeof(int)*linii)) == NULL) {
  26.         printf("Nu s-a gasit memorie.");
  27.         _getch();
  28.         exit(0);
  29.     }
  30.     return p;
  31. }
  32.  
  33. int ** AlocareSpeciala(int *p, int linii, int coloane) { // Alocare spatiu pentru matricea care elimin pe toti 'zero'
  34.     int **G;
  35.     if ((G = (int **)malloc(sizeof(int *)*linii)) == NULL) {
  36.         printf("Nu s-a gasit memorie.");
  37.         _getch();
  38.         exit(0);
  39.     }
  40.     for (int i = 0; i < linii; i++){
  41.         if ((G[i] = (int *)malloc(sizeof(int)*(coloane - (*p)))) == NULL) { // coloane - (*p) inseamna ca nr de coloane e diferit la fiecare linie
  42.             printf("Nu s-a gasit memorie");
  43.             _getch();
  44.             exit(0);
  45.         }
  46.         p++;
  47.     }
  48.     return G;
  49. }
  50.  
  51. void CitireMatrice(int linii, int coloane, int **pointer) {
  52.  
  53.     for (int i = 0; i < linii; i++) {
  54.         for (int j = 0; j < coloane; j++) {
  55.             printf("matrice[%d][%d]= ", i, j);
  56.             scanf_s("%d", &pointer[i][j]);
  57.         }
  58.     }
  59. }
  60.  
  61. void AfisareMatrice(int linii, int coloane, int **pointer) {
  62.     for (int i = 0; i < linii; i++) {
  63.         for (int j = 0; j < coloane; j++) {
  64.             printf("%d ", pointer[i][j]);
  65.         }
  66.         printf("\n");
  67.     }
  68. }
  69.  
  70.  
  71. void NumaraZero(int linii, int coloane, int **pointer, int *p) { // aici stochez in p valori (fiecare pozitie din vector (p) contine o valoare iar acea valoare este nr de zero-uri care se afla pe fiecare linie)
  72.     int s;
  73.     //  p = AlocareSimplu(lung);
  74.     for (int i = 0; i < linii; i++) {
  75.         s = 0;
  76.         for (int j = 0; j < coloane; j++)
  77.             if (pointer[i][j] == 0)
  78.                 s++;
  79.  
  80.         *p = s;
  81.         p++;
  82.     }
  83. }
  84.  
  85. void MatFaraZero(int linii, int coloane, int **a, int **b, int *p) {
  86.     int x = 0, y = 0; // p= {2,3,0}
  87.     int *init_p;
  88.     init_p = p;
  89.     for (int i = 0; i < linii; i++) {
  90.         for (int j = 0; j < coloane; j++)
  91.             if (a[i][j] != 0) {
  92.                 b[x][y] = a[i][j]; // Stocare elemente nenule din prima matrice in a 2 matrice formand o matrice inegala   
  93.                 y++;
  94.             }
  95.         y = 0; // reinitializare coloane matrice b
  96.         x++;
  97.         p++;
  98.     }
  99.     p = init_p;
  100.  
  101.     printf("\nAfisare matrice fara zero:\n");
  102.  
  103.     for (int i = 0; i < linii; i++) {
  104.         for (int j = 0; j < (coloane - *p); j++) // nr de coloane e diferit mereu in functie de cat e *p la acea pozitie
  105.             printf("%d ", b[i][j]);                    
  106.         p++;
  107.         printf("\n");
  108.     }
  109. }
  110.  
  111. void main() {
  112.    
  113.     int **a, **rezultat, n, m, *p;
  114.  
  115.  
  116.     printf("Liniile  matrici: ");
  117.     scanf_s("%d", &n);
  118.     while (n < 0 || n == 0) {
  119.         printf("Introduceti valori din N pentru liniile matricii: ");
  120.         scanf_s("%d", &n);
  121.     }
  122.  
  123.     printf("Coloanele matrici: ");
  124.     scanf_s("%d", &m);
  125.     while (m < 0 || m == 0) {
  126.         printf("Introduceti valori din N pentru coloanele matricii: ");
  127.         scanf_s("%d", &m);
  128.     }
  129.  
  130.  
  131.     a = Alocare(n, m);
  132.     CitireMatrice(n, m, a);
  133.     printf("\nAfisare matrice:\n");
  134.     AfisareMatrice(n, m, a);
  135.  
  136.  
  137.     p = AlocareSimplu(n);
  138.     printf("\n");
  139.     NumaraZero(n, m, a, p);
  140.  
  141.     rezultat = AlocareSpeciala(p, n, m);
  142.     MatFaraZero(n, m, a, rezultat, p);
  143.  
  144.  
  145.     _getch();
  146. }
  147. // 0 0 1 0 0 0 4 5 6
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement