Universidad Carlos III de Madrid Ingeniería de Telecomunicación Examen de Programación Septiembre 2007 Parte de Ejercicios Responder y entregar cada ejercicio en hojas separadas Numerar todas las hojas de un mismo ejercicio independientemente del resto del examen: 1de N, 2 de N, … N de N Duración: 3h. Valor: 60% Ejercicio 1 (2,5 puntos) Dentro de una aplicación de transmisión de datos, hay que programar un método que valide si la información recibida en destino es idéntica a la enviada por el ordenador emisor. El mecanismo de control consiste en que en cada línea de texto, los 4 primeros caracteres contiene un número entero que denominamos cifra de control, el resto del la línea es el contenido del texto. Se validará que el tamaño de la línea de texto tenga al menos 5 caracteres y que los caracteres correspondientes a la cifra de control sean numéricos. Esta cifra de control se forma con la suma del valor numérico de cada uno de los caracteres que componen el contenido del texto. El método se llamará validarLinea, recibe una línea de tipo String , en la que los 4 primeros caracteres es la cifra de control. Se pide definir el tipo de datos de retorno y completar el código de este método. validarLinea (String linea) { } Ejemplo: Este ejemplo es ilustrativo del funcionamiento del algoritmo que hay que programar. Java dispone de herramientas para conocer el valor numérico de un carácter. Se recibe un String con el contenido: “1242la casa del ama” La longitud de este String es de 19 posiciones, 4 de cifra de control que es 1242, y 15 de texto. 1 La suma del valor numérico de estos 15 caracteres ASCII es 1321(108+97+…119+97): L 108 a 97 32 c 99 a 97 s 115 a 97 32 d 100 e 101 l 108 32 a 97 m 109 a 97 Como la cifra de control difiere de la suma obtenida, el String analizado es erróneo. (1 punto) Ejercicio 2 En una matriz se tienen almacenados los puntos que ha conseguido cada participante en el campeonato mundial heptalon en cada una de las carreras celebradas. En cada casilla se almacenan los puntos conseguidos por cada participante en cada carrera (números enteros positivos). Las filas (1ª coordenada) representan los participantes y las columnas (2ª coordenada) las carreras Realizar un método que reciba como parámetro la matriz de 2 dimensiones de números enteros con los puntos logrados, y devuelva un array de enteros de 2 dimensiones, con tantas columnas como tenía la matriz y 2 filas: en la primera fila estará almacenado el valor mayor de cada columna de la matriz original y en la segunda fila estará almacenada la posición (fila) en la que estaba el valor mayor correspondiente a esa columna, que indicará el ganador de la carrera. Si existen varios participantes con el máximo de puntos en una carrera se elijará a uno cualquiera de ellos. 2 Ejemplo: Matriz original Participante 0 Participante 1 Participante 2 Participante 3 Carrera 0 12 4 7 11 Carrera 1 8 6 2 15 Carrera 2 3 9 10 1 Carrera 3 1 14 2 5 Carrera 4 9 2 6 2 Matriz Resultado: Puntos Máximos Ganador 12 0 15 3 10 2 14 1 9 0 3 (2,5 puntos) Ejercicio 3 Dado el siguiente interfaz: interface Lista { boolean añadir (Object o); Object obtener(); } que sirve para definir listas de objetos en las que se pueden agregar objetos con la operación añadir y obtener objetos de la misma. Cada vez que se obtenga un objeto éste desaparecerá de la lista. Y la clase abstract class ListaConArrayParcial implements Lista{ Object vo[]; int cont; ListaConArrayParcial (int tamañoMaximo){ cont=0; vo= new Object[tamañoMaximo]; } //añadir añade un objeto al principio del array public boolean añadir (Object o){ boolean ok=false; if (cont <vo.length) { vo[cont++]=o; ok=true; } return ok; } } a) Definir la clase ListaConArray que herede de la anterior e implemente el método obtener de tal forma que cada vez que se llame al mismo devuelva el objeto que lleva menos tiempo en el array. b) Definir la clase ListaConArrayCompleta que tenga los métodos añadir, obtener y obtenerAntiguo , que devolverá el objeto que lleve más tiempo en la lista. c) Definir un método de la clase UtilizaciónLista que reciba como parámetro cualquier tipo de lista de las anteriores y muestre en pantalla todos los objetos que contenga dicha lista. Realizar un pequeño programa principal que utilice el método UtilizaciónLista. 4 SOLUCIONES boolean validarLinea(String texto){ int total= 0, i= 0; boolean resultado = true, esNumerico = true; String palabra; if (texto.length()>4) {while (i<4 && esNumerico) {if (texto.charAt(i)< '0' || texto.charAt(i) > '9') esNumerico = false; i++; } //While if (esNumerico ) {int cifraControl=Integer.parseInt (texto.substring(0,4)); for (i=4;i<texto.length() ;i++ ) total = total + (int)texto.charAt(i); if (total!= cifraControl) resultado = false; } else resultado =false; // if esNumerico } else resultado = false;// if longitud return resultado; } Ej2 int [][] ganadores (int [][] m){ int[][] mgana; if (m!= null){ mgana= new int[2][m[0].length]; for (int f = 0; f <m.length ; f++) { int max=-1; for (int c = 0; c<m[0].length; c++) if (max < m[f][c]){ max=m[f][c]; mgana[0][c]=max; mgana[1][c]=f; } } } else mgana=null; return mgana; } Ej3 class ListaConArray extends ListaConArrayParcial { ListaConArray(int tamañoMaximo){ super(tamañoMaximo); } 5 public Object obtener () { if (cont==0) return null; else return vo[--cont]; } } class ListaConArrayCompleta extends ListaConArray { ListaConArrayCompleta(int tamañoMaximo){ super(tamañoMaximo); } public Object obtenerAntiguo () { Object aux=null; if (cont!=0){ aux= vo[0]; cont--; for (int i=1; i<=cont; i++) vo[i-1]= vo[i]; } return aux; } } class UtilizacionLista{ void usarListas ( Lista l){ Object aux; int i=0; while ( (aux=l.obtener()) != null) System.out.println ("Elemento "+ i++ +" es "+ aux); } public static void main (String a[]){ ListaConArray la=new ListaConArray(10); ListaConArrayCompleta lac=new ListaConArrayCompleta(5); for (int i=0; i<4; i++) la.añadir(new Integer(i) ); for (int i=10; i<15; i++) lac.añadir(new Integer (i) ); UtilizacionLista ul=new UtilizacionLista (); ul.usarListas(la); ul.usarListas(lac); } } 6