Fundamentos de Informática 1ºIIND Examen Febrero 2009 13/Febrero/2009 1 Prototipos (1.5 puntos) Escribir los prototipos y un ejemplo de llamada a las siguientes funciones (declarando las variables que sea necesario para entender el ejemplo de llamada): a) Función que reciba dos vectores de tipo real y el número de elementos de los vectores y devuelva el producto escalar de los dos vectores. Prototipo: double Escalar(double v1[], double v2[], int n); Declaración de variables en main y ejemplo de llamada: double vec vec1[N], ec1[N], vec vec2[N]; ec2[N]; int n_elem; double prod_escalar; prod_escalar = Escalar(vec1, vec2, e_elem); b) Función que reciba una cadena de caracteres y devuelva la longitud de la cadena. Prototipo: int Longitud(char Longitud(char cad[]); Declaración de variables en main y ejemplo de llamada: char cadena[N]; cadena[N]; int lon; lon = Longitud(cadena); c) Función que recibe una matriz cuadrada de enteros y su dimensión (sólo un valor de dimensión pues se trata de una matriz cuadrada) y devuelva el valor máximo almacenado en la matriz. Prototipo: int Maximo(int m[][N], int dim); Declaración de variables en main y ejemplo de llamada: int n; int mat[M][N]; int max; max=Maximo(mat,n); Fundamentos de Informática 1ºIIND Examen Febrero 2009 2 Cadenas (3 puntos) Escribir una función que reciba dos cadenas (cad1 y cad2) y un carácter ch desde la función principal. La función deberá copiar los caracteres de cad1 en cad2 hasta llegar al final de la cadena o hasta encontrar el carácter guardado en la variable ch. Nota: No se debe modificar la cadena original (cad1). Ejemplos: cad1 ch cad2 Nevadas en la Sierra z Nevadas en la Sierra Nevadas en la Sierra s Nevada void Copiar(char cad1[], char cad2[], char ch) { int i; } i=0; while (cad1[i]!=ch && cad1[i]!=’\ cad1[i]!=’\0’) cad2[i]=cad1[i]; i++; } cad2[i]=’\ cad2[i]=’\0’; //importante { 2 Fundamentos de Informática 1ºIIND Examen Febrero 2009 3 Suma de una serie (2.5 puntos) Escribir un programa completo que solicite el valor x y el valor n para calcular ex por medio de una llamada a la función Serie(). La función serie: Serie() debe calcular ex mediante la suma de n términos de la siguiente x2 x3 x4 xn + + + ... + 2! 3! 4! n! n = 0, 1, 2, 3, 4, ... Nota: x es un valor real, y n (número de términos) es un valor entero. Ambos valores se piden al usuario desde main() y la función los recibe como parámetro. Realizar los controles que se consideren necesarios. ex =1+ x + #include <stdio.h> #include <math.h> //para la función exp(). opcional double Serie(double x, int n); int main(void) { double x; int num; //numero de términos double resultado; //Entrada de datos do { printf("Numero de terminos: "); scanf("%d",&num); if (num<1) { printf("Como mínimo debe haber un término\ término\n"); } } while(num<1); printf("Valor de x: "); scanf("%lf",&x); //Calculos resultado=Serie(x,num); printf("e^%f = %f (aprox), =%f (exacto)\ (exacto)\n",x,resultado,exp(x)); } return 0; double Serie(double x, int n) /* Se supone que n vale como mínimo 1 Devuelve el resultado de la suma de la serie. Es más preciso cuanto mayor sea n */ { int i; double termino; double suma; } //Calculos suma=1; termino=1; for(i=1; i<n; i++) { termino=termino*x/i; termino=termino*x/i; //en //en función del término anterior suma+=termino; //sumo el nuevo término } return suma; 3 Fundamentos de Informática 1ºIIND Examen Febrero 2009 4 Matriz (3 puntos) Escribir una función que reciba una matriz cuadrada de números reales y su dimensión y rellene en un vector todos los números encontrados en la matriz mayores que la media de todos los números de la matriz, devolviendo también el tamaño de ese vector. /*** Solo se pide la función. para poder hacer pruebas Se ha escrito un main ***/ #include <stdio.h> #include <cstdlib> //para rand() #define N 100 int Numeros(double m[][N],int dim, double res[]); int main(void) { double mat[N][N]; mat[N][N]; int nmat; //dimension de mat double r[N*N]; //vector de resultados int nr; //dimension de r int i,j; nmat=60; for(i=0; i<nmat; i++) for(j=0; j<nmat; j++) mat[i][j]=(double)rand(); nr=Numeros(mat,nmat,r); for(i=0; i<nr; i++) printf("%f printf("%f ",r[i]); } return 0; int Numeros(double m[][N],int dim, double r[]) { int res; int i,j; double media; //Calculo la media media=0; for(i=0; i<dim; i++) { for(j=0; j<dim; j++) { media+=m[i][j]; } } media=media/dim/dim; //Ojo si dim es cero esto falla //Relleno los resultados res=0; for(i=0; i<dim; i++) { for(j=0; j<dim; j++) { if (m[i][j]>media) { r[res]=m[i][j]; res++; } } } } return res; 4