Examen escrito de Programación 1

Documentos relacionados
Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Examen escrito de Programación 1. Jueves 5 de febrero de Problema 1 o (3.5 puntos)

Examen escrito de Programación 1

Tema 7.- Fundamentos de la Programación Orientada a Objetos

1. Cuántas sentencias hay en la secuencia principal del siguiente programa?

LA ESTRUCTURA DE DATOS PILA EN JAVA. CLASE STACK DEL API JAVA. EJEMPLO Y EJERCICIOS RESUELTOS. (CU00923C)

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

FUNDAMENTOS DE INFORMÁTICA

Introducción al lenguaje Java

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Ejercicios de Programación Tema 7. Programación Orientada a Objetos

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

GUÍA DE ESTILO EN JAVA

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

INTERFACE COMPARATOR. DIFERENCIAS ENTRE COMPARATOR Y COMPARABLE. CLASE COLLECTIONS. EJERCICIOS RESUELTOS. (CU00918C)

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

Guía - Taller # 2 (JAVA)

Un breve resumen del lenguaje Java

Examen Parcial de Programación II Ejercicio Práctico

Ejercicios de evaluación de fundamentos de programación en Java

Pero nos están faltando otros operadores imprescindibles:

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

Tema 4. Excepciones en Java

Lección 2: Creando una Aplicación en Java. 1. Estructura del archivo de una clase. 3. Definiendo clases fundamentos

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

QUÉ ES UNA CLASE JAVA? ATRIBUTOS (PROPIEDADES O CAMPOS), CONSTRUCTOR Y MÉTODOS. (CU00623B)

Primer Parcial Septiembre 5 de 2009

Definición de Memoria

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

Ejercicios del tema 7: Clases y objetos

Programación Orientada a Objetos. Java: Excepciones

Elementos léxicos del lenguaje de programación Java

Java para programadores

Unidad Nº V Listas Enlazadas

Tutorial básico del entorno de desarrollo Eclipse.

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Metodología y Tecnología de la Programación

15. Parámetros o argumentos

Escuela Politécnica Superior de Elche

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos

Clase adicional 2. Estructuras básicas de control. Temas

Programación Orientada a Objetos. Java: Excepciones

Ficheros y streams. Desde el punto de vista de Java, cada fichero no es más que una secuencia o flujo de bytes [stream].

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

5. Sentencias selectivas o condicionales

CLASES QUE UTILIZAN OBJETOS. RELACIÓN DE USO ENTRE CLASES JAVA. CONCEPTO DE DIAGRAMA DE CLASES. (CU00641B)

Elementos de un programa en C

INTELIGENCIA EN REDES DE COMUNICACIONES PRÁCTICA FINAL. Ignacio Ribas Ramos Miguel Flecha Lozano Ingeniería de Telecomunicaciones

ESCUELA SUPERIOR POLITECNICA DE CHIMBORAZO ESCUELA DE INGENIERIA EN SISTEMAS

Práctica 4: Herencia. Objetivos:

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Introducción a Java LSUB. 30 de enero de 2013 GSYC

EXAMEN PROGRAMACIÓN 21 de Septiembre de 2007 INGENIERÍA INFORMÁTICA Primera parte: Cuestiones 1,5 horas

Taller de Programación I. Tema 06: Orientación al Objeto en Java (parte 2)

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

1. Sobrecarga de operadores. 2. Métodos operadores unarios Operador de incremento (prefijo)

La sintaxis básica para definir una clase es la que a continuación se muestra:

Aquí se declaran los. Aquí se declaran los métodos de la clase. *Atributos de la clase

TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote METODOS CONSTRUCTORES Y LA REFERENCIA THIS

Programa Java. El lenguaje de programación Java. Comentarios. Programa Java. Palabras reservadas. Identificadores

GUÍA DE LABORATORIO 5 ARREGLOS DE UNA DIMENSIÓN

PROGRAMACIÓN ORIENTADA A OBJETOS CON JAVA

Introducción a Java (II) Dr. (c) Noé Alejandro Castro Sánchez

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

Tema: Arreglos de Objetos en C++.

FUNCIONES PHP: DECLARACIÓN Y LLAMADAS. PARÁMETROS, RETURN. EJERCICIOS EJEMPLOS RESUELTOS. (CU00827B)

IIC1103 Introducción a la Programación. Ayudantía: Archivos

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

FUNCIONES Y FÓRMULAS FUNCIONES

Programación Orientada a Objetos con Java. Elementos Básicos del Lenguaje Java. Creación de un objeto. Creación de un objeto. Creación de un objeto

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

PROGRAMACIÓN ORIENTADA A OBJETOS

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

EXAMEN PARCIAL 23 de Octubre de 2015 Programación I. Grado en Matemáticas e Informática ETSIINF UPM

GUÍA DE TRABAJO GRADO 11. Articulación SENA Programación de Software Ing. Néstor Raúl Suarez Perpiñan Página 1 de 6

El lenguaje de programación Java

Tecnólogo en Informática Programación Avanzada Curso Examen Febrero 2012

Arreglos Unidimensionales En este tipo de arreglo se hace uso de un índice solamente para hacer referencia a una posición particular del arreglo.

Introduciendo datos desde el

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Examen de Prácticas de Programación Ingeniería Informática

package uniandes.cupi2.traductor.servidor; import java.io.serializable; import java.util.arraylist;

Programación Avanzada para Sistemas de Telecomunicación. Objetos y clases. J.C. Cruellas. Objetos y clases

Ficheros de acceso aleatorio

public class AtaqueVoraz extends EsquemaVZ implements EstrategiaSolucion {

11. Algunas clases estándar de Java (II)

TEMA 8: Gestión dinámica de memoria

16. Herencia Definición de herencia. 168 A. García-Beltrán y J.M. Arranz

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES TRABAJO DE PRÁCTICAS. Convocatoria de junio de 2013

Tema: Introducción al IDE de Microsoft Visual C#.

4. Operadores Operador asignación

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.

Lo que necesitaremos para programar en Java, será un editor de texto o IDE y la JDK.

Transcripción:

Examen escrito de Programación 1 Escuela de Ingeniería y Arquitectura Departamento de Informática e Ingeniería de Sistemas 3 de septiembre de 2014 Disponer sobre la mesa en lugar visible un documento de identificación provisto de fotografía. Escribir nombre y dos apellidos en cada una de las hojas de papel que haya sobre la mesa. Comenzar a resolver cada uno de los problemas del examen en una hoja diferente para facilitar su corrección por profesores diferentes. El tiempo total previsto para realizar el examen es de tres horas. No está permitido utilizar dispositivos electrónicos de ningún tipo, ni consultar libros ni apuntes, excepto los dos documentos facilitados por los profesores de la asignatura: Breve resumen del lenguaje Java y Resumen de las únicas clases Java predefinidas que pueden ser utilizadas en esta asignatura. En todos los métodos a diseñar en este examen se valorará de forma destacada la adecuada especificación de los mismos. Problema 1.º (1 punto) En matemáticas recreativas, un número repituno es un número formado exclusivamente con el dígito 1. Así, 1, 11, 111 y 1111 son ejemplos de números repitunos. Se define el orden de un número repituno como el número de cifras que lo componen. Así, el orden de 11 es 2 y el orden de 111111 es 6. Se debe escribir el código del método ordenrepituno cuya especificación se muestra a continuación: 1

* Pre: n > 0 * Post: Si «n» es un número repituno, ha devuelto el orden del mismo. * En caso contrario, ha devuelto -1. public static int ordenrepituno(int n) Problema 2.º (2 puntos) En tenis, un set es una parte o manga independiente de un partido. Uno de los dos jugadores que lo disputan lo gana cuando ha conseguido anotarse al menos seis juegos y, además, ese número de juegos supera en dos al número de juegos de su rival. Por ejemplo, un set con tanteos como 6 0, 6 3 o 6 4, habrían sido ganados por el primer jugador por haber alcanzado 6 juegos con una diferencia de dos con respecto a los de su rival. Un set con tanteos como 5 7, 6 8 o 7 9 habría sido ganado por el segundo jugador, por haber conseguido al menos 6 juegos, con una diferencia de dos con respecto a los de su rival. Sets cuyos tanteos fueran 3 5, 6 5 o 7 8 serían sets que todavía estarían disputándose, por no haber llegado ninguno de los dos jugadores al mínimo de seis juegos o por no tener uno de los jugadores una ventaja de dos juegos sobre su oponente. Se debe escribir el código de una clase Java de nombre Set, cuyos objetos representan sets de un partido de tenis. La única información que van a gestionar es el nombre de los dos jugadores que lo disputan y el número de juegos ganados por cada uno de ellos. El diagrama UML de la clase que se debe diseñar se muestra a continuación, seguido de explicaciones sobre sus atributos y métodos. En las especificaciones que siguen, cuando se utiliza un dato entero para distinguir a los jugadores, uno de ellos estará identificado con el entero 0 y el otro, con el entero 1. examen.septiembre.set nombres: String[] juegos: int[] + Set(nombre0, nombre1: String) + Set(nombre0, nombre1: String; juegos0, juegos1: int) + juegos(jugador: int): int + anotarjuego(jugador: int): void + haganado(jugador: int): boolean + boolean terminado(): boolean + ganador(): String 2

El atributo nombres de cada objeto de la clase Set almacena los nombres de cada jugador. En la componente indexada por 0, se almacenan el nombre del jugador identificado con el entero 0 y en la componente indexada por 1, el nombre del jugador identificado con el entero 1. El atributo juegos de cada objeto de la clase Set almacena el número de juegos ganados por cada jugador en ese set. En la componente indexada por 0, se almacenan los juegos ganados por el jugador identificado con el entero 0 y en la componente indexada por 1, se almacenan los juegos ganados por el jugador identificado con el entero 1. La clase tiene dos constructores: uno con dos parámetros de tipo String, que inicializa el atributo nombres con los nombres de los dos jugadores especificados por los valores de los parámetros nombre0 y nombre1, y que inicializa el atributo juegos de forma que represente un set cuando comienza a jugarse. El segundo constructor tiene, además de los dos parámetros de tipo String que sirven para inicializar el atributo nombres, dos parámetros de tipo entero, que deben ser no negativos, representan, respectivamente, los juegos ganados por los jugadores 0 y 1 y sirven para inicializar el atributo juegos. El método juegos devuelve el número de juegos que lleva ganados el jugador identificado por el valor del parámetro jugador, que debe ser 0 o 1. El método anotarjuego incrementa en una unidad el número de juegos ganados por el jugador identificado por el entero jugador, que debe ser 0 o 1. El método haganado devuelve el valor booleano true si y solo si, en función de los juegos ganados por cada jugador, el jugador identificado por el entero jugador ha ganado el set. El valor del parámetro jugador de nuevo tiene que ser 0 o 1. El método terminado devuelve el valor booleano true si y solo si, en función de los juegos ganados por cada jugador, el set ha terminado. El método ganador devuelve el nombre del jugador ganador del set, en el caso de que este haya terminado. En el caso de que el set no haya terminado, devuelve la cadena vacía. Se pide escribir el contenido completo del fichero de código fuente Java «Set.java», ubicado en el paquete examen.septiembre, cuyos métodos públicos tengan un comportamiento acorde con la especificación proporcionada en este enunciado. El código debe estar adecuadamente documentado. 3

Problema 3.º (3 puntos) Se pide diseñar el código de los métodos buscar, incrementarsetsganados y escribirnombremaximoganador, cuya especificación se muestra a continuación: * Pre: «nombrejugador» no es nulo, «numjugadores» es mayor o igual que 0 y * no alcanza el número de componentes de la tabla «nombrejugadores» y * para cada índice i entre 0 y numjugadores-1, nombrejugadores[i] no * es nulo. * Post: Si entre las primeras «numjugadores» componentes de la tabla * «nombrejugadores» se encontraba un dato igual a «nombrejugador», ha * devuelto el índice de dicha componente. En caso contrario, ha * devuelto el valor de «numjugadores» (es decir, el índice de la * primera componente «libre» de la tabla). private static int buscar(string nombrejugador, String[] nombrejugadores, int numjugadores) * Pre: «nombrejugador» no es nulo, las tablas «nombrejugadores» y * «setsganados» tienen el mismo número de componentes, «numjugadores» * es mayor o igual que 0 y no alcanza ese número de componentes y para * cada índice i entre 0 y numjugadores-1, setsganados[i] representa el * número de sets ganados por el jugador cuyo nombre es * nombrejugadores[i]. * Post: Si entre las primeras «numjugadores» componentes de la tabla * «nombrejugadores» se encuentra un dato igual a «nombrejugador», ha * incrementado en 1 el valor de la componente correspondiente de la * tabla «setsganados» y ha devuelto «numjugadores». En caso contrario, * ha añadido el nombre «nombrejugador» a la tabla «nombrejugadores» * (en su posición «numjugadores») ha incrementado en 1 igualmente el * valor de la componente correspondiente de la tabla «setsganados» y * ha devuelto el valor numjugadores+1. private static int incrementarsetsganados(string nombrejugador, String[] nombrejugadores, int[] setsganados, int numjugadores) 4

* Pre: Las tablas «nombrejugadores» y «setsganados» tienen el mismo número * de componentes, «numjugadores» está entre 1 y ese número de * componentes y para cada índice «i» entre 0 y numjugadores-1, * setsganados[i] representa el número de sets ganados por el jugador * cuyo nombre es nombrejugadores[i]. * Post: Ha escrito en la pantalla el nombre del jugador con mayor * número de sets ganados y el número de sets que ha ganado, con un * formato como el siguiente: * * Tenista que más sets ha ganado: Rafael Nadal * Número total de sets ganados: 21 private static void escribirnombremaximoganador( String[] nombrejugadores, int[] setsganados, int numjugadores) Problema 4.º (4 puntos) Disponemos de varios ficheros de texto que almacenan los resultados de todos los partidos de tenis correspondientes a un determinado torneo. La estructura de dichos ficheros de texto es la siguiente: la información de cada partido se reparte en tres líneas. En las dos primeras, aparecen los nombres de los jugadores del partido: en la primera línea el del jugador 0 y en la segunda línea el del jugador 1. En la tercera línea, aparecen los tanteos de cada set jugado en el partido, consistiendo este en un par de números enteros que representan el número de juegos ganados por el jugador 0 y por el jugador 1, en ese orden. El número de sets de los que consta un partido de tenis es variable y está comprendido entre dos y cinco. Dicha estructura, en notación BNF, es la siguiente: <fichero_torneo_tenis> ::= <partido> { <partido> <partido> ::= <nombre_jugador_0> fin_de_línea <nombre_jugador_1> fin_de_línea { <set> fin_de_línea <set> ::= <juegos_jugador_0> <juegos_jugador_1> <nombre_jugador_0> ::= literal_string <nombre_jugador_1> ::= literal_string <juegos_jugador_0> ::= literal_int <juegos_jugador_1> ::= literal_int A modo de ejemplo, se muestra a continuación el contenido de un fichero de texto denominado «RolandGarros2014.txt», que sigue dicho formato: 5

Agnieszka Radwańska Zhang Shuai 6 3 6 0 Roger Federer Lukáš Lacko 6 2 6 4 6 2 Serena Williams Alizé Lim 6 2 6 1... Novak Ðoković Ernests Gulbis 6 3 6 3 3 6 6 3 Rafael Nadal Andy Murray 6 3 6 2 6 1 Marija Šarapova Simona Halep 6 4 5 7 6 4 Rafael Nadal Novak Ðoković 3 6 7 5 6 2 6 4 Se pide escribir un programa Java que solicite al operador el nombre de un fichero de texto que respete el formato establecido previamente y escriba en la pantalla el nombre del tenista que, según los datos contenidos en el fichero suministrado, más sets haya ganado en el torneo, junto con el número de estos sets. A modo de ejemplo, se presenta a continuación una posible ejecución del programa: Nombre de un fichero con resultados de un torneo: RolandGarros2014.txt Tenista que más sets ha ganado: Rafael Nadal Número total de sets ganados: 21 Al diseño de este método se le debe aplicar la metodología de diseño descendente utilizada en el curso. Se puede, y se recomienda, utilizar objetos de la clase Set y los métodos diseñados en el problema anterior. 6

Solución al problema 1.º package examen.septiembre; public class Repituno { * Pre: n > 0 * Post: Si «n» es un número repituno, ha devuelto el orden del mismo. * En caso contrario, ha devuelto -1. public static int ordenrepituno(int n) { int numcifras = 0; boolean esrepituno = true; while (n!= 0 && esrepituno) { int ultimodigito = n % 10; n = n / 10; numcifras++; esrepituno = (ultimodigito == 1); // n == 0!esRepituno if (esrepituno) { return numcifras; else { return -1; 7

Solución al problema 2.º package examen.septiembre; * Los objetos de esta clase representan sets de un partido de tenis. La * única información que gestionan es el nombre de los jugadores y el número * de juegos ganados en el set por cada jugador. En los métodos que siguen, * cuando los jugadores se identifican a través de datos enteros, uno de los * jugadores estará identificado con el entero «0» y el otro, con el entero * «1». public class Set { * Número mínimo de juegos que tiene que anotarse un jugador para poder * ganar el set. private static final int MIN_NUM_JUEGOS = 6; * Diferencia mínima de juegos que tiene que haber entre los dos * jugadores para que uno de ellos pueda ganar el set. private static final int MIN_DIF_JUEGOS = 2; * Nombres de los jugadores. En la componente indexada por 0, se * almacena el nombre del jugador identificado con el entero «0» y en la * componente indexada por 1, se almacena el nombre del jugador * identificado con el entero «1». private String[] nombres; * Número de juegos ganados por los jugadores. En la componente indexada * por 0, se almacena el número de juegos ganados por el jugador * identificado con el entero «0» y en la componente indexada por 1, el * número de juegos ganados por el jugador identificado con el entero * «1». private int[] juegos; 8

* Pre: --- * Post: Ha inicializado los atributos de este objeto con los nombres de * los dos jugadores y de forma que represente un set cuando * comienza a jugarse. public Set(String nombre0, String nombre1) { this.nombres = new String[] { nombre0, nombre1 ; this.juegos = new int[] { 0, 0 ; * Pre: juegos0 >= 0 y juegos1 >= 0. * Post: Ha inicializado los atributos de este objeto para que * represente un set en el que el jugador «0» se llama «nombre0» y * tiene «juegos0» juegos ganados y el jugador «1» se llama * «nombre1» y tiene «juebos1» juegos ganados. public Set(String nombre0, String nombre1, int juegos0, int juegos1) { this.nombres = new String[] { nombre0, nombre1 ; this.juegos = new int[] { juegos0, juegos1 ; * Pre: jugador == 0 jugador == 1 * Post: Ha devuelto el número de juegos que lleva ganados el jugador * identificado por el entero «jugador». public int juegos(int jugador) { return this.juegos[jugador]; * Pre: jugador == 0 jugador == 1 * Post: Ha incrementado en una unidad el número de juegos ganados por * el jugador identificado por el entero «jugador». public void anotarjuego(int jugador) { this.juegos[jugador]++; 9

* Pre: jugador == 0 jugador == 1 * Post: Ha devuelto true si y solo si, en función de los juegos ganados * por cada jugador, el jugador identificado por el entero * «jugador» ha ganado este set. public boolean haganado(int jugador) { // Ha ganado si tiene 6 juegos o más y 2 juegos más que su rival return this.juegos[jugador] >= MIN_NUM_JUEGOS && this.juegos[jugador] - this.juegos[elotro(jugador)] >= MIN_DIF_JUEGOS; * Pre: jugador == 0 jugador == 1 * Post: Dado el jugador identificado por «jugador», ha devuelto el * entero que identifica al otro jugador (1, si jugador==0 o 0, si * jugador==1). private int elotro(int jugador) { return 1 - jugador; * Pre: --- * Post: Ha devuelto true si y solo si, en función de los juegos ganados * por cada jugador, este set ha terminado. public boolean terminado() { return haganado(0) haganado(1); 10

* Pre: --- * Post: Si este set ha terminado, ha devuelto el nombre del jugador que * lo ha ganado. En caso de que el set no haya terminado, ha * devuelto la cadena vacía. public String ganador() { if (haganado(0)) { return this.nombres[0]; else if (haganado(1)) { else { return this.nombres[1]; return ""; Solución a los problemas 3.º y 4.º package examen.septiembre; import java.io.file; import java.io.filenotfoundexception; import java.util.scanner; * Esta clase dispone de un método «main» que, al ser invocado, solicita al * operador el nombre de un fichero que almacena los resultados de un torneo * de tenis con el formato establecido en el enunciado y, tras leerlo, * escribe en la pantalla el nombre del tenista que más sets ha ganado en * dicho torneo y el número de sets que ha ganado. public class Problema { * Número máximo de jugadores distintos que puede haber en el torneo private static final int MAX_JUGADORES = 100; 11

* Pre: «nombrejugador» no es nulo, «numjugadores» es mayor o igual que * 0 y no alcanza el número de componentes de la tabla * «nombrejugadores» y para cada índice i entre 0 y * numjugadores-1, nombrejugadores[i] no es nulo. * Post: Si entre las primeras «numjugadores» componentes de la tabla * «nombrejugadores» se encontraba un dato igual a * «nombrejugador», ha devuelto el índice de dicha componente. En * caso contrario, ha devuelto el valor de «numjugadores» (es * decir, el índice de la primera componente «libre» de la tabla). private static int buscar(string nombrejugador, String[] nombrejugadores, int numjugadores) { // Esquema de búsqueda sin garantía de éxito int indice = 0; while (indice < numjugadores &&!nombrejugadores[indice].equals(nombrejugador)) { indice++; // indice == numjugadores // nombrejugadores[indice].equals(nombrejugador) return indice; 12

* Pre: «nombrejugador» no es nulo, las tablas «nombrejugadores» y * «setsganados» tienen el mismo número de componentes, * «numjugadores» es mayor o igual que 0 y no alcanza ese número * de componentes y para cada índice «i» entre 0 y * numjugadores-1, setsganados[i] representa el número de sets * ganados por el jugador cuyo nombre es nombrejugadores[i]. * Post: Si entre las primeras «numjugadores» componentes de la tabla * «nombrejugadores» se encuentra un dato igual a «nombrejugador», * ha incrementado en 1 el valor de la componente correspondiente * de la tabla «setsganados» y ha devuelto «numjugadores». * En caso contrario, ha añadido el nombre «nombrejugador» a la * tabla «nombrejugadores» (en su posición «numjugadores») ha * incrementado en 1 igualmente el valor de la componente * correspondiente de la tabla «setsganados» y ha devuelto el * valor numjugadores+1. private static int incrementarsetsganados(string nombrejugador, String[] nombrejugadores, int[] setsganados, int numjugadores) { int indice = buscar(nombrejugador, nombrejugadores, numjugadores); if (indice == numjugadores) { // Se trata de un nuevo jugador que no estaba en la tabla // «nombrejugadores» nombrejugadores[indice] = nombrejugador; numjugadores++; setsganados[indice]++; return numjugadores; 13

* Pre: Las tablas «nombrejugadores» y «setsganados» tienen el mismo * número de componentes, «numjugadores» está entre 1 y ese número * de componentes y para cada índice «i» entre 0 y * numjugadores-1, setsganados[i] representa el número de sets * ganados por el jugador cuyo nombre es nombrejugadores[i]. * Post: Ha escrito en la pantalla el nombre del jugador con mayor * número de sets ganados y el número de sets que ha ganado, con * un formato como el siguiente: * * Tenista que más sets ha ganado: Rafael Nadal * Número total de sets ganados: 21 private static void escribirnombremaximoganador( String[] nombrejugadores, int[] setsganados, int numjugadores) { // Cálculo del índice donde está el máximo int indicemaximo = 0; int i = 1; while (i < numjugadores) { if (setsganados[i] > setsganados[indicemaximo]) { i++; indicemaximo = i; // i == numjugadores // Escritura del tenista con más sets ganados y el número de sets // que ha ganado System.out.println("Tenista que más sets ha ganado: " + nombrejugadores[indicemaximo]); System.out.println("Número total de sets ganados: " + setsganados[indicemaximo]); 14

* Pre: --- * Post: Ha solicitado al operador el nombre de un fichero que almacena * los resultados de un torneo de tenis con el formato establecido * en el enunciado y, tras haberlo leído, ha escrito en la * pantalla el nombre del tenista que más sets ha ganado en dicho * torneo y el número de sets que ha ganado. public static void main(string[] args) { // Petición y lectura del nombre del fichero System.out.println("Escriba el nombre de un fichero " + "con resultados de un torneo: "); @SuppressWarnings("resource") Scanner teclado = new Scanner(System.in); String nombrefichero = teclado.nextline(); try { // Creación de las estructuras de datos necesarias: String[] nombrejugadores = new String[MAX_JUGADORES]; int[] setsganados = new int[max_jugadores]; int numjugadores = 0; // Lectura del fichero y cálculo del tenista con mayor número de // sets ganados Scanner fichero = new Scanner(new File(nombreFichero)); while (fichero.hasnextline()) { numjugadores = leerpartido(fichero, nombrejugadores, setsganados, numjugadores); fichero.close(); // Escritura de los resultados escribirnombremaximoganador(nombrejugadores, setsganados, numjugadores); catch (FileNotFoundException ex) { System.out.println("Error: el fichero " + nombrefichero + " no existe."); 15

* Pre: «fichero» está abierto y en disposición de poder leerse de él * un partido completo, de acuerdo con el formato establecido en * el enunciado; las tablas «nombrejugadores» y «setsganados» * tienen el mismo número de componentes; «numjugadores» está * entre 0 y ese número de componentes; y para cada índice i entre * 0 y numjugadores-1, setsganados[i] representa el número de sets * ganados por el jugador cuyo nombre es nombrejugadores[i]. * Post: Ha leído un partido completo del «fichero», con la información * de cada set del partido, ha actualizado las tablas * «nombrejugadores» y «setsganados», añadiendo el nombre de cada * jugador que no estuviera en la tabla «nombrejugadores» a la * misma, e incrementando la componente adecuada de «setsganados». * Ha devuelto el número de jugadores cuyos nombres y número de * sets ganados están ahora almacenados en las tablas * «nombrejugadores» y «setsganados». private static int leerpartido(scanner fichero, String[] nombrejugadores, int[] setsganados, int numjugadores) { // Primera línea del partido: nombre de un jugador String nombrejugador0 = fichero.nextline(); // Segunda línea del partido: nombre del otro jugador String nombrejugador1 = fichero.nextline(); // Tercera línea del partido: pares de enteros representando sets while (fichero.hasnextint()) { // Para cada set, se leen los juegos de cada jugador int juegos0 = fichero.nextint(); int juegos1 = fichero.nextint(); // Se crea un objeto de la clase Set para obtener el nombre del // ganador y se incrementa el número de sets ganados por el // mismo, añadiéndolo a la tabla «nombrejugadores» si es preciso Set set = new Set(nombreJugador0, nombrejugador1, juegos0, juegos1); numjugadores = incrementarsetsganados(set.ganador(), nombrejugadores, setsganados, numjugadores); fichero.nextline(); // Se completa la lectura de la tercera línea return numjugadores; 16