BCC402
Algoritmos e Programação
Avançada
Prof. Marco Antonio M. Carvalho
Prof. Túlio Ângelo M. Tóffolo
Na aula de hoje
• UVa;
• Tipos de Erros;
• Representação de tipos;
• Formas Padrão de Entrada e Saída (I/O); • Compilação Padrão;
UVa
Universidad de Valladolid
(ESP)
• A Universidad de Valladolid, na Espanha, mantém um site (UVa Online Judge) com vários problemas do
mesmo tipo dos utilizados em competições de programação
– Organizados em diferentes coleções; – A princípio, são 27000 problemas!
• Além disso, o site também possui um juiz para correção automática (autojudge)
– Você escolhe um problema, cria um programa e envia o código-fonte;
– Rapidamente você recebe a resposta sobre seu programa.
UVa
Universidad de Valladolid
(ESP)
• É necessário um cadastro para utilizar o
autojudge
– Este cadastro é associado a um perfil:
• Número de problemas resolvidos; • Respostas erradas;
• etc.
• Desta forma, basta realizar um cadastro neste site para que o interessado comece a usufruir deste banco de dados organizado.
UVa
Universidad de Valladolid
(ESP)
• Existe também um ranking mundial, atualizado constantemente
– 109201 programadores (março/2011);
– O primeiro colocado (Josh Bao) resolveu 2809 problemas, em 11315 submissões. • Linguagens aceitas: – C; – Java; – Pascal; – C++.
• A idéia não é abandonar um estilo de programação, porém, adotar um estilo adequado ao trabalho.
UVa
Universidad de Valladolid
(ESP)
• Os problemas citados no livro-texto desta disciplina (Programming Challenges) estão neste site
– Devidamente identificados.
• A cada aula, um conjunto de problemas será disponibilizado para que vocês resolvam
– Em português;
– O aluno escolherá alguns (número estipulado) dos exercícios para resolver.
O Processo
1 2 3 4 OkAvaliação
• Só serão avaliados exercícios também aceitos pelo autojudge
– Tentativas de fraude acarretam em perda de todo e qualquer privilégio;
– Além da perda da nota.
• Exercícios durante as aulas práticas e também para realização durante a semana.
Links
• Moodle
www.decom.ufop.br/moodle
• Site da disciplina (backup)
www.decom.ufop.br/toffolo/ensino/bcc402_2011-1/
• UVa
Tipos de erros
• O autojudge exibe uma mensagem após a correção do código-fonte enviado
– Accepted (Aceito) ou algum erro;
• No caso de erro, uma mensagem mais
específica é exibida para que o código-fonte seja corrigido e submetido novamente
– No entanto, a mensagem nem sempre é específica sobre a localização do erro.
Tipos de erros
• Compile Error: Erro de compilação
– O programa não compila.
• Runtime Error: Erro de execução
– O programa deu pau em algum dos testes realizados; – Note que a bateria de testes é extensa, e embora seu
programa tenha executado normalmente para os testes que você fez, há algo de errado;
– Procure por erros de memória.
• Time Limit Exceeded: Tempo de execução excedido
– O programa demorou demais a responder;
– Não foi avaliado se a resposta está certa ou errada; – Procure por procedimentos pesados ou loops infinitos.
Tipos de erros
• Presentation Error: Saída em formato errado
– A resposta dada está em formato errado em relação ao que foi pedido;
– Uma diferença mínima, como uma quebra de linha já é suficiente;
– Note que, neste caso, não foi avaliado se a solução está certa ou errada.
• Wrong Answer: Resposta errada
– A resposta está errada;
– Novamente, a bateria de testes é extensa, e embora seu programa tenha executado normalmente para os testes que você fez, há algo de errado;
Tipos de erros
• Memory Limit Exceeded: Memória excedida
– O programa requer mais memória do que é permitido para o problema;
– Verifique se a abordagem está correta, cuidado com recursividade, programação dinâmica e backtracking.
• Output Limit Exceeded: Muitos dados na saída
– O programa produz mais que 4 MB de dados de saída; – Raro.
• Restricted Function: Função Restrita
– Utilização de chamadas de sistema ou acesso a sistema de arquivos;
Tipos de erros
• Others: Outros
– Erros incomuns;
– Raro de acontecer, mas não impossível; – Neste caso não tem dica…
Entrada e Saída
• Em todos os problemas que veremos, os dados são lidos da entrada padrão e escritos na saída padrão
– Nada de abrir arquivos ou chamadas de sistema.
• Em Java, existe uma certa dificuldade com I/O padrão
– java::io possui funções restritas;
– Há um “esqueleto” disponível para submissões em Java que facilita.
Entrada e Saída
• Por exemplo, suponha um programa que deve ler dois números da entrada e calcular o valor absoluto de sua diferença
– Ler dados até quando?
• Se não foi especificado um critério de parada, os dados são lidos até que acabem.
Entrada e Saída
• Note que os dados, para propósitos de nossos testes, são lidos a partir de um arquivo, porém, utilizando redirecionamento (<) a partir de um terminal
– Mais fácil em ambientes Linux.
Entrada e Saída
392.65 Usa o mais curto entre %e e %f
g
392.65 Ponto flutuante decimal
f
3.9265E+2 Notação científica, usando o
caractere E
E
3.9265e+2 Notação científica, usando o
caractere e
e
392 Inteiro decimal com sinal
d ou i A Caractere c Exemplo Saída Formato
Entrada e Saída
B800:0000 Endereço de ponteiro
p
7FA Hexadecimal inteiro sem sinal
(Maiúsculas)
X
7fa Hexadecimal inteiro sem sinal
x
7235 Decimal inteiro sem sinal
u
Tricolor String
s
610 Octal com sinal
o
Exemplo Saída
Entrada e Saída
“%010d” Número de caracteres a serem
escritos, completa com zeros
0inteiro
“%10d” Número de caracteres a serem
escritos (n), completa com espaços em branco
ninteiro
“.2f” Número de casas decimais (n)
.nformato
Exemplo Descrição
Representação de tipos
• Mantenha a simplicidade
– Nada de matar formiga usando tanques de guerra.
• Familiarize-se com os tipos de dados primitivos
– A partir deles quase tudo pode ser criado e resolvido.
Representação de tipos
• Note que o tamanho dos tipos não é definido pela linguagem
– Na verdade, depende da arquitetura utilizada
• 16 bits, 32 bits, 64 bits…
• Para maior precisão, existem estruturas e bibliotecas para números de alta precisão
– Por exemplo, a bignum;
– Com isso surge a aritmética de inteiros de alta
Representação de tipos
• Estar atento aos limites de cada tipo é
especialmente importante para evitar erros; • Na descrição da entrada de cada problema, é
informado o intervalo de valores que podem ser utilizados na entrada
– Por exemplo, se um inteiro da entrada está entre 0 e 3x109, o tipo int não servirá;
– Consequentemente, um programa que usa o tipo
Compilação por linha de
comando
• C
gcc fonte.c –o destino –lm –lcrypt –O2 –pipe –ansi –DONLINE_JUDGE
• C++
g++ fonte.cpp –o destino –lm –lcrypt –O2 –pipe– DONLINE_JUDGE
Considerações sobre C/C++
Considerações sobre Java
• Submissões para o autojudge devem conter apenas um arquivo;
• Todos os programas devem começar com um método estático main, na classe Main;
• Não use classes públicas, mesmo a Main
Como submeter uma solução
• Após realizar o login, no menu lateral direito,
Como submeter uma solução
1. Informe o id do problema
– Geralmente vem antes do nome do mesmo;
2. Marque corretamente a linguagem de
programação utilizada no código;
3. Faça o upload do arquivo correto; 4. Clique em submit.
1 2
Dicas
• O poder das linguagens de programação não reside apenas em construir programas
interessantes, mas também em construí-los de maneira limpa e melhor;
• Ou seja, um bom escritor não consiste apenas em um bom vocabulário, mas também em ter algo a dizer.
Dicas
• Comente primeiro
– Comece seus programas e funções pelos comentários. Se você não conseguir comentar com facilidade, certamente não sabe o que a função deve fazer.
• Documente cada variável
– Brevemente, descreva para quê serve a variável, é um mínimo de legibilidade.
• Use constantes
– Quando necessário. Inconsistência em valores repetidos de constantes causam erros difíceis de depurar.
Dicas
• Utilize subrotinas para evitar redundâncias
– Além disso, trechos repetidos podem ter uma
única ocorrência de erro. Depurar fica mais difícil.
• Depure
– Seja por mensagens inseridas no código ou através de uma ferramenta, utilize mensagens com significado, principalmente, o conteúdo de variáveis importantes.