Arquivos da categoria: Programação

Sequência de Fibonacci em C – Loop e Recursiva

programacao

Na matemática, a Sucessão de Fibonacci (também Sequência de Fibonacci), é uma sequência de números inteiros, começando normalmente por 0 e 1, na qual, cada termo subsequente (número de Fibonacci) corresponde a soma dos dois anteriores.

A sequência recebeu o nome do matemático italiano Leonardo de Pisa, mais conhecido por Fibonacci (contração do italiano filius Bonacci), que descreveu, no ano de 1202, o crescimento de uma população de coelhos, a partir desta. Tal sequência já era no entanto, conhecida na antiguidade.
Fonte: Wikipedia

Fórmula:
Fn = (Fn-1) + (Fn-2)

Exemplo de uma Sequência de Fibonacci com 10 números:
0, 1, 1, 2, 3, 5, 8, 13, 21 e 34.

* Em alguns exemplos o zero poderá estar omitido.

Algo como:
1 + 0 = 1
1 + 1 = 2
2 + 1 = 3
3 + 2 = 5
5 + 3 = 8
E por aí vai…

Vou demonstrar dois exemplos de algoritmos em C, um utilizará um for e outro será recursivo.

Utilizando Loop

#include<stdio.h>;

int main() {
    int qtd_seq;
    int primeiro = 0;
    int segundo = 1;
    int proximo;
    int i;

    printf("Entre com a quantidade de números da série: ");
    scanf("%d", &qtd_seq);

    printf("Os %d números da sequência de Fibonacci são:\n", qtd_seq);

    for (i = 0 ; i < qtd_seq ; i++ ) {
        if (i <= 1 )
            proximo = i;
        else {
            proximo = primeiro + segundo;
            primeiro = segundo;
            segundo = proximo;
        }
        printf("%d\n", proximo);
    }
    return 0;
}

Utilizando Recursividade

#include<stdio.h>

int fibonacci(int seq) {
     if (seq == 0) return 0;
     if (seq == 1) return 1;
     return fibonacci(seq - 1) + fibonacci(seq - 2);
}

int main() {
    int qtd_seq;
    int i;

    printf("Entre com a quantidade de números da série: ");
    scanf("%d", &qtd_seq);

    printf("Os %d números da sequência de Fibonacci são:\n", qtd_seq);

    for (i = 0 ; i < qtd_seq ; i++ )
        printf("%d\n", fibonacci(i));

    return 0;
}

Criando joins customizados no Django

django

Durante o desenvolvimento de uma aplicação no framework Django você pode precisar realizar SQL puro, límpido e incolor.

O Django permite que você faça isso, mas certifique-se de ter feito o possível e o impossível para que isto não ocorra. Eu sei que criar consultas no Django às vezes parece coisa de tentativa e erro, mas sempre utilize as funções equivalentes dele para manter compatibilidade entre as engines diferentes de banco de dados.

Você pode achar que não irá precisar mudar de banco de dados futuramente, mas no meu caso já tive que manter aplicações em MySQL que depois precisaram migrar para Oracle. Em outras tinha que funcionar tanto em MySQL e PostgreSQL. Isso quando o ambiente de desenvolvimento era diferente do ambiente de produção…

Mas enfim, se não tiver jeito Raw SQL neles, mas não vou entrar em detalhes em como fazer essas queries no Django, pois até este ponto ele está bem documentado:

Porém esses dias me deparei com um problema muito específico no qual tinha que fazer o JOIN na mão. Bom, se você chegar ao ponto de ter que criar um JOIN na mão no Django, então realmente é um problema muito específico.

Não existe uma forma de se fazer isso no Django, pelo menos não documentada. Encontrei uma solução fazendo o uso do método join do objeto Query.

O join recebe uma tupla contendo as tabelas e campos do JOIN e um parâmetro promote que especifica se é um LEFT OUTER JOIN.

Exemplo:

qs = People.objects.all()

# ... inner join contact_people on contact_people.id=contact_phone.people_id
join_tuple = (
    'contact_people', # table 1
    'contact_phone', # table 2
    'id', # field 1
    'people_id' # field 2
)

qs.query.join(join_tuple, promote=True)

print qs.query # para ver o SQL gerado, cuidado com erros de encode.

É um exemplo simples e poderia ser feito utilizando os métodos normais disponibilizados pelo QuerySet. Você deve moldar para a solução do seu problema, pois como falei ela provavelmente deve ser muito específica. Na dúvida verifique o SQL gerado.

Além disso, com certeza não é a melhor forma de fazer os JOINs no Django. Funciona, mas teje avisado…

Operador Ternário

programacao

Se você precisa trabalhar com condições simples no seu código talvez fosse interessante utilizar operadores ternários para deixar o código mais enxuto.

Como você implementa a operação ternária depende da linguagem de programação. Nos meus exemplos vou utilizar a linguagem C/C++, porém acredito que todas as linguagens com sintaxe semelhante ao do C/C++ façam este tipo de operação, como o Java, Javascript, C# e PHP. Tem também em Python, mas a sintaxe é diferente.

variavel = condicao ? valor_verdadeiro : valor_falso;

Isto é equivalente a isto:

if (condicao)
    variavel = valor_verdadeiro;
else
    variavel = valor_falso;

Alguns exemplos:

// Se op for 'x' será retonado 1, caso contrário 2 em option.
option = op == 'x' ? 1 : 2;

// Se a primeira letra de name for "a" será retonado "A" para
// capitalizar, senão retorna a primeira letra mesmo.
// No caso falso houve uma atribuição desnecessária já que foi
// atribuído name[0] ao próprio name[0].
name[0] = name[0] == 'a' ? 'A' : name[0];

// Aqui se number for 1 ele será incrementado, senão decrementado.
// Repare que não é feita atribuição em uma variável.
number == 1 ? number++ : number--;

Agora um exemplo de um programa usando o operador ternário. O programa conta a quantidade de letras “a” na frase digitada pelo usuário.

#include<stdio.h>
#include<string.h>

int main () {
    char frase[50];
    int i;
    int a = 0;
    printf("Informe uma frase: ");
    gets(frase);
    for(i = 0; i < strlen(frase); i++)
        a += frase[i] == 'a' ? 1 : 0;
    printf("A frase possui %d \"A\"s\n", a);
    return 0;
}

Simples não? Mas pra quem está começando no mundo da programação normalmente vai torcer o nariz pra este tipo de coisa.

"Porque utilizar esse "troço" se posso fazer com um IF?"

A minha única resposta é porque o código fica mais enxuto e simples. Os meus exemplos são bobos e só demonstram a utilização e não a melhor utilização dos operadores ternários. Se há alguma diferença de performance isso eu já não sei, mas se tiver deve ser tão pequena que poderia ser irrelevante.

Lembrando que essa sintaxe funciona em Java, Javascript, C#, Ruby e PHP.

Python

Em especial vou mostrar como se faz em Python.

    variavel = valor_verdadeiro if condicao else valor_falso

Exemplo:

    blog = 'blog.qualquer.com'
    score = 10 if blog == 'blog.wektabyte.com' else 5
    print score # exibe 5

Algumas linguagens não possuem um operador ternário real, como é o caso do VB que usa o IIF. O IIF é na verdade uma função e não um operador.

Converter objetos Java em JSON e vice-versa com Gson

google-gson

Quebrei um pouco a cabeça para mapear atributos de um JSON para objetos em Java, mas finalmente achei uma lib salvadora, o Gson. Tão boa que resolvi fazer esse artigo sobre ela. Espero que seja útil para todos.

Gson é uma biblioteca que converte objetos Java em JSON e vice-versa. Como bom programador você já deve ter percebido isso só de ver o título (assim espero).

Outra coisa que você deve ter percebido também é que esta biblioteca é do Google e isto normalmente quer dizer que é lib da boa.

O Gson é absurdamente simples de usar. Você deve criar uma classe em Java que represente os campos do JSON, tanto para serializar(Java para JSON) quanto para deserializar(JSON para JAVA).

Para demonstrar vamos criar uma classe User com 2 atributos e 4 métodos getters e setters dos atributos.
Continue lendo