Sunteți pe pagina 1din 9

Autor: Jos C.

Riquelme (Universidad de Sevilla)

TEMA 5. Tratamientos secuenciales


1. Introduccin
Es habitual que en numerosos cursos de programacin universitarios en titulaciones de Ingeniera se aprenda a resolver determinados problemas sin ninguna metodologa especfica, sino siguiendo la tcnica de prueba y error. Esto es, se escribe una aproximacin al algoritmo solucin y despus se va depurando hasta conseguir la solucin al problema. En estos cursos se plantean a los alumnos diferentes problemas que se solucionan todos de forma distinta cuando muchos de ellos tienen una solucin comn. Esta forma de ensear a programar es la que confiere a la programacin ese (nefasto) matiz de arte, en el sentido de que hacer un programa se parece a estar pintando un cuadro y se van dando pinceladas aqu y all hasta que el resultado guste. En esos (malos) cursos se incide demasiado en la solucin especfica de un problema determinado, sin dar al alumno una visin ingenieril de la programacin. En este manual se va a intentar agrupar un conjunto de problemas que son muy comunes en programacin y cuya solucin presenta las suficientes similitudes como para conseguir una solucin sistemtica para ellos. Supongamos tenemos una coleccin de datos que pueden ser de muy diversos tipos: los empleados de una empresa, los alumnos de un curso, los pacientes de un hospital, las ventas de unos grandes almacenes, los productos de un almacn, los resultados de un experimento biolgico, los vuelos de un aeropuerto, los resultados de una encuesta electoral Todos estos datos estarn formados preferentemente por valores numricos (enteros o reales) y cadenas de caracteres almacenados en arrays (de una o dos dimensiones). Por ejemplo, el dni o el sueldo de un empleado, las notas de los alumnos, la edad de los pacientes, el cdigo de una venta, el precio de un producto, el pH de un tejido, la hora de salida de un avin, el nmero de votantes a un partido Cules son las preguntas tpicas que se pueden consultar sobre este tipo de datos? Pongamos algunos ejemplos: Cunto vale la suma de todas las nominas de la empresa de mayores de 50 aos? Cuntos alumnos han aprobado todas las asignaturas? Ha habido alguna venta superior a 1000 euros hoy? Cul es el producto con mayor stock en el almacn? Cul es el prximo avin con plazas libres y destino Madrid? Todos los tejidos superan un pH de cuatro? Cul es el partido mayoritario entre los mayores de 60 aos?

En general, estas preguntas se pueden simplificar en las siguientes: Sumar o acumular Contar

Tema 5. Tratamientos secuenciales

Existe algn elemento Todos los elementos cumplen Hallar el mximo Hallar el mnimo

Es posible que todas estas preguntas tengan una base comn para su solucin algortmica? La respuesta es s.

2. Esquemas algortmicos bsicos


Todos los problemas sobre colecciones deben hacer un recorrido sobre la misma mediante un bucle. Por otro lado, si no se requiere realizar el clculo sobre toda la coleccin se deben filtrar los elementos que intervienen mediante una bifurcacin. Por tanto, el esquema general debe ser: Para todo elemento de la coleccin Si el elemento cumple la propiedad Realizar clculo sobre elemento Todas las preguntas se responden mediante la actualizacin de una variable que almacena los resultados intermedios al recorrer la coleccin. Por ejemplo, si estamos hallando una suma, la suma parcial hasta el elemento que estamos tratando, el contador parcial, el mximo hasta ese momento, etc. Dependiendo de la pregunta que se responda el tipo y la inicializacin de la variable ser diferente. Por ejemplo, si la pregunta es hallar la suma de valores reales, el tipo ser numrico real y la inicializacin a cero, si es un contador ser de tipo entero y tambin inicializada a cero, si es un mximo o mnimo ser del tipo del elemento de la coleccin y se pueden inicializar con el primer valor de la coleccin, si la pregunta es existe o para todo la salida es un valor booleano de cierto o falso. Podemos entonces refinar entonces el seudocdigo anterior: Inicializa variable a devolver con un valor neutro Para todo elemento de la coleccin Si el elemento cumple la propiedad variable = funcion (variable, elemento) Finsi FinPara Devuelve variable La funcin que actualiza variable lgicamente depende del problema: en un contador ser sumar uno, en una suma, sumar variable y elemento, en un existe ser una disyuncin lgica entre variable y una propiedad de elemento, etc. Concretemos el seudocdigo anterior en lenguaje C con varios ejercicios de enunciado similar sobre una misma coleccin pero con preguntas diferentes. En todos los

Autor: Jos C. Riquelme (Universidad de Sevilla)

ejercicios se pide construir una funcin en C que reciba un array y devuelva un valor sobre el mismo (suma, contador, mximo,). El array ser un parmetro constante puesto que no se modificar en la funcin y como siempre la funcin deber recibir tambin el tamao real del array, porque ya sabemos que no tiene por qu estar completo. 2.1 Esquema contador. Dado un array de nmeros reales y un umbral p codifique una funcin que devuelva el nmero de elementos del array que son mayores estrictos que p. Entrada: un array de reales, un entero con el tamao y un real con el umbral Salida: un entero con el contador
int contador(const TablaReales t, int n, float p){ int i; int cont=0; for (i=0;i<n;i++){ if (t[i]>p){ cont ++; } } return cont; }

2.2 Esquema suma. Dado un array de nmeros reales y un umbral p codifique una funcin que devuelva la suma de los elementos del array mayores estrictos que p. Entrada: un array de reales, un entero con el tamao y un real con el umbral Salida: un real con la suma
float sumador(const TablaReales t, int n, float p){ int i; float suma=0.; for (i=0;i<n;i++){ if (t[i]>p){ suma = suma + t[i]; } } return suma; }

2.2 Esquema existe. Dado un array de nmeros reales y un umbral p codifique una funcin que devuelva si existe algn elemento del array que sea mayor estricto que p. Entrada: un array de reales, un entero con el tamao y un real con el umbral Salida: un lgico que devuelve cierto si existe y falso en caso contrario
Logico existe(const TablaReales t, int n, float p){ int i; Logico hay=falso;

Tema 5. Tratamientos secuenciales

for (i=0;i<n;i++){ hay = hay || (t[i]>p); } return hay; }

En este caso, el if sera redundante por eso se ha eliminado. Otra solucin para este problema sera:
Logico existe(const TablaReales t, int n, float p){ int i; Logico hay=falso; for (i=0;i<n;i++){ if ((t[i]>p){ hay = cierto; break; } } return hay; }

La principal diferencia con respecto al esquema anterior es que el bucle termina cuando encuentra un elemento cumpliendo la condicin. 2.3 Esquema paraTodo. Dado un array de nmeros reales y un umbral p codifique una funcin que devuelva si todos los elementos del array son mayores estricto que p Entrada: un array de reales, un entero con el tamao y un real con el umbral Salida: un lgico que devuelve cierto si todos cumplen y falso en caso contrario
Logico paraTodo(const TablaReales t, int n, float p){ int i; Logico todo=cierto; for (i=0;i<n;i++){ todo = todo && (t[i]>p); } return todo; }

2.4 Esquema mximo sin filtro. Dado un array de nmeros reales codifique una funcin que devuelva el mayor de los elementos del array Entrada: un array de reales, un entero con el tamao Salida: un valor real con el mximo del array
float maximo(const TablaReales t, int n){ int i; float max;

Autor: Jos C. Riquelme (Universidad de Sevilla)

max=t[0]; for (i=0;i<n;i++){ max = mayor(max,t[i]); } return max; } float mayor(float x,float y){ float m; if (x>y) m=x; else m=y; return m; }

2.5 Esquema mnimo sin filtro. Dado un array de nmeros reales codifique una funcin que devuelva el menor de los elementos del array Entrada: un array de reales, un entero con el tamao Salida: un real con el valor mnimo del array
float minimo(const TablaReales t, int n){ int i; float min; min=t[0]; for (i=0;i<n;i++){ min = menor(min,t[i]); } return min; } float menor(float x,float y){ float m; if (x>y) m=y; else m=x; return m; }

Los dos ejercicios de mximo y mnimo estn suponiendo que en el array hay al menos un elemento. Si n fuera 0 esta funcin podra dar un error de ejecucin. Esa cuestin debe ser indicada en la documentacin de la funcin, de forma que cuando se invocara en el programa principal debera comprobarse antes de su llamada. Esto es,
void main(void){ int numelem; numelem = leeTabla(v); if (numelem>0){ printf("maximo: %f\n",maximo(v,numelem)); printf("minimo: %f\n",minimo(v,numelem)); } }

Tema 5. Tratamientos secuenciales

2.6 Esquemas mximo y mnimo con filtro. Calcular el mximo o mnimo de los elementos de una coleccin que cumplan alguna condicin, tiene una dificultad aadida y es qu debera devolver la funcin si ningn elemento de la coleccin cumple la condicin. Adems la inicializacin de la variable a devolver tampoco se podra hacer con el primer elemento pues puede que ste no cumpla la condicin. Dejaremos este ejercicio para ms adelante.

3. Otros esquemas algortmicos


Hay otros esquemas algortmicos que no cumplen exactamente el patrn anterior pero se aproximan bastante. En concreto son los esquemas de bsqueda y filtrado. 3.1 Esquema bsqueda. Dado un array de nmeros reales y un valor real p devolver la primera posicin del array donde se encuentra p -1 si no estuviera. Entrada: un array de nmeros reales, un entero con el tamao, un valor real a buscar Salida: un entero con la primera posicin del primer elemento del array igual al argumento que se busca -1 si no est.
int busca(const TablaReales t, int n, float p){ int i; int pos=-1; for(i=0;i<n;i++){ if (t[i]==p){ pos=i; break; } } return pos; }

Obsrvese como el empleo de la sentencia break consigue que la primera vez que p es encontrado se abandona el bucle de bsqueda. Si el problema en vez de localizar la primera posicin donde est p, buscara la ltima, en la solucin anterior bastara con quitar el break. El programa principal podra ser:
void main(void){ TablaReales v={1.2, 3.4, 5.4, 6.4, 7.8}; int pos; float valor; printf("Introduce valor a buscar: "); scanf("%f",&valor); pos = busca(v,5,valor);

Autor: Jos C. Riquelme (Universidad de Sevilla)

if (pos==-1) printf("El elemento %f no est en el array\n",valor); else printf("El elemento %f est en la posicin %d\n",valor,pos); }

3.2 Esquema filtrado. Dado un array de nmeros reales y un valor real p, devolver otro array con los valores del primero que son mayores estrictos que p. Entrada: un array de nmeros reales, un entero con el tamao, un valor real umbral. Salida: un array de nmeros reales, un entero con su tamao. Este problema tiene una novedad con respecto a los resueltos anteriormente y es que por primera vez la funcin a construir debe devolver dos datos diferentes: el array filtrado y su tamao. Debemos hacer hincapi otra vez que si se va a devolver un array con los elementos filtrados a la funcin main, debe tambin devolverse el nmero de elementos que tiene. Para ello y teniendo en cuenta que los arrays son argumentos que pueden cambiar en la funcin si no se les pone la clausula const, haremos que la funcin devuelva el tamao del array filtrado en el nombre de la funcin.
int filtra(const TablaReales t, int n, TablaReales v, float p){ int i; int pos=0; for (i=0;i<n;i++){ if (t[i]>p){ v[pos]=t[i]; pos++; } } return pos; }

La funcin principal podra ser:


void main(void){ TablaReales v={1.2, 3.4, 5.4, 6.4, 7.8}; TablaReales v2; int nelem; float valor; printf("Introduce valor umbral: "); scanf("%f",&valor); nelem = filtra(v,5,v2,valor); imprime(v2,nelem); }

Tema 5. Tratamientos secuenciales

Para visualizar en pantalla un array de reales podemos implementar una funcin imprime:
void imprime(const TablaReales t, int n){ int i; printf("\n["); for(i=0;i<n-1;i++){ printf("%6.2f, ",t[i]); } printf("%6.2f ]\n",t[n-1]); }

Donde el ltimo elemento se imprime fuera del bucle para cerrar el corchete en vez de poner una coma.

4. Problemas.
1. Construye una funcin que lea un entero n y a continuacin lea n valores reales y los guarde en un array. Para cada una de las siguientes cuestiones cree una funcin que recibir como argumentos un array del tipo correspondiente, el nmero de elementos y si fuera necesario algn valor ms que se indique. Cada funcin devolver el valor solicitado del tipo int, double o Lgico. 2. Dado un array que contiene el registro diario de aumento de peso de un paciente durante los 365 das de un ao, indicar cul ha sido el peso ganado (o perdido). 3. Dado un array que contiene los nucletidos de una secuencia de ADN, indique cuntas Timinas (T) hay. 4. Generalice la funcin del problema anterior para que sea capaz de calcular cuntos nucletidos hay de cada tipo. 5. Dado un array de valores enteros escriba una funcin que devuelva el valor mximo de entre los elementos pares. 6. Dado un array de valores de frecuencia cardiaca (enteros) y el intervalo compuesto por dos valores [a, b], que pueden indicar los lmites de la taquicardia [100, 175] o la bradicardia [35, 60], escriba una funcin que indique si alguno de los valores del array est comprendido en el intervalo. 7. Dado un array que contiene los datos de frecuencia cardiaco (enteros) de unos pacientes, indicar cul es el ms bajo.

Autor: Jos C. Riquelme (Universidad de Sevilla)

8. Dado un array que contiene un codn (grupo de tres nucletidos que codifican un aminocido) indique si se trata de Lisina (AAA). 9. Generalice el problema anterior a cualquier nmero de nucletidos y cualquier repeticin de stos. 10. Dado un array que representa una secuencia de ADN, donde cada posicin contiene un nucletido, escriba una funcin que nos indique si alguno de los que contiene es la Timina (T). 11. Generalice el problema anterior para cualquier nucletido. 12. Dado un array con los sueldos de unos empleados escriba una funcin que indique si todos tienen un sueldo superior a 1000. 13. Generalice la funcin a cualquier cantidad. 14. Dado un array con las edades de un grupo de personas, escriba una funcin que devuelva otro array con los valores correspondientes a la edad de trabajar, es decir, comprendida entre 16 y 65 aos. 15. Generalice el problema anterior a otras edades por si cambia las edades de primer contrato o jubilacin. 16. Dado un array de valores reales y un intervalo compuesto por dos valores [a,b], escriba una funcin que devuelva la posicin en el array del primer elemento que est contenido en el intervalo. En caso de que ninguno est contenido, devuelva el valor -1. 17. Dado un array con edades de pacientes de un hospital, donde cada posicin en el array se corresponde con la habitacin que ocupa, indique en qu habitacin se encuentra el paciente ms joven. 18. Dado un array de valores de ritmo cardiaco (enteros), filtre aquellos que estn por encima de los lmites de normalidad (100). 19. Dado un array que contiene nucletidos de una secuencia de ADN, recupere en otro array todas aquellas apariciones de Adenina y Timina. 20. Dado un array que contiene nucletidos de una secuencia de ADN, encuentre la secuencia complementaria, esto es, una secuencia en la que la Adenina se sustituya por Timina y la Guanina por Citosina.

S-ar putea să vă placă și