Examen de Repetición. Lenguajes de Programación 23 de Julio del 2002-2 horas Pregunta 1 (20 puntos) Escriba una función que dada la medida de un ángulo expresada en radianes, permita obtener su equivalente en grados, minutos y segundos. Por ejemplo, si la entrada de su función fuera 1, ella debe imprimir en pantalla: 1 radian equivale a 57 grados, 17 minutos y 44 segundos. Nota: 2π radianes = 360 grados. 1 grado = 60 minutos. 1 minuto = 60 segundos. 5 puntos por definicion de funcion y tipos de datos 5 puntos por sintaxis e impresion CORRECTA del resultado 10 puntos por calculos correctos, dividido en: 2 puntos por los grados 3 puntos por los minutos 5 puntos por los segundos void funcion(float radianes) /* ojo con la entrada y la salida */ int grados, minutos, segundos; /* ENTEROS, NO FLOAT */ float A; A = (radianes * 360) / (2 * 3.141592654); grados = (int) A; /* Parte entera de A */ A = A - grados; minutos = (int) A*60; /* Parte entera */ segundos = (int) (A*60 - minutos)*60; /* Parte entera */ /* Cuidado con lo que se imprime */ printf ("%f radian equivale a %d grados, %d minutos y %d segundos.\n", radianes, grados, minutos, segundos); }
Pregunta 2 (30 puntos) Escriba la función char *concatena(char *s1, char *s2) que retorna una frase formada por s1 seguida de s2. Por ejemplo: char *retorno; retorno = concatena("me voy","pero volvere"); printf (retorno); Imprime en pantalla la frase me voypero volvere NO PUEDE UTILIZAR LA FUNCION strcat. DEBE utilizar asignación dinámica de memoria para retornar el arreglo concatenado y no debe ocupar más memoria que la necesaria. Recuerde que la función char *malloc(int n) reserva n bytes de memoria y se los asigna a un puntero. 10 puntos por determinar el tama~no del arreglo a retornar 5 puntos por pedir la memoria de ESE tama~no (+- 1) (0 puntos si es de otro) 5 puntos por copiar la primera frase sin el caracter nulo (3 con) donde corresponde. 10 puntos por copiar la segunda frase CON el caracter nulo (7 sin) donde corresponde. char *concatena(char *s1, char *s2) int n,m,i,j; char *r; j=0; n=strlen(s1); m=strlen(s2); /* Pido sólo la memoria necesaria */ r = malloc (n+m+1); /* +1 por la marca de fin de string */ /* Copio el primero */ for (i=0; i<n; i++) r[j++] = s1[i]; /* Copio el segundo */ for (i=0; i<m; i++) r[j++] = s2[i]; /* Marco el fin y retorno */ r[j] = 0; return r;
Pregunta 3 (30 puntos) La empresa MultiGameSoft4U quiere revolucionar el mercado con su versión del Gato para PC. El lanzamiento es a las 20 horas del 23 de Julio (hora de Chile continental). El alter ego de ella: EntertainmentCompu, ha hecho uso del espionaje informático y borró deliberadamente una parte importante del juego. Desesperados, la empresa recurrió a el cuerpo docente del curso Lenguajes de Programación, quienes confiando plenamente en sus alumnos aceptaron la propuesta de realizar el módulo faltante: Lo que falta es la función int gato(int M[][]) que recibe la matriz M de 3x3 en que cada casilla tiene un 1 si hay una X y un 0 si hay un 0. La función retorna 1 si ganó X, 0 si ganó 0 y -1 si hubo empate. Su misión es implementar la función gato. Nota: Hay un ganador en el gato si hay 3 X o 3 0 alineados horizontal, vertical o diagonalmente. 15 puntos por chequeo vertical y horizontal (5 y 10 o 10 y 5, dependiendo cual primero porque son análogos) 10 puntos por chequeo diagonal (5 puntos por cada una). 5 puntos por retornar al ganador o empate (sólo 3 si no da empate). Este problema puede resolverse de muchas formas, la siguiente aprovecha que los valores son 1 y 0, por lo tanto si la fila, la columna o la diagonal suma 0 o 3 hay un ganador. int gato(int M[][]) int suma,i; /* Chequeo horizontal */ for (i=0; i<3; i++) suma = M[i][0]+M[i][1]+M[i][2];
/* Chequeo vertical (es análogo, ven?) */ for (i=0; i<3; i++) suma = M[0][i]+M[1][i]+M[2][i]; /* Chequeo diagonal */ suma = M[0][0]+M[1][1]+M[2][2]; /* Chequeo la otra diagonal */ suma = M[0][2]+M[1][1]+M[2][0]; /* Si llego hasta acá, es porque no hubo ganador */ return -1; } Pregunta 4 (20 puntos) Implemente la función recursiva int ordenado(int V[],int n) que, dado un vector V R n retorne 1 si el vector está ordenado de menor a mayor y 0 en caso contrario. 5 puntos por caso base 15 puntos por recursion
Un vector está ordenado de menor a mayor sí y sólo sí todo subvector de él está ordenado de menor a mayor; en particular si tomamos pares de ellos. Para demostrar que está ordenado, trataremos de demostrar que: NO está ordenado. int ordenado(int V[], int n) /* Casos base */ if (n == 1) return 1; /* un número siempre esta ordenado */ /* Si no se cumple la condición no debemos seguir llamando a la recursión (5 puntos de 15) */ if (V[n-2] > V[n-1]) return 0; /* Si se cumple, debemos seguir llamandola (ojo como se llama) */ return ordenado(v,n-1); /* 5 puntos por el retorno 5 puntos por el correcto paso de parametros */