Buscar

Vetores

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 64 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 64 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 64 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

- -1
Vetores
Aline Cristina Antoneli de Oliveira
Introdução
Como você organiza os utensílios em sua cozinha? Deve haver uma gaveta para cada tipo de utensílio, sendo que
cada tipo apresenta características comuns, certo? Por exemplo, você deve ter uma gaveta com talheres, outra
com tampas, outra com potes e por aí vai.
De agora em diante, tenha em mente que o armazenamento de variáveis na memória do computador é similar ao
armazenamento em gavetas. Quando temos algumas variáveis com características comuns, ou seja, do mesmo
tipo, podemos armazená-las em locais onde possam ser agrupadas e indexadas pelo seu tipo. Essas variáveis são
denominadas variáveis compostas homogêneas unidimensionais, ou vetores.
Nas próximas páginas, você conhecerá o conceito de vetores, como inserir dados e como manipulá-los.
Bons estudos!
Ao final desta aula, você será capaz de:
• Definir vetores, aplicando-os em exemplos práticos.
Definição de vetores
Ao programar, criamos variáveis de diversos tipos, e normalmente elas são armazenadas em memória para
serem utilizadas conforme a situação. No entanto, saiba que existem algumas estruturas que possibilitam o
armazenamento de várias variáveis do mesmo tipo. Uma dessas estruturas é o , ou, como conhecido emvetor
pseudocódigo e algumas linguagens de programação, .array
Vetor é definido como uma variável , que é formada por uma sequênciacomposta homogênea unidimensional
de variáveis, todas do mesmo tipo, com o mesmo identificador e alocadas sequencialmente na memória
(ASCENCIO; CAMPOS, 2012).
Explicando cada ponto da definição proposta pelas autoras Ascencio e Campos (2012), a variável é ,composta
pois possibilita que sejam armazenadas várias em uma única estrutura. Ela é porque comportahomogênea
somente um tipo de variável, ou seja, em um vetor você pode armazenar somente caracteres, não pode inserir
valores inteiros. Ela é , pois possui uma estrutura sequencial de alocação na memória, ou seja,unidimensional 
ao imaginar um vetor, você pode imaginar as gavetas que mencionamos na introdução deste tema, sendo que em
cada uma você guarda vários objetos do mesmo tipo.
Veja na Figura 1 a seguir um exemplo de um vetor. Imagine que esse vetor representa um armário com várias
gavetas, e que dentro de cada gaveta haja uma informação. As gavetas são os índices, e os valores são as
informações guardadas dentro das gavetas (Figura 1).
•
Aula 09
- -2
Figura 1 - Exemplo de estrutura homogênea unidimensional (vetor).
Fonte: Elaborada pela autora, 2019.
Convencionalmente, utilizaremos a seguinte estrutura em pseudocódigo, na qual a declaração de um vetor se dá
da seguinte forma:
tipo [nome_do_tipo_na_memoria] [limite_inicial..limite_final] [tipo_da_variável]: vetor de ;
[nome_do_tipo_na_memoria]: [identificador_variavel];
Agora, vamos entender cada informação nos colchetes acima:
• [nome_do_tipo_na_memoria] – significa que uma parte da memória está sendo alocada para que um 
vetor seja criado ali;
• [limite_inicial..limite_final] – é o tamanho que vetor terá;
• ..(dois pontos seguidos) – indica que o vetor terá a quantidade de posições informada entre os dois 
valores limite_inicial e limite_final;
• [tipo_da_variável] – é o tipo da variável que o vetor armazenará;
• [identificador_variável] – é o nome da variável após ter sido criada.
Conforme você pode perceber na figura, podemos acessar as informações do vetor puxando seu índice para
saber o valor daquela determinada posição, ou seja, no vetor “X”, posição “3”, encontra-se o valor “37”. Assim
como para todas as variáveis, a primeira coisa a se fazer ao criar um vetor é declará-lo. Posteriormente o
nomeamos, identificando-o e a seu tipo na memória do computador.
Como exemplo de declaração de vetor e atribuição de valores, observe o esquema da Figura 2, a seguir.
Figura 2 - Criação e declaração de vetor.
Fonte: Elaborado pela autora, 2019
Para inserir nomes no vetor “NOMES” criado, após indicar o tipo e a quantidade de posições, poderíamos
proceder da seguinte forma em um algoritmo, conforme exemplo a seguir:
•
•
•
•
•
FIQUE ATENTO
No caso específico de vetores, devemos ainda informar o tamanho que ele terá na memória, ou
seja, a quantidade de dados daquele tipo que ele irá receber.
- -3
proceder da seguinte forma em um algoritmo, conforme exemplo a seguir:
Ordenando um vetor
Quando criamos um vetor na memória do computador, o criamos com alguns objetivos, que são inserir e
manipular os dados ali inseridos em determinadas partes do programa em que tais operações sejam necessárias.
Para que possamos tanto inserir quanto manipular os dados em um vetor, portanto, precisamos identificar todas
as suas posições. Para isso, utilizamos o índice.
Podemos preencher um vetor de duas formas. A primeira é a utilizada no algoritmo que preenche o vetor NOME,
que você viu na seção anterior, sendo o vetor preenchido pelo próprio código do programa. Essa forma, contudo,
torna a interação com o usuário impossibilitada, o que é inviável para qualquer programa. A segunda forma, que
é amplamente utilizada, é a possibilidade de leitura de dados do vetor, para que o usuário insira os dados que
estão sendo solicitados. Para que isso aconteça, é necessária a utilização de uma estrutura de repetição, para que
o vetor seja percorrido índice a índice a fim de ser preenchido pelo usuário.
A estrutura de repetição comumente utilizada para preenchimento de um vetor é a “ [valor] ”.para .. passo .. faça
Deverá ser criada uma variável inteira que determinará a quantidade de vezes que o vetor será percorrido, ou
seja, essa variável é a que contará quantas vezes e percorrerá todas as posições do índice (FORBELLONE, 2005).
Convencionalmente, essa variável leva o nome de “i” ou “j”, fazendo alusão ao conceito de “matrizes”, o mesmo
conceito que vemos na matemática M[i, j].
Observe no exemplo a seguir prático de inserção de dados no vetor de nomes via leitura do teclado.
1 Início
2 //definição do tipo construído vetor
3 G = [1..5] tipo vetor de caracteres;
4 // definição da variável composta do tipo matriz definido
5 NOMES;G:
6 i; //declaração das variáveis linha e colunainteiro:
EXEMPLO
No exemplo prático citado, notamos que o que muda são os índices e os valores das variáveis,
que são todas do mesmo tipo, ou seja, caracteres. Veremos no próximo tópico como podemos
realizar a leitura dos dados de um vetor.
1 Início
2 //definição do tipo construído vetor
3 G = [1..5] tipo vetor de caracteres;
4 // definição da variável composta do tipo vetor definido
5 NOMES;G:
6 NOMES [1] ← “Aline”; // inserção do nome na posição 1
7 NOMES [3] ← “Fernanda”; // inserção do nome na posição 3
8 NOMES [5] ← “Eduardo”; // inserção do nome na posição 5
9 fim.
- -4
6 i; //declaração das variáveis linha e colunainteiro:
7 x; // declaração da variável que vai ser lida pelo tecladocaractere:
8 i 1 5 1 para de até passo faça
10 (“Digite o nome na posição”, i);escreva
11 (x[i]);leia
13 ;fimpara
14 fim.
Observe, na linha 8, a utilização da instrução “ ”. Tal instrução significa que:para..passo..faça
• para i 1 5 – o programa vai repetir a operação i vezes, de 1 até 5;de até
• passo 1 – significa que a variável i será incrementada de 1 em 1;
• faça – instrução para iniciar a execução do loop.
Observe o Quadro 1, que segue, a simulação na memória do computador e na tela, conforme aparece para o
usuário.
Figura 3 - Simulação do preenchimento do vetor na memória.
Fonte: Elaborado pela autora, 2019.
Até aqui, vimos como percorrer um vetor para preenchê-lo. Vamos agora compreender como devemos proceder
para que as informações lidas pelo vetor sejam exibidas na tela do computador.
Como o vetor é uma variável composta unidimensional, a forma utilizada para percorrê-lo é única, índice a
índice, para que os dados sejam acessados. Então, para o algoritmo que pede que sejam escritos nomes para
armazená-los no vetor NOME, para que sejam escritos e vistos na tela os nomes inseridos, basta que seja
utilizada a palavra reservada “escreva” e a posição quese deseja exibir naquele momento. Confira a seguir!
Caso você queira utilizar o laço “para..passo..faça” na linguagem Java, por exemplo, a estrutura é a seguinte: (for
 count=1 ; count <= 10 ; count++), em que o for significa para; count=1 é declaração da variável “count”int int
como tipo inteiro; count <= 10 é a quantidade de vezes que o vetor será percorrido; e cont++ é o incremento da
variável, ou seja, é o passo 1, percorrendo de 1 em 1 o vetor. Conforme o código que segue:
1 Início
2 //definição do tipo construído vetor
3 G = vetor [1..5] ;tipo de caracteres
4 // definição da variável composta do tipo matriz definido
5 NOMES;G:
6 i; //declaração das variáveis linha e colunainteiro:
7 x; // declaração da variável que vai ser lida pelo tecladocaractere:
8 i 1 5 1 para de até passo faça
10 (“Digite o nome na posição”, i);escreva
11 (x[i]);leia
13 fimpara;
14 i 1 5 para de até faça
15 (“Nome na posição”, i, “:”, x[i]);escreva
•
•
•
- -5
15 (“Nome na posição”, i, “:”, x[i]);escreva
16 fimpara;
17 fim.
Na tela do computador, seria exibido algo conforme o Quadro 2, a seguir.
Figura 4 - Simulação da tela para o vetor de nomes.
Fonte: Elaborado pela autora, 2019.
O domínio da utilização da instrução “ ” é imprescindível para o conhecimento em variáveispara..passo..faça
compostas homogêneas unidimensionais, ou vetores. Também é importante para as variáveis compostas
homogêneas multidimensionais, que são as matrizes.
FIQUE ATENTO
Observe que, na linha 15, foi inserida a instrução de escrita na tela para que a posição “i” do
vetor seja acessada e seja exibido na tela o nome ou o valor da variável x[i] que se encontra
naquela posição.
SAIBA MAIS
A instrução “para..passo..faça” também é conhecida como “Loops Determinados”, ou seja, como
é possível atribuir uma variável que conte a quantidade de vezes que uma instrução será
executada, significa que ela é determinada, ao contrário do “enquanto..faça”, que é conhecido
como “Loops Indeterminados”. Conheça essas estruturas e outras na linguagem Java no
terceiro capítulo de Claro e Sobral (2008).
- -6
Fechamento
Nesta aula, você teve a oportunidade de estudar os vetores, entender o conceito e o porquê de serem chamados
de variáveis compostas homogêneas unidimensionais. Você também pôde ver que:
Nesta aula, você teve a oportunidade de:
• vetores são estruturas compostas que armazenam variáveis do mesmo tipo;
• são unidimensionais, pois são estruturadas de forma única e sequencial na memória, tal qual uma tabela 
com somente uma linha;
• há duas formas de preenchimento de um vetor, seja diretamente no código, menos usual e com nenhuma 
interação com o usuário, seja com a leitura dos dados pela tela;
• que para que sejam lidos e exibidos os dados de um vetor, deve ser utilizada a estrutura “<b>para..passo..
faça</b>”.
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da Programação de
 Algoritmos, Pascal, C/C+ (Padrão ANSI) e Java. 3. ed. São Paulo: Prentice Hall, 2012.Computadores.
CLARO, Daniela Barreiro; SOBRAL, João Bosco Mangueira. . Florianópolis: CopyleftProgramação em Java
Pearson Education, 2008.
•
•
•
•
- -1
Matrizes
Aline Cristina Antoneli de Oliveira
Introdução
Sabia que para organizar os dados em estruturas com mais de uma dimensão são utilizadas as matrizes? Sabe
aquela matriz que você aprendeu lá na disciplina de Matemática? Aquela com linhas e colunas e suas operações?
Advindo desse conceito, é possível criar estruturas com múltiplas dimensões para armazenar variáveis do
mesmo tipo na memória.
Você agora compreenderá como organizar gavetas mais complexas, conhecendo os conceitos das variáveis
compostas homogêneas multidimensionais, também conhecidas como matrizes. Além disso, você compreenderá
como deve ser realizada a declaração de uma matriz e como atribuir valores a essa variável composta, assim
como utilizar a estrutura de repetição para preenchê-la e percorrê-la.
Bons estudos!
Ao final desta aula, você será capaz de:
• Definir matrizes, aplicando-as em exemplos práticos.
Definição, declaração e inserção de dados em 
uma matriz
A possibilidade de se colocar várias constantes do mesmo tipo em uma só variável não é uma propriedade
exclusiva do vetor. Existe um outro de variável em que é possível inserir várias constantes do mesmo tipo de
uma forma um pouco mais complexa. Estamos falando da .matriz
Você deve ter aprendido em Matemática que as matrizes são tabelas de números reais utilizadas em quase todos
os ramos da Ciência e Engenharia. Nessa estrutura, formada por uma grade, a distribuição horizontal é chamada
de linha e a disposição vertical é chamada de coluna (MANZANO et al., 2016).
Quando vamos para a área da programação, a matriz, assim como o vetor, é definida como uma variável
composta homogênea pelos mesmos motivos. Ela é “composta” por permitir a inserção de várias variáveis, ou
constantes, em sua estrutura; e é “homogênea” por aceitar somente um tipo de valor. A diferença principal, nesse
caso, entre vetor e matriz é que esta é multidimensional, ao contrário daquele, que é unidimensional
(FORBELLONE, 2005).
Mas o que isso quer dizer? Bem, que o conceito de linhas e colunas que temos da matriz matemática, neste caso,
usada na programação, é chamado de . A primeira dimensão é chamada de linha, a segunda de colunadimensão
e assim sucessivamente. Perceba que, sim, é possível programar matrizes com mais de duas dimensões!
•
Aula 09
- -2
Figura 1 - Representação de uma matriz.
Fonte: Casper1774 Studio. Shutterstock, 2019.
Quando há necessidade de se armazenar ou acessar informações em uma estrutura mais complexa, pode ser
utilizada a estrutura bidimensional de uma matriz. Suponha que você tenha um armário com gavetas e que
queira colocar pastas dentro das gavetas, e acessar os arquivos a partir das pastas. Você teria que montar uma
tabela ou uma matriz para compreender o que teria dentro de cada pasta nas gavetas do seu armário.
Observe na Figura 2, como esse conceito é representado.
Figura 2 - Exemplo de estrutura homogênea bidimensional (matriz).
Fonte: Fonte: Elaborada pela autora, 2019.
Conforme apresenta a Figura 2, a matriz possui os índices que indicam a linha e a coluna na qual uma informação
está armazenada. Na figura, poderíamos dizer que as linhas indicam o número da pasta que está dentro de cada
gaveta e as colunas são as gavetas onde estão armazenadas as pastas. Por exemplo, caso queiramos acessar a
pasta “2”, da gaveta “5”, o valor que iremos encontrar é o “44”. Trazendo para termos técnicos, ao acessarmos a
linha “2”, coluna ”5”, a matriz nos retorna o valor “44”.
- -3
Observe:
tipo [nome_do_tipo_na_memoria] [limite_inicial_linha..limite_final_linha, limite_inicial_coluna..: matriz
limite_final_coluna] [tipo_da_variável] de ;
[nome_do_tipo_na_memoria]: [identificador_variavel];
Sendo que:
• [nome_do_tipo_na_memoria] – significa que uma parte da memória está sendo alocada para que um 
vetor seja criado ali;
• [limite_inicial_linha..limite_final_linha] – indica a quantidade de linhas que a matriz terá;
• , (vírgula) – a vírgula é utilizada nessa estrutura para indicar o fim de uma dimensão e início de outra;
• [limite_inicial_coluna..limite_final_coluna] – indica a quantidade de colunas que a matriz terá;
• ..(dois pontos seguidos) – indica que o vetor terá a quantidade de posições informada entre os dois 
valores limite_inicial e limite_final;
• [tipo_da_variável] – é o tipo da variável que o vetor armazenará;
• [identificador_variável] – é o nome da variável após ter sido criada.
Como um exemplo de declaração de vetor e atribuição de valores, observe a seguir:
tipo A: [1..5,1..6] ;matriz de inteiros
A: VALORES;
Para inserir número na matriz “VALORES” criada, após indicar o tipo e a quantidade de posições, poderíamos
proceder da seguinte forma em um algoritmo, retomando nosso exemplo de gavetas de valores, no código a
seguir:
1 Início
2 //definição do tipo construído matriz
3 A = matriz [1..5,1..6] tipo de inteiros;4 // definição da variável composta do tipo matriz definido
5 A: VALORES;
6 VALORES [1,6] 17; // inserção do valor 17 na linha 1, coluna 6
7 VALORES [4,3] 21; // inserção do valor 21 na linha 4, coluna 3
8 VALORES [5,2] 6; // inserção do valor 6 na linha 6, coluna 2
9 fim.
Na linha 3, é criada um tipo de matriz de inteiros denominada “A” para serem inseridos valores inteiros, que na
primeira dimensão possui 5 posições, ou seja, possui 5 linhas, e na segunda dimensão, possui 6 posições, ou seja,
possui 6 colunas. Já na linha 5, é criada uma variável do tipo “A”, denominada “VALORES”, que vai armazenar os
valores inteiros que serão inseridos. Na linha 6, a instrução “VALORES [5,6] ß17” indica que na matriz
“VALORES”, na linha 5, coluna 6, será inserido o valor 17.
FIQUE ATENTO
Na programação, para criar e declarar o valor que uma matriz irá receber no programa, o
procedimento é praticamente o mesmo que o realizado para o vetor. A única diferença é que
você deverá informar ao programa que haverá uma segunda dimensão a ser utilizada.
•
•
•
•
•
•
•
- -4
Se pudéssemos visualizar na memória do computador como ficaria estruturada essa matriz com os valores
inseridos, teríamos algo bem semelhante à Figura 3 a seguir.
Figura 3 - Matriz VALORES com os valores inseridos.
Fonte: Elaborada pela autora, 2019.
No próximo tópico, veremos como manipular os dados em uma matriz, utilizando a instrução ,para..passo..faça
assim como as formas de percorrer uma matriz, seja por linha ou por coluna.
Preenchendo e manipulando os dados em uma 
matriz
Para inserir dados em um vetor, utilizamos um único laço de repetição, sendo que esse laço tem o papel de fazer
a variação do índice.
EXEMPLO
Se o exemplo apresentado tivesse sido desenvolvido na linguagem Java, por exemplo, a
declaração e preenchimento da matriz (aqui em Java, ) de uma linha e duas colunas seriaarray
organizada da seguinte forma:
int[ ] [ ] VALORES = {{1,2,3}, {4,5,6}};
- -5
Nesse caso, como estamos tratando de duas dimensões, precisaremos de dois laços de repetição, um dentro do
outro. No exemplo apresentado no código a seguir, vamos preencher uma matriz bidimensional com três linhas e
cinco colunas, em que “i” representa a marcação de linha e “j” da coluna da matriz:
1 Início
2 //definição do tipo construído matriz
3 A = matriz [1..3,1..5] tipo de inteiros;
4 // definição da variável composta do tipo matriz definido
5 mat;A:
6 i, j, //declaração das variáveis linha e colunainteiro:
7 x; // declaração da variável que vai ser lida pelo teclado
8 i 1 3 para de até faça
9 j 1 5 para de até faça
10 (“Digite o número da linha ”, i, “ e coluna: ”, j);escreva
11 (x[i, j]);leia
12 fimpara;
13 fimpara;
14 fim.
Observe que os valores assumidos pela variável “i” estão dentro do intervalo de 1 a 3, ou seja, exatamente o
número das linhas da matriz (linha 8). Por essa razão, a variável “i” é utilizada para indicar a primeira dimensão
dentro dos colchetes. Para cada valor assumido por “i”, a variável “j” assume os valores no intervalo de 1 a 5, ou
seja, exatamente o número das colunas. Portanto, a variável “j” é utilizada para indicar a segunda dimensão
dentro dos colchetes.
Agora, observe o Quadro 1 a seguir, que traz uma simulação de preenchimento da matriz:
FIQUE ATENTO
Como na estrutura multidimensional existem vários índices (um para cada dimensão), é
necessário criar, para cada um deles, um laço de repetição específico de acordo com o número
de posições que a estrutura terá (FORBELLONE, 2005).
SAIBA MAIS
Uma matriz que contém a mesma quantidade de linhas e colunas é chamada de matriz
quadrada, e é bastante interessante entender as operações com essas matrizes. Assim,
sugerimos a leitura do sexto capítulo da obra “Fundamentos da programação de
computadores” apresenta uma aplicação desse conceito na linguagem C/C++.
- -6
Quadro 1 - Simulação do preenchimento da matriz na memória.
Fonte: Elaborado pela autora, 2019.
Observe que o quadro representa uma simulação do preenchimento da matriz na memória, com a inserção dos
dados solicitados pelo algoritmo desenvolvido. Repare que já inserimos os valores como se o usuário os tivesse
digitado no teclado.
Fechamento
Neste texto-base, você teve a oportunidade de entender o que são matrizes, e porque são chamados de variáveis
compostas homogêneas unidimensionais. Você também pôde compreender que:
Nesta aula, você teve a oportunidade de:
• matrizes são estruturas compostas que armazenam várias variáveis do mesmo tipo;
• são unidimensionais, pois são estruturadas de forma única e sequencial na memória, tal qual uma tabela 
com linhas e colunas;
• que existem duas formas de preenchimento de uma matriz, seja diretamente no código, menos usual e 
com nenhuma interação com o usuário e outra com a leitura dos dados pela tela;
• que para que sejam lidos e exibidos os dados de um vetor deve ser utilizada a estrutura para..passo..faça.
•
•
•
•
- -7
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Vaneruchi de. Fundamentos da programação de
: algoritmos, PASCAL, C/C++ (padrão ANSI) e Java. computadores 3. ed. São Paulo: Prentice Hall, 2012.
FORBELLONE, André Luiz Villar. . Lógica de Programação 3. ed. São Paulo: Makron Books, 2005.
MANZANO, José; et al. lógica para desenvolvimento de programação de computadores. 26. ed. rev.Algoritmos:
São Paulo: Érica. 2012.
- -1
Pilha
Paulo Sérgio Custódio
Introdução
Nesta aula, estudaremos a estrutura de dados “pilha”. Você saberia dizer o que caracteriza uma pilha? Saiba,
desde já, que não podemos realizar a retirada de itens de uma pilha de modo arbitrário. Essa regra corresponde
ao que denominamos “disciplina da pilha”.
Você sabia que a memória RAM do computador é dividida em dois segmentos, a pilha e o ? A pilha seheap
encarrega de segmentar as chamadas de métodos, de modo que a execução dos programas seja mais rápida,
respeitando-se a disciplina da pilha. Por sua vez, no , os dados podem ser acessados a qualquer instante,heap
sem preocupação com a disciplina da remoção. É o que vamos conhecer em detalhes a seguir.
Acompanhe!
Definição de pilha
A pilha é uma estrutura de dados muito importante, e o modo como inserimos e removemos seus itens deve ser
levado em conta.
O que é uma pilha e sua disciplina
Primeiramente, é importante ter em mente que pilha é uma estrutura de dados com uma disciplina rígida de
inserção de itens e remoção, sendo que todo item que é inserido fica no topo da pilha. Mas preste atenção: ao
desejarmos remover um item da pilha, só podemos fazer isso com o item que está no topo. Em outras palavras,
se precisamos consultar ou remover um item que está três posições abaixo do topo, devemos remover dois itens
acima dele (CUSTÓDIO; FEITOSA, 2016).
Uma pilha se comporta exatamente como uma pilha de pratos, um posto sobre o outro, sendo que você só tem
acesso ao elemento do topo, naquele momento. Note que vetores são bem diferentes: podemos consultar um
elemento de um vetor em uma posição arbitrária, bastando para isso usar um índice da localização. Dessa forma,
dizemos que vetores são indexados, mas isso não vale para pilhas, devido à sua disciplina (CUSTÓDIO; FEITOSA,
2016).
Saiba que a disciplina de uma pilha leva o nome de “ ”, ou “o último a entrar é o primeiro aLIFO: Last In - First Out
sair”.
A organização da memória do computador
É essencial saber que os computadores usam diversos componentes eletrônicos anexados à placa mãe. Desses,
os mais importantes são: o processador (executa as instruções em linguagem de máquina); a memória principal
(é a memória RAM); e a memória secundária (ou disco rígido). Quando o processador realiza as operações que
Aula 10
- -2
(é a memória RAM); e a memória secundária (ou disco rígido). Quando o processador realiza as operações que
são atribuídas aos programas, ele deve buscar dados e instruções que ficam armazenados na memória principal.
Do ponto de vista físico, a memória principal é um conjunto de “caixinhas” (de 8 a 64 ) chamadas células. Abits
maioriados modelos envolve células de 8 , logo, se o computador roda um sistema de 64 , cada instruçãobits bits
vai ocupar 8 células de 8 (bits CUSTÓDIO; FEITOSA, 2016).
Cada célula possui um número binário (ou hexadecimal) que identifica o seu endereço, pois para o processador
localizar uma instrução, ele deverá saber exatamente onde ela se encontra. Para isso, o processador possui
algumas memórias internas, chamadas de registradores. Há um registrador encarregado de marcar o endereço
da próxima instrução a ser realizada. Do ponto de vista lógico, a memória principal é dividida em dois
segmentos: a pilha ( ) e o (stack heap CUSTÓDIO; FEITOSA, 2016).
A pilha se encarrega de guardar apontadores para os métodos do programa que está rodando, de modo que um
método não seja chamado a executar antes de outro método. Essa estrutura é muito antiga, própria dos
primeiros computadores, garantindo que o funcionamento seja muito eficiente.
Aplicações de pilhas
Agora, vamos apresentar aplicações envolvendo pilhas dentro da linguagem de programação C#.
Escrevendo pilhas na linguagem C#
Tenha em mente que, no ambiente Portugol Studio, a implementação das pilhas não é tão fácil. Uma opção é usar
a estrutura de dados registro, o que equivale a usar uma estrutura para simular outra (CUSTÓDIO; FEITOSA,
2016).
E a segunda opção? Bem, podemos utilizar uma linguagem de programação de produção como o Java ou o C#, as
quais contêm as pilhas de modo natural, cujos métodos de inserção e remoção já estão presentes.
Dessa forma, usaremos a (que é gratuita), na versão 5. Vamos também definir uma pilha naIDE Sharp Develop
linguagem C#. Além disso, a estrutura de blocos de sequência segue a mesma sintaxe que o Portugol. Baixe a IDE
, conforme ilustra a figura a seguir.Sharp Develop
SAIBA MAIS
Quer aprofundar conhecimentos sobre a organização da memória do computador e as pilhas
de chamada de método? Então, leia o segundo capítulo do livro “Iniciação à Programação de
Computadores”, de Custódio e Feitosa (2016), intitulado Como é organizada a memória do
.computador?
- -3
Figura 1 - Baixe a Sharp Develop e crie um projeto tipo “console”.
Fonte: Fonte: Elaborada pelo autor, 2019.
Note que a figura acima mostra duas regiões: à esquerda, vemos o painel de projetos, onde se encontram os
arquivos de sua solução, formatos etc. Podemos colocar pastas e salvar diversos tipos de arquivos, e eles estarão
à mostra nesse painel. Em seguida, no painel à direita, encontra-se um pequeno código em C#, cujo código se
encarrega de mostrar uma frase na tela ( ) quando o programa for compilado e executado.Hello World!
Comandos básicos da linguagem C#
Vamos apresentar um rápido resumo dos principais comandos e sua sintaxe usados na linguagem C#, e o seu
significado é indicado nos exemplos deste tema:
1) Escrever na tela: Console.Write(frase em aspas); ou
Console.WriteLine(frase em aspas); (WriteLine pula uma linha)
2) Todo comando deve terminar com ponto e vírgula, exemplo: Console.Write("paz")
3) Para ler entrada do teclado: Console.ReadLine( )
Mas para ler o que foi escrito no teclado e converter para inteiro, escreva: int.Parse(Console.ReadLine( ))
4) Para ler do teclado e converter para número real, escreva: float.Parse(Console.ReadLine( ))
5) Para ler do teclado e converter para número real de precisão dupla, escreva: double.Parse(Console.ReadLine(
))
6) Declarar uma variável do tipo inteiro: int nome; ou int nome = valor; (nesse caso, declara-se e atribui-se valor
na mesma linha).
7) Atribuir valor para a variável inteira que acabou de ser declarada, via teclado, escreva as duas linhas de
código:
int nomeVariável;
nomeVariável = int.Parse(Console.ReadLine( ))
8) Escrever uma frase e um valor de variável na tela:
Console.Write(" O valor de {0} = ", nomeVariável)
Ou então: Console.WriteLine("O valor de {0} = ", nomeVariável)
9) Segurar a tela da aplicação Console, para ela não encerrar sozinha: Console.ReadKey(true);
- -4
9) Segurar a tela da aplicação Console, para ela não encerrar sozinha: Console.ReadKey(true);
10) Comandos para Controle de fluxo, escreva:
if { } else{ } 
Laços de repetição:
do{ ......}while( ); no lugar de faça { } enquanto( );
for(int i =0 ; i < 20 ; i++ ){ .... } no lugar de para( )
foreach(var item in coleção) no lugar de para cada.
11) Inclusão de biblioteca, escreva:
using System.Collections; (exemplo, antes de todo o código e fora do escopo do namespace).
12) Tipos de variáveis: int, float, double, string, bool (inteiro, real, real de precisão dupla, cadeia de caracteres,
lógico, respectivamente).
13) Os operadores da linguagem são:
Para atribuição, use: =
Para a igualdade, use: ==
Para o ou, use: ||
Para o negativo lógico (Não), use: !
O operador de concatenação lógico E, use: &&
E, o operador de comparação diferente, use: !=
14) Operadores Matemáticos são: + (adição), - (subtração), * (multiplicação), / (divisão) e % (resto inteiro).
Preparando o ambiente
Bem, para começar a escrever o seu código e definir uma pilha, escreva na linha 3:
using System.Collections;
Esse segmento não estará lá quando você abrir a IDE pela primeira vez. Isso é necessário para podermos criar
estruturas de dados, entre as quais está a pilha. A coleção acima é grande e não se restringe a pilhas, mas se você
não colocar esse segmento de código, a criação da pilha levará a erro.
O método escreva( ) no Portugol tem a sintaxe ( ) ou ( ) em C#. Já o método leia(Console.Write Console.WriteLine
) no Portugol tem a sintaxe ( ) em C#. Dessa forma, a tradução do Portugol para a linguagem C#Console.Readline
é bastante simples.
Como construir uma pilha?
Primeiramente, empilhando e desempilhando itens nela. Preste atenção no passo a passo a seguir:
Para criar uma pilha, usamos a sintaxe:
var nomePilha = new Stack( );
Para inserir um elemento na pilha, escrevemos:
nomePilha.Push(valor);
Para remover um item do topo da pilha, usamos:
nomePilha.Pop( );
Para mostrar um valor do topo da pilha sem removê-lo, usamos:
nomePilha.Peek( );
Finalmente, o tamanho atual da pilha é:
nomePilha.Count;
em que “nomePilha” é o nome que você escolheu para a pilha, evidentemente.
- -5
Algoritmo em C# para converter um número da base 10 na 
base 2
Vamos a um exemplo de aplicação, escrevendo um pequeno programa que converte um número escrito na base
10, na base binária. Todo número escrito na base 2 é uma sequência de 0s e 1s. Por exemplo: o número 9 (da
base 10), escrito na base binária é: 1001. O primeiro dígito à direita significa: , o segundo dígito à1*2^{0} = 1
esquerda dele é: , o terceiro dígito é: , e, finalmente, o último dígito é: .0*2^{1} = 0 0*2^{2} = 0 1*2^{3} = 8
Somando tudo, temos: , como deve ser.1 + 0 + 0 + 8 = 9
As primeiras 19 linhas do código estão representadas na figura abaixo. Confira!
FIQUE ATENTO
As bases 2, 8 e 16 são muito usadas na programação de baixo nível, pois a microarquitetura da
máquina precisa desses tipos de representação. O código acima é muito importante para você
converter números da base 10 para a base 2, e ela se baseia inteiramente no operador
matemático resto e na disciplina da pilha.
- -6
Figura 2 - Criação das variáveis.
Fonte: Fonte: Elaborada pelo autor, 2019.
Note que é o número decimal que deverá ser convertido para binário. Ao passo que var numero = 0 Console.
("Digite inteiro positivo: ") solicita que o usuário digite um inteiro para ser convertido.Write
O trecho é o comando de leitura do teclado. O usuário digita numero = int.Parse(Console.ReadLine( )) (ReadLine(
 um número, ele é convertido para inteiro ( ) e é atribuído à variável número, que agora passa a ter o)) int.Parse
valor correto. Veja que as demais linhas indicam as variáveis que vamos precisar: a base binária é sempre 2:
.baseBin
O processo de se converter um número decimal para binário se baseia na seguinte divisão: divide-se o número
por dois, obtendo o quociente. O resto da divisão inteira entre ele e dois é obtido da operação: dividendo %
. O operador % calcula o resto inteiro da divisão de um número por outro, como temos:baseBin dividendo %
, esta operação devolve ou “0” ou o número “1”. São os zeros e uns que precisamos para representá-lo embaseBin
binário.
Em seguida, é apresentada a outra parte do código, na Figura 3
- -7
Figura 3 - Finalizando o algoritmo.
Fonte: Elaborada pelo autor, 2019.
Observe que nas linhas 22, 24 e 26 as divisões sucessivas por dois, e acumulando os restos emsão realizadas
uma pilha, usando (inserir). Em seguida, o novo dividendo passa a ser o quociente da operação anterior,Push( )
por isso, usamos: dividendo = quociente. O trecho acumula os 0se 1sde querestos.Push(dividendo % baseBin)
precisamos na pilha. As linhas 33 a 37 se encarregam de desempilhar os elementos da pilha, ou seja, remove um
item e escrevem na tela, e depois vão para o próximo. A pilha vai encolhendo até que a condição “restos.Count”
seja igual a zero. Nesse momento, o laço que é o mesmo que o laço “faca ...enquanto”, encerra-se.do{ }while( );
FIQUE ATENTO
A pilha em C# está implementada de modo natural e contém métodos prontos para uso, tais
como Pop( ), Push( ), Count e Peek. Use esses métodos que já estão disponíveis na biblioteca,
pois isso fará com que você economize tempo. Além do mais, esses métodos são otimizados.
- -8
Experimente alterar o código acima e usar outras bases, trocando baseBin por outra constante < 10. O que você
faria para transformar o código acima e converter um número na sua representação hexadecimal? (base 16).
Observe que o laço entre as linhas 20 a 28 segue a mesma estrutura de repetição com teste nodo{ }while( );
final (FORBELLONE, 2005).
EXEMPLO
O exemplo que vamos aprender é a modificação que você deve introduzir no código acima para
que ele calcule a representação de qualquer número decimal, nas bases de 2 a 9. Mas atenção:
não há tratamento de erro e nem condicional, caso o usuário digite uma base fora desse
intervalo, você terá que corrigir essas pendências, melhorando o código.
- -9
Figura 4 - Código para converter inteiro em outras bases,
Fonte: Elaborada pelo autor, 2019.
O uso da palavra reservada var no código acima é uma prática recomendada, devido à diversidade de tipos na
linguagem. Não se esqueça de encerrar o código com Console.ReadKey(true); pois ele garante que a tela de
execução ficará parada, isto é, ela apresenta os resultados e não se encerra de modo automático. Lembre-se que
o tipo de aplicação é Console (tela escura tipo DOS). Finalmente, a tarefa mais relevante desse código é o
empilhamento dos restos (uns e zeros) que ocorrem nas divisões sucessivas por dois ao usarmos restos.Push
(...);.
Fechamento
Nesta texto-base, você teve a oportunidade de conhecer a estrutura de dados pilha e entender que ela é uma
estrutura de dados natural para estabelecer a ordem de execução dos métodos, mas pode ser usada também em
programas de mais alto nível. Você também aprendeu que a pilha não pode ser indexada como um vetor, pois
podemos remover ou inserir itens apenas no seu topo. Por fim, viu que em C# usamos ( ) para remover ePop
retornar, ( ) para inserir, ( ) para mostrar o elemento no topo, sem remover, e o parâmetro paraPush Peek Count
- -10
podemos remover ou inserir itens apenas no seu topo. Por fim, viu que em C# usamos ( ) para remover ePop
retornar, ( ) para inserir, ( ) para mostrar o elemento no topo, sem remover, e o parâmetro paraPush Peek Count
contar o tamanho atual da pilha (MARTIN; MARTIN, 2011; CUSTÓDIO; FEITOSA, 2012).
Referências
ASCENCIO, A. F. G.; CAMPOS, E. A. V.. algoritmos, Pascal, CFundamentos da Programação de Computadores: 
/C+ (Padrão ANSI) e Java. 3. ed. São Paulo: Prentice Hall, 2012.
C USTÓDIO, P. S.; FEITOSA, M. P. Iniciação à Programação de Computadores: uma abordagem baseada em
exemplos. Rio de Janeiro: Ciência Moderna, 2016.
FORBELLONE, A. L. V. : a construção de algoritmos e estruturas de dados. 3. ed. SãoLógica de programação
Paulo: Prentice Hall, 2005.
MARTIN, R. C.; MARTIN, M. São Paulo: Bookman, 2011.Princípios, Padrões e Práticas Ágeis em C#.
TANEMBAUM, A. S. . Organização estruturada de computadores 5. ed. São Paulo: Pearson Prentice Hall, 2007.
- -1
Fila
Paulo Sérgio Custódio
Introdução
Você conhecerá outra estrutura de dados: a fila. A disciplina da fila é o inverso da disciplina da pilha: podemos
remover ou inserir elementos no começo da fila. Ou seja, se você tiver uma fila com cinco elementos, poderá
remover o primeiro que entrou, e não o último, como ocorria na pilha. Porém, de modo semelhante à pilha, há
métodos prontos para inserção, remoção e consulta de itens em um fila. E você sabia que a escolha de uma
estrutura de dados acaba impactando com muita intensidade no tempo de execução de um programa? Isto
ocorre porque os tempos de acesso aos itens dependem fortemente do tipo de estrutura de dados que você
escolheu.
Vamos começar?!
Ao final desta aula, você será capaz de:
• Aprender sobre definição de fila e disciplina de uma fila.
Definição de fila
Para começar, vamos ao conceito de fila, que é uma estrutura de dados definida pelas seguintes ações de
inserção: inserem-se itens na fila e a sua remoção ocorre de modo que o elemento a ser removido é o primeiro
que nela entrou. Ou seja, a disciplina da fila é FIFO: , o primeiro a entrar é o primeiro que podeFirst In - First Out
sair. Novamente, uma vez que a implementação de fila em Portugol é muito ruim, pois exige o uso de mais
estruturas de dados (registros), vamos definir filas usando diretamente linguagem de programação destinada à
produção. Veja mais sobre classes de coleções incluindo filas em Carvalho (2011).
Usemos o , versão 5 e a linguagem de programação C#. A escolha desta linguagem não nosSharp Develop
restringe, pois estruturas muito semelhantes existem também em Java.
•
FIQUE ATENTO
Observe que muitas estruturas de dados mais avançadas usam estruturas de dados
elementares, tais como vetores, pilhas e filas. Estas podem ser usadas para definir estruturas
mais complexas como árvores e grafos.
Aula 10
- -2
Aplicações de filas
Neste segmento vamos estudar alguns exemplos e aplicações de filas, os quais exigem este tipo de disciplina de
inserção-remoção. Vamos lá?!
Usos de uma fila
Tenha em mente que a estrutura de dados fila é criada para modelar filas, por exemplo, uma fila de espera para a
impressão de um documento, filas de espera para processar um recurso comum e outras. Os recursos
necessários para lidarmos com listas se encontram na biblioteca e eles visam facilitar oSystem.Collections 
desenvolvimento de , oferecendo métodos úteis para a manutenção de pilhas, filas (neste tema), listassoftware
ordenadas e tabelas de .Hash
Implementação de um programa com fila
Você lembra que a classe que implementava uma pilha era a classe ? Agora, para uma fila, usamos a classe Stack
 (em C#).Queue
Para criarmos uma fila, escrevemos em C#:
var fila = new Queue( );
A palavra é uma palavra reservada que tem por objetivo criar uma área no , para a fila e um apontadornew heap
para ela na pilha de chamada de métodos.
Operações básicas em uma fila
A vantagem em se utilizar uma fila usando é que nós iremos ter acesso imediato avar fila = new Queue( );
métodos e parâmetros da biblioteca , em particular referentes à coleção .Collections Queue
Saiba que os principais métodos usados em uma fila são:
Enqueue( ) para inserir um elemento no fim da fila.
Dequeue( ) recupera e remove um elemento do começo da fila.
Peek( ) retorna um elemento do começo da fila, mas sem removê-lo.
Clear( ) remove todos os elementos de uma fila (também há este método para pilhas).
Contains( ) verifica se um elemento pertence à fila.
E, ainda, count é um parâmetro que retorna a quantidade de elementos presentes na fila: sintaxe: nomedaFila.
, sem parênteses, pois não é um método (Carvalho, 2011). Em sua obra, a autora apresenta exemplos deCount
listas e suas utilizações que permitem melhor compreensão.
Copiando um vetor em uma fila
Você sabe como podemos copiar os elementos de um vetor em uma fila? Vamos supor que você tem um vetor de 
que armazena ositens de material escolar. Você pode colocá-los em uma fila para ir comprando os itensstrings 
de acordo com a disciplina dela. O código abaixo permite que você os copie para uma fila:
Código:
string[ ] vetorMaterialEscolar = {"caderno","lápis","apontador"}; var fila = Queue(vetorMaterialEscolar); new
(var item fila) { Console. ("\n {0}", item); }foreach in WriteLine
Vamos à explicação:
- -3
Vamos à explicação:
1) Na primeira linha declaramos um vetor contendo três itens de material escolar, um caderno, um lápis e um
apontador. A versão mais prática seria preencher o vetor usando-se um laço.
2) Note que cada elemento do vetor está em aspas, pois é um vetor de (cadeias de caracteres).strings
3) Na outra linha criamos uma fila e dentro do parênteses inserimos o vetor que foi criado na linha anterior. Com
isso, todos os elementos do vetor serão copiados nessa fila.
4) Finalmente, há um laço do tipo (para cada) que varre os elementos da fila, de acordo com a disciplinaforeach 
de inserção de elementos: o primeiro elemento que foi inserido, a partir do vetor, foi o caderno, logo, ele é o
primeiro a ser escrito. Em seguida, aparecem lápis e caderno, nesta ordem, obedecendo a disciplina da fila.
Criando uma fila e apresentando os seus elementos de 
acordo com sua disciplina (FIFO)
Para você ter uma noção exata de como itens são inseridos em uma fila e como eles são apresentados na mesma
ordem em que entraram (FIFO), vamos escrever um pequeno algoritmo que cria uma fila, pede ao usuário a
determinação de quantos elementos deseja colocar nela e em seguida os apresenta, na ordem em que foram
digitados. Lembre-se de que na obra de Carvalho (2011) podemos encontrar exemplos de listas e seus usos.
Vamos nos ater a uma fila de números inteiros, apenas para apresentar a ideia, mas os elementos de uma fila
podem ser também, conforme Figura 1.strings 
Figura 1 - Criando uma fila para guardar alguns itens.
Fonte: Elaborada pelo autor, baseado na Sharp Develop, 2019.
Explicação:
1) Na linha 2, escrevemos ; para termos acesso às estruturas de dados que estãousing System.Collections
contidas na biblioteca .Collections
2) Na linha 11, cria uma fila, e o seu nome é fila. A palavra reservada indica que évar fila = new Queue( ); var
uma variável (no processo de compilação, o compilador irá ajustar o tipo adequado e espaço em memória para
esta variável, e a palavra reservada é obrigatória aqui).new
3) Na linha 14, determinamos previamente o tamanho desta fila, digitando um tamanho para ela (mas lembre-se
- -4
3) Na linha 14, determinamos previamente o tamanho desta fila, digitando um tamanho para ela (mas lembre-se
de que poderemos incluir mais elementos além do tamanho que foi especificado ou remover alguns deles).
Agora, vamos dar prosseguimento às outras linhas do código. Acompanhe na Figura 2.
Figura 2 - Continuação do código.
Fonte: Elaborada pelo autor, baseado na Sharp Develop, 2019.
Explicação:
4) As linhas 16 a 22 determinam um laço de repetição, do tipo faça ...enquanto, mas em C# isto deve ser escrito
como: (enquanto a condição for verdadeira, o código dentro das linhas de 18 a 20do{ ..... }while( ); : tamanho > 0
será repetido, até que tamanho = 0 e o laço encerra).
5) Na linha 19, usamos o comando para enfileirar, ou seja, para armazenar um item na fila. Veja que istoEnqueue
é feito mediante digitação no teclado: note que é usado , que faz a leitura do que é digitado.Console.ReadLine( )
Em seguida, a operação converte para inteiro o que foi digitado. Finalmente, armazenaint.Parse fila.Enqueue
este inteiro na fila, obedecendo à disciplina FIFO.
Um contador, do tamanho atual da fila, é decrementado, pois quando o tamanho deste contador for 0, teremos
inserida a quantidade correta de itens na fila, que foi solicitada na linha 14.
6) Agora, um novo laço de repetição vai apresentando na tela os elementos da fila, usando a operação .Dequeue
Quando o compilador lê a instrução , ele devolve o item da posição da fila e o remove. Deste modo, ofila.Dequeue
tamanho da fila vai diminuindo. Em um dado momento, a fila terá tamanho zero, pois , desta forma,fila.Count = 0
o laço será encerrado. Por isto, a repetição do laço ocorre enquanto , dentro do while.fila.Count> 0
- -5
Vamos executar o programa? A Figura 3, a seguir, mostra um da sua execução, quando foramprintscreen
inseridos quatro números inteiros. Em seguida, a fila é apresentada na ordem correta:
Figura 3 - Execução do programa.
Fonte: Elaborada pelo autor, baseado na Sharp Develop, 2019.
Finalmente, vamos colocar mais alguns recursos e métodos no programa acima. Considere adicionar as seguintes
linhas, após a linha 30:
FIQUE ATENTO
Não esqueça de que apesar de termos determinado o código acima com uma fila de tamanho
fixo, nada impede de irmos acrescentando mais itens à fila, enquanto ela existir, pois o
tamanho de uma fila não é fixado, como ocorre com vetores e matrizes.
- -6
Figura 4 - Código adicional após a linha 30 da Figura 3.
Fonte: Elaborado pelo autor, baseado na Sharp Develop, 2019.
Vamos à explicação:
1) As linhas de código 32 a 33 solicitam a digitação de um número via o teclado. Este número é digitado e
convertido para um inteiro e armazenado na variável palpite.
2) irá testar se o número que está na variável palpite está contido na fila. Se este for o caso, fila.Contains(palpite)
 irá retornar e a frase da linha 37 é executada. A frase contida na linha 41 não será executadafila.Contains true
(neste caso). Se o número digitado não pertencer à fila, a frase contida na linha 41 é que será executada e a linha
37 não o será.
- -7
3) Note que o exemplo acima é didático, usando números. Tudo isto funciona adequadamente para uma lista de
itens cadastrados de qualquer natureza: nomes de funcionários, itens de qualquer natureza.
4) Finalmente, o último laço vai removendo os itens da lista ( ) até que a contagem de elementos se torneDequeue
0, e o laço se encerra.
Fechamento
Neste texto-base, você teve oportunidade de conhecer outra estrutura de dados, a fila. A fila obedece a uma
disciplina específica: os itens vão sendo enfileirados e removidos de modo que os primeiros inseridos são
aqueles que aparecem, ou seja, na mesma ordem em que entraram. Por fim, lembre-se de que uma pilha é
consultada na ordem inversa na qual foram inseridos os seus elementos.
Referências
CARVALHO, Adelaide. Programação orientada por objetos. Lisboa: editora FCA, 2011.Práticas de C#. 
EXEMPLO
Um programador deseja construir uma aplicação de consulta a bancos de dados, considerando
a ordem de pedido dos clientes de uma loja, tendo sido visitada em um site ( ).e-commerce
Como implementamos a política correta dos pedidos a este site? Neste caso, os pedidos de um
item devem obedecer à política FIFO, pois os primeiros pedidos de um item devem ser os
primeiros a ser atendidos, até que o estoque daquele item se encerre.
SAIBA MAIS
Quer aprofundar conhecimentos sobre estruturas de dados em C#? Então não deixe de ler 
, de Adelaide Carvalho (2011). As sugestõesPráticas de C#, programação orientada por objetos
são os capítulos: Enumerações e Estruturas (página 160) e Classes de Coleções (capítulo 5,
páginas 173 a 205). 
- -1
Organizando dados em Listas
Paulo Sérgio Custódio
Introdução
Nesta texto-base, vamos estudar a estrutura de dados conhecida como“ ”. Saiba, desde já, que uma lista emlista
programação é semelhante a uma lista comum, na qual os itens podem ser colocados e removidos em posições
intermediárias.
Você sabia que as listas, pilhas e filas possuem tempos de acesso conhecidos, junto à memória principal? Vamos
debater esse detalhe ao longo deste material.
Ao final desta aula, você será capaz de:
• Implementar um algoritmo que usa naturalmente o fato de que a disciplina de inserção e remoção deve 
seguir a de uma pilha.
• Compreender o conceito de lista;
Definição de lista
Uma lista é uma coleção linear de itens de qualquer tipo, sem tamanho pré-definido, indexável, e cujos itens são
inseridos de modo sequencial (FORBELLONE;EBERSPÄCHER, 2005).
Introdução às listas
Uma lista é uma estrutura de dados capaz de armazenar muitos itens, de modo semelhante a um vetor, mas cuja
capacidade ou tamanho não precisa ser pré-determinada. Os elementos de uma lista podem ser acessados à
vontade. Dessa forma, podemos dizer que uma lista, assim como um vetor, é indexada.
Vamos abordar como as listas são implementadas em uma linguagem de programação profissional, o C#. Além
disso, essa linguagem providencia vários métodos naturais para a inserção de itens na lista e uma série de outras
operações determinadas e que não precisam ser elaboradas na programação.
Vamos começar abrindo a IDE Sharp Develop. Para criarmos uma lista em C#, precisamos do espaço de nomes
(que é uma espécie de biblioteca) “System.Collections.Generic”. Escreva logo após “ ”: : using System
using System; System.Collections.Generic;using 
Veja, na Figura 1, como criamos uma lista destinada a armazenar inteiros.
•
•
Aula 11
- -2
Figura 1 - Criando uma lista para armazenar números inteiros.
Fonte: Elaborada pelo autor, 2019.
Para criarmos uma lista de inteiros, procedemos do seguinte modo:
1.Incluímos o namespace na linha 10.System.Collections.Generic
2.Dentro de , podemos criar a nossa lista:main
2.1) use a palavra reservada (para variável);var 
2.2) escolha um nome para a sua lista, nesse caso, ;lista
2.3) usamos a palavra reservada “new” para alocar um endereço para ela;
2.4) finalmente escrevemos: .List<int>( );
Entendemos assim:
List determina o tipo de estrutura, que é uma lista,
<int> determina que cada elemento da lista é um número inteiro, e os parênteses denotam o construtor da
classe List, logo, deve-se terminar com parênteses.
Finalmente, acrescentamos um elemento nessa lista:
lista.Add(89);
Ou seja, o número 89 foi inserido nessa lista, sendo seu primeiro elemento.
- -3
Além do método “Add” adicionar um elemento diretamente na lista, ele ainda pode aceitar como parâmetro
outro método, desde que este método tenha valor de retorno compatível com a lista usada. ,Na Figura 2
colocamos o fragmento de código de uma lista que recebe números primos que foram gerados pelo método
Primo(int num). Os números primos são usados na criptografia e segurança de dados na Internet, por isso, o
exemplo é importante. Analise o código descrito na Figura 2:
Figura 2 - O método Add adiciona um elemento à lista.
Fonte: Elaborada pelos autores, 2019.
Podemos adicionar itens na lista,permitindo que “Add” chame um método que foi implementado pelo
programador, como visto .na Figura 3 
SAIBA MAIS
Quer aprofundar seus conhecimentos sobre as estruturas de dados lineares? Consulte o
capítulo 16 do livro de Svetlin Nakov Fundamentals of Computer Programmingwith C ,# et al.,
em que os autores abordam diversos tipos de estruturas de dados lineares e montam as
implementações dos métodos de busca e inserção.
- -4
Figura 3 - Implementação do método Primo.
Fonte: Fonte: Elaborada pelo autor, 2019.
Já na Figura 3, acima, você pode notar a implementação do método que retorna um primo ou retorna -1.
Vamos criar uma lista com alguns elementos, mas dessa vez será uma lista de compras, isto é, os elementos serão
“ ” (cadeias de caracteres, em Portugol). Strings, tenha em mente, são sequências de caracteres. O objetivostrings
é que você vá acrescentando itens na lista de compras até que uma sinalização de encerramento seja disparada.
O programa deve mostrar a lista e quantos elementos existem nela. Vamos lá?
O seguinte código, escrito no IDESharp Develop, resolve o nosso problema. Observe!
1) using System; System.Collections.Generic; Lista2 4) { 5) class Program 6) { 7) 2) using 3) namespace public
static void (string[] args) 8) {Main
9)Console.Title = "Lista de Compras";
10)var listaCompras = List<string>();new
11) char confirma;
12) do 13) { 14) Console. ("Digite item da lista de compras: "); 15) listaCompras. (Console. (Write Add ReadLine
)); 16) Console. ( ); 17) Console. ("\n Deseja acrescentar mais um? Press y ou Y: "); 18) confirma = Clear Write
. (Console. ()); 19) Console. (); 21) } (confirma == 'y' || confirma == 'Y');char Parse ReadLine Clear while
22) Console. ("Lista de Compras de hoje: \n"); 23) (var item listaCompras) { 25) Console.WriteLine foreach in 
(item, "\n"); } 26) Console. ("\n a lista contém {0} itens. WriteLine Write ", listaCompras.Count);
27) Console. ("\n Press any key to continue . . . Write "); 28) Console. ( );ReadKey true
30) }}}
Agora, vamos explicar o código:
- -5
Agora, vamos explicar o código:
1. Incluímos a diretiva System.Collections.Generic, sem a qual não podemos criar uma lista.
2. Dentro do método main( ) nós escrevemos:
2.1) var listaCompras = List<string>();new
char confirma;
Atenção: o objetivo dessas linhas é “var listaCompras” criar uma lista. Sabemos disso porque,em seguida,
aparece a especificação List<string>, e é uma lista cujos elementos são strings. A variável confirma é um
caractere, que irá servir para dar prosseguimento ou não na digitação dos elementos.
2.2) Em seguida, aparece o laço de repetição que é exatamente o mesmo que o laço “do{ ... }while( ); faca{ ... }
” no Portugol, apenas trocamos “faca” por “ ” e “enquanto” por “ ”.enquanto( ) do while
Dentro do laço ,entre as linhas de 12 a21, temos o seguinte:do{ .... }while( )
1. Aparece uma frase pedindo a digitação de um item.
2. faz a leitura do teclado, isso é, o que você digitar será adicionado, mas note que Console.ReadLine( ) Console.
 está dentro do método Add.ReadLine( )
3. limpa a tela.Console.Clear( )
4. Em seguida, aparece uma mensagem de confirmação. Se nesse momento você pressionar a tecla “y” e depois
“ENTER”, a variável “confirma” receberá “y” (ou Y), e o teste condicional: (confirma == 'y' || confirma ==while
'Y'); será verdadeiro, o que fará com que o fluxo de execução suba novamente até o começo do laço“ ”,do
repetindo-se a execução.
5. No momento em que você pressionar outra tecla, diferente de “y”, a lista será encerrada (isso não impede que
você acrescente outros itens depois).
6. Finalmente, aparece um laço de repetição para mostrar todos os itens da lista, entre as linhas de 22 a 25, em
que se usa o método Write para escrever cada item.
6.1) “ ” é o mesmo que “para cada”. Ele é o tipo ideal de laço para varrer os itens de uma estrutura cujoforeach
tamanho (número de itens) não pode ser determinado a priori.
Finalmente,Console. ("\n a lista contém {0} itens. ", listaCompras.Count); mostra na tela o número de itensWrite
da lista. Veja, 4, abaixo, a execução.na Figura 
Figura 4 - Programa em execução, inserindo cinco itens.
Fonte: Elaborada pelo autor, 2019.
O exemplo trouxe a construção de uma lista de itens. Observe que a classe “List” possui os métodos que você
- -6
O exemplo trouxe a construção de uma lista de itens. Observe que a classe “List” possui os métodos que você
precisa para inserir e remover itens na lista, além de outras propriedades e métodos.
Aplicação de listas
Uma estrutura de dados tipo lista refere-se a toda estrutura que deverá armazenar itens de modo sequencial. Se
sua aplicação se preocupa em armazenar itens de modo sequencial, isto é, linear, logo uma lista pode ser uma
boa opção.
Uma lista vai acrescentando itens de modo semelhante a uma pilha, pois o mais recente item adicionado é o
último, mas, diferente da pilha, podemos remover itens a partir do começo ou do fim. 
Tipos de listas
Há dois tipos de listas: a ( ) e a (também conhecida como “lista ligada”).lista estática static list lista dinâmica
• Lista estática: ela é um tipo de vetor ( ), com a diferença de que não há um número pré-array
determinado de elementos. Podemos ir acrescentando mais elementos. A segunda característica em 
comum com um vetor é que os elementos de uma lista estática possuem índices, para indicar a sua 
posição.
• Lista dinâmica: é uma lista na qual os ponteiros que apontam para a posição do próximo elemento, por 
isso elas também são conhecidas como “listas ligadas”.
Para que servem e quando posso usá-las?
Adeve ser usada se você não espera inserção ou remoção frequente de itens. Se você precisa delista estática
uma estrutura para adicionar itens ao final da lista e acessá-los por índice, a escolha de uma lista é muito
adequada. Isso se deve às seguintes propriedades da lista estática:
a é muito rápida;busca por índice
a (valor) é um processo lento;busca por elemento
 é um processo lento;inserir e remover elementos
a de um novo elemento é um processo rápido.adição
•
•
FIQUE ATENTO
A lista estática tem uma série de desvantagens: as operações para inserção e remoção de itens
dentro da estrutura exigem rearranjo dos elementos, levando à baixa performance. A lista
ligada resolve esse problema, pois cada item guarda memória sobre o próximo.
- -7
A é preferível quando você tem que ou elementos em ambas as suaslista ligada adicionar remover 
extremidades e quando o acesso aos elementos é uma consequência. Se você tiver que acessar frequentemente e
por índice, no entanto, a (List<T>) é preferível.lista estática
Reflita: em C#, quem são as listas estática e ligada? Em C#, para criarmos uma lista estática, usamos:
var listaCompras = List<string>( );new
Para criar uma lista ligada, usamos:
var lista3 = LinkedList<stringnew >( ); var: indica variável, lista3 é o nome escolhido da lista ligada;Explicação: 
new é o comando necessário para criar uma referência da lista em memória; LinkedList é a coleção a qual ela
pertence; <string> indicará que é uma lista de cadeias de caracteres.
A estrutura de dados “lista” é muito simples de ser usada, e a maioria das linguagens de programação possui
uma sintaxe muito semelhante a que usamos nesta aula (tendo o C# como linguagem escolhida). A biblioteca
Collections em C# possui tudo o que você precisa para construir a sua lista de itens e acrescentá-la ao seu código.
Tenha em mente que a indexação de itens de uma lista segue a mesma sintaxe usada em um vetor: lista[i], tendo
colchetes no lugar de parênteses e “i” sendo um número inteiro.
FIQUE ATENTO
Note que estamos falando aqui de frações muito pequenas de segundo. Imagine que você tenha
que usar listas em um processo automatizado e de uso constante ao longo de um mês, em um
servidor Web. As perdas de eficiência poderiam ser notáveis.
EXEMPLO
O exemplo abaixo é uma lista que acumula uma série de números primos dentro de um
intervalo especificado:
1) using System.Collections.Generic; Lista.Primos 3) { 4) class Program 5) { 6) 2) namespace 
static void (string[] args) 7) { 8) var lista = List< >(); 9) num = 2; 10) public Main new int int do
11) { 12) ( (num)!=-1) 13) { 14) lista. ( (num)); 15) } 16) num=num+1; 17) }if Primo Add Primo
(num <80); 18) 19) ( k=0;k<lista.Count;k++) 20) { 21) Console. ("\nwhile for int WriteLine
{0}", lista[k]); 22) } 23) 24) Console. ( ); 25) } 26) 27) static (ReadKey true private int Primo int
n) 28) { 29) conta =0; 30) ( k= 1;k<=n;k++) 31) { 32) (n % k == 0) 33) {int for int if
conta=conta+1; } 34) } 35) 36) (conta==2) 37) {return n;} 38) 39) {return -1;} 40) 41) }if else
42) } 43)}
- -8
Fechamento
Neste texto, você teve a oportunidade de conhecer as listas, como e quando elas devem ser usadas, e a sua
implementação em uma linguagem de programação bastante comum. A linguagem Java e outras linguagens
também possuem estruturas de dados listas. Você viu também que há dois tipos de listas, a estática e a dinâmica,
além do método para adicionar elementos na lista “Add( )”, com o qual você escreverá “lista.Add(item a ser
adicionado);”, cuja flexibilidade é muito importante.
Referências
FORBELLONE, André Luiz Villar; EBERSPÄCHER, Henri Frederico. : a construção deLógica de programação
algoritmos e estruturas de dados. 3. ed. São Paulo: Pearson Prentice Hall, 2005.
- -1
Lista circular e duplamente 
encadeada
Paulo Sérgio Custódio
Introdução
Neste texto-base, você terá contato com uma estrutura amplamente usada na organização de dados que apontam
na direção de outros dados, ou seja, quando existe um vínculo entre eles. Essa estrutura é a , quelista ligada
pode ser usada na construção de outras estruturas dela derivadas, tais como grafos, árvores de busca etc. A
vantagem dessas estruturas é que temos a garantia da alocação dinâmica da memória: ela é garantida conforme
nós acrescentamos mais elementos, pois se forem removidos alguns, toda a estrutura ocupará menos memória
do computador.
Você sabia que a escolha de uma estrutura de dados acaba impactando fortemente no tempo de execução de um
programa? Isso ocorre porque o tempo de acesso aos itens depende do tipo de estrutura de dados que você
escolheu.
Ao final desta aula, você será capaz de:
• Reconhecer os diversos tipos de listas;
• Elaborar aplicações.
Os diversos tipos de listas
As listas ligadas são estruturas de dados semelhantes às listas estáticas, mas, nelas, cada elemento aponta para o
próximo. De acordo com Custódio e Feitosa (2016, p. 345-347):
[...] uma lista duplamente ligada é uma estrutura de dados na qual um elemento está amarrado,
digamos assim, ao elemento que o precede e ao elemento que o sucede. Uma lista simplesmente
ligada é uma lista de itens para os quais cada elemento é ligado ao seguinte. Adicionar um elemento é
uma operação onerosa, pois precisamos alocar mais memória. A busca é uma operação lenta, pois
deve-se atravessar toda a estrutura de dados a partir do primeiro elemento. O acesso também é
lento, pois uma lista ligada (simples ou dupla) não é indexada e devemos percorrer todos os seus
elementos, até o elemento-chave.
Tenha em mente que há dois tipos de listas: e . A lista estática é uma coleção delistas estáticas listas dinâmicas
itens com dados, nos quais não há uma ligação direta entre os itens, ou seja, existe apenas uma inserção
sequenciada deles, um atrás do outro.
A lista dinâmica, ou ligada, por sua vez, é composta de uma coleção, em que cada elemento possui um ponteiro
que aponta para o próximo elemento da lista. Esse ponteiro é chamado de“ ”. O início da lista ligada chama-senó
“cabeça da lista”, sendo que toda busca parte da cabeça.
Em C#, a lista estática é implementada pela classe “List<T>”, e a lista ligada é implementada pela classe
•
•
Aula 11
- -2
Em C#, a lista estática é implementada pela classe “List<T>”, e a lista ligada é implementada pela classe
“LinkedList<T>”. A lista ligada se subdivide em dois tipos: e .lista ligada simples lista duplamente ligada
Vamos compreender melhor cada uma delas!
A lista simplesmente ligada possui um nó (apontador) para o próximo elemento da lista. Assim, cada elemento
possui um valor guardado e um nó que aponta para o próximo elemento. Como a lista é simples, por outro lado,
há apenas um nó para cada elemento. Conforme ilustra a Figura 1:
Figura 1 - Um nó apontando para o próximo elemento.
Fonte: Fonte: Deitel ( 2011, p. 456).
A lista duplamente ligada é a implementação mais natural dentro da classe LinkedList<T> no C#.A coleção
LinkedList<T> armazena elementos como uma lista duplamente ligada. Os valores são armazenados em nós,
sendo quecada nó tem um (ponteiro) para o próximo nó e para o anterior. Observe na link Figura 2, a seguir.
Figura 2 - Representação gráfica de uma lista ligada simples.
Fonte: Deitel (2011, p. 458).
Os nós são elementos da classe LinkedListNode<T>, ou seja, quando estamos lidando com uma lista ligada,
estamos trabalhando com duas classes: “LinkedList<T>” e “LinkedListNode<T>”, em que T é o tipo.
Podemos ter listas ligadas armazenando cadeias de caracteres, números inteiros ou reais etc., e, além disso,
FIQUE ATENTO
A inserção de elementos em uma lista ligada é uma operação computacional que pode ser
dispendiosa. Evidentemente, devemos partir sempre do início da lista, pois os apontadores só
podem começar a partir desse ponto. Tanto a busca quanto a remoção serão igualmente
dispendiosas devido a esse mesmo fato. No entanto, os benefícios de memória e flexibilidade a
tornam muito útil em uma série de aplicações.
- -3
Podemos ter listas ligadas armazenando cadeias de caracteres, númerosinteiros ou reais etc., e, além disso,
podemos ter listas ligadas em que os nós são objetos de outras classes. Essa é uma estrutura de dados muito
flexível!
Mais exemplos e métodos da classe lista ligada
Os principais métodos da classe estão listados no quadro abaixo. Confira!LinkedList 
Quadro 1 - Principais métodos da lista ligada em C#
Fonte: Elaborado pelo autor, 2019.
Os métodos acima sempre seguem a regra sintática: lista.Método( );. Ou seja, se você criou uma lista de nome
“listaCompras”, deve-se escrever “listaCompras.AddLast(valor);” e assim por diante.
- -4
Figura 3 - Criação de duas listas ligadas de inteiros.
Fonte: Elaborada pelo autor, 2019.
- -5
Figura 4 - Criação de duas listas ligadas de inteiros.
Fonte: Elaborada pelo autor, 2019.
1)A linha 12 cria uma lista ligada, o nome dessa lista é “pares”. Ela é do tipo que contém números inteiros, pois
especificamos o tipo “int” dentro de “ ”.new LinkedList<int>( );
2) Adicionamos três nós, consecutivamente, cujos valores são 2, 4 e 6, usando o método “ ”.AddFirst(valor);
3) O laço de repetição “foreach” nas linhas de 18 a 21 mostra a lista em si, apresentando cada um dos nós
(apresenta-se o valor contido em cada nó).
4) Na linha 23, criamos um nó, ainda sem valor nele contido.
5) Na linha 24, atribuímos o valor “2” a esse nó, pois lembre-se de que esse foi o primeiro valor, na linha 10.
6) Na linha 25 nós adicionamos outro nó à lista, após o nó atual (note que o nó atual é aquele que contém valor
“6”, pois o último “ ” ocorreu na linha 16). Usamos para isso o método “AddAfter”, que pede aAddFirst
definiçãodo nó após o qual deve ser inserido e o valor em si. Nesse caso, insere-se o valor “8”.
7) As linhas 27 a 30 verificam a nova lista, após a inserção do nó com valor “8”. Repare que ele está posicionado
corretamente após o nó que contém o valor “6”.
Executando esse código, obtemos:
Lista ligada:
6 4 2
Lista ligada, após inserção do nó:
6 8 4 2
- -6
Embora os números acima não demonstrem uma ligação entre eles, a estrutura de dados subjacente o faz. O que
aparece são apenas os valores dos nós, mas eles apontam devidamente uns para os outros.
Aplicações para diferentes tipos de listas
A principal aplicação das listas encadeadas é criar novas estruturas de dados mais complexas (tais como árvores
e grafos, que são estruturas não lineares, obedecendo uma hierarquia, tal como uma árvore invertida), cujo
dimensionamento é dinâmico. Com “dimensionamento dinâmico” queremos dizer que o tamanho da estrutura
não é pré-estabelecido, tal como ocorre em um vetor. A memória que você precisa para novos termos é garantida
no momento da inserção desses termos (VICTORINE, 2008).
O código em C# a seguir implementa uma lista de carro, em que se adicionam e se removem alguns itens. Teste
esse código na sua IDE preferida, e não se esqueça de incluir as bibliotecas no começo do código (escolha tipo
Console):
1) public class Loja.Extra
2) {
3) public static void Main()
4) {
5) LinkedList<string> carros = new LinkedList<string>();
6) carros.AddLast("Fusca");
7) carros.AddLast("Corsa");
8) carros.AddLast("FIT");
9) carros.AddLast("Prisma");
10) Console.Write("Lista de Carros na loja: ");
11) foreach(string s in carros)
12) {
13) Console.Write(s + " " );
14) }
15) Console.WriteLine("\n Quantidade de nós: {0}",carros.Count);
16) carros.RemoveFirst( );
17) carros.RemoveLast( );
18) Console.Write("Nova lista: ");
19) foreach(string s in carros)
20) {
21) Console.Write(s + " " );
22) }23) Console.WriteLine("Quantidade de nós: " + carros.Count);
FIQUE ATENTO
Muitas estruturas de dados mais avançadas, tais como árvores e grafos, podem precisar de
listas para a sua implementação básica. Na linguagem de programação C, podem ser usados
ponteiros como recurso para se apontar para o próximo elemento da própria lista, mas é
preciso tomar cuidado com o custo computacional de tais estruturas (CUSTÓDIO; FEITOSA,
2016).
- -7
21) Console.Write(s + " " );
22) }23) Console.WriteLine("Quantidade de nós: " + carros.Count);
24)}
25) }
Quando devemos usar: LinkedList<T> (lista ligada)?
Saiba que a é preferível quando temos que adicionar ou remover elementos em ambas aslista ligada
extremidades da lista, ou quando o acesso aos elementos é consecutivo. Entretanto, se desejarmos acessar
elementos por índice, a lista List<T> (lista não ligada) é recomendada.
A lista ligada ocupa mais memória, pois ela mantém valores e diversos ponteiros para cada elemento.
A lista ligada, portanto, começa com a “cabeça da lista”, a partir da qual todos os elementos mantêm referência
SAIBA MAIS
Quer aprofundar seus conhecimentos sobre estruturas de dados em C? Sugerimos a leitura do
capítulo 9 de “Treinamento em Linguagem C”, de Victorine (2008), que apresenta a construção
de estruturas de dados em C, incluindo a implementação de uma lista ligada na linguagem C.
Nesse caso, devem ser usados ponteiros na linguagem C para o apontamento do próximo nó da
lista.
EXEMPLO
Imagine que você deseja construir uma pequena lista ligada de carros, em quea primeira
ocorrência de item cadastrado seja o último nó da coleção. Além disso, pergunta-se se um
determinado item pertence à coleção. O código abaixo implementa a solução:
1) using System;
2) using System.Collections.Generic; listacarros 4) { 5) class Program 6)3) namespace public 
{ 7) static void () 8){ 9) LinkedListNode<string> no; 10) var carros = public Main new
LinkedList<string>(); 11) var confirma = 'c'; 12) 13){ 14) Console. ("Cadastre umdo Write
modelo de auto: "); 15) carros. (Console. ( )); 16) Console. ("DesejaAddLast ReadLine Write
acrescentar mais um modelo? Digite y ou Y: "); 17) confirma = Convert. (Console.ToChar
( )); 18)} (confirma == 'y' || confirma == 'Y'); 19) Console. ("Lista: "); 20) ReadLine while Write
(string s carros) 21) { 22) Console. (s + " " ); 23) } 24) Console. ("\nforeach in Write WriteLine
Qual modelo você deseja?"); 25) var valor = Console. (); 26)no = carros.ReadLine FindLast
(valor); 27) (no == ) 28) {Console. ("Valor " + valor + " não encontrado");} 29) if null WriteLine
 30) { 31) Console. ("Valor " + valor + " encontrado"); 32) } 33) Console.else WriteLine ReadKey
( ); 34) } 35) } 36) }true
- -8
A lista ligada, portanto, começa com a “cabeça da lista”, a partir da qual todos os elementos mantêm referência
aos próximos. Por isso, você precisará de um pouco de memória extra para guardar as várias referências, além
da memória para os valores de cada nó da lista. Por exemplo, uma lista de aprovados em um vestibular pode ser
descrita como uma lista ligada, com a nota sendo usada como ligação entre um nó e outro.
Por fim, destacamos que listas são adequadas em aplicações em situações nas quais não é possível prever a
quantidade de memória usada. Elas são usadas em: manipulação simbólica; compiladores; gerência de memória
etc.
Fechamento
Neste tema, você teve a oportunidade de conhecer as listas ligadas e os seus principais métodos. Esse tipo de
estrutura de dados deve ser usado em circunstâncias especiais, em quea pesquisa sobre os tempos de acesso,
inserção, busca, ordenação e remoção deve ser feita com antecedência, antes de usá-la. Lembre-se de que uma
boa escolha da estrutura de dados irá implicar em algoritmos eficientes e velozes.
Referências
CUSTÓDIO, Paulo Sérgio; FEITOSA, Marcio Porto. : uma abordagem Iniciação à Programação de Computadores
baseada em exemplos. Rio de Janeiro: Ciência Moderna, 2016.
DEITEL, C. . Como Programar 6. ed. São Paulo: Pearson, 2011.
TUCKER, Allen B.; NOONAN, Robert E. : princípios e paradigmas. 2. ed. São Paulo:Linguagens de programação
McGraw-Hill, 2008.
- -1
Módulos ou Métodos
Paulo Sérgio Custódio
Introdução
Neste texto-base, vamos estudar a construção de programas usando a modularização, isto é, a divisão do
programa em unidades menores, mais gerenciáveis, chamadas “módulos”. Há dois tipos de módulos: aqueles que
devolvem algum valor (o qual pode ser usado posteriormente por outras partes do programa) e aqueles que não
devolvem valor de espéciealguma. Este tipo de módulo apenas apresenta algum texto ou resultado para ser lido.
Tenha em mente que as vantagens da arquitetura modular são a manutenção do (de acordo com o seusoftware 
ciclo de vida) e o fato de que a própria construção do se vê facilitada. Você sabia que um sistemasoftware
operacional possui milhares de módulos? Atualmente, não é possível a construção de programas profissionais
sem o uso da modularização.
Ao final desta aula, você será capaz de:
• Compreender a implementação de módulos, empregando valores de retorno.
Definição e implementação de módulos
Nas próximas páginas, vamos definir o que são módulos e o que é “chamada de métodos”, começando pela
modularização.
Modularização
A é a técnica usada para dividirmos um programa em módulos, ou seja, em partes menores emodularização
mais facilmente gerenciáveis. Os módulos também são conhecidos como funções ou métodos.
Os módulos recebem a seguinte designação: e . No Portugol Studio (qualquer que seja aprocedimentos funções
sua versão), todo método é considerado uma função, portanto, aqui, também vamos adotar essa nomenclatura.
Temos dois tipos de métodos (ou funções): aqueles com valor de retorno e os que não possuem valor de retorno.
Os métodos que não retornam valor são chamados de vazio) na maioria das linguagens de programação. void (
O primeiro e mais importante procedimento na IDE Portugol Studio chama-se “ ”. Para criarmos uminicio( )
procedimento no programa, temos que definir uma função sem valor de retorno fora do escopo de “ ”.inicio( )
Conforme indicado na Figura 1, a seguir.
•
Aula 12
- -2
Figura 1 - Construindo um método fora do escopo de inicio( )
Fonte: Elaborada pelo autor, 2019.
Podemos criar quantos procedimentos quisermos, é só colocá-los uns embaixo dos outros. Repare que o escopo
de programa está bem delimitado na linha 2 por uma chave, sendo ela fechada pela chave que se encontra na
linha 18.
Observe que a construção lógica de um programa é grandemente facilitada ao dividirmos o programa em
módulos, pois não teremos mais que lidar com a lógica interna do módulo. Em outras palavras, nos esquecemos,
temporariamente de como ele funciona e começamos a pensar na lógica de porções maiores que irão contê-lo.
Se você não dividir um programa em módulos, dificilmente obterá um programa consistente, sem erros, de baixo
custo de manutenção (FORBELLONE; EBERSPÄCHER, 2005).
FIQUE ATENTO
Para que os demais métodos funcionem, eles precisam ser chamados pela função .inicio( )
Adicionalmente, métodos podem chamar outros métodos e chamarem a si mesmos (recursão),
no entanto, para que a recursão funcione, a função deve chamar a si mesma em uma instância
diferente, isto é, com valores diferentes para os seus parâmetros. Esse procedimento evita o
evento de um .loop
- -3
Métodos com parâmetros e sem parâmetros
Com relação ao uso de parâmetros, há dois tipos de métodos: com parâmetros e sem parâmetros. Um método
sem parâmetros é da forma “ ”; e um método com parâmetros é dafuncao tipo de retorno nome_método( )
forma “ ”.funcao tipo de retorno nome_método(tipo var1, tipo var2, ....)
Chamada de métodos
Para que o procedimento execute uma ação, ele precisa ser chamado no procedimento emcalculaFat( ) inicio( )
algum momento. Antes de chamá-lo, vamos escrever algum procedimento dentro dele, para exemplificarmos
como acontece. O código que define o método (do tipo ) calculaFat(inteiro m) é o seguinte:void
1) funcao calculaFat(inteiro m)
2) {
3) inteiro fat =1, j=1
4) para(inteiro i=1;i<=m;i++)
5) {
6) fat = fat*j
7) j = j+1
8) }
9) escreva("\n ",m, "! = ", fat)
10) }
Valores de retorno dos módulos
Lembre-se de que em relação ao retorno, há aqueles métodos com valor de retorno e aqueles sem valor de
retorno, ou .void
Valor de retorno
Nesse caso, a sintaxe deve levar em conta quatro segmentos: ; (tipo de variável que elafunção tipo de retorno 
irá retornar); ; e (cada um separado por vírgula). Teremos, portanto: “nome da função lista de parâmetros 
(lista de parâmetros)”.função tipo_retorno nome_método
Exemplo:
1) funcao calculaDesconto(real preco, real taxa)inteiro
2) {
3) taxa = 0.10
4) preco*(1 - taxa)retorne
5) }
CalculaDesconto é uma função que retorna inteiros, e sua lista de parâmetros é: real preço e real taxa. Em outras
palavras: a função irá trabalhar com duas variáveis reais. Aqui, fique atento: a palavra reservada “ ” éretorne
necessária, e não pode ser omitida, como indicado da Figura 2.
- -4
Figura 2 - Programa que calcula desconto.
Fonte: Elaborada pelo autor, 2019.
Explicando o código:
1) Declaramos duas variáveis do tipo real, e , nas linhas 3 e 4.precoProduto taxaDesconto
2) As linhas de 7 a 10 solicitam que o usuário do programa digite esses valores: o preço do produto e a taxa de
desconto que será obtida.
3) Na linha 11, temos um método: o método nativo escreva( ). Dentro dele, há uma frase (dentro de aspas) e o
método “calculaDesconto” é chamado para ser executado. São passados os valores de preço e taxa, e o método
trabalha com esses dados, processando o código da linha 17 (dentro do escopo desse método) e pega o valor de
retorno do cálculo. Esse valor de retorno é devolvido ao método chamador, que, neste caso, foi o método escreva
( ) na linha 11, dentro do escopo da função inicio( ).
Fatorial recursivo
A é a programação que envolve a criação de um método que chama a si mesmo. Vamos a um exemplorecursão
no Portugol Studio 2.1.7, no qual digitamos um número inteiro e ele calcula o fatorial desse número, conforme
mostra a Figura 3, a seguir.
- -5
Figura 3 - Fatorial de um número inteiro, recursão.
Fonte: Elaborada pelo autor, 2019.
Como esse código funciona? Vamos ver a implementação do método fat( ).
1) A função possui um parâmetro do tipo inteiro e ela retorna 1, caso o parâmetro de entrada sejafat(inteiro n)
igual a 0 ou igual a 1. Nesse caso, a função para de se chamar a si mesma.
2) Caso contrário, quando n > 1, a função retorna o produto de “n” vezes a própria função calculada em (n - 1), ou
seja, ela remove 1 do argumento.
3) Esse processo continua até que n seja igual a 1, e então a recursão se encerra.
- -6
Figura 4 - Executando o programa para N = 7.
Fonte: Elaborada pelo autor, 2019.
Enquanto um método estiver sendo chamado, em tempo de execução, a sua ocupação em memória está ativa,
pois a cada vez que o método é chamado é necessário que o SO reserve um bloco protegido para as variáveis
daquele método.
Sem valor de retorno
Nesse caso, a sintaxe deve levar em conta três segmentos: ; ; e função nome da função lista de parâmetros
(cada um separado por vírgula). Assim, obtemos: “ (lista de parâmetros)”.função nome_método
Exemplo:
1) funcao calculaDesconto(real preco, real taxa)
FIQUE ATENTO
A é uma estratégia poderosa para se elaborar algoritmos. Muitos algoritmos sãorecursão
recursivos. Note, no entanto, que na recursão o espaço em memória reclamado pela função
pode ficar sobrecarregado. Quando há muita ocupação em memória, o programa pode se
tornar lento, dessa forma, não abuse do uso da recursão. Um algoritmo não recursivo (sem
métodos que se chamem a si mesmos) sempre é mais rápido do que um recursivo para a
mesma tarefa, pois ele não aloca muito espaço. 
- -7
Exemplo:
1) funcao calculaDesconto(real preco, real taxa)
2) { taxa = 0.10
3) (preco*(1 - taxa))escreva
4) }
Note que, nesse caso, você não pode usar a palavra reservada . Então, reflita: qual é a diferença entre retorne
métodos com retorno e sem retorno? Os métodos com retorno, como o nome sugere, devolvem algum tipo de
valor para o método chamador. Isso quer dizer que há um valor de retorno que pode ser usado em outra variável
ou passado para outro método
No caso de um método sem retorno ( ), não há essa possibilidade: o método executa alguma tarefa, mas nãovoid
devolve valor para ser usado posteriormente, por outros métodos ou variáveis.
SAIBA MAIS
Quer aprofundar seus conhecimentos sobre o uso da memória pelas variáveis? Consulte o
Segundo capítulo do excelente livro “ ”

Continue navegando