Estrutura de Dados Introdução e Alocação de Memória Vilson Heck Junior Instituto Federal de Santa Catarina 2015 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Sumário 1 Sumário 2 Introdução 3 Dados Compostos Heterogêneos O Problema A Solução Objetos em Java Exercı́cio 4 Alocação de Memória Alocação Dinâmica de Memória 5 Referências Bibliográficas 2 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Sumário 1 Sumário 2 Introdução 3 Dados Compostos Heterogêneos O Problema A Solução Objetos em Java Exercı́cio 4 Alocação de Memória Alocação Dinâmica de Memória 5 Referências Bibliográficas 3 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Introdução às Estruturas de Dados Computação x Dados Por definição um computador é uma máquina capaz de trabalhar com uma grande quantidade de informações em um tempo reduzido. Para que esse trabalho seja realizado as informações envolvidas devem ser organizadas, para então poderem ser manipuladas e utilizadas de forma conveniente. Objetivo das Estruturas O objetivo maior das estruturas de dados é prover diferentes formas para organizar as informações utilizadas por um programa de computador. Esse objetivo é circundado por técnicas de manipulação aplicadas às informações organizadas, de forma a utilizá-las para a resolução de problemas diversos. (Alexandre Savaris, 2006) 4 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Representação de Dados Um computador é um dispositivo eletrônico e, por isso, é composto por circuitos elétricos. A ausência ou presença de tensão elétrica, em cada circuito, representa um valor para de bit: 0 (na ausência de tensão) ou 1 (na presença de tensão). O bit, por sua vez, é o menor dado que pode ser representado por um computador e, quando arranjado com outros bit, compõem bytes, ou ainda conjuntos de bytes, que representam dados. Este arranjo é determinado por uma estrutura, então: Estrutura de Dados. 5 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Representação de Dados Um computador é um dispositivo eletrônico e, por isso, é composto por circuitos elétricos. A ausência ou presença de tensão elétrica, em cada circuito, representa um valor para de bit: 0 (na ausência de tensão) ou 1 (na presença de tensão). O bit, por sua vez, é o menor dado que pode ser representado por um computador e, quando arranjado com outros bit, compõem bytes, ou ainda conjuntos de bytes, que representam dados. Este arranjo é determinado por uma estrutura, então: Estrutura de Dados. 5 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Variáveis As estruturas de dados mais simples são as variáveis. Cada variável armazena um único dado, referente a qualquer coisas do tipo de dado determinado. Mas e se precisarmos armazenar conjuntos de dados que são de tipos diferentes, mas que são relacionados à mesma coisa? Toda variável possuı́ um tipo de dado primitivo, que determina a sua estrutura. Esta estrutura limita o dado armazenado quanto ao seu valor. Por exemplo, um tipo de dado numérico não é adequado para armazenar texto, ou vice-versa. Ainda, um mesmo tipo de dado numérico é capaz de armazenar valores numéricos exclusivos de um determinado intervalo. 6 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Variáveis As estruturas de dados mais simples são as variáveis. Cada variável armazena um único dado, referente a qualquer coisas do tipo de dado determinado. Mas e se precisarmos armazenar conjuntos de dados que são de tipos diferentes, mas que são relacionados à mesma coisa? Toda variável possuı́ um tipo de dado primitivo, que determina a sua estrutura. Esta estrutura limita o dado armazenado quanto ao seu valor. Por exemplo, um tipo de dado numérico não é adequado para armazenar texto, ou vice-versa. Ainda, um mesmo tipo de dado numérico é capaz de armazenar valores numéricos exclusivos de um determinado intervalo. 6 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Sumário 1 Sumário 2 Introdução 3 Dados Compostos Heterogêneos O Problema A Solução Objetos em Java Exercı́cio 4 Alocação de Memória Alocação Dinâmica de Memória 5 Referências Bibliográficas 7 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Dados Compostos Heterogêneos Muitas Variáveis Se pensarmos em uma pessoa, ela pode ser descrita com diversos dados, por exemplo: Nome, Idade, Endereço, CPF, ... Então, utilizando variáveis, precisarı́amos declarar diversas variáveis para cada pessoa que gostarı́amos de armazenar, obtendo um enorme número de variáveis. Uma forma de resolver esta múltipla alocação de variáveis é chamado de Dados Compostos Heterogêneos, Registros ou, ainda, Estruturas. Dados Compostos Heterogêneos Estruturar e/ou Agrupar, de forma organizada, os dados que são relacionados à mesma tarefa ou elemento. 8 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Dados Compostos Heterogêneos Muitas Variáveis Se pensarmos em uma pessoa, ela pode ser descrita com diversos dados, por exemplo: Nome, Idade, Endereço, CPF, ... Então, utilizando variáveis, precisarı́amos declarar diversas variáveis para cada pessoa que gostarı́amos de armazenar, obtendo um enorme número de variáveis. Uma forma de resolver esta múltipla alocação de variáveis é chamado de Dados Compostos Heterogêneos, Registros ou, ainda, Estruturas. Dados Compostos Heterogêneos Estruturar e/ou Agrupar, de forma organizada, os dados que são relacionados à mesma tarefa ou elemento. 8 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas O Problema: Numerosas Variáveis 9 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas A Solução: Dados Compostos Heterogêneos - Objetos 10 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Criando uma Classe class em Java Como visto em slide anterior, uma class pode ser composta de vários campos de diferentes tipos de dados; A criação desta class é feita em novo arquivo, dentro de um package e fora de qualquer outra class; Após a declaração class, devemos colocar um bloco { }; Dentro do bloco { }, devemos declarar os elementos que irão compor a estrutura. A declaração de cada elemento deve ser antecedida pela palavra: public. 11 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Criando uma Classe class em Java Como visto em slide anterior, uma class pode ser composta de vários campos de diferentes tipos de dados; A criação desta class é feita em novo arquivo, dentro de um package e fora de qualquer outra class; Após a declaração class, devemos colocar um bloco { }; Dentro do bloco { }, devemos declarar os elementos que irão compor a estrutura. A declaração de cada elemento deve ser antecedida pela palavra: public. 11 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Criando uma Classe class em Java Como visto em slide anterior, uma class pode ser composta de vários campos de diferentes tipos de dados; A criação desta class é feita em novo arquivo, dentro de um package e fora de qualquer outra class; Após a declaração class, devemos colocar um bloco { }; Dentro do bloco { }, devemos declarar os elementos que irão compor a estrutura. A declaração de cada elemento deve ser antecedida pela palavra: public. 11 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Criando uma Classe class em Java Como visto em slide anterior, uma class pode ser composta de vários campos de diferentes tipos de dados; A criação desta class é feita em novo arquivo, dentro de um package e fora de qualquer outra class; Após a declaração class, devemos colocar um bloco { }; Dentro do bloco { }, devemos declarar os elementos que irão compor a estrutura. A declaração de cada elemento deve ser antecedida pela palavra: public. 11 / 22 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package MeuPrograma ; class Pessoa { // Declaraç~ a o da classe Pessoa public String Nome ; // Atributo Nome public int Idade ; // Atributo Idade public String Endereco ; // Atributo Endereco public long CPF ; // Atributo CPF } public class Programa { public static void main ( String [] args ) { Pessoa p1 = new Pessoa () ; p1 . Nome = " Fulano de Tal " ; p1 . Idade = 20; p1 . Endereco = " Rua XYZ , 12 " ; p1 . CPF = 1234567890; } } Criação e Inicialização de class em Java Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Aplicação em Array Um bom exemplo de simplificação que obtemos ao usar a class Pessoa, que criamos anteriormente, é apresentada ao utilizarmos um array para armazenar um determinado número de objetos Pessoa. Arrays e outras Estruturas de Dados, que serão estudadas, passam a ter capacidade de armazenar elementos mais complexos, assim como uma Pessoa, que é composta por diversos dados diferentes. 1 2 3 4 5 6 7 8 9 10 // Array de 10 Pessoas Pessoa [] pes = new Pessoa [10]; pes [0] = new Pessoa () ; pes [0]. Nome = " Fulano de Tal " ; pes [0]. Idade = 20; pes [1] = new Pessoa () ; pes [1]. Nome = " Ciclano de Tal " ; pes [1]. Idade = 51; String texto = pes [0]. Nome ; int nro = pes [1]. Idade ; 13 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Aplicação em Array Um bom exemplo de simplificação que obtemos ao usar a class Pessoa, que criamos anteriormente, é apresentada ao utilizarmos um array para armazenar um determinado número de objetos Pessoa. Arrays e outras Estruturas de Dados, que serão estudadas, passam a ter capacidade de armazenar elementos mais complexos, assim como uma Pessoa, que é composta por diversos dados diferentes. 1 2 3 4 5 6 7 8 9 10 // Array de 10 Pessoas Pessoa [] pes = new Pessoa [10]; pes [0] = new Pessoa () ; pes [0]. Nome = " Fulano de Tal " ; pes [0]. Idade = 20; pes [1] = new Pessoa () ; pes [1]. Nome = " Ciclano de Tal " ; pes [1]. Idade = 51; String texto = pes [0]. Nome ; int nro = pes [1]. Idade ; 13 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Exercı́cio 01 Primeira Etapa Faça um novo projeto para Console em Java; Crie uma class chamada Contato, contendo os atributos: String Nome; long Telefone; String Email; Segunda Etapa Dentro da função main declare um array (de tamanho 10) do tipo Contato; e Crie uma aplicação com um Menu(funcional) contendo: 1 - Cadastrar Contatos 2 - Listar Contatos 3 - Sair O Menu deverá ser exibido até a escolha da opção Sair. 14 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Exercı́cio 01 Primeira Etapa Faça um novo projeto para Console em Java; Crie uma class chamada Contato, contendo os atributos: String Nome; long Telefone; String Email; Segunda Etapa Dentro da função main declare um array (de tamanho 10) do tipo Contato; e Crie uma aplicação com um Menu(funcional) contendo: 1 - Cadastrar Contatos 2 - Listar Contatos 3 - Sair O Menu deverá ser exibido até a escolha da opção Sair. 14 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Sumário 1 Sumário 2 Introdução 3 Dados Compostos Heterogêneos O Problema A Solução Objetos em Java Exercı́cio 4 Alocação de Memória Alocação Dinâmica de Memória 5 Referências Bibliográficas 15 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Alocação de Memória Estático Até agora, aprendemos a alocar memória através da declaração de variáveis e arrays. Vimos estratégias para resolver alguns problemas pontuais, tais como: Gerenciar um alto número de variáveis (através de arrays); Definir uma class para associar dados heterogêneos; O que falta? Mas e se precisarmos alocar memória sob demanda? Por exemplo, imagine o exercı́cio feito anteriormente, onde criamos um array para armazenar 5 Contatos. O que aconteceria no caso do usuário precisar cadastrar um sexto Contato? 16 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Alocação de Memória Estático Até agora, aprendemos a alocar memória através da declaração de variáveis e arrays. Vimos estratégias para resolver alguns problemas pontuais, tais como: Gerenciar um alto número de variáveis (através de arrays); Definir uma class para associar dados heterogêneos; O que falta? Mas e se precisarmos alocar memória sob demanda? Por exemplo, imagine o exercı́cio feito anteriormente, onde criamos um array para armazenar 5 Contatos. O que aconteceria no caso do usuário precisar cadastrar um sexto Contato? 16 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas O Comando new Em várias situações nós utilizamos o comando new, geralmente sem entender qual era sua real função; 1 Pessoa [] pes = new Pessoa [10]; A partir de agora, devemos estudar melhor este comando, mas acima de tudo, entender os conceitos que estão por trás do seu funcionamento; Devemos lembrar que este tipo de função existe em todas as linguagens de programação, algumas vezes como mesmo nome, outras vezes com nomes diferentes, mas com a mesma aplicação; 17 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas O Comando new Em várias situações nós utilizamos o comando new, geralmente sem entender qual era sua real função; 1 Pessoa [] pes = new Pessoa [10]; A partir de agora, devemos estudar melhor este comando, mas acima de tudo, entender os conceitos que estão por trás do seu funcionamento; Devemos lembrar que este tipo de função existe em todas as linguagens de programação, algumas vezes como mesmo nome, outras vezes com nomes diferentes, mas com a mesma aplicação; 17 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Uso do Comando new O comando new é utilizado para alocar memória: 1 int [] pes = new int [10]; No exemplo acima, solicitamos ao Sistema Operacional que dê ao nosso programa, espaço suficiente para armazenar 10 números inteiros, ou seja: 32bits × 10 = 40bytes. Antes de armazenar qualquer dado, precisamos ter um espaço na memória devidamente alocado. Isto é feito com o comando new. As exceções ficam por conta das Variáveis de tipos de dados primitivos, que dispensam o uso deste comando, mas que fazem a alocação de espaço na memória no momento em que as declaramos. Segue exemplo de uso com tamanho informado pelo usuário. 18 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Uso do Comando new O comando new é utilizado para alocar memória: 1 int [] pes = new int [10]; No exemplo acima, solicitamos ao Sistema Operacional que dê ao nosso programa, espaço suficiente para armazenar 10 números inteiros, ou seja: 32bits × 10 = 40bytes. Antes de armazenar qualquer dado, precisamos ter um espaço na memória devidamente alocado. Isto é feito com o comando new. As exceções ficam por conta das Variáveis de tipos de dados primitivos, que dispensam o uso deste comando, mas que fazem a alocação de espaço na memória no momento em que as declaramos. Segue exemplo de uso com tamanho informado pelo usuário. 18 / 22 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package MeuPrograma ; import java . util . Scanner ; public class Programa { public static void main ( String [] args ) { Scanner entrada = new Scanner ( System . in ) ; int tamanho ; String [] nomes ; System . out . println ( " Tamanho do array : " ) ; tamanho = entrada . nextInt () ; nomes = new String [ tamanho ]; for ( int x = 0; x < tamanho ; x ++) { System . out . print ( " Nome nro " + x + " : " ) ; nomes [ x ] = entrada . nextLine () ; } System . out . println ( " Os " + tamanho + " nomes s~ ao : " ) ; for ( int x = 0; x < tamanho ; x ++) { System . out . println ( nomes [ x ]) ; } } } Usando new para alocar um array em Java Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas A Memória A Memória Continua material sobre a memória e a alocação de memória. 20 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Sumário 1 Sumário 2 Introdução 3 Dados Compostos Heterogêneos O Problema A Solução Objetos em Java Exercı́cio 4 Alocação de Memória Alocação Dinâmica de Memória 5 Referências Bibliográficas 21 / 22 Sumário Introdução Dados Compostos Heterogêneos Alocação de Memória Referências Bibliográficas Referências Bibliográficas Básicas GOODRICH, M. T.; TAMASSIA, R.; Estruturas de dados e algoritmos em Java. 4a Edição. Porto Alegre, 2006 ZIVIANI, N.; Programação de algoritmos com implementações em Java e C++. 1a Edição. Cengage Learning, 2006 Complementares CORMEN, T. H.; LEISERSON, C. E., et al.; Algoritmos Teoria e Prática. 4a Edição. São Paulo: Elsevier, 2009 PREISS, B. R.; Estrutura de Dados e Algoritmos. São Paulo: Elsevier, 2001 22 / 22