Posts da Tag: Lógica de Programação - Blog da TreinaWeb

Guias Python

Guia da linguagem Python

O que é Python

Criado por Guido Van Rossum em meados dos anos 90, o Python é uma linguagem de programação de alto nível, multiplataforma e open source, que ganhou destaque nos últimos anos por possuir uma ótima curva de aprendizagem, ser uma linguagem leve e ter se tornado uma das principais linguagens para o desenvolvimento de IA, Machine Learning e Big Data, áreas em grande crescimento nos últimos anos.

Python é uma linguagem de programação multiparadigma, ou seja, suporta diversos paradigmas de desenvolvimento, como, orientado a objetos, funcional, imperativo, entre outros. Desta forma, com o Python um mesmo programa pode ser feito utilizando diferentes paradigmas ou um único programa poderá ser desenvolvido utilizando mais de um paradigma.

Suas demais características, aplicações, vantagens e sintaxe podem ser vistas em nosso artigo “O que é Python”.

Desenvolvedor Python
Formação: Desenvolvedor Python
Aprenda os principais conceitos do Python (uso de variáveis, estruturas condicionais e estruturas de decisão), como trabalhar com orientação à objetos (métodos, construtores, destrutores, classes, herança, polimorfismo e duck-typing), estruturas de dados (Listas, Filas, Pilhas, Árvores Binárias, Dicionários, Conjuntos, Tabelas de Espalhamento e Mapas), banco de dados relacionais (DB API e SQLAlchemy) e como criar aplicações desktop com o Kivy.
CONHEÇA A FORMAÇÃO

Afinal, por que devo aprender Python?

O Python foi apontado pelo Stack Overflow como uma das principais linguagens de programação para o ano de 2019, principalmente por possuir uma grande demanda de trabalho, o que acarretou em diversas vagas de emprego em todo o mundo, e o manteve como uma ótima alternativa para o ano de 2020 e para este novo ano de 2021.

Dentre suas principais aplicações podemos citar Data Science, Machine Learning, Big Data, Desenvolvimento Web (Django e Flask) e muitas outras.

Tudo isso, sem dúvidas, a torna uma excelente escolha de linguagem como podemos ver em nosso artigo “Abordando os motivos para aprender Python“.

Como Instalar o Python e executar seu primeiro exemplo

Agora que já sabemos o que é o Python e suas principais características, estamos prontos para realizar a instalação e executar o nosso primeiro exemplo com a linguagem como podemos acompanhar em nosso artigo “Instalação do Python e nosso primeiro Olá Mundo

Principais IDEs para desenvolvimento

Para facilitar o desenvolvimento de programas com o Python, a melhor maneira é utilizando IDEs. São elas que proporcionam mecanismos que facilitam toda a escrita, testes e execução do nosso código.

IDE ou Integrated Development Environment (Ambiente de Desenvolvimento Integrado) é um software que auxilia no desenvolvimento de aplicações, muito utilizado por desenvolvedores, com o objetivo de facilitar diversos processos (ligados ao desenvolvimento), que combinam ferramentas comuns em uma única interface gráfica do usuário (GUI). Desta forma, como principais IDEs para desenvolvimento Python podemos citar:

Eclipse

O Eclipse é uma excelente IDE, muito utilizada no mercado. Seu uso facilita a criação de aplicações Python tanto para Desktop ou Web. O download do Eclipse poderá ser realizado em seu próprio site.

PyCharm

PyCharm conta com desenvolvimento multitecnologias, onde, além do Python, oferece suporte para CoffeeScript, TypeScript, Cython, JavaScript, SQL, HTML/CSS, linguagens de modelo, AngularJS, Node.js e muitas outras.

O download do PyCharm é feito em seu próprio site, onde é possível acompanhar todas as suas novidades, recursos, suporte e muito mais.

Jupyter Notebook

Criada em 2014, derivado do IPython, o Jupyter Notebook é baseada na estrutura servidor-cliente, que permite a manipulação de documentos. O Jupyter Notebook independe de linguagem e suporta diversos ambientes de execução, entre elas: Julia, R, Haskell, Ruby, e o próprio Python.

Para instalar o Jupyter Notebook basta acessar o seu site, onde você também encontrará toda a sua documentação, blog, novidades e muito mais.

Spyder

O Spyder é outra opção para desenvolvedores Python, muito utilizado principalmente por cientistas de dados, já que possui integração com as principais bibliotecas como NumPy, SciPy, Matplotlib e IPython.

O download do Spyder poderá ser feito em seu site, onde também é possível verificar seus plugins, componentes e muito mais.

Em nosso blog possuímos o artigo “Principais IDEs para desenvolvimento em Python” onde citamos as características de cada ferramenta, que poderá te auxiliar na escolha.

Conhecendo variáveis e constantes

O Python é uma das principais linguagens que possui tipagem dinâmica. A tipagem dinâmica é a característica que muitas linguagens de programação possuem por não exigirem que os tipos de dados sejam declarados, pois são capazes de realizar esta escolha dinamicamente. Desta forma, durante a execução do programa ou até mesmo durante a sua compilação, o tipo de uma variável poderá ser alterado.

Além disso, o Python possui como característica a tipagem forte, ou seja, a linguagem pode realizar conversões automaticamente entre todos os tipos suportados.

No Python os tipos suportados são:

  • Inteiro: Representado por toda e qualquer informação numérica que pertença ao conjunto de números inteiros relativos (números positivos, negativos ou o zero).
  • Float: Representado por números decimais, ou seja, números que possuem partes fracionadas.
  • String: É uma cadeia de caracteres que representam textos.
  • Booleano: Variáveis booleanas armazenam valores lógicos que podem ser verdadeiro ou falso.
  • Tipo complexo: armazenam dados com formato misto, ou seja, dados de diferentes tipos em uma mesma sentença.

Além disso, o Python possui características marcantes de regras de tipos e nomeação de variáveis, como podemos ver no artigo “Conhecendo variáveis e constantes no Python”.

Estruturas condicionais e estruturas de repetição em Python

Estruturas de condição são artifícios das linguagens de programação para determinar qual bloco de código será executado a partir de uma determinada condição. No Python, assim como em outras linguagens, podemos trabalhar com as seguintes estruturas de condição:

  • if: Visa verificar se determinada ação é verdadeira e executar o bloco de código contido em seu escopo;
  • if/else: Fará com que uma das ações sejam executadas, já que se a condição dentro do if não for verdadeira, será executado o código contido no else;
  • if/elif/else: Serve para verificar mais de uma condição no bloco de execução de um programa;
  • while: É uma estrutura de repetição que permite executar um determinado bloco de código enquanto uma condição for verdadeira;
  • for…in: O for executará um determinado bloco de código por um número definido de vezes. Esta estrutura é muito útil quando já sabemos a quantidade de vezes que precisamos executar determinado bloco de código.
  • for else e while else: O Python também permite adicionar o comando else depois de uma estrutura de repetição, seja ela um for ou um while. Este else serve para executar um determinado bloco de código imediatamente após a estrutura de repetição finalizar.

Aqui em nosso blog possuímos o artigo “Estruturas condicionais e de repetição no Python” onde exemplificamos cada uma das estruturas condicionais e de repetição para sua melhor visualização.

Orientação a objetos em Python

O paradigma de programação orientado a objetos é um dos principais paradigmas das linguagens de programação. Muito utilizado no mercado, entender como funciona e como implementar este paradigma é essencial para todo desenvolvedor de software.

No Python, este paradigma é amplamente utilizado e no artigo “Orientação a Objetos no Python” veremos como implementá-lo na linguagem.

Desenvolvedor Django Full-Stack
Formação: Desenvolvedor Django Full-Stack
Aprenda nesta formação como desenvolver aplicações complexas utilizando o Django, principal framework para desenvolvimento web de todo o ecossistema Python. Para isso, você verá desde os conceitos mais básicos, até conceitos mais avançados.
CONHEÇA A FORMAÇÃO

Principais Estruturas de Dados no Python

No Python, podemos utilizar diversos tipos de estruturas de dados. Estas estruturas resolvem um tipo de problema e podem ser úteis em diversas situações. As principais estruturas são as Listas, Sets, Dicionários e Tuplas.

  • Listas: Uma lista é a estrutura de dados mais básica do Python e armazena os dados em sequência, onde cada elemento possui sua posição na lista, denominada de índice;
  • Tupla: É uma estrutura bastante similar a uma lista, com apenas uma diferença: os elementos inseridos em uma tupla não podem ser alterados, diferente de uma lista onde podem ser alterados livremente;
  • Sets: São uma coleção de itens desordenada, parcialmente imutável e que não podem conter elementos duplicados. Por ser parcialmente imutável, os sets possuem permissão de adição e remoção de elementos;
  • Dicionários: São coleções de itens desordenados com uma diferença bem grande quando comparados às outras coleções (lists, sets, tuples, etc): um elemento dentro de um dicionário possui uma chave atrelada a ele, uma espécie de identificador.

Em nosso artigo “Principais estruturas de dados no Python” abordamos todos os conceitos listados acima e disponibilizamos exemplos para o melhor entendimento. Vale a pena a leitura.

Como instalar uma dependência com PIP e usar em seu projeto

O PIP é uma ferramenta para gerenciamento de pacotes de software escrito em Python. Todos os pacotes disponíveis para sua instalação podem ser encontrados no site do PIP.

Todo o processo de instalação de pacotes em projetos Python pode ser visto no artigo “Como instalar um pacote com PIP e utilizá-lo em seu projeto”.

Gerenciando pacotes em projetos Python com o PIP

Agora que já sabemos como instalar uma dependência com o PIP, precisamos entender como gerenciar várias dependências instaladas em nossa máquina.

Todo esse processo é visto em nosso artigo “Gerenciando pacotes em projetos Python com o PIP”.

Criando ambientes virtuais para projetos Python com o Virtualenv

É comum desenvolvermos mais de um projeto Python em nossa máquina e cada um desses projetos utilizem diferentes versões de um mesmo pacote.

Para manter as diferentes versões de um mesmo pacote instalados sem qualquer conflito em nossa máquina, precisamos criar ambientes virtuais para cada projeto e, assim, isolar os pacotes e suas versões. Para isso, utilizamos ambientes virtuais e todo processo de criação e gerenciamento podem ser vistos no artigo “Criando ambientes virtuais para projetos Python com o virtualenv”.


Algoritmos Desenvolvimento Guias

Guia de introdução à programação

O que é de fato a lógica de programação

Quem está começando na área de desenvolvimento de software já deve ter ouvido falar no termo “lógica de programação”. Afinal, este é o primeiro passo para quem deseja iniciar os estudos nesta área.

Lógica de programação se baseia no fato de que ao desenvolver um software nós devemos aprimorar o nosso raciocínio lógico. Ao realizar alguma ação diária, nosso cérebro muitas vezes faz cada etapa da ação de forma automática. Quando você aprende a andar de bicicleta, o que era difícil no começo se torna automático após algum tempo, porém ao desenvolver um software nós vamos precisar passar o passo a passo de cada ação, criando algoritmos que resolvam problemas específicos. Aprender a aperfeiçoar essa capacidade analítica é fundamental para ser um desenvolvedor.

Há um ótimo artigo sobre “O que é de fato a lógica de programação“, aconselho a leitura para você que está começando no mundo do desenvolvimento.

Lógica de Programação Completo
Curso de Lógica de Programação Completo
CONHEÇA O CURSO

Conceitos usados no aprendizado de programação

Ao estudar lógica de programação nos deparamos com alguns conceitos como: algoritmos, fluxogramas, pseudocódigo e sobre linguagem estruturada.

É importante entendermos esses conceitos para ter uma base sólida no aprendizado de programação. Vamos resumir alguns conceitos:

Um algoritmo é uma sequência de passos, com começo, meio e fim, que realiza uma tarefa específica. Muitas vezes para auxiliar na criação e interpretação de um algoritmo nós podemos utilizar uma ferramenta chamada fluxograma, que é um diagrama com símbolos específicos para indicar cada passo e ordem de um algoritmo.

Partindo para algo mais prático, podemos utilizar o “pseudocódigo”, que é um “código” entre a linguagem natural e a codificação propriamente dita. Ela utiliza a estrutura de uma linguagem mas com termos mais simples para facilitar a interpretação do algoritmo. Como podemos ver no exemplo abaixo.

Algoritmo "Somar"

inteiro numero1, numero2, soma;
Exiba: "Digite dois números que serão somados";
leia (numero1,numero2);
soma = numero1+numero2;
Exiba: "O resultado da soma é "soma;
fim;

Você pode se aprofundar sobre o tema lendo o nosso artigo sobre os “Conceitos usados no aprendizado de programação“.

Variáveis e constantes na programação

Ao desenvolver um algoritmo nós precisamos lidar com algum dado ou informação que será manipulado pelo nosso programa. Para lidar com esses dados nós utilizamos as variáveis e constantes.

As variáveis são utilizadas para armazenar dados simples, dado este que pode ser alterado de alguma forma dentro de nosso programa. Como podemos armazenar diferentes tipos de dados, as variáveis também possuem tipos como:
int: (valor número do tipo inteiro).
float: (valor número do tipo decimal).
double: (valor numérico do tipo decimal de precisão dupla).
char: (caractere do tipo texto), string (conjunto de caracteres do tipo texto).
boolean: (representa somente dois valores, verdadeiro ou falso).

As constantes, ao contrário das variáveis, armazenam dados que não podem ser alterados no desenvolvimento do algoritmo, elas possuem um valor fixo. São utilizadas para guardar valores matemáticos ou textos que são estáticos.

Em nosso artigo Variáveis e constantes na programação contamos com exemplos práticos para facilitar a compreensão. Aconselho a leitura para quem está começando os estudos em lógica de programação.

Operadores matemáticos usados na programação

Utilizamos operadores matemáticos a todo momento quando vamos desenvolver um software, independente da linguagem ou paradigma, portanto é fundamental saber como utilizar cada operador.

Partindo do básico, com frequência utilizamos funções com operações básicas da matemática, para realizar essas operações utilizando uma linguagem de programação nós utilizamos os seguintes operadores:

Operador Descrição
+ Adição
Subtração
/ Divisão
* Multiplicação

Vale ressaltar que, como aprendemos em expressões matemáticas, cada operação tem precedência perante outras, seguindo a lógica dos parênteses, potenciação e raiz quadrada, multiplicação e divisão, soma e subtração.

Em nosso artigo aqui na TreinaWeb sobre Operadores matemáticos usados na programação também citamos o uso do operador % (mod), que retorna o resto de uma divisão. Assim como usar os operadores para potenciação e cálculo de raiz quadrada, portanto indico a leitura.

Lógica Orientada a Objetos Completo
Curso de Lógica Orientada a Objetos Completo
CONHEÇA O CURSO

Operadores de comparação na programação

Usamos os operadores de comparação para analisar os valores em uma condição, onde o retorno dessa condição será um valor booleano, ou seja, verdadeiro ou falso. Com isso podemos tratar o comportamento de um algoritmo dependendo dos resultados obtidos.

Os operadores podem variar dependendo da linguagem de programação, pois algumas possuem certas particularidades, mas temos os mais comuns e utilizados na grande maioria delas, que são:

  • > (maior): Retorna verdadeiro caso o primeiro valor seja maior que o segundo.
  • >= (maior ou igual): Retorna verdadeiro caso o primeiro valor seja maior ou igual ao segundo.
  • < (menor): Retorna verdadeiro caso o primeiro valor seja menor que o segundo.
  • <= (menor ou igual): Retorna verdadeiro caso o primeiro valor seja menor ou igual ao segundo
  • == (igual a): Retorna verdadeiro caso o primeiro valor seja igual ao segundo.
  • != (diferente de): Retorna verdadeiro caso o primeiro valor seja diferente do segundo.

No javascript por exemplo temos também o operador ===que além de comparar os valores também leva em consideração o tipo da variável.

Em nosso artigo sobre Operadores de comparação na programação aplicamos na prática o uso dos operadores de comparação e utilizamos fluxogramas para facilitar a interpretação, vale a leitura caso você queira se aprofundar sobre o assunto.

Operadores lógicos

Além dos operadores matemáticos e de comparação, existem os operadores lógicos. Estes são os que trazem mais dúvidas aos iniciantes em lógica de programação se tratando do estudo de operadores.

Em programação existe um tipo de dado chamado booleano, tipo este que guarda somente duas informações: Verdadeiro ou Falso. Ao criar uma estrutura de condição, o retorno desta condição será um dado booleano, para criar essas condições as linguagens também possuem os operadores lógicos. Dessa forma podemos criar operações lógicas mais complexas, esses operadores são:

  • && (E): Retorna verdadeiro quando todas as expressões da condição são verdadeiras, caso contrário, retorna falso.

Operador lógico E

  • || (OU): Retorna verdadeiro quando pelo menos uma das expressões da condição é verdadeira.

Operador lógico OU

  • ! (negação ou “not”): Retorna o oposto do valor em questão.

Operador lógico NOT

Temos um artigo falando somente sobre os Operadores lógicos, para se aprofundar no tema indico a leitura do mesmo.

Estruturas condicionais e de repetição

Utilizando os operadores de comparação e lógicos podemos criar as estruturas condicionais. Em relação as estruturas condicionais, podemos separar em dois tipos de estrutura:

  • Simples – Utilizamos a condição SE (IF), caso a condição seja verdadeira, o algoritmo executa a tarefa solicitada, caso contrário o bloco da condição é ignorado.

  • Composta – Utilizamos a condição SE (IF), caso a condição seja verdadeira, o algoritmo executa a tarefa solicitada, caso contrário utilizamos a condição SENÃO (ELSE), desta forma o algoritmo irá executar a tarefa do bloco SENÃO.

Em algumas situações será necessário executar mais de uma vez o bloco referente às estruturas condicionais, para isso utilizamos as estruturas de repetição. As estruturas de repetição mais comuns são:

  • ENQUANTO (WHILE) – Enquanto o resultado da condição for verdadeira, o algoritmo executa o bloco proposto, por fim é necessário que algo dentro do bloco altere a condição. Mais indicado para ser utilizado quando não sabemos quantas vezes o bloco será executado.

  • PARA (FOR) – A condição PARA tem o mesmo princípio que utilizar enquanto (while), porém este recurso é mais utilizado quando se sabe o número de iterações da repetição, como listar os valores de um vetor por exemplo, também vale ressaltar a legibilidade do código, por ser mais limpo e elegante.

Em nosso artigo sobre estruturas condicionais e de repetição aprofundamos a explicação de cada estrutura e condição, com exemplos práticos e com fluxogramas.

Modularização: Funções e Procedimentos

Utilizando funções e procedimentos podemos modular a construção de um software, ou seja, definir em tarefas menores partes do sistema que possuem responsabilidades específicas. O uso deste recurso traz muitas vantagens como reutilização de código, facilidade de manutenção, melhor legibilidade, entre outras.

Podemos definir de forma básica funções e procedimentos da seguinte forma:

  • Funções – Uma função é um conjunto de comandos que pode ser separado por um “bloco” de código visando o processamento de uma tarefa específica, onde esta função recebe parâmetros e retorna um valor.
  • Procedimento – Os procedimentos são similares às funções, tanto na sua criação como no conceito de ter uma responsabilidade específica, porém nós utilizamos os procedimentos quando não há retorno, para mostrar uma mensagem por exemplo.

Utilizando o conceito de modularização podemos facilitar a construção de sistemas mais complexos dividindo as responsabilidades em blocos menores e específicos. Em nosso artigo sobre Modularização: Funções e Procedimentos, explicamos de forma didática com fluxogramas e exemplos utilizando a linguagem C o uso de cada conceito.

C Básico
Curso de C Básico
CONHEÇA O CURSO

Algoritmos Desenvolvimento

Operadores matemáticos usados na programação

Operadores matemáticos ou aritméticos, são usados com frequência no desenvolvimento de software, independente da linguagem ou paradigma. Vamos ver quais e como são usados os operadores matemáticos mais comuns presentes nas linguagens de programação.

Lógica de Programação Completo
Curso de Lógica de Programação Completo
CONHEÇA O CURSO

Operadores matemáticos mais comuns

Começando do básico, com frequência é necessário criarmos funções que utilizam as operações básicas da matemática, como adição, subtração, divisão e multiplicação, para estes cálculos nós vamos utilizar os operadores da tabela abaixo:

Operador Descrição
+ Adição
Subtração
/ Divisão
* Multiplicação

Utilizando a linguagem C como exemplo, podemos exemplificar as operações básicas da seguinte maneira:

void main()
{
    printf("5 + 5 = %d", 5 + 5); //adição
    printf("\n10 - 3 = %d", 10 - 3); //subtração
    printf("\n10 / 3 = %d", 10 / 3); //divisão
    printf("\n3 * 3 = %d", 3 * 3); //multiplicação
}

Com o código acima vamos obter o seguinte resultado:

Operadores matematicos

Além dos operadores citados acima, algumas linguagens oferecem os operadores referentes a potenciação e módulo (que retorna o resto de uma divisão), normalmente eles são representados por ** e % respectivamente. No caso a linguagem C não oferece um operador para o módulo, mas sim uma função.

Outro ponto que pode gerar dúvidas é sobre o operador +, além da adição ele pode ser usado também em algumas linguagens como operador de concatenação, que nada mais é do que encadear (ou unir) duas strings.

Também podemos realizar operações como potenciação e cálculo de raiz quadrada, onde algumas linguagens possuem operadores específicos para estes cálculos ou disponibilizam funções. Na linguagem C podemos efetuar potenciação e o cálculo de raiz quadrada utilizando as funções pow(base, expoente) e sqrt(x) respectivamente. Em outras linguagens nós podemos utilizar o operador ^ para potenciação.

Lógica Orientada a Objetos Completo
Curso de Lógica Orientada a Objetos Completo
CONHEÇA O CURSO

Precedência de operadores

Assim como aprendemos sobre as expressões matemáticas, quando trabalhamos com programação também devemos prestar atenção sobre a precedência dos operadores.

A prioridade se comporta da mesma forma que aprendemos expressôes matemáticas no ensino fundamental, resolvemos primeiro a potenciação e calculo de raiz quadrada, divisão e multiplicação, adição e subtração, lembrando que podemos utilizar os parenteses para apontar prioridade.

Podemos ver uma lista de precedência mais completa referente a linguagem C conforme abaixo:
Lista precedência de operadores

Nosso artigo sobre precedência e associatividade de operadores aqui da TreinaWeb se aprofunda neste tema, caso você queira saber mais sobre este assunto, vale a pena sua leitura.

Além dos operadores matemáticos, é importante estudar sobre os operadores lógicos e operadores de comparação. Todos eles são importantes para o desenvolvimento na área de programação, pois são amplamente utilizados independente da linguagem de programação ou paradigma, aconselho a leitura do guia de introdução a programaçãoo onde abordamos os conceitos necessários para inicar os estudos na área de desenvolvimento.

Desenvolvedor Java
Formação: Desenvolvedor Java
A formação Desenvolvedor Java da TreinaWeb tem como objetivo apresentar o desenvolvimento através do Java e todo o ecossistema para desenvolvimento da Oracle. Nesta formação, são desde tópicos básicos como o paradigma orientado a objetos, a preparação do ambiente de desenvolvimento para o Java através do Eclipse e o controle de versão de código através do Git e do GitHub. Até aspectos mais avançados como acesso a bancos de dados relacionais e o desenvolvimento de aplicações web com o Java.
CONHEÇA A FORMAÇÃO

Algoritmos Desenvolvimento

Conceitos usados no aprendizado de programação

Para desenvolver um software nós precisamos passar instruções para o computador com o passo a passo das tarefas que o mesmo irá realizar para resolver um problema, este conceito é chamado de algoritmo. Diferentemente do início do desenvolvimento de software, onde essas instruções eram passadas por cartões perfurados, hoje nós podemos passar as instruções utilizando padrões de códigos, que podem ser traduzido nas linguagens de programação.

cartão perfurado

Lógica de Programação Completo
Curso de Lógica de Programação Completo
CONHEÇA O CURSO

Existe uma variedade de linguagens de programação e de paradigmas que visam facilitar o desenvolvimento e manutenção dos sistemas, porém algo imutável é o conceito base da lógica de programação, este que você deve desenvolver pois são fundamentais no uso de qualquer linguagem e paradigma.

Se você está começando agora a estudar lógica de programação, antes de tudo aconselho a leitura de nosso artigo “O que é de fato a lógica de programação?” entramos mais a fundo sobre o conceito deste tópico tão importante da área de desenvolvimento.

Neste artigo vamos partir para a introdução a lógica de programação, exemplificando como podemos transformar ações do mundo real em algoritmos, uso de ferramentas para reforçar o aprendizado como o fluxograma e o próprio desenvolvimento de um algoritmo básico em uma linguagem de programação.

O que são algoritmos?

As nossas ações desde o momento que acordamos são lógicas, pense bem, quais ações nós fazemos ao acordar para levantar pela manhã?

Acordar
Abrir o olho esquerdo
Abrir o olho direito
Sentar na cama
Procurar o Chinelo
Encontrou?
    Colocar o chinelo esquerdo
    Colocar o chinelo direito.
    Levantar
    Fim
Não Encontrou?
    Levantar Descalço
    Fim.

Ao acordar nós fazemos uma série de ações, porém é algo natural para nós, já o computador necessita que essas instruções sejam informadas passo a passo de forma minuciosa, essa sequência de passos que realizam uma tarefa são chamados de algoritmo.

Repare como em uma atividade do nosso dia a dia nós efetuamos uma série de passos para realizar uma tarefa simples, por ser algo de nosso cotidiano, realizamos esse “algoritmo” de forma automática, porém um computador não tem essa habilidade, sendo necessário que o ser humano programe o algoritmo para o computador realizar uma tarefa que resolva um problema específico.

O que é um fluxograma?

Uma ferramenta que é muito utilizada para auxiliar no desenvolvimento de algoritmos é o uso de fluxogramas, com essa opção é possível analisar de forma visual o comportamento de um algoritmo e facilitar a sua interpretação. Ao utilizar um fluxograma é necessário seguir um padrão de símbolos, a tabela abaixo explica os símbolos mais utilizados na área de programação:

Conceito do algortimo em um fluxograma
fonte: (http://www.univasf.edu.br/~marcelo.linder/arquivos_ap/aulas_M2/aula4.pdf)

O algoritmo acima, aplicando o fluxograma, ficaria da seguinte forma:

Fluxograma de exemplo

Utilizando Pseudocódigo

Vamos partir agora para um exemplo mais prático, como podemos criar um algoritmo para o computador somar dois números?

Em pseudocódigo, que é um “código” onde utilizamos uma linguagem entre a natural e a codificação, teremos o seguinte resultado:

Algoritmo "Somar"

inteiro numero1, numero2, soma;
Exiba: "Digite dois números que serão somados";
leia (numero1,numero2);
soma = numero1+numero2;
Exiba: "O resultado da soma é "soma;
fim;

No pseudocódigo acima nós criamos um algoritmo para somar dois números utilizando os operadores matemáticos.

O primeiro passo foi informar com quais valores o algoritmo deverá trabalhar, no caso o valor do numero1, numero2 e o valor que representa a soma com o valor soma, todos os valores são do tipo inteiro. Você pode conferir este conceito em nosso artigo sobre variáveis e constantes caso não conheça.

Logo em seguida utilizamos o passo “Exiba”, onde nosso algoritmo irá exibir uma mensagem para o usuário e posteriormente o passo leia, para ler os dados do número 1 e número 2 que serão respectivamente informados pelo usuário.

Usamos uma expressão matemática para somar o numero1 e numero2, atribuir este valor a variável soma e por último, exibir a mensagem com o valor correto da soma.

Nós podemos também representar o algoritmo acima utilizando o fluxograma, onde iremos obter o seguinte resultado:

fluxograma de soma

Lógica Orientada a Objetos Completo
Curso de Lógica Orientada a Objetos Completo
CONHEÇA O CURSO

Linguagem de Programação Estruturada

Para finalizar o nosso exemplo, vamos efetivamente programar este algoritmo utilizando uma linguagem de programação, neste caso o C que é ótimo para fins didáticos.

void main() {
    int numero1;
    int numero2;
    int soma;

    printf("Digite dois numeros que serao somados:\n");
    scanf("%d", &numero1);
    scanf("%d", &numero2);

    soma = numero1 + numero2;

    printf("O resultado da soma é %d", soma);
}

Iremos obter o seguinte resultado:

Resultado do exemplo em C

Utilizamos a linguagem C para este exemplo, uma linguagem estruturada. A programação estruturada é baseada no conceito de modularização, onde cada responsabilidade do software a ser desenvolvido é baseado em blocos que devem realizar tarefas únicas, estes “blocos de código” são chamados de funções e procedimentos. Você pode entender melhor este conceito em nosso artigo sobre “modularização: funções e procedimentos“.

Conclusão

Vale reforçar que o estudo em lógica de programação é fundamental para o domínio de qualquer linguagem e paradigma, esse conhecimento será primordial para a sua evolução nos estudos na área de desenvolvimento de software, portanto, tenha paciência e evite pular etapas no seu aprendizado, aconselho a leitura de nosso artigo sobre o guia de introdução a programação onde abordamos vários assuntos importantes.

C Básico
Curso de C Básico
CONHEÇA O CURSO

Algoritmos Desenvolvimento

Modularização: Funções e Procedimentos

Nos artigos anteriores aprendemos sobre variáveis e constantes, operadores de comparação, estrutura condicionais e de repetição agora vamos entender o uso do conceito de modularização.

Lógica de Programação Completo
Curso de Lógica de Programação Completo
CONHEÇA O CURSO

Modularização

Devido as funções e procedimentos nós podemos modular a construção de nosso software, ou seja, dividir várias partes do sistema em partes menores que possuem tarefas específicas. O uso deste recurso traz muitas vantagens como a reutilização do código, a facilidade de manutenção, melhor legibilidade facilitando a compreensão do código por outros desenvolvedores, entre outras. Portanto, o conceito de dividir o seu código em blocos que se comunicam entre si e que cada parte tenha uma responsabilidade especifica pode ser chamado de modularização.

A modularização é mais vista na programação estruturada, mas os conceitos são muito importantes para quem está aprendendo lógica, pois outros paradigmas utilizam algumas características similares.

Funções e Procedimentos

Funções

Uma função é um conjunto de comandos que pode ser separado por um “bloco” de código visando o processamento de uma tarefa específica, onde esta função recebe parâmetros e retorna um valor, por exemplo: ao desenvolver uma calculadora simples nós teremos, ao menos, quatro operações como adição, subtração, multiplicação e divisão. Cada operação pode ser traduzida em uma função específica que será chamada de acordo com a necessidade do usuário a qualquer momento.

A função somar ficaria da seguinte forma utilizando a linguagem C:

int somar(int n1, int n2){
    int soma;
    soma = n1 + n2;
    return(soma);
}

Vamos analisar o código acima, podemos ver que a função somar tem a responsabilidade única de somar dois valores (que são recebidos como parâmetros) e retornar o resultado da soma destes dois valores, como podemos ver na linha return(soma). Logo em seguida veremos como podemos chamar a função somar em nossa função principal, a main:

void main() {
    int n1, n2;
    printf("Digite o primeiro valor:");
    scanf("%d", &n1);
    printf("Digite o segundo valor:");
    scanf("%d", &n2);

    printf("\\nA soma e %d.", somar(n1,n2));
}

A função main é a função principal que executa o nosso código. Na função main, é chamada a função somar da seguinte maneira: somar(n1,n2) onde temos o nome da função e logo em seguida a entrada dos parâmetros.

Perceba que a função somar possui a característica int antes de seu nome, isso significa que ela irá retornar um valor inteiro, valor este que é exibido em nossa função principal. Sendo assim, em qualquer parte de nosso algoritmo que formos somar dois valores nós não precisamos repetir o mesmo código, será necessário somente chamar a função e alterar os parâmetros.

Os parâmetros são os valores que a função irá pedir para executar a sua tarefa, neste caso ao criar a função estamos informando que é necessário passar os valores n1 e n2, ambos inteiros, para que desta forma a função faça a soma destes dois valores, e retorne a variável ´soma´.

Podemos ver o resultado do código acima:

Resultado Terminal exemplo função

Lógica Orientada a Objetos Completo
Curso de Lógica Orientada a Objetos Completo
CONHEÇA O CURSO

Procedimentos

Os procedimentos, ou procedures, são similares as funções tanto na sua criação como no conceito de ter uma responsabilidade específica, porém nós utilizamos os procedimentos quando não há retorno, para mostrar uma mensagem por exemplo.

Para entender melhor podemos complementar o exemplo acima com um procedimento que diga se um número é par ou ímpar, para isso, vamos criar o procedimento parOuImpar:

void parOuImpar(int n1){
    float resto;
    resto = n1 % 2;
    if (resto != 0) {
        printf("\\nO numero %d e impar.", n1);
    } else {
        printf("\\nO numero %d e par.", n1);
    }
}

Criamos o procedimento parOuImpar que recebe um único valor de parâmetro, onde a responsabilidade dele é verificar e exibir a mensagem se o valor é par ou ímpar, sem a necessidade de retornar algum valor, perceba que se tratar de um procedimento nós iniciamos a criação dele com o tipo void.

Ao final, nosso código completo ficará da seguinte forma:

int somar(int n1, int n2){
    int soma;
    soma = n1 + n2;
    return(soma);
}

void parOuImpar(int n1){
    float resto;
    resto = n1 % 2;
    if (resto != 0) {
        printf("\\nO numero %d e impar.", n1);
    } else {
        printf("\\nO numero %d e par.", n1);
    }
}

void main() {
    int n1, n2;
    printf("Digite o primeiro valor:");
    scanf("%d", &n1);
    printf("Digite o segundo valor:");
    scanf("%d", &n2);

    printf("\\nA soma e %d.", somar(n1,n2));
    parOuImpar(somar(n1,n2));
}

Outro ponto que vale ressaltar, em nossa função principal main, veja que curioso, chamamos o procedimento parOuImpar e como parâmetro nós passamos a função somar, afinal, ela retorna um valor inteiro, que é o que o nosso parâmetro pede.

O resultado para o código acima será:

Resultado terminal exemplo procedimento

Funções e Procedimento em outras linguagens

Em C podemos diferenciar a função do procedimento utilizando void já que o procedimento não retornará nenhum valor, porém em Pascal, por exemplo, devemos declarar de forma diferente, onde as funções terão que ser declaradas utilizando function e os procedimentos utilizando procedure, como podemos ver no exemplo abaixo:

Program exemploIdade;
var
idade :integer;

procedure maioridade(idade :integer);
begin
    if (idade >= 18) then
      Writeln('Maior de idade')
    else
        Writeln('Menor de idade');
end;

begin
    Write('Informe a idade: ');
    readln(idade);
    maioridade(idade);    
end.

Ao criarmos a procedure maioridade, ela não irá retornar nenhum valor, mas sim exibir as mensagens de acordo com o valor da idade digitada pelo usuário, podendo ser maior de idade para a idade igual ou acima de 18 anos, ou menor de idade para valores menores de 18. Podemos criar uma função com a mesma responsabilidade que esse procedimento, porém ficaria da seguinte forma:

Program exemploIdade;
var
idade :integer;

function maioridade(idade :integer):boolean;
begin
    if (idade >= 18) then
      maioridade:=true
    else
        maioridade:=false;
end;

begin
    Write('Informe a idade: ');
    readln(idade);

    if maioridade(idade)=true then
      Writeln('Maior de idade')
    else 
        Writeln('Menor de idade');            
end.

Perceba que a função maioridade não exibe nenhuma mensagem, mas sim retorna um valor booleano, ou seja, se é verdadeiro ou falso, e com isso ao chamar a função é exibida a mensagem de acordo com o retorno obtido pela função.

Conclusão

Utilizando o conceito de modularização podemos facilitar a construção de sistemas mais complexos dividindo as responsabilidades em blocos menores e específicos utilizando as funções e procedimentos como vimos neste artigo, lembrando que este conceito não está ligado a somente a Linguagem C ou Pascal, mas sim a lógica de programação como um todo. Outro artigo fundamental para entender os conceitos da área de desenvolvimento é guia de introdução a programação, aconselho fortemente a leitura.

Projeto de Banco de dados - Fundamentos
Curso de Projeto de Banco de dados - Fundamentos
CONHEÇA O CURSO

Algoritmos Desenvolvimento

Operadores de comparação na programação

Neste artigo vamos abordar como são utilizados os operadores de comparação, fundamentais para a criação de algoritmos na lógica de programação.

Caso você não esteja familiarizado com o estudo de lógica de programação, indico a leitura do nosso artigo sobre variáveis e constantes na programação.

Os operadores de comparação são operadores que possuem o objetivo de analisar os valores de uma expressão e retornar um valor booleano, ou seja, verdadeiro (1) ou falso (0). Cabe mencionar que também existem os operadores lógicos, aconselho a ler o nosso artigo.

Lógica de Programação Completo
Curso de Lógica de Programação Completo
CONHEÇA O CURSO

Tabela de operadores de comparação

Os operadores mais utilizados na lógica de programação são: >, >=, <, <=, ==, !=.

  • > (maior): Retorna verdadeiro caso o primeiro valor seja maior que o segundo.
  • >= (maior ou igual): Retorna verdadeiro caso o primeiro valor seja maior ou igual ao segundo.
  • < (menor): Retorna verdadeiro caso o primeiro valor seja menor que o segundo.
  • <= (menor ou igual): Retorna verdadeiro caso o primeiro valor seja menor ou igual ao segundo
  • == (igual a): Retorna verdadeiro caso o primeiro valor seja igual ao segundo.
  • != (diferente de): Retorna verdadeiro caso o primeiro valor seja diferente do segundo.

Importante ressaltar que algumas linguagens de programação possuem algumas particularidades, como em javascript, temos o operador de comparação ===, que além de comparar o valor ele também verifica o tipo da variável, em relação aos tipos aconselho a leitura de nosso artigo sobre tipagem nas linguagens de programação.

Podemos ver na prática usando a linguagem C, por exemplo, como um algoritmo se comporta ao retornar os valores ( verdadeiro (1) ou falso (0) ) das expressões utilizando os operadores de comparação da tabela, conforme código que segue:

void main(){
    int x = 5;
    int y = 10;

    printf("X é maior que Y? %d", x > y);
    printf("\nX é menor que Y? %d", x < y);
    printf("\nX é diferente de Y? %d", x != y);
    printf("\nX é igual a Y? %d", x == y);

//também temos os comparadores maior ou igual e menor ou igual

    int a = 20;
    int b = 20;

    printf("\nA é maior ou igual a B? %d", a >= b);
    printf("\nB é maior ou igual a B? %d", a <= b);

    //agora vamos fazer um teste trocando o valor de b

    b = 21;

    printf("\nA é maior ou igual a B? %d", a >= b);
    printf("\nB é maior ou igual a B? %d", a <= b);
}

O retorno esperado será:
Retorno operadores de comparação

Como utilizar os operadores de comparação

Quando vamos tratar o comportamento de um algoritmo precisamos utilizar as estruturas condicionais e de repetição, estas que serão dependentes dos operadores de comparação para trilhar um caminho, por exemplo, se nosso objetivo é exibir os números ímpares em um intervalo definido, teremos o seguinte algoritmo:

Início
var inteiro x = 10;
para (inteiro i = 1; i <= x; i++) {
    var float y = i % 2;
        se (y != 0) {
            exibir "o número i é ímpar"
        }
}
Fim

Para facilitar o entendimento podemos usar o seguinte fluxograma:

Fluxograma operadores de comparação

E para entender na prática em C ficará da seguinte forma:

void main()
{
    int x = 10;
    for (int i = 1; i <= x; i++) {
        float y = i % 2;
        if (y != 0) {
            printf("O número %d é impar", i);
        }
    }
}
Lógica Orientada a Objetos Completo
Curso de Lógica Orientada a Objetos Completo
CONHEÇA O CURSO

O retorno esperado será:

Retorno algoritmo números ímpares

Neste algoritmo temos uma série de operadores de comparação, vamos entender como eles funcionam.

Vale ressaltar que é importante se atentar ao operador == e =, == é um operador de comparação que o algoritmo verifica se os valores são iguais, já = é um operador de atribuição, que irá atribuir o valor declarado a variável, onde na linha int x = 10 atribuímos o valor 10 a variável x. Dito isso, vamos ao algoritmo:

Dentro do para/for temos o uso do operador de comparação <= (menor ou igual), em: i <= x, ou seja, o algoritmo está verificando se a variável i é menor ou igual a x (variável que declaramos acima), portanto, se essa expressão for verdadeira o algoritmo irá executar o bloco a seguir, se for falsa o laço de repetição chegará ao seu fim.
Outro operador de comparação importante no algoritmo é o != (diferente de), que utilizamos em: y != 0, ou seja, se a variável y é diferente de 0, o próximo bloco que exibe o número ímpar será executado, agora se o retorno for falso o algoritmo irá retornar ao laço para/for.

Considerações finais

No exemplo aprendemos a utilizar os operadores de comparação para tratar o comportamento de um algoritmo. Lembrando que nos exemplos deste artigo utilizamos a linguagem de programação C, mas os conceitos são fundamentais para o uso de qualquer linguagem de programação. Em nosso artigo sobre o guia de introdução a programação abordamos outros conceitos importantes, indico a leitura.

Projeto de Banco de dados - Fundamentos
Curso de Projeto de Banco de dados - Fundamentos
CONHEÇA O CURSO

Algoritmos Desenvolvimento

Variáveis e constantes na programação

Variáveis e Constantes são conceitos fundamentais para o estudo de lógica de programação, vamos agora entender qual a utilidade de cada uma.

Quando vamos desenvolver um algoritmo precisamos lidar com dados. Eles podem ser do próprio algoritmo ou enviados pelo usuário, sendo necessário manipulá-los para que o objetivo do algoritmo seja alcançado. Neste momento entram as variáveis e constantes, elas representam o “endereço” onde o dado está guardado na memória para que você possa acessar ou alterar esse valor.

Lógica de Programação Completo
Curso de Lógica de Programação Completo
CONHEÇA O CURSO

Variáveis

Uma variável é um nome que definimos para armazenar dados de forma simples. O valor de uma variável pode ser alterado no andamento do algoritmo, por isso o nome de variável.

Vamos pensar em um exemplo onde precisamos fazer um algoritmo que some dois números, portanto podemos representar da seguinte forma:

algoritmo
declare inteiro num1 = 3.
declare inteiro num2 = 8.
declare inteiro soma;

soma = num1 + num2;

exibir soma;

Para facilitar o entendimento podemos demonstrar o algoritmo em um fluxograma:
Fluxograma do algoritmo

Em relação ao exemplo acima, perceba que na variável num1 adicionamos o valor numérico 3 e na variável num2 adicionamos o valor numérico 8, por fim na variável soma adicionamos o resultado do cálculo de soma entre num1 e num2. Desta forma cada variável é representada por seu nome e guardará os valores que são atribuídos a ela, permitindo que uma variável seja o resultado de uma operação entre outras variáveis.

O exemplo acima aplicado na linguagem de programação C ficará da seguinte forma:

void main() {
    int num1 = 3;
    int num2 = 8;
    int soma;
    soma = num1 + num2;
    printf("A soma do número 1 com o número 2 é %d", soma);
}

Ao executar ele retorna o valor da soma:

Soma de variáveis em C

Obs: exemplo utilizando a linguagem C, porém o conceito do uso de variáveis são os mesmos para quaisquer linguagens, alterando somente a sintaxe particular de cada linguagem.

Lógica Orientada a Objetos Completo
Curso de Lógica Orientada a Objetos Completo
CONHEÇA O CURSO

Alterando o valor das variáveis

Vale ressaltar que as variáveis levam este nome justamente porque podem ter o seu valor alterado conforme a necessidade do algoritmo, se após a soma dos números 1 e 2 fosse necessário efetuar a troca do valor da variável num1 para 10, podemos prosseguir com o algoritmo da seguinte forma:

algoritmo
declare inteiro num1 = 3;
declare inteiro num2 = 8;
declare inteiro soma;

soma = num1 + num2;

exibir soma;

num1 = 10;
soma = num1 + num2;

exibir soma;

Para facilitar o entendimento, o algoritmo acima pode ser representado pelo seguinte fluxograma:
Fluxograma do algoritmo atualizado

Este novo algoritmo em C ficará da seguinte forma:

void main()
    {
    int num1 = 3;
    int num2 = 8;
    int soma;

    soma = num1 + num2;

    printf("A soma do número 1 com o número 2 é %d", soma);

    num1 = 10;
    soma = num1 + num2;

    printf("\nA soma do número 1 com o número 2 é %d", soma);
}

O retorno esperado será conforme abaixo:
Soma de variáveis

No retorno esperado é possível verificar que no primeiro momento o resultado da operação foi o número 11, porém depois de alterar o valor da variável num1 e consequentemente o da variável soma, no segundo momento o resultado foi a soma com o valor atualizado da variável num1, no caso, 18.

Tipos de variáveis

Ao declarar uma variável nós precisamos informar de qual tipo é aquela variável. Cada linguagem de programação oferece um conjunto de tipos de variáveis, onde os mais comuns são:

  • int: Variável número do tipo inteiro, positivo ou negativo.
  • float: Variável numérica do tipo decimal.
  • double: Variável numérica do tipo decimal de precisão dupla.
  • char: Variável que representa um caractere do tipo texto.
  • string: Variável que representa um conjunto de caracteres do tipo texto.
  • boolean: Variável booleana, ou seja, que pode representar somente dois valores, verdadeiro ou falso.

Uma curiosidade, algumas linguagens trabalham com tipo dinamicamente e outras fazem a inferência do tipo com base no dado definido na sua inicialização. Temos um artigo muito interessante que fala sobre as tipagem nas linguagens de programação que vale bastante a leitura.

Constantes

Ao contrário das variáveis, que podemos alterar o valor conforme a necessidade do algoritmo a ser desenvolvido, as constantes precisam ser inicializadas e não podem ter o seu valor alterado.

Por exemplo, caso seja necessário calcular a área de uma circunferência, podemos adotar o seguinte algoritmo:

algoritmo
declare real área;
declare real raio = 5;
declare constante real pi = 3.14;

area = pi * (raio * raio);

exibir area;

Para facilitar o entendimento o algoritmo acima, ele pode ser representado pelo seguinte fluxograma:
Declaração de constante

Este algoritmo em C ficará da seguinte forma:

void main() {
    float area;
    float raio = 5;
    const float pi = 3.14;

    area = pi * (raio * raio);

    printf("\nA área é de %0.2f", area);
}

Teremos o seguinte retorno:
Retorno área

No caso a constante pi recebeu o valor de 3.14, afinal, de acordo com as leis matemáticas PI é um valor fixo, se por algum motivo o algoritmo tentar mudar o valor de pi, como se pode ver utilizando C, retornará um erro como abaixo:
Erro Constante

Considerações Finais

Lembrando que é importante entender os fundamentos da utilização das variáveis e constantes pois elas terão um papel muito importante nos seus estudos na área de desenvolvimento.

Outro artigo muito importante que indico para você que está começando no mundo da programação é sobre os condicionais e loops, algo essencial para quem está aprendendo lógica de programação.

Além disso, existem outros conceitos importantes que tratamos no guia de introdução a programação, indico fortemente a leitura.

Projeto de Banco de dados - Fundamentos
Curso de Projeto de Banco de dados - Fundamentos
CONHEÇA O CURSO

Algoritmos Desenvolvimento

Estruturas condicionais e de repetição

Ao iniciar os estudos em programação nos deparamos com as estruturas condicionais e de repetição, que são dois pilares em relação a lógica de programação.

Lógica de Programação Completo
Curso de Lógica de Programação Completo
CONHEÇA O CURSO

Estruturas condicionais simples (SE – IF)

Primeiramente, uma estrutura condicional é baseada em uma condição que se for atendida o algoritmo toma uma decisão. Nós podemos representar uma estrutura condicional conforme o algoritmo abaixo.

SE (a > b) ENTÃO
    Exibir mensagem "o número A é maior que o número B".
FIM SE

Utilizando a Linguagem C, este algoritmo seguirá a seguinte sintaxe:

if (a > b) {
    printf("o número %d maior que o número %d", a, b);
}

Obs: exemplo utilizando a linguagem C, porém o fundamento das estruturas condicionais são os mesmos para quaisquer linguagens, alterando somente a sintaxe particular de cada linguagem.

Note que o código acima representa a seguinte condição: se o número A for maior que o número B, o algoritmo irá entender que a condição é verdadeira e deve exibir a mensagem “o número A é maior que o número B”, se esta condição não for atendida, ou seja, se ela for falsa, o algoritmo não irá tomar nenhuma ação, pois ela não atende a condição.

Para facilitar o entendimento, podemos representar a estrutura condicional acima utilizando um fluxograma:
Estruturas condicionais - simples (Se - IF)

Caso o algoritmo precise tomar uma decisão dependendo da estrutura de condição, nós podemos utilizar a estrutura condicional composta.

Estruturas condicionais composta (SENÃO – ELSE)

A diferença em relação a estrutura condicional simples é que se a condição for falsa nosso algoritmo também irá tomar uma ação neste caso, seguindo o exemplo anterior:

SE (a > b) ENTÃO
    Exibir mensagem "o número A é maior que o número B".
SENÃO
    Exibir mensagem "o número A é menor que o número B".

Utilizando a Linguagem C, esse algoritmo seguirá a seguinte sintaxe:

if (a > b) {
    printf("o número %d é maior que o número %d", a, b);
} else {
    printf("o número %d é menor que o número %d", a, b);
}

Note que o código acima representa a seguinte condição: se o número A for maior que o número B, o algoritmo irá entender que a condição é verdadeira e deve exibir a mensagem “o número A é maior que o número B”, se esta condição não for atendida, ou seja, se ela for falsa.

Diferente do exemplo sobre estrutura condicional simples onde o algoritmo não tomava nenhuma ação, aqui ele toma uma decisão diferente, exibindo a mensagem “o número A é menor que o número B”.

Para facilitar o entendimento, podemos representar a estrutura condicional acima utilizando um fluxograma:
Estruturas Condicionais - Composta (senão - else)

Casos mais complexos podem exigir a utilização de estruturas de repetição também conhecido como loop ou laço de repetição, onde o algoritmo repete uma ação até que ela não seja mais atendida.

Lógica Orientada a Objetos Completo
Curso de Lógica Orientada a Objetos Completo
CONHEÇA O CURSO

Estruturas de repetição

Para situações que será necessário repetir uma tarefa mais de uma vez podemos contar com as estruturas de repetição.

ENQUANTO (While)

Uma das condições que podemos usar é o enquanto, ou seja, enquanto a expressão booleana for verdadeira o algoritmo executa o bloco proposto, por fim é necessário que algo dentro do bloco altere a condição.

Podemos exemplificar o uso do enquanto supondo um algoritmo que retorne o resultado de uma tabuada, onde:

i sendo uma variável inteira de valor 1.

ENQUANTO i ≤ 10
    Exibir "9 x i = (9 * i)"
    Soma i = i + 1;
FIM DA CONDIÇÃO

Utilizando a Linguagem C, o algoritmo seguirá a seguinte sintaxe:

while (i <= 10) {
       printf("9 x %d = %d\n", i, 9 * i);
       i++;
   }

Note que a condição que empregamos no algoritmo é de que a variável i irá repetir o bloco até que o valor dela seja igual a 10. Enquanto isso será exibido a mensagem “9 x i = (9 * i)”, a cada linha executada é somado a variável i o valor 1, essa soma é chamada de iteração. Na maioria das linguagens pode-se referenciar a interação com a sintaxe i++ (variável seguida de dois sinais de mais) ou variável = variável + 1.

Quando i chegar ao valor 11 o algoritmo irá parar de executar o bloco, desta forma o resultado esperado do exemplo acima será:
Exemplo Tabuada

Para facilitar o entendimento, podemos representar a estrutura de repetição acima utilizando um fluxograma:
Estrutura de Repetição - While - For

Outro laço que podemos utilizar é o PARA (for).

PARA (FOR)

A condição PARA tem o mesmo principio que utilizar enquanto (while), porém este recurso é mais utilizado quando se sabe o número de iterações da repetição, como listar os valores de um vetor por exemplo, também vale ressaltar a legibilidade do código mais limpo.

Seguindo o exemplo acima da tabuada, o algoritmo esperado será:

PARA i = 1; i <= 10; i++;
    Exibir "9 x i = (9 * i)"

Utilizando a Linguagem C, o algoritmo seguirá a seguinte sintaxe:

for (int i = 1; i <= 10; i++) {
       printf("9 x %d = %d\n", i, 9 * i);
   }

Note que ao usar o PARA (for) o contador (a variável i) é inicializado e incrementado na própria condição do laço junto a expressão booleana a ser atendida, deixando o código mais limpo e sem a necessidade de criar variáveis adicionais.

No fim o retorno aguardado será o mesmo que do exemplo que utilizamos a do laço enquanto.

Além estruturas condicionais e de repetição, em nosso artigo sobre o guia de introdução a programação você pode conferir outro conceitos importantes para iniciar os estudos na área de desenvolvimento.

Desenvolvedor C#
Formação: Desenvolvedor C#
A formação Desenvolvedor C# tem como objetivo demonstrar desenvolvimento com o C# e o .NET Framework da Microsoft. Nesta formação, são abordados tópicos como o o paradigma orientado a objetos, a preparação do ambiente de desenvolvimento para o .NET Framework e o C# com o Visual Studio e o controle de versão de código através do Git e do GitHub. Também será apresentada a conectividade entre o .NET Framework e os bancos de dados relacionais através do ADO.NET, do Entity Framework.
CONHEÇA A FORMAÇÃO

Desenvolvimento

Operadores lógicos

Quando estamos estudando lógica de programação é comum termos dúvidas nos operadores. Entre os operadores, os que mais geram dúvidas são os operadores lógicos, lembro na faculdade o professor explicando diversas vezes os operadores lógicos e mesmo assim a turma como um todo tinha dificuldade.

Por trás dos operadores lógicos existe uma série de conhecimentos teóricos, porém esse não será o foco do nosso artigo. O objetivo aqui é bem mais prático, falando diretamente para utilização de operadores lógicos em programação.

Lógica de Programação Completo
Curso de Lógica de Programação Completo
CONHEÇA O CURSO

Valores Booleanos (Verdadeiro e Falso)

Em programação existe um tipo de dado chamado Booleano. Esse tipo guarda uma informação que indica se algo é verdadeiro ou falso. Pensando de maneira abstrata isso parece não fazer muito sentido, porém se pensarmos de maneira um pouco mais concreta facilita as coisas.

Vamos supor que você receba a idade do usuário do seu programa e deseja saber se ela é maior que 18 anos. O resultado da análise da idade só pode retornar dois valores: verdadeiro, se ele tiver mais de 18 anos, ou falso, se ele tiver menos de 18.

No caso acima podemos ter uma visão prática do uso do dado booleano, apesar de não envolver diretamente operadores lógicos.

Onde entra os operadores lógicos?

Os operadores lógicos entram quando precisamos realizar operações sobre um ou dois valores booleano (verdadeiro ou falso). Vamos pensar de maneira prática novamente. Imagine que agora nós precisamos verificar se a idade do usuário é maior que 18 anos e menor que 22. Pensando em como resolver o problema acima, precisamos realizar 2 comparações, uma para saber se a idade é maior que 18 e outra para saber se a idade é menor que 22.

idade maior que 10
idade menor que 22

Sabemos que cada operação dessa retornará um valor verdadeiro ou falso, dependendo da idade do usuário, mas ainda não temos a resposta se a idade está entre 18 e 22. Para realizar essa análise precisamos realizar uma operação sobre os valores booleanos que foram retornados pelas comparações e para isso usamos um operador lógico.

Operador E (AND)

O primeiro operador lógico que veremos será o operador E. Este operador retorna verdadeiro quando os dois valores de entrada passados para ele são verdadeiros, caso contrário ele retorna falso. Veja a tabela verdade dele abaixo:

tabela verdade operador e (and)

O operador E pode ser usado para solucionar o problema da idade entre 18 e 22 anos. Podemos fazer do seguinte modo:

idade maior que 18 E idade menor que 22

Vamos fazer o teste de mesa para a expressão acima.

Vamos considerar primeiro a idade com valor 15. A primeira condição idade maior que 18 retornará falso, porém idade menor que 22 retornará verdadeira. Aplicando o operador E nos valores falso E verdadeiro temos como resposta o valor falso. Logo sabemos que a idade não está entre 18 e 22 anos.

Vamos considerar agora a idade com valor 20. A primeira condição idade maior que 18 retornará verdadeiro e idade menor que 22 também retornará verdadeira. Aplicando o operador E nos valores verdadeiro E verdadeiro temos como resposta o valor verdadeiro. Logo sabemos que a idade está entre 18 e 22 anos.

Por fim, vamos considerar a idade com valor 30. A primeira condição idade maior que 18 retornará verdadeiro, porém idade menor que 22 retornará falso. Aplicando o operador E nos valores verdadeiro E falso temos como resposta o valor falso. Logo sabemos que a idade não está entre 18 e 22 anos.

Lógica Orientada a Objetos Completo
Curso de Lógica Orientada a Objetos Completo
CONHEÇA O CURSO

Operador OU (OR)

Este operador retorna verdadeiro quando um ou outro valor de entrada é verdadeiro e também quando os dois valores são verdadeiros. Ele só retorna falso quando os dois valores de entrada são falsos. Veja a tabela verdade dele abaixo:

tabela verdade operador lógico ou (or)

Vamos imaginar que em um sistema precisamos verificar se uma pessoa é esportista ou não. Para isso perguntamos se ela joga futebol OU faz corridas. Nesse caso podemos montar uma expressão assim:

futebol igual a sim OU corrida igual a sim

Vamos fazer o teste de mesa:

Se a atividade que a pessoa realiza for somente futebol. A primeira comparação futebol igual a sim retornará verdadeiro, porém a segunda corrida igual a sim retorna falso. Aplicando o operador OU nos valores verdadeiro OU falso teremos o valor verdadeiro. Isso nos indica que temos um esportista.

Se a atividade que a pessoa realiza for somente corrida. A primeira comparação futebol igual a sim retornará falso, porém a segunda corrida igual a sim retornará verdadeiro. Aplicando o operador OU nos valores falso OU verdadeiro teremos o valor verdadeiro. Isso nos indica que temos um esportista.

Se a pessoa realiza as duas atividades futebol e corrida. A primeira comparação futebol igual a sim retornará verdadeiro e a segunda corrida igual a sim retornará verdadeiro. Aplicando o operador OU nos valores verdadeiro OU verdadeiro teremos o valor verdadeiro. Isso nos indica que temos um esportista.

Agora se a pessoa não realiza nenhum das duas atividades. A primeira comparação futebol igual a sim retornará falso e a segunda corrida igual a sim também retornará falso. Aplicando o operador OU nos valores falso OU falso teremos o valor falso. Isso nos indica que não temos um esportista.

Operador OU Exclusivo (XOR)

O operador OU Exclusivo retornar verdadeiro quando um dos dois valores é verdadeiro, porém retorna falso se os 2 valores forem verdadeiro. Ele também retorna falso se os dois valores de entrada forem falsos.

Veja a tabela verdade abaixo:

tabela verdade operador ou exclusivo (xor)

Note que ele possui o comportamento muito parecido com o OU, porém quando os dois são verdadeiro ele retorna falso.

Vamos supor que precise verificar o regime de trabalho de um professor. Ele pode ser regime exclusivo ou regime parcial, mas não podem ser os dois juntos.

Operador NÃO (NOT)

Esse operador, diferente dos demais que vimos até agora, realiza uma operação sobre um único valor. Se o valor for verdadeiro ele retorna falso e se o valor for falso ele retorna verdadeiro. Ele também é chamado de operador de negação.

Veja a tabela verdade abaixo:

tabela verdade operador não (not)

Vamos supor que queremos verificar se a idade de uma pessoa NÃO é maior que 18 anos. Para isso podemos fazer algo assim:

NÃO(idade maior que 18)

Vamos ao teste de mesa:

Considerando que a idade da pessoa é 10 anos. A expressão idade maior que 18 retornará falso, aplicando o operador NÃO no valor falso retorna verdadeiro. Isso indica que a idade é menor que 18 anos.

Agora considerando uma idade de 20 anos. A expressão idade maior que 18 retornará verdadeiro, aplicando o operador NÃO o valor verdadeiro será convertido para falso. Isso indica que a idade é maior que 18 anos.

Lógica de Programação Completo
Curso de Lógica de Programação Completo
CONHEÇA O CURSO

Considerações finais

Temos ainda outros operadores lógicos como NÃO-E, NÃO-OU, NÃO-OU-EXCLUSIVO, mas basicamente eles são a aplicação do operador de negação NÃO aos operadores que já conhecemos. Além dos operadores, aconselho a leitura de nosso artigo sobre o guia de introdução a programação, onde abordamos outros conceitos importantes para iniciar os etudos na área de desenvolvimento.


Desenvolvimento

O que é de fato a lógica de programação?

Quem está começando a estudar desenvolvimento de software, certamente já ouviu o termo “lógica de programação”, quer seja em artigos pela internet, matérias na faculdade ou cursos como o nosso próprio curso aqui da TreinaWeb.

Lógica de Programação Completo
Curso de Lógica de Programação Completo
CONHEÇA O CURSO

Por muitas vezes, o termo pode parecer confuso ou muito genérico, principalmente para quem está dando os primeiros passos nessa área… Mas o que é, afinal, a tal lógica de programação?

Programação exige capacidade analítica apurada

Programação exige capacidade analítica

Escrever um trecho de código em qualquer linguagem que seja exige uma capacidade analítica um pouco mais apurada. Isso se deve ao fato de que um computador não é um ser inteligente, como ouvimos falar por várias vezes. Um computador simplesmente executa, de maneira sequencial, um conjunto de instruções pré-disponibilizadas através de um programa, programa este escrito com uma linguagem de programação qualquer.

O grande ponto é que, como um computador simplesmente executa estas linhas de programação de maneira sequencial, nós precisamos escrever uma sequência lógica que faça com que o programa se torne capaz de resolver um determinado problema. E para escrevermos essa sequência lógica de maneira correta, nós precisamos desenvolver a capacidade de analisar os diferentes problemas de maneira mais profunda.

Para que esta questão da capacidade analítica fique mais clara, vamos imaginar uma situação simples: a travessia de uma rua. Se pararmos para refletir, nós precisamos dos seguintes passos:

> Olhar para os lados da rua;
> Se não estiver vindo carro, atravessar a rua;
> Caso contrário, não atravessar.

Este é o pensamento básico para atravessarmos uma rua em segurança. Se fôssemos repassar este pensamento para um computador, não poderíamos ser tão “simplistas”, pois o computador simplesmente segue um conjunto de instruções de maneira sequencial. Cabe a nós repassar estas instruções para o computador da maneira mais clara e direta possível. E para repassarmos estas instruções da maneira correta, nós precisamos analisar os problemas com uma capacidade analítica mais apurada.

Se nós fôssemos reescrever o mesmo pensamento para atravessarmos a rua em segurança realizando uma análise mais apurada, poderíamos chegar na seguinte conclusão:

> Virar o pescoço para o lado direito;
> Verificar se existe algum veículo vindo do lado direito em nossa direção;
> Caso algum veículo esteja vindo do lado direito:
>>>>> Abortar a operação, pois já não é seguro atravessar;
> Virar o pescoço para o lado esquerdo.
> Verificar se existe algum veículo vindo do lado esquerdo em nossa direção;
> Caso algum veículo esteja vindo do lado esquerdo:
>>>>> Abortar a operação, pois já não é seguro atravessar;
> É seguro atravessar: iniciar a travessia da rua.

Veja que nosso pensamento foi esmiuçado em uma sequência lógica que é capaz de resolver o problema da travessia da rua em segurança. Esse esmiuçamento só pôde ser feito porque nós analisamos o problema da travessia da rua de uma maneira mais analítica e profunda. Sem essa análise mais apurada, é impossível criarmos um programa de computador; já que, como dito anteriormente, um computador simplesmente segue as sequências lógicas que nós repassamos a ele através da escrita de um programa.

Essa capacidade analítica parece algo banal em um primeiro momento, mas essa é uma falsa impressão. Nós não estamos acostumados a fazer análises tão esmiuçadas no nosso dia a dia: essas análises são feitas meio que de maneira automática pelo nosso cérebro. Nós, muitas vezes, nem reparamos na quantidade de análises e decisões que nosso cérebro toma no simples ato de atravessar a rua.

Mas, repassar isso para o computador é um desafio, pois um computador não toma decisões de maneira autônoma igual o nosso cérebro faz: cabe a nós repassarmos estas instruções já esmiuçadas para o computador. Por isso, nós precisamos na verdade reeducar nosso cérebro e nosso fluxo de pensamentos para que consigamos trazer à tona estes pensamentos automáticos, de maneira que possamos os repassar também para o computador enquanto estamos escrevendo um programa.

E o que é o tal do algoritmo?

O que é um algoritmo?

Lógica Orientada a Objetos Completo
Curso de Lógica Orientada a Objetos Completo
CONHEÇA O CURSO

Todo fluxo computacional criado para resolver um problema pode ser chamado de algoritmo. Um algoritmo é, literalmente, uma sequência lógica de passos com um início, meio e fim, que foi concebida para resolver algum problema específico.

Nós poderíamos classificar aquele pensamento esmiuçado que desenvolvemos para atravessar a rua de um algoritmo: se trata de uma sequência lógica de passos, com início, meio e fim, e que foi desenvolvida com uma finalidade específica: em nosso caso, atravessar a rua em segurança.

Quando estamos criando programas e aplicações, nós estamos o tempo inteiro desenvolvendo algoritmos para resolver os mais variados problemas. Se precisamos nos conectar a um banco de dados para ler alguma tabela, nós precisaremos de alguns algoritmos para resolver este problema: precisaremos de um algoritmo para nos conectarmos a um banco de dados, de um algoritmo que consiga ler uma tabela e converter em uma representação a ser exibida para o usuário e outro algoritmo para exibir essas representações. E desenvolver todos estes algoritmos é algo desafiador, pois envolve a capacidade analítica aprofundada que discutimos anteriormente.

E onde entra a lógica de programação?

Onde entra a lógica de programação?

A lógica de programação está justamente no desenvolvimento dessa capacidade analítica aprofundada para resolução de problemas, os quebrando em algoritmos. Como vimos anteriormente, isso não é algo tão trivial, já que não é algo natural para nós como seres humanos por causa de nossas capacidades cognitivas. Quando aprendemos a programar, nós literalmente precisamos reaprender a pensar e a organizar estes nossos pensamentos dentro dessas sequências lógicas, formando os algoritmos para resolver os diferentes problemas que iremos enfrentar… Ou seja: nós precisamos aprender uma nova forma lógica de pensar.

Pelo fato de essa reaprendizagem de pensamento ser tão essencial para nos tornarmos bons desenvolvedores de software, a matéria ou curso de lógica de programação é o primeiro contato que futuros desenvolvedores e profissionais da área de TI irão ter com a área de desenvolvimento de software. Sem esse processo de reaprendizagem de formulação de pensamentos, é impossível criarmos algoritmos, programas e aplicações para resolver qualquer tipo de problema.

O que não é lógica de programação?

O que não é lógica de programação?

Pelo fato de lógica de programação acabar sendo considerada uma matéria em cursos técnicos e de graduação, há uma tendência de que os alunos decorem o conteúdo. Em cursos de lógica de programação, geralmente o aluno é submetido a situações onde ele precisará desenvolver algum algoritmo para resolver algum tipo de problema.

Os tipos de problemas geralmente propostos para os alunos resolverem geralmente são recorrentes em quaisquer cursos: verificação se um número é par ou ímpar, se um número é maior que o outro, o cálculo de uma equação de segundo grau e vários outros são problemas geralmente propostos para que os alunos resolvam na disciplina de lógica de programação. Muitas vezes, por comodidade ou até mesmo pela filosofia que muitas instituições de ensino abordam no Brasil, o aluno começa a achar que decorar um algoritmo é suficiente. E, de fato, muitas vezes para a disciplina de lógica de programação, esse ato de decorar um algoritmo é suficiente para que o aluno seja aprovado na matéria.

O grande problema é quando nós somos trazidos para ambientes fora dos ambientes propostos pela disciplina de lógica de programação, como problemas do mundo real, por exemplo. Nestes casos, o aluno não terá provavelmente algoritmos decorados para resolver todas as situações que surgirem, pois isso é impossível. E, pelo fato de o aluno começar a se preocupar mais em decorar os algoritmos ao invés de desenvolver esta capacidade analítica apurada, este não consegue se dar bem nestes tipos de situações.E aí, como resultado, surgem a raiva e a frustação com a área de desenvolvimento de software.

É importante deixar claro que lógica de programação em geral não existe para que você decore como verificar se um número é ímpar ou par. A intenção do estudo de lógica de programação é desenvolver esta capacidade analítica aprofundada, tornando o aluno capaz de analisar de maneira analítica quaisquer tipos de problemas e propor soluções algorítmicas.

Se um aluno foca seus esforços de estudo em decorar os algoritmos ao invés de desenvolver esta capacidade de análise apurada (já que esta capacidade de análise não é algo completamente natural para nós), ele estará se sabotando na verdade: ele até será capaz de passar na disciplina de lógica de programação, mas certamente não será capaz de enfrentar estes problemas que aparecem no dia a dia.

Concluindo

Concluindo

Estudar lógica de programação não consiste em decorar diferentes algoritmos para resolução de problemas, pois é impossível decorar todos os algoritmos para a resolução de todos os problemas no mundo. Muitas vezes, um mesmo problema, inclusive, pode ser resolvido de maneiras diferentes. A maneira de resolução pode até variar com o estilo de codificação que estivermos utilizando: certamente, você resolveria um problema de uma determinada maneira se estivesse utilizando a orientação a objetos, por exemplo.

Mas a resolução desse mesmo problema poderia ser completamente diferente se você estivesse utilizando o paradigma funcional… Embora provavelmente você vá escrever código de duas maneiras completamente diferentes nessa situação, ambas estão corretas se elas estiverem resolvendo o problema proposto. Por isso, é completamente inviável ficar decorando código, nem para simplesmente passar na disciplina de lógica de programação de seu curso técnico ou graduação.

É importante ressaltar que, para resolvermos diferentes problemas através dos computadores, nós precisamos desenvolver algoritmos coesos, estruturados e dedicados para a resolução de um determinado problema. Para que sejamos capaz de desenvolver estes algoritmos, precisamos desenvolver uma capacidade analítica muito mais apurada, capacidade esta que irá nos dar a habilidade para resolvemos praticamente qualquer tipo de problema que enfrentarmos em nosso dia a dia como profissionais da área de TI. O estudo da lógica de programação verdadeira visa na verdade justamente o desenvolvimento destas habilidades analíticas e de organização dos fluxos de pensamento.

Veja nosso guia de introdução a programação que abrange outros assuntos importantes!

Desenvolvedor Python
Formação: Desenvolvedor Python
Aprenda os principais conceitos do Python (uso de variáveis, estruturas condicionais e estruturas de decisão), como trabalhar com orientação à objetos (métodos, construtores, destrutores, classes, herança, polimorfismo e duck-typing), estruturas de dados (Listas, Filas, Pilhas, Árvores Binárias, Dicionários, Conjuntos, Tabelas de Espalhamento e Mapas), banco de dados relacionais (DB API e SQLAlchemy) e como criar aplicações desktop com o Kivy.
CONHEÇA A FORMAÇÃO

Desenvolvimento

Linguagens e paradigmas de programação

No passado escrevia-se programas utilizando apenas linguagens de baixo nível. A escrita é engessada, complexa e muito específica, sendo pouco acessível para os desenvolvedores no geral. Esse tipo de linguagem exige muito conhecimento de quem a programa (inclusive relacionado à forma com que o processador opera uma instrução-máquina).

Recentemente foi liberado o código-fonte utilizado no computador que guiou a missão Apollo que teve como principal objetivo levar o homem à lua (na tão famigerada corrida espacial entre a União Soviética e os EUA), o Apollo Guidance Computer.

https://github.com/chrislgarry/Apollo-11

Se você navegar no repositório acima encontrará diversos códigos-fonte com instruções como essas:

PROGLARM    CS  DSPTAB +11D
        MASK    OCT40400
        ADS DSPTAB +11D


MULTEXIT    XCH ITEMP1      # OBTAIN RETURN ADDRESS IN A
        RELINT
        INDEX   A
        TC  1

MULTFAIL    CA  L
        AD  BIT15
        TS  FAILREG +2

        TCF MULTEXIT

São instruções da linguagem AGC Assembly Language, uma variante da Assembly, que por sinal, é de baixo nível.

Um programa escrito em uma dessas linguagens, chamadas de baixo nível, é composto por uma série de instruções de máquina que determinam quais operações o processador deve executar. Essas instruções são convertidas para a linguagem que o processador entende, que é a linguagem binária (sequência de bits 0 e 1), que é categorizada como First-generation programming language (1GL), em livre tradução: linguagem de programação de primeira geração.

Linguagens de alto nível

Com a popularidade dos computadores criou-se um “problema”: alta demanda por software e, consequentemente, por programadores. Talvez você esteja pensando que isso não é exatamente um problema, e sim uma coisa boa, uma tendência, um novo mercado. Faz sentido, até certo ponto. O problema era encontrar mão de obra qualificada para codificar àquelas instruções tão complicadas.

Com isso, novas linguagens surgiram e, cada vez mais, aproximavam-se da linguagem humana. Isso abriu “fronteiras” para que uma enorme gama de novos desenvolvedores se especializassem. Tais linguagens são denominadas como sendo de alto nível. As linguagens modernas que hoje conhecemos e usamos são de alto nível: C, PHP, Java, Rust, C#, Python, Ruby etc.

Quanto mais próxima da linguagem da máquina, mais baixo nível é a linguagem. Quanto mais próxima da linguagem humana, mais alto nível ela é.

Paradigmas das linguagens de programação

Quando uma linguagem de programação é criada, a partir das suas características, ela é categorizada em um ou mais paradigmas.

A definição do dicionário Aurélio para “paradigma”:

  1. Algo que serve de exemplo geral ou de modelo.
  2. Conjunto das formas que servem de modelo de derivação ou de flexão.
  3. Conjunto dos termos ou elementos que podem ocorrer na mesma posição ou contexto de uma estrutura.

O paradigma de uma linguagem de programação é a sua identidade. Corresponde a um conjunto de características que, juntas, definem como ela opera e resolve os problemas. Algumas linguagens, inclusive, possuem mais de um paradigma, são as chamadas multi paradigmas.

Alguns dos principais paradigmas utilizados hoje no mercado:

Lógica de Programação Completo
Curso de Lógica de Programação Completo
CONHEÇA O CURSO

Paradigma funcional

O foco desse paradigma está na avaliação de funções. Como na matemática quando temos, por exemplo, uma função f(x):

f(x) = x + 2

x é um parâmetro (o valor de entrada) e, após a expressão ser avaliada, obtêm-se o resultado.

Se o valor de entrada for 2, o resultado da avaliação da nossa função será 4.

Algumas das linguagens que atendem a esse paradigma: F# (da Microsoft), Lisp, Heskell, Erlang, Elixir, Mathematica.

É possível desenvolver de forma “funcional” mesmo em linguagens não estritamente funcionais. Por exemplo, no PHP, que é uma linguagem multi paradigma, teríamos:

<?php

$sum = function($value) {
    return $value + 2;
};

echo $sum(2); // 4

Paradigma lógico

Também é conhecido como “restritivo”. Muito utilizado em aplicações de inteligência artificial. Esse paradigma chega no resultado esperado a partir de avaliações lógico-matemáticas. Se você já estudou lógica de predicados, confortável se sentirá em entender como uma linguagem nesse paradigma opera.

Principais elementos desse paradigma:

  • Proposições: base de fatos concretos e conhecidos.
  • Regras de inferência: definem como deduzir proposições.
  • Busca: estratégias para controle das inferências.

Exemplo:

  • Proposição: Chico é um gato.
  • Regra de inferência: Todo gato é um felino.
  • Busca: Chico é um felino?

A resposta para a Busca acima precisa ser verdadeira. A conclusão lógica é:

Se Chico é um gato e todo gato é felino, então Chico é um felino.

A idéia básica da programação em lógica é:

“Oferecer um arcabouço que permita inferir conclusões desejadas, a partir de premissas, representando o conhecimento disponível, de uma forma que seja computacionalmente viável”. Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP.

A linguagem mais conhecida que utiliza esse paradigma é a Prolog. Esse paradigma é pouco utilizado em aplicações comerciais, seu uso se dá mais na área acadêmica.

Leitura recomendada: https://www.ime.usp.br/~slago/pl-1.pdf

Paradigma declarativo

O paradigma declarativo é baseado no lógico e funcional. Linguagens declarativas descrevem o que fazem e não exatamente como suas instruções funcionam.

Linguagens de marcação são o melhor exemplo: HTML, XML, XSLT, XAML etc. Não obstante, o próprio Prolog – reconhecido primariamente pelo paradigma lógico – também é uma linguagem declarativa. Abaixo alguns exemplos dessas linguagens.

HTML:

<article>
  <header>
    <h1>Linguagens e paradigmas de programação</h1>
  </header>
</article>

SQL:

SELECT nome FROM usuario WHERE id = 10

Paradigma imperativo

Você já ouviu falar em “programação procedural” ou em “programação modular“? De modo geral, são imperativas.

Linguagens clássicas como C, C++, PHP, Perl, C#, Ruby etc, “suportam” esse paradigma. Ele é focado na mudança de estados de variáveis (ao contrário dos anteriores).

Exemplo:

if(option == 'A') {
    print("Opção 'A' selecionada.");
}

A impressão só será realizada se o valor da variável option for igual a A.

Paradigma orientado a objetos

Esse é, entre todos, talvez o mais difundido. Nesse paradigma, ao invés de construirmos nossos sistemas com um conjunto estrito de procedimentos, assim como se faz em linguagens “fortemente imperativas” como o Cobol, Pascal etc, na orientação a objetos utilizamos uma lógica bem próxima do mundo real, lidando com objetos, estruturas que já conhecemos e sobre as quais possuímos uma grande compreensão.

OO é sigla para orientação a objetos

O paradigma orientado a objetos tem uma grande preocupação em esconder o que não é importante e em realçar o que é importante. Nele, implementa-se um conjunto de classes que definem objetos. Cada classe determina o comportamento (definido nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento entre eles.

Esse é o paradigma mais utilizado em aplicações comerciais e as principais linguagens o implementam: C#, Java, PHP, Ruby, C++, Python etc.

Lógica Orientada a Objetos Completo
Curso de Lógica Orientada a Objetos Completo
CONHEÇA O CURSO

Paradigma orientado a eventos

Toda linguagem que faz uso de interface gráfica é baseada nesse paradigma. Nele, o fluxo de execução do software é baseado na ocorrência de eventos externos, normalmente disparados pelo usuário.

Por exemplo, imagine essa interface gráfica:

Imagem de uma interface gráfica

O usuário, ao interagir, decidirá em qual momento digitar, clicar no botão de “salvar” etc. Essas decisões dispararão eventos. O usuário é, então, o responsável por quando os eventos acontecerão, de tal forma que fluxo do programa fica sensivelmente atrelado à ocorrências desses eventos.

Linguagens de programação que fazem uso de paradigma: Delphi, Visual Basic, C#, Python, Java etc.

Concluindo

Os paradigmas não se restringem aos que aqui vimos ou ao o que conceituamos. Nenhum, por si só, deve ser considerado um “santo graal” da solução efetiva e definitiva para todos os problemas. Cada qual tem sua aplicação e pode ser utilizado dependendo da necessidade do software. É comum aplicações de linguagens multi paradigmas utilizarem mais de um, inclusive. Errado, certo … Você sabe, são só questões de perspectiva!

Até a próxima! 🙂

Formação:
CONHEÇA A FORMAÇÃO