Calculadora elementar com ponto flutuante

Publicado por Eduardo Paim Silveira (última atualização em 09/04/2010)

[ Hits: 15.446 ]

Homepage: http://saidecimadomuro.blogspot.com

Download CalculadoraElementar.cpp




Exemplo de calculadora elementar de números inteiros e números reais utilizando enum, structs e unions para controlar o tipo de dado utilizado no momento do cálculo.

  



Esconder código-fonte

// CalculadoraElementar.cpp
// Eduardo "TheDrummer" Silveira

#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <stdlib.h>

enum tipo_numero {LONG, DOUBLE};

typedef union  {
   long l_valor;
   double d_valor;
}valor_numero;

typedef struct  {
   tipo_numero tipo; 
   valor_numero valor;
}NUMERO;

void escreve_numero(NUMERO num)
{ 
   if (num.tipo == LONG)
      printf ("\nValor lido: %ld",num.valor.l_valor);
   else
      printf ("\nValor lido: %lf",num.valor.d_valor);
}

NUMERO le_numero()
{ /*lê um número do teclado, retornando uma estrutura com o tipo e o valor lido; se o número for introduzido com um 
  ponto decimal, lê-o para um double, senão lê-o para um long;*/
   char string[50];
   NUMERO num;
   gets (string);
   if(strchr(string,'.')== NULL){ 
      num.tipo = LONG;
      num.valor.l_valor = atol (string);
   }else{
      num.tipo = DOUBLE;
      num.valor.d_valor = atof (string);
   }
   escreve_numero(num);
   return num;
}

NUMERO soma_numeros(NUMERO num1, NUMERO num2)
{ /*soma 2 números, retornando uma estrutura contendo o resultado; se pelo menos um 
  dos números for do tipo double o resultado será do tipo double, senão será do tipo long.*/
   NUMERO result;
   if (num1.tipo == DOUBLE || num2.tipo == DOUBLE){
      result.tipo = DOUBLE;
      result.valor.d_valor = ((num1.tipo == DOUBLE) ? num1.valor.d_valor :  num1.valor.l_valor)
                     + ((num2.tipo == DOUBLE) ? num2.valor.d_valor :  num2.valor.l_valor);
   }else{
      result.tipo = LONG;
      result.valor.l_valor = num1.valor.l_valor + num2.valor.l_valor;
   }
   return result;
}

NUMERO subtrai_numeros(NUMERO num1, NUMERO num2)
{
   NUMERO result;
   if (num1.tipo == DOUBLE || num2.tipo == DOUBLE){
      result.tipo = DOUBLE;
      result.valor.d_valor = ((num1.tipo == DOUBLE) ? num1.valor.d_valor :  num1.valor.l_valor)
                     - ((num2.tipo == DOUBLE) ? num2.valor.d_valor :  num2.valor.l_valor);
   }else{
      result.tipo = LONG;
      result.valor.l_valor = num1.valor.l_valor - num2.valor.l_valor;
   }
   return result;
}

NUMERO multiplica_numeros(NUMERO num1, NUMERO num2)
{
   NUMERO result;
   if (num1.tipo == DOUBLE || num2.tipo == DOUBLE){
      result.tipo = DOUBLE;
      result.valor.d_valor = ((num1.tipo == DOUBLE) ? num1.valor.d_valor :  num1.valor.l_valor)
                     * ((num2.tipo == DOUBLE) ? num2.valor.d_valor :  num2.valor.l_valor);
   }else{
      result.tipo = LONG;
      result.valor.l_valor = num1.valor.l_valor * num2.valor.l_valor;
   }
   return result;
}

NUMERO divide_numeros(NUMERO num1, NUMERO num2)
{
   NUMERO result;
   if (num1.tipo == DOUBLE || num2.tipo == DOUBLE){
      result.tipo = DOUBLE;
      result.valor.d_valor = ((num1.tipo == DOUBLE) ? num1.valor.d_valor :  num1.valor.l_valor)
                     /((num2.tipo == DOUBLE) ? num2.valor.d_valor :  num2.valor.l_valor);
   }else{
      result.tipo = LONG;
      result.valor.l_valor = num1.valor.l_valor / num2.valor.l_valor;
   }
   return result;
}

void main (){ 
   NUMERO num1,num2;
   char op;

   printf ("\nDigite valor: ");
   num1 = le_numero();
   while(1){

      do{
         printf ("\nDigite operador(+ - * / f): ");
         op = getchar();
         fflush(stdin);
         if (op != '+' && op != '-' && op != '*' && op != '/' && op != 'f')
            printf ("\nValor invalido!");
         if (op == 'f')
            exit(0);
      }while (op != '+' && op != '-' && op != '*' && op != '/' && op != 'f');

      printf ("\nDigite valor: ");
      num2 = le_numero();

      switch (op){
      case '+':
         num1 = soma_numeros(num1,num2);
         if (num1.tipo == LONG)
            printf ("\nResultado: %ld",num1.valor);
         else
            printf ("\nResultado: %lf",num1.valor);
         break;
      case '-':
         num1 = subtrai_numeros(num1,num2);
         if (num1.tipo == LONG)
            printf ("\nResultado: %ld",num1.valor);
         else
            printf ("\nResultado: %lf",num1.valor);
         break;
      case '*':
         num1 = multiplica_numeros(num1,num2);
         if (num1.tipo == LONG)
            printf ("\nResultado: %ld",num1.valor);
         else
            printf ("\nResultado: %lf",num1.valor);
         break;
      case '/':
         num1 = divide_numeros(num1,num2);
         if (num1.tipo == LONG)
            printf ("\nResultado: %ld",num1.valor);
         else
            printf ("\nResultado: %lf",num1.valor);
         break;
      }
   }
}

Scripts recomendados

Ler N números e ver qual é o maior

Manipulando argumentos com getopt_long

Lista Duplamente Encadeada em C

Cálculo de divisores de um número.

Estatística


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts