/*********************************************************************** * Soluciones propuestas para resolver el examen de ATDI del día 010207* * Francisco Javier Garcia Castellano 2007 * ***********************************************************************/ /***********************************************************************/ //BIBLOTECAS #include #include //Para usar rand() y generar numeros aleatorios /***********************************************************************/ //CONSTANTES #define MAX 100 //Maximo tamaño para vectores y matrices /***********************************************************************/ //FUNCIONES /*---------------------------------------------------------------------*/ /** Procedimiento que devuelve los dos numeros que mas se repiten en una serie de numeros enteros. Si la serie fuera multimodal, devuelve las dos primeras modas que encuentre. Parametros: serie: vector de numeros enteros con la serie a estudiar n: tamaño del vector moda: Variable por referencia donde se guarda la moda moda2: Variable por referencia donde se guarda el segundo valor que mas se repita. Si la serie es multimodal devuelve una segunda moda. */ void modas (int serie[], int n, int *moda, int *moda2){ int i,j; int frecuencias[MAX]; //Repeticiones del elemento i-esimo de la serie int max=0, max2=-1; //Posiciones de ls maximas frecuencias (el maximo sera el primero y //el segundo maximo ya le asignaremos un valor) //Contamos las repeticiones del elemento i-esimo for (i=0;ifrecuencias[max]) { //Guardamos el anterior max como el segundo max if (serie[i]!=serie[max]) max2=max; //Guardamos el nuevo max max=i; } //Nos quedamos con el segundo maximo, para ello primero //miramos que no sea el mismo numero que el maximo if (serie[i]!=serie[max]){ //Si max2 es -1, esta sin incializar por lo que lo inicializamos //con el primer valor distinto del max if (max2==-1) max2=i; //Miramos si la frecuencia es mayor que el segundo maximo else if (frecuencias[i]>frecuencias[max2]) max2=i; } }//fin for i //caso de que haya un solo numero if (max2==-1) max2=max; //Guardamos las modas encontradas *moda=serie[max]; *moda2=serie[max2]; } /*---------------------------------------------------------------------*/ /** Funcion que devuelve el crapulo del numero que se le pasa como parametro. Version corta. Parametros: n: numero entero del que se quiere conocer el crapulo. */ int crapulo(int n) { //El crapulo es el modulo 9 del numero, con dos excepciones: //-Si el numero es cero el crapulo es cero //-Si es disinto de cero y el resto de dividir por 9 es cero, // el crapulo es 9. return (n%9==0) ? ( (n==0)?0:9 ): (n%9); } /*---------------------------------------------------------------------*/ /** Funcion que devuelve el crapulo del numero que se le pasa como parametro. Version recursiva. Parametros: n: numero entero del que se quiere conocer el crapulo. */ int crapuloR(int n) { int aux; if (n<10) //Si n es menor que 10, es crapulo de si mismo (caso base) return n; else //Si n es mayor que 10, el crapulo es la suma del resto de dividir //el número por 10 (extraccion de un digito) mas la suma del cociente aux=n%10+crapuloR(n/10); //Tenemos en cuenta aquellos números que tras sumar sus dígitos, nos sale //una suma mayor que 10 if (aux>9) return crapuloR(aux); else return aux; } /*---------------------------------------------------------------------*/ /** Funcion que devuelve el crapulo del numero que se le pasa como parametro. Version Iterativa. Parametros: n: numero entero del que se quiere conocer el crapulo. */ int crapuloI(int n) { int aux=0; //variable donde vamos a ir guardando el crapulo //si n es menor que 10, ya lo teneos calculado if (n<10) return n; //Calculamos el crapulo para numeros mayores que 9 while (n>9) { aux=aux+n%10; //Sumamos un digito de n n=n/10; //Le quitamos ese digito a n //Si no quedan más que un digito en n, el crapulo esta //"casi" calculado if (n<10){ //Le sumamos al crapulo el ultimo digito aux=aux+n; //Si el carpulo calculado es mayor que 9, volvemos //a empezar if (aux>9) { n=aux; aux=0; } } }//fin while //Devolvemos el crapulo calculado return aux; } /*---------------------------------------------------------------------*/ /**Funcion que devuelve el maximo de una matriz. Parametros: matriz: Matriz de numeros reales. n: numero de filas de la matriz. m: numero de columnas de la matriz.*/ double max(double matriz[100][100], int n, int m) { int i,j; double maximo=matriz[0][0]; //el maximo inicialmente es el primero //Buscamos y guardamos aquellos números que //sean mayores al mayor valor encontrado for (i=0;imaximo) maximo=matriz[i][j]; return maximo; } /*---------------------------------------------------------------------*/ /**Funcion que devuelve el minimo de una matriz. Parametros: matriz: Matriz de numeros reales. n: numero de filas de la matriz. m: numero de columnas de la matriz.*/ double min(double matriz[100][100], int n, int m) { int i,j; double minimo=matriz[0][0]; //el min inicialmente es el primero //Buscamos y guardamos aquellos números que //sean menores al menor valor encontrado for (i=0;iMAX)); //Leemos el numero de columnas que tendrá la matriz do { printf("\nDame el numero de columnas="); scanf("%d",&columnas); } while ((columnas<1)||(columnas>MAX)); //Inicializo la matriz con num aleatorios entre 0 y 9 for (i=0;i