Calculadora elementar com ponto flutuante

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

[ Hits: 15.241 ]

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

Checkcred - Checagem de créditos.

CalDOS - 60 funções em uma calculadora

Filas

SIV - Simple Image Visualizer

Comando strncmp


  

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