0

Implementações variadas à regra de Horner (Horner’s Rules)

Variadic functions são funções que aceitam um número arbitrário de argumentos. No C++, existe uma forma dinâmica de resolução deste tipo de função herdada do C através de variadic arguments. Além de outra, introduzida no C++ moderno, que é de resolução estática e baseada em templates, denominada de variadic templates.

Neste post, o objetivo é mostrar a implementação do método de Horner utilizando estas duas abordagens com variadic, uma que é resolvida em tempo de execução (variadic arguments) e outra em tempo de compilação (variadic templates).

Continuar lendo

0

Desacoplamento e composição

Ho ho ho! Feliz Natal !!!

Estava pensando em fazer algo com o tema natalino, mas que também fosse interessante para o dia-a-dia e me veio uma coisa na cabeça: Desenhar com caracteres ASCII uma imagem. Na hora pensei num algoritmo, formato e tudo o mais, e em seguida comecei a fazer algo que é muito natural para mim, desacoplar as funções.

Primeiro passo – definindo um formato

O formato que eu imaginei é
Sendo que quantidade = 0 seria quebra de linha. Vejamos o exemplo:

/* Xmas tree
     **
    *  *
   *    *
  *      *
 *        *
************
    ****
    ****
    ****
*/
string img =
    "5 2*00"
    "4 1*2 1*00"
    "3 1*4 1*00"
    "2 1*6 1*00"
    "1 1*8 1*00"
    "<*00"
    "4 4*00"
    "4 4*00"
    "4 4*00";

Continuar lendo

0

Valores Aleatórios Simplificados

A partir do C++ 11, foi introduzido o header <random> com diversos facilitadores para suporte de geração de números aleatórios. A produção destes números é feita através da combinação de duas categorias de objetos: os geradores e os distribuidores. Os geradores, são responsáveis pela geração dos números, e os distribuidores são responsáveis pela transformação dos números gerados em algum tipo de distribuição de probabilidade. Como por exemplo, uma distribuição normal (aquela da Gaussiana) ou uma distribuição de Pareto (aquela do 80-20). As opções não faltam, como você pode ver nas referências, por exemplo:  http://www.cplusplus.com/reference/random/ ou http://en.cppreference.com/w/cpp/header/random.

Continuar lendo

0

STL não tem split – e por que isso não é importante!

Orientação a objetos é um paradigma de programação muito usado nas linguagens consideradas modernas, tais como: C++, Java, C#, entre outras… Em teoria, um código orientado a objetos pode ser facilmente reusado e entendido. Porém, eu gostaria de analisar um caso neste post. Então, vamos fazer um pequeno exercício por aqui.

Aviso: Orientação a objetos (OO) é um paradigma de programação que envolve classes e objetos, polimorfismo, herança, e uma série de outros recursos. Ter ou usar objetos não significa que seja orientado a objetos em sua plenitude. Uma das premissas da OO é que o estado interno dos objetos deve ser inacessível externamente – isso se chama encapsulamento. No entanto, encapsulamento do estado sempre é bom? Fica aí algo para pensarmos, não é mesmo?

São constantes as reclamações que C++ não tem funções básicas na STL como, por exemplo, string split. Então, vamos implementar uma por aqui.

Continuar lendo

0

C, C++ e string: Uma combinação (quase) perfeita

As linguagens de programação C e C++ possuem uma relação. Praticamente vivem em harmonia e sintonia – mesmo existindo compiladores e padrões distintos. Essa combinação é que possibilita escrevermos abstrações “próximo ao metal”, estabelecendo um equilíbrio entre a compreensão (do código, que depende de ponto de vista e conhecimento) e o desempenho.

O problema é quando truques e hacks entram em ação. Um dos meus favoritos com C++ é sobrescrever no buffer de uma string. Isso é feito através do retorno do método c_str(), que disponibiliza um ponteiro para este buffer interno. No entanto, é necessário fazer um const_cast para remover o constness do ponteiro e assim sobrescreve-lo.

Os exemplos que elaborei para este post são uma tentativa de simular um problema real que me custou quase um dia inteiro de depuração, por causa de um hacking “metido a besta”. 🙂

Continuar lendo

0

Policy-based design: log writer

Policy-based design

Vamos neste artigo dar mais uma pincelada no Policy-based design. Vamos fazer como exemplo uma classe de log.
Como este é só um exemplo, não vamos considerar múltiplos parâmetros no log, mas somente uma string, assim não fugiremos do assunto.

Uma das coisas mais importantes neste tipo de design é o desacoplamento. Ele é uma excelente alternativa ao uso de interfaces por duas razões:

  1. Não gera chamadas virtuais (ou um nível de indireção em tempo de execução)
    Duck typing (https://pt.wikipedia.org/wiki/Duck_typing)
  2. Eu gosto bastante desse tipo de design, já usado aqui: http://simplycpp.com/2016/02/05/leitura-de-configuracao-em-c/

Continuar lendo

1

Leitura de configuração em C++

Uma coisa que é comum no ambiente Java e que eu gosto muito são os arquivos de properties. Não é de hoje que eu os uso para configurar aplicações que eu faço.
Eu tinha uma classe de configuração feita na época do C++98 e que hoje, usando, fiquei com vontade de reescrevê-la para ficar com um aspecto mais atual.

Eu pensei nas seguintes regras:

  1. Eu não preciso manter a mesma assinatura;
  2. Vou tentar fazer da forma mais didática possível;
  3. Vou tentar não repetir código;
  4. Eu quero me divertir fazendo isso;
  5. Vamos falar de Policy-based design.

Continuar lendo

1

Composição, parte 1 – com exemplo clássico do Unix

A idéia deste post é reproduzir a demonstração clássica feita por Brian Kernighan utilizando composição de pequenos programas através dos Unix pipelines. Ela é bem simples, porém muito significativa, se trata desta sequência:

makewords text_file | lowercase | sort | unique | mismatch dictionary_file

Onde o objetivo é identificar quais palavras do texto (text_file) são desconhecidas pelo dicionário (dictionary_file) informado:

Continuar lendo

0

Legibilidade com C++14 – get_numeric

Eu escrevi um código em C++ há um tempo atrás e quando olhei hoje vi como a legibilidade mudou desde o C++11.

Neste código eu vi algumas coisas interessantes. Ele serve bem de exemplo para alguns tipos de codificação

  1. Codificação concreta
  2. Codificação genérica
  3. Codificação concreta com C++ moderno
  4. Codificação genérica com C++ moderno

Vamos ver agora cada um deles.

Continuar lendo