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.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:
 










2.1.13 Un programa principal para invocar algunas de estas funciones podría ser:

 


[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