Publicado em Programação

Distância entre dois pontos na recta – Abordagem segundo o paradigma ADT em C++

O programa seguinte permite calcular a distância entre dois pontos da recta criando para o efeito uma classe muito simples.

rectareal

main.cpp

#include <iostream>
#include <cmath>
#include "PontoRecta.h"
using namespace std;
int main(){
	// Declarar os objectos
	PontoRecta a,b;

	// Inicializar os valores
	b.setValue(-5.2);

	// Calcular a distância
	cout 	<< "A distância na recta entre os pontos de coordenadas " <<
			a.getValue() << " e " << b.getValue() << " é " <<
			fabs(b.getValue() - a.getValue()) << endl;
}&#91;/sourcecode&#93;

<em><strong>PontoRecta.h</strong></em>

#ifndef PONTO_RECTA_H
#define PONTO_RECTA_H
class PontoRecta{
public:
	// Construtor default
	PontoRecta(){
		x = 0;
	}
	// Definir a coordenada do ponto na recta
	void setValue(float a){
		x = a;
	}
	// Obter a coordenada do ponto na recta
	float getValue(){
		return x;
	}
private:
	float x;
};
#endif

Observações

  1. O nome da classe é PontoRecta;
  2. A classe contém um membro-dado ( x ) que é privado;
  3. A classe contém dois membros-função ( setValue e getValue ) que são públicos;
  4. É utilizado um construtor por defeito, que posiciona os pontos criados na origem o eixo, ou seja, na coordenada 0;
  5. Os membros-função são implicitamente definidos inline;
  6. A função é definida no ficheiro PontoRecta.h, pelo que poderá ser utilizada por qualquer programa que necessite de manipular objectos desta natureza;
  7. No programa principal são criados dois objectos (duas instâncias) do tipo PontoRecta, ficando automaticamente cada uma deles a possuir todas as características definidas pela classe a que pertencem, quer em termos de dados, quer em termos de métodos (funções-membro);
  8. Não é atribuído nenhum valor a a, pelo que este fica com o valor 0 (zero), uma vez que temos o nosso construtor por defeito;

E agora …

Naturalmente que esta classe está ainda a nascer … e muito fica ainda por dizer.

Apenas a título de exemplo vamos incluir na classe um método que permita calcular a distância entre um ponto e outro cuja coordenada é passada por parâmetro.

main.cpp

#include <iostream>
#include "PontoRecta.h"
using namespace std;
int main(){
	// Declarar os objectos
	PontoRecta a,b;

	// Inicializar os valores
	b.setValue(-5.2);

	// Calcular a distância
	cout 	<< "A distância na recta entre os pontos de coordenadas " <<
			a.getValue() << " e " << b.getValue() << " é " <<
			a.distancia(b.getValue()) << endl;
}&#91;/sourcecode&#93;

<em><strong>PontoRecta.h</strong></em>

#include <cmath>
#ifndef PONTO_RECTA_H
#define PONTO_RECTA_H
class PontoRecta{
public:
	// Construtor default
	PontoRecta(){
		x = 0;
	}
	// Definir a coordenada do ponto na recta
	void setValue(float a){
		x = a;
	}
	// Obter a coordenada do ponto na recta
	float getValue(){
		return x;
	}
	float distancia(float p){
		return fabs(x-p);
	}
private:
	float x;
};
#endif

Mas eis que surge uma dúvida!
Porque razão é que eu utilizei na linha 14 de main.cpp o seguinte?

a.distancia(b.getValue());

Se b é um objecto a própria classe devia tratá-lo como tal, e depois saber como obter o valor de x!
Que alterações é necessário fazer?
Novo versão a seguir.

main.cpp

#include
#include “PontoRecta.h”
using namespace std;
int main(){
// Declarar os objectos
PontoRecta a,b;

// Inicializar os valores
b.setValue(-5.2);

// Calcular a distância
cout << "A distância na recta entre os pontos de coordenadas " << a.getValue() << " e " << b.getValue() << " é " << a.distancia(b) << endl; }[/sourcecode] PontoRecta.h

#include
#ifndef PONTO_RECTA_H
#define PONTO_RECTA_H
class PontoRecta{
public:
// Construtor default
PontoRecta(){
x = 0;
}
// Destrutor
~PontoRecta(){
std::cout << "Objecto destruído!" << std::endl; } // Definir a coordenada do ponto na recta void setValue(float a){ x = a; } // Obter a coordenada do ponto na recta float getValue(){ return x; } float distancia(const PontoRecta &p){ return fabs(x-p.x); } private: float x; }; #endif [/sourcecode] Observações

  1. Acrescentei o método destruidor para sabermos quando cada objecto é destruído (libertada a memória associada);
  2. A função-membro distancia passa a receber o endereço do objecto a ser utilizado no cálculo da distância. No te-se que o x e o p.x representam o mesmo atributo mas em objectos diferentes;
  3. Porquê const? Experimentem adicionar a linha p.x=33 na função distancia!
  4. E a passagem de parâmetros por referência! É mesmo necessária? Retirem o & e contem as mensagens do método ~PontoRecta();
Anúncios

3 opiniões sobre “Distância entre dois pontos na recta – Abordagem segundo o paradigma ADT em C++

  1. sabes me explicar como é k se declara uma recta em c++ para depois declarar uma outra para saber se se ela intersecta a primeira?
    obrigado

  2. Bem … esta questão é mais matemática do que sobre programação!
    Supondo que utilizas a equação reduzida da recta ( y = mx + b ) a solução para o teu problema passa pela resolução de um sistema de duas equações do primeiro grau com duas incógnitas …
    É um assunto interessante mas vai dar trabalho … pode ser que alguém passe por aqui e nos mostre a coisa já feita :)
    Boa sorte ;)

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s