Documente Academic
Documente Profesional
Documente Cultură
En general, estas preguntas se pueden simplificar en las siguientes: Sumar o acumular Contar
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.
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;
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;
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)); } }
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.
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);
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; }
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.
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.