Você está na página 1de 126

Jovens

programando
Guia de programação para o ensino médio

Algoritmo e Estrutura de dados


Conteúdos 1. Algoritmo e estrutura de dados
1.1.Conceito de algoritmo
1.2.Representações visuais de
algoritmos
1.3.Português estruturado
1.4.Conceitos Básicos
1.4.1. Estruturas primitivas
1.4.2. Variáveis
1.4.3. Entradas e saídas,
1.4.4. Controle de fluxo
1.4.5. procedimentos e funções
1.5.Apontadores
1.6.Alocação estática e dinâmica de
memória
1.7.Tipos abstratos de dados
1.8.Estrutura de dados
1.9.Estrutura de dados lineares
1.10. Listas e Filas
1.11. Métodos de pesquisa e
classificação de dados
Para aquecer
O Sudoku é interessante para aprender programação porque envolve muitos
conceitos-chave que são importantes na programação, tais como:

1. Lógica e raciocínio: O Sudoku requer a aplicação de lógica e raciocínio para


resolver o quebra-cabeça. Essas habilidades também são essenciais para a
resolução de problemas de programação.
2. Algoritmos: Para resolver o Sudoku, é necessário criar um conjunto de
passos ou regras para seguir. Esses passos podem ser considerados
algoritmos, que são um conjunto de instruções precisas para resolver um
problema específico. A capacidade de criar algoritmos é uma habilidade
fundamental em programação.
3. Estruturas de dados: O Sudoku envolve a manipulação de dados em uma
grade de 9x9, o que é um exemplo de estrutura de dados. As estruturas de
dados são formas de organizar dados para torná-los mais fáceis de acessar e
manipular em um programa de computador.
4. Otimização: Resolver um quebra-cabeça de Sudoku requer encontrar a
melhor solução possível. Isso envolve a otimização, que é a prática de
encontrar a solução mais eficiente ou mais rápida possível para um
problema. A otimização também é um conceito importante em programação,
onde os desenvolvedores procuram escrever programas que funcionem de
forma rápida e eficiente.

Por todas essas razões, o Sudoku pode ser uma ferramenta útil e
divertida para ajudar a desenvolver habilidades importantes em
programação.

Imprima o sudoku abaixo e deixe os jovens preencherem:


Sudoku é um jogo com números. O objetivo é preencher uma grade de 9 por 9
com números de 1 a 9, sem repetir nenhum número na mesma linha, coluna
ou quadrado de 3 por 3.

O objetivo do Sudoku é preencher uma grade de 9x9 com números de 1 a 9, sem


repetir nenhum número na mesma linha, coluna ou quadrado de 3x3. Use os
números já preenchidos para descobrir onde os outros números devem ir e tente
preencher todos os espaços em branco usando a lógica. Quando você terminar, terá
resolvido um quebra-cabeça divertido.

Nome: ______________________________________________
Turma: _______________________ Data:__________________
Resultado do Sudoku
Conceitos de algoritmo

O que é um algoritmo?

Um algoritmo é como uma receita de bolo: uma sequência de passos que te ajudam
a chegar a um resultado específico. Mas em vez de bolo, um algoritmo é usado para
resolver problemas ou realizar tarefas.

Esses passos são lógicos, precisos e finitos, o que significa que eles são organizados,
claros e param em algum momento. Isso ajuda a garantir que o algoritmo sempre
chegue a um resultado esperado.

Os algoritmos são usados em muitas áreas diferentes, desde ciência da computação


até matemática, engenharia e ciência. Eles são especialmente úteis quando
precisamos resolver um problema de forma organizada e eficiente, sem perder
tempo tentando várias soluções diferentes.

Como os algoritmos funcionam?

Um algoritmo geralmente é criado por um programador, engenheiro, matemático


ou cientista que quer resolver um problema específico. O algoritmo é dividido em
etapas individuais, cada uma realizando uma tarefa específica. Cada etapa é
cuidadosamente escrita para que a solução do problema seja alcançada.

Por exemplo, um algoritmo para fazer uma xícara de chá pode incluir as seguintes
etapas:

• Encha uma chaleira com água.


• Ligue a chaleira na tomada.
• Espere até que a água ferva.
• Escolha a sua xícara preferida.
• Coloque o sachê de chá na xícara.
• Despeje a água quente sobre o sachê de chá.
• Adicione açúcar ou leite, se desejado.
• Cada etapa desse algoritmo é importante para garantir que a xícara de
chá seja feita corretamente.

Por que os algoritmos são importantes?

Os algoritmos são muito importantes porque ajudam a resolver problemas de


maneira organizada e eficiente. Eles são uma sequência de passos lógicos e precisos
que podem ser usados em diversas áreas, como computação, matemática, ciência e
engenharia.
Pense nos algoritmos como um manual que mostra a maneira correta de fazer algo.
Eles podem ser usados para resolver muitos tipos diferentes de problemas, desde
cálculos matemáticos até a classificação de palavras em ordem alfabética.
Algoritmos também são úteis na programação de computadores, pois ajudam os
programadores a criar softwares que executam tarefas específicas, como navegar na
internet, editar fotos e tocar música.
Os algoritmos são importantes porque nos permitem resolver problemas de
maneira mais rápida e eficiente. Sem eles, teríamos que tentar soluções aleatórias
até encontrar a correta, o que seria muito demorado e frustrante. Com algoritmos,
podemos chegar à solução correta seguindo um caminho lógico e bem definido.

Exemplos de algoritmo
Vamos ver um exemplo de algoritmo para desenhar um círculo:

• Pegue um lápis e uma folha de papel.


• Desenhe um ponto no centro da folha.
• Coloque a ponta do lápis no ponto e faça um círculo ao seu redor.
• Continue desenhando até que o círculo esteja completo.

Algoritmo para fazer um bolo:

• Pré-aqueça o forno a 180 graus Celsius.


• Misture a farinha, açúcar, ovos, leite e manteiga em uma tigela.
• Adicione o fermento e misture novamente.
• Despeje a mistura na forma e coloque no forno.
• Asse o bolo por 30 a 40 minutos.
• Retire o bolo do forno e deixe esfriar antes de servir.

Algoritmo para ordenação de número:

Este algoritmo é usado para ordenar um conjunto de números em ordem


crescente. Existem vários algoritmos de ordenação, mas um dos mais comuns é o
chamado "bubble sort".
Aqui está um exemplo de como o algoritmo funcionaria para ordenar a lista
{5, 3, 8, 4, 2}:

1. Comece com uma lista de números a serem ordenados.


2. Compare o primeiro número com o segundo número. Se o primeiro número
for maior do que o segundo número, troque suas posições.
3. Continue comparando cada par de números na lista, movendo-se um número
para a direita a cada comparação.
4. Repita este processo até que chegue ao final da lista. Neste ponto, o maior
número estará na última posição.
5. Comece de novo na primeira posição e repita o processo até que a lista esteja
completamente ordenada.
Comparando 5 e 3, trocamos suas posições: {3, 5, 8, 4, 2}
6. Comparando 5 e 8, não precisamos trocar: {3, 5, 8, 4, 2}
7. Comparando 8 e 4, trocamos suas posições: {3, 5, 4, 8, 2}
8. Comparando 8 e 2, trocamos suas posições: {3, 5, 4, 2, 8}
9. Agora chegamos ao final da lista, então o 8 está no lugar certo. Começamos
de novo com o primeiro par de números.
10. Comparando 3 e 5, não precisamos trocar: {3, 5, 4, 2, 8}
11. Comparando 5 e 4, trocamos suas posições: {3, 4, 5, 2, 8}
12. Comparando 5 e 2, trocamos suas posições: {3, 4, 2, 5, 8}
13. Agora chegamos ao final da lista novamente, então o 5 está no lugar certo.
Começamos de novo com o primeiro par de números.
14. Comparando 3 e 4, não precisamos trocar: {3, 4, 2, 5, 8}
15. Comparando 4 e 2, trocamos suas posições: {3, 2, 4, 5, 8}
16. Agora chegamos ao final da lista novamente, então o 4 está no lugar certo.
Começamos de novo com o primeiro par de números.
17. Comparando 3 e 2, trocamos suas posições: {2, 3, 4, 5, 8}
18. Agora a lista está ordenada!

Este algoritmo pode ser implementado em várias linguagens de programação,


como C++, Python, Java, entre outras. É importante para os estudantes de ensino
médio entenderem como os algoritmos de ordenação funcionam, pois eles são
usados em muitas áreas da ciência da computação, como em bancos de dados,
sistemas de busca e análise de dados.

O que é preciso para fazer um programa de


computador?
Os programas de computador são uma parte fundamental de nossa vida diária. Eles
nos ajudam a realizar tarefas, a se conectar com outras pessoas e a acessar
informações importantes. No entanto, muitos de nós não sabemos como esses
programas são criados. Nesta apostila, vamos explorar os elementos básicos
necessários para criar um programa de computador.
Linguagens de Programação
A primeira coisa que você precisa para criar um programa de computador é uma
linguagem de programação. Uma linguagem de programação é uma forma de
escrever instruções que o computador pode entender e executar. Existem muitas
linguagens de programação diferentes, cada uma com suas próprias características
e vantagens.
Um exemplo de linguagem de programação popular é o Java. Java é uma linguagem
de programação orientada a objetos que é usada para criar uma ampla variedade de
aplicativos e sistemas, desde jogos até aplicativos empresariais.
Linguagem Lexical e sintática
A linguagem lexical e sintática são como as regras de uma brincadeira que você
precisa seguir para que o jogo funcione bem. Na brincadeira, existem palavras que
têm significados específicos e ajudam a fazer a brincadeira funcionar corretamente.
Por exemplo, se você está jogando pega-pega, a palavra "pega" significa que você
precisa tocar alguém para pegá-lo.
Na programação, é a mesma coisa! A linguagem lexical é como as palavras que você
usa na brincadeira, cada palavra tem um significado específico e ajuda o computador
a entender o que você quer fazer. São as instruções que você dá para o computador
para que ele possa executar uma tarefa.

Mas a linguagem sintática é ainda mais importante! É como as regras da brincadeira,


as regras que você precisa seguir para que o jogo funcione bem. Quando você
escreve um programa, precisa seguir as regras da linguagem sintática para que o
computador possa entender o que você quer fazer. É como se você tivesse que seguir
as regras do jogo para que a brincadeira funcione direito.
Então, tanto na brincadeira quanto na programação, é importante seguir as regras
da linguagem lexical e sintática para que tudo funcione bem!

Ambiente de Desenvolvimento Integrado (IDE)


Depois de escolher a linguagem de programação que você vai usar, é necessário ter
um ambiente de desenvolvimento integrado (IDE) para escrever e testar seu código.
Um IDE é um software que fornece um conjunto de ferramentas para ajudá-lo a
escrever código de forma eficiente e eficaz.
Existem muitos IDEs disponíveis, e alguns deles são gratuitos e de código aberto,
como o Eclipse e o Visual Studio Code. Essas ferramentas possuem recursos úteis
como depuradores, verificadores de sintaxe, realce de sintaxe e muito mais.
Exemplos:

C/C++ : Code Blocks

Java : Eclipse, NetBeans

C# : Microsoft Visual Studio

Estrutura do Programa
A próxima coisa que você precisa é de uma estrutura básica para o seu programa.
Isso pode variar dependendo da linguagem de programação que você está usando,
mas geralmente inclui a definição de funções e variáveis, bem como a estrutura geral
do programa.
Por exemplo, em Java, um programa geralmente começa com um método principal
chamado "main", que é o ponto de entrada para o programa. Você também pode
precisar definir outras classes e métodos para lidar com funções específicas do
programa.

Compilação e Execução
Depois de escrever seu programa, você precisa compilá-lo para transformá-lo em
código executável que o computador pode entender. A compilação é o processo de
transformar o código-fonte em um arquivo executável. A maioria das linguagens de
programação inclui um compilador que você pode usar para compilar seu programa.
Uma vez que seu

programa tenha sido compilado, você pode executá-lo para ver se ele funciona como
esperado. Você pode fazer isso chamando o arquivo executável a partir da linha de
comando ou usando uma ferramenta de execução integrada no seu IDE.
Criar um programa de computador pode parecer assustador, mas na verdade é um
processo que qualquer pessoa pode aprender com dedicação e prática. Com uma
linguagem de programação, um ambiente de desenvolvimento integrado, uma
estrutura básica e o conhecimento sobre compilação e execução, você pode começar
a criar seus próprios programas. Esperamos que esta apostila tenha sido útil para
ajudá-lo a entender melhor o processo de criação de um programa de computador.
• Código fonte
Código fonte é o conjunto de instruções que um programador escreve em
uma linguagem de programação, com o objetivo de criar um programa de
computador. Essas instruções são escritas em uma linguagem que as pessoas
podem entender, como C++, Python, Java, entre outras, e precisam ser
traduzidas para uma linguagem que o computador possa entender e
executar.
O código fonte é como a receita de um bolo, que contém todas as instruções
detalhadas que o confeiteiro deve seguir para produzir o bolo. Da mesma
forma, o código fonte contém todas as instruções que o computador precisa
seguir para executar o programa.
Os programadores escrevem o código fonte usando editores de texto ou IDEs
(Integrated Development Environment), que são ferramentas que ajudam a
escrever e organizar o código. Uma vez que o código fonte é escrito, ele
precisa ser compilado ou interpretado para ser executado pelo computador.
O código fonte é muito importante, pois é a base para a criação de programas
e sistemas de software. Ele permite que os programadores criem soluções
personalizadas para diferentes problemas e necessidades, desde aplicativos
de celular até sistemas operacionais e softwares empresariais.
Em resumo, o código fonte é o conjunto de instruções escritas em uma
linguagem de programação, que precisam ser traduzidas para uma
linguagem que o computador possa entender e executar. Ele é a base para a
criação de programas e sistemas de software que são usados em diferentes
áreas da tecnologia e do mundo dos negócios.

Exemplos:
• Código Objeto:
Código objeto é o resultado da compilação do código fonte em linguagem de
máquina ou em um código de baixo nível, que pode ser executado
diretamente pelo computador. Em outras palavras, é o código binário gerado
pelo compilador a partir do código fonte.

O código objeto é composto de instruções em linguagem de máquina, que são


sequências de zeros e uns que o processador do computador é capaz de
entender. O código objeto é otimizado para a execução eficiente pelo
processador, mas não pode ser lido ou modificado por seres humanos.

Aqui estão alguns exemplos de como o código objeto pode se parecer em


diferentes linguagens de programação:

Java

C++
• Código Executável
Um código executável é aquele que pode ser executado diretamente pelo
computador, sem a necessidade de ser compilado ou interpretado
novamente. Ele é gerado a partir do código objeto, passando por um processo
de ligação com bibliotecas externas e ajustes finais. Abaixo estão alguns
exemplos de códigos executáveis em diferentes linguagens de programação:

o C/C++: o código fonte é compilado para gerar o código objeto, que em


seguida é ligado com as bibliotecas externas para gerar o arquivo
executável. Por exemplo, o arquivo "hello.c" abaixo pode ser
compilado com o comando "gcc hello.c -o hello" para gerar o
executável "hello":

o Java: o código fonte é compilado para gerar o bytecode, que é


interpretado pela máquina virtual Java para gerar o resultado final.
Por exemplo, o arquivo "Hello.java" abaixo pode ser compilado com o
comando "javac Hello.java" para gerar o arquivo "Hello.class", que
pode ser executado com o comando "java Hello":

Interpretação
A interpretação é um processo que ocorre em tempo real enquanto o programa é
executado. Em vez de compilar o código fonte em um arquivo executável, o
interpretador lê o código fonte linha por linha e executa cada instrução conforme
ela é encontrada. Isso significa que, em vez de criar um arquivo executável, o
programa é executado diretamente pelo interpretador. A interpretação é usada em
linguagens de programação como Python e JavaScript.
Criando seu próprio algoritmo
Agora que você entende o que é um algoritmo, vamos criar juntos! Faça um
algoritmo para fazer um sanduíche:

Exemplo:

1. Pegue duas fatias de pão.


2. Coloque o recheio que você gosta em uma das fatias de pão.
3. Coloque a outra fatia de pão em cima.
4. Corte o sanduíche em metade.
5. Sirva e aproveite seu sanduíche!
Atividades:
Os ingredientes a seguir estão disponíveis, mas é necessário colocar os
procedimentos em ordem para que o nosso robô prepare um bolo de laranja.
Você pode ajudar?

Ingredientes:

• 3 ovos
• Suco de 2 laranjas
• 1 xícara (chá) de óleo
• 2 xícaras (chá) de açúcar
• 3 xícaras (chá) de farinha de trigo
• 1 colher (sopa) de fermento em pó
• 1 colher (sopa) de margarina

( ) Despeje o conteúdo do liquidificador em uma tigela;

( ) Unte a forma com margarina e farinha.

( ) Ligue o forno.

( ) Jogue na tigela a farinha e o fermento, misture tudo até a massa ficar

homogênea.

( ) Asse em forno médio, pré aquecido, por cerca de 40 minutos.

( ) Coloque o conteúdo da tigela na fôrma;

( ) Coloque no liquidificador as claras, gemas, suco de laranja, óleo e açúcar;

( ) Leve a fôrma ao forno.

( ) Bata bem os ingredientes do liquidificador.

• Escreva um algoritmo para escovar os dentes. Certifique-se de incluir todos


os passos necessários.

• Faça uma lista de três tarefas que você faz todos os dias e escreva um
algoritmo para cada uma delas.

• Crie um algoritmo para colorir um desenho. Certifique-se de incluir todas as


etapas necessárias.

• Faça uma lista de duas receitas diferentes e escreva o algoritmo para cada
uma delas.
Representações visuais de Algoritmos
No lugar de palavras, podemos utilizar símbolos para representar nossos
algoritmos.
Observe o algoritmo para cálculo da média de duas notas sendo representado por
meio de diagramas na imagem abaixo:

Diagramas de fluxo
Os diagramas de fluxo são uma maneira comum de representar algoritmos
visualmente. Ele usa símbolos simples, como círculos, quadrados e setas, para
representar diferentes partes do sistema e como elas se conectam.
No fluxograma é criado o mapa visual onde podemos mostrar as diversas etapas de
um sistema, com as coordenadas para seu desenvolvimento, tornando o conjunto
das etapas um trabalho padronizado, organizado, que possa ser entendido e
utilizado por qualquer pessoa
Entre os símbolos mais conhecidos do fluxograma, podemos destacar:
Início e fim: geralmente o símbolo
usado no início do fluxograma é
um retângulo com bordas
arredondadas, estabelecendo o
começo e o término do fluxo
apresentado. Nos retângulos
também estão inseridas as ações
necessárias para o processo;
Setas: usadas para indicar o
sentido do fluxo das etapas;
Losangos: os losangos
representam as alternativas ou
questões criadas pelas etapas,
devendo sempre apresentar duas
saídas para as respostas positivas
ou negativas;

Aqui está um exemplo de um diagrama de fluxo para um algoritmo que calcula a


média de três números e se a Média for maior que 6 o aluno estará “Aprovado” e
menor que 6 “Reprovado”:
Exemplo:

Aquecimento
Observe a representação abaixo e siga os passos determinados:

RESPOSTA COMENTADA: Suponhamos que pense no número 8, 8X9 = 72 > agora


some os algarismos (7 + 2) = 9 ou seja 9 não é maior que 9. Já que o resultado
esperado será sempre 9, a letra correspondente será a letra “I”, que é a 9ª letra do
alfabeto. Sendo assim, possíveis nomes de países que serão falados pelos alunos
podem ser: Itália, Iêmem, Irlanda, Islândia, Irã, Iraque, Índia, etc…
Atividades
1. Josué preparou um relatório contendo as etapas que os clientes podem seguir
em seu restaurante self-service (onde o pagamento é feito de acordo com o
peso da comida que o cliente coloca no prato). Ele perdeu parte do relatório,
mas a representação gráfica está abaixo. Você pode ajudá-lo numerando as
etapas de acordo com o desenho?

( ) Ir até a cozinha do restaurante.


( ) Fazer o pagamento.
( ) Lavar as mãos
( ) Responder ao garçom se vou querer algo para beber.
( ) Pegar prato e talheres.
( ) Decidir se tomo um sorvete ou não.
( ) Escolher uma mesa e sentar.
( ) Estacionar o carro próximo ao restaurante.
( ) Colocar a comida que eu escolher no prato.
( ) Pesar o prato.
( ) Decidir se como carne de churrasco ou não.

2. Elabore um fluxograma que utilize os ingredientes listados abaixo para fazer


um sanduíche de presunto, queijo e manteiga.
o 1 Pão francês;
o 2 Fatias de pão de forma;
o Queijo fatiado;
o Presunto fatiado;
o Faca de cortar pão;
o Manteiga;
O Fluxograma deve dar as duas opções de pão e os procedimentos em cada
caso:

3. Organize as atividades abaixo em forma de fluxograma a fim de preparar as vendas de


bolo de chocolate na Feira de Ciências da Escola.
o Calcular o lucro (ou prejuízo) nas vendas realizadas
o calcular o custo do bolo e dos acessórios (guardanapos, pratinhos, garfinhos,
etc)
o Recolher o dinheiro dos componentes do grupo
o Fazer o bolo
o Calcular o preço de cada fatia para que o grupo tenha lucro
o Vender o bolo durante a Feira de Ciências
o Dividir o bolo em fatias
o Comprar os ingredientes
4. Escreva um Fluxograma que seja capaz de colocar em ordem crescente uma
lista com três números inteiros diferentes digitados e sabendo que o
computador só pode compará-los 2 a 2.
Resolução comentada
1. Uma ordem correta pode ser:
(1) Lavar as mãos;
(2) Pegar prato e talheres;
(3) Colocar a comida que eu escolher no prato;
(4) Decidir se como carne de churrasco ou não;
(5) Pesar o prato;
(6) Escolher uma mesa e sentar;
(7) Responder ao garçom se vou querer algo para beber;
(8) Decidir se tomo um sorvete ou não;
(9) Fazer o pagamento.
É possível que as ações “Decidir se como carne de churrasco ou não”,
“Responder ao garçom se vou querer algo para beber” e “Decidir se tomo um
sorvete ou não” estejam em posições diferentes. A rigor essas possibilidades
não alteram o objeto final do problema, mas, já que há que ser observada uma
correspondência com a figura, então, sugere-se valorizar as alternativas que
os alunos apresentem, mas que, conforme figura, alterações muito
significativas podem não ser úteis ao Josué.

2. Uma alternativa de solução seria:


3. Possibilidade de resposta:

4. Possibilidade de resposta
Português estruturado (Portugol)

Portugol é uma linguagem de programação em português que serve para criar


algoritmos, que são sequências de instruções lógicas e precisas para resolver
problemas e automatizar tarefas no computador. Ela é muito útil para quem está
começando a aprender programação, pois é fácil de entender e não exige
conhecimento prévio de outras linguagens de programação mais complexas, como
JavaScript e C##.
Embora o Portugol não seja usado para criar programas reais, é uma ótima
ferramenta para quem está aprendendo os conceitos básicos de programação. Com
ele, é possível entender como os programas funcionam e como são criados de
forma organizada e estruturada.
Exemplos de algoritmos simples em Portugol:
1. Calcular a média de notas de uma turma:
• Ler as notas dos alunos
• Calcular a média das notas
• Escrever a média na tela

2. Verificar se um número é par ou ímpar:


• Ler o número
• Verificar se o número é divisível por 2
• Escrever na tela se o número é par ou ímpar

Comandos básicos em Portugol (visualG)


Para começarmos a criar nossos primeiros algoritmos, precisamos saber qual é a
estrutura básica, presente no mais simples ou no mais complexo algoritmo.
Um algoritmo escrito em portugol possui três divisões básicas:
• Seção em que você digita um nome para seu algoritmo;
• Seção de declaração de variáveis;
• Seção em que você digita o algoritmo propriamente dito.
Observe na imagem abaixo as três seções:
A mesma estrutura acima no editor:

Exemplo #1: Escrever um algoritmo para calcular a soma de dois número inteiros
quaisquer.
Em linguagem comum pode ficar assim:

Em portugol, temos:

Explicando cada linha do algoritmo em portugol:


• Linha 1: Nesta linha, damos o nome “soma” ao nosso algoritmo.


• Linha 2: A palavra reservada var indica o início da seção de
declaração das variáveis.
• Linha 3: Declaramos uma variável chamada numero1, indicando
que seu tipo é inteiro.
• Linha 4: Declaramos uma variável chamada numero2, indicando
que seu tipo é inteiro.
• Linha 5: Declaramos uma variável chamada soma, indicando que
seu tipo também é inteiro.
• Linha 6: A palavra reservada inicio indica a seção na qual são
escritas as instruções que fazem parte de nosso algoritmo.
• Linha 7: A instrução leia(numero1) executa a leitura do primeiro
número digitado na entrada de dados padrão, que neste caso é o
teclado. Após a leitura, o número é armazenado no espaço de
memória reservado para a variável numero1.
• Linha 8: A instrução leia(numero2) executa a leitura do
segundo número digitado na entrada de dados padrão, que neste
caso também é o teclado. Após a leitura, o número é armazenado no
espaço de memória reservado para a variável numero2.
• Linhas 9 e 11: Habitue-se a utilizar espaços em branco e tabulações
para deixar seus algoritmos mais legíveis e elegantes. Espaços em
branco e marcas de tabulações são ignorados quando executamos
nossos algoritmos.
• Linha 10: Nessa linha, observe dois detalhes importantes: primeiro,
a presença do operador “<-“, chamado de operador de atribuição;
segundo, a sequência de execução dessa linha é da direita para a
esquerda: a soma das variáveis numero1 e numero2 é executada e,
em seguida, o resultado é armazenado (atribuído) na variável soma.
• Linha 11: A instrução escreva(soma) exibe o conteúdo da
variável soma no dispositivo de saída padrão do sistema: no nosso
caso, o monitor de vídeo.
• Linha 13: A palavra reservada fimalgoritmo indica o fim da
execução do nosso algoritmo.
NOTA: O importante no momento não é a linguagem em si, mas a construção de
um pensamento lógico e estruturado para criar algoritmos eficazes.

1. Comando de atribuição:
O comando de atribuição é usado para atribuir um valor a uma variável.
Por exemplo, se você quiser atribuir o valor 10 à variável "x", o código seria:
1.1 O que são variáveis?

O computador é uma máquina que recebe dados, processa-os e retorna os


resultados.
Todo esse processamento é executado por meio do armazenamento desses
dados em memória por meio da utilização de variáveis e constantes.

As variáveis, como o próprio nome indica, guardam temporariamente o


conteúdo a ser utilizado na execução dos programas, podendo ser
modificado no decorrer do tempo.
O tipo de variável a ser utilizada depende do tipo de dado (numérico, literal,
lógico, etc.) a ser representado.
Dando nomes aos bois…
A variável, antes de ser usada dentro do programa, deve ser declarada
escolhendo-se um nome adequado e indicando-se o seu tipo.
Há certas restrições quanto aos nomes que podem ser dados às variáveis:
• Não pode ser uma palavra reservada do portugol;
• Não pode conter caracteres especiais nem acentos;
• Não pode começar com um número, com exceção do underline;
• Não pode conter espaços em branco;
• Só pode ser constituída por letras, números e underline.

Nomes válidos para variáveis:



ocpf
o fone1
o nomecliente
o _idade
Nomes inválidos:

o &cpf
o 2fone
o nome cliente
o endereço

1.2 Tipos de dados portugol


Como já sabemos, um algoritmo consiste numa sequência de passos bem definidos
com o intuito de resolver um dado problema.
Ou seja, um algoritmo realiza um conjunto de instruções numa determinada ordem
sobre um conjunto de dados de entrada, tendo em vista um conjunto de dados de
saída desejado. Um algoritmo, portanto, é uma ferramenta computacional
responsável por transformar dados brutos de entrada em informação útil na saída.
Diante do exposto, é importante que, ao desenvolvermos um algoritmo, deixemos
explícito com quais tipos de dados ele irá trabalhar, uma vez que o computador nada
mais é do que uma máquina à espera de instruções e dados para processar.

Nós, seres humanos, por exemplo, manipulamos em nossas atividades profissionais


e pessoais vários tipos de dados e informações: senhas dos mais variados tipos,
contas bancárias, datas de aniversários, o valor do nosso salário, um poema
predileto, uma música que nos marcou, o cheiro de um perfume, a foto de um
momento especial, etc.
A partir dessa diversificada gama de tipos de dados, realizamos cálculos mentais,
repetimos ações, tomamos decisões dentre outros “processamentos” diversos.
Com os computadores, ocorre algo parecido. Para que ocorra um processamento
dito correto sobre os dados de entrada faz-se necessário que o computador “saiba”
de antemão em que tipo específico um dado se classifica.
Os tipos de dados podem variar de uma linguagem de programação para outra,
contudo, os mais comuns são:
• numéricos (inteiros e reais),
• literais e
• lógicos.
Tipos Inteiros
São os dados numéricos constituídos pelo conjunto dos números inteiros, ou seja, o
conjunto dos naturais mais os números negativos.
Exemplos:
o Eu tenho 33 anos de idade.
o João tem 2 filhos.

Tipos Reais
São os dados numéricos constituídos pelo conjunto dos números naturais, inteiros
e racionais, ou seja, números negativos, positivos, fracionários e com casas decimais.
Por exemplo: 12; -1245; 45,98; 1/8.
No Brasil, separamos a parte inteira da parte decimal de um número utilizando a
vírgula (,). Na construção de algoritmos, a notação a ser usada é a inglesa, que utiliza
o ponto (.). Então, por exemplo, 1234,56 ficaria 1234.56.
Exemplos:
o A área de um terreno é igual a 123,50 m2.
o O saldo da conta é R$ -258,69.
o A temperatura ambiente é de -20°C.

Tipos Literais
São constituídos por sequências de letras, números e símbolos especiais,
incluindo os espaços em branco.
O tipo literal deve ser definido entre aspas duplas, ” “.
Outras denominações do tipo de dado literal encontradas nos livros técnicos são:
cadeia, string, alfanumérico.
Exemplos:

o “Celular: (98) 1234-5678”.


o “CPF: 123.456.789-10”.
o “Endereço: Rua Fulano de Tal, nº 1234”.
o “Hélio Andrade”.
Tipos Lógicos
São os dados que assumem os valores VERDADEIRO ou FALSO. São também
conhecidos como tipos de dados booleanos em homenagem a George Boole.

Há outros tipos de dados, porém, os que serão tratados aqui são suficientes para um
programador iniciante, visto que as habilidades que devem ser desenvolvidas são o
raciocínio lógico e o domínio das estruturas básicas utilizadas na programação de
computadores.
Não se preocupe, pois, à medida que você avança nos seus estudos e vida
profissional, ficará mais simples assimilar novos tipos e estruturas de dados.
É importante destacar que, em Portugol, é necessário declarar o tipo de dado de uma
variável antes de utilizá-la. Por exemplo, se você quiser declarar uma variável "x" do
tipo inteiro, o código seria:

E se você quiser declarar uma variável "y" do tipo real, o código seria:

2. Comando de entrada:
O comando de entrada é usado para receber um valor digitado pelo usuário. Por
exemplo, se você quiser receber um valor para a variável "x", o código seria:

3. Comando de saída:
O comando de saída é usado para exibir um valor na tela. Por exemplo, se você
quiser exibir o valor da variável "x" na tela, o código seria:
4. Comando condicional:
O comando condicional é usado para executar um bloco de código somente se uma
determinada condição for verdadeira. Por exemplo, se você quiser executar um
bloco de código somente se o valor da variável "x" for maior que 10, o código seria:

Esta estrutura provoca um desvio no fluxo de execução das instruções de um


algoritmo, a partir da verificação de uma dada condição.
Em Portugol, temos o seguinte exemplo:

Observe que o algoritmo é executado sequencialmente até a linha 8; na linha 10, é


feito um teste lógico (a condição media >= 7).
Sendo a média calculada maior ou igual a 7, o fluxo do algoritmo é desviado até a
linha 11 e, em seguida, para linha 15 (saltando as linhas 12 e 13).
Caso a média não seja maior ou igual a 7, o fluxo do algoritmo é desviado até a
linha 13, seguindo para a linha 15.

Para começarmos a falar de estrutura de seleção múltipla, considere o seguinte


algoritmo, contendo a instrução se/entao/senao, que recebe um número inteiro
entre 1 e 7 e exibe o dia da semana correspondente:
Observe a quantidade de se/entao/senao… Além de possuir vários níveis de
indentação, o desempenho do algoritmo pode ficar comprometido e a legibilidade
se torna um pouco trabalhosa.
Agora compare o algoritmo acima reescrito utilizando a estrutura de seleção
múltipla escolha/caso:
Sentiu a diferença? Muito mais simples, né?! Ganha-se em legibilidade e eficiência
na execução do algoritmo.
Explicando…
A estrutura de seleção múltipla escolha/caso permite escolher entre várias
opções de ação de acordo com um valor ou condição específica. É similar a uma
estrutura condicional se/senão, mas possui a vantagem de poder avaliar mais de
duas opções diferentes e apresentar um código mais enxuto.
A estrutura de seleção múltipla usa a palavra-chave escolha seguida por uma
expressão que será avaliada. Em seguida, há várias opções caso que correspondem
a diferentes valores ou condições. Se a expressão avaliada corresponder a algum
dos valores especificados no caso, as ações dentro desse caso serão executadas. Se
nenhum dos casos for satisfeito, a ação dentro da opção outrocaso será executada.
O VisuAlg implementa (com certas variações) o comando case do Pascal. A sintaxe
é a seguinte:
O fluxograma dessa instrução pode ser representado da seguinte maneira:

Exemplo:

Mas quando usar se/entao/senao ou escolha/caso?


Enquanto escolha/caso permite uma estrutura de seleção baseada em vários casos,
o se/entao/senao é mais adequado para uma única verificação condicional.
Portanto, a escolha entre se/entao/senao ou escolha/caso depende do contexto e
das necessidades específicas do algoritmo a ser desenvolvido. Ambas as estruturas
são úteis e podem ser utilizadas de maneira eficaz.

5. Comando de repetição

O comando de repetição é usado para repetir um bloco de código várias


vezes. Existem duas formas básicas de comando de repetição: o "enquanto"
e o "para".

• O comando "enquanto" executa um bloco de código enquanto uma


determinada condição for verdadeira. Por exemplo, se você quiser
executar um bloco de código enquanto o valor da variável "x" for
menor que 10, o código seria:
• O comando "para" é usado para executar um bloco de código um
número específico de vezes. Por exemplo, se você quiser executar
um bloco de código 10 vezes, o código seria:

Nesta estrutura, as instruções (ou blocos de instruções) são executadas


repetidamente enquanto uma da dada condição é satisfeita.

Suponha que tenhamos que calcular a média de três alunos. O algoritmo para
calcular a média individual nós já temos, bastando repeti-lo, nesse caso, 3 vezes.
Teremos, portanto, o seguinte algoritmo:
Ao executar o algoritmo acima, atribuímos valores quaisquer para as notas e
obtivemos a seguinte saída:

Cabe destacar que o trecho do algoritmo entre as linhas 7 e 21 é repetido 3 vezes.


NOTA: Por hora, não se preocupe em entender tudo. Atente-se à definição de
algoritmos, como são representados e quais são suas estruturas básicas.

Operadores
Na construção de nossos algoritmos, utilizaremos com frequência
operadores para realizar o trabalho de entrada, processamento e saída de
dados.
Um operador, em termos gerais, simboliza uma operação efetuada sobre
variáveis e constantes, executando cálculos e manipulação sobre os dados.
As operações realizadas pelo computador são as mesmas encontradas na
matemática. A ressalva que fazemos é quanto aos operadores, que diferem
entre sim em algumas operações, como mostrado nas tabelas abaixo.
Os operadores são classificados em três tipos:

• Operadores Aritméticos;
• Operadores Relacionais;
• Operadores Lógicos.
Operadores Aritméticos

São utilizados para executar operações numéricas (aritméticas) e podem


atuar sobre duas variáveis ou constantes – neste caso, são chamados de
operadores binários – ou sobre apenas uma variável ou constante – neste
outro caso, são chamados de operadores unários, indicando uma inversão
de sinal (positivo ou negativo), por exemplo.

Observações:

▪ Símbolos diferentes dos da tabela acima não são aceitos na construção
de nossos algoritmos;
▪ Alguns símbolos matemáticos não existem nos teclados atuais, daí a
necessidade de utilização de outro símbolos, como os sinais de divisão
e multiplicação, por exemplo;
▪ As expressões matemáticas devem ser escritas em linha (in line).
Operadores Relacionais

São utilizados em expressões lógicas para se testar a relação entre dois


valores do mesmo tipo, retornando VERDADEIRO ou FALSO.

Operadores Lógicos

São utilizados quando há a necessidade de serem testadas duas ou mais


condições dentro de um algoritmo simultaneamente.
Os operadores lógicos são:
Operador E(AND)

O Operador “E” ou “AND” resulta em um valor VERDADEIRO se os dois


valores de entrada da operação forem VERDADEIROS, caso contrário o
resultado é FALSO. Abaixo a tabela-verdade da operação E.

Operador OU(OR)

O Operador “OU” ou “OR” resulta em um valor VERDADEIRO se ao menos UM


dos dois valores de entrada da operação for VERDADEIRO, caso contrário o
resultado é FALSO. Abaixo a tabela-verdade da operação OU.
Operador NÃO(NOT)

O Operador “NÃO” ou “NOT” é o único operador que recebe como entrada


apenas um valor, e sua função é simplesmente inverter os valores. Ou seja, se
o valor de entrada for VERDADEIRO, o resultado será FALSO e se o valor de
entrada for FALSO, o resultado será VERDADEIRO. Abaixo a tabela-
verdade da operação NÃO.
Operador NÃO-E(NAND)

O Operador “NÃO-E” ou “NAND” é o contrário do operador E (AND), ou seja,


resulta em VERDADEIRO, se ao menos um dos dois valores for FALSO, na
verdade este é o operador E (AND) seguido do operador NÃO (NOT). Abaixo
a tabela-verdade da operação NÃO-E.

Operador NÃO-OU(NOR)

O Operador “NÃO-OU” ou “NOR” é o contrário do operador OU (OR), ou seja,


resulta em VERDADEIRO, se os dois valores forem FALSO, na verdade este é
o operador OU (OR) seguido do operador NÃO (NOT). Abaixo a tabela-
verdade da operação NÃO-OU.
Operador OU-EXCLUSIVO(XOR)

O Operador “OU-EXCLUSIVO” ou “XOR” é uma variação interessante do


operador OU (OR), ele resulta em VERDADEIRO se apenas um dos valores de
entrada for VERDADEIRO, ou seja, apenas se os valores de entrada forem
DIFERENTES. Abaixo a tabela-verdade da operação OU-EXCLUSIVO.

Operador NÃO-OU-EXCLUSIVO(XNOR)

O Operador “NÃO-OU-EXCLUSIVO” ou “XNOR” é o contrário do operador OU-


EXCLUSIVO (XOR), ou seja, resulta VERDADEIRO se os valores de entrada
forem IGUAIS. Observe a tabela abaixo:
Atividade de Fixação VisualG:

1 - Faça um programa que leia dois números inteiros e exiba a soma entre
eles.

Resposta:

2 - Faça um programa que leia a base e a altura de um triângulo e calcule a


área.

Resposta
3 - Faça um programa que leia dois números inteiros e exiba o resultado da
subtração entre eles.

Resposta

2. Operadores Lógicos:

• E (&&): (a > b) && (b > c) (verifica se a condição a > b é verdadeira e também


se b > c é verdadeira)
• OU (||): (a > b) || (b > c) (verifica se pelo menos uma das condições é
verdadeira)
• NÃO (!): !(a > b) (verifica se a condição a > b é falsa)

3. Operadores de Comparação:

• Igualdade (==): a == b (verifica se a é igual a b)


• Desigualdade (!=): a != b (verifica se a é diferente de b)
• Maior que (>): a > b (verifica se a é maior que b)
• Menor que (<): a < b (verifica se a é menor que b)
• Maior ou igual (>=): a >= b (verifica se a é maior ou igual a b)
• Menor ou igual (<=): a <= b (verifica se a é menor ou igual a b)
Aquecendo

Para o aquecendo você irá precisar de:


• Login no site code monkey
https://app.codemonkey.com/users/sign_up/teacher
• Projetor
• Computador para plugar no projetor

Você precisa realizar o login na sua conta, e fará com que cada aluno resolva uma linha de
código no codemonkey, projetando isso para toda a sala.
Atividades

1. Escreva um programa em Portugol que peça ao usuário para digitar dois


números e exiba a soma deles na tela.
2. Escreva um programa em Portugol que peça ao usuário para digitar um
número e exiba na tela se ele é par ou ímpar.
3. Escreva um programa em Portugol que calcule a média aritmética de três
números digitados pelo usuário e exiba o resultado na tela.
4. Escreva um programa em Portugol que exiba na tela os números de 1 a 10.
5. Escreva um programa em Portugol que peça ao usuário para digitar um
número inteiro e exiba na tela se ele é positivo ou negativo.
6. Escreva um programa em Portugol que peça ao usuário para digitar o seu
nome e exiba uma mensagem de boas-vindas na tela.
7. Escreva um programa em Portugol que peça ao usuário para digitar uma
letra e exiba na tela se ela é uma vogal ou uma consoante.
Resolução atividades portugol

1.

2.
3.

4.
6.

7.
Estruturas primitivas

As estruturas primitivas são os elementos básicos usados para construir programas


em qualquer linguagem de programação. Elas são chamadas de "primitivas" porque
não podem ser divididas em partes menores. Existem quatro tipos de estruturas
primitivas: variáveis, constantes, tipos de dados e operadores. Nesta apostila, vamos
entender o que cada uma dessas estruturas faz e como usá-las para criar programas
em JavaScript.

Variáveis:
Variáveis são espaços reservados na memória do computador para armazenar
valores que serão usados pelo programa. Eles podem armazenar diferentes tipos de
dados, como números inteiros, números decimais, caracteres e booleanos. As
variáveis são definidas pelo programador e podem ser alteradas durante a execução
do programa.
Exemplo de declaração de variáveis em JavaScript:

Constantes:
As constantes são valores fixos que não podem ser alterados durante a execução do
programa. Elas são usadas para armazenar valores que não devem ser alterados,
como o valor de pi (3,14) ou o número de dias em uma semana (7).
Exemplo de declaração de constantes em JavaScript:
Tipos de dados:
Os tipos de dados definem o tipo de valor que uma variável pode armazenar. Eles
podem ser divididos em dois tipos: tipos primitivos e tipos definidos pelo usuário.
Os tipos primitivos incluem inteiros, números decimais, caracteres e booleanos. Os
tipos definidos pelo usuário são criados pelo programador e podem ser usados
para armazenar tipos de dados complexos, como listas e estruturas.

Exemplo de tipos de dados em JavaScript:

Operadores:
Os operadores são usados para realizar operações em variáveis e constantes.
Existem diferentes tipos de operadores, como operadores aritméticos (para
realizar operações matemáticas), operadores de atribuição (para atribuir valores a
variáveis) e operadores lógicos (para realizar operações booleanas).

Exemplo de operadores em JavaScript:


Atividade de Fixação
Tipos de dados

1. Qual é o tipo de dado da variável "idade"?


a) Inteiro
b) Caractere
c) Decimal
d) Booleano

2. Qual é o tipo de dado da variável "nome"?


a) Inteiro
b) Caractere
c) Decimal
d) Booleano

3. Qual é o tipo de dado da variável "lista"?


a) Inteiro
b) Caractere
c) Decimal
d) Lista

4. Qual é o tipo de dado da variável "verdadeiro"?


a) Inteiro
b) Caractere
c) Decimal
d) Booleano
Constantes

5. Qual é o valor da constante PI?


a) 3.14
b) 2.71
c) 1.618
d) 4.669

6. Qual é o valor da constante DIAS_DA_SEMANA?


a) 7
b) 5
c) 10
d) 2

7. É possível alterar o valor de uma constante durante a execução do


programa?
a) Sim
b) Não

8. Qual é o objetivo principal de usar uma constante?


a) Armazenar valores que podem ser alterados
b) Armazenar valores que não podem ser alterados
c) Armazenar valores que não são necessários para o programa
d) Armazenar valores que não são importantes para o programa
Variáveis
9. Qual é o valor inicial da variável "saldo"?
a) 0
b) 1
c) 100
d) Não é possível determinar

10. Qual é o valor atual da variável "idade"?


a) 10
b) 15
c) 20
d) Não é possível determinar

11. Qual é o valor da variável "nome"?


a) "Pedro"
b) "Lucas"
c) "Maria"
d) Não é possível determinar

12. Qual é o objetivo principal de usar uma variável?


a) Armazenar valores que podem ser alterados
b) Armazenar valores que não podem ser alterados
c) Armazenar valores que não são necessários para o programa
d) Armazenar valores que não são importantes para o programa

13. O que acontece quando você atribui um novo valor a uma variável?
a) O valor anterior é perdido
b) O valor anterior é mantido
c) O valor anterior é duplicado
d) Não é possível atribuir um novo valor a uma variável.
Respostas
Tipos de dados
Resposta: a) Inteiro
Resposta: b) Caractere
Resposta: d) Lista
Resposta: d) Booleano

Constantes
Resposta: a) 3.14
Resposta: a) 7
Resposta: b) Não
Resposta: b) Armazenar valores que não podem ser alterados

Variáveis
Resposta: a) 0
Resposta: d) Não é possível determinar (sem informação na pergunta)
Resposta: d) Não é possível determinar (sem informação na pergunta)
Resposta: a) Armazenar valores que podem ser alterados
Resposta: a) O valor anterior é perdido
Atividades

1. Crie uma variável chamada "idade" e atribua o valor 25 a ela.


2. Crie uma constante chamada "PI" e atribua o valor 3,14 a ela.
3. Declare uma variável chamada "nome" que armazena uma string.
4. Use um operador aritmético para somar os valores das variáveis "a" e "b".
Variáveis

Em programação, uma variável é um espaço de memória que armazena um valor


que pode ser modificado ao longo do programa. A variável é identificada por um
nome que deve ser único e seguir algumas regras, como não começar com um
número e não conter espaços ou caracteres especiais.

A declaração de uma variável consiste em informar o tipo de dado que ela irá
armazenar e seu nome. Por exemplo, para declarar uma variável numérica que irá
armazenar a idade de uma pessoa, utilizamos a seguinte sintaxe em algumas
linguagens de programação:

Nesse caso, "int" é o tipo de dado (inteiro) e "idade" é o nome da variável.


Para atribuir um valor a uma variável, utilizamos o operador de atribuição "="
seguido do valor desejado. Por exemplo:

A partir desse momento, a variável "idade" irá armazenar o valor 25.


As variáveis podem ser utilizadas em operações matemáticas e em condicionais,
como no exemplo a seguir:

Nesse caso, utilizamos a variável "idade" em uma condicional para verificar se a


pessoa pode votar ou não.
Existem diferentes tipos de variáveis em programação, cada um com suas
características e tamanhos. Os tipos mais comuns são:

Inteiros (int): armazenam números inteiros, como 0, 1, 2, -3, -4, etc.


Decimais (float ou double): armazenam números com casas decimais, como 3.14,
2.71828, -1.5, etc.
Caracteres (char): armazenam um único caractere, como 'a', 'b', '1', '@', etc.
Booleanos (bool): armazenam valores verdadeiro ou falso.
Além disso, as variáveis também podem ser organizadas em estruturas de dados,
como arrays e estruturas. Por exemplo, um array é uma variável que armazena um
conjunto de valores do mesmo tipo.
Em resumo, as variáveis são elementos fundamentais em programação, permitindo
que os programas armazenem e manipulem dados ao longo do tempo. Entender
como as variáveis funcionam e como utilizá-las é essencial para quem quer se
aventurar no mundo da programação.

Vetores
Um vetor é uma variável composta unidimensional formada por uma sequência de
variáveis, todas do mesmo tipo, com o mesmo nome e alocadas sequencialmente
na memória. Uma vez que as variáveis têm o mesmo nome, o que as distingue é um
índice, que referência sua localização dentro da estrutura.
Declaração de um vetor
A declaração de um vetor é feita da seguinte maneira:

Onde:
o tipo é o tipo de dado que será armazenado no vetor;
o tamanho é quantidade de variáveis que vão compor o vetor;
o nome é o nome da variável do tipo vetor
Dessa forma temos, por exemplo:
Declaração em pseudocódigo
Declaração em C

Em ambos os casos, declaramos um vetor de números inteiros de 10 posições (k) ,


um vetor de números reais de 5 posições (vet) e um vetor de caracteres de 20
posições (nome).
Na declaração de um vetor podemos omitir seu tamanho , desde que quando seja
feita a declaração, já sejam atribuídos seus valores, como no exemplo abaixo:

Neste caso, automaticamente o índice 4 é atribuído ao vetor num.


Exemplo de vetor
Em pseudocódigo
Em pseudocódigo, as posições de um vetor começam em 1 (um) e vão até o
tamanho do vetor.

Em C
Em C, as posições de um vetor começam em 0 (zero) e vão até o tamanho do vetor
menos uma unidade.

Atribuindo valores ao vetor


Para atribuir valores a um vetor procedemos da seguinte maneira:
Em pseudocódigo
Utilizamos o comando de atribuição como por exemplo:

Em C
Podemos fazer de duas maneiras:
A primeira é simplesmente atribuir valores ao vetor na posição desejada, como por
exemplo:

E a segunda seria após a declaração do vetor, colocando-se um sinal de igual (=)


seguido de todos os valores separados por vírgula entre colchetes. Exemplo:

Neste caso, durante a declaração é possível omitir o número correspondente ao


tamanho do vetor, porém a quantidade de valores que serão atribuídos será igual
ao seu tamanho (como já havia sido dito), já ao se declarar o tamanho não é
obrigatório atribuir valores a todas as posições do vetor, quando se for inicializá-lo
dessa maneira.
Carregando um vetor
Para carregar um vetor ou parte dele com valores, ou seja, preenchê-lo com valores
digitados, procedemos da seguinte maneira:
Em pseudocódigo
Utilizamos a estrutura de repetição PARA, com isso o vetor será percorrido e, a
cada iteração, o comando LEIA solicitará a entrada do dado via teclado.
Em C
Utilizamos a estrutura de repetição FOR, com isso o vetor será percorrido e, a cada
iteração, o comando SCANF solicitará a entrada do dado via teclado.

Em ambos os casos poderia se fazer um comando de entrada de dados via teclado


para cada posição do vetor, porém isso tornaria o código extenso e desprenderia
mais tempo, tornando-se inviável.
Mostrando os elementos do vetor
Em pseudocódigo
Utilizamos a estrutura de repetição PARA, com isso o vetor será percorrido e, a
cada iteração, o comando ESCREVA mostrará o valor do vetor correspondente à
posição do contador.

Em C
Utilizamos a estrutura de repetição FOR, com isso o vetor será percorrido e, a cada
iteração, o comando PRINTF mostrará o valor do vetor correspondente à posição
do contador.

Em ambos os casos poderia se fazer um comando de saída de dados para cada


posição do vetor, porém isso tornaria o código extenso e desprenderia mais tempo,
tornando-se inviável.
Erros comuns:
Atribuir o valor de todos os elementos de uma só vez
Exceto na declaração do vetor, não é possível atribuir valores a todos os elementos
em uma só linha. Cada elemento precisa ser acessado individualmente. Tampouco
é possível usar um único scanf para ler todo o conteúdo do vetor. O código abaixo
está, portanto, errado:
Como vimos acima, o correto é utilizar uma estrutura de repetição for para atribuir
o valor a cada elemento.

Copiar vetores
Tampouco é possível copiar o conteúdo de um vetor para um outro, mesmo que os
dois sejam de mesmo tamanho e os elementos sejam de mesmo tipo.

O correto é utilizar uma estrutura de repetição for para copiar um elemento de


cada vez.
Exemplo 1:
Faça um programa que leia dez números e os imprima em ordem inversa:
Solução em pseudocódigo

Solução em C

Exemplo 2:
Faça um programa que execute as seguintes etapas:
o Digite 10 números inteiros e os armazene em um vetor;
o Verifique qual desses números é maior;
o Imprima os elementos do vetor e em seguida o seu maior elemento.
Solução em pseudocódigo

Matrizes
Uma matriz é uma coleção de variáveis de mesmo tipo, com mesmo nome e
alocadas sequencialmente na memória. Uma vez tendo o mesmo nome, o que as
distingue são índices que referenciam sua localização dentro da estrutura.
As matrizes podem ser tanto unidimensionais (vetores) como multidimensionais.
Como já trabalhamos com vetores, daremos atenção as matrizes com duas ou mais
dimensões.
Matriz bidimensional
Declaração
A declaração de uma matriz bidimensional é feita da seguinte maneira:

Onde:
o tipo é o tipo de dado que será armazenado na matriz;
o linha e coluna correspondem a quantidade de linhas e colunas da matriz;
o nome é o nome da variável do tipo matriz.
Dessa forma temos, por exemplo:
Declaração em pseudocódigo
Declaração em C

Ema ambos os casos declaramos uma matriz de números inteiros (G) de duas
linhas e duas colunas, e uma matriz de números reais (num) de três linhas e 4
colunas. Também foram declaradas duas matrizes de caracteres(nome): uma de
vinte linhas e dez colunas em C e outra de dez linhas e vinte colunas em
pseudocódigo.
Na declaração de uma matriz podemos omitir seu tamanho , desde que quando seja
feita a declaração, já sejam atribuídos seus valores, como no exemplo abaixo:

Neste caso, automaticamente os índices 2 e 4 são atribuídos, respectivamente, à


linha e à coluna da matriz num.
Exemplo de matriz
Em pseudocódigo
Em pseudocódigo, as posições da linha e coluna de uma matriz começam em 1
(um) e vão até o tamanho definido na declaração.

Em C
Em C as posições da linha e coluna de uma matriz começam em 0 (zero) e vão até o
tamanho definido na declaração menos 1(um).
Atribuindo valores a matriz
Para atribuir valores a uma matriz procedemos da seguinte maneira:
Em pseudocódigo
Utilizamos o comando de atribuição como por exemplo:

Em C
Podemos fazer de duas maneiras:
A primeira é simplesmente atribuir valores à matriz na posição desejada, como por
exemplo:

E a segunda seria após a declaração da matriz, colocando-se um sinal de igual (=)


seguido de todos os valores separados por vírgula entre colchetes. Exemplo:
Neste caso, durante a declaração, é possível omitir o número correspondente ao
tamanho das linhas e colunas da matriz, porém a quantidade de valores que serão
atribuídos será igual a quantidade de linhas vezes a quantidade de colunas (como
já havia sido dito), já ao se declarar a quantidade de linhas e colunas não é
obrigatório atribuir valores a todas as posições da matriz, quando se for inicializá-
la dessa maneira.
Carregando uma matriz
Para carregar uma matriz ou parte dela com valores, ou seja, preenchê-la com
valores digitados, procedemos da seguinte maneira:
Em pseudocódigo
Utilizamos a estrutura de repetição PARA duas vezes, a primeira vez utilizaremos
para percorrer as linhas e a segunda as colunas (não importa se inverter). Com isso
a matriz será percorrida e a cada iteração o comando LEIA solicitará a entrada do
dado via teclado.

Em C
Utilizamos a estrutura de repetição FOR duas vezes, a primeira vez utilizaremos
para percorrer as linhas e a segunda as colunas (não importa se inverter). Com isso
a matriz será percorrida e a cada iteração o comando PRINTF solicitará a entrada
do dado via teclado.

Em ambos os casos poderia se fazer um comando de entrada de dados via teclado


para cada posição da matriz, porém isso tornaria o código extenso e levaria mais
tempo, tornando-se inviável.
Mostrando os elementos da matriz

Em pseudocódigo
Utilizamos a estrutura de repetição PARA duas vezes, a primeira vez utilizaremos
para percorrer as linhas e a segunda as colunas (não importa se inverter). Com isso
a matriz será percorrida e a cada iteração o comando ESCREVA mostrará o valor da
matriz correspondente à posição dos contadores.

Em C
Utilizamos a estrutura de repetição FOR duas vezes, a primeira vez utilizaremos
para percorrer as linhas e a segunda as colunas (não importa se inverter). Com isso
a matriz será percorrida e a cada iteração o comando PRINTF mostrará o valor da
matriz correspondente à posição dos contadores.

Em ambos os casos poderia se fazer um comando de entrada de dados via teclado


para cada posição da matriz, porém isso tornaria o código extenso e levaria mais
tempo, tornando-se inviável.
Exemplos
Faça um programa que execute as seguintes etapas:
o Digite 6 números inteiros e os armazene em uma matriz;
o Verifique qual desses números é maior;
o Imprima os elementos da matriz e, em seguida, o seu maior elemento.
Solução em pseudocódigo

Solução em C
#include < stdio.h >
int main(){
/*declaração das variáveis*/
int matriz[3][2];
int indice1, indice2, maior;
printf("Escreva 6 numeros inteiros: \n");
/*utilização do for para percorrer as linhas da matriz do índice 0 até 2 */
for(indice1 = 0; indice1 < 3; indice1++){
/*utilização do for para percorrer as colunas da matriz do índice 0 até 1 */
for(indice2 = 0; indice2 < 2; indice2++)
/*a posição correspondente do vetor recebe o valor digitado*/
scanf("%d", &matriz[indice1][indice2] );
}
maior = 0;
/*busca pela matriz pelo maior número, a váriavel maior armazenará o maior
elemento*/
for(indice1 = 0; indice1 < 3; indice1++){
for(indice2 = 0; indice2 < 2; indice2++){
if(maior < matriz[indice1][indice2])
maior = matriz[indice1][indice2];
}
}
printf("Minha matriz:\n");
/*impressão da matriz*/
for(indice1 = 0; indice1 < 3; indice1++){
printf("\n");
for(indice2 = 0; indice2 < 2; indice2++){
printf("\t %d ", matriz[indice1][indice2]);
}
}
/*impressão do maior número*/
printf("Maior numero: %d ", maior);
return 0;
}
Matrizes multidimensionais
Em C é possível utilizar matrizes de três ou mais dimensões, porém isso não
acontece com frequância, pois requer uma grande quantidade de memória e os
acessos aos seus elementos são mais lentos. Por esses motivos essas matrizes não
serão abordados com detalhes.
Declaração
A declaração de uma matriz multidiomensional é feita da seguinte maneira:

Onde:
o tipo é o tipo de dado que será armazenado na matriz;
o E os tamanhos correspondem ao tamanho de cada dimensão da matriz;
Exemplo em C de carregamento e impressão utilizando uma matriz com 3
dimensões:

Dinâmica
Para ajudar os alunos a entenderem melhor o conceito de variável, podemos realizar
a seguinte dinâmica em sala de aula:
Materiais necessários:
• Folhas de papel em branco
• Canetas
• Instruções:
Distribua uma folha de papel em branco para cada aluno e peça para que eles
escrevam uma frase ou uma palavra aleatória.
Em seguida, peça para que troquem suas folhas com o colega ao lado.
Cada aluno deve ler a frase ou palavra que está na folha que recebeu e escrever uma
nova frase ou palavra que tenha relação com a anterior.
Peça para que os alunos continuem passando as folhas até que todos tenham escrito
em todas as folhas.
Ao final, peça para que cada aluno leia em voz alta a frase ou palavra que está em
sua folha.
Essa dinâmica mostra como uma informação pode ser modificada ao longo do
tempo, assim como as variáveis em programação.
Atividades

1. Escreva um programa que peça para o usuário informar o nome, idade e


altura de uma pessoa. Em seguida, exiba na tela uma mensagem contendo
essas informações.
2. Escreva um programa que receba dois valores do usuário e exiba na tela o
resultado das quatro operações básicas (adição, subtração, multiplicação e
divisão) entre eles.
Entradas e Saídas

As entradas e saídas de um algoritmo são fundamentais para que ele possa ser útil.
Sem elas, o algoritmo não poderá receber os dados necessários para processamento
e não poderá fornecer os resultados esperados. Nesta apostila, vamos estudar as
teorias de entradas e saídas em algoritmos e estrutura de dados, além de uma
dinâmica para fixação do conteúdo e atividades com resposta.
1. Entrada de dados: A entrada de dados é a maneira como o algoritmo recebe
as informações que serão processadas. Existem diferentes tipos de entrada
de dados, como:
a) Entrada manual: o usuário digita os dados no teclado;
b) Entrada automática: o algoritmo busca os dados em um
arquivo, banco de dados ou rede;
c) Entrada de dados aleatórios: o algoritmo gera os dados
aleatoriamente.
2. Saída de dados: A saída de dados é a maneira como o algoritmo apresenta
os resultados obtidos após o processamento das informações. Existem
diferentes tipos de saída de dados, como:
a) Saída em tela: o resultado é exibido na tela do computador;
b) Saída em arquivo: o resultado é salvo em um arquivo;
c) Saída em impressora: o resultado é impresso em papel.

Dinâmica

Para fixar o conteúdo sobre entradas e saídas em algoritmos e estrutura de dados,


vamos fazer uma dinâmica em grupo:
a) Divida a turma em grupos de 3 a 5 pessoas;
b) Cada grupo deve escolher um tema para desenvolver um algoritmo, como calcular
a média de notas de um aluno ou calcular o preço de um produto com desconto;
c) Cada grupo deve definir a entrada e saída de dados para o algoritmo; d) Cada
grupo deve apresentar o algoritmo e as entradas e saídas de dados escolhidas para
a turma.
Atividades
Avalie os pseudocódigos abaixo e imprima o valor final
1 - Suponhamos que a entrada ao código é 5, qual será a saída desse pseudocódigo:

2 - Suponhamos que a entrada ao código é 3, qual será a saída desse pseudocódigo:

3 - Suponhamos que a entrada ao código é 8, qual será a saída desse pseudocódigo:

4 - Suponhamos que a entrada ao código é 4, qual será a saída desse pseudocódigo:


Respostas

1- Resposta: 19
2- Resposta: 20
3- Resposta: 6
4- Resposta 3
Controle de Fluxo

O controle de fluxo é um conceito fundamental em algoritmos e estruturas de dados.


Ele permite que o programador controle o fluxo de execução do programa,
decidindo quais partes do código serão executadas em quais situações. Em outras
palavras, o controle de fluxo é como um roteiro que guia o programa.
Tipos de controle de fluxo
Existem duas principais categorias de controle de fluxo: condicional e repetitivo.
Controle de fluxo condicional
O controle de fluxo condicional é utilizado quando o programa precisa tomar uma
decisão baseada em uma condição. Se a condição for verdadeira, uma parte do
código será executada; se for falsa, outra parte do código será executada.
O exemplo mais comum de controle de fluxo condicional é a estrutura if-else. Aqui
está um exemplo em pseudocódigo:

Neste exemplo, o programa verifica se o número é maior que 10. Se for, ele exibe
uma mensagem informando que o número é maior que 10. Caso contrário, exibe
uma mensagem informando que o número é menor ou igual a 10.

Controle de fluxo repetitivo


O controle de fluxo repetitivo é utilizado quando o programa precisa executar uma
mesma ação várias vezes. Isso é útil quando o programador precisa processar uma
grande quantidade de dados ou repetir uma ação até que uma determinada condição
seja atingida.
O exemplo mais comum de controle de fluxo repetitivo é a estrutura while. Aqui está
um exemplo em pseudocódigo:
Atividades

Atividade 1
Considere o seguinte pseudocódigo:

a) Se os números lidos forem 4 e 8, qual será a saída?


b) Se os números lidos forem 3 e 3, qual será a saída?

Atividade 2
Considere o seguinte pseudocódigo:

a) Se o primeiro número lido for 7 e o segundo for 5, qual será a saída?


b) Se o primeiro número lido for 10 e o segundo for 2, qual será a saída?

Atividade 3
Considere o seguinte pseudocódigo:

a) Se o número lido for 6, qual será a saída?


b) Se o número lido for 9, qual será a saída?
Atividade 4
Considere o seguinte pseudocódigo:

a) Se o número lido for 1234, qual será a saída?


b) Se o número lido for 98765, qual será a saída

Atividade 5
Considere o seguinte pseudocódigo:

a) Se o número lido for 5, qual será a saída?

b) Se o número lido for 0, qual será a saída?


Respostas

Atividade 1
a) 8
b) 3

Atividade 2
a) 12
b) 2

Atividade 3
a) O número é par
b) O número é ímpar

Atividade 4
a) 10
b) 35

Atividade 5
a) 120
b) 1
Procedimentos e funções

Procedimentos e Funções são blocos de código que podem ser reutilizados em


diferentes partes de um programa. Eles ajudam a reduzir a duplicação de código e
tornam o código mais fácil de ler e manter.

Procedimentos
Procedimentos são blocos de código que realizam uma tarefa específica, sem
retornar um valor. Eles são usados para executar ações que precisam ser executadas
várias vezes em um programa.
Um procedimento é definido usando a seguinte sintaxe:

Onde NomeDoProcedimento é o nome do procedimento e parâmetros são as


informações que podem ser passadas para o procedimento.
Por exemplo, podemos criar um procedimento para exibir uma mensagem na tela:

Este procedimento exibe a mensagem que é passada como parâmetro. Podemos


chamar o procedimento de várias partes do programa:
Funções
Funções são blocos de código que realizam uma tarefa específica e retornam um
valor. Elas são usadas para executar ações que precisam ser executadas várias vezes
em um programa e para retornar resultados que serão usados em outras partes do
programa.
Uma função é definida usando a seguinte sintaxe:

Onde NomeDaFunção é o nome da função, parâmetros são as informações que


podem ser passadas para a função e tipoDoRetorno é o tipo de dados que a função
irá retornar.
Por exemplo, podemos criar uma função para somar dois números:

Esta função recebe dois números como parâmetros e retorna a soma desses
números como um inteiro.
Podemos chamar a função de várias partes do programa:

Este código chama a função Somar para somar dois números e armazena o
resultado na variável resultado. Em seguida, exibe uma mensagem na tela com o
resultado.
Passagem de parâmetros

Os parâmetros podem ser passados para procedimentos e funções de duas


maneiras: por valor e por referência.

Passagem por valor


Na passagem por valor, o valor do parâmetro é copiado para a variável do parâmetro
dentro do procedimento ou função. Qualquer alteração feita na variável do
parâmetro não afeta a variável original que foi passada como argumento.
Por exemplo, considere o seguinte procedimento:

Se chamarmos este procedimento com o valor 3, o valor de x será dobrado dentro


do procedimento, mas o valor original de x fora do procedimento não será alterado:

Dentro do procedimento, a variável x é multiplicada por 2, resultando em 6. No


entanto, fora do procedimento, o valor de x ainda é 3, porque apenas uma cópia do
valor de x foi passada para o procedimento, não a própria variável.

Passagem por referência


Na passagem por referência, é passado um endereço de memória do parâmetro em
vez de seu valor. Isso permite que o procedimento ou função altere o valor da
variável original.
Por exemplo, considere o seguinte procedimento:
Este procedimento troca os valores das variáveis a e b. Se chamarmos este
procedimento com as variáveis x e y, as variáveis x e y serão trocadas:

Escopo de variáveis
O escopo de uma variável é a região do programa onde a variável pode ser usada.
Em geral, as variáveis definidas dentro de um procedimento ou função só podem ser
usadas dentro desse procedimento ou função.
Por exemplo, considere o seguinte procedimento:

A variável mensagem só pode ser usada dentro do procedimento


ExibirMensagem. Se tentarmos usar a variável fora do procedimento, receberemos
um erro.

Exemplo completo:
Aqui está um exemplo completo que usa procedimentos e funções para calcular a
média de uma lista de números:
Este código define a função CalcularMedia que calcula a média de uma lista de
números e o procedimento ExibirResultado que exibe o resultado na tela. No
código principal, uma lista é criada e a função CalcularMedia é chamada para
calcular a média. O resultado é passado para o procedimento ExibirResultado, que
exibe o resultado na tela.
Atividades com resposta

1. Escreva um procedimento chamado Maior que recebe dois números como


parâmetros e retorna o maior deles.

2. Escreva uma função chamada Fatorial que recebe um número inteiro como
parâmetro e retorna o fatorial desse número.

3. Escreva um procedimento chamado Inverter que recebe um vetor de


números como parâmetro e inverte a ordem dos elementos do vetor.
4. Escreva uma função chamada Media que recebe um vetor de números como
parâmetro e retorna a média aritmética dos elementos do vetor.

5. Escreva um procedimento chamado Trocar que recebe duas variáveis como


parâmetros e troca seus valores.
Dicas

Existem vários sites e plataformas online onde os alunos podem testar e


construir pseudocódigos e códigos de programação. Alguns exemplos
incluem:

1. Repl.it - uma plataforma online de programação que permite aos usuários


escrever e executar código em várias linguagens de programação, incluindo
Python, C++, Java e JavaScript. Os usuários também podem colaborar com
outras pessoas em projetos e compartilhar seus códigos.
2. CodePen - uma comunidade online de desenvolvedores web que permite aos
usuários criar e compartilhar seus próprios projetos de HTML, CSS e
JavaScript. Os usuários podem criar seus próprios pseudocódigos e ver a
saída na tela.
3. Scratch - uma plataforma de programação visual projetada especialmente
para crianças. Os usuários podem criar programas usando blocos de código
que representam diferentes comandos e estruturas de controle de fluxo.
4. Khan Academy - uma plataforma online de aprendizado que oferece cursos
de programação em várias linguagens, incluindo JavaScript, Python e SQL. Os
usuários podem escrever e testar pseudocódigos e códigos em um ambiente
interativo.
5. Codecademy - uma plataforma online de aprendizado de programação que
oferece cursos em várias linguagens, incluindo Python, JavaScript e Ruby. Os
usuários podem escrever e testar seus pseudocódigos em um ambiente de
desenvolvimento integrado (IDE) e ver a saída na tela.
Essas plataformas oferecem uma maneira interativa e prática para os alunos
aprenderem e praticarem a criação de pseudocódigos e códigos de
programação.
Apontadores

Apontadores são variáveis que armazenam o endereço de memória de outra


variável. Em outras palavras, um apontador é uma variável que "aponta" para
outra variável. Isso permite que você acesse e manipule a variável original
usando o apontador.

Os apontadores são usados com frequência em linguagens de programação


de baixo nível, como C e C++, para trabalhar diretamente com a memória do
computador.

Declaração de apontadores
Para declarar um apontador, usamos o operador *. Por exemplo, para
declarar um apontador para um inteiro, usamos a seguinte sintaxe:

Isso declara uma variável chamada p que é um apontador para um inteiro. O


operador * indica que p é um apontador.

Operadores de apontador
Existem dois operadores importantes usados com apontadores: o operador
de endereço & e o operador de desreferência *.

O operador de endereço & é usado para obter o endereço de memória de uma


variável. Por exemplo:

O operador de desreferência * é usado para acessar o valor armazenado no


endereço de memória apontado por um apontador. Por exemplo:

(o valor armazenado no endereço de memória apontado por p)


Aritmética de apontador
Os apontadores também suportam operações aritméticas. Por exemplo,
podemos adicionar um valor inteiro a um apontador para deslocar seu
endereço para frente ou para trás na memória.

Uso de apontadores em funções


Os apontadores são frequentemente usados em funções para permitir que a
função modifique o valor de uma variável fora do seu escopo. Isso é
conhecido como passagem por referência.

Por exemplo, podemos escrever uma função que troca o valor de duas
variáveis:
Atividades com respostas

Atividade 1:
Escreva um pseudocódigo que declare uma variável inteira e um ponteiro
para essa variável. Solicite ao usuário um valor inteiro e atribua esse valor à
variável. Em seguida, utilize o ponteiro para mostrar na tela o valor
armazenado na variável.

Resposta:
Atividade 2:
Escreva um pseudocódigo que declare um ponteiro para um vetor de inteiros
e aloque dinamicamente espaço para esse vetor com tamanho informado
pelo usuário. Em seguida, preencha o vetor com valores informados pelo
usuário e imprima na tela a soma dos valores.

Resposta:
Atividade 3:
Escreva um pseudocódigo que declare uma estrutura para armazenar
informações de alunos (nome, idade e nota). Em seguida, declare um
ponteiro para essa estrutura e aloque dinamicamente espaço para
armazenar informações de um aluno. Preencha as informações do aluno com
valores informados pelo usuário e imprima na tela essas informações.

Resposta:
Alocação estática e dinâmica de memória

A alocação de memória é um conceito importante na programação de


computadores. A memória é a área onde os dados e instruções do programa são
armazenados enquanto o programa está em execução. Neste guia, vamos discutir a
alocação estática e dinâmica de memória em algoritmos e estrutura de dados.
Alocação estática de memória
A alocação estática de memória é um tipo de alocação de memória em que o espaço
necessário para os dados é alocado quando o programa é compilado. O espaço
alocado permanece fixo durante a execução do programa.
Um exemplo de alocação estática de memória é a declaração de uma matriz em C ou
C++. Quando a matriz é declarada, o compilador aloca espaço suficiente na memória
para armazenar todos os elementos da matriz. O espaço alocado não pode ser
alterado durante a execução do programa.
Alocação dinâmica de memória
A alocação dinâmica de memória é um tipo de alocação de memória em que o espaço
necessário para os dados é alocado durante a execução do programa. A alocação
dinâmica de memória é feita usando funções especiais, como malloc() em C ou new
em C++.
Um exemplo de alocação dinâmica de memória é a criação de uma lista encadeada.
Em vez de alocar espaço para uma matriz fixa de elementos, a lista é construída
adicionando novos elementos conforme necessário. O espaço alocado pode ser
aumentado ou diminuído durante a execução do programa.
Alocação estática vs. Alocação dinâmica
A alocação estática de memória é geralmente mais rápida do que a alocação
dinâmica de memória, uma vez que o espaço necessário já foi alocado no momento
em que o programa é compilado. No entanto, a alocação estática de memória pode
levar a um desperdício de espaço, uma vez que o espaço alocado não pode ser
alterado durante a execução do programa.
Por outro lado, a alocação dinâmica de memória permite uma utilização mais
eficiente da memória, uma vez que o espaço é alocado conforme necessário. No
entanto, a alocação dinâmica de memória pode ser mais lenta do que a alocação
estática de memória, uma vez que a alocação precisa ser feita em tempo de execução.
Exemplos

Aqui estão alguns exemplos de alocação estática e dinâmica de memória em


linguagens de programação comuns:

Exemplo de alocação estática de memória:

Nesse exemplo, o compilador aloca espaço na memória para armazenar 10 inteiros.


Esse espaço não pode ser alterado durante a execução do programa.

Exemplo de alocação dinâmica de memória:

Nesse exemplo, o espaço para armazenar 10 inteiros é alocado durante a execução


do programa, usando a função malloc(). O espaço alocado pode ser alterado durante
a execução do programa, usando funções como realloc().

Outro exemplo de alocação dinâmica de memória em C++ usando o operador


new:

Nesse exemplo, o operador new é usado para alocar espaço para armazenar 10
inteiros. Esse espaço pode ser alterado durante a execução do programa, usando o
operador delete[] para liberar a memória alocada.

Exemplo de alocação estática de memória em Java:

Nesse exemplo, a memória para armazenar um array com espaço para 10 inteiros é
alocada quando o array é criado. Esse espaço não pode ser alterado durante a
execução do programa.
Atividades com resposta

Exercício 1:
Declare um array de inteiros com espaço para 5 elementos usando alocação estática
de memória.

Resposta:

Exercício 2:
Declare um array de caracteres com espaço para 20 elementos usando alocação
estática de memória.
Resposta:

Exercício 3:
Declare um ponteiro para caracteres e aloque espaço para 50 elementos usando
alocação dinâmica de memória.
Resposta:
Tipos abstratos de dados

Ao escrever um algoritmo, muitas vezes precisamos trabalhar com informações


mais complexas do que simples variáveis ou vetores. Por exemplo, em um sistema
de gestão de bibliotecas, precisamos lidar com informações como títulos de livros,
autores, editoras, número de páginas e outras. Para manipular esses dados de
maneira eficiente, é necessário utilizar estruturas de dados mais elaboradas.

As estruturas de dados básicas, como vetores e matrizes, são úteis em muitas


situações, mas nem sempre são suficientes para resolver todos os tipos de
problemas. É nesse momento que os Tipos Abstratos de Dados (TADs) entram em
cena.

Um TAD é um tipo de dado que define um conjunto de valores e as operações que


podem ser realizadas sobre esses valores. Por exemplo, um TAD de conjunto pode
definir as operações de inserção, remoção e verificação de pertinência de um
elemento. Essas operações são definidas independentemente da implementação do
TAD, ou seja, podemos implementá-las de várias maneiras diferentes (por exemplo,
usando uma lista ou uma árvore), desde que respeitemos as operações definidas.

O uso de TADs tem várias vantagens em relação a outras estruturas de dados. Em


primeiro lugar, os TADs são mais abstratos e genéricos, o que permite reutilizá-los
em diferentes contextos. Além disso, o uso de TADs pode simplificar o código do
algoritmo, tornando-o mais fácil de entender e manter. Por fim, os TADs também
podem ter desempenho melhor do que outras estruturas de dados em certas
situações.

Neste modulo, iremos estudar os conceitos básicos dos TADs, bem como alguns
exemplos comuns de TADs, suas operações básicas e complexidade computacional.
Também veremos como implementar esses TADs em pseudocódigo ou em uma
linguagem de programação. Ao final, esperamos que você esteja preparado para
aplicar esses conhecimentos na solução de problemas computacionais mais
complexos.
Diferença entre Tipo Abstrato e Tipo de Dado Primitivo

Ao programar, é comum utilizarmos diferentes tipos de dados para representar


informações em nossos algoritmos. Os tipos de dados primitivos, como inteiros,
caracteres e booleanos, são os mais básicos e estão disponíveis em praticamente
todas as linguagens de programação. No entanto, muitas vezes precisamos lidar com
informações mais complexas e elaboradas.

É nesse momento que os Tipos Abstratos de Dados (TADs) entram em cena. Os TADs
são tipos de dados que definem um conjunto de valores e as operações que podem
ser realizadas sobre esses valores. Por exemplo, um TAD de pilha pode definir as
operações de empilhar, desempilhar e verificar se está vazia.

A principal diferença entre os tipos abstratos e os tipos de dados primitivos é que os


TADs são mais abstratos e genéricos, enquanto os tipos primitivos são mais simples
e restritos. Enquanto os tipos primitivos lidam com informações simples e atômicas
(como um número inteiro ou um caractere), os TADs lidam com informações mais
complexas e elaboradas, que podem ser compostas por diferentes tipos primitivos.

Outra diferença importante é que os TADs possuem uma interface bem definida, que
especifica as operações permitidas e suas semânticas, enquanto os tipos primitivos
geralmente possuem uma única operação básica (por exemplo, a adição de dois
inteiros).

Além disso, os TADs podem ser implementados de diversas formas diferentes,


utilizando diferentes estruturas de dados e algoritmos. Por outro lado, os tipos
primitivos já possuem uma implementação nativa na linguagem de programação e
geralmente não permitem customizações ou extensões.

Em resumo, enquanto os tipos de dados primitivos são a base para a construção de


algoritmos simples e rápidos, os TADs permitem trabalhar com informações mais
complexas e elaboradas de forma abstrata e genérica, o que pode facilitar a
reutilização e manutenção do código.
Revisão dos Principais Tipos de Estruturas de Dados

As estruturas de dados são ferramentas fundamentais para a organização e


manipulação de informações em algoritmos e programas. Elas permitem armazenar
e acessar dados de forma eficiente, de acordo com as necessidades de cada
problema. Entre os principais tipos de estruturas de dados, podemos destacar:

Vetores: são estruturas que permitem armazenar um conjunto de elementos do


mesmo tipo em uma única sequência contínua de memória. Os elementos são
acessados por meio de índices, que indicam a posição do elemento na sequência. Os
vetores são úteis quando se sabe o número exato de elementos a serem
armazenados e quando se precisa acessar os elementos de forma rápida e direta.

Matrizes: são estruturas que permitem armazenar elementos em uma ou mais


dimensões. Uma matriz bidimensional, por exemplo, pode ser vista como uma tabela
com linhas e colunas. Os elementos são acessados por meio de um par de índices,
que indicam a posição do elemento na tabela. As matrizes são úteis para representar
informações que possuem uma relação espacial ou de matriz, como mapas e
imagens.

Listas: são estruturas que permitem armazenar um conjunto de elementos de tipos


diferentes de forma encadeada. Cada elemento da lista contém um valor e um
ponteiro para o próximo elemento da lista. As listas são úteis quando se precisa
inserir ou remover elementos de forma dinâmica, sem a necessidade de realocar a
memória.

Pilhas: são estruturas que permitem armazenar elementos em uma ordem LIFO
(Last In, First Out), ou seja, o último elemento a entrar é o primeiro a sair. As
operações permitidas são empilhar (adicionar um elemento no topo da pilha) e
desempilhar (remover o elemento do topo da pilha). As pilhas são úteis para
implementar operações como desfazer (undo) e refazer (redo).

Filas: são estruturas que permitem armazenar elementos em uma ordem FIFO
(First In, First Out), ou seja, o primeiro elemento a entrar é o primeiro a sair. As
operações permitidas são enfileirar (adicionar um elemento no final da fila) e
desenfileirar (remover o elemento do início da fila). As filas são úteis para
implementar operações como simulações de eventos discretos e processamento de
dados em ordem de chegada.

Essas são apenas algumas das principais estruturas de dados utilizadas em


algoritmos e programas. Cada uma delas possui suas particularidades e
características próprias, sendo importante escolher a estrutura adequada para cada
problema a ser resolvido.
Limitações dessas estruturas e quando é necessário utilizar
TADs
As estruturas de dados são ferramentas poderosas para a organização e
manipulação de informações em algoritmos e programas. No entanto, cada tipo de
estrutura apresenta limitações que devem ser consideradas no momento da escolha
da estrutura adequada para o problema em questão.

Vetores e matrizes, por exemplo, possuem tamanho fixo e são limitados pela
quantidade de memória disponível no computador. Se o número de elementos a
serem armazenados ultrapassar a capacidade da estrutura, será necessário alocar
mais memória ou utilizar outra estrutura.

Listas encadeadas, pilhas e filas, por outro lado, permitem a inserção e remoção de
elementos de forma dinâmica, mas podem apresentar baixo desempenho em
operações que requerem acesso aleatório aos elementos, pois a busca de um
elemento específico pode exigir uma varredura completa da estrutura.

Além dessas limitações, existem situações em que as estruturas convencionais não


são suficientes para representar a informação de forma adequada. É nesse cenário
que entram em cena os Tipos Abstratos de Dados (TADs).

Os TADs são estruturas de dados que permitem definir um novo tipo de dado a partir
da combinação de outros tipos. Eles são abstratos porque se preocupam apenas com
o que é feito com os dados, sem se preocupar com a sua representação interna.

Por exemplo, um TAD para representar um número complexo poderia definir as


operações de soma, subtração, multiplicação e divisão como operações do tipo
complexo, sem se preocupar com a implementação dessas operações. Dessa forma,
os TADs permitem uma maior abstração e encapsulamento dos dados, facilitando a
implementação de algoritmos complexos e a manutenção do código.

Em resumo, as estruturas de dados convencionais são úteis em muitas situações,


mas apresentam limitações que devem ser consideradas. Quando é necessário
representar informações de forma mais abstrata e encapsulada, os TADs são uma
ótima opção. Cabe ao programador escolher a estrutura de dados adequada para
cada situação, considerando as limitações e necessidades específicas do problema
em questão.
Estrutura de dados básicas

Revisão dos principais tipos de estrutura de dados (vetores, matrizes, listas,


pilhas e filas)

As estruturas de dados são fundamentais para a organização e manipulação de


informações em algoritmos e programas. Nesta seção, vamos revisar as principais
estruturas de dados básicas, incluindo vetores, matrizes, listas, pilhas e filas.

Um vetor é uma estrutura de dados que armazena uma coleção de elementos do


mesmo tipo, acessíveis através de um índice inteiro. Os vetores possuem tamanho
fixo, o que significa que uma vez definido, o número de elementos que ele pode
armazenar não pode ser alterado. No entanto, é possível acessar e modificar seus
elementos de forma rápida e eficiente, tornando-os uma opção comum para
armazenar informações em memória.

Uma matriz é uma estrutura de dados semelhante ao vetor, mas com duas ou mais
dimensões. As matrizes são usadas para armazenar informações em uma tabela com
linhas e colunas, onde cada célula da tabela pode ser acessada através de um par de
índices. Assim como os vetores, as matrizes possuem tamanho fixo.

As listas encadeadas são estruturas de dados dinâmicas que permitem a inserção e


remoção de elementos de forma flexível e eficiente. Em uma lista encadeada, cada
elemento é representado por um nó que contém o valor do elemento e um ponteiro
para o próximo nó. Isso permite que os elementos sejam adicionados ou removidos
sem a necessidade de realocar toda a estrutura de dados.

As pilhas e as filas são estruturas de dados que seguem um modelo de acesso


restrito. Em uma pilha, os elementos são inseridos e removidos somente no topo da
estrutura, enquanto em uma fila, os elementos são inseridos no final da estrutura e
removidos no início. Essas estruturas são úteis para implementar algoritmos que
seguem um padrão de LIFO (last-in, first-out) ou FIFO (first-in, first-out),
respectivamente.

Exemplos de TADs comuns: Conjunto, lista, fila e pilha


Existem diversos tipos abstratos de dados (TADs) que são comuns em programação,
cada um com suas próprias características e aplicações. Nesta seção, vamos
apresentar exemplos de quatro TADs comuns: conjunto, lista, fila e pilha.

1. Conjunto: um conjunto é uma coleção de elementos que não permite a


existência de elementos repetidos. As operações comuns em conjuntos
incluem inserção de elementos, remoção de elementos e verificação se um
elemento está presente no conjunto.
2. Lista: uma lista é uma coleção de elementos ordenados, onde cada elemento
é conectado a um outro elemento através de um ponteiro. Existem dois tipos
principais de listas: listas simplesmente encadeadas e listas duplamente
encadeadas. As operações comuns em listas incluem inserção de elementos
no início, no fim ou em uma posição específica, remoção de elementos e busca
por um elemento específico.
3. Fila: uma fila é uma coleção ordenada de elementos, onde o primeiro
elemento adicionado é o primeiro a ser removido (modelo FIFO - first-in,
first-out). As operações comuns em filas incluem adição de elementos ao final
da fila e remoção do primeiro elemento da fila.
4. Pilha: uma pilha é uma coleção ordenada de elementos, onde o último
elemento adicionado é o primeiro a ser removido (modelo LIFO - last-in, first-
out). As operações comuns em pilhas incluem adição de elementos no topo
da pilha e remoção do elemento no topo da pilha.

Esses são apenas alguns exemplos de TADs comuns em programação. Cada TAD
possui suas próprias operações e funcionalidades específicas, e a escolha do TAD
adequado dependerá das necessidades do problema em questão. Além desses,
existem muitos outros tipos abstratos de dados, como árvores, grafos e mapas, que
podem ser úteis em diferentes contextos.

Definição de cada TAD, suas operações básicas


Nesta seção, vamos aprofundar um pouco mais nos exemplos de TADs apresentados
anteriormente (conjunto, lista, fila e pilha) e falar sobre suas definições, operações
básicas

1. Conjunto:

• Definição: um conjunto é uma coleção de elementos que não permite a


existência de elementos repetidos.
• Operações básicas:

o Inserção de elementos: adiciona um novo elemento ao conjunto.


o Remoção de elementos: remove um elemento existente no conjunto.
o Verificação de pertencimento: verifica se um elemento específico
pertence ao conjunto.
2. Lista:

• Definição: uma lista é uma coleção de elementos ordenados, onde cada


elemento é conectado a um outro elemento através de um ponteiro.
• Operações básicas:

o Inserção de elementos: adiciona um novo elemento em uma posição


específica da lista.
o Remoção de elementos: remove um elemento existente na lista.
o Busca por um elemento: verifica se um elemento específico está
presente na lista.

3. Árvore:

• Definição: uma árvore é uma estrutura de dados hierárquica que consiste em


um conjunto de nós conectados por arestas.
• Operações básicas:
o Inserção de nós: adiciona um novo nó na árvore, respeitando as regras
da árvore.
o Remoção de nós: remove um nó existente na árvore, mantendo as
regras da árvore.
o Busca por um nó: verifica se um nó específico está presente na árvore,
percorrendo a árvore da raiz aos nós folha.
4. Pilha:

• Definição: uma pilha é uma estrutura de dados linear que permite acesso
apenas ao elemento adicionado por último (último a entrar, primeiro a sair).

• Operações básicas:

o Push: adiciona um elemento ao topo da pilha.


o Pop: remove o elemento no topo da pilha.
o Top: retorna o elemento no topo da pilha, sem removê-lo.
o Verificação se a pilha está vazia: verifica se a pilha não contém
nenhum elemento.

5. Fila:

• Definição: uma fila é uma estrutura de dados linear que permite acesso
apenas ao elemento adicionado primeiro (primeiro a entrar, primeiro a sair).
• Operações básicas:

o Enqueue: adiciona um elemento no final da fila.


o Dequeue: remove o elemento no início da fila.
o Front: retorna o elemento no início da fila, sem removê-lo.
o Verificação se a fila está vazia: verifica se a fila não contém nenhum
elemento.
Atividades com respostas

1. O que é um TAD?

Resposta: Um TAD (Tipo Abstrato de Dados) é uma forma de organizar


informações em um programa de computador, permitindo que o programador
defina um tipo de dado e as operações que podem ser realizadas com esse tipo.

2. Qual é a diferença entre um TAD Pilha e um TAD Fila?

Resposta: Um TAD Pilha é uma estrutura de dados onde o último elemento


inserido é o primeiro a ser removido (LIFO), enquanto um TAD Fila é uma
estrutura de dados onde o primeiro elemento inserido é o primeiro a ser
removido (FIFO).

3. Como funciona a operação "inserir" em um TAD Conjunto?

Resposta: A operação "inserir" em um TAD Conjunto insere um novo elemento


no conjunto, desde que esse elemento não exista no conjunto previamente. Caso
o elemento já exista no conjunto, a operação não tem efeito.

4. Qual é a finalidade de um TAD Árvore?

Resposta: Um TAD Árvore é utilizado para representar hierarquias de


informação, como uma árvore genealógica ou uma estrutura de pastas em um
sistema operacional. As operações em uma árvore permitem percorrer e
manipular essa hierarquia de forma eficiente.

5. O que é uma operação recursiva em um TAD?

Resposta: Uma operação recursiva em um TAD é aquela que chama a si mesma


durante a sua execução. Isso é comum em estruturas de dados hierárquicas,
como árvores e listas encadeadas, onde a recursão é utilizada para percorrer e
manipular a estrutura de forma eficiente.
Estrutura de dados

O que é uma estrutura de dados?


Uma estrutura de dados é uma forma de organizar informações em um programa de
computador. É como uma caixa que guarda um conjunto de informações, como
nomes, números, datas, entre outros. As estruturas de dados permitem que essas
informações sejam organizadas de uma forma mais eficiente, permitindo que sejam
acessadas e manipuladas de forma mais rápida e fácil.

Para que servem as estruturas de dados? As estruturas de dados servem para


organizar informações em um programa de computador de forma mais eficiente.
Elas permitem que as informações sejam acessadas e manipuladas de forma mais
rápida e fácil, o que é especialmente importante em programas que lidam com
grandes quantidades de informações.

Tipos de estruturas de dados existem vários tipos de estruturas de dados, cada um


com suas características e finalidades específicas. Vamos ver alguns dos tipos mais
comuns:

1. Pilha

Uma Pilha é uma estrutura de dados onde o último elemento inserido é o


primeiro a ser removido (LIFO). É como uma pilha de pratos, onde o prato
que foi colocado por último é o primeiro a ser retirado. As principais
operações em uma Pilha são empilhar, desempilhar e verificar se está vazia.

2. Fila

Uma Fila é uma estrutura de dados onde o primeiro elemento inserido é o


primeiro a ser removido (FIFO). É como uma fila de pessoas em um banco,
onde a primeira pessoa que chegou é a primeira a ser atendida. As principais
operações em uma Fila são enfileirar, desenfileirar e verificar se está vazia.

3. Conjunto

Um Conjunto é uma estrutura de dados que representa uma coleção de


elementos sem ordem e sem repetição. É como uma caixa onde guardamos
objetos, mas sem permitir que dois objetos iguais sejam guardados. As
principais operações em um Conjunto são inserir, remover, verificar se um
elemento pertence ao conjunto e realizar operações de união, interseção e
diferença entre conjuntos.
4. Lista

Uma Lista é uma estrutura de dados que representa uma coleção de


elementos com ordem e com possibilidade de repetição. É como uma lista de
compras, onde os itens estão organizados em uma ordem específica e
podemos comprar o mesmo item mais de uma vez. As principais operações
em uma Lista são inserir, remover, buscar e verificar se está vazia.
Atividades com respostas

1. Qual é a principal diferença entre uma Pilha e uma Fila?

Resposta: A principal diferença é a ordem em que os elementos são removidos.


Na Pilha, o último elemento inserido é o primeiro a ser removido (LIFO),
enquanto na Fila o primeiro elemento inserido é o primeiro a ser removido
(FIFO).

2. Qual é a principal operação em uma Pilha?

Resposta: A principal operação em uma Pilha é a empilhar.

3. Qual é a principal operação em uma Fila?

Resposta: A principal operação em uma Fila é a enfileirar.

4. O que é um Conjunto?

Resposta: Um Conjunto é uma estrutura de dados que representa uma coleção


de elementos sem ordem e sem repetição.

5. Quais são as principais operações em um Conjunto?

Resposta: As principais operações em um Conjunto são inserir, remover,


verificar se um elemento pertence ao conjunto e realizar operações de união,
interseção e diferença entre conjuntos.

6. O que é uma Lista?

Resposta: Uma Lista é uma estrutura de dados que representa uma coleção de
elementos com ordem e com possibilidade de repetição.

7. Quais são as principais operações em uma Lista?

Resposta: As principais operações em uma Lista são inserir, remover, buscar e


verificar se está vazia.

8. Qual é a diferença entre um Conjunto e uma Lista?

Resposta: A principal diferença é que um Conjunto não permite elementos


repetidos e não possui ordem, enquanto uma Lista permite elementos repetidos
e possui uma ordem específica.
9. Crie uma Pilha com os elementos 10, 20 e 30 e desempilhe o último elemento
inserido.

Resposta: Pilha: [10, 20, 30] / Desempilhado: 30

10. Crie uma Fila com os elementos A, B e C e remova o primeiro elemento


inserido.

Resposta: Fila: [A, B, C] / Removido: A


Estrutura de dados lineares
As estruturas de dados lineares são aquelas em que os elementos são organizados
em uma única sequência. Os elementos são acessados em uma ordem específica e o
acesso a um elemento depende da posição que ele ocupa na sequência.

Algumas das principais estruturas de dados lineares são:

1. Lista: É uma estrutura de dados linear que permite a inserção e remoção de


elementos em qualquer posição da sequência. Os elementos são acessados
por meio de um índice que indica sua posição na lista.
2. Pilha: É uma estrutura de dados linear em que a inserção e a remoção de
elementos são feitas apenas em uma extremidade da sequência. O último
elemento inserido é o primeiro a ser removido (LIFO - last in, first out).
3. Fila: É uma estrutura de dados linear em que a inserção de elementos é feita
em uma extremidade da sequência e a remoção é feita na outra extremidade.
O primeiro elemento inserido é o primeiro a ser removido (FIFO - first in,
first out).
4. Deque: É uma estrutura de dados linear que permite a inserção e remoção de
elementos em ambas as extremidades da sequência. O nome "Deque" vem de
"Double-ended queue", ou seja, uma fila com duas extremidades.

Essas estruturas de dados lineares são amplamente utilizadas em programação para


organizar e manipular dados de forma eficiente. Cada uma delas tem suas
características específicas e é adequada para diferentes tipos de problemas.

Dinâmica:
"Explorando Estruturas de Dados Lineares"

Objetivo: Permitir que os alunos pratiquem a manipulação de diferentes estruturas


de dados lineares por meio de um jogo de palavras.

Materiais: Cartões com palavras, papel e canetas.

Instruções:

1. Comece explicando para os alunos o conceito de estruturas de dados lineares


e quais são as principais estruturas (lista, pilha, fila e deque).
2. Distribua os cartões com as palavras para os alunos. As palavras devem ser
relacionadas com as estruturas de dados lineares (por exemplo, "último",
"primeiro", "fila", "empilhar", etc.).
3. Divida a turma em equipes e explique que cada equipe deve criar uma lista
de palavras relacionadas com uma estrutura de dados linear específica (por
exemplo, lista, pilha, fila ou deque).
4. Cada equipe deve ter uma folha de papel e uma caneta para anotar suas
palavras.
5. Após alguns minutos, peça para que as equipes revezem e desafiem uma a
outra a adivinhar a estrutura de dados linear correspondente às palavras da
lista. A equipe que adivinhar corretamente ganha um ponto.
6. A equipe com mais pontos ao final do jogo vence.
7. Para aumentar o desafio, você pode acrescentar restrições adicionais, como
limitar o tempo de criação da lista de palavras ou exigir que as palavras
tenham um número mínimo de caracteres.

Essa atividade é uma maneira divertida e interativa de permitir que os alunos


pratiquem a manipulação de diferentes estruturas de dados lineares e reforcem o
aprendizado dos conceitos. Além disso, o jogo de palavras pode estimular a
criatividade e a colaboração entre os alunos.

Listas e Filas
As estruturas de dados são uma parte importante da ciência da computação, e são
usadas para organizar e armazenar informações em um computador. As estruturas
de dados lineares, como listas e filas, são particularmente úteis porque elas
armazenam informações em uma ordem específica. Nesta apostila, vamos
aprender sobre as estruturas de dados lineares chamadas de listas e filas, e como
elas funcionam.

Listas

Uma lista é uma estrutura de dados linear que armazena informações em uma
sequência ordenada. Cada elemento da lista tem um índice que indica sua posição
na sequência. Listas podem ser usadas para armazenar informações como nomes,
números, datas e muito mais. A principal vantagem de uma lista é que você pode
inserir ou excluir elementos de qualquer posição na sequência. Vamos ver como isso
funciona.

Suponha que temos a seguinte lista:

[2, 4, 6, 8, 10]

Podemos acessar qualquer elemento da lista usando seu índice. Por exemplo, para
acessar o terceiro elemento (o número 6), usamos o índice 2:

lista[2] = 6

Agora, digamos que queremos adicionar o número 12 à nossa lista, entre o 10 e o 8.


Podemos fazer isso usando o método de inserção:

lista.insert(3, 12)
Isso adicionará o número 12 na terceira posição da lista (a posição 3 é entre o 8 e o
10).

Filas

Uma fila é uma estrutura de dados linear que armazena informações em uma ordem
específica, mas onde a remoção dos elementos é feita de acordo com a ordem em
que foram adicionados. Ou seja, o primeiro elemento adicionado é o primeiro a ser
removido. Uma fila é semelhante a uma fila de pessoas esperando em um banco,
onde a pessoa que chega primeiro é a primeira a ser atendida.

Vamos supor que temos uma fila de pessoas esperando em um caixa eletrônico.
Quando alguém chega à fila, ela é adicionada ao final da fila. Quando chega sua vez,
a pessoa na frente da fila é atendida e removida da fila. O próximo da fila é então
atendido e removido, e assim por diante.

Podemos usar uma fila para armazenar informações como pedidos de uma loja
online, por exemplo. Quando um pedido é feito, ele é adicionado à fila. Quando o
pedido é atendido, ele é removido da fila e o próximo pedido é atendido.

Exemplos:

Lista de alunos em uma sala de aula

Fila de pedidos em uma lanchonete


Fila de música em uma playlist
Atividades:
1. Escreva uma lista com os números pares de 2 a 10.

Resposta: [2, 4, 6, 8, 10]

2. Acesse o terceiro elemento da seguinte lista: [3, 6, 9, 12, 15]

Resposta: 9

3. Adicione o número 7 à lista [2, 4, 6, 8, 10] na posição 2.

Resposta: [2, 4, 7, 6, 8, 10]

4. Escreva um programa que cria uma fila com os números de 1 a 5 e remove


os dois primeiros elementos.

Resposta:
Métodos de pesquisa e classificação de
dados

Esse assunto é muito importante para organizar e buscar informações em grandes


quantidades de dados.

Métodos de Pesquisa:

Para buscar informações em um conjunto de dados, podemos utilizar diferentes


métodos de pesquisa. Os principais são:

1. Busca Sequencial: Esse método percorre os dados um a um até encontrar o


valor buscado. É útil para pequenos conjuntos de dados, mas pode ser muito
demorado em grandes conjuntos.
2. Busca Binária: Esse método é mais eficiente que a busca sequencial e é
utilizado em conjuntos de dados ordenados. Ele divide o conjunto ao meio e
verifica se o valor buscado está na metade esquerda ou direita. Esse processo
é repetido até encontrar o valor buscado ou até não haver mais elementos
para verificar.
3. Hashing: Esse método utiliza uma função chamada hash para transformar o
valor buscado em um índice da tabela de dados. É um método muito rápido,
mas pode ter colisões, ou seja, dois valores diferentes que resultam no
mesmo índice.

Métodos de Classificação:

Para organizar os dados, podemos utilizar diferentes métodos de classificação. Os


principais são:

1. Bubble Sort: Esse método compara cada elemento com o próximo e troca de
posição se estiverem fora de ordem. Esse processo é repetido várias vezes
até que todos os elementos estejam em ordem.
2. Selection Sort: Esse método encontra o menor elemento e o coloca na
primeira posição, depois encontra o segundo menor elemento e o coloca na
segunda posição, e assim por diante até que todos os elementos estejam em
ordem.
3. Quick Sort: Esse método divide o conjunto em dois subconjuntos, um com
elementos menores que um pivô e outro com elementos maiores que o pivô.
Esse processo é repetido recursivamente até que todos os elementos estejam
em ordem.
Exemplos:

1. Busca Sequencial:

2. Busca Binária
3. Hashing
Atividades sobre Métodos de pesquisa e
classificação de dados - Nível fácil
1. Qual é o objetivo dos métodos de pesquisa em estrutura de dados?

Resposta: Encontrar um elemento específico em uma estrutura de dados.

2. Qual é o objetivo dos métodos de classificação em estrutura de dados?


Resposta: Ordenar os elementos de uma estrutura de dados.
3. O que é uma lista em estrutura de dados?

Resposta: Uma lista é uma estrutura de dados linear que armazena um


conjunto de elementos em sequência.

4. O que é uma fila em estrutura de dados?

Resposta: Uma fila é uma estrutura de dados linear que armazena um conjunto
de elementos em sequência, onde o primeiro elemento inserido é o primeiro a
ser removido.

5. Como funciona o método de busca sequencial?

Resposta: O método de busca sequencial percorre todos os elementos da


estrutura de dados, um por um, até encontrar o elemento desejado.

6. Como funciona o método de classificação Bubble Sort?

Resposta: O método de classificação Bubble Sort compara cada elemento com


o próximo e troca de posição se estiverem fora de ordem. Esse processo é
repetido várias vezes até que todos os elementos estejam em ordem.

7. Qual a diferença entre o método de busca sequencial e o método de busca


binária?

Resposta: O método de busca sequencial percorre todos os elementos da


estrutura de dados, enquanto o método de busca binária divide a estrutura de
dados em duas partes e verifica em qual das partes o elemento desejado está
localizado.

8. Qual o método de classificação mais eficiente?

Resposta: O método de classificação Quick Sort é um dos mais eficientes, com


tempo de execução médio de O(n log n).

9. Em uma lista com 10 elementos, qual é o índice do último elemento?


Resposta: O índice do último elemento é 9.
Atividades final

5.1 Crie um algoritmo para somar dois números inteiros:


5.2 O que é um array?
5.3 Crie um algoritmo para imprimir números de 1 a 10
5.4 Qual é a diferença entre uma pilha e uma fila?
5.5 Complete o algoritmo para calcular a média de três números
5.6 Criar um algoritmo para imprimir os números paras de 0 a 20
5.7 O que é um algoritmo?
5.8 Complete o algoritmo para calcular o fatorial de um número:
5.9 Crie um algoritmo para imprimir os números ímpares de 1 a 15.

Respostas
1.

2. Um array é uma estrutura de dados que armazena um conjunto de elementos


do mesmo tipo.
3.

4. Uma pilha é uma estrutura de dados que segue o princípio LIFO (Last In, First
Out), ou seja, o último elemento adicionado é o primeiro a ser removido. Já
uma fila segue o princípio FIFO (First In, First Out), ou seja, o primeiro
elemento adicionado é o primeiro a ser removido.
5.

6.

7. Um algoritmo é uma sequência de instruções finita e definida que resolve um


problema ou realiza uma tarefa específica.

8.
9.

Você também pode gostar