Um número real pode ser representado, por exemplo, pela estrutura abaixo, na qual esq e dir representam os dígitos à esquerda e à direita do ponto decimal, respectivamente. Se esq for um inteiro negativo, o número real representado será negativo.
struct numeroReal
{
int esq;
int dir;
};
a. Escreva uma função que receba como parâmetro a estrutura acima e retorne o número real representado por ela.
b. Elabore as funções soma, subtracao e multiplicacao que tenham como parâmetros duas variáveis do tipo da estrutura acima e que armazenem o resultado da soma, subtração e multiplicação, respectivamente, dos dois parâmetros de entrada, em uma terceira estrutura. O número real representado pela última estrutura deve ser impresso por cada uma das funções.
struct numeroReal
{
int esq;
int dir;
};
b. Elabore as funções soma, subtracao e multiplicacao que tenham como parâmetros duas variáveis do tipo da estrutura acima e que armazenem o resultado da soma, subtração e multiplicação, respectivamente, dos dois parâmetros de entrada, em uma terceira estrutura. O número real representado pela última estrutura deve ser impresso por cada uma das funções.
Passo 1
O enunciado define uma estrutura em C
struct numeroReal {
int esq; // parte inteira (se negativo, o número é negativo)
int dir; // parte fracionária, armazenada como inteiro (por exemplo, dir\(=25\) representa .25 se tiver 2 dígitos)
};
Precisamos:
- Fazer uma função que converta
numeroRealem umdoublecom o valor correto. - Fazer as funções
soma,subtracaoemultiplicacaoque recebam duas variáveisnumeroReale preencham uma terceira com o resultado, imprimindo o número real desse resultado.
Passo 2
Para converter
numeroReal n em double, seguimos estes passos:- Contar quantos dígitos tem
n.dir. Sedir == 0, consideramos 1 dígito. - Calcular
div = 10^ndigitos. frac = n.dir / div.- Se
n.esq < 0, o número real valen.esq - frac; senão,n.esq + frac.
Implementação em C:
#include <math.h>
#include <stdlib.h>
int numDigits(int x) {
if (x \(==0\)) return 1;
x = abs(x);
int cnt \(=0\);
while (x > 0) {
cnt\(++\);
x /\(=10\);
}
return cnt;
}
double toReal(struct numeroReal n) {
int d = numDigits(n.dir);
double div = pow(10.0, d);
double frac = n.dir / div;
return (n.esq < 0) ? (n.esq - frac) : (n.esq + frac);
}
Passo 3
Para converter um
double x de volta em numeroReal *n:n->esq = (int)x;(trunca parte inteira, em C isso retira a parte fracionária, aproximando para zero).frac = fabs(x - n->esq);- Escolhemos um número fixo de casas decimais para
dir; por exemplo, 6 casas:
int casas \(=6\);
int dir = (int)(frac * pow(10.0, casas) \(+0.5\)); // arredondamento
n->dir = dir;
Código completo da conversão inversa:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void toNumeroReal(double x, struct numeroReal *n) {
n->esq = (int)x;
double frac = fabs(x - n->esq);
int casas \(=6\);
n->dir = (int)(frac * pow(10.0, casas) \(+0.5\));
}
Passo 4
Agora definimos
soma, subtracao e multiplicacao. Cada função:- Recebe
struct numeroReal a, be um ponteirostruct numeroReal *res. - Converte
aebemdoublecomtoReal. - Faz a operação (
+,-ou*). - Converte o resultado de volta para
rescomtoNumeroReal. - Imprime o valor real de
*resusandotoReal.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
struct numeroReal {
int esq;
int dir;
};
/* Já definimos numDigits, toReal e toNumeroReal nos passos anteriores */
void soma(struct numeroReal a, struct numeroReal b, struct numeroReal *res) {
double va = toReal(a);
double vb = toReal(b);
double vr = va + vb;
toNumeroReal(vr, res);
printf("Soma = %.6f
", toReal(*res));
}
void subtracao(struct numeroReal a, struct numeroReal b, struct numeroReal *res) {
double va = toReal(a);
double vb = toReal(b);
double vr = va - vb;
toNumeroReal(vr, res);
printf("Subtração = %.6f
", toReal(*res));
}
void multiplicacao(struct numeroReal a, struct numeroReal b, struct numeroReal *res) {
double va = toReal(a);
double vb = toReal(b);
double vr = va * vb;
toNumeroReal(vr, res);
printf("Multiplicação = %.6f
", toReal(*res));
}
Resposta
Veja acima as funções:
toReal(struct numeroReal n)retorna o valor emdouble.toNumeroReal(double x, struct numeroReal *n)preenchena partir dex.soma,subtracao,multiplicacaorecebem duas estruturas e um ponteiro para resultado, computam a operação, armazenam emrese imprimem o valor real.