[ Foro de Pascal ]

Arrays

09-Dec-2006 20:28
MyName1 MySurname1
4 Respuestas

Necesito saber como teniendo un array determinado, por ejemplo de dimensión 10, se le puede añadir un dato nuevo a lo bruto, desplazando así el resto de los datos hacia la derecha del array, aunque se pierda alguno de ellos.

Y la otra pregunta, dado un vector 'v', crear una matriz con los datos del mismo. Un vector cualquiera, de forma general. No me sale, alguien me ayuda?

09-Dec-2006 21:49
Taisen Tetsu

lo del array se puede hacer teniendo un array a parte donde volcar los datos con un for uno a uno una posicion mas a la izquierda y metes el nuevo al final, o aunque lo normal es que no vaya se puede hacer una trampa y guardar una posicion mas de la que tiene pero puedes tener fallos aunque a veces funciona xd
10-Dec-2006 17:50
MyName1 MySurname1

Pero si tengo un ejercicio por ejemplo que dice:

Escribe un programa que lea los datos de un vector y los muestre en pantalla. OK.
Haz que se elimine una posición, elegida por el usuario, del vector.
Haz que se inserte un dato en una posición, todo elegido por el usuario, del vector.
El cógido como sería de la última opción?, es que no me sale.
He supuesto un vector de dimensión N=10, como constante... y qué procedimiento debería hacer para que me insertara el dato y qué llamadas en el cuerpo del programa debo escribir?. Gracias

16-Dec-2006 13:22
Nacho Cabanes (+84)

Veamos...

Para lo que pides de insertar datos y demás, como suele ocurrir, hay dos opciones: la buena y la mala ;-) Vamos con ellas por partes:



La solución "mala" es la más sencilla: crear un vector estático "suficientemente grande" como para poder añadir bastantes datos sin necesidad de cambiar nada.

int datos[10];
(con la sintaxis de Pascal: var: datos = array[1..10] of integer;)

pero por ahora sólo voy a usar 3 datos:

numeroDatos = 3;
datos[0] = 5;
datos[1] = 6;
datos[2] = 7;


Para mostrar los todos datos que realmente tengo:

for (i=0; i<numeroDatos; i++) printf("%d\n", &datos[i]);

(en Pascal: for i:=1 to numeroDatos do writeln(datos[i]);


(Por ahora tengo: 5,6,7)


Si quiero modificar el segundo dato:

datos[1] = 10;

(Ahora tengo: 5,10,7)


Si quiero insertar un nuevo dato entre el segundo y el tercero, tengo que mover todos hacia la derecha para dejarle hueco:

datos[3] = 7;
datos[2] = 10;
datos[1] = 21;
numeroDatos = 4;

(Ahora tengo: 5,21,10,7)

En general se hace de forma repetitiva, con un "for":

numDatos++;
for (i=numDatos; i>posicionInsertar; i--) datos[i] = datos[i-1];
datos[posicionInsertar] = nuevoDato;


Para borrar un dato, por ejemplo el segundo, tengo que mover todos hacia la izquierda y "anotarme" que ahora tengo un dato menos:

datos[2] = 7;
datos[1] = 10;
numeroDatos = 3;

(Ahora tengo: 5,10,7)

Al igual que antes, en general se hace de forma repetitiva, con un "for":

for (i=posicionBorrar; i<numDatos; i++) datos[i] = datos[i+1];
numDatos--;





La solución "buena" es más difícil de manejar: si tienes 10 datos, creas un vector de 10 datos, dinámicamente, con "malloc":

int *datos;
datos = (int *) malloc (10*sizeof(int));

Si tienes que añadir un nuevo dato, te creas una variable temporal (como la anterior) con espacio para 11, y pasas a ella todos los datos anteriores, junto con el nuevo. Esto es más lento si tienes que insertar datos con frecuencia, pero es más eficiente en cuanto a espacio, porque no desperdicias memoria (por eso se suele hacer algo intermedio: cuando te piden añadir un dato, reservas espacio para 5, por ejemplo, de modo que las siguientes 4 inserciones serán mucho más rápidas).



Por cierto, Taisen: NUNCA debes añadir datos más allá del límite de un vector (array). Mira este ejemplo:

int datos[10];
int otrosDatos[20];

si yo hago, porque necesite más espacio o por despiste

datos[10] = 5; datos[11] = 6;

Ni la posición 10 ni la 11 las he reservado (tengo de la 0 a la 9). La gran mayoría de compiladores de C buscan sobre todo la velocidad y a cambio te dejan hacer casi cualquier cosa, así que no protestan. Pero en este ejemplo, es MUY FÁCIL (nada es seguro en esta vida ;-)) que en la memoria de tu ordenador, justo después de los 10 datos de "datos" estén los 20 de "otrosDatos", y yo acabo de escribir más allá de donde acaba "datos", luego ¡¡¡estoy modificando "otrosDatos!!! Es decir, que es muy fácil que en mi programa acabe de ocurrir lo mismo que si yo hubiera tecleado

otrosDatos[0] = 5; otrosDatos[1] = 6;

Así que no hay que confundir el hecho de que el compilador no proteste (insisto, C busca rapidez y a cambio se fía de ti) con el hecho de que la solución que hayas dado sea la buena. De hecho, en lenguajes más modernos, como Java, lo que tú sugieres da un error en tiempo de ejecución (en muchas versiones de Pascal también).





16-Dec-2006 17:29
Taisen Tetsu

ya, si yo ya e dicho que no era muy buena idea pero que para un apaño momentaneo a lo mejor cuela xd . Y eso de los vectores era un array normal? yo que ya pensaba en vectores de esos de mates de 2º bachiller de la flechita jaja que tela






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)