File: Stare vježbe/vjezbe09/54__2D_polja.c

  1. /*
  2.   54__2D_polja.c
  3.   Kombinirani rad s dvodimenzionalnim poljima i pointerima
  4.   -----
  5.   Program unosi dimenzije matrice A i njezine elemente, zatim racuna
  6.   sumu svih elemenata matrice, te ukoliko je matrica kvadratna
  7.   transponira ju.
  8.   Napomena: Analogon indeksiranja jednodimenzionalnog polja
  9.   x[i] == *(x+i)
  10.   za dvodimenzionalno polje jest:
  11.   A[i][j] == *(A[i]+j) == *(*(A+i)+j),
  12.   odnosno
  13.   A[i][j] == *(&A[0][0]+i*MAX+j),
  14.   gdje MAX predstavlja broj stupaca matrice A.
  15.   Primijetimo da pritom NE VRIJEDI:
  16.   A[i][j] == *(A+i*MAX+j),
  17.   buduci da se A tipovski ne podudara s:
  18.   int* A;
  19.   vec sa:
  20.   int (*A)[MAX];
  21. */
  22.  
  23. #include <stdio.h>
  24.  
  25. #define MAXRED 20
  26. #define MAXSTUP 20
  27.  
  28. /* Napomena: Kada je argument funkcije visedimenzionalno polje, ono se mora
  29.   deklarirati sa svim svojim dimenzijama ili sa svim dimenzijama osim prve */
  30. void unos(float A[][MAXSTUP], int m, int n) {
  31. int i, j;
  32.  
  33. for(i=0; i<m; i++)
  34. for(j=0; j<n; j++) {
  35. printf("A[%d][%d]=", i, j);
  36. scanf("%f", &A[i][j]);
  37. /* ili: scanf("%f", *(A+i)+j); */
  38. }
  39. }
  40.  
  41. void ispis(float A[][MAXSTUP], int m, int n) {
  42. int i, j;
  43.  
  44. for(i=0; i<m; i++) {
  45. for(j=0; j<n; j++)
  46. printf("%.2f ", A[i][j]);
  47. /* ili: printf("%.2f ", *(*(A+i)+j)); */
  48. printf("\n");
  49. }
  50. }
  51.  
  52. float suma_niza(float* x, int duljina) {
  53. float suma=0;
  54. int i;
  55. printf("Funkcija suma_niza: x = %d\n", x);
  56. for(i=0; i<duljina; i++)
  57. suma+=x[i];
  58. return suma;
  59. }
  60.  
  61. float suma_elemenata(float (*A)[MAXSTUP], int m, int n) {
  62. float ukupno=0;
  63. int i;
  64. printf("Funkcija suma_elemenata: *(A+0) = %d\n", *(A+0));
  65. for(i=0; i<m; i++)
  66. ukupno+=suma_niza(*(A+i), n);
  67. /* ili: ukupno+=suma_niza(&A[i][0], n); */
  68. return ukupno;
  69. }
  70.  
  71. void transponiraj(float (*A)[MAXSTUP], int m, int n) {
  72. int i, j;
  73. float temp;
  74.  
  75. for(i=0; i<m; i++)
  76. for(j=i+1; j<n; j++) {
  77. temp=*(*(A+i)+j);
  78. *(*(A+i)+j)=*(*(A+j)+i);
  79. *(*(A+j)+i)=temp;
  80. }
  81. }
  82.  
  83. int main() {
  84. int m, n;
  85. float A[MAXRED][MAXSTUP];
  86.  
  87. printf("Unesite broj redaka matrice A: ");
  88. scanf("%d", &m);
  89. printf("Unesite broj stupaca matrice A: ");
  90. scanf("%d", &n);
  91. unos(A, m, n);
  92.  
  93. printf("\nFunkcija main: &A[0][0] = %d\n", &A[0][0]);
  94. printf("\nSuma elemenata matrice A iznosi %.2f.\n\n",
  95. suma_elemenata(A, m, n));
  96.  
  97. if(m==n)
  98. transponiraj(A, m, n);
  99. ispis(A, m, n);
  100.  
  101. return 0;
  102. }
  103.