private Piloto ConverterVoltaPiloto(Volta volta) { return(new Piloto() { CodigoPiloto = volta.CodigoPiloto, NomePiloto = volta.NomePiloto }); }
public void CalcularTempoTotalDeProva_DeveRetornarASomatoriaDeTodasAsVoltasDoPiloto() { var piloto = new Piloto(); var volta1 = new Volta(); volta1.TempoDaVolta = TimeSpan.Parse("00:1:02.852"); var volta2 = new Volta(); volta2.TempoDaVolta = TimeSpan.Parse("00:1:03.170"); var volta3 = new Volta(); volta3.TempoDaVolta = TimeSpan.Parse("00:1:02.769"); var volta4 = new Volta(); volta4.TempoDaVolta = TimeSpan.Parse("00:1:02.787"); piloto.AdicionarVolta(volta1); piloto.AdicionarVolta(volta2); piloto.AdicionarVolta(volta3); piloto.AdicionarVolta(volta4); var totalTempo = piloto.CalcularTempoTotalDeProva(); TimeSpan expected = TimeSpan.Parse("00:04:11.5780000"); Assert.AreEqual(expected, totalTempo); }
public void CalcularVelocidadeMedia_DeveRetornarAVelocidadeMediaDuranteACorridaDoPiloto() { var piloto = new Piloto(); var volta1 = new Volta(); volta1.VelocidadeMediaDaVolta = 45.31; var volta2 = new Volta(); volta2.VelocidadeMediaDaVolta = 43.1; var volta3 = new Volta(); volta3.VelocidadeMediaDaVolta = 40; var volta4 = new Volta(); volta4.VelocidadeMediaDaVolta = 44.89; piloto.AdicionarVolta(volta1); piloto.AdicionarVolta(volta2); piloto.AdicionarVolta(volta3); piloto.AdicionarVolta(volta4); double expected = 43.325; double current = piloto.CalcularVelocidadeMedia(); Assert.AreEqual(expected, current, 0.0001); }
/// <summary> /// Método que realiza a leitura de um log de corrida, para assim escrever o resultado. /// </summary> public List <Volta> ResultadoCorrida(out Volta melhor) { List <Volta> resultado = new List <Volta>(); melhor = null; // Separa as linhas pela quebra de linha. string[] logs = _corridaRep.RetornaLogCorrida().Split("\n"); // Adiciona as voltas na lista de resultado. O(n) foreach (string log in logs.Skip(1)) { Volta volta = ConverteVolta(log); // Verifica se já existe alguma volta do piloto na lista. int indexExistente = resultado.FindIndex(_ => _.NumeroPiloto == volta.NumeroPiloto); if (indexExistente != -1) { // Se existir, altera a volta que ele está e soma o tempo, velocidade e melhor volta. Volta existente = resultado[indexExistente]; if (volta.TempoVolta <= existente.TempoVolta) { existente.MelhorVolta = volta.NumVolta; } existente.NumVolta = volta.NumVolta; existente.HoraVolta = volta.HoraVolta; existente.VelocidadeMedia += volta.VelocidadeMedia; existente.TempoTotal += volta.TempoVolta; existente.TempoVolta = volta.TempoVolta; } else { // Se não existir, adiciona o piloto na lista. resultado.Add(volta); } if (melhor == null) { melhor = volta; } // Compara para descobrir a melhor volta da corrida. melhor = volta.TempoVolta <= melhor?.TempoVolta ? volta : melhor; } // Ordena as voltas pelo número da volta e pelo Horário que foi registrado a volta. // Garante a ordem de chegada, caso algum piloto por exemplo, esteja na segunda volta e passe perto do tempo de quem esteja fazendo a terceira. OrdenaVoltas(resultado); return(resultado); }
private Volta ObterVolta(string[] campos) { Volta volta = new Volta(); volta.Hora = Convert.ToDateTime(campos[(int)LayoutArquivo.Hora]); volta.NumeroVolta = Convert.ToInt32(campos[(int)LayoutArquivo.Numero]); volta.TempoVolta = TratarTempoVolta(campos[(int)LayoutArquivo.TempoVolta]); volta.Velocidade = Convert.ToDecimal(campos[(int)LayoutArquivo.Velocidade]); volta.CodigoPiloto = Convert.ToInt32(campos[(int)LayoutArquivo.CodigoPiloto]); volta.NomePiloto = campos[(int)LayoutArquivo.NomePiloto]; return(volta); }
public CorridaKart LerArquivoDeLog() { try { var arquivo = new StreamReader(Nome); string linha = null; var corrida = new CorridaKart(); while ((linha = arquivo.ReadLine()) != null) { MatchCollection matches = Regex.Matches(linha, PadraoRegex); foreach (Match match in matches) { Piloto piloto = new Piloto(); Volta volta = new Volta(); //Adicionando informações do piloto. piloto.Id = Convert.ToInt32(match.Groups[2].Value); piloto.Nome = match.Groups[3].Value; //Adicionando informações da volta. volta.HoraVolta = TimeSpan.Parse(match.Groups[1].Value); volta.NumeroDaVolta = Convert.ToInt32(match.Groups[4].Value); volta.TempoDaVolta = TimeSpan.Parse($"00:{match.Groups[5].Value}"); volta.VelocidadeMediaDaVolta = Convert.ToDouble(match.Groups[6].Value); var pilotoExiste = corrida.VerificarSeOPilotoExiste(piloto); if (pilotoExiste) { var pilotoEncontrado = corrida.GetPiloto(piloto); pilotoEncontrado.AdicionarVolta(volta); continue; } piloto.AdicionarVolta(volta); corrida.AdicionarPilotoNaCorrida(piloto); } } return(corrida); } catch (FileNotFoundException) { throw new FileNotFoundException("O arquivo especificado não está no diretório especificado ou não existe", Nome); } }
public static void Main(string[] args) { string textoDivisor = "--------------------------------------------------"; try { // Inicia a execução para mostrar o Resultado da corrida. Stopwatch tempo = new Stopwatch(); tempo.Start(); List <Volta> resultado = _bus.ResultadoCorrida(out Volta melhorVolta); tempo.Stop(); Console.WriteLine($"Tempo de execução para montar resultado: {tempo.Elapsed} \n\n"); TimeSpan tempoPrimeiraVolta = resultado.FirstOrDefault().HoraVolta; Console.WriteLine("Resultado da corrida: "); Console.WriteLine(textoDivisor); // Exibe o resultado da corrida no console. for (int i = 1; i <= resultado.Count; i++) { Volta volta = resultado[i - 1]; // Exibe o resultado no console. Console.WriteLine(volta.ToString(i, tempoPrimeiraVolta)); Console.WriteLine(textoDivisor); } Console.WriteLine($"\nMelhor volta da corrida: "); Console.WriteLine(melhorVolta?.ToString()); Console.WriteLine("Precione enter para fechar."); Console.ReadLine(); } catch (Exception e) { Console.WriteLine("Erro ao processar o resultado da corrida."); Console.WriteLine($"Log: {e.Message}"); } }
public void GetTotalVoltasCompletadas_DeveRetornarAsVoltasCompletadasDoPiloto() { var piloto = new Piloto(); var volta1 = new Volta(); volta1.TempoDaVolta = TimeSpan.Parse("00:1:02.852"); var volta2 = new Volta(); volta2.TempoDaVolta = TimeSpan.Parse("00:1:03.170"); piloto.AdicionarVolta(volta1); piloto.AdicionarVolta(volta2); int expected = 2; int current = piloto.GetTotalVoltasCompletadas(); Assert.AreEqual(expected, current); }
/// <summary> /// Método que converte uma string em uma instância de Volta. /// </summary> /// <param name="textoVolta">String com os dados que serão convertidos.</param> /// <returns>Dados Convertidos.</returns> private static Volta ConverteVolta(string textoVolta) { Volta voltaConvertida = null; // Extrai os dados via regex. MatchCollection dadosVolta = Regex.Matches(textoVolta, REGEX_BUSCA_VOLTA, RegexOptions.Compiled); // Verifica se encontrou todos os campos. if (dadosVolta.Count == 5) { // Realiza a conversão dos dados de hora/tempo/velocidade/piloto. TimeSpan.TryParse(dadosVolta[0].Value, out TimeSpan horaVolta); int.TryParse(dadosVolta[1].Value.Substring(0, 3), out int numPiloto); // Retira o número do piloto e pega somente o nome. string nomePiloto = dadosVolta[1].Value.Substring(6, dadosVolta[1].Value.Length - 6).Trim(); int.TryParse(dadosVolta[2].Value, out int numVolta); string tempoVoltaS = dadosVolta[3].Value.Trim(); // Adidiona 00:0 na frente para ser possível converte em TimeSpan. TimeSpan.TryParse(tempoVoltaS.Length == 8 ? $"00:0{tempoVoltaS}" : tempoVoltaS, out TimeSpan tempoVolta); float.TryParse(dadosVolta[4]?.Value, out float velocidadeVolta); voltaConvertida = new Volta() { HoraVolta = horaVolta, NumeroPiloto = numPiloto, NomePiloto = nomePiloto, NumVolta = numVolta, TempoVolta = tempoVolta, TempoTotal = tempoVolta, VelocidadeMedia = velocidadeVolta, MelhorVolta = numVolta }; } return(voltaConvertida); }
private static void FormatarLinha(Resultado resultado, Volta melhorVolta, int nameLength, char s) { Console.ResetColor(); var mv = resultado.CodPiloto == melhorVolta.CodigoPiloto ? $"* {melhorVolta.NVolta}" : ""; // Simbolo melhor volta if (resultado.Posicao == 1) // Primeiro Colocado { Console.ForegroundColor = ConsoleColor.Green; } else if (resultado.Posicao == 2) // Segundo Colocado { Console.ForegroundColor = ConsoleColor.Yellow; } else if (resultado.Posicao == 3) // Terceiro Colocado { Console.ForegroundColor = ConsoleColor.Blue; } Console.Write($"{resultado.Posicao.ToString().PadLeft(2, s)}º\t" + $"{resultado.CodPiloto.PadLeft(3, '0')} - {resultado.Piloto.PadRight(nameLength, s)}\t" + $"{resultado.TempoTotal:hh\\:mm\\:ss\\.fff}\t{resultado.Voltas.ToString().PadRight(6, s)}\t" + $"{resultado.MelhorVolta}ª".PadRight(12, s) + $"\t~{resultado.VelocidadeMedia:N2} Km/h".PadRight(10, s) + "\t" + (resultado.Tempo >= TimeSpan.Zero ? $"+{resultado.Tempo:hh\\:mm\\:ss\\.fff}" : "desclassificado") + $"\t{resultado.MelhorTempo:hh\\:mm\\:ss\\.fff}\t"); if (mv.Any()) { // Simbolo melhor volta Console.ForegroundColor = ConsoleColor.Black; Console.BackgroundColor = ConsoleColor.Yellow; } Console.WriteLine(mv); Console.ResetColor(); }
public void Os_dados_da_volta_estao_preenchidos_corretos() { var volta = new Volta(0, new TimeSpan(0, 0, 1, 3, 4), DateTime.Now, 22.11, 22); }