Lógica de Programação, Notas de aula de Lógica Matemática. Universidade Federal do Rio Grande do Norte (UFRN)
m_douglas1607
m_douglas1607

Lógica de Programação, Notas de aula de Lógica Matemática. Universidade Federal do Rio Grande do Norte (UFRN)

PDF (371 KB)
31 páginas
69Número de visitas
Descrição
Material sobre Lógica de Programação
20 pontos
Pontos de download necessários para baixar
este documento
Baixar o documento
Pré-visualização3 páginas / 31
Esta é apenas uma pré-visualização
3 mostrados em 31 páginas
Baixar o documento
Esta é apenas uma pré-visualização
3 mostrados em 31 páginas
Baixar o documento
Esta é apenas uma pré-visualização
3 mostrados em 31 páginas
Baixar o documento
Esta é apenas uma pré-visualização
3 mostrados em 31 páginas
Baixar o documento

Material Didático do Instituto Metrópole Digital - IMD

Versão 2.0 - Todos os Direitos reservados

Lógica de Programação Aula 13 - Estruturas de dados homogêneas

– vetores e matrizes

Apresentação

Apresentação

Nas aulas anteriores, estudamos as estruturas de controle. Vimos que tais estruturas são utilizadas para definir o fluxo de execução dos comandos nos algoritmos. Vimos também as estruturas sequenciais, com comandos básicos e ordem simples na execução desses comandos; as estruturas de decisão, que estabelecem desvios na execução dos comandos, de acordo com condições específicas, e as estruturas de repetição, em que determinados comandos são executados em laço.

Até agora, na execução dos comandos com as estruturas de controle, utilizamos tipos de dados básicos, com variáveis simples: real, inteiro, literal, caractere e lógico. Nesta aula, veremos que há situações em que os tipos de dados básicos não são suficientes para resolver os problemas que se apresentam. Em muitos momentos, precisaremos, para atingir a solução de tais problemas, utilizar o que chamamos de estruturas de dados homogêneas. Iremos, ao longo da aula, entender o conceito dessas estruturas e ver que, utilizando-as, podemos armazenar diversos dados de um mesmo tipo em uma única variável. Estudaremos a utilidade dessas estruturas e as classificaremos em vetores (unidimensionais) e matrizes (bidimensionais), contemplando a sintaxe e a construção de algoritmos utilizando as duas estruturas.

 Vídeo 01 - Apresentação

Objetivos

Ao final da aula, você deverá ser capaz de:

Definir o conceito de estruturas de dados homogêneas, classificando-as.

Definir o conceito e a sintaxe da utilização de vetores.

Identificar quando é conveniente utilizar vetores.

Construir algoritmos completos utilizando vetores.

Definir o conceito e a sintaxe da utilização de matrizes.

Identificar quando é conveniente utilizar matrizes.

Construir algoritmos completos utilizando matrizes.

Estruturas de Dados Homogêneas

 Vídeo 02 - Estruturas de Dados Homogêneas

Ao longo da nossa disciplina, vimos que uma variável é um espaço na memória que é reservado para armazenar determinados tipos de dados. Até agora, porém, nós trabalhamos apenas com os tipos de dados básicos (reais, inteiros, caracteres, literais e lógicos) e variáveis simples para armazenar esses dados. No entanto, nem sempre os tipos de dados básicos são suficientes para representar as estruturas de dados necessárias para resolver os problemas que se apresentam.

Imagine, por exemplo, que você quer escrever um programa que solicita ao usuário a entrada dos nomes de 50 alunos de uma turma de sua escola. Parece simples, não? E é. Basta você utilizar uma das estruturas de repetição que vimos nas aulas anteriores. Veja:

algoritmo "50 nomes"

var

nome:literal

contador:inteiro

inicio

escreval ("Digite os nomes dos alunos:")

para contador de 1 ate 50 passo 1 faca

escreval ("Aluno",contador,":")

leia (nome)

escreval ("Aluno",contador,": ",nome)

fimpara

fimalgoritmo

O algoritmo anterior solicita que o usuário digite os nomes e lê um a um, conforme o usuário os digita. Nesse caso, precisamos apenas de uma variável inteira que servirá como contador e uma variável do tipo literal para armazenar o nome que será digitado.

O nome é digitado, armazenado na variável, exibido ao usuário, e a variável é liberada para armazenar o próximo nome. Se você solicitar ao programa que exiba o conteúdo da variável nome, verá que somente o último nome digitado será exibido.

Faça o teste: adicione a seguinte linha após o final da estrutura de repetição: escreva ("Nome:",nome). Execute no VisuAlg e observe a saída.

Mas se quisermos que todos os nomes digitados sejam exibidos em uma lista imediatamente após a digitação dos mesmos? Como fazer isso?

Para que os nomes dos alunos do nosso exemplo sejam exibidos em uma lista, eles precisam primeiro ser acessados. E para serem acessados, é necessário que todos eles estejam armazenados nessa lista. Para esse fim, existem as estruturas de dados homogêneas.

Estruturas de dados homogêneas são estruturas que permitem armazenar conjuntos de dados de um mesmo tipo (daí o nome "homogêneas") em uma única variável. São também chamadas de variáveis compostas homogêneas ou variáveis compostas indexadas.

As estruturas de dados homogêneas são classificadas em dois tipos:

a. a. os vetores (ou arrays), estruturas que armazenam os dados em uma única linha e várias colunas (dizemos que são unidimensionais);

b. as matrizes, estruturas que armazenam os dados em forma de tabela, com várias linhas e várias colunas (são bidimensionais).

Atividade 01

1. Explique o conceito de estruturas de dados homogêneas.

2. Para que são utilizadas tais estruturas?

3. Como são classificadas? Explique o conceito de cada uma.

Vetores

Voltando ao nosso exemplo, como exibir os nomes dos alunos em uma lista, utilizando as estruturas de dados homogêneas? Antes de resolver esse problema, vamos analisar o passo a passo dessa situação.

Primeiro, devemos inserir os dados no programa. Ou seja, devemos escrever, um a um, os nomes dos alunos, armazenando-os em uma lista. Em seguida, solicitamos que o programa exiba a lista dos alunos. Os dados armazenados são, então, acessados e, em seguida, exibidos.

Se tentássemos resolver esse problema com o que aprendemos até aqui, teríamos que declarar 50 variáveis literais para armazenar os 50 nomes e depois teríamos que instruir o computador a ler, uma a uma, cada variável. Algo similar ao trecho de programa abaixo:

leia (nome1,nome2,nome3...nome50)

escreva (nome1,nome2,nome3...nome50)

Não precisa dizer que a solução anterior seria inviável, não é mesmo? Na realidade, a solução ideal para o problema pode ser encontrada se utilizarmos uma variável composta unidimensional, ou seja, um vetor.

 Vídeo 03 - Vetores Declaração e Atribuição

Declaração de um vetor

Assim como as variáveis simples, os vetores precisam ser declarados antes de serem utilizados. A declaração de um vetor, porém, é um pouco diferente da declaração de uma variável comum, pois se trata de uma variável indexada. É como se estivéssemos declarando diversas variáveis dentro de uma só, diferenciadas apenas por um índice.

Essas "variáveis" correspondem aos elementos do vetor (em nosso exemplo, os nomes dos alunos). Já o índice é um valor numérico do tipo inteiro, que sempre começa em 1 e corresponde à posição de cada elemento no vetor. Veja a Tabela 1.

1 2 3 4 5

Maria João Fátima Francisco Fernanda

Tabela 1 - Exemplo simples de um vetor

A Tabela 1 representa um vetor de 5 elementos. Os elementos são os nomes (Maria, João, Fátima, Francisco, Fernanda). Os números de 1 a 5 representam os índices, que são as posições de cada elemento no vetor. Por exemplo, o elemento Fátima ocupa a posição 3 do vetor.

Ao declarar um vetor, o seu "tamanho" deve ser informado. O "tamanho" de um vetor é a quantidade de dados que será armazenada na variável. Na Tabela 1, o tamanho do vetor é 5. No nosso exemplo (dos nomes dos alunos), o tamanho do vetor é 50, pois queremos armazenar os nomes de 50 alunos.

Veja a sintaxe da declaração de um vetor:

<identificador> : vetor [tamanho] de <tipo>

onde

[tamanho] = [Vi..Vf], onde: Vi = valor inicial e Vf = valor final

Nosso exemplo:

nomes : vetor [1..50] de literal

No nosso exemplo, ao invés de declararmos diversas variáveis (nomes1, nomes2...nomes50), estamos declarando diversos elementos (os nomes) em uma variável.

Atribuição em vetor

Assim como as variáveis comuns, os elementos de um vetor também podem ser inicializados, ou seja, ter seus valores atribuídos no momento da declaração.

Ao atribuir valores a um elemento do vetor, deve ser obedecida a seguinte sintaxe:

<identificador>[posição] <- <valor>

Exemplos:

nomes[3] <- "João Maria da Silva"

i <- 5

nomes[i] <- "Maria Joana de Souza"

Agora que você já conheceu os conceitos e a sintaxe dos vetores, vamos resolver o nosso problema proposto.

Ao digitar os nomes dos alunos, utilizamos uma estrutura de repetição. Fizemos isso, você sabe, porque se trata de uma execução em loop. Para exibir os dados, teremos que utilizar outra estrutura de repetição, pois a exibição também é feita em loop. Ou seja, o vetor exibirá os dados um após o outro, até que todos sejam exibidos.

Veja a solução a seguir.

algoritmo "Nomes dos Alunos"

var

nomes: vetor[1..50]de literal // declaramos, aqui, o vetor (veja o tamanho entre colchetes)

contador:inteiro //declaração da variável contador

inicio

escreval ("Digite os nomes dos alunos:")

para contador de 1 ate 50 passo 1 faca // inicio da primeira estrutura de repetição

escreval ("Aluno ",contador,":")

leia (nomes[contador]) // os dados são armazenados um a um, no vetor

fimpara //fim da primeira estrutura de repetição

para contador de 1 ate 50 passo 1 faca // inicio da segunda estrutura de repetição

escreval (nomes[contador]) // os dados são exibidos

fimpara //fim da segunda estrutura de repetição

fimalgoritmo

Perceba que há uma estrutura de repetição para armazenar os dados e outra para exibi-los. Execute o algoritmo no VisuAlg.

Atividade 02

1. De que forma é declarado um vetor? Explique sua sintaxe e exemplifique.

2. O que é o tamanho de um vetor? Explique para que serve a indexação.

3. Nas aulas anteriores, vimos, exaustivamente, o exemplo do cálculo da média. Aprendemos a criar um algoritmo que calcula a média aritmética de um aluno na aula de estruturas sequenciais; vimos como dizer se o aluno foi ou não aprovado, com as estruturas de decisão, e calculamos a média para vários alunos, com as estruturas de repetição. Veja o algoritmo a seguir, que calcula e exibe a média de 50 alunos de uma turma:

algoritmo “50 Médias”

var

nota1: real

nota2: real

nota3: real

contador: inteiro

inicio

escreval (“Digite as notas dos alunos:”)

para contador de 1 ate 5 passo 1 faca

escreval(“Digite a primeira nota do aluno “,contador,”:”)

leia (nota1)

escreval(“Digite a segunda nota do aluno “,contador,”:”)

leia (nota2)

media < - (nota1+nota2)/2

escreval (“A média do aluno “,contador,” é: “,media)

fimpara

fimalgoritmo

O algoritmo anterior recebe, dentro do loop, duas notas e exibe a média de cada aluno. Isso é feito à medida que o usuário digita as informações. Nós queremos, agora, exibir essas informações em uma lista, depois que todos os dados são inseridos. Como fazer isso? Resolva esse problema. O algoritmo deve solicitar que o usuário digite o nome e duas notas de cada aluno. Em seguida, o programa exibe os nomes e suas respectivas médias em uma lista.

Ordenação de um vetor

 Vídeo 04 - Ordenação de um

Ao escrever algoritmos com vetores, haverá momentos em que você sentirá a necessidade de ordenar os seus elementos.

Você já deve ter visto ou utilizado algum programa de computador que tem funcionalidades que classificam palavras em ordem alfabética ou números em ordem crescente. A ordenação é um tipo de funcionalidade bastante útil e necessária a alguns programas de computador. E essa ordenação é realizada por meio de comparações entre os elementos do vetor.

Se você digita dois números, por exemplo, e pede ao computador que os ordene, será realizada uma comparação entre os dois, para ver quem é o maior e quem é o menor. Em seguida, o menor é colocado na primeira

posição e o maior na segunda posição (se a ordenação for crescente). Veja abaixo.

01 02 Posição na memória

A = 5 B = 2 Elementos a ordenar

A > B, então

01 02 Posição na memória

B = 2 A = 5 Elementos ordenados

Quando há uma quantidade maior de elementos a serem ordenados, há a necessidade de técnicas específicas de ordenação. Vamos conhecer uma delas.

Observe a tabela a seguir.

01 02 03 04 05

5 2 12 8 1

Os números 01 a 05 na primeira linha da tabela representam as posições na memória (os índices do vetor) de cada elemento. Na linha de baixo, estão os elementos fora de ordem.

Para ordenar os elementos, é necessário fazer a comparação entre todos eles da seguinte maneira: primeiro, comparamos o número do índice 01 com cada um dos outros. O menor é colocado na posição 01.

Depois, é realizada a comparação do segundo elemento com os restantes e assim por diante.

Porém, como cada elemento ocupa um espaço na memória, precisamos reservar um espaço auxiliar (uma variável temporária) para armazenar um dos elementos da comparação, quando ele tiver que trocar de posição. Veja:

I – Criamos uma variável auxiliar e comparamos o número do primeiro índice com todos os demais, até encontrar o menor, armazenando-o na primeira posição.

(i) Comparamos o 5 com o 2. Como o 5 é maior, trocamos os dois números de posição. O 5 vai para a variável auxiliar (ii) e o 2 vai para a primeira posição (iii). Depois, o 5 vem para a posição onde o 2 estava anteriormente (iv).

II - Como houve troca de posições entre os elementos, realizamos a comparação entre o primeiro elemento (que agora é o 2) com os demais, até achar um menor.

III – Ao encontrar um número menor (1), realizamos a troca de posições entre os dois da mesma forma que a troca anterior, utilizando a variável auxiliar.

IV – Já temos o número menor. Agora, fazemos as comparações entre o número que está na segunda posição e os demais, até encontrar o segundo menor e trocarmos os dois de posição.

V – Procedemos à troca de posições.

VI - Com o primeiro e o segundo números definidos, fazemos as comparações entre o terceiro número e os restantes, trocando sempre as posições, a fim de que os menores fiquem nas primeiras posições. Veja:

Comparamos e trocamos o 12 com o 8.

Comparamos e trocamos o 8 com o 5.

Novamente trocamos o 12 com o 8. A ordenação está completa.

Consegue perceber o princípio desse tipo de ordenação? Vamos ver o funcionamento desse algoritmo em pseudocódigo.

algoritmo "ordenação"

var

i:inteiro // contador1

num: vetor[1..5]de inteiro // declaração do vetor que será ordenado

temp:inteiro

inicio

para i de 1 ate 5 faca

escreval ("Numero?")

leia (num[i])

fimpara

// solicita entrada dos números

para i de 1 ate 5 faca

para j de 1 ate 5 faca

// são duas estruturas de repetição, pois dois números serão comparados repetidamente

se num[i] < num[j] entao // compara dois números

temp <- num[j] // coloca o maior na variável temporária

num[j] <- num[i] // coloca o menor no lugar do maior

num[i] <- temp // coloca o maior(que estava na variável temporária) no lugar em que estava o menor

fimse

fimpara

fimpara

para i de 1 ate 5 faca

escreva (num[i])

// Exibe os números ordenados

fimpara

fimalgoritmo

Atividade 03

1. Para que serve a variável temporária, no método de ordenação de vetores?

2. Execute o algoritmo de ordenação que vimos no VisuAlg.

3. Faça a ordenação desse algoritmo em ordem decrescente.

Matrizes

 Vídeo 05 - Matrizes de Duas Dimensões

Vimos, há pouco, que nem sempre os tipos de dados básicos são suficientes para representar as estruturas de dados necessárias para resolver os problemas que se apresentam.

Vimos também a necessidade de, em algumas situações, exibir dados em listas. E, para atender a essa necessidade, conhecemos os vetores como estruturas de dados unidimensionais, com variáveis indexadas referenciadas por um único índice.

Aprendemos que armazenando os dados em um vetor e acessando-o em seguida, podemos exibir suas informações em uma lista.

Porém, os vetores lidam com apenas uma dimensão. Ou seja, se fôssemos representar o vetor através de uma tabela, esta só teria uma linha com várias colunas, ou vice-versa, como podemos ver na tabela a seguir, exposta há pouco no estudo sobre vetores. Veja:

1 2 3 4 5

Maria João Fátima Francisco Fernanda

Os elementos do vetor, na tabela, são os nomes dos alunos Maria, João, Fátima, Francisco e Fernanda. Dessa forma, os elementos e seus índices são:

nomes[1] <-"Maria"

nomes[2] <- "João"

nomes[3] <- "Fátima"

nomes[4] <- "Francisco"

nomes[5] <- "Fernanda"

Agora, imagine que o professor de determinada disciplina passou um trabalho a ser feito em dupla e quer organizar os nomes das duplas. Veja a tabela a seguir.

Grupos Componente 1 Componente 2

1 Maria João

2 Fátima Francisco

3 Fernanda José

Os elementos dos grupos, segundo a tabela, são os seguintes:

Componentes [1,1] <- Maria (componente 1 do grupo 1)

Componentes [2,1] <- João (componente 2 do grupo 1)

Componentes [1,2] <- Fátima (componente 1 do grupo 2)

Componentes [2,2] <- Francisco (componente 2 do grupo 2)

Componentes [1,3] <- Fernanda (componente 1 do grupo 3)

Componentes [2,3]<- José (componente 2 do grupo 3)

Temos, portanto, 3 grupos, cada um com 2 componentes. Fátima, por exemplo, é o componente 1 do grupo 2. Estamos tratando, portanto, de uma matriz.

Uma matriz é uma estrutura de dados homogênea de duas (ou mais) dimensões. Uma matriz utiliza variáveis indexadas de mais de um índice.

Mas como fazemos isso em algoritmos?

Primeiro, precisamos conhecer a sintaxe da declaração de uma matriz. Veja:

<identificador> : vetor [<tamanho1>, <tamanho2>] de <tipo>

<tamanho1> = tamanho da linha da matriz

<tamanho2> = tamanho da coluna da matriz

Nosso exemplo:

componentes : vetor [1..3,1..2] de literal

1..3 = 3 linhas (3 grupos)

1..2 = 2 colunas (2 componentes por grupo)

Observe que a matriz, no VisuAlg, é um vetor com duas dimensões, ou seja, com dois índices. Dessa forma, sua declaração é feita de forma semelhante à declaração do vetor, com a única diferença de que devemos informar o tamanho da segunda dimensão. A dimensão 1, no caso, é referente aos grupos (1..3) e a dimensão 2 é referente aos nomes dos alunos de cada grupo (1..2). Vamos ver o algoritmo a seguir.

algoritmo "matriz grupos" // nome do algoritmo

var

componente : vetor[1..3,1..2]de literal // declaração da matriz

cont, cont1 : inteiro // declaração dos contadores

inicio

// Estrutura para receber e armazenar os dados da matriz

para cont de 1 ate 3 faca // repetição para os grupos

para cont1 de 1 ate 2 faca // repetição para os componentes

escreval ("Digite o nome do componente ",cont1," do grupo ",cont,":")

leia (componente[cont, cont1]) // recebe os dados

fimpara

fimpara

//Estrutura para exibir os dados recebidos e armazenados

para cont de 1 ate 3 faca

escreval ("Grupo ",cont,":") // mostra o nome do grupo

para cont1 de 1 ate 2 faca

escreval(componente[cont, cont1]) // mostra os componentes

fimpara

fimpara

fimalgoritmo

Observe que declaramos, além do vetor, dois contadores. Fizemos isso, porque temos dois índices (um para contar os grupos e outro para contar os componentes de cada grupo). Se tivéssemos três índices, teríamos que declarar três contadores e assim por diante.

Você sabe que, para percorrer os elementos do vetor, precisamos fazer isso índice a índice. Por isso, precisamos do contador e de uma estrutura de repetição para armazenar os dados e outra para exibi-los.

Com as matrizes ocorre o mesmo. Porém, como temos dois índices, utilizamos duas estruturas de repetição, uma dentro da outra, para receber os dados, e mais duas para exibi-los. Se tivéssemos três índices, teríamos que utilizar três estruturas de repetição para cada uma dessas atividades.

Atribuição em Matrizes

 Vídeo 06 - Atribuição de Matrizes

Assim como com os vetores, os elementos de uma matriz também podem ser inicializados, ou seja, ter seus valores atribuídos no momento da declaração.

Ao atribuir valores a um elemento da matriz, fazemos de modo similar aos vetores:

<identificador>[posição] <- <valor>

onde,

[posição] = [indice1,indice2]

Até o momento nenhum comentário
Esta é apenas uma pré-visualização
3 mostrados em 31 páginas
Baixar o documento