PageRenderTime 61ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/src/Superior.c

https://github.com/nahuelm/Superior
C | 353 lines | 268 code | 71 blank | 14 comment | 55 complexity | 442e58d94b06ce398547953031a1398c MD5 | raw file
  1. /*
  2. * Superior.c
  3. *
  4. * Created on: 30/06/2012
  5. * Author: utnso
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <math.h>
  10. char* FuncionDec(int n);
  11. int main(int argc, char **argv) {
  12. char c;
  13. int n;
  14. int decimales;
  15. char *cad;
  16. do{
  17. int nofunk;
  18. nofunk = 0;
  19. printf("Ingrese la cantidad de filas/Columnas: ");
  20. scanf("%d",&n);
  21. float matriz[n][n+1];
  22. int i, j;
  23. i = 0;
  24. printf("Ingrese la cantidad de decimales a utilizar (max 7): ");
  25. scanf("%d",&decimales);
  26. if ((decimales > 0) && (decimales < 8)){
  27. cad = FuncionDec(decimales);
  28. }else{
  29. nofunk = 2;
  30. printf("ERROR: Exceso de decimales\n");
  31. }
  32. if (nofunk == 0){
  33. printf("Matriz de %dx%d\n\n",n,n);
  34. while (i<=n-1){
  35. j = 0;
  36. while (j<=n-1){
  37. printf("Ingrese el a%d de la fila %d: ",j,i);
  38. scanf("%f", &matriz[i][j]);
  39. j++;
  40. }
  41. printf("Ingrese el b%d de la fila %d: ",j,i);
  42. scanf("%f", &matriz[i][j]);
  43. i++;
  44. }
  45. printf("\n\nSistema de Ecuaciones: \n\n");
  46. i = 0;
  47. while (i<=n-1){
  48. j = 0;
  49. while (j<=n-1){
  50. printf(cad,matriz[i][j]);
  51. printf("x%d ", i+1);
  52. j++;
  53. }
  54. printf ("= ");
  55. printf (cad,matriz[i][j]);
  56. printf ("\n");
  57. i++;
  58. }
  59. //Comprobar si Es Diagonalmente Dominante
  60. {
  61. int diagdom;
  62. float maxaux, suma;
  63. int indexaux;
  64. diagdom = 0;
  65. i = 0;
  66. while ((nofunk == 0) && (i<=n-1)){
  67. maxaux = 0;
  68. suma = 0;
  69. for (j=0;j<=n-1;j++){
  70. if (abs(matriz[i][j]) > abs(maxaux)){
  71. maxaux = abs(matriz[i][j]);
  72. indexaux = j;
  73. }
  74. if (abs(matriz[i][j]) == abs(maxaux)){
  75. }
  76. }
  77. diagdom = diagdom + indexaux +1;
  78. for (j=0;j<=n-1;j++){
  79. if (j!=indexaux){
  80. suma = suma + abs(matriz[i][j]);
  81. }
  82. }
  83. if (suma > maxaux){
  84. nofunk = 1;
  85. }
  86. i++;
  87. }
  88. if (nofunk == 1){
  89. printf("\nNo es Diagonalmente Dominante\n");
  90. nofunk = 1;
  91. }
  92. if (nofunk == 0){
  93. //Comprobar Orden de Columnas
  94. int sumin;
  95. sumin = 0;
  96. for (i=1;i<=n;i++){
  97. sumin = sumin +i;
  98. }
  99. if (sumin == diagdom){
  100. printf("Es Diagonalmente Dominante \n");
  101. }else{
  102. printf("No es Diagonalmente Dominante\n");
  103. nofunk = 1;
  104. }
  105. }
  106. }
  107. }
  108. //Ordenar Matriz
  109. if (nofunk==0){
  110. int indexaux;
  111. float Aux, maxaux;
  112. i = 0;
  113. while (i <= n-1){
  114. maxaux = 0;
  115. for (j=0;j<=n-1;j++){
  116. if (abs(matriz[i][j]) > abs(maxaux)){
  117. maxaux = abs(matriz[i][j]);
  118. indexaux = j;
  119. }
  120. if (abs(matriz[i][j]) == abs(maxaux)){
  121. }
  122. }
  123. if (indexaux != i){
  124. int contador;
  125. for (contador=0;contador<=n-1;contador++){
  126. Aux = matriz[contador][i];
  127. matriz[contador][i] = matriz[contador][indexaux];
  128. matriz[contador][indexaux] = Aux;
  129. }
  130. }
  131. i++;
  132. }
  133. printf("\n\nSistema de Ecuaciones ordenado \n\n");
  134. i = 0;
  135. while (i<=n-1){
  136. j = 0;
  137. while (j<=n-1){
  138. printf(cad,matriz[i][j]);
  139. printf("x%d ",j+1);
  140. j++;
  141. }
  142. printf ("= ");
  143. printf (cad,matriz[i][j]);
  144. printf ("\n");
  145. i++;
  146. }
  147. }
  148. //Metodo de Jacobi
  149. if (nofunk==0){
  150. float error;
  151. float calcerror;
  152. float erroractual;
  153. printf("\n\nIngrese el error aceptado: ");
  154. scanf("%f",&error);
  155. float matrizR[n];
  156. float matrizT[n][n];
  157. float matrizC[n];
  158. float matrizAux[n];
  159. float matrizError[n];
  160. int i,j;
  161. for (i=0;i<=n-1;i++){
  162. printf("Ingrese el x%d Inicial: ", i);
  163. scanf("%f",&matrizR[i]);
  164. }
  165. for (i=0;i<=n-1;i++){
  166. for (j=0;j<=n-1;j++){
  167. matrizT[i][j] = - matriz[i][j]/matriz[i][i];
  168. }
  169. matrizT[i][i] = 0;
  170. }
  171. for(i=0;i<=n-1;i++){
  172. matrizC[i] = matriz[i][n]/matriz[i][i];
  173. }
  174. int iteracion;
  175. float resultado;
  176. iteracion = 1;
  177. for (i=0;i<=n-1;i++){
  178. resultado = 0;
  179. for(j=0;j<=n-1;j++){
  180. resultado = resultado + (matrizT[i][j] * matrizR[j]);
  181. }
  182. matrizAux[i] = resultado + matrizC[i];
  183. }
  184. for (i=0;i<=n-1;i++){
  185. matrizError[i] = matrizR[i] - matrizAux[i];
  186. }
  187. for (i=0;i<=n-1;i++){
  188. matrizR[i] = matrizAux[i];
  189. }
  190. //Sacar error
  191. calcerror = 0;
  192. for (i=0;i<=n-1;i++){
  193. calcerror = calcerror + (matrizError[i]*matrizError[i]);
  194. }
  195. erroractual = sqrt(calcerror);
  196. //Imprimir Iteracion
  197. i = 0;
  198. printf("Iteracion: %d\n",iteracion);
  199. printf("Resultado: ( ");
  200. while (i<=n-2){
  201. printf(cad, matrizR[i]);
  202. printf(" ,");
  203. i++;
  204. }
  205. printf (cad,matrizR[i]);
  206. printf(" )\n");
  207. printf("Error de iteracion: %f\n\n",erroractual);
  208. while (erroractual >= error){
  209. iteracion++;
  210. for (i=0;i<=n-1;i++){
  211. resultado = 0;
  212. for(j=0;j<=n-1;j++){
  213. resultado = resultado + (matrizT[i][j] * matrizR[j]);
  214. }
  215. matrizAux[i] = resultado + matrizC[i];
  216. }
  217. for (i=0;i<=n-1;i++){
  218. matrizError[i] = matrizR[i] - matrizAux[i];
  219. }
  220. for (i=0;i<=n-1;i++){
  221. matrizR[i] = matrizAux[i];
  222. }
  223. //Sacar error
  224. calcerror = 0;
  225. for (i=0;i<=n-1;i++){
  226. calcerror = calcerror + (matrizError[i]*matrizError[i]);
  227. }
  228. erroractual = sqrt(calcerror);
  229. //Imprimir Iteracion
  230. i = 0;
  231. printf("Iteracion: %d\n",iteracion);
  232. printf("Resultado: ( ");
  233. while (i<=n-2){
  234. printf(cad, matrizR[i]);
  235. printf(" ,");
  236. i++;
  237. }
  238. printf (cad,matrizR[i]);
  239. printf(" )\n");
  240. printf("Error de iteracion: %f\n\n",erroractual);
  241. }
  242. }
  243. printf("\n Ingrese 's' Para ingresar un nuevo sistema de ecuaciones: ");
  244. scanf("%s", &c);
  245. }while ((c=='s')||(c=='S'));
  246. return 0;
  247. }
  248. char* FuncionDec(int n){
  249. char *j;
  250. j = malloc(15);
  251. switch (n){
  252. case 1:
  253. j = "%5.1f";
  254. return j;
  255. break;
  256. case 2:
  257. j = "%5.2f";
  258. return j;
  259. break;
  260. case 3:
  261. j = "%5.3f";
  262. return j;
  263. break;
  264. case 4:
  265. j = "%5.4f";
  266. return j;
  267. break;
  268. case 5:
  269. j = "%5.5f";
  270. return j;
  271. break;
  272. case 6:
  273. j = "%5.6f";
  274. return j;
  275. break;
  276. case 7:
  277. j = "%5.7f";
  278. return j;
  279. break;
  280. }
  281. return j;
  282. }