duda sobre estructuras y funciones

Iniciado por fernaEDLP, 30 Enero 2019, 00:38 AM

0 Miembros y 1 Visitante están viendo este tema.

fernaEDLP

hola nakamas, espero que estén todos bien, graciass de antemano por toda la ayuda que siempre me dan.
tengo un problema en el que me combinan estructuras con funciones dice lo siguiente:

1. Se desea representar puntos sobre un plano de coordenadas reales x y, y asignarle a cada uno un carácter para identificarlos.
a) Cree una estructura que permita representar estos puntos
b) Declare tres variables del nuevo tipo creado, asígneles valores e imprima en pantalla los datos de cada punto.
c) Cree una función que devuelva la distancia entre dos puntos
d) Cree una función que tome un arreglo de puntos e imprima en pantalla cual es el más alejado del origen.


el punto b no lo hice pero el resto esta mas o menos hecho, mi duda es con el ultimo punto,o sea el d no entiendo muy bien como hacer las llamadas o que pasar como parámetro, me dicen si voy bien encaminado?
hasta ahora hice esto:

#include <math.h>
float distancia(float x1,float y1,float x2,float y2);
float distalorigen(float pt[]);
struct punto
{
    float x;
    float y;
}puntos[3];

int main()
{
int i;
float dist,resultado;
for(i=0;i<3;i++)
{
    printf("ingrese los datos del punto %d\n",i+1);
    scanf("%f",&puntos[i].x);
    scanf("%f",&puntos[i].y);
}
for(i=0;i<3;i++)
{
    printf("el punto ingresado es %d\n",i+1);
    printf("%f  ",puntos[i].x);
    printf("%f  ",puntos[i].y);
    printf("\n");
}
dist=distancia(puntos[0].x,puntos[0].y,puntos[1].x,puntos[1].y);
printf("la distancia entre los puntos ingresados es \n %.2lf",dist);
resultado=distalorigen(puntos);
printf("el punto mas alejado del origen es \n %.2lf",resultado);

}
float distancia (float x1,float y1,float x2,float y2)
{
    float d;
    d=sqrt(((x2-x1)*(x2-x1))+((y2-y1)*(y2-y1)));
    return d;
}
float distalorigen(float pt[])
{
    int i;
    float mayor=0;
    float R;
    for(i=0;i<3;i++)
    {
        R=sqrt(((pt[i]-0)*(pt[i]-0))+((pt[i+1]-0)*(pt[i+1]-0)));
        if(R>mayor)
        {
            mayor=R;
        }
    }

    return mayor;
}



en la linea 32 me salta un error y me dice que no le puedo pasar el arreglo tipo float de la estructura a la función, tampoco se como especificar que punto es el mayor una vez que calculo cual R es el mayor, disculpen si tengo algún error conceptual groso, es que me quema la cabeza esta materia

K-YreX

Bueno vamos a ir analizando por partes:
En el enunciado dice:
Citar
Se desea representar puntos sobre un plano de coordenadas reales x y, y asignarle a cada uno un carácter para identificarlos.
Por lo que en el punto a), en la estructura te falta una variable más que sea de tipo <char>. Que es como el nombre del punto.


En cuanto al apartado b), te diría que las variables de tipo <Punto> es mejor que las crees dentro del <main> para que las variables sean locales. No es recomendable crear las variables globales, ya que el código pierde seguridad. Por lo demás todo bien.


En el apartado c), si tienes una estructura de tipo <Punto>, no pases las coordenadas sueltas a la función. Te recomiendo que modifiques esa función y sea algo así:

float distancia(Punto p1, Punto p2);



En el apartado d), si no te deja pasar un array de <Puntos> como parámetro es porque estás declarando que el parámetro es un array de <float>. Además de eso, cuando se pasa un array como parámetro se recomienda pasar su tamaño también para poder recorrerlo (y tener el tamaño en una variable):

// struct Punto
Punto masAlejado(Punto [], int);
int main(){
    const int NUM_PUNTOS = 3;
    Punto puntos[NUM_PUNTOS];
    // el resto del programa
    Punto mas_alejado = masAlejado(puntos, NUM_PUNTOS);
    // muestras el punto mas alejado
}

Te dejo esa plantilla para que la termines de implementar si te parece buena idea, claro :-X. Te comento, te pide calcular el punto más alejado, no la mayor distancia, entonces la función devuelve el punto más alejado, no su distancia.


Ya me contarás si tienes algún problema o alguna duda sobre alguna de las cosas que te he comentado. Suerte:-X
PD: En la función <masAlejado()> puedes crear un punto C(0,0) y usar la función que has creado antes... :silbar: :silbar:
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

fernaEDLP

hola gracias por tu respuesta, ya lo estoy corrigendo el código, te hago una consulta, en el punto b cuando te pide tres variables mas del tipo creado, me esta pidiendo que cree en vez de tener solamente x e y en la estructura, que cree 3 mas o sea ponele, float x float y float z float m float l, ya se que no queres que las declare de forma global, pero en el caso de la estructura no te queda mas opción que declararlas ahi o no?, hasta ahora los ejemplos que vi de estructuras siempre se declara la estructura y después se la llama desde el main

K-YreX

Cuando te pide en el apartado b) crear 3 variables de ese tipo se refiere a crear 3 variables del tipo <Punto>. Lo puedes hacer como lo has hecho con un array o crear 3 variables independientes. Para trabajar con ellos en este caso es más sencillo como lo has hecho tú para poder manipularlo todo con un <for>.

Y las estructuras no es obligatorio declararlas así. Te muestro a continuación ambas formas de declarar instancias (objetos) de una estructura:
VARIABLES GLOBALES

struct Nombre{
    // miembros
} n1, n2, n_array[2];

int main(){
    // n1 n2 y n_array son objetos globales
}


VARIABLES LOCALES

struct Nombre{
    // miembros
};

int main(){
    Nombre n1, n2, n_array[2];
    // n1 n2 y n_array son objetos locales
}


Espero que esto te sirva. Si llegas a trabajar con C++ y con clases se puede hacer igual que aquí. Suerte :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;