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.
// 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; } } }
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.
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
Melhorando a precisão de valores flutuantes em python[AJUDA] (11)
GLPI - Configuração de destinatário com conta Microsoft Exchange (0)
Vou voltar moderar conteúdos de Dicas e Artigos (3)
OpenVPN no MACBOOK conecta mas não pinga pastas de rede compartilhada ... (1)