Estruturas de dados no pseudocódigo essencial: listas, vetores, matrizes e registros

Capítulo 10

Tempo estimado de leitura: 9 minutos

+ Exercício

Notação simples para coleções e registros

Neste capítulo, vamos padronizar uma notação enxuta para representar coleções (LISTA, VETOR e MATRIZ) e estruturas com campos (REGISTRO). A ideia é conseguir descrever dados e manipulações comuns (acesso, iteração, tamanho, inserção e remoção) sem depender de bibliotecas específicas.

Convenções que usaremos

  • Índices: usaremos índices iniciando em 0 (zero) para vetores, listas e matrizes. Se você preferir iniciar em 1, mantenha a escolha consistente no algoritmo.
  • Acesso: colchetes para índice: A[i] e M[linha][coluna].
  • Tamanho: função conceitual TAMANHO(X) retorna a quantidade de elementos.
  • Operações conceituais (sem biblioteca): INSIRA(X, pos, valor), REMOVA(X, pos), ANEXE(X, valor) (insere ao final).

VETOR: coleção indexada de tamanho fixo

Um VETOR é uma coleção indexada com tamanho definido na criação. É adequado quando você sabe quantos itens terá e quer acesso rápido por índice.

Declaração e inicialização

Notação sugerida:

VETOR notas[5]  // 5 posições: 0..4

Inicialização com valores (quando fizer sentido no seu pseudocódigo):

VETOR notas[5] = [7.5, 8.0, 6.0, 9.0, 7.0]

Inicialização preenchendo com um valor padrão:

Continue em nosso aplicativo e ...
  • Ouça o áudio com a tela desligada
  • Ganhe Certificado após a conclusão
  • + de 5000 cursos para você explorar!
ou continue lendo abaixo...
Download App

Baixar o aplicativo

VETOR contagem[10]  // 10 posições: 0..9
PARA i DE 0 ATÉ 9 FAÇA
  contagem[i] = 0
FIM PARA

Acesso por índice

mediaParcial = (notas[0] + notas[1]) / 2

Iteração (percorrer o vetor)

Padrão recomendado: usar TAMANHO para não “espalhar” o número de elementos pelo código.

soma = 0
PARA i DE 0 ATÉ TAMANHO(notas) - 1 FAÇA
  soma = soma + notas[i]
FIM PARA

Passo a passo prático: calcular mínimo, máximo e média

Objetivo: dado um vetor de números, calcular min, max e media.

  • Passo 1: inicialize min e max com o primeiro elemento.
  • Passo 2: percorra do segundo elemento em diante, atualizando min e max.
  • Passo 3: acumule a soma para calcular a média ao final.
VETOR v[6] = [10, 4, 7, 7, 2, 9]

min = v[0]
max = v[0]
soma = v[0]

PARA i DE 1 ATÉ TAMANHO(v) - 1 FAÇA
  SE v[i] < min ENTÃO
    min = v[i]
  FIM SE

  SE v[i] > max ENTÃO
    max = v[i]
  FIM SE

  soma = soma + v[i]
FIM PARA

media = soma / TAMANHO(v)

LISTA: coleção indexada de tamanho variável

Uma LISTA é uma coleção que pode crescer e diminuir. No pseudocódigo essencial, tratamos lista como “vetor dinâmico” conceitual: você pode inserir e remover, e o tamanho muda.

Declaração e inicialização

LISTA nomes = []
LISTA idades = [18, 21, 19]

Tamanho e acesso

n = TAMANHO(idades)
primeiraIdade = idades[0]

Inserção e remoção (conceituais)

Definimos operações com efeito claro, sem assumir implementação:

  • ANEXE(L, x): adiciona ao final.
  • INSIRA(L, pos, x): insere em pos, deslocando itens à direita.
  • REMOVA(L, pos): remove o item de pos, deslocando itens à esquerda.
LISTA L = [10, 20, 30]
ANEXE(L, 40)        // L = [10, 20, 30, 40]
INSIRA(L, 1, 15)    // L = [10, 15, 20, 30, 40]
REMOVA(L, 2)        // remove o item na posição 2 (20): L = [10, 15, 30, 40]

Passo a passo prático: remover todos os valores abaixo de um limite

Problema: dada uma lista de números, remover todos os elementos menores que limite.

O cuidado aqui é que, ao remover um item, os índices mudam. Um padrão simples é percorrer com ENQUANTO e só avançar o índice quando não remover.

  • Passo 1: comece em i = 0.
  • Passo 2: se L[i] for menor que o limite, remova e mantenha i (pois um novo elemento “caiu” nessa posição).
  • Passo 3: caso contrário, avance i.
LISTA L = [5, 12, 3, 20, 8]
limite = 10

i = 0
ENQUANTO i < TAMANHO(L) FAÇA
  SE L[i] < limite ENTÃO
    REMOVA(L, i)
  SENÃO
    i = i + 1
  FIM SE
FIM ENQUANTO
// Resultado esperado: L = [12, 20]

MATRIZ: coleção bidimensional (linhas x colunas)

Uma MATRIZ organiza dados em duas dimensões. Use quando o problema naturalmente envolve linhas e colunas (tabela, grade, imagem, distâncias entre pontos, etc.).

Declaração e inicialização

MATRIZ M[3][4]  // 3 linhas (0..2) e 4 colunas (0..3)

Inicialização preenchendo com zero (padrão comum):

PARA i DE 0 ATÉ 2 FAÇA
  PARA j DE 0 ATÉ 3 FAÇA
    M[i][j] = 0
  FIM PARA
FIM PARA

Inicialização literal (quando útil para exemplos):

MATRIZ A[2][3] = [
  [1, 2, 3],
  [4, 5, 6]
]

Acesso por índice

x = A[1][2]  // linha 1, coluna 2 (valor 6)

Padrões para percorrer matrizes

Padrão 1: varrer tudo (linha por linha)

PARA i DE 0 ATÉ LINHAS(M) - 1 FAÇA
  PARA j DE 0 ATÉ COLUNAS(M) - 1 FAÇA
    // use M[i][j]
  FIM PARA
FIM PARA

Se você não quiser introduzir LINHAS e COLUNAS, pode manter as dimensões como constantes nomeadas:

LIN = 3
COL = 4
MATRIZ M[LIN][COL]

PARA i DE 0 ATÉ LIN - 1 FAÇA
  PARA j DE 0 ATÉ COL - 1 FAÇA
    M[i][j] = 0
  FIM PARA
FIM PARA

Padrão 2: percorrer a diagonal principal (somente quando a matriz é quadrada)

somaDiag = 0
PARA i DE 0 ATÉ N - 1 FAÇA
  somaDiag = somaDiag + M[i][i]
FIM PARA

Padrão 3: somar por linha e por coluna

// soma de cada linha
PARA i DE 0 ATÉ LINHAS(M) - 1 FAÇA
  somaLinha = 0
  PARA j DE 0 ATÉ COLUNAS(M) - 1 FAÇA
    somaLinha = somaLinha + M[i][j]
  FIM PARA
  ESCREVA("Linha ", i, ": ", somaLinha)
FIM PARA

Passo a passo prático: encontrar o maior valor e sua posição

  • Passo 1: assuma o primeiro elemento como maior.
  • Passo 2: varra a matriz inteira comparando.
  • Passo 3: ao atualizar o maior, guarde também i e j.
maior = M[0][0]
posI = 0
posJ = 0

PARA i DE 0 ATÉ LINHAS(M) - 1 FAÇA
  PARA j DE 0 ATÉ COLUNAS(M) - 1 FAÇA
    SE M[i][j] > maior ENTÃO
      maior = M[i][j]
      posI = i
      posJ = j
    FIM SE
  FIM PARA
FIM PARA

ESCREVA("Maior=", maior, " em (", posI, ",", posJ, ")")

REGISTRO: agrupar campos relacionados

Um REGISTRO (ou estrutura) agrupa campos de tipos diferentes sob um mesmo nome. Use quando um “item” tem várias propriedades (ex.: aluno tem nome, idade, nota).

Definição e criação

REGISTRO Aluno
  nome: TEXTO
  idade: INTEIRO
  nota: REAL
FIM REGISTRO

VAR a: Aluno
a.nome = "Ana"
a.idade = 20
a.nota = 8.5

Lista de registros (tabela de objetos)

Uma forma comum de organizar dados é uma LISTA de REGISTRO:

LISTA alunos = []

REGISTRO Aluno
  nome: TEXTO
  idade: INTEIRO
  nota: REAL
FIM REGISTRO

VAR x: Aluno
x.nome = "Ana"
x.idade = 20
x.nota = 8.5
ANEXE(alunos, x)

VAR y: Aluno
y.nome = "Bruno"
y.idade = 22
y.nota = 6.0
ANEXE(alunos, y)

Acesso a campos e iteração

PARA i DE 0 ATÉ TAMANHO(alunos) - 1 FAÇA
  ESCREVA(alunos[i].nome, " - ", alunos[i].nota)
FIM PARA

Passo a passo prático: calcular estatísticas a partir de registros

Problema: dada uma lista de alunos, calcular média das notas, maior nota e o nome do aluno com maior nota.

  • Passo 1: inicialize acumuladores (soma) e “melhor aluno” com o primeiro registro.
  • Passo 2: percorra a lista somando notas e comparando para achar a maior.
  • Passo 3: calcule a média ao final.
soma = 0
maiorNota = alunos[0].nota
nomeMaior = alunos[0].nome

PARA i DE 0 ATÉ TAMANHO(alunos) - 1 FAÇA
  soma = soma + alunos[i].nota

  SE alunos[i].nota > maiorNota ENTÃO
    maiorNota = alunos[i].nota
    nomeMaior = alunos[i].nome
  FIM SE
FIM PARA

media = soma / TAMANHO(alunos)
ESCREVA("Média=", media)
ESCREVA("Maior nota=", maiorNota, " (", nomeMaior, ")")

Padrões úteis de organização de dados

Vetor paralelo vs. registro

Dois jeitos de representar “alunos com nome e nota”:

  • Vetores paralelos: VETOR nomes[] e VETOR notas[] com o mesmo índice representando a mesma pessoa.
  • Lista de registros: LISTA alunos onde cada item tem nome e nota.

Como padrão de pseudocódigo, prefira registro quando os campos pertencem ao mesmo “objeto”, pois reduz erros de desalinhamento de índices.

Tabela de referência rápida

EstruturaQuando usarAcessoTamanho
VETORQuantidade fixa, acesso rápidov[i]fixo (ou TAMANHO(v))
LISTAQuantidade variável, inserções/remoçõesL[i]TAMANHO(L)
MATRIZDados em linhas e colunasM[i][j]LINHAS(M), COLUNAS(M)
REGISTROCampos relacionados em um itemr.camponão se aplica

Exercícios práticos

1) Manipular lista de valores (inserção, remoção e filtragem)

Dada uma lista L de inteiros:

  • a) Insira o valor 99 na posição 0.
  • b) Remova o elemento da última posição.
  • c) Remova todos os valores negativos.

Escreva o pseudocódigo usando INSIRA, REMOVA, TAMANHO e um laço que não pule elementos após remoção.

2) Estatísticas em vetor

Dado um vetor V com N números reais:

  • a) Calcule a média.
  • b) Calcule a variância (média dos quadrados das diferenças para a média).
  • c) Calcule o desvio padrão (raiz quadrada da variância) se você aceitar a operação RAIZ como função conceitual.

Dica de padrão: faça em duas passagens (primeiro a média, depois a variância).

// Passagem 1: média
soma = 0
PARA i DE 0 ATÉ N - 1 FAÇA
  soma = soma + V[i]
FIM PARA
media = soma / N

// Passagem 2: variância
soma2 = 0
PARA i DE 0 ATÉ N - 1 FAÇA
  d = V[i] - media
  soma2 = soma2 + d * d
FIM PARA
variancia = soma2 / N

3) Percorrer matriz e gerar uma matriz transformada

Dada uma matriz M de inteiros (LIN x COL), crie uma matriz T onde:

  • T[i][j] = 1 se M[i][j] for maior que 0
  • T[i][j] = 0 caso contrário

Use o padrão de varredura completa (dois laços).

4) Organizar dados em registros e buscar por campo

Defina um registro Produto com campos codigo (inteiro), nome (texto) e preco (real). Em seguida:

  • a) Crie uma lista com pelo menos 5 produtos.
  • b) Dado um codigoProcurado, encontre o produto e escreva seu nome e preço.
  • c) Se não encontrar, escreva “não encontrado”.
REGISTRO Produto
  codigo: INTEIRO
  nome: TEXTO
  preco: REAL
FIM REGISTRO

// Busca linear por código
achou = FALSO
PARA i DE 0 ATÉ TAMANHO(produtos) - 1 FAÇA
  SE produtos[i].codigo == codigoProcurado ENTÃO
    ESCREVA(produtos[i].nome, " - ", produtos[i].preco)
    achou = VERDADEIRO
    PARE
  FIM SE
FIM PARA

SE achou == FALSO ENTÃO
  ESCREVA("não encontrado")
FIM SE

Agora responda o exercício sobre o conteúdo:

Ao remover elementos de uma LISTA enquanto percorre seus índices, qual padrão evita pular itens após uma remoção?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

Ao remover em uma lista, os elementos à direita deslocam para a esquerda. Se você incrementar o índice após remover, pode pular o novo elemento que caiu na posição i. Por isso, mantém-se i quando remove e só incrementa quando não remove.

Próximo capitúlo

Funções e procedimentos no pseudocódigo essencial: assinatura, parâmetros e retorno

Arrow Right Icon
Capa do Ebook gratuito Pseudocódigo Essencial: Um Padrão Simples para Descrever Soluções
67%

Pseudocódigo Essencial: Um Padrão Simples para Descrever Soluções

Novo curso

15 páginas

Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.