private Piloto ConverterVoltaPiloto(Volta volta)
 {
     return(new Piloto()
     {
         CodigoPiloto = volta.CodigoPiloto, NomePiloto = volta.NomePiloto
     });
 }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        /// <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);
        }
Beispiel #6
0
        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);
            }
        }
Beispiel #7
0
        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}");
            }
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        /// <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);
        }
Beispiel #10
0
        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);
 }