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
numeroReal
em umdouble
com o valor correto. - Fazer as funções
soma
,subtracao
emultiplicacao
que recebam duas variáveisnumeroReal
e 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, b
e um ponteirostruct numeroReal *res
. - Converte
a
eb
emdouble
comtoReal
. - Faz a operação (
+
,-
ou*
). - Converte o resultado de volta para
res
comtoNumeroReal
. - Imprime o valor real de
*res
usandotoReal
.
#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)
preenchen
a partir dex
.soma
,subtracao
,multiplicacao
recebem duas estruturas e um ponteiro para resultado, computam a operação, armazenam emres
e imprimem o valor real.