Olhando rapidamente os EP12 entregues podemos ver vários problemas. Aqui vai uma lista de desses problemas e perguntas. Muitos deles comentamos durante as aulas desta semana.
hitoshi e coelho
No que está a seguir frequentemente usamos os apelidos
HASHTAG = "#"
ASPA = '"'
APOSTROFO = "'"
DOCSTRING1 = "'''"
DOCSTRING2 = '"""'
NEWLINE = '\n'
Problema -> solução -> implementação
O processo de solução passa por, mais ou menos:
- definição do problema
- projeto de uma solução
- implementação da solução projetada
No que diz respeito a definição e implementação, notamos que várias implementações não resolvem o problema a que se propunham resolver. Veja um exemplo típico.
Problema: Remover comentários. Em Python:
Comments in Python start with the hash character,
HASHTAG
, and extend to the end of the physical line. A comment may appear at the start of a line or following whitespace or code, but not within a string literal. A hash character within a string literal is just a hash character. https://docs.python.org/3/tutorial/introduction.html
Vários projetos de soluções e implementações removiam todos os caracteres encontrados a partir de um HASHTAG
até o final da linha. Se o programa implementado fosse usado como teste (Hmm. A cobra mordeu o rabo...) vários há erros nessa ideia
if ch == '#' or ...
[...]
resultaria em
if ch == '
[...]
Sugestão da 2ª oficinas: remover comentários, docstrings e strings:
Estado
a cada momento o programa de vocês está em um, e apenas um, dos seguintes "estados":
- dentro de um comentário
- dentro de um docstring
- dentro de um string
- fora de um comentário, docstring ou string
Cada um dos estados deve ser considerado pela solução e implementação. Algumas pessoas usam uma variável para indica o estado em que a execução do programa se encontra. Outra pessoas não tem essa variável, mas a execução do programa e conduzida para o trecho de codigo "modo comentário", "modo docstring", ...
Leitura dos arquivos
Um mesmo arquivo tem sido lido várias vezes. Considere a leitora de todos os arquivos de uma só vez, já que
- isso pode simplificar o código: quando estamos fazendo nossa primeira solução, isso pode ajudar muito;
- se você não usar
with open() as arq
, não deixe de escreverarq.close()
: hmm, isso é um pouco técnico... - a leitura de arquivos é cara em termos de consumo e tempo: hmm, isso é muito técnico...
Comparação desnecessárias
Ao invés de varrer a matriz toda, varrer apenas a matriz triangular. Em vez do trecho de código com cara de MAC0110:
for lin in range(0, n):
for col range(0, n):
if lin > col
[...]
prefira o trecho de código com mais cara de MAC0122:
for lin in range(0, n):
for col range(lin+1, n):
[...]
Legibilidade
Escreva bons comentários. Veja as notas do Prof. Paulo sobre documentação de programas Veja as notas do Guido van Rossum sobre comentários em Python Veja o blog Erik Dietrich sobre Code Comments.
Escreva um programa que tenha uma boa estrutura: funções ou métodos devem. idealmente, serem pequenos e de mais compreensão
Criação de matrizes
Vejam a mensagem o tópico Matriz maluca.
Bibliotecas
Se for usar alguma biblioteca, veja se ela é realmente nescessária. Procure focar no problema, procurar a solução e trabalhar na implementação da solução. Frequentemente o uso prematuro de ferramentas sofisticadas (mágicas?) sem necessidade e sem entendermos o que ela faz, traz mais problemas do que ajuda...
Percorrer um string
Para percorrer um string e examinar um caractere ou uma janela de caracteres, considere utilizar algo como
[...]
ch = texto[i]
janela = texto[i:i+3] # não tem problema de índice inválido
if ch == NEWLINE:
[...]
if janela == DOCSTRING1:
[...]
Problema de lógica
O trecho de código a seguir está errado
if janela == DOCSTRING1 or janela == DOCSTRING2:
# entrei em um docstring
[...]
if janela == DOCSTRING1 or janela == DOCSTRING2:
# sai do docstring
[...]
Vejam Hipóteses inválidas a seguir.
Hipóteses inválidas
Supõe que:
- o arquivo com um programa sintaticamente correto: strings e docstrings podem não fechar Vejam a mensagem o tópico eps_testes : erros.
- não há
DOCSTRING1
apósHASHTAG
- não há
DOCSTRING2
dentro de um docstring que temDOCSTRING1
como delimitador - não há
DOCSTRING1
dentro de um docstring que temDOCSTRING2
como delimitador - não há
HASHTAG
dentro de um string - não há
ASPA
dentro de um string que temAPOSTROFO
como delimitador:print("'%s'"%palavra)
- não há
APOSTROFO
dentro de um string que temASPA
como delimitador