Calculadora elementar com ponto flutuante
Publicado por Eduardo Paim Silveira (última atualização em 09/04/2010)
[ Hits: 15.777 ]
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;
}
}
}
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Instalação dualboot Windows 11 e Debian 13 (14)
Ubunto não reconhece rede ethernet (1)









