2.
Funciones sobre arrays unidimensionales
Los arrays son las estructuras más
básicas de los lenguajes de programación. Al ser el C un lenguaje bastante
primitivo son de las más usadas. El principal problema que tienen los arrays en
C es tener que declararlos con una dimensión o tamaño máximo y después para
operar con ellos es necesario conocer el tamaño o número de elementos que
realmente están en el array. Esta cuestión conlleva el hecho de que siempre que
una función reciba como argumento de entrada un array debe recibir también su
tamaño real. Igualmente cuando una función devuelve un array debe indicar su
número de elementos como argumento de salida.
2.1 Funciones para el tratamiento de arrays con valores numéricos
Supongamos definidos dos tipos[1]
2.1.1 Función para leer y guardar en un array un conjunto de números enteros. En esta primera aproximación supondremos que antes de leer los elementos del array, el usuario del programa introducirá el número de valores a leer:
Nótese como la función devuelve en su nombre (return num) el número de elementos reales leídos que hay en el array. El alumno en estos momentos desconoce que t es un argumento de entrada/salida ya que los detalles de implementación de los arrays en C y su equivalencia con los punteros se verán más adelante.
2.1.2 Función que lee y guarda en
un array un máximo de 20 valores positivos. Esta función es más compleja porque
la condición de parada debe hacerse con un while:
Este ejercicio es interesante por tres razones:
1.
Introduce el esquema de lectura adelantada que
es muy usado en C.
2. La
condición del while al ser compuesta mediante la operación && suele
costar trabajo de entender. El bucle se seguirá ejecutando mientras no se hayan
leído más de 20 elementos (dimensión de TablaEntero) o no se lea un número
negativo. Dicho de otra manera, la condición del while será falsa si alguna de
las dos condiciones simples lo es. Por tanto, se seguirán leyendo números si i
es menor de 20 y el número leído es positivo.
3.
La variable i nos sirve de contador y por eso
hacemos un return i. Hay que darse cuenta que i devuelve el número de elementos
leídos que son positivos, ya que al leerse un número negativo el while se
acaba. Por ejemplo, si leemos los números 7, 5, 6, -4 en este orden, i tomará
los valores 0 para guardar 7, 1 para 5 y 2 para guardar 6, pero antes d ehacer
la lectura del -4, la variable i toma el valor 3, que son justo los valores
leídos. Sígale la traza en el ordenador si no lo ha entendido.
2.1.3 Función para mostrar en pantalla los elementos de un array.
Sirve para que los alumnos empiecen a ver ejemplos de funciones que reciben un
array y su tamaño real como argumentos de entrada. La cláusula const delante
del tipo array indica argumento de entrada y refuerza la diferencia con la
función anterior donde el array era argumento de entrada/salida.
Para el tratamiento de los arrays proporcionamos en el Tema 5 de
nuestros apuntes un conjunto de esquemas que resuelven numerosos de los
problemas habituales en programación: contar, sumar, existe, para todo, máximo,
mínimo, filtro y búsqueda[2].
Algunos ejercicios al respecto podrían ser:
2.1.4 Función para contar el número de valores pares de un array:
2.1.5 Función para sumar los valores de un array que sean divisibles por un número p:
2.1.5 Función para sumar los valores de un array que sean divisibles por un número p:
2.1.6 Función para dado un array devolver los elementos del mismo que son divisibles por un número p:
Nótese que la única manera de devolver un conjunto de números es mediante un array como argumento de salida y que como no sabemos cuántos elementos cumplirán la condición debemos también devolver el tamaño real del array v en el nombre de la función.
2.1.7 Función tal que dado un array busca la posición que ocupa el primer valor que sea divisible por p:
2.1.8 Función tal que dado un array devuelve el mayor valor:
2.1.9 Función tal que reciba una TablaEntero t y un entero n y devuelve
si existe algún elemento de t que sea múltiplo de n.
2.1.10 Función tal que dados una TablaEntero t y dos valores enteros n y m, devuelve otra TablaEntero con los valores de t cuyos valores están entre n y m ambos inclusive.
2.1.11 Función tal que dados una TablaReal t y devuelve su media aritmética. Este problema es un esquema de suma, con la diferencia de al final devolver el cociente por n.
2.1.12 Función tal que dados una TablaReal t y devuelve su varianza. Este problema es un esquema de suma para los valores de t al cuadrado. Al final se debe invocar la función 2.1.11 para incorporar la media aritmética al cálculo. La fórmula de la varianza es:
[1]
Cualquier otra forma de usar los arrays que no sea mediante la definición
previa de su tipo nos parece una aberración. Definir argumentos o variables de
tipo array usando int v[] ó int *v, sólo puede venir dado por dos razones:
desconocimiento de cómo se debe enseñar a programar o por ganas de hacer obtusa
su comprensión adrede.
[2]
Obviamos de manera consciente el problema de ordenar los elementos de un array,
ejercicio que es clásico en todos los cursos de programación y que sin embargo
nosotros consideramos irrelevante. Todos los lenguajes modernos de programación
(incluido el C) disponen de funciones de ordenación basadas en el método “quick
sort” y proporcionar al alumno funciones poco eficientes basadas en burbuja o
montón nos parece que no conduce a nada útil.
No hay comentarios:
Publicar un comentario