Gaus.c


SUBMITTED BY: bitcoinsachen

DATE: Jan. 19, 2017, 8:52 p.m.

FORMAT: C

SIZE: 7.1 kB

HITS: 553

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct matrix_s{
  5. char *name;
  6. double **element;
  7. long columns;
  8. long rows;
  9. }matrix_t;
  10. typedef enum boolean_e{
  11. FALSE = 0,
  12. TRUE = 1
  13. } boolean_t;
  14. matrix_t *matrix_allocate(long columns, long rows, char *name)
  15. {
  16. long i,j;
  17. matrix_t *m=calloc(1,sizeof(matrix_t));
  18. m->name=malloc(strlen(name));
  19. strcpy(m->name,name);
  20. m->rows = rows;
  21. m->columns = columns;
  22. m->element=calloc(rows,sizeof(double*));
  23. if(!m->name || !m->element)
  24. {
  25. fprintf(stderr,"Alloc error!");
  26. free(m);
  27. return 0;
  28. }
  29. for(i=0;i<rows;i++)
  30. {
  31. m->element[i]=calloc(columns,sizeof(double));
  32. if(!m->element[i])
  33. {
  34. fprintf(stderr,"alloc error");
  35. for(j=0;i<i;j++)
  36. free(m->element[j]); //bisherigen wieder freigeben
  37. free(m->element);
  38. free(m->name);
  39. free(m);
  40. return 0;
  41. }
  42. }
  43. return m;
  44. }
  45. boolean_t matrix_insert(matrix_t *m,long columns,long rows,double val)
  46. {
  47. boolean_t status=FALSE;
  48. if(!m) return status;
  49. if(columns<0 || rows<0 || columns>=m->columns || rows>=m->rows) return status;
  50. m->element[rows][columns] = val;
  51. return status=TRUE;
  52. }
  53. boolean_t matrix_free(matrix_t *m)
  54. {
  55. boolean_t status=FALSE;
  56. if(!m) return status;
  57. long i;
  58. for(i=0;i<m->rows;i++)
  59. free(m->element[i]);
  60. free(m->element);
  61. if(m->name) free(m->name);
  62. free(m);
  63. return status=TRUE;
  64. }
  65. void matrix_print(matrix_t *m)
  66. {
  67. long i,j;
  68. if(!m) return;
  69. for(i=0;i<m->rows;i++)
  70. {
  71. for(j=0;j<m->columns;j++)
  72. printf("%5g",m->element[i][j]);
  73. printf("\n");
  74. }
  75. printf("----------------\n");
  76. }
  77. void test_matrix(matrix_t *m)
  78. {
  79. long i,j;
  80. if(!m)
  81. {
  82. fprintf(stderr, "Nullpointer\n");
  83. return;
  84. }
  85. for(i=0;i<m->rows;i++)
  86. {
  87. for(j=0;j<m->columns;j++)
  88. m->element[i][j]=i+j;
  89. }
  90. matrix_print(m);
  91. }
  92. boolean_t gauss_forward(matrix_t *m,matrix_t *rs)
  93. {
  94. boolean_t status=FALSE;
  95. long i,j,k;
  96. if(!m || !rs)
  97. {
  98. fprintf(stderr, "Nullpointer\n");
  99. return status;
  100. }
  101. for(i=0;i<=m->columns-2;i++)
  102. {
  103. for(j=i+1;j<=m->rows-1;j++)
  104. {
  105. for(k=i+1;k<=m->columns-1;k++)
  106. {
  107. if((m->element[i][i])==0)
  108. {
  109. fprintf(stderr,"DIV 0");
  110. return 0;
  111. }
  112. m->element[j][k]=m->element[j][k]-(m->element[j][i]/m->element[i][i])*m->element[i][k];
  113. }
  114. if((m->element[i][i])==0)
  115. {
  116. fprintf(stderr,"DIV 0");
  117. return 0;
  118. }
  119. rs->element[j][0]=rs->element[j][0]-(m->element[j][i]/m->element[i][i])*rs->element[i][0];
  120. for(k=0;k<=i;k++)
  121. m->element[j][k]=0;
  122. }
  123. }
  124. return status=TRUE;
  125. }
  126. boolean_t gauss_backward(matrix_t *m,matrix_t *rs,matrix_t *sol)
  127. {
  128. long i,j;
  129. double sum=0;
  130. boolean_t status=FALSE;
  131. if(!m || !rs || !sol)
  132. {
  133. fprintf(stderr, "Nullpointer\n");
  134. return status;
  135. }
  136. for(i=m->rows-1;i>=0;i--)
  137. {
  138. sum=0;
  139. for(j=i;j<=m->columns-1;j++)
  140. {
  141. sum=sum+(m->element[i][j]*sol->element[j][0]);
  142. }
  143. if((m->element[i][i])==0)
  144. {
  145. fprintf(stderr,"DIV 0");
  146. return 0;
  147. }
  148. sol->element[i][0] = (rs->element[i][0]-sum)/m->element[i][i];
  149. }
  150. return status=TRUE;
  151. }
  152. boolean_t gauss_solve(matrix_t *m, matrix_t *rs, matrix_t *sol)
  153. {
  154. boolean_t status=FALSE;
  155. if(!m || !rs || !sol)
  156. {
  157. fprintf(stderr, "Nullpointer\n");
  158. return status;
  159. }
  160. if(m->columns != m->rows)
  161. {
  162. fprintf(stderr, "Wrong Dimension\n");
  163. return status;
  164. }
  165. if(!gauss_forward(m, rs))
  166. {
  167. fprintf(stderr, "Error in gauss_forward\n");
  168. return status;
  169. }
  170. if(!gauss_backward(m, rs, sol))
  171. {
  172. fprintf(stderr, "Error in gauss_backward\n");
  173. return status;
  174. }
  175. matrix_print(sol);
  176. return status=TRUE;
  177. }
  178. boolean_t matrix_fill(matrix_t *m,long dim)
  179. {
  180. long c=0,val,i,j,k=0;
  181. FILE *fp;
  182. char x[10];
  183. printf("stdin (1) or file (2) ?\n");
  184. scanf("%ld",&c);
  185. fflush(stdin);
  186. switch(c)
  187. {
  188. case 1 : for(i=0;i<dim;i++)
  189. for(j=0;j<dim;j++)
  190. {
  191. printf("%ld.%ld.: ",i,j);
  192. scanf("%ld",&val);
  193. fflush(stdin);
  194. matrix_insert(m,j,i,val);
  195. }
  196. break;
  197. case 2 : if((fp=fopen("test.csv","r"))) //Trennung mit ;
  198. {
  199. for(i=0;i<dim;i++)
  200. for(j=0;j<dim;j++)
  201. {
  202. while(x[k-1]!=';')
  203. {
  204. x[k]=fgetc(fp);
  205. k++;
  206. }
  207. k=0;
  208. matrix_insert(m,j,i,atof(x));
  209. }
  210. fclose(fp);
  211. }
  212. break;
  213. }
  214. return 1;
  215. }
  216. int main()
  217. {
  218. long c=0, i, dim;
  219. double val=0;
  220. matrix_t *m=0, *rs=0, *sol=0;
  221. do
  222. {
  223. printf("1. Create + Fill\n");
  224. printf("2. Print\n");
  225. printf("3. Gauss Solve\n");
  226. printf("0. Exit\n");
  227. scanf("%ld", &c);
  228. fflush(stdin);
  229. switch(c)
  230. {
  231. case 1:
  232. printf("Dimension? ");
  233. scanf("%ld",&dim);
  234. fflush(stdin);
  235. m=matrix_allocate(dim,dim,"Matrix1");
  236. matrix_fill(m,dim);
  237. break;
  238. case 2:
  239. matrix_print(m);
  240. break;
  241. case 3:
  242. rs=matrix_allocate(1, dim, "Right Side");
  243. sol=matrix_allocate(1, dim, "Solve");
  244. for(i=0;i<dim;i++)
  245. {
  246. printf("%d.%ld: ", 1, i+1);
  247. scanf("%lf", &val);
  248. rs->element[i][0]=val;
  249. }
  250. matrix_print(m);
  251. printf("Right Side:\n");
  252. matrix_print(rs);
  253. gauss_solve(m,rs,sol);
  254. matrix_free(m);
  255. matrix_free(rs);
  256. matrix_free(sol);
  257. break;
  258. }
  259. } while(c!=0);
  260. return 0;
  261. }

comments powered by Disqus