“C++ is really a terrible language!”

Linus Torvalds

16 - Técnicas de Programação

16.1 - Desenvolvimento de algoritmos.

Algoritmos são sequências finitas de passos para resolver um determinado problema. Eles não precisam especificar detalhes da linguagem de programação que será utilizada, somente as operações, condicionais, laços e demais informações úteis para a sua implementação. Como visto anteriormente, um algoritmo pode ser avaliado segundo sua performance em tempo de execução e espaço utilizado.

As técnicas mais básicas de escrita de um algoritmo claro, objetivo e compreensível até por pessoas não técnicas, requer mais experiência, tentativa e erro e muita leitura, do que essencial um treinamento completo. Existem diversos problemas de comunicação que devem ser transpostos para a compressão e tradução do problema, seja através de entrevistas com interessados, análise de código legado ou leitura de especificações.

É importante que o programador aprenda a descartar características não essenciais do programa no momento da escrita do algoritmo, visando apenas as informações que são fundamentais para a descrição da solução.

Nos casos de ramificações de um trecho do algoritmo, onde avaliamos se uma dada condição é verdadeira e disso temos diferentes opções para seguir, devem ser avaliados todos os cenários possíveis e suas consequências, tentando, sempre que necessário, descrever o que acontece em caso de dados inválidos, vazios ou nulos.

Em computação, qualquer fluxo básico segue basicamente três etapas:

  • entrada
  • processamento
  • saída

A entrada é o conjunto de dados que o sistema recebe, podendo ter diversas origens, desde um usuário em um navegador, um sensor, um outro sistema, etc… O processamento é a sequência de operações que o recebimento do dado vai desencadear, que não necessariamente envolvem somente a manipulação dos dados. A saída é a informação resultante do processamento e pode ter diferentes padrões e formatos.

Uma vez definido o algoritmo, o programador pode escolher o software que será utilizado para programar na linguagem mais adequada. Este software é chamado de ambiente de desenvolvimento integrado (IDE - Integrated Development Environment). São exemplos: Visual Studio, Visual Studio Code, NetBeans, CodeBlocks, Eclipse, etc…

16.2 - Tipos de dados básicos e estruturados.

Em qualquer programa de computador precisamos armazenar e manipular valores. Para isso utilizar variáveis que representam espaços na memória do computador onde armazenamos sequências de bits que podem ser identificados para um determinado carácter através de uma conversão feita pelo computador. Existe uma tabela de conversão de byte (8 bits) em um carácter, que pode ser letra, dígito, sinal de pontuação, etc..). A tabela é chamada ASCII. Entretanto, alguns tipos de dados básicos estão disponíveis na maioria das linguagens de programação como:

  • int
  • long
  • char
  • string

Veja a especificação da linguagem para verificar os intervalos de cada tipo e sua utilização.

Quando utilizamos dados estruturados estamos empacotando variáveis de tipos diferentes em agrupador. Cada variável é um campo da estrutura e pode ser acessada utilizando um operador definido na linguagem. Por exemplo:

    struct {
        int dia;
        int mes;
        int ano;
        char* observacao;
    } x;
16.3 - Comandos de uma Linguagem de programação.

Vários são os comandos úteis em uma linguagem de programação específica. Entretanto, podemos separá-los em:

  • Declarações de variáveis e constantes;
  • Condicionais;
  • Métodos / Funções;
  • Laços (Loops);
  • Operadores (lógicos, aritméticos e relacionais)

Condicionais e laços fazem parte de um grupo chamado de estruturas de controle.

Ao declarar variáveis ou constantes utilizamos o padrão (na maioria das linguagens):

    int idade = 40;
    const idade_max = 150;

onde declaramos que idade é do tipo inteiro e recebeu ( usando o carácter “=”) o valor 40.

Estruturas condicionais são utilizadas para ramificar o programa em diferentes caminhos, ou seja, validamos uma condição e executamos um trecho do programa ou outro. Os comandos são os famosos if-then-else. Exemplo:

    if( idade == 40 ){
        print("Parabéns quarentão!");
    }else if (idade < 40){
        print("Você é jovem ainda!");
    }else{
        print("Lá vamos nós!");
    }

As estruturas de laço servem para repetir um trecho de código enquanto uma condição é verdade. São exemplos, o for, while e do-while. Exemplo:

    for(int i = 0; i < 10000; i++){
        print(i);
    }

Uma expressão no código representa a aplicação de um ou mais operadores em operandos, que podem ser variáveis, funções, objetos, etc… Os operadores são:

  • Aritméticos (+,-,*,/, **,%) : representam operações matemáticas;
  • Lógicos (&&, ||): permitem validar testes de comparação, onde o retorno é falso ou verdadeiro;
  • Relacionais (<, >, ==, ≠, ≤, ≥): usados para comparados tipos semelhantes.

Métodos ou funções são trechos de código que podem ser reutilizados no programa. Por exemplo, calcular o método resolução de equações de segundo grau:

    int Bhaskara(float a, float b, float c){
        x_menos = ((-1)*b-Math.root(b**2-4*a*c))/(2*a)
        x_mais = ((-1)*b+Math.root(b**2-4*a*c))/(2*a)
        return {x_menos, x_mais};
    }
16.4 - Metodologia de desenvolvimento de programas.

Em construção.

16.5 - Modularidade e abstração.

Em construção.