Duvida/curiosidade Struct

Eu tinha que fazer um programa que dissesse se um ponto P (xp, yp) se encontra dentro, fora, ou na borda de um retangulo determinado por coordenadas também cartesianas: canto inferior esquerdo: x1, y1. E o canto superior direito: x2, y2.
O programa recebe os tres pares de valores e tem que dizer o que falei acima, se o ponto está dentro, fora ou na borda.
Dias atrás, com a ajuda de um colega aqui do forum, o código foi finalizado, mas hoje senti a curiosidade de ver se conseguia montar o código de outra maneira sem deixar de usar Struct, porque minha atividade pedia isso. Não consegui.
OBS: O retorno do resultado não pode ser alterado também. Se for menor que zero o ponto está fora, se for maior que zero, no caso 1, o ponto está dentro. Senão o ponto está fora.

Segue o código:
#include //aqui seria iostream
#include <stdlib.h>
using namespace std;

struct Ponto {
	int x, y;
};

struct Retangulo {
	Ponto xy1; 
	Ponto xy2; 
};

void ehretangulo(Retangulo retangulo){
if(retangulo.xy1.x == retangulo.xy2.x || retangulo.xy1.y == retangulo.xy2.y){
    cout<<"Retangulo invalido!";
    exit(0);
}

}

Retangulo organizarpontos(Retangulo retangulo) {
	if(retangulo.xy1.x > retangulo.xy2.x) {
  		int aux = retangulo.xy1.x;
  		retangulo.xy1.x = retangulo.xy2.x;
  		retangulo.xy2.x = aux;
	}

	if(retangulo.xy1.y > retangulo.xy2.y) {
		int aux = retangulo.xy1.y;
		retangulo.xy1.y = retangulo.xy2.y;
		retangulo.xy2.y = aux;
	}


	return retangulo;
}


int verificarpontos(Ponto ponto, Retangulo retangulo) {
	if (retangulo.xy1.x < ponto.x && ponto.y < retangulo.xy2.x && retangulo.xy1.y < ponto.y && ponto.y < retangulo.xy2.y ) {
		return 1;
	} 
	else if(ponto.x == retangulo.xy1.x || ponto.x == retangulo.xy2.x || ponto.y == retangulo.xy1.y || ponto.y == retangulo.xy2.y){
	return 0;
	} 
	else{
		return -1;
	}
}


int main(int argc, char **argv){
	Retangulo ret;
	Ponto point;


cout <<"Insira o valor de x1: ";
cin >> ret.xy1.x;
	cout <<"Insira o valor de y1: ";  
	cin >> ret.xy1.y;
	cout<<"Informe o valor de x2: ";
	cin >> ret.xy2.x;
	cout <<"Informe o valor de y2: ";
	cin >> ret.xy2.y;
	cout<<"Informe o valor de xp: ";
	cin >> point.x;
	cout<<"Informe o valor de yp: ";
	cin >> point.y;

ehretangulo(ret);
ret = organizarpontos(ret);
	
int resultado = verificarpontos(point, ret);

if(resultado < 0){
	cout<<"O ponto P está fora do retangulo";
} 
else if(resultado > 0){
	cout<<"O ponto P esta dentro do retangulo";
} 
else{
	cout<<"O ponto P está na borda do retangulo";
}

return 0;

}

Tem alguma outra maneira de montar o código nesse caso?

vamos la, sim, existem inumeras formas, algumas maneiras mais orientadas a objeto por exemplo.

vc pode optar por ter uma função que vai receber dois pontos e criar um retangulo se for possivel.

se criar o retangulo é por que ele esta valido, com os cantos certinhos, etc.

é o que se chama de construtor, porem para que isso funcione vc vai precisar conhecer algumas coisas de C++. por exemplo, como vc indica que falhou? vc vai retornar um ponteiro para o Retangulo ( que seria NULL em caso de erro?) se sim, quem vai alocar memoria e quem vai desalocar esse ponteiro?

por exemplo:

Ponto xy1, xy2, point;
Retangulo ret;
bool ok;
...

ok = criaRetangulo(ret, xy1, xy2)
if (! ok ) {
  cout << "assim nao da... vc informou um retangulo horrivel" << endl;
  exit(1);
}

bool criaRetangulo(Retangulo &ret, Point xy1, Point xy2) {
  // IMPLEMENTAR

  return false;
}

como vc declarou o argumento ret com um &, o c++ vai entender que precisa passar a referencia ( ao inves de passar uma copia) para o Retangulo e vc pode manipula-lo por dentro.

isso é apenas um exemplo. vc pode ter uma funcao lePonto que vai perguntar x e y e recebe uma referencia para um ponto ( ou retorna um Ponto mesmo ), etc.

1 curtida

Creio ter entendido mais ou menos o que você quis dizer, mas ainda não conseguiria aplicar. De qualquer forma, preciso estudar mais. Vou começar com base no que você disse. Obrigado.

mas se o teu programa ja funciona, quer mudar o q?

Apenas por curiosidade, foi algo que me ocorreu porque comecei a ver esse conteúdo na minha ultima aula.

então, com o passar do tempo vc vai descobrindo padrões de programação

a maneira certa não existe. existem diferentes formas com vantagens e desvantagens.

C/C++ exige que vc controle a alocação de memoria (apesar que C++ teve facilidades adicionadas ao longo dos anos) então esse assunto se torna bem critico (se o seu programa só aloca memoria e não desaloca vc vai consumir todos os recursos do computador, fora problemas de segurança)

linguagens com Garbage Collector são uma mão na roda. porém vc ainda pode ter problemas de vazamento de memoria.

e isso é apenas um aspecto do seu programa.

1 curtida