Archive for January, 2008

Wendy: ¿qué árbol es?

Saturday, January 19th, 2008

Ayer noche y hoy tarde he estado trabajando en un pequeño programa, Wendy, echando una mano a mi chica y a sus compañeros de prácticas. Éste es su post-mortem.

Descripción

El programa desarrollado debía ser capaz de mostrar el nombre de un árbol en función de unos datos (altura, tipo de hoja, fruto que da..) que previamente hubiera introducido el usuario. Es decir, se presentarían en pantalla varias preguntas tipo test y según aquellas respuestas elegidas Wendy hallaría el nombre del árbol que tiene esas características.

Como única condición se tenía el no utilizar código demasiado avanzado, creando una aplicación funcional pero sin demasiado refinamiento técnico, en lenguaje C.

Planteamiento

Por un lado teníamos una serie de árboles… (pino, castaño, madroño…) y por otro lado, una serie de preguntas acerca de esos árboles. Por lo tanto, se deduce que un árbol va a tener ciertas propiedades, sobre las que formular las preguntas. Una forma propicia para albergar un conjunto de datos pertenecientes a una entidad o objeto, es una estructura. (Por las limitaciones de C, quedaba descartada la POO y el uso de objetos o clases). Definiendo…

typedef struct {
nombreArbol nombre; // Nombre del arbol

int familia; // Familia
int altura; // Altura del arbol
int porte; // Porte del arbol
int tipoHoja; // Tipo de hoja (per
int formaHoja; // Forma de la hoja…
int fruto; // Fruto que da
} arbol;

Nombre es otra estructura que a su vez define el nombre técnico y el nombre común del arbol.

Y.. ¿por qué todos los miembros de la estructura son enteros? El asunto era buscar una forma de relacionar el número de respuesta del usuario con los datos de cada arbol, sin tener que hacer infinitos if/else comprobando opción por opción y propiedad por propiedad. Así que, en la carga de datos del array de árboles disponibles (un array de la estructura arbol), metería en cada variable el número de opción correspondiente…

Imaginemos que tengo el árbol Pino, que tiene una altura entre 30 y 40 metros. En el programa, cuando se pregunte por la altura que tiene nuestro arbol a buscar, habrá varias opciones, una de ellas, la número 4, rezará “entre 30 y 40 metros“. En la variable altura del elemento del array en donde tengamos el Pino, meteremos en la fase de carga ese 4, que relacionará la respuesta con la propiedad del árbol. A la hora de buscar, sólo tendremos que comparar la opción elegida por el usuario con el valor de esa variable… y si es igual… (lo mismo se haría con todas las propiedades, y cuando un elemento tenga todas sus variables iguales a las que metió el usuario para cada propiedad.. habremos encontrado nuestro árbol).

Cargando Datos

Cuando arranca el programa, debemos cargar los datos de los árboles en un array de tipo arbol, en el que buscar una vez hayamos terminado de recoger datos por pantalla. Lo suyo hubiese sido algo refinado como un fichero xml… o un fichero binario… pero por crear algo simple, he utilizado un fichero de texto, donde sólo hay números. Cada línea del fichero corresponde a los datos de un árbol… y a través del sistema de númeración / relación de valores de las propiedades del árbol / opciones del test… el fichero tendría esta pinta..

0 0 0 4 1 1 1 1
0 0 0 4 2 1 1 1
1 1 1 3 2 1 2 2

En él vemos 3 árboles…. con sus propiedades. El primer número corresponde al nombre técnico, el segundo al nombre común, el tercero a la familia, el cuarto a la altura (numero de opción de la pregunta de test sobre la altura), el quinto al porte (número de opción de la pregunta de test sobre el porte) y así sucesivamente….

Con un bucle while hasta el final de fichero… leo los datos y los voy metiendo a cada elemento del array.

Nombres y Familias

Para crear un listado de los nombres de los árboles y sus familias, me creé tres arrays, que a través de funciones cargo con datos. (El índice de cada elemento hace referencia al valor de los miembros del array tipo arbol. Es decir, Si tenemos familias[0]=”familia1″, y el elemento arboles[4] pertenece a esa familia, en arboles[4].familia, tendremos un 0. (y así lo indicaremos en el fichero anterior).

Buscando

Con los datos cargados y con las respuestas del usuario guardadas en variables, sólo queda recorrer el array de árboles con un while, hasta que nos pasemos de rango o encontremos el árbol que reúne todos los requesitos. (Comparar en un if que cada variable es igual a cada miembro del elemento actual del array de árboles)