Como determinar el nuevo largo de un arreglo luego de filtrar (TP5 - Ejercicio 2 - Punto 4) #74
Unanswered
curambar
asked this question in
Preguntas y Respuestas
Replies: 2 comments 1 reply
-
Y si le sacas un solo 5, pero lo haces muchas veces hasta que no queda ninguno? |
Beta Was this translation helpful? Give feedback.
1 reply
-
Antes de finalizar, haces un Igual necesitas un puntero para poder indicar el tamaño del nuevo arreglo. |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
El punto 4 pide "Implementar una función que reciba un arreglo y cree uno nuevo removiendo un determinado número."
Hay dos maneras de interpretar esto. Supongamos que el arreglo en cuestión tiene un tamaño
N
. Sea, por ejemplo, el arreglo{4, 5, 0, 1, 5, 9}
conN = 6
, y que queremos filtrar el número5
.La primera interpretación es que elimine solo la primera instancia de ese valor, quedando el arreglo
{4, 0, 1, 5, 9}
. En este caso, el tamaño del nuevo arreglo es simplemente 5,N - 1
, uno menos que el original.En esta primera interpretación, también puede ocurrir que no encuentre el valor a filtrar, en cuyo caso devolvería el arreglo original sin modificar, con tamaño 6,
N
.La segunda forma de interpretar la consigna es eliminar todas las instancias del valor en cuestión. En el ejemplo dado, el nuevo arreglo quedaría
{4, 0, 1, 9}
. Como halló dos instancias del valor dado, el nuevo tamaño es 4,N - 2
.Como vemos, el tamaño del nuevo arreglo depende del resultado de la operación. En un caso de prueba como en este ejemplo, podemos ver que el nuevo arreglo puede tener tamaño 4, 5, o 6. Esto presenta un problema. porque si no sabemos de antemano el el nuevo tamaño con certeza, no podremos usar el arreglo resultante como argumento de alguna función.
¿Hay alguna forma implementar adecuadamente la segunda interpretación a este enunciado, o de tener la opción de devolver la cadena intacta si no hay nada que filtrar?
Una solución que se me ocurre es limitar el resultado: Usar exclusivamente la primera interpretación del enunciado (solo eliminar un elemento), y devolver
NULL
en caso de que no encuentre el valor a filtrar. De este modo, el tamaño resultante es exclusivamenteN - 1
, o bien el resultado es nulo.Esta solución me resulta limitada, por lo que seguí intentando hasta descubrir otra opción. Lo que me funcionó fue abandonar la necesidad de que la función devuelva un puntero al nuevo arreglo, y que en su lugar devuelva un entero. A esta función se le pasa como argumento un puntero a un arreglo que usaremos como resultante (como en el ejercicio que calcula simultáneamente cociente y resto). Este arreglo debe ser no nulo, intenté inicializarlo como NULL y todo explotó. Para aprovechar las funciones que ya tengo, inicialicé el arreglo resultante como un duplicado del arreglo a filtrar. El arreglo resultante es manipulado dentro de la función, asignándole el tamaño adecuado con
realloc
. El retorno de la función es el nuevo largo del arreglo.Empecé a escribir esta discusión como una pregunta, pero a medida que la escribía se me iban ocurriendo ideas, así que la voy a dejar como un análisis de cómo lograr el resultado que estaba buscando. De todas maneras me queda la duda. ¿Existe alguna manera de determinar el tamaño de un arreglo cuyo puntero es devuelto por una función? ¿O de un arreglo arbitrario?
Aquí dejo el código que terminó funcionando, quedando abierto a sus sugerencias y a cualquier error que encuentren (Falta, por ejemplo, devolver valores negativos adecuados a los errores que pueda encontrar).
El código que usé para probarlo es
Es en esta parte donde me explotó cuando intenté inicializar
arr_2 = NULL
.Beta Was this translation helpful? Give feedback.
All reactions