Advertisement
Lionek1437

Untitled

Nov 24th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX 100
  5.  
  6. void matrix_multiply(int position, int *row, int *col, int **arr);
  7. /*cely princip programu:
  8. nacteni az 100 matic jako 1D pole v arr[100] a do row[] col[] ulozit jejich vysku resp sirku.. do operator[] nacist operator..:D
  9.  
  10. projede vsechny operatorz a pokud je '*' posle do fce matrix_multiply
  11.  
  12. podruhe projede vsechny matice a secte / odecte
  13.  
  14. vypise vse..
  15. */
  16.  
  17. int main(int argc, char* argv[]){
  18.  
  19. char operator[MAX];
  20. int row[MAX],col[MAX];
  21. int **arr = (int**)malloc(MAX*sizeof(int*));
  22. int i, j, load=0;
  23.  
  24. //load matrixes into arr
  25. for (i=0; i<MAX; ++i){
  26. load = scanf("%i", &row[i]);
  27. load += scanf("%i", &col[i]);
  28. if(load!=2){
  29. --i;
  30. break;
  31. }
  32. load =0;
  33. arr[i]=(int*)malloc(row[i]*col[i]*sizeof(int));
  34.  
  35. for (int r=0; r<row[i]*col[i]; ++r){
  36. if(scanf("%i", &arr[i][r])!=1){
  37. fprintf(stderr, "Error: Chybny vstup!\n");
  38. return 100;
  39. }
  40. }
  41. scanf("%c%c", &operator[i], &operator[i]); //nacte operator (musi nejdriv zahodit konec radku, potom az vlastni operator)
  42. }
  43.  
  44. //multiply
  45. for(int j=0; j<i; j++){
  46. if (operator[j]=='*'){
  47. if (row[j+1] == col[j]){ //kontrola jestli matice vubec jde vynasobit
  48. matrix_multiply(j, row, col, arr); // posle do matrix_multiply
  49. operator[j]='+';
  50. }
  51. else{
  52. fprintf(stderr, "Error: Chybny vstup!\n");
  53. return 100;
  54. }
  55. }
  56. }
  57.  
  58. //plus and minus
  59. for(j=0; j<i; ++j){
  60. //secte/odecte pokud jde (tota verye matici a jeji nasledujici - vlastni problem
  61. if(j>0 && (row[j]!=row[j+1] || col[j]!=col[j+1])){
  62. fprintf(stderr, "Error: Chybny vstup!\n");
  63. // return 100;
  64. }
  65. if(operator[j]=='-'){
  66. for (int k = 0; k<row[j]*col[j]; ++k)
  67. arr[j+1][k]=arr[j][k]-arr[j+1][k];
  68. }
  69.  
  70. if(operator[j]=='+'){
  71. for (int k = 0; k<row[j]*col[j]; ++k)
  72. arr[j+1][k]=arr[j][k]+arr[j+1][k];
  73. }
  74. }
  75.  
  76. /* plus[minus vol 2... pocita s vynulovanim col[] v matix_multiply
  77.  
  78. for(j=0; col[j]==0; ++j); //najde prvni nenulovy prvek
  79. for(;j<i; j = j+h){ //nakonci j preskoci na prvek se kterym se porovnaval
  80. h=1;
  81. while(col[j+h]==0) //j+h je dalsi nenulovz prvek po j
  82. ++h;
  83. praktivcky stejne jak vol.1 ale misto j+1 je j+h
  84.  
  85. toto umi vyresit problem s kontrolou, ale neumi pocitat / nejspis spatne indexy pole a uz mi z toho hrabe
  86.  
  87. */
  88.  
  89. //printing result
  90. printf("%i %i\n", row[j], col[j]);
  91. for (int k = 0; k<col[j]*row[j];++k){
  92. if((k+1)%col[j]==0){
  93. printf("%i\n", arr[j][k]);
  94. }
  95. else{
  96. printf("%i ", arr[j][k]);
  97. }
  98.  
  99. }
  100. /* for(int bla = 0; bla < i; ++bla){
  101. printf("%i", col[bla]);
  102. free(arr[bla]);
  103. }*/
  104. free(arr);
  105. }
  106.  
  107. void matrix_multiply(int position, int *row, int *col, int **arr){
  108. //vlastni nasobeni funguje, ver tomu
  109.  
  110. int rA = row[position];
  111. int cA = col[position];
  112. int cB = col[position +1];
  113. int nb =0;
  114. int schwein=0;
  115.  
  116. int *result = (int*)malloc(rA*cB*sizeof(int));
  117.  
  118. for(int m=0; m<rA; ++m){
  119. for(int p=0; p<cB; ++p){
  120. for(int i=0; i<cA; ++i){
  121. nb = nb+arr[position][m*cA+i]*arr[position+1][i*cB+p];
  122. }
  123. result[schwein]= nb;
  124. nb=0;
  125. ++schwein;
  126. }
  127. }
  128.  
  129. arr[position]=(int*)realloc(arr[position], rA*cB*sizeof(int)); // zmena velikosti v pameti obou matic na vyslednou matici (kvuli scitani bey core dumped
  130. arr[position+1]=(int*)realloc(arr[position+1], rA*cB*sizeof(int));
  131.  
  132. for (int i=0; i<rA*cB; ++i){
  133. arr[position][i]=result[i]; //vytiskne vysledek nasobeni do LEVE matice
  134. arr[position+1][i]=0; //vytiskne do prave matice 0000000
  135. }
  136. /*tady zacina problem.. zmeni ulozenou velikost obou matic, aby prosly kontrolou pri scitani.. nicmene..
  137. pokud nasobis vic matic za sebou / napr rozmerech 4*4, 4*3, 3*2, pak vysledna matice je 4*2, col[position] je 3 -> neprojde kontrolou rozmeru pri scitani*/
  138. row[position+1]=rA;
  139. col[position]=cB;
  140. free(result);
  141. /*co me napadlo tak udelat
  142. col[result = 0];
  143.  
  144. a pri scitani rict "if col[]==0, "skip";*/
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement