Advertisement
utroz

Briot-Ruffini Calc

Nov 21st, 2011
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.74 KB | None | 0 0
  1. //----------Functions.h ---------//
  2.  
  3. #include <stdio.h>    
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <math.h>
  7. #include "global.h"
  8.      
  9. /* Screen.c */
  10. void erase_down_ln(void);
  11. void clear_screen(void);
  12. void set_color(signed char, signed char);
  13. void upln (__line);
  14. void downln (__line);
  15. void leftln (__line);
  16. void rightln (__line);
  17.        
  18. /* Functions.c */
  19. void welcome_screen (short);
  20. int is_power(char *);
  21. int power_high(char *, short);
  22. void coeff_put(char *);
  23. void power_less(char *);
  24. int exists_zero(char *);
  25. int ind_briot_ruffini(char *, int *, int, signed char, signed char);
  26. void print_eqs(short *, signed char, signed char*);
  27. int organize_array(char *);
  28. int *search_coefficient(char *, signed char *);
  29. int invert(char *, char *);
  30. void start_calc(char *, short, short *, char *);
  31.  
  32. //----------Functions.c ---------//
  33.  
  34. #include "functions.h"
  35.  
  36. /* Start Screen Effect */
  37. void welcome_screen(short sleep_amount)
  38. {
  39.        register i,j;
  40.        
  41.        unsigned char screen[7][21]= {
  42.              { X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X },
  43.              { Y, O, B, B, B, O, B, O, B, O, B, O, B, O, O, O, B, O, O, O, Y },
  44.              { Y, O, B, B, B, O, B, O, O, O, B, O, B, B, O, B, B, O, B, B, Y },
  45.              { Y, O, B, B, B, O, B, O, B, O, B, O, B, B, O, B, B, O, O, O, Y },
  46.              { Y, O, B, B, B, O, B, O, B, O, B, O, B, B, O, B, B, O, B, B, Y },
  47.              { Y, O, O, O, B, O, B, O, B, O, B, O, B, B, O, B, B, O, O, O, Y },
  48.              { X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X } };
  49.  
  50.        
  51.         for(i = 0; i < 7; i++) {
  52.         rightln (20);
  53.         for(j = 0; j < 21; j++) {
  54.                 if((i > 0 && i < 6) && (j > 0 && j < 20))
  55.                 set_color(1,37);
  56.                 else
  57.                 set_color(1,34);           
  58.                 printf(" %c ", screen[i][j]);          
  59.         }
  60.         sleep(sleep_amount);
  61.         putchar('\n');
  62.         }
  63.         set_color(1,37);         
  64. }
  65.  
  66. /* Essa função verifica se ainda existe
  67.  * exponeciação na equação */
  68. int is_power(char *args)
  69. {
  70.         register i;
  71.        
  72.         for(i = 0; args[i]; i++)
  73.         if(args[i] == '^')         
  74.                 return 1;
  75.    
  76.         return 0;
  77. }
  78.  
  79. /* Essa função busca o maior valor
  80.  * da exponeciação na equação */
  81. int power_high(char *args, short option)
  82. {
  83.         register i;
  84.         short number, pos;
  85.        
  86.         number = pos = 0;
  87.         for(i = 0; args[i]; i++) {
  88.         if(args[i] == '^') {
  89.                 if( (atoi(&args[i+1])) > number) {
  90.                 number = atoi(&args[i+1]);
  91.                 pos = i + 1;
  92.                 }
  93.         }
  94.         }
  95.  
  96.     if(option)        
  97.             return pos;
  98.     else
  99.         return number;
  100. }
  101.  
  102. /* Ordena os coeficientes */
  103. void coeff_put(char *args)
  104. {
  105.         register i;
  106.         signed char count, buffer, numbers[2], pos[8];
  107.         short calc;
  108.        
  109.         for(i = count =  buffer = 0; args[i]; i++)
  110.         if(args[i] == '^') {
  111.                 numbers[count++] = atoi(&args[i+1]);
  112.                 pos[buffer++] = i;
  113.  
  114.         }  
  115.  
  116.         if((numbers[0]-1) != numbers[1]) {
  117.         calc = (numbers[0] - numbers[1] - 1) * 5;
  118.    
  119.         for(i = calc; i > 0; i--)
  120.                 args[strlen(args)] = '0';
  121.    
  122.         for(i = (strlen(args)-calc-1); i >= (pos[0]+2); i--)
  123.                 args[i+calc] = args[i];
  124.    
  125.         //for(i = 0; i < calc; i++)
  126.                 //args[i + pos[0]+2] = '0';
  127.    
  128.         count = 0;    
  129.         for(i = numbers[0]-1; i > numbers[1]; i--) {
  130.                 args[(count++) + pos[0]+2] = '+';
  131.                 args[(count++) + pos[0]+2] = '0';
  132.                 args[(count++) + pos[0]+2] = 'x';
  133.                 args[(count++) + pos[0]+2] = '^';
  134.                 sprintf(&buffer, "%d", i);
  135.                 args[(count++) + pos[0]+2] = buffer;           
  136.         }
  137.         }
  138.         if (args[strlen(args)-1] == '0')
  139.         args[strlen(args)-1] = 0;
  140.        
  141.         //printf("POS: %c %d\n", args[pos[0]+1], pos[0]);
  142.         //printf("X Numbers: %d %d\n\n", numbers[0], numbers[1]);
  143. }
  144.  
  145. /* Essa função busca o menor valor
  146.  * da exponeciação na equação e preenche
  147.  * o restante dos coeficientes */
  148. void power_less(char *args)
  149. {  
  150.         /* Corrigir para colocar coeficientes entre ^4 e ^2 por ex. */
  151.         signed char count;
  152.         short number;        
  153.         char *str = malloc(2 * sizeof(char));
  154.        
  155.         if(str == NULL) {
  156.         puts("Memory cannot be allocated!");
  157.         exit(EXIT_FAILURE);
  158.         }
  159.        
  160.         number = atoi(&args[strlen(args)-1]);  
  161.        
  162.         for(count = number-1; count > 0; count--) {
  163.         strcat(args, "+0x^");
  164.         sprintf(str, "%d", count);
  165.         strcat(args, str);
  166.         }
  167.         //printf("Num: %d | Str: %s\n", number, args);
  168.        
  169.         coeff_put(args);
  170.        
  171.         free(str);
  172. }
  173.  
  174. /* Esta função verifica se ainda existe algo
  175.  * a ser ordenado */
  176. int exists_zero(char *args)
  177. {
  178.         signed char check;
  179.        
  180.         check = 0;
  181.         while(*args) {
  182.         if(*args != '0')
  183.                 check = 1;
  184.         args++;
  185.         }
  186.        
  187.         return check;
  188. }
  189.  
  190. /* Calculo do limite através do Briof-Ruffini */
  191. int ind_briot_ruffini(char *args, int *coeff, int argc, signed char ind, signed char raiz)
  192. {
  193.         register i, j;
  194.         signed char pos = 2+argc, power;
  195.         int result = 0;
  196.         short map [3][pos];
  197.         char str[16];
  198.        
  199.     power = power_high(args, 0);
  200.  
  201.         for(i = 0; i < 3; i++)
  202.         for(j = 0; j < (pos); j++)
  203.                 map[i][j] = BL;
  204.    
  205.         map[1][0] = raiz;
  206.         map[1][pos-1] = ind;
  207.        
  208.         j = 0;
  209.         for(i = 1; i <= argc; i++)
  210.         map[1][i] = coeff[j++];
  211.        
  212.         for(i = 1; i <= argc; i++) {
  213.         if(i == 1)
  214.                 map[2][i] = map[1][i];
  215.         else
  216.                 map[2][i] = map[1][i] + map[0][i];
  217.         map[0][i+1] = map[2][i] * map[1][0];   
  218.         }
  219.         map[2][pos-1] = map[1][pos-1] + map[0][pos-1];
  220.        
  221.         j = 1;
  222.         for(i = pos-2; i > 0; i--)
  223.         result += map[2][j++] * pow(raiz, i-1);
  224.        
  225.         result += map[2][pos-1];        
  226.  
  227.         set_color(1,34);
  228.         for(i = 0; i < 3; i++) {
  229.         for(j = 0; j < (pos); j++) {
  230.                 if(map[i][j] == 48)
  231.                 printf("\t\t   ");
  232.                 else
  233.                 printf("\t\t| %d |", map[i][j]);
  234.                 // sleep(1);
  235.         }
  236.         //sleep(1);
  237.         putchar('\n');
  238.         }
  239.         set_color(1,37);         
  240.    
  241.     print_eqs(map[2], power-1, &pos);
  242.  
  243.         return result;
  244. }
  245.  
  246. void print_eqs(short *numbers, signed char power_n, signed char *pos_n)
  247. {
  248.     register i;
  249.     char *str;
  250.     char buffer[8];
  251.  
  252.     str = malloc((256 * power_n) * sizeof(char));  
  253.     if(str == NULL) {
  254.         puts("Memory cannot be allocated!");
  255.         exit(EXIT_FAILURE);
  256.     }
  257.  
  258.     for(i = 0; i < (*pos_n)-1; i++) {
  259.             if(numbers[i] == 48);
  260.             else {
  261.             if (power_n >= 1) {
  262.                 if(numbers[i] >= 0)
  263.                     sprintf(buffer, "+%dx^%d", numbers[i], (power_n--));
  264.                 else
  265.                     sprintf(buffer, "%dx^%d", numbers[i], (power_n--));
  266.             } else
  267.                 sprintf(buffer, "+(%d)", numbers[i]);
  268.  
  269.             strcat(str, buffer);
  270.         }
  271.             // sleep(1);
  272.     }
  273.     printf("\n\t\tNovo polinômio após a aplicação: %s\n", str);
  274.  
  275.     free(str);
  276. }  
  277.  
  278. /* Responsável por organizar a equação e
  279.  * capturar o termo independente */
  280. int organize_array(char *args)
  281. {
  282.         register i;
  283.         short number;
  284.         signed char pos, count = 0;
  285.  
  286.         if(*args != '+' && *args != '-') {
  287.         for(i = strlen(args)-1; i >= 0; i--)
  288.                 args[i+1] = args[i];
  289.    
  290.         args[0] = '+';
  291.         }
  292.  
  293.         for(i = 1; args[i]; i++)
  294.         if(args[i] >= '0' && args[i] <= '9') {
  295.                 pos = i;
  296.                 count = 1;
  297.                 if(args[i+1] >= '0' && args[i+1] <= '9') {
  298.                 pos = i+1;
  299.                 count = 2;
  300.             if(args[i-1] == '+') {
  301.                     number = atoi(&args[i]);
  302.                     number = atoi(&args[i-1]);
  303.             } else if(args[i-1] == '-') {
  304.                     number = -1 * atoi(&args[i]);
  305.                     number = atoi(&args[i-1]);
  306.             }
  307.        
  308.             if(args[pos+1] == '\0') {
  309.                     args[i-1] = 0;
  310.                     args[i] = 0;
  311.                     goto finish;
  312.                
  313.             } else if((args[i-1] == '+' || args[i-1] == '-') &&
  314.                 (args[i+2] == '+' || args[i+2] == '-')) {
  315.                     args[i-1] = '0';
  316.                     args[i] = '0';
  317.                     args[i+1] = '0';
  318.                     goto finish;
  319.             }      
  320.             } else {       
  321.             if(args[i-1] == '+')
  322.                     number = atoi(&args[i]);
  323.             else if(args[i-1] == '-')
  324.                     number = -1 * atoi(&args[i]);
  325.            
  326.             if(args[i+1] == '\0') {
  327.                     args[i-1] = 0;
  328.                     goto finish;
  329.                
  330.             } else if((args[i-1] == '+' || args[i-1] == '-') &&
  331.                 (args[i+1] == '+' || args[i+1] == '-')) {      
  332.                     args[i-1] = '0';
  333.                     args[i] = '0';
  334.                     goto finish;
  335.             }
  336.             }
  337.     }
  338.         finish:
  339.         for(i = pos-count; i < strlen(args); i++)
  340.         args[i] = args[i+(count)+1];
  341.        
  342.         return number;
  343. }
  344.  
  345. /* Procura os coeficientes e retorna-os */
  346. int *search_coefficient(char *args, signed char *amount)
  347. {
  348.         register i, j = 0;
  349.         int *numbers;
  350.        
  351.         numbers = malloc(sizeof(int));
  352.         if(numbers == NULL) {
  353.         puts("Memory cannot be allocated!");
  354.         exit(EXIT_FAILURE);
  355.         }
  356.        
  357.         for(i = 0; args[i]; i++) {
  358.         numbers = realloc(numbers, i+1);
  359.         if(numbers == NULL) {
  360.                 puts("Memory cannot be allocated!");
  361.                 exit(EXIT_FAILURE);
  362.         }
  363.    
  364.         if(args[i] == 'x') {           
  365.                 if(args[i-2] >= '0' && args[i-2] <= '9')
  366.                 numbers[j] = atoi(&args[i-2]);
  367.                 else
  368.                 numbers[j] = atoi(&args[i-1]); 
  369.            
  370.                 if(args[i-2] == '-' || args[i-3] == '-')
  371.                 numbers[j] *= -1;
  372.                     j++;
  373.         }
  374.         }
  375.         *amount = j;
  376.         return numbers;
  377. }  
  378.        
  379.  
  380. /* Função raiz responsável por toda ordenação
  381.  * da equação */
  382. int invert(char *args, char *new_args)
  383. {
  384.         register i, j;
  385.         char *string;        
  386.         signed char pos;
  387.         int array = 0;
  388.  
  389.         string = malloc(strlen(args) * sizeof(char));
  390.         if(string == NULL) {
  391.         puts("Memory cannot be allocated!");
  392.         exit(EXIT_FAILURE);
  393.         }
  394.        
  395.         if(is_power(args)) {
  396.         pos = power_high(args,1);
  397.         for(i = pos; i >= 0; i--) {
  398.                 if(args[i] == '+' || args[i] == '-') {
  399.                 for(j = i; j <= pos; j++) {
  400.                         string[array++] = args[j];
  401.                         args[j] = '0';
  402.                 }
  403.                 goto concatenate;
  404.                 }
  405.         }
  406.         } else {
  407.     for(i = strlen(args)-1; i >= 0; i--) {
  408.             if(args[i] == '+' || args[i] == '-')
  409.             for(j = i; j <= strlen(args)-1; j++) {
  410.                     string[array++] = args[j];
  411.                     args[j] = '0';
  412.             }
  413.         }      
  414.         goto concatenate;
  415.         }
  416.    
  417.         concatenate:
  418.         strcat(new_args, string);
  419.         free(string);
  420. }        
  421.  
  422. void start_calc(char *str, const short raiz, short *result_equation, char *name)
  423. {
  424.         char *new_str;
  425.         signed char ind_term, coeff_amount;
  426.         int *coefficient;
  427.         register i;
  428.  
  429.         printf("\n\t\t--------------------------------\n");
  430.         printf("\t\tPolinômio a ser calculado (%s): %s\n", name, str);
  431.        
  432.         ind_term = organize_array(str);
  433.        
  434.         new_str = malloc(strlen(str)+1 * sizeof(char));
  435.         if(new_str == NULL) {
  436.         puts("Memory cannot be allocated!");
  437.         exit(EXIT_FAILURE);
  438.         }
  439.  
  440.         while(exists_zero(str))
  441.                invert(str, new_str);        
  442.      
  443.         strcpy(str, new_str);    
  444.     power_less(str);   
  445.        
  446.     /*for(i = 0; str[i]; i++)
  447.       if(str[i] == '^')
  448.         if(str[i+1] == '1')
  449.           str[i+2] = 0;*/
  450.          
  451.         coefficient = search_coefficient(str, &coeff_amount);      
  452.    
  453.         printf("\t\tAplicação Briot-Ruffini: %s | Termo Independente: %d | Raiz: %d\n", str, ind_term, raiz);
  454.        
  455.     printf("\t\tCoeficientes:\t"); 
  456.         for(i = 0; i < coeff_amount; i++)
  457.         printf(" | %d | ", coefficient[i]);
  458.    
  459.         putchar('\n');putchar('\n');
  460.         *result_equation = ind_briot_ruffini(str, coefficient, coeff_amount, ind_term, raiz);
  461.  
  462.         free(coefficient);
  463.         free(new_str);
  464. }
  465.  
  466.  
  467.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement