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.

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:
  1. Fazer uma função que converta numeroReal em um double com o valor correto.
  2. Fazer as funções soma, subtracao e multiplicacao que recebam duas variáveis numeroReal 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. Se dir == 0, consideramos 1 dígito.
  • Calcular div = 10^ndigitos.
  • frac = n.dir / div.
  • Se n.esq < 0, o número real vale n.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:
  1. Recebe struct numeroReal a, b e um ponteiro struct numeroReal *res.
  2. Converte a e b em double com toReal.
  3. Faz a operação (+, - ou *).
  4. Converte o resultado de volta para res com toNumeroReal.
  5. Imprime o valor real de *res usando toReal.
#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 em double.
  • toNumeroReal(double x, struct numeroReal *n) preenche n a partir de x.
  • soma, subtracao, multiplicacao recebem duas estruturas e um ponteiro para resultado, computam a operação, armazenam em res e imprimem o valor real.

Exercícios relacionados