Programando melhor: Aula 1 – Começando
Finalmente pessoal!
Hoje irá iniciar o curso de programação focado em competições existentes em todo o mundo. O curso terá como título “Programando melhor” e será composto de aulas iniciantes até programação pesada! Vamos embarcar comigo nessa empreitada!
Aula 1 – Começando
Conteúdo: introdução a competições de programação, assim como dicas iniciais e cuidados a serem tomados na criação de soluções para os problemas apresentados.
Existem por aí alguns sites que podem nos ajudar a exercitar nossos conhecimentos, pois disponibilizam juízes online para testar a eficiência do seu programa. Os principais sites para esse tipo de exercício são o da Universidad de Valladolid, o da Olimpíada Brasileira de Informática e o do livro Programming Challenges (base para o desenvolvimento desse curso). Cadastre-se neles (com excessão do site da OBI, que não precisa de cadastro) e comece a testar soluções para os mais diversos programas encontrados, inclusive para os exercícios que serão propostos aqui.
Como primeiro passo rumo a sua vitória em diversas dessas competições, você precisará primeiramente escolher em qual linguagem desenvolverá seus programas. Eu recomendo o C, pois é de fácil entendimento (sem a orientação a objeto presente no C++/Java) e é aceito em praticamente todas as competições. Pascal é uma boa recomendação apenas para quem está no ensino médio e deseja participar da OBI (pois é uma das únicas que ainda permite essa linguagem); Java é desagradável pela sua POO (programação orientada a objeto), algo bastante desagradável quando não se vai trabalhar com programas grandes os quais precisariam de reaproveitamento de algumas partes; C++ é aconselhável a programadores mais experientes, desejosos de participar do TopCoder (não aceita o C).
É preciso também tomar cuidados com algumas práticas do nosso dia-a-dia na programação que não devem ser praticadas por um competidor. Primeiramente, as entradas e saídas do seu programa devem ser exclusivamente as padrões, ou seja, não é permitida a abertura de arquivos ou funções desse estilo durante a programação. Já para programadores Java funções de internet e threads não são permitidas, além de nada poder ser público, até mesmo o Main, contudo pacotes como math, util e similares são possíveis.
Dicas de programador para programador:
- Comece seu programa e cada uma das funções criadas comentando cada passo a ser realizado, pois isso facilitará seu entendimento do problema (se você não conseguir fazer isso, então não está entendendo o que é preciso fazer no programa). Esse esforço extra irá ajudar muito no futuro…
- Faça o mesmo para cada variável, explicando qual será sua “função” no programa (não é preciso colocar nomes gigantes, como ModuloDoQuadradoDoVetorResultante, apenas comente bem (não é Elomar e Bryan? hehehehehe).
- Crie, sempre que possível, constantes para representar números bastante utilizados no programa, como PI, TAMVETOR, etc., isso irá prevenir erros futuros e deixará BEM mais legível seu código (ajudando a encontrar bugs que possam aparecer).
- Eficácia. Essa é a base para competições de progração (e para sua vida de programador). Evite ao máximo códigos redundantes, como
- if (x == ‘A’) Código
- else if (x == ‘B’) Código quase igual;
- Além do mais (nunca pensei que iria falar isso na minha vida xD ): evite GAMBIARRAS! Você pode achar o máximo quando você faz uma daquelas bem grotescas, todavia isso pode lhe causar um belo de um “Time Limit Exceeded”, ou seja, seu programa pode ficar lento e não ser executado no tempo máximo permitido (é, existe um tempo máximo!). ^^
- Por fim, é de extrema importância o conhecimento na arte de “DEBUGGAR”, ou seja, conheça o sistema de Debug do seu compilador ou faça isso manualmente (mandando imprimir o valor de certa variável em um determinado local – CUIDADO com doideras no código ao fazer isso). Esse item é muito bom caso receba alguma mensagem de erro do sistema de correção.
Um bom caminho a seguir é o de evitar tipos de dados não elementares, como POO, e até a utilização excessiva de ponteiros em C, o que pode gerar erros inesperados, sendo sempre bom recorrer aos bons e velhos Vetores. Tome também cuidados com Records/Structs/Registros, pois eles podem gerar uma grande dor de cabeça na hora de precisar alterar o seu código.
Bem, gostaria de finalizar esse post com um alerta para aqueles os quais desejam participar da OBI, pois durante a competição você não tem o acesso ao juiz dizendo se o seu programa passou nos testes ou não, isso só é disponibilizado na seção Pratique do site, portanto é necessária a sabedoria para você mesmo criar testes que poderiam dar erro em um programa, ok?
Os exercícios seguem no próximo post e eles estão todos disponibilizados no UVa Online Judge, para serem testados. Eles correspondem aos problemas do Capítulo 1 do livro Programming Challenges, de autoria de Miguel Revilla e Steven Skiena.
Posts interessantes:
- Programando melhor: Exercícios 1 (Parte I)
- Programando melhor: Exercícios 1 (Parte II)
- Curso de Programação – Confirmado!
- Cursos grátis na Internet – MIT
- Top Coder Marathon Matches
- Olimpíadas do Conhecimento
E você, o que achou dessas dicas? Está pronto para começar essa jornada e se tornar um competidor dos mais fortes? Deixe seu comentário e tire as suas dúvidas!
Helton de Melo Duarte
“Porém o SENHOR disse a Samuel: Não atentes para a sua aparência, nem para a altura da sua estatura, porque o tenho rejeitado; porque o SENHOR não vê como vê o homem. Pois o homem vê o que está diante dos olhos, porém o SENHOR olha para o coração.” (1 Samuel 16.7)
Olimpíadas do Conhecimento
Olá pessoal!
Primeiramente, gostaria de pedir desculpas pelo tempo ausente do blog, porém quero dizer que estou de volta e, agora que ficarei de férias do CEFET (até março), pretendo trazer conteúdos muito interessantes para vocês conhecerem.
Hoje venho falar de um assunto muito interessante para todos nós, na verdade venho analisar aquela reportagem do jornal do CEFET-RN que trouxe para vocês. Iremos falar da magníficas oportunidades de tornar-se um “Atleta Olímpico”, mas não aqueles vistos na TV, os que ainda possuem pouca divulgação, contudo podem ser o futuro da nação. Você pode ter se desanimado pelo fato de ter pouca divulgação isso que irei mostrar-lhes, mas quero dizer que os ganhos obtidos na vida de algum participante deste tipo de competição possui um valor inestimado, pois não trata apenas de conhecimento, e sim de uma experiência de vida!
Se ainda não é do conhecimento de vocês, existem por aí diversas olimpíadas do conhecimento, como o título do post fala, como as Olimpíadas de Matemática, Física, Química, Astronomia, além das mais voltadas para a área de TI, como a OAH (Olimpíada de Algoritmo Hostnet), a OBI (Olimpíada Brasileira de Informática), a Maratona de Programação e competições menos conhecidas, como TopCoder e ImagineCup. Posso falar por experiência própria que vale MUITO a pena você se dedicar a competições de programação (para você que é desenvolvedor) e, para quem ainda não é, participar de OBM, OBF, etc., gera um diferencial em você para trabalhar em qualquer área, pois são provas que buscam o raciocínio lógico, não somente aqueles exercícios mecânicos vistos em sala de aula, fazendo a matéria parecer mais interessante e fazendo com que muitos comecem a gostar dessas disciplinas.
Agora você deve estar falando: “Ah, mas essas competições ganham só os Nerds, eu não tenho a mínima chance”. Pois saiba que isso não é verdade. É claro que sem esforço nada é possível conquistar, entretanto sua experiência neste tipo de competição irá mudar sua vida. Sempre gostei desses desafios, mas no meu colégio de ensino fundamental os professores não ligavam muito para isso, contudo, ao chegar no CEFET-RN, vi a oportunidade chegando novamente e resolvi participar das competições. (Irei contar minha experiência de vida para estimular vocês, ^^) No meu 1º ano fiz a prova da OBMEP e não passei nem da primeira fase, fiquei um pouco abatido, mas resolvi estudar um pouco mais. Quando chegou no 2º ano eu consegui conquistar uma medalha de bronze e resolvi que faria a OBI no 3º ano, pois havia aprendido a programar. Na OBI minha colocação foi mais do que 100º, não lembro muito bem, contudo já consegui ser 4º lugar do RN em Matemática e acredito que possuo boas chances de ganhar medalha em outra OBMEP (não saiu o resultado ainda). Agora no finalzinho do ano passado, surgiu a oportunidade de participar da OAH, aí vi minha redenção em programação, pois fui campeão nacional juntamente com meus colegas Elomar França e Bryan Souza, com o apoio do professor Leonardo Minora (competição em equipe), prova essa que me rendeu um notebook de graça, como prêmio xD (vejam meu post sobre a competição). Agora digam: devo parar? Nunca! Esse ano irá acontecer novamente a OBI e estarei estudando para uma melhor colocação e, é claro, para obter mais conhecimento, pois nem sempre podemos ganhar, além disso vou participar de outras, como OBM, OBMEP, OBF, OBQ e, quem sabe, não me arrisco na OBA e até no TopCoder.

Agora chegou a parte de falar com os professores, porque acredito que já estimulei os alunos o suficiente. Como foi visto na reportagem do jornal do CEFET-RN, no Brasil existem grandes alunos, com uma capacidade enorme, no entanto o apoio a esse tipo de competição é quase nulo, principalmente da parte dos professores, os quais só inscrevem as escolas, muitas vezes, a pedidos dos próprios estudantes. Monte um projeto na sua escola e acredite em nossos jovens, pois o estímulo é fundamental para o desenvolvimento futuro do estudante brasileiro. Apenas algumas horas por semana e você estará fazendo um bem ENORME a sociedade!
Bem pessoal, espero ter plantado uma semente importante para o Brasil, pois acredito que as competições internacionais precisam estar repletas de nossos estudantes! Vejam esses links: FATEC SJC, Blog do Glebe Jr.
PS: pretendo montar um curso durante essas férias, preparatório para competições de programação, baseado no livro Programming Challenges, de Steven S. Skiena e Miguel A. Revilla. Em breve trarei mais detalhes.
Até a próxima!
Helton de Melo Duarte
“A Vida de um indivíduo só faz sentido se ajuda a tornar as vidas das demais criaturas mais nobres e mais belas.” Albert Einstein