NOTAS DE AULA
PROGRAMAÇÃO I
23 de março de 2020
Prof. Maurício Massaru Arimoto
UENP
1
2
Sumário
1 O que é programação? 3
2 Algoritmos 3
3 Algoritmos Computacionais 5
3.1 Representação de Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2 Eficácia e Eficiência de Algoritmos . . . . . . . . . . . . . . . . . . . . . . . 9
4 Função do Computador 10
5 Elementos Básicos da Linguagem 12
5.1 Identificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
5.2 Palavras Reservadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.3 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.4 Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.5 Expressões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
6 Algoritmos Sequenciais 18
6.1 Comandos de Entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6.2 Comandos de Saída . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6.3 Comandos de Atribuição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
6.4 Fluxograma de Algoritmos Sequenciais . . . . . . . . . . . . . . . . . . . . . 23
6.5 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.6 Exercícios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
7 Estruturas de Decisão/Seleção 27
7.1 Comando de Decisão Simples . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
7.2 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
7.3 Comando de Decisão Dupla . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.4 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
7.5 Comando de Decisão Múltipla . . . . . . . . . . . . . . . . . . . . . . . . . . 36
7.6 Comando Caso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
7.7 Decisões Aninhadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
7.8 Exercícios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3
1 O que é programação?
Segundo a Sociedade Brasileira de Computação (SBC) (RAABE, 2017), é difícil imaginar
uma sociedade na qual os indivíduos não necessitem de habilidades e conhecimentos
básicos de Computação, tão importantes para a vida na sociedade contemporânea quanto
os conhecimentos básicos de Matemática, Física, ou outras ciências.
A programação de computadores se insere nesse contexto, sendo uma das habilidades
básicas de todo cientista ou engenheiro da computação. Ela exerce um papel fundamen-
tal na formação dos estudantes, abordando princípios de lógica e programação que visam
desenvolver a capacidade de análise e de resolução de problemas. Basicamente, a progra-
mação consiste em criar soluções para problemas diversos e fazer com que o computador
execute-as de forma automatizada.
Programas de computadores são criados (ainda) por seres humanos, que utilizam a
capacidade de raciocínio para gerar soluções para os problemas propostos. No entanto, o
raciocínio é algo intangível.
Neste sentido, a lógica de programação é uma ferramenta para transformar esse ra-
ciocínio abstrato em algo que possa ser transformado em programa de computador. Na
programação a lógica pode ser entendida como o modo corerente com que organizamos
as ideias para resolver um problema.
Um computador só entende o que deve fazer se receber instruções claras, bem definidas
e em ordem correta. Computadores (ainda) não são programáveis em linguagem natural,
pois esta é sujeita a ambiguidades e imprecisões. A lógica de programação tem o objetivo
de estabelecer uma sequência lógica de passos que devem ser executados por um programa
de computador. Essa sequência costuma ser chamada de algoritmo.
2 Algoritmos
Para criarmos um programa de computador para realizar uma determinada tarefa, deve-
mos ser capazes de construir algoritmos. Um algoritmo é um conjunto de instruções, bem
definido (sem ambiguidades), para a solução de um problema dentro de um determinado
contexto em tempo finito.
Um exemplo clássico de algoritmo é o processo de troca de uma lâmpada queimada,
cujos passos seriam:
1. Pegar a escada;
4
2. Posicionar a escada embaixo da lâmpada;
3. Buscar a lâmpada nova;
4. Retirar a lâmpada velha;
5. Colocar a lâmpada nova.
Agora, imagine o seguinte problema: de um lado do rio temos um homem, uma raposa,
uma galinha e um milho. O objetivo é transportar todos eles para outro lado. Para isso,
existe uma canoa, mas o homem só pode transportar um por vez. Além disso, a raposa
não pode ficar sozinha com a galinha, pois a raposa comerá a galinha. Ainda, se a galinha
ficar sozinha com o milho, o milho será devorado.
Qual é a sequência de instruções necessárias para que esse problema seja resolvido?
A Tabela 1 apresenta uma possível solução para esse problema, demonstrado passo a
passo todas as ações/instruções necessárias para transportar todos com segurança para
o outro lado do rio. Essa sequência de ações constitui um algoritmo.
Cabe ressaltar que na Tabela 1 todos os itens são representados pelas suas letras
iniciais, ou seja, o homem (H), a raposa (R), a galinha (G) e o milho( M).
Tabela 1: Solução para o problema proposto
Passo Esquerda Direita Descrição
0 HRGM Estado inicial
1 RM HG Leve a galinha para outro lado
2 HRM G Volte sozinho
3 M HRG Leve a raposa para outro lado
4 HGM R Volte com a galinha
5 G HRM Leve o milho para o outro lado
6 HG RM Volte sozinho
7 HRGM Leve a galinha para outro lado
Os exemplos supracitados são solucionados seguindo uma sequência de ações bem
definidas, que devem ser executadas em uma determinada ordem. Outras aplicações
de nosso dia a dia podem ser detalhadas de forma semelhante: o acesso a terminais
eletrônicos de bancos, a troca do pneu de um carro, etc.
Além dos algoritmos usados para resolver problemas do dia a dia, podemos desenvolver
algoritmos que podem ser transformados em programas e executados em computadores.
Este texto concentra-se em problemas resolvidos através de algoritmos que podem ser
integralmente executados por computadores.
5
3 Algoritmos Computacionais
Imagine que você queira fazer uma comprar online em algum site disponível. Neste caso:
• Um algoritmo vai analisar suas atividades e recomendar coisas para comprar.
• Um algoritmo irá verificar seu cartão de crédito.
• Um algoritmo irá identificar a maneira mais eficiente de entregar o produto na sua
casa.
Agora, imagine que você desistiu de comprar pela Internet. Mesmo assim, pode existir
um algoritmo para maximizar as vendas colocando os produtos na prateleira de maneira
diferenciada.
Na Computação tudo vira algoritmos!
Os algoritmos computacionais diferem de outros algoritmos pois são propostos para
serem executados por computador. Eles auxiliam o desenvolvedor na concepção da solu-
ção de um problema, independentemente da linguagem de programação a ser utilizada
na sua construção.
Um algortimo, quando programado em um computador, é constituído basicamente
por três partes:
1. Entrada de dados;
2. Processamento de dados;
3. Saída de dados.
Analisando o problema aqui colocado, para obter a média de quatro provas de um
aluno, temos como:
1. Entrada de dados: as quatros notas de provas de um aluno obtidas via teclado, por
exemplo;
2. Processamento de dados: soma das quatro notas e o respectivo cálculo da média
das notas;
3. Saída de dados: resultado da média calculada e mostrada na tela, por exemplo.
6
Algumas premissas básicas para a construção de algoritmos incluem:
• Definir ações claras e precisas (não-ambíguas);
• Organizar as ações de forma ordenada (lógica); e
• Estabelecer as ações dentro de uma sequência finita de passos (previsível).
Além disso, existem algumas diretrizes para a construção de algoritmos:
• Identificação e análise detalhada do problema a ser resolvido;
• Identificação das entradas do sistema (quais informações serão fornecidas);
• Identificação das saídas do sistema: quais informações deverão ser geradas/calculadas;
• Definção dos passos a serem realizados: sequência de ações que leve à solução do
problema (transformar entradas em saídas);
• Concepção do algoritmo: registrar a sequência de comandos, usando uma notação
(por exemplo, pseudolinguagem/pseudocódigo); e
• Teste da solução proposta: execução manual de cada passo do algoritmo para de-
tectar erros (por exemplo, realizando um teste de mesa).
3.1 Representação de Algoritmos
A descrição de um algoritmo de forma clara e fácil de ser seguida ajuda no seu desenvolvi-
mento, depuração (localização e correção de erros) e futura migração para uma linguagem
de programação. Existem várias maneiras de escrever ou representar um algoritmo, den-
tre elas a descrição narrativa, o fluxograma e o pseudocódigo ou pseudolinguagem.
Descrição Narrativa
A descrição narrativa consiste em analisar o problema e escrever em linguagem natural os
passos a serem seguidos para resolvê-lo. Utilizamos a abordagem de descrição narrativa
para introduzir o conceito de algoritmo nos exemplos apresentados na Seção 2.
7
Um ponto positivo desta abordagem é que não é necessário aprender novos conceitos.
Por outro lado, ela abre espaço para várias interpretações pois é imprecisa, dificultando
a transcrição do algoritmo para um programa.
Analisando o problema para obter a média de 4 notas de provas de um aluno, preci-
samos realizar basicamente quatro operações na ordem a seguir:
• Passo 1: receber as notas das quatro provas.
• Passo 2: somar as notas das provas.
• Passo 3 calcular a média das notas das provas.
• Passo 4: mostrar o resultado obtido das notas das provas.
Fluxograma
A representação de algoritmos por meio de fluxograma permite analisar o problema e
escrever, usando símbolos gráficos, os passos a serem seguidos para sua resolução.
A vantagem de utilizar esta abordagem é que o entendimento de elementos gráficos
é mais simples que o entendimento de textos. No entanto, o algoritmo resultante de um
fluxograma não é detalhado. Isso dificulta sua transcrição para um programa. Além
disso, não é adequado para algoritmos muito extensos, com grande quantidade de ações
a serem executadas.
Na Figura 1 apresenta-se um exemplo do uso de fluxograma na representação do
algoritmo para o cálculo da média de quatro notas de provas de um aluno. Cada
ação/comando é representado por um bloco, sendo os blocos interligados por linhas diri-
gidas (setas) que representam o fluxo de execução. Cada forma de bloco representa uma
ação.
Pseudocódigo ou Pseudolinguagem
Um pseudocódigo geralmente é bastante próximo a uma linguagem de programação, mas
sem entrar em detalhes como, por exemplo, formatação de informações de entrada e de
saída. Consiste em analisar o problema e escrever, por meio de regras predefinidas, os
passos a serem seguidos para sua resolução.
A vantagem de utilizar esta abordagem é a representação clara sem as especificações
de linguagem de programação. Além disso, a tradução para qualquer linguagem de pro-
gramação é mais simples. No entanto, as regras do pseudocódigo precisam ser aprendidas
pelo utilizador.
8
Figura 1: Fluxograma: média das notas das provas
A sintaxe geral para representação de um algoritmo na forma de pseudocódigo é
apresentada a seguir.
Algoritmo <nome_algoritmo>
<declaração_variáveis>
Início
<bloco_instruções>
Fim
Em que:
• Algoritmo e <nome_algoritmo>: indica o início definição de um algoritmo em
forma de pseudocódigo, seguido de nome simbólico dado ao algoritmo com a finali-
dade de distingui-los dos demais.
• <declaração_variáveis>: corresponde às entradas do programa com as variáveis
a serem utilizadas para armarzenar os dados manipulados.
• Início e Fim: delimita respectivamente o início e o término do bloco de instruções
do corpo do algoritmo.
9
• <bloco_instruções>: corresponde ao processamento do algoritmo com todas as
instruções necessárias, incluindo a leitura da entradas, os cálculos feitos e a demons-
tração dos resultados.
Um exemplo de um pseudocódigo é apresentado a seguir para o problema do cálculo
da média das notas das provas de um aluno.
Algoritmo 1: MediaNotas
1 var n1, n2, n3, n4: real
2 var media: real
3 início
4 leia (n1, n2, n3, n4)
5 media ← (n1 + n2 + n3 + n4)/ 4
6 escreva (media)
7 fim
3.2 Eficácia e Eficiência de Algoritmos
Durante a construção de um algoritmo executado por computador, dois aspectos de qua-
lidade devem ser considerados (Edelweiss e Livi, 2014):
1. Eficácia (corretude, exatidão): um algoritmo deve exercer corretamente a tarefa
para a qual foi proposto. Além disso, o algoritmo deve fornecer resultados corretos
para quaisquer que sejam os dados fornecidos como entrada. A eficácia de um
algoritmo deve ser exaustivamente testada antes que ele seja implementado em um
computador. A abordagem mais simples de testar um algoritmo é por meio de um
“teste de mesa”, no qual se simula em papel sua execução, usando um conjunto
diferentes de dados de entrada.
2. Eficiência: Em geral, a solução de um problema não é única, podendo ser cons-
truídos diferentes algoritmos para resolvê-los. Entretanto, em alguns casos não se
pode dizer a priori qual a melhor solução. Neste caso, pode-se calcular qual a forma
mais eficiente, com base em dois critérios: tempo de execução e espaço de memória
ocupado.
Um exemplo da diferença entre eficácia e eficiência pode ser observado na receita de ovo
mexido mostrada a seguir (Edelweiss e Livi, 2014):
10
1. Ligar o fogão em fogo baixo;
2. Separar 1 ovo, 1 colher de sobremesa de manteiga e sal a gosto;
3. Quebrar o ovo em uma tigela e colocar sal na tigela;
4. Misturar levemente o ovo e o sal, com um garfo;
5. Aquecer a manteiga na frigideira até que comece a derreter;
6. Jogar o ovo na frigideira, mexendo com uma colher até ficar firme;
7. Retirar da frigideira e servir.
Se analisarmos o algoritmo citado, obseva-se que embora o ovo mexido seja obtido,
garantindo a eficácia da receita, existe uma clara ineficiência em relação ao gasto de gás,
uma vez que ligar o fogão não é pré-requisito para a quebra do ovo e mistura do ovo e
do sal. Se modificarmos apenas a sequência das ações, conforme indicado abaixo, então
teremos um algoritmo eficaz e mais eficiente:
1. Separar 1 ovo, 1 colher de sobremesa de manteiga e sal a gosto;
2. Quebrar o ovo em uma tigela;
3. Colocar sal nesta tigela;
4. Misturar levemente o ovo e o sal, com um garfo;
5. Ligar o fogão em fogo baixo;
6. Aquecer a manteiga na frigideira até que comece a derreter;
7. Jogar o ovo na frigideira, misturando com uma colher até ficar firme;
8. Retirar da frigideira e servir.
4 Função do Computador
Na Figura 2 (Tocci, Widmere e Moss, 2019) é apresentada uma arquitetura típica de
um computador com os dispositivos de entrada e saída, memórias, e a UCP (Unidade
Central de Processamento), composta pela ULA (Unidade Aritmética e Lógica), pela UC
(Unidade de Controle), além de registradores de armazenamento temporário.
Os computadores usam a memória principal para guardar:
11
Figura 2: Arquitetura de um computador (Tocci, Widmere e Moss, 2019
• As informações que serão executadas pela UCP;
• As informações que estão sendo acessadas muitas vezes; e
• Os valores dos programas que estão sendo executados naquele momento.
O processador, também chamado de Unidade Central de Processamento – UCP, é um
componente essencial para o funcionamento do sistema computacional. Ele é responsável
pela execução de todas as instruçoões dos programas armazenados na memória principal e
o processamento de operações lógicas e aritméticas, devolvendo os resultados apropriados
para uso dos usuários do sistema. Essas instruções primitivas são denominadas instruções
de máquina e, quando agrupadas, formam os programas.
A UCP realiza constantemente as seguintes tarefas (Stallings, 2010):
• Buscar instrução: o processador busca na memória a instrução a ser executada.
• Interpretar a instrução: a instrução é decodificada para determinar a ação que deve
ser executada.
• Obter os dados: a execução da instrução pode necessitar da leitura de dados da
memória ou dos dispositivos de entrada.
12
• Processar os dados: a execução da instrução pode necessitar de alguma operação
aritmética ou lógica com os dados.
• Gravar os dados: a execução da instrução pode requerer a gravação dos dados na
memória ou em um dispositivo de saída.
Todas as operações lógicas e aritméticas são realizadas na ULA de um computador.
O objetivo principal de uma ULA é receber dados binários armazenados na memória e
executar operações aritméticas e lógicas sobre eles, de acordo com instruções provenientes
da UC.
A UC tem como função dirigir e coordenar as atividades das demais unidades do
sistema. A UC é responsável pela busca das instruções na memória principal, sua deco-
dificação e execução (Tocci, Widmere Moss, 2019):
• Busca da instrução que será executada, armazenando-a em um registrador da UCP;
• Interpretação das instruções a fim de saber quais operações deverão ser executadas
pela ULA (ex.: soma, subtração, comparação) e como realizá-las;
• Geração de sinais de controle apropriados para a ativação das atividades necessárias
à execução da instrução identificada. Esses sinais de controle são enviados aos
diversos componentes do sistema, sejam eles internos à UCP (ex.: a ULA) ou
externos (ex.: memória e dispositivos de entrada e saída).
5 Elementos Básicos da Linguagem
5.1 Identificadores
Identificadores são palavras criadas pelo desenvolvedor para denominar o próprio pro-
grama ou elementos dentro do mesmo, tais como identificadores para as variáveis do
programa. Toda linguagem de programação define regras específicas para a formação de
identificadores, para que eles possam ser reconhecidos pelo computador.
No pseudocódigo utilizado neste texto, identificadores válidos devem sempre começar
com:
• Letras combinadas com digitos, e o caractere “_” (espaços, pontos ou outros sím-
bolos não são permitidos).
Já os identificadores inválidos incluem:
13
• Caracteres especiais (\, *, #, etc.)
• Palavras reservadas usadas no pseudocódigo (Início, Fim, Se, Entao, Senão, etc.)
Exemplos de identificadores válidos no pseudocódigo:
• numero, num, num2;
• mediaNotas, media_notas;
• a7b22.
5.2 Palavras Reservadas
As palavras rervadas são identificadores que têm um significado especial no pseudocódigo,
representando comandos e operadores, ou identificando subprogramas já embutidos no
pseudocódigo. Conforme citado anteriormente, as palavras reservadas não podem ser
usadas como identificadores definidos pelo desenvolvedor.
Algumas palavras reservadas definidas no pseudocódigo são:
• Início e fim;
• Se, Então;
• Escreva, leia;
• Enquanto, faça;
• Para, faça.
5.3 Comentários
Comentários são recursos oferecidos pelas linguagens que permitem, por exemplo, a in-
clusão de esclarecimentos do que foi feito no algoritmo e como foi feito. Dessa forma,
eles servem para documentar e facilitar o entendimento do algoritmo. Os comentários
são identificados e delimitados por símbolos especiais e podem ser quaisquer sequência
de caracteres. Na pseudolinguagem, os comentários são delimitados pelos símbolos e ,
por exemplo:
{Este é um exemplo de comentário em pseudocódigo}.
14
5.4 Variáveis
Conforme vimos na Seção 4, a UCP é a nossa processadora de instruções. Para isso, ela
manipula os dados que estão armazenados na memória principal.
Para utilizar um determinado espaço de memória usamos o conceito de váriável. Uma
variável representa um espaço de memória identificado e resevado para guardar um valor
durante o processamento. Ressalta-se que somente um valor pode estar armazenado
na variável em um determinado momento. Caso seja definido um novo valor para uma
variável, o anterior será perdido.
Nenhuma variável pode ser usada sem antes ter sido declarada. Para a sua declaração,
temos a seguinte sintaxe:
<identificador>:<tipo_dados>
Em que:
• <identificador> corresponde ao nome dado ao espaço de memória a ser reservado
(variável);
• <tipo_dado> corresponde ao tipo que a variável pode armazenar.
Os tipos de dados são classificados de acordo com os valores que podem armazenar:
• Tipo de dados simples ou primitivos: numérico, alfanuméricos, lógicos ou booleanos
e ponteiros.
• Tipos de dados compostos: arranjos, registros, enumerações, conjuntos e arquivos.
Inicialmente, nesse texto serão analisados somentes os três primeiros tipos de dados
simples. No pseudocódigo, os nomes dados aos tipos de dados simples são:
• Inteiros e reais para valores numéricos;
• Caractere e strings para valores alfanuméricos;
• Lógico para valores lógicos ou booleanos.
Exemplos de declarações de variáveis usando os tipos definidos:
• var numero: inteiro ou numero (inteiro);
• var numero: real ou numero (real);
15
• var letra: caractere ou letra (caractere);
• var palavra: string ou palavra (string).
Nos exemplos citados, usamos a palavra var para indicar explicitamente que estamos
definindo uma variável.
O tipo de dado inteiro é usado para armazenar somente valores numéricos inteiros.
Por exemplo:
• -100, -9, 2, 27, 150.
O tipo de dado real é usado para armazenar somente valores númericos fracionários.
Por exemplo:
• 3.1415, -234.46, 45.15.
O tipo de dado caractere é usado para armazenar somente um caractere alfanumérico,
utilizando a codificação de caracteres ASCII, que representa qualquer caractere em 8 bits.
Por exemplo:
• ’a’, ’A’, ’@’, ’1’.
O tipo de dado string é usado para armazenar somente cadeias de caracteres alfanu-
méricos. Por exemplo:
• ’"Ze Povinho", "A12B3", "a@b", "9134-330/1".
O tipo de dado lógico é usado para variáveis quem podem armazenar somente um dos
dois valores lógicos: verdadeiro (1) ou falso (0).
5.5 Expressões
No exemplo apresentado na Seção 3 foram realizadas algumas operações que envolvem cál-
culos de expressões aritméticas. Ao escrever o programa correspondente àquele exemplo,
as expressões devem ser escritas de forma que sejam entendidas corretamente.
Expressões Aritméticas
Expressões aritméticas são expressões cujo resultados são valores numéricos, inteiros ou
fracionários. A sintaxe de uma expressão aritmética é:
16
<operando> <operador_aritmético> <operando>.
No pseudocódigo utilizado neste texto, os operadores que podem ser usados em expressões
aritméticas são os mesmos utilizados em expressões aritméticas comuns. Mas, da mesma
forma que nas linguagens de programação, o símbolo utilizado para a multiplicação é o
asterisco (*) e o símbolo usado para a divisão é a barra invertida (\). A Tabela 2 mostra
os operadores que podem ser utilizados em expressões aritméticas, na forma adotada pela
pseudocódigo.
Cabe ressaltar que, assim como na Matemática, os operadores aritméticos têm diferen-
tes precedências na execução das operações: primeiro são calculada as potências, depois
as multiplicações e as divisões e, no final, as somas e as subtrações. Expressões com
operadores de mesma precedência justapostos são avaliadas da esquerda para a direita.
Essa ordem de precedência pode ser alterada através do uso de parênteses.
Tabela 2: Operadores aritméticos no pseudocódigo
Operador Significado Exemplo
+ Soma a +b
- Subtração a -b
* Multiplicação a *b
Divisão a b
** Potência a ** b
Div Divisão inteira a div b
Mod ou % Resto da divisão inteira a %b
Expressões Lógicas
Expressões lógicas são aquelas que têm como resultado valores lógicos, ou seja, um dos
dois valores: verdadeiro ou falso. Os operadores relacionais utilizados no pseudocódigo
para expresões lógicas são apresentados na Tabela 3.
Os operadores lógicos comparam valores lógicos, resultando em verdadeiro ou falso.
Na Tabela 4. estão os operadores lógicos usualmente empregados e, ou, nou e o operador
de negação não.
A Tabela 5 apresenta os resultados produzidos por cada operador lógico de acordo
com os resultados das expressões lógicas A e B, representado V o valor lógico verdadeiro
e F o valor lógico falso.
17
Tabela 3: Operadores relacionais no pseudocódigo
Operador Significado Exemplo
= Igual a =b
6= Diferente a 6= b
> Maior a >b
< Menor a <b
≥ Maior ou igual a ≥b
≤ Menor ou igual a ≤b
Tabela 4: Operadores lógicos no pseudocódigo
Operador Tipo Significado
e Binário Verdadeiro se somente ambos os operandos
são verdadeiros
ou Binário Verdadeiro se um dos operandos for verda-
deiro
nou Binário Verdadeiro se apenas um dos operandos for
verdadeiro
não Unário Verdadeiro se o operando for falso, falso se
o operando for verdadeiro
Tabela 5: Tabela verdade: operadores lógicos
A B AeB A ou B A nou B não A
F F F F F V
F V F V V V
V F F V V F
V V V V F F
No pseudocódigo a ordem de precedência na avaliação das operações incluídas em uma
expressão lógica é a seguinte: primeiro são realizadas as negações e, depois, são aplicados
os operadores lógicos entre os quais o e tem mairo prioridade, seguido pelos operadores
ou e nou.
Independentemente do conhecimento da ordem de precedência, o uso de parênteses
é recomendado não só porque garante a correta avaliação das expressões, mas também
porque facilita o entendimento do que está sendo executado.
18
6 Algoritmos Sequenciais
Nessa seção, os elementos introduzidos são utilizados na escrita de programas a partir
de algoritmos puramente sequenciais. Esses algoritmos geralmente incluem três etapas:
entrada de dados, processamento dos dados (cálculos, comparações) e saída dos dados
ou apresentação dos resultados. Em problemas mais complexos, tais etapas constituem
a estrutura básica dos algoritmos.
6.1 Comandos de Entrada
Comandos de entrada permitem que um ou mais dados sejam obtidos (lidos) pelo com-
putador a partir de um dispositivo de entrada como, por exemplo, o teclado. Os valores
lidos devem ser armazenados em variáveis na memória para que esses possam ser utiliza-
dos pelo programa. Para isso, o comando de entrada de dados deve, além de solicitar a
operação de leitura, informar os nomes das variáveis que irão armazenar os valores lidos.
No pseudocódigo, o comando de entrada de dados é identificado pela palavra reservada
leia, seguida da lista de variáveis que irão armazenar os valores lidos, as quais aparecem
separadas por vírgulas e entre parênteses:
• leia (<lista de variáveis separadas por vírgula>).
Por exemplo, os comandos:
• leia (n1)
• leia (n1, n2, n3, n4).
No primeiro exemplo, pede que seja lido um valor de entrada e armazenado em n1. No
segundo, pede que sejam lidos quatro valores de entrada, sendo o primeiro armazenado
em n1, o segundo em n2, e assim por diante.
6.2 Comandos de Saída
Comandos de saída são usados para mostrar os resultados que foram solicitados a fim de
que esses sejam vistos pelo usuário, por exemplo, na tela do computador ou utilizados
em futuro processamento.
No pseudocódigo, um comando de saída inicia sempre pela palavra reservada escreva,
seguida pela lista de valores que deverão ser informados, os quais aparecem separados por
vírgulas e entre parênteses:
19
• escreva(<lista de valores de saída separados por vírgula>).
A lista de valores pode conter:
• Nomes das variáveis cujos conteúdos devem ser informados;
• Expressões que serão avaliadas, sendo seu resultado informado na saída;
• Strings formadas por cadeias de caracteres entre apóstrofos.
Por exemplo, os comandos:
• escreva(n1, n2, n3, n4);
• escreva(a * b + 1 / (c * c);
• escreva("Nota 1: ", n1).
No primeiro exemplo, será transferido para a saída o valor contido em n2, depois o
valor contido em n2, e assim por diante. No segundo exemplo, será avaliado a expressão
fornecida (a * b + 1 / (c * c), transferindo apenas o seu resultado para a saída. Já no
terceiro, usamos strings para serem mostrados como saída. No exemplo, n1 é o nome da
variável e Nota 1 a string a ser exibida. Supondo que o valor contido na variável n1 seja
10, a saída produzida será:
• Nota 1: 10;
6.3 Comandos de Atribuição
Os comandos de atribuição são utilizados para armazenar o resultado de uma expressão
a uma variável, ou seja, o resultado é colocado no espaço de memória reservado para esta
variável. Caso já exista um valor na variável, o valor é sobrescrito pelo novo valor, sendo
valor anterior perdido.
No pseudocódigo, um comando de atribuição tem à esquerda o nome da variável que
vai receber o valor, seguido à direita pela expressão cujo valor será utilizado na atribuição:
• variável ← expressão.
Somente um nome de variável pode ser colocado à esquerda em um comando de
atribuição. A execução do comando inicia avaliando a expressão à direita, colocando
depois o seu resultado na variável à esquerda. Por exemplo, no comando:
20
• media ← (n1 + n2 + n3 n4) / 4.
o resultado da expressão (n1 + n2 + n3 n4) / 4 é atribuído à variável media.
O tipo de variável que vai receber a atribuição deve ser compatível com o resultado
da expressão à direita. Dependendo do tipo dessa variável, três tipos de atribuição são
identificados, os quais são analisados a seguir.
Atribuição Numérica
Se a a variável for numérica, o valor da expressão deve ser também um valor numérico.
O tipo do valor a ser atribuído à variável deve ser compatível com o tipo da variável que
vai receber a atribuição. Uma exceção é a atribuição de valores inteiros a valores reais.
Vamos supor que foram declaradas as seguintes variáveis:
• i, k (inteiro)
• x, y (logico)
Atribuições válidas:
• x ← verdadeiro
• x ← y
• x ← i = k
• x ← i > 7 ou y
Atribuições inválidas:
• x ← i
• x ← x > 7
• x ← k + 1
21
Atribuição Lógica
Se a variável à esquerda do comando de atribuição for lógica, ela poderá receber somente
os dois valores lógicos: verdadeiro ou falso.
Vamos supor que foram declaradas as seguintes variáveis:
• i, k (inteiro)
• a, r (real)
Atribuições válidas:
• i ← 10
• i ← k
• i ← k - 2
• i ← i + k - 7
• a ← 10
22
Atribuições inválidas:
• i ← a
• i ← i + a
• i ← a > r
• a + b ← a
Atribuição de Caracteres
Se a variável for do tipo caractere, a expressão à direita deve resultar em um caractere,
se variável for do tipo string, a expressão deve resultar em uma cadeia de caracteres.
Vamos supor que foram declaradas as seguintes variáveis:
• nome (string)
• letra, letra2 (caractere)
Atribuições válidas:
• nome ← "Ana Terra"
• letra ← "Z"
• x ← letra2 = letra
Atribuições inválidas:
• nome ← 10
• letra ←i > 2
• letra ← nome
• letra ← letra + 10
23
6.4 Fluxograma de Algoritmos Sequenciais
Vamos retornar ao exemplo que usamos ao longo do texto: programa que recebe quatro
notas de provas de um aluno e fornece, como saída a média aritmética entre elas. Este é
um exemplo em que usamos um algoritmo puramente sequencial para resolver o problema.
A Figura 3 mostra o fluxograma deste programa, o mesmo apresentado na Seção 3.
Inicialmente são lidas as quatro notas. Em seguida, é efetuado o cálculo da média e
informado ao usuário.
Figura 3: Fluxograma para programas sequenciais
O pseudocódigo do algoritmo desse programa acrescenta as declarações das variáveis
utilizadas, que não aparecem no fluxograma citado.
Algoritmo 2: Media de notas
1 var n1, n2, n3, n4: real
2 var media: real
3 início
4 ler (n1, n2, n3, n4)
5 media ← (n1 + n2 + n3 + n4)/ 4
6 escrever (media)
7 fim
24
6.5 Exercícios de Fixação
1. Faça um algoritmo que recebe os lados de um triângulo, calcule o mostre o seu
perímetro.
Algoritmo 3: Perímetro de um triângulo
1 var a,b,c, perimetro: real
2 início
3 leia (a,b,c)
4 perimetro ← a + b + c
5 escreva ("O perímetro do triângulo é: ", perímetro)
6 fim
2. Faça um algoritmo que recebe a base e a altura de um triângulo, calcule e mostra
a sua área.
Algoritmo 4: Área de um triângulo
1 var base, altura, area: real
2 início
3 leia (base, altura)
4 area ← (base * altura) / 2
5 escreva ("A área do triângulo é: ", area)
6 fim
3. Faça um algoritmo que, dada a massa e altura de uma pessoa, calcule e mostre o
seu IMC.
Algoritmo 5: Calcula o IMC
1 var massa, altura, imc: real
2 início
3 leia (massa, altura)
4 imc ← massa / (altura * altura)
5 escreva (imc)
6 fim
4. Faça um algoritmo que recebe a distância total percorrida (em km) e o total de
25
combustível gasto (em litros), calcule e mostre o comsumo médio de um automóvel.
Algoritmo 6: Consumo médio
1 var distancia_percorrida, consumo_total, consumo_medio: real
2 início
3 leia (distancia_percorrida, consumo_total)
4 consumo_medio ← distancia_percorrida / consumo_total
5 escreva ("O consumo em km/l é: ", consumo_medio)
6 fim
5. Faça um algoritmo que recebe o valor de um depósito e o valor da taxa de juros,
calcule e mostre o valor do rendimento e o valor total depois do rendimento.
Algoritmo 7: Valo de rendimento
1 var deposito, taxa_juros, renda, total: real
2 início
3 leia (deposito)
4 leia (taxa_juros)
5 renda ← deposito * (taxa_juros / 100)
6 total ← deposito + renda
7 escreva ("O valor do rendimento é: ", renda)
8 escreva ("O valor total após o rendimento é: ", total)
9 fim
6. Faça um algoritmo que recebe o salário-base de um funcionário, calcule e mostre
seu salário a receber, sabendo-se que ele tem gratificação de R$ 50,00 e paga imposto de
26
12% sobre o salário-base.
Algoritmo 8: Calcula salário
1 var salario_base, imposto, salario_receber: real
2 início
3 leia (salario_base)
4 imposto ← salario_base * 0.12
5 salario_receber ← (salario_base – imposto) + 50
6 escreva ("O salário a receber é: ", salario_receber)
7 fim
6.6 Exercícios Propostos
1. Faça um algoritmo que receba a quantidade de minutos e imprima o equivalente
em segundos.
2. Você começou a construir sua própria calculadora. Para isso, você vai começar
do básico, com as quatro operações: multiplicação, divisão, adição e subtração.
Faça um algoritmo que leia dois números reais e imprima o resultado das quatro
operações sobre esses números. Por exemplo, se os números dados forem 5 e 8, o
programa deve imprimir:
• 40.00
• 0.62
• 13.00
• -3.00
3. Faça um algoritmo que leia as variáveis a, b e c e imprima os valores das quatros
fórmulas seguintes:
(a ∗ b)
a)
c
b) a + b + 5c
2
c
c) a ∗ b ∗ c + b + ∗ 5 − 1
3
(a ∗ b ∗ c)3
d)
2
27
4. Uma máquina automática de café só funciona com notas de 5 reais e nunca dá o
troco. O café custa 7 reais. Assim, se o cliente pedir apenas um café, ele vai perder
3 reais, pois terá que dar 10 reais, e a máquina não devolverá o troco. É possível
comprar mais de um café em uma só compra. Logo, se o cliente colocou 15 reais,
significa que ele vai obter dois cafés e perderá 1 real.
Faça um algoritmo que leia a quantidade de dinheiro que o cliente colocou na
máquina sempre um múltiplo de 5 e imprima quanto o cliente irá perder no troco.
5. Faça um algoritmo que leia um número inteiro e imprima o seu antecessor (inteiro
anterior) e o seu sucessor (inteiro posterior).
6. Faça um algoritmo que leia um valor representando o gasto realizado por um cliente
do restaurante COMABEM e imprima o valor total a ser pago, considerando os 10%
do garçom.
7. Faça um algoritmo que leia quatro valores inteiros A, B, C e D. A seguir, calcule e
mostre a diferença do produto de A e B pelo produto de C e D.
8. Faça um algoritmo que leia o número de um funcionário, seu número de horas
trabalhadas, o valor que recebe por hora e calcula o salário desse funcionário. A
seguir, mostre o número e o salário do funcionário.
9. A locadora de carros SAI DA FRENTE está fazendo uma promoção e está alugando
carros no período junino por R$ 30,00 a diária. Além disso, a locadora cobra R$
0,01 por quilômetro rodado. Como é período de São João, a locadora quer fidelizar
os clientes e está dando 10% de desconto no valor total do aluguel de qualquer carro.
Faça uma algoritmo que leia quantos dias a pessoa ficou com o carro: [1; 30] e
quantos kilômetros ela rodou [1; 1000], calcule e mostre o valor total que a pessoa
deve pagar pelo aluguel do carro.
10. Faça um algoritmo que leia um número real que representa um valor em dólares e
realize a conversão de dólar para real: para cada valor lido em dólar, será exibido o
correspondente em reais (1 dólar = 4.64 reais). Ao final, mostre o valor convertido.
7 Estruturas de Decisão/Seleção
Programação = Conjunto de instruções (algoritmo) para resolver um determinado pro-
blema por meio de um computador. Frequentemente precisamos decidir que caminho
28
seguir, ou seja quais instruções executar.
Por exemplo, vamos usar o exemplo que determina a média de 4 notas de provas de
um aluno. Agora, além de saber a média, gostariamos de mostrar também se o aluno foi
aprovado. Suponha que programa funcione assim:
1. O usuário entra com as notas e o programa retorna sua média;
2. Caso a média seja ≥ 7, deve-se mostrar a mensagem “Aprovado”.
O programa deve decidir como se comportar. Temos duas opções:
1. Escrever “Aprovado” ou;
2. Não fazer absolutamente nada.
O pseudocódigo a seguir ilustra o nosso dilema.
Algoritmo 9: Meia de notas
1 var n1,n2, n3, n4: real
2 var media: real
3 início
4 leia (n1,n2, n3, n4)
5 media ← (n1 + n2 + n3 + n4) / 4
6 escreva(media)
7 escreva ("Aprovado")
8 fim
No exemplo citado, lemos as quatro notas e calculamos a média. A partir disso,
precisamos saber se valor da média é maior ou igual a 7. Depois, precisamos decidir se
ele foi aprovado. Para isso, precisamos de um novo comando: Comando de Decisão.
7.1 Comando de Decisão Simples
Um comando de decisão simples também chamado de comando condicional ou de seleção,
vincula a execução de um ou mais comandos ao resultado obtido na avaliação de uma
expressão lógica ou condicional. A condição é expressa por uma expressão lógica, que
quando avaliada produz um resultado verdadeiro ou falso. A sintaxe para o comando de
seleção simples é:
29
se (<expresssão_lógica>) então
<bloco_comandos>
em que o bloco de comandos somente é executado quando o resultado da expressão
lógica for verdadeira; se o resultado for falso, o programa sai do escopo do comando de
decisão simples e executa outros comandos, quando existir.
Na Figura 4 é apresentado o fluxograma de um comando de decisão simples. A
avaliação da expressão lógica é representada pelo bloco no formato de losango. Tal bloco
tem duas saídas, uma para o caso da expressão ser avaliada como verdadeira, outra para
quando o resultado for falso.
Figura 4: Comando de decisão simples
Na Figura 5 é apresentado o fluxograma para o algoritmo que calcula a média das
notas das provas e mostra se o aluno foi aprovado. Agora temos o bloco em formato de
de losango que inclui o comando de decisão para verificar se a média do aluno é ≥ 7 para
informar se o aluno foi aprovado. Do contrário, nada é feito e o programa é finalizado.
O pseudocódigo correspondente ao algoritmo citado é apresentado a seguir, incluindo
30
Figura 5: Fluxograma para o problema proposto
a declaração de variáveis que não aparece no fluxograma.
Algoritmo 10: Media de notas
1 var n1,n2, n3, n4: real
2 var media: real
3 início
4 leia (n1,n2, n3, n4)
5 media ← (n1 + n2 + n3 + n4) / 4
6 escreva (media)
7 se (media ≥ 7) entao
8 escreva ("Aprovado")
9 fim
7.2 Exercícios de Fixação
1. Todas as noites casais com idade par ganham desconto de 50% na entrada. Por
exemplo, se João tem 20 anos e Maria 22, ambos recebem desconto. Mas se somente um
tiver idade par, não há desconto. Sua missão é escrever um algoritmo que leia a idade do
31
homem e da mulher e verifique se o desconto é aplicável.
Algoritmo 11: Cinema
1 var a, b: real
2 início
3 leia (a, b)
4 se (a%2 = 0 e b%2 = 0) entao
5 escreva("desconto")
6 fim
2. Modifique o algoritmo do cinema para dar descontos somente se uma das duas (ou
ambas) tiver idade par. Faça o teste de mesa.
Algoritmo 12: Cinema
1 var a, b: real
2 início
3 leia (a, b)
4 se (a%2 = 0 ou b%2 = 0) entao
5 escreva("desconto")
6 fim
3. Modifique o algoritmo do cinema para dar descontos somente se uma das duas (ou
ambas) tiver idade ímpar. Faça o teste de mesa.
Algoritmo 13: Cinema
1 var a, b: real
2 início
3 leia (a, b)
4 se (a%2 = 1 ou b%2 = 1) entao
5 escreva("desconto")
6 fim
7.3 Comando de Decisão Dupla
Até agora vimos quando executar um comando somente quando uma determinada situ-
ação ou expressão lógica é verdade. Quando for falso, o comando simplesmente não é
32
executado. Vimos isso no exemplo apresentado na seção anterior sobre a média de notas
de provas de alunos. Nesse exemplo, se a média for < 7, o comando escreva que está
dentro do comando de decisão simples não é executado.
Agora, suponha que, além da mensagem indicando se o aluno foi aprovado, caso a
média ≥ 7, queremos mostrar que o aluno foi reprovado, caso contrário.
Em uma primeira tentativa de atingir esse objetivo, poderiamos pensar em fazer
conforme pseudocódigo a seguir.
Algoritmo 14: Media de notas
1 var n1,n2, n3, n4: real
2 var media: real
3 início
4 leia (n1,n2, n3, n4)
5 media ← (n1 + n2 + n3 + n4) / 4
6 escreva(media)
7 se (media ≥ 7) então
8 escreva ("Aprovado")
9 escreva("Reprovado")
10 fim
Perceba que se a média for menor que 7 o programa mostrará corretamente a mensa-
gem indicando que o aluno foi reprovado. No entanto, se a média = 10, por exemplo, ele
indicará que o aluno foi aprovado e reprovado ao mesmo tempo. Isso acontece porque se
media for 10, a expressão (media ≥ 7) da linha 7 será avaliada como verdadeira e o bloco
de comandos da linha 8 e 9 será executado, ou seja, o comando escreva ("Aprovado")
será executado e depois o comando escreva("Reprovado") também será executado.
Então, precisamos de algo que permita escolher quando executar um comando em
detrimento de outro, ou seja, quando executar um bloco quando a expressão for verdadeira
e outro bloco quando a expressão for falsa. O comando que permite isso é Comando senão.
O comando senão é utilizado juntamente com o comando se e tem a seguinte sintaxe:
se (<expresssão_lógica>) então
<bloco_comando1>
senão
33
<bloco_comando2>
em que, caso a expressão seja avaliada como verdadeira, o bloco de comandos 1 será
executado; caso contrário, o bloco de comandos 2 será executado.
Na Figura 6 é apresentado o fluxograma de um comando de decisão dupla, mostrando
claramente que o fluxo do programa passa por apenas um dos bloco de comandos, o qual
é selecionado pelo resultado da expressão lógica dentro do comando se.
Figura 6: Comando de decisão dupla
Agora podemos resolver o nosso problema sobre a média de notas de provas. Na
Figura 7 é apresentado o fluxograma para o algoritmo que calcula a média das notas das
provas e mostra se o aluno foi aprovado ou reprovado.
A seguir, apresenta a solução para esse problema por meio de pseudocódigo. No
caso, se a média for maior ou igual a 7 somente o comando escreva ("Aprovado") será
34
Figura 7: Fluxograma para o problema proposto
executado; do contrário, somente o comando escreva("Reprovado") será executado.
Algoritmo 15: Média de notas
1 var n1,n2, n3, n4: real
2 var media: real
3 início
4 leia (n1,n2, n3, n4)
5 media ← (n1 + n2 + n3 + n4) / 4
6 escreva(media)
7 se (media ≥ 7) entao
8 escreva ("Aprovado")
9 senão
10 escreva("Reprovado")
11 fim
7.4 Exercícios de Fixação
1. Quando uma pessoa é classificada como idosa, ela tem direito à gratuidade no uso
de transporte público. No Brasil, consideram-se idosas as pessoas com 60 anos ou mais.
35
Faça um algoritmo que, dada uma idade, imprima “gratuito” quando a idade representar
um idoso ou “pagante” caso contrário.
Algoritmo 16: Transporte público
1 var idade: real
2 início
3 leia (idade)
4 se (idade ≥ 60) então
5 escreva ("Gratuito")
6 senão
7 escreva("Pagante")
8 fim
2. Faça um algoritmo que, dado um número inteiro, indique se o número é múltiplo
de cinco ou não.
Algoritmo 17: Múltiplo de cinco
1 inteiro numero
2 início
3 leia(numero)
4 se (numero %5 = 0) entao
5 escreva("Multiplo de 5")
6 senao
7 escreva("Não é múltiplo de 5")
8 fim
3. Faça um algoritmo que leia três números inteiros a, b e c e imprima o menor deles.
36
Algoritmo 18: Menor número
1 var a, b, c: inteiro
2 var menor: inteiro
3 início
4 leia(a,b,c)
5 menor ← a
6 se (b < menor)
7 menor ← b
8 se (c < menor)
9 menor ← c
10 escreva("O menor é: ", menor)
11 fim
7.5 Comando de Decisão Múltipla
O comando de decisão múltipla seleciona uma dentre várias opções com base na avaliação
de uma expressão lógica.
Por exemplo: suponha que na sua empresa você como chefe decide conceder um
aumento a todos os funcionários. Porém, esse aumento será escalonado de acordo com a
Tabela 6.
Tabela 6: Aumento de salários
Salário Aumento
salario ≤ R$ 1.000,00 15%
R$ 1.000,00 < salario ≤ R$ 2.000,00 10%
R$ 2.000,00 < salario 5%
Nossa missão é escrever um algoritmo que, dado o salário do funcionário, calcule e
mostre qual será o seu novo salário. Temos três situações de faixas de salário e cada
funcionário pode ser enquadrado somente em uma delas. Com o comando se, podemos
escolher se vamos executar ou não um determinada situação, mas no nosso caso são três.
37
Se tentarmos usar vários se em sequência, podemos chegar ao pseudocódigo a seguir.
Algoritmo 19: Aumento de salário
1 var salario: real
2 início
3 leia(salario)
4 se (salario ≤ 1000) entao
5 salario ← salario * 1.15
6 se (salario > 1000 e ≤ 2000) entao
7 salario ← salario * 1.10
8 se (salario > 2000) entao
9 salario ← salario * 1.05
10 escreva("Novo salario: ", salario)
11 fim
Agora, imagine que o funcionário recebe R$ 950,00. Ao executar o algoritmo:
1. O primeiro "se" seria verdadeiro (salario ≤ 1000) e o valor da variável salário
seria atualizado (salario ← salario *1.15 ) – 1092.50;
2. Logo, o segundo "se" também seria verdadeiro (salario > 1000 e salario ≤
2000) – 1201.75;
Assim, o funcionário receberia dois aumentos cumulativos. A terceira condição não
seria executada.
Mas, então, qual foi o problema no pseudocódigo apresentado?
Precisamos de uma maneira de escolher "apenas" uma opção dentre inúmeras. Para
isso, podemos utilizar o comando senão se. Sua sintaxe é:
se (<expresssão_lógica 1>) então
<bloco_comando1>
senão se (<expressão_lógica 2>) então
<bloco_comando2>
...
38
senão se (<expressão_lógica n> então
<bloco_comando n>
senão [
[<bloco_comando n+1>] ]
Na sintaxe do comando senão se citado:
• Caso a <expressão_lógica 1> seja avaliada como verdadeira, o <bloco_comandos
1> será executado e nenhuma das outras opções que seguem nos comandos se
senão serão avaliadas. Se a <expressão_lógica 1> for falsa, então a <expressão_lógica
2> será avaliada. Se ela for verdadeira, então o <bloco_comandos 2> será execu-
tado e todas as demais expressões lógicas serão ignoradas. Se a <expressão_lógica
2> for falsa, então a expressão seguinte será avaliada, e assim por diante.
• Opcionalmente, pode-se colocar um comando senão ao final das verificacões. Assim
, se nenhuma das expressões anteriores forem verdadeiras, o bloco de comandos
dentro do comando senão sera executado.
Perceba que o comando se senão permite continuar a avaliando se uma determinada
condição é verdadeira antes de executar o bloco de comandos. Com isso, podemos utilizar
este comando para resolver nosso problema. O pseudocódigo do algoritmo para este
problema é apresentado a seguir.
Algoritmo 20: Aumento de salário
1 var salario: real
2 início
3 leia(salario)
4 se (salario ≤ 1000) entao
5 salario ← salario * 1.15
6 senao se (salario > 1000 e salario ≤ 2000) entao
7 salario ← salario * 1.10
8 senao se (salario > 2000) entao
9 salario ← salario * 1.05
10 escreva("Novo salario: ", salario)
11 fim
39
Analisando a nossa solução proposta no algoritmo anterior, será que é possível melho-
rar o algoritmo? Observe que:
• Se no primeiro "se" a expressão for avaliada como falsa, indica que o salário não é
menor ou igual 1000.
Logo, não precisamos verificar isso de novo no primeiro "senão se".
O pseudocódigo a seguir apresenta a solução otimizada para o problema supracitado.
Algoritmo 21: Aumento de salário
1 var salario: real
2 início
3 leia(salario)
4 se (salario ≤ 1000) entao
5 salario ← salario * 1.15
6 senao se (salario ≤ 2000) entao
7 salario ← salario * 1.10
8 senao
9 salario ← salario * 1.05
10 escreva("Novo salario: ", salario)
11 fim
Altere o programa do exercício anterior para que o valor da tabela de aumentos seja:
Tabela 7: Aumento de salários
Salário Aumento
salario ≤ 2000 20%
2000 < salario ≤ 2100 18%
2100 < salario ≤ 5000 15%
5000 < salario ≤ 8000 12%
8000 < salario 10%
Lembre-se: teste com os valores do intervalo e com os valores limites. Por exemplo,
valores 1000, 2000, 2050, 2150, 5000, 6000, 8000, 8100, 20000.
40
Em seguida, altere o programa anterior para que o valor da tabela de aumentos seja:
Salário Aumento
salario < 2000 20%
2000 ≤ salario < 2100 18%
2100 ≤ salario ≤ 5000 15%
5000 < salario < 8000 12%
8000 ≤ salario 10%
Lembre-se: não deixe de testar o programa com os valores do intervalo e com os
valores limites.
Exercícios Comentados
1. Toda vez que Ambrósio vai calcular a raiz de uma equação de 2. grau, esquece de
algum detalhe e calcula errado. Para evitar esquecimentos, resolveu fazer um algoritmo
que calcula as raízes da equação de 2. grau.
• Entrada: Consiste de números reais (a, b, c), sendo os coeficientes da equação ax 2
+ bx + c = 0;
• Saída:
– Caso existam as raízes da equação, mostre-as;
– Caso não existam, imprimir a mensagem "não existem raízes reais";
– Caso não seja uma equação de 2. grau, imprimir mensagem "não é equação
de 2. grau".
Para resolver esse problema, primeiro precisamos recordar como se calcula as raízes
de uma equação de 2. grau. As raízes são dadas pela seguinte fórmula (fórmula de
Bhaskara):
sendo a, b e c os mesmos coeficientes da equação de 2. grau, e o símbolo ± indica que
uma das soluções é obtida por meio da soma e outra por meio da diferença.
41
A expressão dentro da raiz também é conhecida como delta. Perceba que se o delta
for menor que zero, não existem raízes reais. Observe também que, se delta for 0, só
existirá uma raiz.
Logo:
• O algoritmo lê 3 coeficientes;
• Verifica se o coeficiente a é diferente de 0;
– sendo 0, a equação seria de 1. grau;
• Calcula o Delta (expressão dentro da raiz);
• Verifica se o Delta é maior que 0; e
• Mostra os resultados.
A solução para esse problema é apresentada por meio do pseudocódigo a seguir. Per-
ceba que utilizamos uma função predefinida, sqrt, que recebe um número como parâme-
tro e retorna outro número correspondendo sua raíz quadrada.
Algoritmo 22: Equação de segundo grau
1 var a,b,c, delta, x1, x2: real
2 início
3 leia(a,b,c)
4 se (a = 0) entao
5 escreva("Nao eh equacao 2. grau")
6 senao
7 delta ← (b * b) - (4 * a * c)
8 se (delta < 0) entao
9 escreva("Nao existem raizes reais")
10 senao
11 x1 ← (-b + sqrt(delta)) / (2 * a)
12 x2 ← (-b - sqrt(delta)) / (2 * a)
13 escreva(x1, x2)
14 fim
2. Suponha um problema no qual recebemos dois números inteiros e devemos imprimi-
los em ordem crescente. Antes de resolver, vamos analisar as possibilidades. Chamamos
42
de a e b os números dados, conforme mostra a Tabela 8.
Tabela 8: Imprimir em ordem crescente
Cenário Exemplo valor de a Exemplo valor de b
a>b 3 2
a<b 2 3
a=b 2 2
Podemos observar na tabela dada, que temos três possibilidades. Uma possível solução
seria utilizar três comandos se, sendo uma para cada situação, conforme pseudocódigo a
seguir.s.
Algoritmo 23: Imprimir em ordem crescente
1 var a, b: inteiro
2 início
3 leia(a,b)
4 se (a > b) entao
5 escreva(b, a)
6 senao se (a < b) entao
7 escreva(a, b)
8 senao
9 escreva(a, a)
10 fim
Será que existe uma maneira mais elegante de resolver o problema?
Analisando o pseudocódigo pode-se observar as seguintes possibilidades:
• Trocar o valor entre duas variávveis;
• Supor que uma situação é verdade;
• Só agir caso esteja errado.
No pseudocódigo a seguir é apresentado a solução para o problema de ordenção. Neste
caso, só mudamos o valor das variáveis quando a for maior que b.
43
Algoritmo 24: Imprimir em ordem crescente
1 var a, b: inteiro
2 var temp: inteiro
3 início
4 leia(a,b)
5 se (a > b) entao
6 temp ← a
7 a←b
8 b ← temp
9 escreva(a, b)
10 fim
7.6 Comando Caso
Construções usando o comando se senão facilita a programação. Entretanto, muitas
vezes precisamos escolher uma entre várias alternativas disponíveis. Na Seção 7.5 vimos
o comando de decisão múltipla senão se que atende a este propósito.
No entanto, às vezes construções usando o senão se pode trazer confusões e dificultar
o desenvolvimento e o entendimento do algoritmo. Alternativamente, existe o comando
de decisão múltipla caso que é mais flexível, limpo e claro. A sintaxe deste comando é a
seguinte:
caso (<expresssão ou variável>) seja
<opção 1>: <comando 1>;
<opção 2>: <comando 2>;
<opção 3>: <comando 3>;
...
<opção n>: <comando n>;
[senão <comandos> ]
fim caso
Tal estrutura também permite selecionar uma opção dentre as várias que se apresen-
tam, baseado no valor de uma expressão ou variável:
44
• caso o valor da expressão ou variável corresponda a algum dos valores disponíveis
dentro da estrutura, o bloco de comandos referente a esse valor (opção) será execu-
tado e, logo em seguida, o comando finalizado;
• se nenhuma das opções disponíveis for igual ao valor da expressão ou variável, a
estrutura que contém o comando senão será executado, desde que ele esteja definido.
Isso porque que o símbolo "[" e "]" significa que ele é opcional no comando caso.
Para exemplificar, vamos fazer um algoritmo que simula uma calculadora com as
quatro operações básicas (soma, subtração, multiplicação e divisão) usando o comando
caso. O pseudocódigo a seguir implemente esse algoritmo.
Algoritmo 25: Calculadora básica
1 var num1, num2: inteiro
2 var operador: caractere
3 início
4 leia(num1, operador, num2)
5 caso (operador) seja
6 ’+’: escreva ("Soma: ", num1 + num2)
7 ’-’: escreva ("Subtração: ", num1 - num2)
8 ’*’: escreva ("Multiplicação: ", num1 * num2)
9 ’:́ escreva ("Divisão: ", num1 num2)
10 fim caso
11 fim
7.7 Decisões Aninhadas
Muitos problemas exigem tomada de decisões em sequência (aninhadas) para se chegar
à resposta correta. Para isso, temos a opção de utilizar comandos se aninhados:
• Um se dentro da declaração de um outro se externo;
No entanto, um cuidado que se deve ter é saber exatamente a qual se um determinado
senão está ligado.
Para exemplificar, suponha uma corrida de aventura em que os participantes partem
todos de um mesmo local e tentam chegar ao mesmo destino. Vence quem chegar em
45
menos tempo. No mapa da Figura 8, cada opção de caminho é dada por um número.
Nessa competição todos os participantes foram até o final da trilha. Porém, alguns fizeram
o caminho que não é válido (ex., 3, 4 e 6). A sua missão é receber um determinado caminho
e indicar se este é valido e se a equipe chegou ao destino. Cada caminho é representado
por uma sequência de números.
Figura 8: Corrida de aventura
O pseudocódigo a seguir implemente o algoritmo para o problema da corrida de aven-
46
Algoritmo 26: Corrida de aventura
1 var caminho: inteiro
2 início
3 leia(caminho)
4 se (caminho = 1) entao
5 leia(caminho)
6 se (caminho = 4) entao
7 leia(caminho)
8 se (caminho = 6) entao
9 escreva ("Caminho válido, destino alcançado")
10 senao
11 escreva ("Caminho inválido")
12 senao
13 escreva ("Caminho inválido")
14 senao se (caminho = 2) entao
15 escreva ("Caminho válido, mas destino não alcançado")
tura. 16 senao se (caminho = 3) entao
17 leia(caminho)
18 se (caminho = 5) entao
19 leia (caminho)
20 se (caminho = 7) entao
21 leia(caminho)
22 se (caminho = 8) entao
23 escreva ("Caminho válido, destino alcançado")
24 senao
25 escreva ("Caminho inválido")
26 senao
27 escreva ("Caminho inválido")
28 senao
29 escreva ("Caminho inválido")
30 senao
31 escreva ("Caminho inválido")
32 fim
47
Exercício Comentado
1. A concessionária instalou um radar no caminho de sua casa para a faculdade, limi-
tando a velocidade dos carros em uma determinada via. A velocidade pode ser alterada
diaramente. Por ex., nos feriados a velocidade máxima pode ser de 80km/h. Já durante
a semana, pode ser de no máximo 60km/h. Para isso, as placas digitais informam aos
motoristas qual é a velocidade máxima naquele momento. A tabela de penalizações para
quem ultrapassar o limite é:
• até 20% superior ao permitido – multa de R$ 85,13 e 4 pontos na carteira;
• maior que 20% e até 50% acima do permitido – multa de R$ 127,69 e 5 pontos na
carteira;
• acima de 50%: multa de R$ 574,62; 7 pontos na carteira, apreensão da carteira e
suspensão do direito de dirigir;
Entrada: Dois números reais, correspondendo à velocidade máxima da via e à veloci-
dade do veículo;
Saída: O valor da multa e o número de pontos da carteira.
Neste problema, a partir das velocidades da via e do veículo, temos que decidir:
1. Se o veículo vai ser multado ou não.
2. Se ele for multado:
• qual será o valor da multa; e
• quantos pontos o condutor perderá na carteria.
A multa acontece somente quando ele ultrapassa o limite máximo:
• v_veiculo > v_via.
Para saber o valor da multa, é preciso verificar o percentual de velocidade ultrapas-
sado:
• diferenca ← v_veiculo / v_via, por ex., 115 / 100 = 1,15.
Perceba que se a diferença for menor que 1, significa que o veículo não ultrapassou o
limite, por exemplo, v_veiculo = 80 e v_via = 100:
48
• diferenca ← 80 / 100 = 0,8.
A partir dessa análise, podemos elaborar nosso algoritmo. O pseudocódigo a seguir
contém a solução para o problema.
Algoritmo 27: Radar
1 var v_via, v_veiculo, diferenca: real
2 var multa ← 0
3 var pontos ← 0
4 início
5 leia(v_via,v_veiculo)
6 diferenca ← v_veiculo / v_via
7 se (diferenca > 1) entao
8 se (diferenca ≤ 1.2) entao
9 multa ← 85.13
10 pontos ← 4
11 senao se (diferenca ≤ 1.5) entao
12 multa ← 127.69
13 pontos ← 5
14 senao
15 multa ← 574.62
16 pontos ← 7
17 escreva(multa, ponto)
18 fim
7.8 Exercícios Propostos
1. Faça um algoritmo que leia 3 números inteiros e imprima um (e apenas um) dos
seguintes números:
• 1 (Se todos os números são iguais)
• 2 (Se todos os números são diferentes)
• 3 (Se apenas dois números são iguais)
Formato de entrada: Consiste de 3 números inteiros.
Formato de saída: Consiste de um número indicando uma das 3 situações de igual-
dade entre os valores de entrada conforme demonstrado na descrição.
49
2. Ambrósio é amigo da vizinhança e resolveu dar descontos para agradar seus clientes.
A mercearia de Ambrósio contém apenas 4 itens, cujos preços são dados pela Tabela
9.
Tabela 9: Merceária do Ambrósio
Código Preço unitário
1 R$ 5,30
2 R$ 6,00
3 R$ 3,20
4 R$ 2,50
A regra de desconto é bem simples: se a quantidade de produtos comprados for
igual ou maior que quinze, então o desconto é concedido. O desconto também é
concedido caso o valor total da compra seja maior ou igual a 40 reais. O valor do
desconto é de 15%.
Sua missão é fazer um algoritmo que leia o código do produto, a quantidade com-
prada e mostre o valor que o cliente deve pagar, já considerando o desconto quando
aplicável. Considere que o cliente só pode comprar um único tipo produto cada vez
que usar o seu software.
Formato de entrada: Um número inteiro correspondendo ao código do produto,
seguido de um inteiro indicando a quantidade comprada.
Formato de saída: A saída deve conter o seguinte formato: R$ x, onde x corresponde
a um número real indicando o valor a ser pago pelo cliente.
3. Faça um algoritmo que leia 3 números inteiros e imprima o menor deles.
Formato de entrada: 3 números inteiros.
Formato de saída: O menor dos números dos 3.
4. 4. A empresa local de abastecimento de água, a Saneamento Básico da Cidade
(SBC), está promovendo uma campanha de conservação de água, distribuindo car-
tilhas e promovendo ações demonstrando a importância da água para a vida e para
o meio ambiente.
Para incentivar mais ainda a economia de água, a SBC alterou os preços de seu
fornecimento de forma que, proporcionalmente, aqueles clientes que consumirem
menos água paguem menos pelo metro cúbico.
50
Todo cliente paga mensalmente uma assinatura de R$ 7, que inclui uma franquia
de 10 m 3 de água. Isto é, para qualquer consumo entre 0 e 10 m 3 , o consumidor
paga a mesma quantia de R$ 7 reais (note que o valor da assinatura deve ser pago
mesmo que o consumidor não tenha consumido água). Acima de 10 m 3 , cada metro
cúbico subsequente tem um valor diferente, dependendo da faixa de consumo. A
SBC cobra apenas por quantidades inteiras de metros cúbicos consumidos.
A Tabela 10 especifica o preço por metro cúbico para cada faixa de consumo.
Tabela 10: Conta de água
Faixa de consumo (m 3 ) Preço (por m 3 )
Até 10 Incluído na franquia
11 a 30 R$ 1
31 a 100 R$ 2
101 em diante R$ 5
Assim, por exemplo, se o consumo foi de 120 m 3 , o valor da conta é:
• 7 reais da assinatura básica;
• 20 reais pelo consumo no intervalo 11 – 30 m 3 ;
• 140 reais pelo consumo no intervalo 31 – 100 m 3 ;
• 100 reais pelo consumo no intervalo 101 – 120 m 3 .
Logo o valor total da conta de água é R$ 267.
Escreva um programa que, dado o consumo de uma residência em m 3 , calcula o
valor da conta de água daquela residência.
Formato de entrada: contém um único inteiro N, indicando o consumo de água da
residência, em m 3 (0 ≤ N ≤ 1000).
Formato de saída: Seu programa deve mostrar o valor da conta de água daquela
residência.
5. Faça um algoritmo que leia três notas (valores reais) de um aluno, calcule sua média
aritmética e imprima uma mensagem dizendo se o aluno foi aprovado, reprovado
ou deverá fazer prova final. O critério de aprovação é o seguinte:
• Aprovado (média ≥ 7);
51
• Reprovado (média < 3);
• Prova final (3 ≤ média < 7).
Formato de entrada: 3 números reais.
Formato de saída: Uma mensagem que pode ser:
• aprovado
• reprovado
• prova final
6. Nos parques de diversão, alguns brinquedos tem idade e altura mínimas para po-
der andar neles. O parque Ambrolândia possui 3 brinquedos que possuem essa
limitação:
• Barca Viking: 1,5m de altura e 12 anos.
• Elevator of Death: 1,4m de altura e 14 anos.
• Final Killer: 1,7m de altura ou 16 anos.
Dada a altura e a idade de uma pessoa, faça um algoritmo que identifique quantos
brinquedos ele pode andar.
Formato de entrada: Dois inteiros, F e I, representando a altura (em cm) e a idade,
respectivamente.
Formato de saída: O número de brinquedos que ele pode andar no parque.
7. Faça um alagoritmo que leia um valor inteiro N. Depois, imprima uma mensagem
dizendo que se este valor for ímpar, par, positivo, negativo ou nulo. A mensagem
deve estar em letras maiúsculas.
Formato de entrada: Um número N. Considere que o maior inteiro que você poderá
receber é 1012
Formato de saída: Uma frase, informando se o número é POSITIVO PAR, POSI-
TIVO IMPAR, NEGATIVO PAR, NEGATIVO IMPAR ou NULO.
8. Escreva um algoritmo para ler as coordenadas (X, Y) de um ponto no sistema
cartesiano. E escrever à qual quadrante ele pertence.
Formato de entrada: Dois números inteiros.
52
Formato de saída: Imprima o quadrante correspondente que estas coordenadas
pertencem, que pode ser:
• primeiro;
• segundo;
• terceiro;
• quarto;
• eixo x;
• eixo y;
• origem.
Será eixo x quando a coordenada y for zero. Será eixo y quando a coordenada x for
zero. Os outros basta achar a localização do ponto no plano cartesiano.
9. Toda apresentação de trabalho tem seus requisitos mínimos, que precisam ser aten-
didos, caso contrário, o trabalho não é aceito e o aluno fica com nota 0.
A apresentação de Programação I está chegando, e o Professor Baldoino deixou
claro que se os trabalhos não passassem por todos os requisitos mínimos, ele não
iria julgar o trabalho. Eis os requisitos:
• Requisito 1: Inferface gráfica OU Inteligência Artificial;
• Requisito 2: Encapsulamento E Indentação;
• Requisito 3: Uso de Structs.
Dada a entrada, descubra se o aluno ficou com 0 ou o seu trabalho será avaliado.
Formato de entrada: A entrada é composta de 5 números, representando respec-
tivamente Interface Gráfica, Inteligência Artificial, Encapsulamento, Indentação e
Structs.
Os números podem ser:
• 0 - Se o trabalho não possui tal quesito.
• 1 - Se o trabalho possui tal quesito.
Formato de saída: Deve mostrar o número 0, se o aluno não atender aos requisistos
e ficará com zero, e a frase "AVALIADO"se ele atendeu aos requisitos mínimos.
53
10. Faça um algoritmo que leia 3 números inteiros e os imprima em ordem decrescente.
Desafio: tente utilizar apenas 4 comandos se.
Formato de entrada: Consiste de 3 números inteiros.
Formato de saída: Consiste dos 3 números de entrada ordenados do maior para o
menor.
11. Os triângulos mais simples são classificados de acordo com os limites das proporções
relativas de seus lados (Figura 9):
• Um triângulo equilátero possui todos os lados congruentes ou seja iguais. Um
triângulo equilátero é também equiângulo: todos os seus ângulos internos são
congruentes (medem 60), sendo, portanto, classificado como um polígono re-
gular.
• Um triângulo isósceles possui pelo menos dois lados de mesma medida e dois
ângulos congruentes. O triângulo equilátero é, consequentemente, um caso
especial de um triângulo isósceles, que apresenta não somente dois, mas todos
os três lados iguais, assim como os ângulos, que medem todos 60. Num triân-
gulo isósceles, o ângulo formado pelos lados congruentes é chamado ângulo do
vértice. Os demais ângulos denominam-se ângulos da base e são congruentes.
• Em um triângulo escaleno, as medidas dos três lados são diferentes. Os ângulos
internos de um triângulo escaleno também possuem medidas diferentes.
Figura 9: Classificação de triângulos
Sua missão é escrever um algoritmo para classificar um triângulo de lados de com-
primentos dados em: escaleno (os três lados de comprimentos diferentes), isósceles
(dois lados de comprimentos iguais) ou equilátero (os três lados de comprimentos
iguais).
Formato de entrada: A entrada consiste de 3 números reais maiores que zero cor-
respondendo ao comprimento dos lados do triângulo.
Formato de saída: A saída deve ser: escaleno, isosceles ou equilatero.
54
Referências
Edelweiss, N.; Livi, M. A. C. Algoritmos e programação com exemplos em Pascal e C.
Bookman, 2014.
Stallings, W. Arquitetura e organização de computadores. 8. ed. São Paulo: Pearson
Prentice Hall, 2010.
Tocci, R.; Widmer, N.; Moss, G. Sistemas Digitais: Princípios e Aplicações, 2019.
Paes, R. B. Introdução à programação com a linguagem C. Novatec, 2016.