Duda c

SiKoPaTa

Hola buenos días, tengo una duda para la realización de un programa que me trae de cabeza.

Veamos tengo que dar distancias entre objetos, introduzco el numero de objetos por teclado, ejemplo 3 y tengo que hacer el resultante código.

Distancia entre transmisor y objeto 1
guardar esta en x

Distancia entre objeto 1 y objeto 2
guardar esta en y

Distancia entre objeto 2 y objeto 3
guardar esta en z

Distancia entre objeto 3 y receptor
guardar esta en w

Como podéis apreciar el número de objetos puede crecer o decrecer según interés, ¿Como haríais algo así?

Muchísimas gracias.

Li3cht

El C lo tengo olvidadísimo pero tendrás que trabajar con vectores (arrays dinámicos) para que el tamaño de los objetos no te altere la indexación del vector.

Khanser

Si es C++ lo que estas usando, tienes una gran cantidad de estructuras de datos a tu disposicion. Por ejemplo vector.

así para cualquier numero de objetos que tengas, solo tienes que iterar entre ellos e ir añadiendolos al vector.

T

Que recuerde en C los vectores no son dinamicos por lo que mirate las listas (linked list).

1 respuesta
gonya707

si tienes un tope de objetos (o es imposible que sean tantos) lo más sencillo es que uses un array de números

float distancias[4096]; //Cabrán hasta 4096 números.
float n;
int indice=0;

while (n){ //hasta que no se meta un cero como distancia
 printf("Introduzca la distancia numero %d: ",indice);
 scanf("%f",&n);
 distancias[indice]=n; //distancias en la posicion numero indice se rellena
 indice++;

}

1 2 respuestas
SiKoPaTa

Muchas gracias,

1 respuesta
T

#5 No comprendo porque quieres hacer esto. Estas reservando espacio que seguramente no uses. A parte que si por alguna razón tienes más "distancias" que posiciones tiene tu tabla petará el programa.

1 respuesta
gonya707

#7 Dada la "complejidad" del programa estoy seguro de que se la pela el optimizar memoria y recursos... Por otra parte, a ver quien es el listo que mete 4096 numeros por teclado para petar el programa

1 respuesta
elkaoD

#4 #6 puedes reservar memoria de forma dinámica con malloc.

http://www.cplusplus.com/reference/cstdlib/malloc/

Es como lo de #5 solo que sin hacer la reserva de más (o si fueran más de 4096 objetos, de menos).

Si la distancia son enteros y tienes N distancias tienes que reservar de tamaño N * sizeof(int).

No se te olvide liberar la memoria con free.

#8 no todo es teclado... ¿y si pilla entrada de stdin por ejemplo? (script en Linux)

Para un apaño puede valer, pero siempre vale más prevenir que curar :) (y si es para la uni/trabajo, no quedas como un cutre ante quien vea el código).

1 1 respuesta
gonya707

#9 Eso sí, pero hacer algo resultón con listas dinámicas puede ser una movida para alguien cuya última duda era esta

1 respuesta
elkaoD

#10 eso no es una lista, es un array (parece una tontería pero es una diferencia MUY importante).

El uso es sencillísimo y hay trillones de ejemplos de malloc en internet. #1 no supo buscarlo porque no conocía el término "malloc" (ni cómo referirse a un array como "array dinámico" ) pero estoy seguro de que ahora que hemos puesto los términos encuentra la forma de hacerlo.

¡No saber nunca es una excusa para no aprender! :P

1 respuesta
gonya707

#11 Me has malentendido xD Ya sé que la solución que le he puesto yo es un array y no una lista. Sé usar malloc y toda la teoría detrás xD

Yo lo que he dicho es que para #1 resultará más sencillo hacerlo de momento con arrays si está empezando

1 respuesta
elkaoD

#12 sí, no me has entendido tú (lo de las listas solo era un apunte semántico, soy muy tiquismiquis con esas cosas, creo que importan más de lo que parece).

Solo digo que si no aprendes porque no sabes... nunca aprenderás. En algún momento te tienes que pegar con estas cosillas (el hilo que enlazas por ejemplo me parece una duda más compleja que esta... al menos a mí me liarían más las referencias por primera vez que pillar un código de malloc que es prácticamente copypaste).

En cualquier caso ya tiene dos posibles soluciones, ganamos todos xD Siempre viene bien conocer las dos caras de la moneda.

1 respuesta
SiKoPaTa

#13 muchas gracias, me pondre a ello.

SiKoPaTa

Por si alguien necesita algo de este estilo, aqui dejo la respuesta:

/* Numero de obstaculos */
printf("Introduce el numero de obstaculos: ");
scanf("%d",&n);
/* Altura obstaculos */
float * altura;
altura = (float *) malloc (sizeof (float) * n);
for(i=0;i<n;i++) //0 1 2 < 3
{
	printf("\nIntroduce la altura del obstaculo %i [m]: ",i+1);
	scanf("%f",&altura[i]);
}
1

Usuarios habituales