Calculadora elementar com ponto flutuante
Publicado por Eduardo Paim Silveira (última atualização em 09/04/2010)
[ Hits: 15.900 ]
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;
}
}
}
Matrizes esparsas, produto por escalar e produto por um vetor
Nenhum comentário foi encontrado.
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Gentoo binário em 2026: UEFI, LUKS, Btrfs e Systemd
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
Instalar Linux em notebook Sony Vaio VPCEG13EB (10)
Vou destruir sua infância:) (6)
Quando vocês pararam de testar distros? (24)









