Struct c++

Comecei a aprender como usar na minha última aula, mas ainda não entendi como aplicar muito bem. Comecei a fazer uma atividade, mas acabei me perdendo e não sei como completar pro programa funcionar.
A questão é que tenho que dizer se um ponto P (xp, yp) se encontra dentro, fora, ou na borca 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. Sei que estou no caminho, mas acabei travando.
Segue o código:

#include //aqui seria iostream
#include <stdlib.h>
using namespace std;

int main(int argc, char **argv){
int x1, y1, x2, y2, xp, yp;

int ehretangulo(int x1, int y1, int x2, int y2){
    if(x1 == x2 || y1 == y2){
        cout<<"Retangulo invalido!";
        exit(0);
    }
}

struct pontos {
    int x1, y1, x2, y2;
};

pontos organizarpontos(int x1, int y1, int x2, int y2){
    int aux = 0;
        if(x1 > x2){
            aux = x1;
            x1 = x2;
            x2 = aux;
        }

        if(y1 > y2){
            aux = y1;
            y1 = y2;
            y2 = aux;
        }

    pontos P;
    P.x1 = x1;
    P.y1 = y1;
    P.x2 = x2;
    P.y2 = y2;

    return pontos;
}

pontos P2 = organizarpontos(x1, y1, x2, y2);
    x1 = P2.x1;
    y1 = P2.y2;
    x2 = P2.x2;
    y2 = P2.y2;




int result =  verificarpontos(x1, y1, x2, y2){

    if(x1 < xp && xp < x2 && y1 < yp && yp < y2){
        cout<<"O ponto P está dentro do retângulo";
    }

    else if(xp == x1 || xp == x2 || yp == y1 || yp == y2){
        cout<<"O ponto P encontra-se na borda";
    }
    else{
        cout<<"O ponto P está fora do retângulo";
    }

}

return 0;

}

int main(){

cout<<"Insira os pontos x1, y1, x2, y2, xp, yp: ";
cin>>x1>>y1>>x2>>y2>>xp>>yp;
ehretangulo(x1, y1, x2, y2);

pontos P2 = organizarpontos(x1, y1, x2, y2);
        x1 = P2.x1;
        y1 = P2.y2;
        x2 = P2.x2;
        y2 = P2.y2;

int result = verificarpontos(x1, y1, x2, y2);
if(result < 0){
cout<<"está fora";
}else if(result >0){
  cout<<"O ponto esta dentro";
}
else{
    cout<<"O ponto está na linha";
}
}

return 0;

}

A lógica das suas funções parece correta. Fiz apenas testes básicos e saiu como esperado.

O problema é só não ter feito bom uso das structs mesmo.

Primeiro, vc tem duas entidades diferentes: Ponto e Retangulo.

O Ponto é composto por x e y e o Retangulo é composto por dois Pontos.

struct Ponto {
  int x, y;
};

struct Retangulo {
  Ponto a; // esse seria seu x1, y1
  Ponto b; // esse seria seu x2, y2
};

Segundo, vc teria que modificar suas funções para fazerem bom uso destas structs. O protótipo delas ficaria assim:

void ehretangulo(Retangulo retangulo);

Retangulo organizarpontos(Retangulo retangulo); // Eu chamaria essa de organizaRetangulo

int verificarpontos(Ponto ponto, Retangulo retangulo);

Não mexi na sua lógica, apenas a modifiquei para trabalhar com as structs. O código completo ficaria assim:

#include <iostream>
#include <stdlib.h>
using namespace std;

struct Ponto {
  int x, y;
};

struct Retangulo {
  Ponto a; // esse seria seu x1, y1
  Ponto b; // esse seria seu x2, y2
};

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

Retangulo organizarpontos(Retangulo retangulo) {
  if(retangulo.a.x > retangulo.b.x) {
      int aux = retangulo.a.x;
      retangulo.a.x = retangulo.b.x;
      retangulo.b.x = aux;
  }

  if(retangulo.a.y > retangulo.b.y) {
    int aux = retangulo.a.y;
    retangulo.a.y = retangulo.b.y;
    retangulo.b.y = aux;
  }

  return retangulo;
}

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

int main(int argc, char **argv){
  Ponto p;
  Retangulo r;

  cout << "Insira os pontos x1, y1, x2, y2, xp, yp: ";
  cin >> r.a.x >> r.a.y >> r.b.x >> r.b.y >> p.x >> p.y;

  ehretangulo(r);

  r = organizarpontos(r);

  int result = verificarpontos(p, r);
  
  if(result < 0){
    cout<<"está fora";
  } else if(result > 0){
    cout<<"O ponto esta dentro";
  } else{
    cout<<"O ponto está na linha";
  }

  return 0;
}

Só lembrando que não testei completamente, então pode conter erros, mas espero que lhe dê uma direção pra seguir.

1 curtida

Muito obrigado, vou procurar estudar por ele agora e ver o que faço se der algum erro. Ajudou um bocado. Tenha uma boa noite!

1 curtida