Escreva uma função em C++ chamada arredonda que recebe como parâmetros de entrada dois valores reais x e y que representam as coordenadas de um ponto (x, y) no plano cartesiano e retorna dois valores inteiros a e b que representam as coordenadas do ponto discreto (a, b) mais próximo do ponto (x, y). Para o arredondamento, considere que o decimal 0.5 deve ser arredondado para cima (considerando o número em módulo).
Faça um programa que leia uma sequência de pares de valores reais representando as coordenadas de pontos no plano cartesiano e mostra na tela qual é a menor distância entre os pontos discretos correspondentes (calculados com a função arredonda) e a origem. Para calcular a distância de um ponto discreto (a, b) à origem considere a chamada distância de Manhattan, definida como |a| + |b|.
O programa deve terminar quando o usuário digitar o par 0 0, que não deve ser considerado como um ponto válido, apenas indica o final da sequência.
Por exemplo: se o usuário digitar a sequência 2 3 -2.5 3.1 -2.2 3.8 -2.7 -4.3 0 -5 0 0 então há os seguintes pontos: (2, 3), (-2.5, 3.1), (-2.2, 3.8), (-2.7, -4.3) e (0, -5), cujos pontos discretos correspondentes, arredondando as coordenadas, são: (2, 3), (-3, 3), (-2, 4), (-3, -4) e (0, -5). As distâncias de Manhattan correspondentes são: 5, 6, 6, 7 e 5. Portanto, o programa deve imprimir na tela o valor 5.
Respostas
#include <iostream>
#include <cmath>
#include <climits>
using namespace std;
float arredonda ( float x, float y, int &a, int &b);
int main () {
float x, y;
int a = 0, b = 0, menorValor = INT_MAX;
do {
cin >> x >> y;
arredonda ( x, y, a, b );
if ( a < 0 ) {
a *= -1;
}
if ( b < 0 ) {
b *= -1;
}
if ( a + b < menorValor && a + b != 0) {
menorValor = a + b;
}
} while ( x + y != 0 );
cout << menorValor;
return 0;
}
float arredonda ( float x, float y, int &a, int &b) {
int auxiliarX, auxiliarY;
if ( x < 0 ) {
x *= -1;
auxiliarX = x;
if ( x - auxiliarX >= 0.5 ) {
a = ceil ( x ) * -1;
}
else {
a = floor ( x ) * -1;
}
}
else {
auxiliarX = x;
if ( x - auxiliarX >= 0.5 ) {
a = ceil ( x );
}
else {
a = floor ( x );
}
}
if ( y < 0 ) {
y *= -1;
auxiliarY = y;
if ( y - auxiliarY >= 0.5 ) {
b = ceil ( y ) * -1;
}
else {
b = floor ( y ) * -1;
}
}
else {
auxiliarY = y;
if ( y - auxiliarY >= 0.5 ) {
b = ceil ( y );
}
else {
b = floor ( y );
}
}
}