Dado que vocês já aprenderam como definir e como utilizar arrays na linguagem Python, vamos brincar aqui, fazer pouco de exercícios com arrays e, enquanto isso, a gente vai exercitar vários conceitos importantes de desenvolvimento de software, porque eu vou ressaltando aqui. Então, vamos supor primeiro que a gente quer fazer, resolver o seguinte problema: você tem uma lista de temperaturas médias que fez num determinado mês e, você quer, por exemplo, pegar a temperatura mínima ou a temperatura máxima. Então, vamos supor que na verdade você quer dada uma lista de temperaturas, de 30 ou 31 temperaturas, imprimir qual foi o dia que fez a temperatura mais fria, qual foi a temperatura, e também qual a temperatura mais quente. Esse é o problema que a gente quer resolver. Como a gente poderia fazer isso? A primeira coisa, eu diria que é quebrar o problema problemas menores. Então, se a gente quer saber temperatura mínima e temperatura máxima, como que a gente poderia quebrar esse problemas menores? Vamos abrir aqui o IDLE e criar novo arquivo aqui. [SEM ÁUDIO] Então, como poderia ser a nossa função que faz isso? Vamos chamar ela de MinMax, que ela vai imprimir a temperatura mínima e a temperatura máxima, ela vai receber como parâmetro uma lista de temperaturas, que vai ser esse array. E daí, ele poderia imprimir: "A menor temperatura do mês foi:", daí, ele vai imprimir a a temperatura mínima das temperaturas e daí, eu quero que ele imprima ainda o C de graus Celsius, para deixar claro que a temperatura é Celsius, está? Então, assim a gente imprime a temperatura mínima e agora, eu vou imprimir "A maior temperatura do mês foi:" e aqui a máxima. Então, pronto, resolvi. Já está pronto, não é? Não, não está nada pronto porque eu estou usando essas funções mínima e máxima que, eu ainda não implementei, mas eu já quebrei o meu problema maior dois problemas menores. Então, agora o problema está mais palpável, eu consigo resolver ele por partes. Então, vamos implementar primeiro essa função mínima. Então, ela vai receber como parâmetro aqui, vetor de temperaturas e a gente tem que pensar, então, num algoritmo agora. Vai ser algoritmo que vai olhar para todas as temperaturas que está dentro desse temps e vai descobrir qual que é a menor. Como que a gente poderia fazer isso? Acho que a gente precisa primeiro, uma variável para guardar a temperatura menor que a gente vai encontrar. Então, a gente pode ir percorrendo todos os elementos desse array, desse vetor aqui, por e a cada momento a gente vê se a temperatura que a gente está considerando no momento, é menor que o mínimo até ao momento. Então, vamos pegar uma variável para guardar esse valor mínimo de temperatura, vou chamar de min. Não sei exatamente como eu inicializo ela, vou começar com zero, temperatura zero. E depois, eu vou ter uma outra variável i, que eu também vou começar com zero, que vai percorrer todos os elementos desse meu vetor temps e daí, como que eu poderia fazer. Faço, enquanto o i é menor que o comprimento desse meu array, eu faço o quê? Eu vou verificar se a temperatura, temps, de i se ela é menor do que o meu mínimo, do que o min. Se ela for menor, significa que o min já não está guardando o mínimo. Então, eu preciso de atualizar o valor de min. Então, se temps de i é maior que min eu vou fazer min recebe temps de i, porque agora eu estou atualizando o valor, porque esse temps de i estava menor que min, então, o novo mínimo vai ser o temps de i. E agora, eu posso ir para fazer o i recebe o i mais para ir para o próximo índice do meu array e, eu vou indo até ao final do array. E daí, quando eu chego aqui no final do array, eu espero que na variável min eu já tenha aqui o mínimo, a temperatura mínima disso. Vamos ver se compila, pode ser que eu cometi algum erro aqui. Primeiro, eu tenho que salvar, não é, eu vou salvar num arquivo chamado MinMax.py então, vou gravar aqui neste diretório do nosso curso e salvar, e executei, está. Erro de compilação não deu, que ele compilou, vamos testar primeiro aqui o mínimo. O minMax não dá para rodar ainda porque o máximo eu não implementei. Fazer testezinho simples do mínimo, pedir mínima de 0, 1, 2, 3. Voltou zero, então, talvez esteja certo, mas a gente só testou para caso, não é uma boa ideia. Então, uma outra boa prática de programação que eu quero falar para vocês, são os testes automatizados. A gente já comentou sobre isso antes e a ideia é de, para todo o código que a gente escrever a gente ter também teste que vai testar aquele código para ver se ele está se comportando de forma certa nos vários casos diferentes. Então, vamos escrever uma função aqui chamado testa_mínima, que vai testar essa função mínima para ver se essa função mínima está correta, está? Então, eu vou dar uma mensagem falando que a gente está iniciando os testes, e daí, a gente coloca alguns testes e daí, eu dou outra mensagem, falando que a gente está finalizando os testes. Finalizando, pronto, e agora, vamos colocar aqui no meio alguns testes. Vamos começar com uma, caso mais simples que eu consigo imaginar seria vetor de uma única posição e contendo o número zero. E daí, a gente pode falar algo do tipo: if mínima de temp é diferente de zero, porque deveria ser zero, certo? Mas se for diferente de zero, quer dizer que tem erro, daí eu vou falar, eu vou imprimir aqui: "Valor errado para o array". E daí, eu vou falar aqui o temp. Então, eu vou imprimir, se o mínima não devolver zero, nesse caso, ele vai me dar uma mensagem de erro, vai falar que tem valor errado para esse determinado array. Então, esse aqui é primeiro teste. Vamos ver que outro caso a gente pode pensar, outro caso ainda simples mas pouquinho mais sofisticado. Por exemplo, array com várias temperaturas, todas zero. também deveria dar o mesmo erro, o mesmo resultado, na verdade, devia dar zero. Se não der zero é porque tem alguma coisa errada. Vejamos, outro exemplo, zero, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Nesse caso também teria que dar zero, não é? Agora, exemplo, vai, tem que que haver exemplo mais realista. Na verdade, eu visitei uma página aqui, deixa ver se eu acho. Eu visitei uma página antes que, tinha todas as temperaturas que fizeram na cidade de São Paulo Janeiro de 2016 e eu já montei esse vetor aqui, temps_Janeiro_2016, vamos usar isso aqui. Janeiro tem 31 dias, então, isso aqui tem 31 e são as temperaturas reais que fizeram Janeiro de 2016. Então, que é que vai valer isso e daí, a gente dá a mensagem. Eu já vi aqui, olhando para o vetor, eu vi que a temperatura mínima Janeiro de 2016 foi 22, é friozinho para mês de Janeiro, não é? É o 22, deixa aferir, é isso mesmo, 22. E vai, vamos, antes desse aqui quero colocar, não, pode ser depois, O último exemplo aqui, a gente não colocou nenhuma temperatura negativa, vamos ver com temperaturas negativas, então se a temperatura foi -15, depois -12, depois zero, depois 20, 30, foi mês que variou muito a temperatura, vamos ver se ele funciona para esse caso também. Nesse caso a temperatura mínima foi -15, então, vou colocar aqui, tem que dar -15. Por enquanto está bom de testes, para uma primeira verificação, deixa eu salvar, agora a gente executa aqui. Executou. E agora vou executar aqui o testa mínima. Vamos ver o que ele diz, testa_mínima. Deu errado. Só caso deu errado, ele falou, iniciando os testes, todos esses outros aqui ele não, não deu errado, só deu errado para esse aqui, aquele mês correto que tinha de dar 22 e não deu 22. O que será que deu errado? Vamos ver. A primeira coisa que eu quero fazer, eu não gostei do meu código e quero melhorar pouco a qualidade do código, mas sem mudar o que ele faz. Esse é outro conceito importante de computação que eu quero falar para vocês que é a refatoração. Refatoração é uma modificação que você faz no código sem mudar a funcionalidade, mas melhorando o código algum aspeto, por exemplo, tornando ele mais claro ou eliminando duplicação. Particular esse nosso código aqui, estou achando que está muito feio, que tem muita duplicação, a mesma coisa está repetido uma, duas, três, quatro, cinco vezes quase igual. Então, código duplicado é uma coisa péssima. Vamos tentar eliminar isso. Vou deixar até anotado aqui: eliminar código duplicado. É algo que a gente deve sempre tentar fazer, eliminar o código duplicado por meio de refatoração. Como a gente poderia fazer isso? Eu vou usar uma técnica que se chama extrair método. Está vendo que tem essas três linhas que repetem sempre, quase iguais, eu vou extrair essas três linhas e colocar numa função separada. Eu vou criar uma função separada e vou chamar de teste pontual. E esse teste pontual vai ter essas três linhas aqui que aparecem repetidas todas essas vezes. Só que os valores, note, o que está duplicado? Tem coisas que estão duplicadas, tipo o temp igual e abre colchete é sempre duplicado todas, o print é sempre igual todas. A única coisa que está variando é o conteúdo do meu vetor inicial e também está variando o que vem depois do diferente, que é diferente de 22, diferente de -15, então essas duas coisas que estão variando eu vou passar como parâmetro, todo o resto, que é fixo, eu vou deixar fixo. Na verdade, o que está variando, vejamos, aqui tem o teste pontual. A primeira coisa que está variando é esse array de temperaturas, então vou passar como parâmetro aqui, e a segunda coisa variando é o valor esperado, o valor esperado aqui da função i. E agora vamos acertar esse código. Essa linha não precisa porque tenho o que vem como parâmetro, e aqui a mínima de temp, tudo bem, e o valor errado para array. E agora eu vou poder colocar uma outra informação que eu estava sentindo falta, porque a mensagem de erro falava: o valor errado para array, mas não falava qual era o valor certo. Nem o valor certo e nem o valor que a função mínima devolveu, então eu vou colocar essas coisas, qual era o valor que a função devolveu e qual era o valor certo. Vou falar aqui, print: o valor esperado era o que está na variável do valor esperado. E daí o valor calculado pela min foi [INAUDÍVEL] esse mínima de temp, vez de chamar esse mínima de temp, vamos guardar esse mínima de temp numa variável? Então vai falar aqui, o valor calculado eu vou guardar aqui, nessa variável valor calculado, aqui, a mínima de temp, e aqui a gente coloca o valor calculado e aqui também valor calculado. Pronto, já acho que está agora funcionando esse teste pontual, só que agora a gente vai ter que reorganizar esse código aqui para usar aquele teste pontual. Então, o jeito é muito simples, eu vou vez de definir e colocar numa variável, eu já vou passar como parâmetro. E já passa o valor esperado. O valor esperado é zero, pronto, agora posso apagar essas duas linhas aqui. Vou repetir a mesma coisa aqui, colocando essas várias chamadas aqui para o teste pontual. Isso aqui vai ser assim. Eu errei, copiar de novo. Copiar o teste pontual. Copiar aqui, pronto. O valor esperado nesse caso também é zero. [SEM_ÁUDIO] Teste pontual, o valor esperado nesse caso também é zero. Apago essas duas. Esse é aquele teste mais comprido, o valor esperado nesse caso é 22, botar o 22 no final, passar como parâmetro aqui. Vírgula 22. É isso. Finalmente, o último exemplo, o último caso de teste tem que dar -15. -15. Você vê que o código aqui ficou bem mais simples, bem mais enxuto. Vamos ver. Compilar novamente, ver se está tudo certo na compilação. Compilou. E agora eu vou rodar aqui novamente o testa_mínima, vamos ver o que acontece. Deu certo, deu errado só para aquele caso. Vamos ver o caso. Deu errado para caso diferente, acho que eu fiz alguma coisa errada, vamos verificar. Aqui não é 15, aqui é -15, é o valor esperado. E este aqui, o teste pontual, aqui também está certo. O valor esperado é 22, certo. E aqui, tinha erro aqui no meu teste pontual, que eu agora percebi. Por isso que não tinha pego aquele caso. Se o valor calculado é diferente do valor esperado, aí sim, eu digo que deu errado. Então, agora deve dar tudo como estava dando antes, testa_mínima. Pronto, isso, deu exatamente o que tinha dado anteriormente, aqui nessa nossa execução deu a mesma coisa, só que agora, teve essa linha extra que a gente colocou. O valor esperado era 22 e o valor calculado é zero. Então, esse meu conjunto de testes automatizados encontrou caso que isso aqui não funciona, particular para este caso aqui, essa função está devolvendo zero, e não o 22. E por que será que está devolvendo zero? O zero nem aparece aqui nesse meu array. Olhando pouco o código a gente percebe. Note que lembra que eu inicializei o mínimo com zero? Não sabia com que inicializar e iniciei lá com zero. E deu errado, porque zero é uma temperatura que não teve, não congelou a água aqui São Paulo janeiro. Então, não está bom começar com zero, a gente precisa inicializar com outra coisa. Nesse caso a gente poderia inicializar ou com valor muito grande, ou com jeito que eu gosto mais, por exemplo, inicializar com a temperatura do primeiro dia, primeiro de janeiro. Para isso basta a gente colocar aqui a temperatura de temps de zero. E daí o i pode já começar do porque o min já vai inicialmente ter o temps de zero. Corrigimos esse erro, vamos agora rodar de novo os testes para ver se a gente vai, se dá certo ou não. Vamos ver, testa_mínima. Parece que deu certo. Não deu nenhuma mensagem de erro, pelo menos para esses dois, três, quatro, cinco casos diferentes aqui a nossa função está funcionando. Pronto, já testamos a mínima, agora só falta implementar a máxima. Note que achar o valor máximo num vetor é muito similar a achar o valor mínimo, só vai ter que trocar Uma ou duas operações. Eu vou fazer isso copiando aqui o código do mínimo e daí a gente vai mudando aos poucos para o máximo. Máxima. Então, primeiro, não faz sentido mais ter uma variável chamada linha, vamos chamar a variável de max. Max aqui, max aqui. Max aqui. E a gente devolve o valor de max no final. Outra coisa que é crucial... então o que é que está fazendo, o que que faz a nossa função? Começa com max valendo a primeira temperatura do primeiro dia do mês. Daí a gente faz aqui laço while começando com o i da posição que é a segunda posição do vetor, indo até o final ali do vetor. E daí, se a temperatura for maior que max, vou mudar aqui. Se a temperatura for maior que max, então essa temperatura vira a nova máxima. Então a gente vai percorrendo todas. Toda vez que aparece uma temperatura mais alta, a gente coloca nessa variável max, então quando a gente chega ao final ao vetor, a variável max vai ter a temperatura máxima do mês. Então me parece que está certo. A rigor, o que a gente devia fazer agora é implementar essa testa máxima, mas eu vou deixar isso pra vocês fazerem, assim vai ficar mais rápido aqui. Vamos direto executar e ver o que acontece. E eu vou executar, vou copiar aqui, vou fazer pra esse caso real, de janeiro de 2016. Assim, a gente já testa com caso real. Vamos ver se dá certo aqui. Eu vou copiar esse vetorzão. Os 31 valores. Eu vou mandar executar. E daí... Nossa função chama MinMax. Eu já vou chamar aqui MinMax. Passando como parâmetro aquele vetor bem grandão. [INAUDÍVEL]. A menor temperatura do mês foi 22 Celsius, a maior temperatura do mês foi 33 graus Celsius. Então, está certo. Então, só recapitulando o que que nós vimos na aula de hoje, Que, computação, uma prática boa é a gente quebrar problema grande problemas menores. E a implementação de funções é jeito de fazer isso, porque cada função resolve uma parte do problema. Testes automatizados é uma prática fundamental. Se você não tem testes automatizados no seu código, você não tem garantia nenhuma de que aquilo está funcionando. Então, os testes automatizados não são uma garantia de 100%, mas é uma boa segurança que você tem. Quanto melhor a qualidade dos seus testes, melhor vai ser a qualidade do seu software. Refatoração. Toda vez que a gente encontra software, código mal escrito, pouco claro ou com duplicação, a gente deve refatorar pra melhorar a qualidade desse código, particular, código duplicado é algo que a gente deve evitar ao máximo. Particular, eu vou deixar de lição de casa, você note que aqui eu ainda tenho uma certa duplicação. Está vendo que eu estou chamando teste pontual várias vezes. Têm várias linhas escrito teste pontual. Pense uma forma de eliminar isso. Então, vez de ter muitas chamadas de teste pontual, a gente poderia, por exemplo, ter while, que vai percorrendo alguma estrutura de dados, por exemplo, vai percorrendo uma lista ou array, uma matriz e vai pegando dados dessa lista ou dessa matriz e vai chamando teste pontual, por meio de while. Daí você elimina completamente a duplicação. Seu código vai ficar muito elegante. Então, por hoje, é só [MÚSICA] [MÚSICA]