Olá, aluno(a)! Vamos continuar nossa viagem pelo mundo dos algoritmos? Até agora, vimos os primeiros conceitos de “Portugol”, que é a linguagem de pseudocódigo que estamos aprendendo. Vimos como deve ser estruturado um algoritmo, assim como também o funcionamento das variáveis e das constantes.
Nesta aula, você estudará as expressões e os operadores que podemos utilizar em nossos algoritmos. Precisamos destes conceitos para realizar operações matemáticas e também para realizar avaliações lógicas. Na disciplina de lógica você aprendeu a utilizar operadores, como e, ou, se e somente se, agora, apresentarei para você como utilizar esses operadores para criar algoritmos utilizando condicionais que permitem alterar o fluxo do algoritmo.
Por fim, nesta aula, também conhecerá uma técnica muito útil chamada teste de mesa, que permite que possamos testar os nossos algoritmos para verificar se eles estão retornando como saída o resultado esperado.
No dia a dia como programador(a), você notará que, inevitavelmente, teremos que lidar com operações matemáticas e expressões lógicas, porém não se assuste, na maioria dos casos, não são operações complexas. Entretanto, tanto para descrever uma operação simples como uma complexa, primeiro você deve saber como utilizar cada operador disponível na linguagem de programação que você estará programando. Existem três tipos básicos de operadores, são eles: operadores aritméticos, relacionais e lógicos. Vamos conhecer cada um deles?
Considere que você é um programador(a) e deve criar um algoritmo que retorna a média aritmética das notas de determinado aluno. Você sabe que, nesta escola, para cada trimestre, são aplicadas três provas. Sendo assim, podemos descrever o nosso algoritmo utilizando a técnica narrativa da seguinte forma:
1 - Receba as notas das três provas.
2 - Some as três notas.
3 - Divida o resultado por três.
4 - Exiba o resultado.
Poderíamos, também, representar este algoritmo utilizando um fluxograma, conforme apresenta a Figura 1. No fluxograma, as notas são representadas por n1, n2 e n3.
Figura 1 - Fluxograma / Fonte: o autor.
#PraCegoVer: a figura ilustra um fluxograma, na horizontal, do algoritmo de média aritmética. A imagem inicia com um retângulo com as bordas arredondadas que indica o início do algoritmo, uma seta logo abaixo conecta o retângulo com um paralelogramo, que indica a entrada dos dados, dentro do paralelogramo, temos as variáveis n1, n2 e n3. O símbolo anterior é ligado por uma seta a um retângulo, que indica o símbolo de processamento de dados, no caso, a soma das entradas n1 + n2 + n3 dividido por 3. Logo abaixo, ligado pela seta, temos outro paralelogramo indicando o resultado. Por fim, temos um retângulo arredondado indicando o fim do algoritmo.
Com os conhecimentos que adquiriu até aqui, você consegue representar este algoritmo em pseudocódigo? Caso a sua resposta seja não, fique tranquilo(a) que aprenderá nesta aula.
Para realizar cálculos em algoritmos, precisamos identificar as operações matemáticas e seus operadores. Os operadores aritméticos definem as operações que podem ser realizadas sobre números inteiros e reais (ADITYA, 2017). O Quadro 1 apresenta os operadores aritméticos presentes no “portugol”.
Quadro 1 - Operadores Aritméticos / Fonte: o autor.
#PraCegoVer: o quadro apresenta 3 colunas e 8 linhas. Na primeira linha, em negrito, temos, na primeira coluna, operação, na segunda, operador e, na terceira, exemplo. Na linha 2, na primeira coluna, adição, na segunda, o símbolo de +, na terceira, A + B. Na linha 3, na primeira coluna, subtração, na segunda, o símbolo de -, na terceira, A - B. Na linha 4, na primeira coluna multiplicação, na segunda o símbolo de *, na terceira, A * B. Na linha 5, na primeira coluna, divisão, na segunda, o símbolo de /, na terceira, A / B. Na linha 6, na primeira coluna, divisão inteira, na segunda, o símbolo de \, na terceira, A \ B. Na linha 7, na primeira coluna, resto da divisão, na segunda, o símbolo de %, na terceira, A % B. Na linha 8, na primeira coluna, potência, na segunda, o símbolo de ^, na terceira, A ^ B.
Com os operadores apresentados, podemos escrever diferentes expressões aritméticas que envolvem variáveis e constantes.
Qual o resultado da operação aritmética: 2 + 2 / 4?
Desconsiderando qualquer regra de procedência, podemos dizer que a resposta é igual a 1, se avaliarmos primeiro 2 + 2 e, depois 4 / 4. Ou podemos dizer que o resultado é 2.5 se avaliarmos 2 / 4 primeiro e, depois, 2 + 0.5. Os dois resultados são válidos se não forem levadas em consideração as regras de precedência. No entanto isso causa uma ambiguidade, e como não podemos permitir estas ocorrências em algoritmos, são definidas algumas regras para determinar em que ordem os operadores aritméticos devem ser avaliados.
O operador com maior nível de precedência deve ter a sua avaliação realizada primeiro. A seguir apresentamos a procedência dos operadores em ordem decrescente:
● ( ) - Os parênteses estão no nível mais alto de procedência. Sendo assim utilizamos os parênteses para definir qual operação desejamos que sejam avaliadas primeiro. Caso existam parênteses aninhados, os mais internos são avaliados primeiro.
● *, / , % - Estão na segunda posição em ordem de procedência.
● +, - São os operadores de menor precedência, sendo assim os últimos a serem avaliados.
OBSERVE: se a precedência dos operadores é igual, utilizamos a associatividade para determinar qual operação é realizada primeiro. Conhecendo esses operadores, já somos capazes de escrever o algoritmo que foi apresentado no case em pseudocódigo. Vamos ver como fica?
Queremos descrever um algoritmo que recebe três notas e retorna à média aritmética.
VARIÁVEIS
n1, n2, n3, resultado: Real
INÍCIO
ESCREVA (“Entre com a primeira nota:”)
LEIA (n1)
ESCREVA (“Entre com a segunda nota:”)
LEIA (n2)
ESCREVA (“Entre com a terceira nota:”)
LEIA (n3)
resultado <- (n1 + n2 + n3)/3
ESCREVA (“A média é: “, resultado)
FIM
Vamos analisar linha a linha:
Linhas 1 e 2: temos a abertura do bloco de declaração de variáveis, onde instanciamos quatro variáveis (n1, n2, n3, resultado) do tipo real que receberá as notas. Utilizamos o tipo real, pois as notas podem ser números com porção fracionária.
Linha 3: abertura do bloco do algoritmo.
Linhas 4 a 9: realizamos as operações de solicitação das notas e guardamos o valor nas variáveis por meio do comando LEIA.
Linha 10: realizamos o cálculo da média aritmética, que é dado pela soma das notas dividida pela quantidade de notas, e armazenamos o resultado na variável resultado. Observe que, primeiro, calculamos os valores que estão entre parênteses, e, depois, realizamos a divisão, seguindo as regras de procedência.
Linha 11: apresenta o resultado.
Linha 12: fim do algoritmo.
IMPORTANTE: como alerta Olsen (2005), alguns operadores aritméticos precisam que a variável que receberá o valor da operação tenha um tipo específico:
Para os operadores / e ^ , o resultado sempre será real.
Para os operadores \ e % , o operando deve ser inteiro, e o resultado será inteiro, no entanto, o resultado poderá ser atribuído a uma variável real.
Na disciplina de lógica, você aprendeu métodos de indução e como utilizar e interpretar os conectivos lógicos. No desenvolvimento de algoritmos, estes conectores serão muito utilizados, sendo assim, precisamos aprender como representá-los. O Quadro 2 apresenta os operadores lógicos.
Quadro 2 - Operadores lógicos / Fonte: o autor.
#PraCegoVer: quadro com 3 colunas e 3 linhas. Na primeira linha, em negrito, temos, na primeira coluna, operação, na segunda, operador e, na terceira, exemplo. Na linha 2, na primeira coluna, “e”, na segunda, o símbolo “&&”, na terceira, “A && B”. Na linha 3, na primeira coluna, “ou”, na segunda, o símbolo “||”, na terceira, ‘A || B”. Na linha 4, na primeira coluna, “não”, na segunda, o símbolo “!”, na terceira “!A”.
Operador && - utilizamos para conectar duas expressões, de modo que as duas precisam ser verdadeiras para resultar em verdade.
Operador || - resulta em verdade se alguma das duas expressões é verdadeira.
Operador ! - negação da expressão, invertendo o valor lógico dela.
Além de saber como estruturar algoritmos, precisamos saber testar para verificar se ele está retornando os resultados esperados. Para testar o pseudocódigo, utilizamos uma técnica chamada teste de mesa, que consiste em uma simulação da execução de um algoritmo de forma manual, normalmente, feita em papel.
Sobre testes de mesa, Forbellone (2005) indica que não existe um conjunto de regras rígidas, precisamos apenas simular a execução do algoritmo linha a linha. Normalmente, montamos uma tabela com as variáveis, e, então, vamos preenchendo a tabela atualizando os valores das variáveis, conforme a execução do algoritmo. Por exemplo, vamos testar o algoritmo de somar dois números:
VARIÁVEIS
a, b, resultado: inteiro
INÍCIO
a <- 5
b <- 2
resultado <- a + b
escreva (resultado)
FIM
Inicialmente, ao executar as linhas 1 e 2, temos as nossas variáveis vazias, então, temos:
Quadro 3 - Teste de mesa estado inicial / Fonte: o autor.
#PraCegoVer: quadro com 2 colunas e 4 linhas. Na primeira linha, em negrito, temos, na primeira coluna, variáveis, na segunda, valores. Na linha 2, na primeira coluna, a, na segunda, 0. Na linha 3, na primeira coluna, b, na segunda, 0. Na linha 4, na primeira coluna, resultado, na segunda, 0.
Ao executar a linha 4, o valor da variável a é atualizado. Desta forma, devemos atualizar nossa tabela:
Quadro 4 - Teste de mesa estado 2 / Fonte: o autor.
#PraCegoVer: quadro com 2 colunas e 4 linhas. Na primeira linha, em negrito, temos, na primeira coluna, variáveis, na segunda, valores. Na linha 2, na primeira coluna, a, na segunda, 5. Na linha 3, na primeira coluna, b, na segunda, 0. Na linha 4, na primeira coluna, resultado, na segunda 0.
Na linha 5, a variável b tem o valor 2 armazenado, então, atualizaremos nossa tabela.
Quadro 5 - Teste de mesa estado 3 / Fonte: o autor.
#PraCegoVer: quadro com 2 colunas e 4 linhas. Na primeira linha, em negrito, temos, na primeira coluna, variáveis, na segunda, valores. Na linha 2, na primeira coluna, a, na segunda, 5. Na linha 3, na primeira coluna, b, na segunda, 2. Na linha 4, na primeira coluna, resultado, na segunda, 0.
Na linha 6, é realizada a soma de a + b e, então, armazenado o resultado na variável resultado. Atualizando a tabela, temos:
Quadro 6 - Teste de mesa estado final / Fonte: o autor.
#PraCegoVer: quadro com 2 colunas e 4 linhas. Na primeira linha, em negrito, temos, na primeira coluna, variáveis, na segunda, valores. Na linha 2, na primeira coluna, a, na segunda, 5. Na linha 3, na primeira coluna, b, na segunda, 2. Na linha 4, na primeira coluna, resultado, na segunda, 7.
Por fim, o resultado é escrito na tela, e a execução finalizada. Note que a tabela que representa as nossas variáveis está preenchida com os valores esperados, isso indica que o algoritmo está correto.
Nesta aula, você aprendeu os tipos de operadores aritméticos e lógicos que podemos utilizar em “portugol”. Com estes conceitos você pode criar algoritmos cada vez mais complexos, então, agora, vamos colocar este conhecimento em prática?
1. Desenvolva um algoritmo para calcular x ^ y. Os valores de x e y serão fornecidos pelo usuário do programa.
2. Desenvolva um algoritmo para calcular a média entre 4 valores fornecidos pelo usuário.
Após escrever estes dois algoritmos, realize o teste de mesa para verificar se eles estão corretos.
ADITYA, B. Entendendo Algoritmos: um guia ilustrado para programadores e outros curiosos. Novatec Editora, 2017.
OLSEN, A. L. Using pseudocode to teach problem solving. Journal of Computing Sciences in Colleges, v. 21, n. 2, p. 231-236, 2005.
FORBELLONE, A. L. V.; EBERSPÄCHER, H. F. Lógica de programação: a construção de algoritmos e estruturas de dados. 3. ed. São Paulo: Pearson Universidades, 2005.