rubenelportero

App Genera/Resuelve sistema de ecuaciones de 3 incógnitas

Oct 16th, 2013
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.23 KB | None | 0 0
  1. //                 Creado por Rubén García Segovia
  2. // Se permite la parcial o total modificación y la apropiación del código
  3. // Código creado en el año 2013 y es de libre uso
  4. //          http://ingenieroaburrido.com http://rubenelportero.net
  5. #include<stdlib.h>
  6. #include<stdio.h>
  7. //creamos las variables
  8. float A[4];
  9. float B[4];
  10. float C[4];
  11. float D[4];
  12. float x,y,z;
  13. int signo, dificultad = 3, solucion = 1, seleccion;
  14. void main (void){
  15. //Seleccionamos como semilla para la función rand() el tiempo actual
  16.     srand(time(NULL));
  17. //E iniciamos el bucle que dará vida al menú de la aplicación
  18.     do{
  19.         printf("*********************************\n");
  20.         printf("1.Generar sistemas\n");
  21.         printf("2.Resolver sistemas\n");
  22.         printf("3.SALIR DEL PROGRAMA\n");
  23.         printf("     http://ingenieroaburrido.com\n");
  24.         printf("*********************************\n");
  25.         scanf("%d", &seleccion);
  26.         if (seleccion < 1 || seleccion>3) printf("OPCION INCORRECTA. VUELVE A ELEGIR \n");
  27.         //Con switch mandamos a la aplicación a que haga la acción que haya introducido el user
  28.         switch (seleccion){
  29.             case 1:
  30.             //Se pide la dificultad
  31.             printf("Seleccione la dificultad del sistema\n");
  32.             printf("1. Soluciones sencillas entre [0,10]\n");
  33.             printf("2. Soluciones con decimales entre [0,10]\n");
  34.             printf("3. Soluciones con decimales entre [-10,10]\n");
  35.             scanf("%d",&dificultad);
  36.             if (dificultad == 1) {
  37.                 //X es el resto de rand() entre 11, lo que da un número entre 0 y 10
  38.                 //rand() de por sí puede tomar valores muy altos, y eso no nos conviene
  39.                 x = rand() % 11;
  40.                 y = rand() % 11;
  41.                 z = rand() % 11;
  42.             }
  43.             if (dificultad == 2){
  44.                 x = rand() % 11;
  45.                 y = rand() % 11;
  46.                 z = rand() % 11;
  47.                 //Al resultado del número aleatorio le sumamos 2 para que nunca sea 0 o 1
  48.                 x = x/((rand()%11)+2);
  49.                 y = y/((rand()%5)+2);
  50.                 z = z/((rand()%8)+2);
  51.             }
  52.             if (dificultad == 3){
  53.                 x = rand() % 21;
  54.                 y = rand() % 21;
  55.                 z = rand() % 21;
  56.                 x = x/((rand()%11)+2);
  57.                 y = y/((rand()%6)+2);
  58.                 z = z/((rand()%8)+2);
  59.                 //Aquí simplemente jugamos a las cartas para ver si el número es o no positivo
  60.                 if ((rand()%4)>1) x = -x;
  61.                 if ((rand()%4)>1) y = -y;
  62.                 if ((rand()%4)>1) z = -z;
  63.             }
  64.             //Aquí la generación aleatoria de coeficientes de la matriz
  65.             //También se juega con sus signos, todo aleatorio
  66.             A[0] = rand() % 6;
  67.             if ((rand()%4)>1) A[0] = -A[0];
  68.             B[0] = rand() % 6;
  69.             if ((rand()%3)>1) B[0] = -B[0];
  70.             C[0] = rand() % 6;
  71.             if ((rand()%2)>1) C[0] = -C[0];
  72.             A[1] = rand() % 7;
  73.             if ((rand()%2)>1) A[1] = -A[1];
  74.             B[1] = rand() % 9;
  75.             if ((rand()%4)>1) B[1] = -B[1];
  76.             C[1] = rand() % 11;
  77.             if ((rand()%3)>1) C[1] = -C[1];
  78.             A[2] = rand() % 4;
  79.             if ((rand()%3)>1) A[2] = -A[2];
  80.             B[2] = rand() % 9;
  81.             if ((rand()%2)>1) B[2] = -B[2];
  82.             C[2] = rand() % 11;
  83.             if ((rand()%3)>1) C[2] = -C[2];
  84.             D[0] = A[0]*x+B[0]*y+C[0]*z;
  85.             D[1] = A[1]*x+B[1]*y+C[1]*z;
  86.             D[2] = A[2]*x+B[2]*y+C[2]*z;
  87.             //imprimimos por pantalla el sistema
  88.             printf("\nSistema:\n");
  89.             printf("%gx + %gy + %gz= %g",A[0],B[0],C[0],D[0]);
  90.             printf("\n%gx + %gy + %gz= %g\n",A[1],B[1],C[1],D[1]);
  91.             printf("%gx + %gy + %gz= %g\n",A[2],B[2],C[2],D[2]);
  92.             //imprimimos por pantalla las soluciones
  93.             printf("\nSoluciones:\nX:%g\nY:%g\nZ:%g\n\n\n",x,y,z);
  94.             break;
  95.            
  96.             case 2:
  97.             //Aquí se enseña al user la forma del sistema
  98.             printf("A[0]x + B[0]y + C[0]z= D[0]");
  99.             printf("\nA[1]x + B[1]y + C[1]z= D[1]\n");
  100.             printf("A[2]x + B[2]y + C[2]z= D[2]\n");
  101.             //Y aquí se piden valores
  102.             printf("A[0]:");
  103.             scanf("%f",&A[0]);
  104.             printf("B[0]:");
  105.             scanf("%f",&B[0]);
  106.             printf("C[0]:");
  107.             scanf("%f",&C[0]);
  108.             printf("D[0]:");
  109.             scanf("%f",&D[0]);
  110.             printf("A[1]:");
  111.             scanf("%f",&A[1]);
  112.             printf("B[1]:");
  113.             scanf("%f",&B[1]);
  114.             printf("C[1]:");
  115.             scanf("%f",&C[1]);
  116.             printf("D[1]:");
  117.             scanf("%f",&D[1]);
  118.             printf("A[2]:");
  119.             scanf("%f",&A[2]);
  120.             printf("B[2]:");
  121.             scanf("%f",&B[2]);
  122.             printf("C[2]:");
  123.             scanf("%f",&C[2]);
  124.             printf("D[2]:");
  125.             scanf("%f",&D[2]);
  126.             //Si A[0] es 0 rota la fila 1 por la fila 3
  127.             if(A[0]==0) {
  128.                 A[3] = A[0];
  129.                 B[3] = B[0];
  130.                 C[3] = C[0];
  131.                 D[3] = D[0];
  132.                 A[0] = A[2];
  133.                 B[0] = B[2];
  134.                 C[0] = C[2];
  135.                 D[0] = D[2];
  136.                 A[2] = A[3];
  137.                 B[2] = B[3];
  138.                 C[2] = C[3];
  139.                 D[2] = D[3];
  140.             }
  141.             //Si tras rotar A[0] sigue siento 0, rota la fila 1 por la fila 2
  142.             if(A[0]==0) {
  143.                 A[3] = A[0];
  144.                 B[3] = B[0];
  145.                 C[3] = C[0];
  146.                 D[3] = D[0];
  147.                 A[0] = A[1];
  148.                 B[0] = B[1];
  149.                 C[0] = C[1];
  150.                 D[0] = D[1];
  151.                 A[1] = A[3];
  152.                 B[1] = B[3];
  153.                 C[1] = C[3];
  154.                 D[1] = D[3];
  155.             }
  156.             //imprime el sistema ya ordenado
  157.             printf("\nSistema:\n");
  158.             printf("%gx + %gy + %gz= %g",A[0],B[0],C[0],D[0]);
  159.             printf("\n%gx + %gy + %gz= %g\n",A[1],B[1],C[1],D[1]);
  160.             printf("%gx + %gy + %gz= %g\n",A[2],B[2],C[2],D[2]);
  161.             //Hace Gauss (0 por debajo de la diagonal principal)
  162.             D[1] = (D[1]*A[0]-D[0]*A[1]);
  163.             C[1] = (C[1]*A[0]-C[0]*A[1]);
  164.             B[1] = (B[1]*A[0]-B[0]*A[1]);
  165.             A[1] = (A[1]*A[0]-A[0]*A[1]);
  166.             D[2] = (D[2]*A[0]-D[0]*A[2]);
  167.             C[2] = (C[2]*A[0]-C[0]*A[2]);
  168.             B[2] = (B[2]*A[0]-B[0]*A[2]);
  169.             A[2] = (A[2]*A[0]-A[0]*A[2]);
  170.             /*Una vez que está la matriz |A[0] + B[0] + C[0] = D[0]|
  171.                                          | 0   + B[1] + C[1] = D[1]|
  172.                                          | 0   + B[2] + C[2] = D[2]|
  173.             Si B[1] es 0, se rota la fila 2 por la fila 3.
  174.             */
  175.             if(B[1]==0) {
  176.                 A[3] = A[1];
  177.                 B[3] = B[1];
  178.                 C[3] = C[1];
  179.                 D[3] = D[1];
  180.                 A[1] = A[2];
  181.                 B[1] = B[2];
  182.                 C[1] = C[2];
  183.                 D[1] = D[2];
  184.                 A[2] = A[3];
  185.                 B[2] = B[3];
  186.                 C[2] = C[3];
  187.                 D[2] = D[3];
  188.             }
  189.             //se termina de hacer ceros (a B[2])
  190.             D[2] = (D[2]*B[1]-D[1]*B[2]);
  191.             C[2] = (C[2]*B[1]-C[1]*B[2]);
  192.             B[2] = (B[2]*B[1]-B[1]*B[2]);
  193.             //Si C[2] se hace cero, el sistema será S.C.I.
  194.             if (C[2]==0){
  195.                 printf("\n El sistema no tiene solucion, son ecuaciones linealmente dependientes\n\n\n");
  196.                 solucion = 0;
  197.             }
  198.             z = D[2]/C[2];
  199.             C[1] = C[1] * z;
  200.             y = (D[1]-C[1])/B[1];
  201.             B[0] = y * B[0];
  202.             C[0] = C[0] * z;
  203.             x = (D[0]-B[0]-C[0])/A[0];
  204.             if (solucion == 1) printf("\nSoluciones:\nX:%g\nY:%g\nZ:%g\n\n\n",x,y,z);
  205.         };
  206.     } while (seleccion!=3);
  207. }
Advertisement
Add Comment
Please, Sign In to add comment