Archive for the 'programação' Category

Maratona de programação ACM 2007

Participei ontem pela primeira vez da Maratona de Programação ACM (ACM International Collegiate Programming Contest), na sede do RJ. Dos 16 times competindo, 7 foram classificados para a final brasileira, que ocorrerá nos dias 9 e 10 de Novembro em Belo Horizonte:

  1. DCC-UFRJ NOP
  2. PUC Rio - Cnuth, Dijkstra & Edmonds
  3. IME - Atlântico
  4. DCC-UFRJ YEP
  5. IME - Ártico
  6. PUC Rio - NósNumSamba
  7. UERJ - Coders

Teve um outro time da UFRJ que ficou entre os primeiros, mas como cada universidade só pode levar dois times para a final, acabou entrando um time da UERJ no lugar. Meu time ficou em 9°, tendo resolvido o mesmo número de problemas que os dois últimos classificados para a final, mas perdendo no critério de desempate (tempo de submissão das soluções). Fica pra próxima!

Problemas do Google Code Jam

Ao que parece os problemas do próximo Google Code Jam serão criados pelos próprios programadores do Google. No blog oficial da empresa, publicaram um arquivo PDF com dois problemas de exemplo.

Partição de inteiros com backtracking

Dado um inteiro n, uma partição é uma maneira de escrever n como a soma de inteiros positivos. Somas que se diferem somente pela ordem dos números são consideradas as mesmas partições.

O código abaixo, em C, usa backtracking para imprimir a lista de partições de um inteiro lido do teclado.

Para n = 4, a saída é:

1 1 1 1
1 1 2
1 3
2 2
4 

Para n = 50, existem 204.226 partições (a 204.217ª é 13 37).

Download do código

#include <stdio.h>

void partition(int *n, int p, int *sum, int *k, int res[])
{
    int i, j;

    for (i=p; i<=*n; i++)
    {
        if ((*sum + i) <= *n)
        {
            *sum+= i;
            res[(*k)++] = i;
            if (*sum == *n)
            {
                for (j=0; j<*k; j++)
                {
                    printf(”%d “, res[j]);
                }
                printf(”\n”);
            }
            else
            {
                partition(n, i, sum, k, res);
            }
            *sum-= i;
            –(*k);
        }
        else
        {
            break;
        }
    }
}

int main()
{
    int sum, k, n, res[100];

    sum = k = 0;

    if (scanf(”%d”, &n) != EOF && n >= 1)
    {
        partition(&n, 1, &sum, &k, res);
    }

    return 0;
}

Por que usar um framework?

Uma pessoa me perguntou por email “por que usar um framework de desenvolvimento e em que ele vai ajudar o programador?”. Escrevi uma resposta provavelmente incompleta, mas vou postar aqui, pois acho que muita gente tem essa dúvida e, ao buscar pelo assunto no Google, não consegui encontrar uma boa explicação em português.

——————————————————-

Basicamente a função de um framework é tornar o desenvolvimento de sistemas mais simples, rápido e organizado. Para fazer isso, o framework oferece uma estrutura e uma série de padrões para o desenvolvimento, além de uma biblioteca de código e outras facilidades.

Quando eu falo em estrutura, me refiro à organização de arquivos e de código. Por exemplo, no CakePHP, todos os layouts (que são arquivos em HTML) devem estar localizados no diretório “/views/layouts” e todos os arquivos CSS devem estar no “/webroot/css”. Além disso, se eu quiser escrever uma função pra realizar uma tarefa X, existe um lugar específico no sistema pra eu colocar essa função. Isso obriga o programador a manter o sistema organizado.

Quanto aos padrões de desenvolvimento, me refiro por exemplo ao MVC, que é um design pattern para abstração de dados e provavelmente é o conceito mais importante do Cake. Não vou entrar em detalhes, mas tem uma explicação legal aqui.

Ao usar a estrutura e os padrões do framework, o programador evita que o sistema se torne bagunçado e de difícil entendimento, o que é relativamente fácil de acontecer quando se programa “na unha”.

Um bom framework oferece também uma biblioteca de código para realizar as tarefas mais comuns, como acesso a banco de dados, manipulação de sessões, AJAX, etc. Tudo pronto pra usar, bastando o programador ler as especificações e entender o funcionamento.

Acredito que em sistemas de pequeno porte o uso de um framework seja dispensável, mas em sistemas mais complexos ele é essencial. Ao usar um framework você pode focar no problema do cliente ao invés de perder tempo planejando como o sistema vai se comportar internamente.

Seguem alguns links com mais informações:

CakePHP - A “tasty” solution for PHP programming
Top 13 reasons to use a web framework and never look back
When you shouldn’t use a framework.

Atualização em 2007-06-04: Foi lançado no mês passado o livro Frameworks para Desenvolvimento em PHP, que parece ser uma boa referência para quem ainda não se decidiu sobre qual framework usar. Do site do autor: “O livro mostra aos leitores diversos frameworks de desenvolvimento que agilizam o processo de criação e manutenção de aplicativos web. Cada framework é apresentado na prática por meio do desenvolvimento de um aplicativo, de modo que o leitor pode ver sua serventia em um caso real. Neste livro, são apresentados os frameworks mais utilizados: CakePHP, Symfony, Zend Framework, CodeIgniter e Prado.”.