GestaoDesportiva.java
package GestaoDesportiva;

import java.util.Scanner;
import java.util.Formatter;
import java.io.File;

/** * @author APROG 2010/2011 - 1ND */ public class GestaoDesportiva {

// constantes static final int MAX_PROVAS = 10;
static final int MAX_ATLETAS = 100;
static final String SEPARADOR = ";";
static final String EXTENSAO = ".txt";
static final String FICH_ATLETAS = "Atletas" + EXTENSAO;

// objectos de apoio à leitura e escrita static Scanner in = new Scanner(System.in).useDelimiter("\n");
static Formatter out = new Formatter(System.out);

// devolve um texto repetido n vezes private static String repeteTexto(String txt, int n) {
String s = "";
for (int i = 0; i < n; i++) {
s += txt;
}
return s;
}

// le um valor inteiro dentro de um interválo private static int leValor(String msg, int min, int max) {
int v;

do {
out.format(msg + ":");
v = in.nextInt();
} while (v < min || v > max);

return v;
}

// transfere a informação não estruturada numa string para a estrutura atletas private static void visualizaInformacao(int n, String[] atletas, int[][] provas) {
for (int i = 0; i < n; i++) {
out.format("%s%n", atletas[i]);
}

}

// transfere a informação não estruturada numa string para a estrutura atletas private static int guardaInformacao(int n, String linha, String[] atletas) {
String[] temp = linha.split(SEPARADOR);
int idade, tam;
char categoria;

idade = Integer.parseInt(temp[2]);
if (idade <= 20) {
categoria = 'A';
} else if (idade < 30) {
categoria = 'B';
} else {
categoria = 'C';
}

tam = temp[0].trim().length() > 20 ? 20 : temp[0].trim().length();
atletas[n] = temp[1].trim().toUpperCase() + // sexo-1 temp[3].trim() + // nª camisola-3 categoria + // categoria-1 temp[0].substring(0, tam); // nome-20 return n + 1;
}

// carrega informação para memória a partir de ficheiro de texto ! private static int leInfoFicheiro(String nome_fich, String[] atletas, int [][]provas) throws Exception {
Scanner s = new Scanner(new File(nome_fich));
int n = 0;

while (s.hasNext() && n < MAX_ATLETAS) {
n = guardaInformacao(n, s.nextLine(), atletas);
}
s.close();

// limpar provas for(int i=0;i<n;i++){
for(int j=0;j<MAX_PROVAS;j++){
provas[i][j]=0;
}
}

return n;
}

// mostra a informação de um atleta private static void mostraInfoAtleta(int n, String[] atletas) {
int pos;

// Ler o nº da camisola int nc = leValor("Número da camisola", 100, 999);

// Pesquisa pelo atleta if ((pos = pesquisaAtletaPorNumCamisola(n, nc, atletas)) > -1) {
out.format("%n");
out.format("Nome :%s%n", atletas[pos].substring(5));
out.format("Sexo :%c%n", atletas[pos].charAt(0));
out.format("Categoria :%c%n", atletas[pos].charAt(4));
out.format("Nº de Camisola:%s%n", atletas[pos].substring(1, 4));
} else {
out.format("O atleta %d não foi encontrado!", nc);
}
}

// pesquisa um atleta por número de camisola private static int pesquisaAtletaPorNumCamisola(int n, int o_nc, String[] atletas) {
int ret = -1;

for (int i = 0; i < n; i++) {
if (atletas[i].substring(1, 4).equals(String.valueOf(o_nc))) {
ret = i;
break;
}
}
return ret;
}

// Inserir, a partir de um ficheiro de texto, o tempo dos atletas numa determinada prova public static boolean inserirTempoProva(int n, String nome_fich, int np, String[] atletas, int[][] provas) throws Exception {
int l_nc, l_tempo, pos;

if (np > 9) {
return false;
}

Scanner s = new Scanner(new File(nome_fich));

while (s.hasNext()) {
//separar a informação String[] temp = s.nextLine().split(SEPARADOR); l_nc = Integer.parseInt(temp[0]); l_tempo = Integer.parseInt(temp[1]); // Pesquisa pelo atleta if ((pos = pesquisaAtletaPorNumCamisola(n, l_nc, atletas)) > -1) {
// inserir o tempo do atleta na prova provas[pos][np] = l_tempo; } } s.close(); return true;
}


private static int menu() {
String msg;

msg = repeteTexto(" ", 35) + "Menu%n";
msg += repeteTexto("-", 80) + "%n";
msg += " 1) Ler de um ficheiro de texto a informação dos atletas para memória.%n";
msg += " 2) Mostrar no ecrã a informação de uma determinado atleta.%n";
msg += " 3) Inserir, a partir de um ficheiro de texto, o tempo dos atletas numa determinada prova.%n";
msg += " 4) Listar no ecrã toda a informação existente em memória central.%n";
msg += " 5) Remover da estrutura de dados toda a informação relativa a um atleta.%n";
msg += " Ordenar toda a informação que reside em memória organizada por:%n";
msg += " 61) número da camisola (ordem numérica)%n";
msg += " 62) ordem decrescente da média das provas.%n";
msg += " 7) Mostrar, para um determinado atleta, qual a melhor e a pior prova em que participaram.%n";
msg += " 8) Actualizar, via teclado, o tempo de uma prova de um determinado atleta dado o seu número de camisola.%n";
msg += " 9) Guardar toda a informação existente em memória num ficheiro de texto.%n";
msg += "10) Recuperar para a memória a informação guardada no ficheiro anterior.%n";
msg += "11) Inserir, via teclado, a informação de um atleta.%n";
msg += "12) Listar para o ecrã o tempo médio que um atleta, dado o seu número de camisola, realizou em todas as provas que participou.%n";
msg += "13) Listar para ficheiro de texto os três atletas que obtiveram a melhor média na classificação de todas as provas.%n";
msg += "%n";
msg += " 0) Terminar%n";
msg += "Opção?:";

out.format(msg);

return in.nextInt();
}

public static void main(String[] args) throws Exception {

// delcaração das estruturas de dados String[] atletas = new String[MAX_ATLETAS];
int[][] provas = new int[MAX_ATLETAS][MAX_PROVAS];

int opcao, pos, nc, np;

// variável para representar o número de atletas actual int n_atletas = 0;

// menu de selecção do {
opcao = menu();
switch (opcao) {
case 1:
n_atletas = leInfoFicheiro(FICH_ATLETAS, atletas, provas);
break;
case 2:
mostraInfoAtleta(n_atletas, atletas);
break;
case 3:
np = leValor("Número da prova", 1, MAX_PROVAS);
String n_fich = String.valueOf(np) + EXTENSAO;
inserirTempoProva(n_atletas, n_fich, np - 1, atletas, provas);
break;
case 4:
break;
case 5:
break;
case 61:
break;
case 62:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 11:
break;
case 12:
break;
case 13:
break;
case 0:
out.format("Fim...%n");
break;
default:
out.format("Opção inválida!%n");
}
} while (opcao != 0);
}
}