Advertisement
lmartins333

AlgoritmoDeEuclides

Jan 11th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.61 KB | None | 0 0
  1. /*
  2. Algoritmo desenvolvido como solução ao problema apresentado em sala de aula na
  3.  disciplina Matemática Discreta ministrada pelo professor André Almeida, onde
  4.  o mesmo propôs que o Algoritmo de Euclides fosse implementado em alguma línguagem
  5.  de programação.
  6.  
  7.  Alunos:
  8.    Dhian Kelson de Oliveira Leite
  9.    Lucas Henrique Martins Soares
  10.    Maria Eliana da Silva Holanda
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <locale.h>
  16.  
  17. // A constante  "LINHAS" define um tamanho padrão de linhas na matriz.
  18. #define LINHAS 3
  19.  
  20. int main() {
  21.     // Faz com que o prompt permita acentuações.
  22.     setlocale(LC_ALL, "");
  23. /*
  24.     As variáveis "dividendo" e "divisor" armazenam o valor informado pelo usuário
  25.      até o fim da execução do programa, pois esses valores são utilizados em
  26.      diferentes partes do código.
  27.     As variáveis "divisorTemp" e "dividendoTemp" serão usadas para armazenar os
  28.      sucessivos valores calculados à partir dos valores em "dividendo" e "divisor".
  29.     A variável "temp" será usada para armazenar os valores que serão passados de
  30.      uma variável a outra durante a execução.
  31.     A variável "contador" será usada para calcular e definir as colunas da matriz.
  32.     As variáveis "x", "y" e "z" são usadas para acessar os campos da matriz.
  33.     A variável "divInt" será usada para armazenar a divisão inteira que é usada
  34.      no algoritmo.
  35. */
  36.     int dividendo, divisor, dividendoTemp = 0, divisorTemp = 0, temp, contador, x, y, z, divInt;
  37. // É usado para verificar se o usuário quer continuar a execução do pograma.
  38.     char opcao;
  39.  
  40. // Define o tamanho da tela.
  41.     system("mode con cols=100 lines=26");
  42.  
  43.     do {
  44.     // Limpa a tela.
  45.         system("cls");
  46.     // Define a cor padrão.
  47.         system("color 1F");
  48.  
  49.         /*
  50.             É incrementado 2 ao "contador" por que sempre existem duas colunas para armazenar
  51.              a primeira conta.
  52.         */
  53.         contador = 2;
  54.  
  55.         printf("\n\t\t######### Algoritmo de Euclides #########\n\n");
  56.  
  57.     // Recebe e valida o primeiro algarismo.
  58.         do {
  59.             printf("\n  Informe o primeiro algarismo: ");
  60.         // Lê o valor informado pelo usuário.
  61.             scanf("%d", &dividendo);
  62.  
  63.         // Se o valor informado for igual a zero...
  64.             if (dividendo == 0) {
  65.             // Limpa a tela.
  66.                 system("cls");
  67.                 printf("\n\nO dividendo deve ser diferente de zero!\n\n");
  68.             }
  69.     // O laço repetirá enquanto o valor informado for igual a zero.
  70.         } while (dividendo == 0);
  71.  
  72.     // Recebe e valida o segundo algarismo.
  73.         do {
  74.             printf("  Informe o segundo algarismo: ");
  75.         // Lê o valor informado pelo usuário.
  76.             scanf("%d", &divisor);
  77.  
  78.         // Se o valor informado for igual a zero...
  79.             if (divisor == 0) {
  80.             // Limpa a tela.
  81.                 system("cls");
  82.                 printf("\n\nO dividendo deve ser diferente de zero!\n\n");
  83.             }
  84.     // O laço repetirá enquanto o valor informado for igual a zero.
  85.         } while (divisor == 0);
  86.  
  87.     // Verifica se o divisor é maior que o dividendo, caso sim, inverte seus valores.
  88.         if (divisor > dividendo) {
  89.             temp = divisor;
  90.             divisor = dividendo;
  91.             dividendo = temp;
  92.         }
  93.  
  94.     /*
  95.         Os valores são atribuídos às variáveis temporárias para iniciar o cálculo do
  96.          número de colunas necessário e preservando o valor informado inicialmente pelo
  97.          usuário.
  98.     */
  99.         dividendoTemp = dividendo;
  100.         divisorTemp = divisor;
  101.  
  102.     /*
  103.         Esse laço é usado para calcular quantas colunas serão necessárias para formar
  104.          a matriz que armazenará os valores obtidos no algoritmo, o número de colunas
  105.          será armazenado em "contador".
  106.         A ideia é simular as sucessivas operações até que o resto da divisão seja 0 e
  107.          ir incrementando a variável "contador" para cada nova operação, permitindo
  108.          saber quantas colunas serão necessárias para a matriz ao atingir um resto 0.
  109.     */
  110.         while((dividendoTemp % divisorTemp) != 0) {
  111.             contador++;
  112.             temp = divisorTemp;
  113.             divisorTemp = dividendoTemp % divisorTemp;
  114.             dividendoTemp = temp;
  115.         }
  116.  
  117.     /*
  118.         O número de linhas é uma constante LINHAS por que é a quantidade necessária no
  119.          Algoritmo de Euclides. A coluna é variável por que depende de quantos cálculos
  120.          serão necessários até se encontrar o resultado esperado.
  121.     */
  122.         int matriz[LINHAS][contador];
  123.  
  124.     /*
  125.         Os valores são atribuídos às variáveis temporárias novamente para iniciar de fato
  126.           os sucessivos cálculos do algoritmo.
  127.     */
  128.         dividendoTemp = dividendo;
  129.         divisorTemp = divisor;
  130.  
  131.     /*
  132.         Esse laço é usado para zerar todas as posições da matriz, pois alguns endereço
  133.          podem armazenar lixo, alterando algum resultado esperado nas posições matriz[0][0]
  134.          e matriz[N][N] (sendo N o valor máximo usado na conta).
  135.     */
  136.         for (x = 0; x < LINHAS; x++) {
  137.             for (y = 0; y < contador; y++) {
  138.                 matriz[x][y] = 0;
  139.             }
  140.         }
  141.  
  142.     /*
  143.         Nesse laço os valores são calculados e armazenados na matriz em suas respectivas
  144.          posições.
  145.     */
  146.         for (x = 0; x < (contador - 1); x++) {
  147.             divInt = dividendoTemp / divisorTemp;
  148.             matriz[0][x+1] = divInt;
  149.             matriz[1][x] = dividendoTemp;
  150.             temp = divisorTemp;
  151.             divisorTemp = dividendoTemp % divisorTemp;
  152.             matriz[2][x] = divisorTemp;
  153.             dividendoTemp = temp;
  154.             matriz[1][x+1] = dividendoTemp;
  155.         }
  156.  
  157.         printf("\n\t");
  158.  
  159.     // Imprime linhas usadas para formar uma tabela.
  160.         for (z = 0; z < contador; z++) {
  161.             printf("----------------");
  162.         }
  163.  
  164.         printf("\n\t");
  165.  
  166.     // Nesse laço os valores calculados são exibidos em tela.
  167.         for (x = 0; x < LINHAS; x++) {
  168.             for (y = 0; y < contador; y++) {
  169.                 if (((x == 0) && (y == 0)) || (((x + 1) == LINHAS) && ((y + 1) == contador))) {
  170.                     printf("|\t\t");
  171.                 } else {
  172.                     printf("|\t%d\t", matriz[x][y]);
  173.                 }
  174.                 if ((y + 1) == contador) {
  175.                     printf("|");
  176.                 }
  177.             }
  178.  
  179.             printf("\n\n\t");
  180.  
  181.             for (z = 0; z < contador; z++) {
  182.             // Imprime linhas usadas para formar uma tabela.
  183.                 printf("----------------");
  184.             }
  185.  
  186.             printf("\n\t");
  187.         }
  188.  
  189.     // O MDC é igual ao último valor calculado em "dividendoTemp"
  190.       printf("\n\tO MDC entre %d e %d é %d!\n\n", dividendo, divisor, dividendoTemp);
  191.  
  192.     /*
  193.         Se o último valor encontrado for o número 1, quer dizer que os números são
  194.          primos entre si.
  195.     */
  196.         if (dividendoTemp == 1) {
  197.             printf("\n\tPortanto, os números %d e %d são primos entre si!\n\n", dividendo, divisor);
  198.             system("color 4C");
  199.         } else {
  200.             printf("\n\tPortanto, os númeos %d e %d não são primos entre si!\n\n", dividendo, divisor);
  201.             system("color 2A");
  202.         }
  203.  
  204.         printf("\n  Deseja continuar? (Pressione C e confirme): ");
  205.     // Recebe a opção que o usuário deseja.
  206.         scanf("%s", &opcao);
  207.  
  208. // Repete enquanto o usuário informar "C" ou "c".
  209.     } while((opcao == 'c') || (opcao == 'C'));
  210.  
  211.     return 0;
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement