Elementos de Algoritmos

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 55

Alto

A- A+ Imprimir
Contraste

ELEMENTOS DE
ALGORITMOS

Aula 1

ESTRUTURAS DE
ALGORITMOS
FUNDAMENTAIS

Estruturas de algoritmos
fundamentais
Olá, estudante!

Nesta primeira videoaula da Unidade, apresentaremos os conceitos


essenciais de algoritmos, sua definição e aplicabilidade. Além disso,
desenvolveremos os tópicos introdutórios de funções e modularização.
Aproveite esta aula para agregar informações relevantes ao seu
aprendizado, e assim, expandir sua compreensão e entendimento da
área de algoritmos e lógica de programação.
Estudante, esta videoaula foi preparada especialmente para você.
Nela, você irá aprender conteúdos importantes para a sua formação
profissional. Vamos assisti-la?
Clique aqui para acessar os slides da sua videoaula.
Bons estudos!

Ponto de Partida
Olá, estudante! Seja bem-vindo à esta aula sobre estruturas de
algoritmos fundamentais. Em primeiro lugar, vamos entender o que são
algoritmos e algumas de suas aplicabilidades. Posteriormente,
abordaremos suas propriedades e alguns exemplos práticos no que se
refere à sua aplicação. Traremos, também, conteúdos que introduzirão
o tema funções e modularização.

Estudar algoritmos não apenas aprimorará suas habilidades de


resolução de problemas, como também proporcionará um
entendimento mais profundo do funcionamento interno dos programas
e dos sistemas que moldam nosso cotidiano. Além disso, você será
capaz de compreender o quanto as funções e a modularização
desempenham papéis cruciais na criação de códigos eficientes e
organizados. Por meio das explicações e exemplos dados, ficará claro
que as funções são blocos de construção fundamentais em qualquer
linguagem de programação e que a modularização, ao dividir o código
em partes menores e independentes, facilita a compreensão e
promove a reutilização e manutenção eficiente de um software.

Diante desses pontos, como exemplo prático imagine que em um posto


de combustível movimentado, os funcionários enfrentam dificuldades
para registrar as vendas de maneira eficiente. Para melhorar esse
processo, você foi convidado a criar um sistema simples que armazene
informações essenciais sobre as transações. Os dados a serem
registrados incluem o tipo de combustível escolhido pelo cliente, a
quantidade abastecida, além do preço por litro dependendo do tipo de
combustível.

Convidamos você a explorar o material da aula e a praticar os


conteúdos aqui trabalhados. Aproveite!

Vamos Começar!

Definição, conceito e aplicabilidade dos


algoritmos

Os algoritmos, muitas vezes considerados o ponto principal da ciência


da computação, desempenham um papel determinante na resolução
de problemas e na execução eficiente de tarefas em diversas áreas.
No âmbito da programação, entender a definição e a aplicabilidade dos
algoritmos é essencial para qualquer desenvolvedor ou cientista de
dados. Nesta aula, exploraremos o que são algoritmos, como eles são
estruturados e como são aplicados no mundo real.

Os algoritmos são sequências ordenadas de instruções que visam


realizar uma atividade específica ou solucionar um problema. Eles são
como receitas detalhadas, fornecendo passos claros para atingir um
resultado desejado. A aplicabilidade dos algoritmos é vasta,
abrangendo desde a ordenação de dados até a resolução de
complexos problemas matemáticos. Por exemplo, o algoritmo Bubble
Sort organiza elementos em uma lista de forma ascendente ou
descendente, enquanto o algoritmo de Dijkstra é utilizado para
encontrar o caminho mais curto em redes. Vale lembrar que esses
exemplos são mais complexos e sua construção exige uma maior
habilidade.

Consideremos, pois, um exemplo mais simples, um algoritmo em


Portugol que utiliza comandos básicos de entrada e saída. Esse
algoritmo solicita ao usuário que insira dois números, realiza a soma e
exibe o resultado, como podemos observar na Figura 1:

Figura 1 | Exemplo de algoritmo com comandos básicos. Fonte:


elaborada pelo autor.

Neste exemplo, o algoritmo utiliza os comandos “escreva” para exibir


mensagens no console e “leia” para capturar a entrada do usuário. Os
números fornecidos são armazenados nas variáveis “numero1” e
“numero2”. Em seguida, a soma é calculada e armazenada na variável
“resultado”, que é exibida ao usuário. Este é um exemplo básico que
demonstra o uso fundamental de entrada e saída em algoritmos
simples.
Outro exemplo clássico é o cálculo da média de um aluno. Baseado em
informações solicitadas para o usuário, é possível apresentar o
resultado de cálculos como a média aritmética ou a média ponderada
de uma turma de alunos, ou até mesmo determinar qual aluno ficou
com a maior média da turma. Na Figura 2 a seguir, vemos um exemplo
desse algoritmo:

Figura 2 | Cálculo da média de um aluno. Fonte: elaborada pelo


autor.

Note que a figura apresenta a criação das variáveis na linha 3. Nesse


caso, todas as variáveis foram declaradas como reais, pois existem
valores nos cálculos de divisão que podem retornar resultados
fracionários. Em seguida, é solicitado do usuário as notas e, após essa
etapa, é realizado o cálculo da média. O algoritmo finaliza
apresentando o resultado da média na tela do programa como uma
mensagem textual que acompanha o valor numérico.

Em síntese, compreender a definição e aplicabilidade dos algoritmos é


essencial para qualquer pessoa envolvida no mundo da programação e
da ciência de dados, uma vez que possibilitam a automação de
processos, a solução de problemas básicos e complexos e a
otimização de sistemas.
Portanto, mergulhar no entendimento e na prática dos algoritmos é não
apenas uma escolha sábia, mas uma necessidade para quem busca
excelência na área da programação e na resolução de desafios
computacionais.

Propriedades de um algoritmo

O aprendizado das propriedades de um algoritmo é fundamental no


campo da ciência da computação. Imagine os algoritmos como os
mecanismos complexos que impulsionam a engrenagem por trás do
funcionamento eficiente dos softwares que utilizamos diariamente.
Compreender suas propriedades permite aprimorar, então, a
capacidade de resolução de problemas e criar soluções mais eficazes
para desafios complexos. Ao iniciar os estudos nesse domínio, os
futuros programadores aprimoram suas habilidades técnicas, além de
cultivar uma perspicácia analítica que é essencial para navegar no
cenário em constante evolução da tecnologia.

Debruçar-se sobre os algoritmos e suas propriedades não se trata,


pois, de uma exploração acadêmica, mas de uma habilidade
indispensável para quem busca a perfeição na arte da programação e
da resolução de problemas computacionais. Na sequência,
apresentaremos alguns exemplos práticos que englobam as principais
propriedades de um algoritmo:

1. Passo a passo para realizar uma tarefa

A característica de seguir um passo a passo em um algoritmo é crucial


para garantir a execução ordenada e lógica de uma tarefa específica.
Isso significa que cada ação é cuidadosamente planejada e executada
em uma sequência predeterminada. A analogia pode ser feita com uma
receita de cozinha, na qual cada instrução precisa ser acompanhada
na ordem correta para se obter o resultado desejado. No contexto da
programação, a clareza e a precisão nos passos são essenciais para
evitar erros e garantir o desfecho almejado. Observe, na Figura 3, o
exemplo de um passo a passo na realização de uma tarefa:

Figura 3 | Exemplo em Portugol: média ponderada. Fonte:


elaborada pelo autor.

A propriedade de passo a passo é essencial para guiar a execução de


um algoritmo de maneira sequencial e lógica, como este que calcula a
média ponderada de três notas, seguindo um processo ordenado de
entrada, cálculo e exibição do resultado.

2. Processamento e instruções lógicas

O processamento e as instruções lógicas são a essência do


funcionamento de um algoritmo. Cada passo do algoritmo envolve a
manipulação de dados através de operações lógicas, como
comparações, cálculos e tomadas de decisão. Por exemplo, ao
verificar se um número é positivo, o algoritmo utiliza a instrução lógica
“se” para comparar o número com zero. Essas operações são a base
que permite que o algoritmo resolva problemas complexos,
decompondo-os em operações lógicas mais simples, como vemos na
Figura 4:
Figura 4 | Exemplo em Portugol: verificação e divisibilidade por 3. Fonte: elaborada pelo autor.

A propriedade de processamento e instruções lógicas é exemplificada


em um algoritmo que verifica se um número é divisível por 3. Em
outras palavras, o processamento envolve a verificação lógica da
condição de divisibilidade. Aqui, as instruções lógicas determinam se o
número é ou não divisível por 3.

Siga em Frente...
3. Início e fim

A propriedade de ter um início e um fim é essencial para estruturar e


delimitar a execução de um algoritmo. O início é o ponto de partida,
onde são recebidos os dados ou parâmetros necessários para realizar
a tarefa. O fim, por sua vez, marca o encerramento do processo,
resultando na conclusão da tarefa ou na produção do resultado
desejado. Essa estruturação clara proporciona uma melhor
compreensão do escopo do algoritmo, facilitando o controle do
desenvolvedor sobre o fluxo de execução, como na Figura 5:
Figura 5 | Exemplo em Portugol: conversão de Celsius para Fahrenheit. Fonte: elaborada pelo autor.

Na Figura 5, a propriedade de ter um início e um fim é evidente em um


algoritmo que converte temperatura de Celsius para Fahrenheit. O
início envolve a entrada da temperatura em Celsius e o fim marca a
exibição da temperatura convertida.

4. Instruções claras e objetivas

Instruções claras e objetivas são fundamentais para garantir que o


algoritmo seja compreendido e executado corretamente. A clareza nas
instruções significa que cada passo do algoritmo é descrito de maneira
direta, sem ambiguidades, evitando interpretações errôneas. A
objetividade, por seu turno, está relacionada à eficiência na
comunicação das ações a serem realizadas, sem informações
desnecessárias. Essas instruções são como um manual detalhado que
guia a execução do algoritmo de forma inequívoca. Veja o exemplo a
seguir:
Figura 6 | Exemplo em Portugol: verificação de número primo.
Fonte: elaborada pelo autor.

A clareza e objetividade nas instruções, como vemos na Figura 6, são


primordiais em um algoritmo que verifica se um número é primo. A
estrutura de controle de fluxo é clara, tornando o algoritmo
compreensível.

Em suma, cada uma dessas propriedades desempenha um papel


elementar na criação de algoritmos robustos e eficientes. A
sequencialidade garante uma execução ordenada, o processamento e
as instruções lógicas são a essência da operação, o início e fim
delimitam o escopo, e as instruções claras e objetivas asseguram uma
compreensão e execução adequadas. Ao entender e aplicar essas
propriedades, os programadores são capazes de desenvolver
algoritmos mais eficazes, precisos e fáceis de manter.

Introdução a funções e modularização

As funções possuem grande relevância na construção de algoritmos.


Elas são blocos de código que realizam tarefas específicas e podem
ser chamadas de diferentes partes do programa. Ao introduzir funções,
a programação se torna mais modular e compreensível. Imagine-as
como ferramentas especializadas no kit de um desenvolvedor, cada
qual projetada para executar um trabalho único. No mercado da
Tecnologia da Informação, isso se traduz em eficiência e reutilização
de código. Por exemplo, uma função que valida senhas pode ser usada
em diferentes partes de um sistema, promovendo consistência e
economizando tempo de desenvolvimento. A seguir, veremos quatro
exemplos básicos e contextualizados de funções no campo da TI.

1. Validação de e-mail

Cenário: em um sistema de cadastro online, é necessário validar


se o endereço de e-mail fornecido pelos usuários está no formato
correto.
Função: uma função específica pode ser criada para validar e-
mails, sendo utilizada em várias partes do sistema, desde o
cadastro até a recuperação de senha.

2. Geração de relatórios

Cenário: um sistema de gerenciamento financeiro precisa gerar


relatórios mensais para os usuários.
Função: uma função especializada para gerar relatórios pode ser
desenvolvida, proporcionando uma abordagem modular para lidar
com diferentes tipos de relatórios.

3. Ordenação de lista

Cenário: um sistema de gerenciamento de tarefas precisa exibir


as tarefas em uma ordem específica, como por data de
vencimento.
Função: desenvolver uma função de ordenação que aceite a lista
de tarefas como entrada e retorne a lista ordenada. Essa função
pode ser usada sempre que for necessário exibir as tarefas em
uma ordem específica.

4. Conversão de moeda
Cenário: um aplicativo financeiro permite que o usuário converta
valores entre diferentes moedas.
Função: criar uma função de conversão de moeda que aceite o
valor a ser convertido, a moeda de origem e a moeda de destino
como parâmetros. Essa função encapsula a lógica de conversão e
pode ser chamada sempre que uma conversão for necessária.

Dessa forma, conclui-se que, ao dominar os conceitos de funções, os


programadores podem organizar melhor seus programas, facilitando a
manutenção e a depuração destes. Além disso, o uso adequado de
funções promove a abstração e a encapsulação, permitindo que partes
do código sejam isoladas e modificadas independentemente, o que
contribui para a escalabilidade e a flexibilidade do software. Portanto,
investir tempo no estudo das funções na programação é fundamental
para se tornar um desenvolvedor mais competente e eficaz.

Quanto à modularização, podemos defini-la como o princípio de dividir


um sistema complexo em módulos ou componentes independentes e
interconectados. Esse conceito traz inúmeras vantagens para o
desenvolvimento de software no mercado de TI. Em termos de
desempenho, a modularização permite a otimização de cada módulo
individual, melhorando a eficiência geral do sistema. Além disso, ela
também simplifica a manutenção, uma vez que alterações ou
atualizações podem ser feitas em módulos específicos sem impactar o
sistema como um todo. Isso se traduz em economia de tempo e
recursos, que são essenciais no cenário tecnológico e na vida de um
desenvolvedor. A seguir, discorreremos sobre essas vantagens com
mais detalhes.

1. Manutenibilidade: ao dividir um sistema em módulos, torna-se


mais fácil localizar e corrigir problemas específicos sem afetar
outras partes do código. Isso simplifica a manutenção e
atualização do software.
2. Reusabilidade de código: módulos bem definidos podem ser
reutilizados em diferentes partes do sistema ou mesmo em
projetos futuros, o que economiza tempo de desenvolvimento e
promove consistência no código.
3. Escalabilidade: sistemas modulares são mais fáceis de escalar,
pois novos módulos podem ser adicionados conforme necessário,
o que ajuda na adaptação do sistema às mudanças nos
requisitos.
4. Colaboração eficiente: a modularização permite o trabalho
colaborativo, pois diferentes equipes podem se concentrar em
módulos específicos sem interferir no trabalho umas das outras.

Como pudemos notar por meio dos exemplos citados, a modularização


tem um papel importante no mercado de Tecnologia da Informação
(TI), pois oferece uma abordagem organizada e escalável. Ao dividir
um sistema complexo em módulos independentes e interconectados,
os desenvolvedores podem aumentar a eficiência em desenvolvimento,
testes e manutenção de software. Isso permite que equipes trabalhem
de forma colaborativa em diferentes partes do projeto, facilitando a
identificação e correção de erros, além de promover a reutilização do
código. A modularização também permite a integração de novos
recursos e a adaptação a mudanças nos requisitos do cliente ou do
mercado, tornando o processo de desenvolvimento mais ágil e
adaptável. Logo, a modularização não somente melhora a qualidade e
confiabilidade dos produtos de software, como também contribui para a
entrega oportuna de soluções inovadoras e eficientes para os clientes.

As funções e a modularização são, portanto, elementos de grande


importância no desenvolvimento de software e no mundo da
programação. Ao utilizar funções, os desenvolvedores podem criar
blocos de código reutilizáveis, promovendo eficiência e coesão no
desenvolvimento. A modularização, por sua vez, traz vantagens
significativas, desde a melhoria do desempenho até a facilitação da
manutenção e escalabilidade do sistema. Esses princípios formam uma
ótima base para o desenvolvimento de sistemas de qualidade que
sejam flexíveis e fáceis de manter, qualidades muito valorizadas no
ambiente tecnológico atual.

Vamos Exercitar?
Vamos retomar a situação apresentada no início da aula, na qual em
um posto de combustível movimentado, os funcionários enfrentam
dificuldades para registrar as vendas de maneira eficiente. Para
melhorar esse processo, é necessário criar um sistema simples que
armazene informações essenciais sobre as transações. Os dados a
serem registrados incluem o tipo de combustível escolhido pelo cliente,
a quantidade abastecida, além do preço por litro dependendo do tipo
de combustível.

Vamos à resolução?

Registro do tipo de combustível

Solicite ao cliente tipo de combustível desejado (gasolina, etanol,


diesel etc.).
Criar uma variável do tipo “Caractere” que armazene o tipo de
combustível.

Registro da quantidade abastecida

Solicite ao cliente a quantidade de litros desejada para o


combustível escolhido.
Armazene a quantidade em uma variável do tipo “Real”, pois a
quantidade pode ser fracionada.

Registro do valor por litro

O valor por litro deve ser consultado na tabela de preços do posto.


Armazene o valor por litro em uma variável do tipo “Real”.

Cálculo do valor total

Calcule o valor total da compra multiplicando a quantidade de


litros pelo preço por litro.
Apresente o valor total ao cliente.

Este método simplificado de gerenciamento de transações ressalta a


relevância da utilização de variados tipos de dados para armazenar
informações em um posto de abastecimento de combustível. A
habilidade em lidar com dados e realizar cálculos é essencial para
assegurar um serviço ágil e preciso aos clientes.

Saiba Mais
Para saber mais sobre conceitos básicos de algoritmos, entre os quais
estão os tipos de dados e operadores aritméticos, consulte o Capítulo 2
– Algoritmos e a Lógica de Programação, do livro Algoritmos – Lógica
para Desenvolvimento de Programação de Computadores, de
Manzano e Oliveira, disponível no repositório da Biblioteca virtual.

MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Capítulo 2 – Algoritmos e a


Lógica de Programação. In: Algoritmos – Lógica para
Desenvolvimento de Programação de Computadores. São Paulo:
Editora Saraiva, 2019, p. 29.

Referências Bibliográficas
CORMEN, T. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro:
LTC, 2022.

MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Algoritmos - Lógica para


Desenvolvimento de Programação de Computadores. São Paulo:
Editora Saraiva, 2019.

MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Estudo dirigido de


algoritmos. São Paulo: Érica, 2000.

MENÉNDEZ, A. Simplificando algoritmos. São Paulo: LTC, 2023.

SILVA, F. S. C. da; FINGER, M.; MELO, A. C. V. Lógica para


computação. 2. ed. São Paulo: Cengage Learning, 2017.

ZIVIANI, N. Projeto de algoritmos com implementações em Pascal


e C. 3. ed. São Paulo: Cengage Learning, 2011.

Aula 2

EXECUÇÃO SEQUENCIAL E
ESTRUTURAS DE DECISÃO

Execução sequencial e estruturas de


decisão
Olá, estudante!

Nesta videoaula, temos como objetivo apresentar os conceitos básicos


de algoritmos que abrangem os primeiros passos no desenvolvimento
da tomada de decisão em códigos. Além disso, abordaremos como
deve ser a estrutura de um código de decisão, que utiliza condicionais,
e como ele funciona.
Não perca a oportunidade de agregar informações valiosas ao seu
aprendizado e, assim, ampliar seu conhecimento e compreensão da
área de algoritmos.

Clique aqui para acessar os slides da sua videoaula.


Bons estudos!

Ponto de Partida
Olá, caro estudante! Seja bem-vindo à esta aula sobre estrutura
sequencial e estrutura de decisão, as quais constituem a base para a
construção lógica de programas.

As estruturas sequenciais são como os blocos de construção iniciais de


um projeto em que as instruções são executadas em ordem linear, uma
após a outra. Essa abordagem é essencial para organizar o fluxo de
execução do programa, permitindo que a lógica siga de forma
ordenada e compreensível. Seja na simples exibição de mensagens ou
até em cálculos mais complexos, as estruturas de sequência fornecem
um ponto de partida para qualquer programador iniciante.
À medida que avançamos, entramos no domínio da estrutura de
decisão, um conceito-chave para a tomada de decisões dinâmicas em
um programa. Através de declarações condicionais, como “se” e
“senao”, podemos introduzir ramificações lógicas no fluxo do código.
Essas estruturas permitem que um programa escolha entre diferentes
caminhos de execução com base em condições específicas,
aumentando, assim, a flexibilidade e adaptabilidade às aplicações.

Para ilustrar a aprendizagem dos conteúdos desta aula, imagine que


você precisa desenvolver um módulo para um sistema de comércio
eletrônico que oferece descontos aos clientes com base em suas
compras anteriores. O sistema deve aplicar um percentual de desconto
de acordo com o valor total da compra.

Ao compreender esses princípios básicos, estaremos prontos para


explorar cenários e desafios de programação mais complexos no
futuro. Vale lembrar que esses conceitos iniciais são a chave para
desbloquear o enorme potencial da programação.

Vamos Começar!
No vasto universo da programação, as estruturas que moldam a
execução dos algoritmos são partes que integram a eficácia do código.
Sua compreensão é um pré-requisito elementar para qualquer
programador que busca criar sistemas coesos e funcionais. Nesse
contexto, destacam-se três aspectos fundamentais: a estrutura de
programação, que define o esqueleto do código; as estruturas
sequenciais, que determinam a execução linear das instruções; e as
estruturas de decisão, que conferem ao programa a capacidade de se
adaptar a diferentes cenários por meio de lógica condicional.

Em um nível macro, a estrutura de programação estabelece a ordem


geral das operações, enquanto as estruturas sequenciais e de
decisão refinam essa ordem, proporcionando ao código a flexibilidade
necessária para enfrentar desafios diversos. Este mergulho no centro
dessas estruturas é essencial para capacitar programadores a criar
códigos mais claros, concisos e eficientes, podendo, assim, solucionar
problemas de forma sofisticada no mundo da programação.

Estrutura de programação

A estrutura de programação refere-se ao esqueleto básico de um


programa, estabelecendo a ordem em que as instruções são
executadas. No contexto do pseudocódigo Portugol, podemos ilustrar
essa qualidade com um exemplo simples:

Figura 1 | Exemplo de estrutura de programação. Fonte: elaborada


pelo autor.

Na Figura 1, é evidente a estrutura de programação. O programa


começa com a entrada de dados, quando o usuário fornece dois
números. Em seguida, ocorre o processamento, em que os números
são subtraídos e o resultado é armazenado na variável "sub". Por fim,
a saída de dados exibe a subtração ao usuário. Essa sequência lógica
de operações exemplifica a estrutura de programação, na qual cada
passo é crucial para alcançar o resultado desejado.

Essa abordagem estruturada é essencial para garantir a clareza e a


funcionalidade do código. Em projetos mais complexos, a organização
eficaz das operações por meio de uma estrutura de programação bem
definida torna-se ainda mais crítica, permitindo que programadores e
equipes colaborem de maneira mais eficiente e mantenham o código
de forma sustentável ao longo do tempo. Assim, a estrutura de
programação não apenas estabelece a ordem de execução, mas
também promove a legibilidade e a manutenção do código, fatores
cruciais no desenvolvimento de um software de qualidade.

Estruturas sequenciais

As estruturas sequenciais representam a execução de instruções em


ordem linear, uma após a outra. Em linguagens de programação, isso
ocorre de forma natural, mas é importante compreender como
organizá-las de maneira lógica. Para tanto, vamos expandir o exemplo
anterior para incluir uma estrutura sequencial.
Figura 2 | Estruturas sequenciais. Fonte: elaborada pelo autor.

Neste exemplo ampliado, após a saída de dados que exibe a soma,


adicionamos instruções sequenciais para calcular e exibir o dobro do
resultado. Essa adição ilustra como as estruturas sequenciais
permitem a execução linear de operações, uma após a outra. No caso,
o dobro da soma é calculado imediatamente após a exibição da soma,
seguindo o fluxo sequencial do programa.

As estruturas sequenciais são, pois, capitais para a organização lógica


e compreensão do código. Elas possibilitam que os desenvolvedores
expressem a lógica de execução de maneira clara e direta. Em
programas mais complexos, essa sequencialidade torna-se primordial
para evitar resultados inesperados e garantir que as operações sejam
realizadas na ordem desejada. A clareza proporcionada por estruturas
sequenciais também facilita a depuração e a manutenção do código,
contribuindo para um desenvolvimento mais eficiente e eficaz.
Siga em Frente...

Estruturas de decisão

No universo da programação, as estruturas de decisão são


fundamentais para conferir ao código a capacidade de tomar diferentes
caminhos de execução com base em condições específicas. Na
pseudolinguagem Portugol, a estrutura condicional básica é
representada pelo comando "se-então-senão".

As estruturas de decisão podem ser classificadas em três tipos


principais: desvio condicional simples, desvio condicional composto e
desvio condicional encadeado. Exploremos cada uma delas com
exemplos claros em Portugol.

Desvio condicional simples

O desvio condicional simples é o tipo mais básico, no qual o código


executa uma instrução se uma condição for verdadeira; caso contrário,
ele simplesmente continua sua execução normal. Na Figura 3, vemos
como o programa verifica se um número digitado é positivo.

Figura 3 | Positivo?. Fonte: elaborada pelo autor.

Neste caso, a mensagem "O número é positivo" será exibida apenas


se a condição numero > 0 for verdadeira.

Desvio condicional composto

O desvio condicional composto inclui um bloco de instruções para cada


possível resultado da condição. No exemplo a seguir, além de verificar
se o número é positivo, também apura-se se é negativo ou igual a zero.

Figura 4 | Positivo ou negativo?. Fonte: elaborada pelo autor.

Logo, o código aborda todas as possibilidades, garantindo que a


mensagem correta seja exibida com base no valor do número inserido.

Desvio condicional encadeado

O desvio condicional encadeado ocorre quando uma série de decisões


está interligada. Cada decisão é tomada com base na condição
anterior. Na Figura 5, observamos o programa classificar um aluno com
base em sua nota.
Figura 5 | Aprovado, recuperação ou reprovado?. Fonte:
elaborada pelo autor.

Neste caso, o programa avalia primeiro se a nota é maior ou igual a


7,0. Se sim, o aluno é aprovado. Caso contrário, se a nota for maior ou
igual a 4,0, ele está em recuperação. Se não atender a nenhuma
dessas condições, o aluno é considerado reprovado.

Tais exemplos demonstram como as estruturas de decisão em Portugol


podem ser aplicadas de maneiras simples e compreensíveis,
proporcionando ao programador flexibilidade para lidar com diferentes
situações. A escolha entre essas estruturas dependerá da
complexidade do problema a ser resolvido e da lógica específica que
se deseja implementar.

Conclusão

Em resumo, as estruturas de programação constituem a espinha dorsal


do desenvolvimento de software, proporcionando a organização lógica
necessária para a criação de algoritmos eficientes. Ao definirem o
esqueleto do código, elas estabelecem as bases sobre as quais as
estruturas sequenciais e de decisão se desdobrarão. As estruturas
sequenciais, por sua vez, asseguram a execução ordenada das
instruções, conferindo clareza e linearidade ao fluxo do programa. Da
mesma forma, as estruturas de decisão emergem como ferramentas
cruciais para a adaptação dinâmica do código, permitindo que ele
responda a condições específicas.

Ao aplicar esses conceitos no ambiente de programação em Portugol,


os desenvolvedores têm a oportunidade de criar códigos mais legíveis,
organizados e eficientes. A clareza proporcionada pelas estruturas de
programação é fundamental para facilitar a compreensão do código
não apenas pelo criador, mas também por outros membros da equipe
envolvida no projeto. Além disso, a capacidade de tomar decisões
lógicas por meio das estruturas condicionais permite que os programas
lidem de maneira adaptável com diferentes cenários, contribuindo para
a robustez e versatilidade das soluções desenvolvidas. Em última
análise, o entendimento profundo dessas estruturas é uma habilidade
essencial para programadores que aspiram a construir soluções de
software robustas e funcionalmente sólidas.

Vamos Exercitar?
Vamos retomar a situação apresentada no início da aula onde você
precisa desenvolver um módulo para um sistema de comércio
eletrônico que oferece descontos aos clientes com base em suas
compras anteriores. O sistema deve aplicar um desconto de 10% em
relação ao valor total da compra.

Vamos à resolução?

Identificação do cliente

Crie uma estrutura de dados para representar as informações do


cliente: nome, e-mail e total gasto em compras anteriores.
Solicite ao usuário que insira seu nome, e-mail e o valor total
gasto em compras anteriores.

Aplicação de desconto

Implemente uma estrutura de seleção (condicional) para verificar


o valor total gasto pelo cliente.
Aplique um desconto de 10% se o valor total for superior a R$
500.

Exibição do resultado

Mostre ao usuário o valor original da compra, o desconto aplicado


(se houver) e o valor final a ser pago.
Exiba uma mensagem incentivando o cliente a continuar
comprando.

Usando a Linguagem C

Figura 6 | Identificação do cliente. Fonte: elaborada pelo autor.

Figura 7 | Aplicação do desconto. Fonte: elaborada pelo autor.


Figura 8 | Resultado. Fonte: elaborada pelo autor.

Saiba Mais
Para saber mais sobre as estruturas de decisão e formas de aplicação
dos desvios condicionais na linguagem de programação C e quais suas
características, consulte o Capítulo 7. Estruturas condicionais do livro
Elementos de programação em C, de Pinheiro, disponível no
repositório da Biblioteca virtual.

PINHEIRO, F. de A. C. Capítulo 7. Estrutura Condicionais. In:


Elementos de programação em C. Porto Alegre: Bookman, 2012, p.
148-165.

Referências Bibliográficas
CORMEN, T. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro:
LTC, 2022.

MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Estudo dirigido de


algoritmos. São Paulo: Érica, 2000.

MENÉNDEZ, A. Simplificando algoritmos. São Paulo: LTC, 2023.

PINHEIRO, F. de A. C. Elementos de programação em C. Porto


Alegre: Bookman, 2012.

SILVA, F. S. C. da; FINGER, M.; MELO, A. C. V. Lógica para


computação. 2. ed. São Paulo: Cengage Learning, 2017.

ZIVIANI, N. Projeto de algoritmos com implementações em Pascal


e C. 3. ed. São Paulo: Cengage Learning, 2011.
Aula 3

ESTRUTURAS DE
REPETIÇÃO

Estruturas de repetição
Olá, estudante! Esta videoaula será dedicada às estruturas de
repetição, as quais proporcionarão uma imersão completa nos
elementos essenciais para o desenvolvimento de algoritmos mais
complexos. Durante nosso encontro, exploraremos os conceitos
fundamentais dessas estruturas, discutindo como elas podem ser
aplicadas para otimizar e automatizar processos em programação. A
habilidade de criar loops eficientes é crucial para qualquer
programador, e esta aula visa fornecer uma compreensão sólida do
assunto. Além disso, abordaremos a importância da clareza na
estrutura do código e como essa qualidade contribui para um
desenvolvimento mais eficiente. Entender como organizar e controlar o
fluxo de um programa é primordial para qualquer aspirante a
desenvolvedor.

Clique aqui e acesse os slides da sua videoaula.

Bons estudos!
Ponto de Partida
Olá, caro estudante! Seja bem-vindo à esta aula dedicada às estruturas
de repetição em Portugol. Nesta jornada, apresentaremos essas
estruturas essenciais para a criação de algoritmos dinâmicos e
eficientes. Elas são como os fios que tecem a complexidade dos
programas, proporcionando a flexibilidade necessária para enfrentar
desafios variados. Assim como alicerces firmes sustentam uma
construção, entender o "Enquanto-Faça", "Para-Até-Faça" e "Repita-
Até" permitirá, assim, que você construa códigos mais robustos e
adaptáveis.

Para ilustrar a aprendizagem dos conteúdos desta aula, imagine que


você trabalha em uma loja de pneus que deseja otimizar o controle de
estoque e conta com a sua ajuda para criar um programa que facilite a
contagem de produtos. Cada pneu vendido é registrado, e o estoque
precisa ser atualizado constantemente. Portando, você precisará
desenvolver um algoritmo que permita ao vendedor informar quantos
pneus foram vendidos e, com base nessa informação, realizar a
contagem atualizada do estoque.

Este é apenas o começo; o conhecimento adquirido aqui será a chave


para desbloquear as possibilidades infinitas que a programação
oferece. Abrace cada conceito, participe ativamente e não hesite em
explorar e questionar. Estamos aqui para apoiar sua aprendizagem e
guiá-lo na compreensão plena dessas estruturas. Boa aula!
Vamos Começar!
A lógica de programação é uma parte fundamental do desenvolvimento
de software, e entre suas muitas nuances, destacam-se as estruturas
de repetição como ferramentas essenciais para construir algoritmos
eficientes e dinâmicos. Nesta aula, vamos explorar a profundidade
dessas estruturas em Portugol, uma linguagem pseudocódigo que
serve como ponte intuitiva para entender os conceitos básicos da área.
À medida que nos aprofundarmos no universo do "Enquanto-Faça",
"Para-Até-Faça" e "Repita-Até", desvendaremos os segredos por trás
dessas construções que capacitam os programadores a automatizar
tarefas, criar lógicas complexas e dar vida a algoritmos mais eficientes.

Resumidamente, a estrutura "Enquanto-Faça" oferece uma abordagem


dinâmica, permitindo que um bloco de código seja repetido enquanto
uma condição específica permanecer verdadeira. Essa capacidade de
adaptação é crucial, pois permite a execução de tarefas variáveis,
condicionando o fluxo do programa à avaliação contínua de uma
expressão booleana. No entanto, há também a necessidade de
estruturas que possam lidar com um número fixo de repetições, e é
aqui que o "Para-Até-Faça" assume o palco, simplificando o controle
de iterações. Por fim, para cenários em que é necessário garantir que
um bloco de código seja executado pelo menos uma vez,
independentemente da condição inicial, a estrutura "Repita-Até" se
destaca como um instrumento valioso, proporcionando robustez e
adaptabilidade aos algoritmos. Ao desbravar esses conceitos, os
programadores estarão equipados não apenas com conhecimentos
práticos, como também com uma compreensão mais profunda da arte
de criar algoritmos eficientes.

Enquanto-Faça
A estrutura de repetição "Enquanto-Faça" destaca-se como uma
ferramenta dinâmica e versátil no contexto da programação. Sua lógica
é centrada na execução de um bloco de código enquanto uma
condição específica permanece verdadeira. No exemplo prático do
contador, inicializamos uma variável em 1. Enquanto essa variável for
menor ou igual a 5, o bloco de código dentro do "Enquanto-Faça" será
repetido. Cada iteração incrementa o contador, proporcionando uma
contagem sequencial de 1 a 5. Essa flexibilidade torna o "Enquanto-
Faça" ideal para situações em que a quantidade de repetições não é
conhecida antecipadamente.

Figura 1 | Contador. Fonte: elaborada pelo autor.

Uma das características marcantes do "Enquanto-Faça" é a sua


capacidade de adaptar dinamicamente o fluxo de execução do
programa. A condição que determina a repetição é avaliada antes de
cada iteração, permitindo que o bloco de código seja executado
apenas enquanto a condição for verdadeira. Isso proporciona um
controle preciso e flexível sobre o número de repetições, adequando-se
a cenários em que a lógica do programa precisa ajustar-se às
condições variáveis, tornando-o uma escolha ideal para contextos
dinâmicos.

Além de seu papel em loops, o "Enquanto-Faça" contribui


significativamente para a construção lógica sequencial de um
programa. Sua adaptabilidade ao lidar com conjunturas em que as
condições de repetição podem depender de variáveis externas ou
interações do usuário é valiosa. Ao dominar o uso dessa estrutura, os
programadores adquirem uma ferramenta capital para criar algoritmos
dinâmicos e ajustáveis, abrindo portas para a resolução eficiente de
uma variedade de problemas.

Para-Até-Faça

A estrutura de repetição "Para-Até-Faça" é um instrumento poderoso


que proporciona um controle preciso sobre o número de iterações em
um bloco de código. Ao contrário do "Enquanto-Faça", no qual a
execução depende de uma condição booleana, o "Para-Até-Faça" é
especialmente útil quando sabemos previamente quantas repetições
são precisas. Essa estrutura é conduzida por uma variável de controle,
muitas vezes chamada de índice, que é inicializada com um valor
específico e incrementada automaticamente a cada iteração.

Imagine, a título de ilustração, que estamos desenvolvendo um


programa para calcular a soma dos primeiros cinco números inteiros.
Utilizando o "Para-Até-Faça", podemos criar um código conciso e
eficiente:

Figura 2 | Somando 5 números. Fonte: elaborada pelo


autor.

Neste exemplo, a variável soma é inicializada em zero, e o "Para-Até-


Faça" é utilizado para iterar de 1 até 5. A cada iteração, o valor de i é
somado à variável soma. Ao final do loop, obtemos a soma total dos
primeiros cinco números inteiros. Essa abordagem é eficaz quando
conhecemos antecipadamente o número de iterações necessárias,
proporcionando um controle preciso sobre o fluxo do programa.

Essa estrutura é particularmente eficiente em operações que envolvem


listas, arrays ou qualquer contexto em que a quantidade de elementos
seja conhecida. O "Para-Até-Faça" simplifica a implementação de
iterações controladas, tornando o código mais legível e fácil de
compreender. Aprofundar-se nesse conceito, assim, proporcionará um
entendimento sólido e versátil das estruturas de repetição em Portugol.

Siga em Frente...

Repita-Até

A estrutura de repetição "Repita-Até" é muito útil quando desejamos


que um bloco de código seja executado pelo menos uma vez,
independentemente da condição inicial. Ao contrário do "Enquanto-
Faça", que verifica a condição antes da execução, o "Repita-Até"
executa o bloco primeiro e, em seguida, verifica a condição para
determinar se deve repetir o processo.

Considere um exemplo prático: suponha que estamos desenvolvendo


um programa para solicitar ao usuário um número entre 1 e 10.
Utilizando o "Repita-Até", podemos garantir que o código seja
executado pelo menos uma vez, independentemente da entrada do
usuário.
Figura 3 | Verificando número válido. Fonte: elaborada pelo
autor.

Na Figura 3, o bloco de código dentro de "Repita-Até" solicita ao


usuário que digite um número repetidamente até que a condição
número >= 1 e número <= 10 seja atendida. Essa estrutura garante
que o programa não avance até que o usuário forneça uma entrada
válida, tornando-a útil para situações em que é essencial garantir a
execução de um bloco pelo menos uma vez.

O "Repita-Até" é um instrumento interessante para cenários nos quais


a execução do bloco deve ocorrer antes da verificação da condição. Ao
compreender a dinâmica dessa estrutura, os programadores podem
criar algoritmos mais flexíveis e adaptáveis.

Conclusão

Exploramos, nesta aula, as fundamentais estruturas de repetição em


Portugol, o "Enquanto-Faça", "Para-Até-Faça" e "Repita-Até",
construções valiosas para o desenvolvimento de algoritmos mais
dinâmicos e eficientes. Ao compreender a aplicação adequada de cada
uma delas, os programadores adquirem a capacidade de criar códigos
mais claros, flexíveis e adaptáveis, essenciais em cenários complexos.

O "Enquanto-Faça" destaca-se por sua flexibilidade, permitindo que um


bloco de código seja repetido enquanto uma condição específica
permanecer verdadeira. Isso é especialmente útil quando a quantidade
de repetições é incerta e depende de condições variáveis. O “Para-Até-
Faça”, por sua vez, é ideal quando o número de iterações é conhecido
antecipadamente, proporcionando um controle preciso sobre o fluxo do
programa. Essa estrutura simplifica a implementação de iterações
controladas, tornando o código mais legível e eficiente.

Já o "Repita-Até" evidencia-se por garantir que um bloco de código


seja executado pelo menos uma vez, independentemente da condição
inicial. Essa característica faz com ele que seja proveitoso em
situações em que é necessário assegurar a execução de um bloco
antes de verificar a condição.

Tais estruturas, em conjunto, formam uma base sólida para a criação


de algoritmos poderosos. Ao dominá-las, os programadores estarão
preparados para enfrentar desafios mais complexos, construindo
códigos mais eficientes e adaptáveis. A jornada na lógica de
programação continua, e o entendimento profundo dessas estruturas
de repetição serve como um trampolim para explorar cenários e
desafios mais avançados no vasto mundo da programação.

Vamos Exercitar?
Retomando a situação apresentada no início da aula onde você
trabalha em uma loja de pneus que deseja otimizar o controle de
estoque e conta com a sua ajuda para criar um programa que facilite a
contagem de produtos. E a sua responsabilidade é desenvolver um
algoritmo que permita ao vendedor informar quantos pneus foram
vendidos e, com base nessa informação, realizar a contagem
atualizada do estoque.

Vamos à resolução?

Inicialização do estoque

Inicialize o estoque de pneus com um valor pré-definido, por


exemplo, 100 pneus.

Registro de vendas

Implemente um loop (estrutura de repetição) que permita ao


vendedor registrar as vendas de pneus.
Solicite ao vendedor que informe a quantidade de pneus vendidos
a cada transação.
Atualize o estoque subtraindo a quantidade vendida.

Exibição do estoque atualizado

Após cada registro de venda, exiba ao vendedor o estoque


atualizado.
Continue o processo até que o vendedor decida encerrar a
contagem.

Figura 4 | Controle de estoque. Fonte: elaborada pelo autor.

O investimento em soluções computacionais que integrem estruturas


de controle proporciona vantagens competitivas e eficiência
operacional, elementos cruciais em um mercado cada vez mais
tecnológico e orientado por dados. Continue, pois, aprimorando suas
habilidades para enfrentar desafios mais complexos na área de
programação.

Saiba Mais
Para saber mais sobre laços de repetição na linguagem de
programação C e suas características, consulte o Capítulo 8 -
Estruturas de Repetição do livro Elementos de programação em C, de
Pinheiro, disponível no repositório da Biblioteca virtual.

PINHEIRO, F. de A. C. Capítulo 8 - Estruturas de Repetição. In:


Elementos de programação em C. Porto Alegre: Bookman, 2012, p.
171-187.

Referências Bibliográficas
CORMEN, T. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro:
LTC, 2022.

MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Estudo dirigido de


algoritmos. São Paulo: Érica, 2000.

MENÉNDEZ, A. Simplificando algoritmos. São Paulo: LTC, 2023.

PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre:


Bookman, 2012.

SILVA, F. S. C. da; FINGER, M.; MELO, A. C. V. Lógica para


computação. 2. ed. São Paulo: Cengage Learning, 2017.

ZIVIANI, N. Projeto de algoritmos com implementações em Pascal


e C. 3. ed. São Paulo: Cengage Learning, 2011.

Aula 4

VARIÁVEIS INDEXADAS
Variáveis indexadas
Olá, estudante! Esta videoaula tem como objetivo apresentar os
conceitos básicos de algoritmos que abrangem os primeiros passos no
desenvolvimento da tomada de decisão em códigos. Abordaremos,
também, como deve ser a estrutura de um código e como ele funciona.

Não perca a oportunidade de agregar informações valiosas ao seu


aprendizado e de ampliar seu conhecimento e compreensão da área
de algoritmos.

Clique aqui para acessar os slides da sua videoaula.


Bons estudos!

Ponto de Partida
Olá, caro estudante! Seja bem-vindo à esta aula dedicada à utilização
de vetores, às variáveis indexadas unidimensionais e variáveis
compostas na construção eficiente de algoritmos.

Começaremos entendendo as estruturas sequenciais, que são como


blocos de construção iniciais para projetos. Nelas, as instruções são
executadas em ordem linear, passo a passo, o que é vital para
organizar o fluxo do programa, desde tarefas simples, como exibir
mensagens, até manipulações mais complexas usando vetores e
variáveis indexadas unidimensionais.

Na sequência, mergulharemos no domínio das variáveis compostas,


ferramentas poderosas que permitem agrupar dados relacionados em
uma única estrutura. Nesse contexto, exploraremos como vetores e
variáveis indexadas unidimensionais são primordiais para construir
algoritmos eficientes e resolver problemas computacionais de forma
organizada.

Portanto, para ilustrar a aprendizagem do conteúdo desta aula, vamos


exercitar com um algoritmo em Portugol que faça operações utilizando
a estrutura de vetores. Será apresentando um algoritmo que vai
solicitar informações ao usuário que serão armazenadas em 2 vetores.
Um terceiro vetor será necessário para fazer a soma dos elementos
dos dois vetores e apresentar o seu resultado no final do programa.

A jornada está apenas começando, e esses conceitos iniciais são a


chave para enfrentar cenários e desafios de programação mais
complexos no futuro.

Vamos Começar!
A programação é uma linguagem que utiliza diversos conceitos para
representar e manipular dados. Entre esses conceitos, destacam-se a
utilização de vetores, variáveis indexadas unidimensionais e variáveis
compostas, essenciais para organizar e acessar informações de
maneira eficiente. Nesta aula, portanto, exploraremos cada um desses
conteúdos, exemplificando seu uso por meio da linguagem de
programação Portugol.
Utilização de vetores

Os vetores são estruturas fundamentais na programação, permitindo


armazenar e organizar dados de forma sequencial em memória, o que
facilita seu acesso e manipulação eficaz. Em linguagens como
Portugol, a declaração e manipulação desses vetores são tarefas
comuns, proporcionando uma abordagem estruturada para lidar com
conjuntos de dados relacionados.

A declaração de um vetor em Portugol envolve a especificação dos


elementos e a definição da faixa de índices. Assim, ao criar um vetor
de notas, podemos utilizar a declaração vetor [1.5] de real, indicando
que ele terá elementos do tipo real e índices variando de 1 a 5. O
acesso aos elementos se dará por meio dos índices que representam
uma posição única no vetor. Para atribuir ou recuperar valores, basta
referenciar o vetor e o índice desejado.

Considere, na Figura 1, o exemplo em Portugol no qual criamos um


vetor “notas” para armazenar as notas dos alunos, permitindo acessar,
por meio do índice, a segunda nota:

Figura 1 | Exemplo de vetor. Fonte: elaborada pelo autor.

Vetores são versáteis, podendo armazenar diferentes tipos de dados,


desde números até caracteres. Além disso, são eficientes para lidar
com conjuntos de dados homogêneos, como uma lista de temperaturas
mensais ou um histórico de vendas diárias. Sua utilização simplifica a
manipulação desses dados, proporcionando uma estrutura organizada
e acessível e contribuindo para o desenvolvimento de algoritmos mais
claros e efetivos.

Variáveis indexadas unidimensionais

As variáveis indexadas unidimensionais são extensões do conceito de


vetores, proporcionando uma forma mais flexível de representar e
acessar dados em programação. Elas permitem organizar informações
de maneira estruturada, associando valores a índices específicos. No
contexto do Portugol, a utilização de variáveis indexadas
unidimensionais oferece uma abordagem eficaz para lidar com
conjuntos de dados que não seguem necessariamente uma sequência
contígua de índices.

Mas, ao contrário dos vetores, elas não requerem uma faixa de índices
fixa durante a declaração. Podemos definir índices de forma mais
dinâmica, tornando-as ideais para situações em que os dados não
seguem uma ordem sequencial predefinida. No Portugol, a declaração
de uma variável indexada unidimensional é feita como var nome: vetor
de tipo, permitindo a atribuição de índices em tempo de execução. O
acesso aos elementos ocorre da mesma forma, utilizando índices para
referenciar valores específicos.

A seguir, apresentamos um exemplo em Portugol no qual criamos uma


variável indexada “meses” para representar os meses do ano e
acessarmos o terceiro mês:
Figura 2 | Variável indexada. Fonte: elaborada pelo autor.

Variáveis indexadas unidimensionais são especialmente úteis em


situações dinâmicas, como a representação de dados esparsos ou
informações que podem ser atualizadas ao longo do tempo. Podem ser
empregadas em cenários que envolvam, por exemplo, a categorização
de eventos no decorrer de um ano, sem a necessidade de reservar
espaço para todos os meses. Essa flexibilidade as torna uma
ferramenta poderosa na programação, contribuindo para uma gestão
eficiente de dados em contextos menos estruturados.

Siga em Frente...

Variáveis compostas

Variáveis compostas evoluem além das estruturas simples de dados,


permitindo uma representação mais rica e abrangente na
programação. Como discutimos anteriormente, o uso de registros em
Portugol para criar variáveis compostas é essencial para explorar duas
variantes avançadas, as multidimensionais e as heterogêneas, as
quais oferecem recursos adicionais para lidar com conjuntos de dados
mais complexos e diversificados.

Variáveis compostas
multidimensionais
No contexto das variáveis compostas multidimensionais, a declaração
envolve a criação de estruturas que possuem mais de uma dimensão.
Matrizes ou arrays bidimensionais são exemplos comuns nessa
categoria. Ao declarar uma matriz em Portugol, especificamos o
número de linhas e colunas. O acesso aos elementos ocorre por meio
da referência a índices em ambas as dimensões. Assim, uma matriz
pode representar uma tabela em que as linhas são os meses do ano e
as colunas são os dias, facilitando a organização e manipulação de
dados mais elaborados.

Figura 3 | Variável composta multidimensional. Fonte:


elaborada pelo autor.

Variáveis compostas heterogêneas


As variáveis compostas heterogêneas introduzem a ideia de estruturas
que contêm campos de diferentes tipos de dados. Enquanto os
registros em Portugol são homogêneos, as estruturas heterogêneas
permitem uma abordagem mais flexível. Pode-se ter um campo que
armazena um número inteiro, enquanto outro armazena um caractere,
por exemplo. Essa versatilidade é muito vantajosa ao modelar
entidades que possuem atributos diversos e não uniformes.

Figura 4 | Variável composta heterogenia. Fonte: elaborada


pelo autor.
Em resumo, a incorporação de variáveis compostas multidimensionais
e compostas heterogêneas enriquece significativamente a capacidade
de representar dados na programação. Ao entender e aplicar esses
conceitos em Portugol, os programadores podem desenvolver soluções
adaptáveis, adequadas para lidar com desafios mais complexos. A
linguagem Portugol, integrando essas formas, proporciona, então, uma
base sólida para o desenvolvimento de habilidades programáticas mais
avançadas em linguagens subsequentes, preparando programadores
para enfrentar problemas cada vez mais sofisticados na construção de
softwares.

Conclusão

A integração de vetores, variáveis indexadas unidimensionais e


variáveis compostas emerge como prática essencial na programação,
promovendo uma estrutura organizada e eficiente para a manipulação
de dados. A compreensão profunda desses temas e sua aplicação
criteriosa em contextos específicos capacitam os programadores a
conceberem sistemas mais transparentes, modulares e de fácil
manutenção. A linguagem Portugol, ao dar suporte para esses
elementos, destaca-se como uma ferramenta inestimável para aqueles
que buscam aprender a programar de maneira estruturada e eficaz.

Vamos Exercitar?
Retomando a situação apresentada no início da aula, de exercitar com
um algoritmo em Portugol que faça operações utilizando a estrutura de
vetores, criando um algoritmo que vai solicitar informações ao usuário
que serão armazenadas em 2 vetores. Um terceiro vetor será
necessário para fazer a soma dos elementos dos dois vetores e
apresentar o seu resultado no final do programa.
Vamos à resolução?

Inicialização dos vetores

Crie dois vetores inteiros: vetorA e vetorB, com um tamanho pré-


definido.

Leitura dos elementos

Implemente um loop para solicitar ao usuário que informe os


elementos de cada vetor.
Para cada posição i do vetorA e vetorB, leia um valor inteiro e
armazene no vetor correspondente.

Somatória dos vetores

Crie um terceiro vetor, vetorSoma, com o mesmo tamanho dos


vetores vetorA e vetorB, para armazenar a soma dos elementos
de cada posição.
Para cada posição i, realize a soma dos elementos das posições
correspondentes dos vetores vetorA e vetorB e armazene o
resultado no vetorSoma.

Apresentação dos vetores

Após a leitura e somatória, exiba ao usuário os elementos dos


vetores vetorA, vetorB e vetorSoma, mostrando os valores de
cada posição.

Fim do programa

Encerre a execução do programa.

Segue o demonstrativo da codificação em Portugol:


Figura 5 | Soma de vetores. Fonte: elaborada pelo autor.

Figura 6 | Soma de vetores – cont. Fonte: elaborada pelo autor.

Nesta atividade, você aprendeu como utilizar vetores em Portugol para


armazenar e manipular conjuntos de dados. Você criou um algoritmo
que permite ao usuário inserir elementos em dois vetores, somá-los e
depois apresentar os vetores originais e o vetor resultante da soma.
Esta prática é essencial para entender o conceito de vetores e como
aplicá-los na resolução de problemas computacionais.

Saiba Mais
Para saber mais sobre estruturas de dados homogêneas e
heterogêneas, vetores e matrizes, consulte o Capítulo 6 – Estruturas
de Dados Homogêneas de Uma Dimensão, do livro Algoritmos –
Lógica para Desenvolvimento de Programação de Computadores, de
Manzano e Oliveira, disponível no repositório da Biblioteca virtual.

MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Capítulo 6 - Estruturas de


Dados Homogêneas de Uma Dimensão. In: Algoritmos – Lógica para
Desenvolvimento de Programação de Computadores. São Paulo:
Saraiva, 2019, p. 145-158.

Referências Bibliográficas
CORMEN, T. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro:
LTC, 2022.

MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Algoritmos - Lógica para


Desenvolvimento de Programação de Computadores. São Paulo:
Editora Saraiva, 2019.

MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Estudo dirigido de


algoritmos. São Paulo: Érica, 2000.

MENÉNDEZ, A. Simplificando algoritmos. São Paulo: LTC, 2023.

SILVA, F. S. C. da; FINGER, M.; MELO, A. C. V. Lógica para


computação. 2. ed. São Paulo: Cengage Learning, 2017.
ZIVIANI, N. Projeto de algoritmos com implementações em Pascal
e C. 3. ed. São Paulo: Cengage Learning, 2011.

Encerramento da Unidade

ELEMENTOS DE
ALGORITMOS

Videoaula de Encerramento
Olá, estudante! Seja bem-vindo à videoaula de encerramento desta
Unidade, na qual destacaremos as estruturas de seleção, também
conhecidas como condicionais. Essa estrutura é uma das mais
presentes nos algoritmos desenvolvidos em todas as aplicações do
mercado de software, portanto muito relevante para quem já atua ou
está planejando entrar para a área da computação.

Preparado para finalizar essa jornada?

Clique aqui para acessar os slides da sua videoaula.


Bons estudos!
Ponto de Chegada
Olá, estudante! Para desenvolver a competência desta Unidade, a
saber, desenvolver algoritmos com a utilização das estruturas de
decisão e repetição por meio de pseudocódigos na programação,
tivemos, primeiramente, que conhecer os conceitos fundamentais de
algoritmos, entender a sua importância e, ainda, compreender por que
eles são tão utilizados no desenvolvimento de sistemas.

Embarcar no universo da programação é abrir as portas para a


resposta a desafios complexos e a criação de soluções inovadoras. É
preciso se inteirar a respeito das estruturas existentes para construir
soluções inteligentes e essenciais na atualidade. Isso não apenas torna
o código mais eficiente, como também proporciona uma abordagem
flexível para a resolução de problemas.

As empresas buscam profissionais capazes de criar códigos robustos,


que respondam dinamicamente a variáveis e situações diversas. A
capacidade de implementar condicionais de forma inteligente, assim,
otimiza processos e demonstra uma compreensão sólida da lógica de
programação.

Especialistas que dominam as estruturas de seleção são capazes de


criar algoritmos mais desenvolvidos, adaptáveis e eficazes. Essa
habilidade facilita a resolução de problemas complexos e destaca os
programadores como ativos valiosos em um mercado cada vez mais
competitivo e dinâmico. Ela enriquece o repertório técnico, além de ser
um diferencial estratégico. Portanto, ao compreender as estruturas
condicionais, os programadores se capacitam para criar soluções
arrojadas, contribuindo para o progresso contínuo no mundo da
programação.

É Hora de Praticar!
Chegou o momento, caro estudante, de colocar em prática o
conhecimento adquirido nesta unidade de ensino. Para tanto, vamos
abordar um estudo de caso sobre Processo de conserto de
motocicleta com o cenário descrito a seguir.

Suponha que você trabalhe em uma oficina de motocicletas e receba


um cliente com um veículo apresentando problemas de funcionamento.
O cliente relata que a moto está falhando e deseja uma análise
mecânica para identificar o problema.

O desafio é criar um algoritmo que ajude o mecânico a diagnosticar o


mau funcionamento com eficiência em todo o processo. O passo a
passo seria o seguinte:

1. Coleta de informações: o algoritmo deve solicitar o input das


informações do cliente colhidas pelo mecânico ou atendente.
2. Inspeção da motocicleta: o veículo segue para diagnóstico dos
possíveis problemas.
3. Proposta de solução: já com o diagnóstico provisório, o cliente
recebe uma proposta de solução do(s) problema(s)
apresentado(s).

Agora é a sua vez! Utilize seus conhecimentos em algoritmos para criar


soluções para o estudo de caso apresentado. Siga os passos
sugeridos no gabarito e demonstre suas habilidades para a resolução
desse desafio.

Reflita
No contexto do aprendizado de programação, é essencial compreender
não apenas as técnicas específicas, como também a importância de
estruturas, como as estruturas condicionais dentro da lógica de
programação e o uso de pseudocódigos.

A seguir, apresentamos duas questões de reflexão para aprofundar


nossa compreensão sobre esses temas:

1. Estruturas de seleção

Após ter explorado as estruturas de seleção, pense quais


habilidades específicas são necessárias para criar condicionais
claros e eficazes?
Como o domínio dessas estruturas pode impactar diretamente na
qualidade e adaptabilidade do código?
Ao colocar essas questões, procure compreender a importância
de aprimorar suas competências no campo e como isso pode
influenciar positivamente a resolução de problemas complexos no
mundo da programação.

2. Estruturas de repetição

Ao refletir sobre as estruturas de repetição, analise como a


habilidade de criar loops eficientes pode otimizar a execução de
algoritmos.
Considere as situações em que a repetição controlada é
necessária e como diferentes estruturas, como o enquanto-faça e
o repita até, podem ser aplicadas de maneira inteligente.
Quais são os benefícios de criar algoritmos que podem lidar
dinamicamente com tarefas repetitivas?
Como o domínio das estruturas de repetição pode influenciar a
eficiência e a escalabilidade do código?

Ao fazer essas reflexões, busque compreender a importância de


desenvolver conhecimentos sólidos na área para enfrentar desafios
variados e criar soluções mais robustas em programação.

Dê o Play!

Clique aqui para acessar os slides do Dê o play!

Resolução do estudo de caso

Processo de conserto de motocicleta

Passo 1: Coleta de informações

O mecânico inicia o processo coletando informações do cliente


sobre os sintomas da motocicleta, o que inclui questioná-lo sobre
quando os problemas começaram, se há algum padrão nas
falhas, entre outras perguntas relevantes.

Passo 2: Inspeção física

O próximo passo envolve uma inspeção física da motocicleta. O


mecânico verifica o sistema de ignição, o filtro de ar, as velas de
ignição e outros componentes essenciais. Ele realiza testes
visuais e, se necessário, testes práticos para observar o
comportamento da moto.

Passo 3: Análise de dados

Com as informações coletadas, o mecânico analisa os dados


para identificar a causa raiz do problema. Ele verifica os
resultados dos testes, os códigos de falha e as observações para
formar um diagnóstico preciso.

Passo 4: Proposta de solução

Com o diagnóstico em mãos, o mecânico propõe uma solução ao


cliente. Isso pode incluir a substituição de peças, ajustes
específicos ou reparos necessários. O cliente é informado sobre o
custo estimado e a extensão do trabalho a ser feito.

Conclusão

Esse estudo de caso destaca a importância de uma abordagem


sistemática para resolver problemas em um contexto de reparo
mecânico de motocicletas. A coleta cuidadosa de informações, a
inspeção física, o uso de ferramentas de diagnóstico e a análise de
dados são, portanto, passos para uma resolução eficiente. Esse
processo exemplifica, assim, como a lógica de programação pode ser
aplicada de forma prática na resolução de desafios do mundo real.

Dê o play!

Assimile

Neste infográfico, apresentamos, resumidamente, os principais


conceitos relacionados aos elementos de algoritmos.
Figura | Elementos algoritmos. Fonte: elaborada pelo autor.

Referências

CORMEN, T. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro:


LTC, 2022.

MENÉNDEZ, A. Simplificando algoritmos. São Paulo: LTC, 2023.

SILVA, F. S. C. da; FINGER, M.; MELO, A. C. V. Lógica para


computação. 2. ed. São Paulo: Cengage Learning, 2017.
ZIVIANI, N. Projeto de algoritmos com implementações em Pascal
e C. 3. ed. São Paulo: Cengage Learning, 2011.

Você também pode gostar