Baixe o app para aproveitar ainda mais
Prévia do material em texto
Introdução aos tipos abstratos de dados APRESENTAÇÃO A era atual é uma era de dados, na qual todas as informações, os dados, sobre cada indivíduo encontram-se disponíveis na rede mundial de computadores, a Internet. Os dados podem abranger desde um simples cadastro com informações pessoas, tais como nome e endereço, e estender-se a gostos e particularidades de cada um, como restaurantes frequentados e ciclo de amizades. A partir dessa massa de dados à disposição de todos, é possível compreender como estes devem ser manipulados de forma a possibilitar uma melhor análise, visando a uma futura tomada de decisão. Nesta Unidade de Aprendizagem, você verá os conceitos básicos e as principais características da estrutura de dados, bem como as ferramentas necessárias para sua compreensão e suas aplicações nas diferentes áreas. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Explicar estruturas de dados.• Descrever os principais elementos para definir os tipos abstratos de dados (TAD).• Identificar os recursos de programação para implementar as estruturas de dados.• DESAFIO Antes de iniciar o desenvolvimento de um software, deve-se realizar uma análise do problema e de suas características, bem como das ações a serem realizadas. Essa análise tem como objetivo fazer um desenvolvimento com foco em qualidade, efetividade e custos com a reutilização de códigos anteriormente desenvolvidos. Suponha que você atue como programador em uma empresa terceirizada que presta serviços ao DETRAN. Diante desse contexto, indique quais são os tipos abstratos de dados, suas variáveis e operações. INFOGRÁFICO O desenvolvimento de uma aplicação vai além do uso de linguagens de programação, pois requer uma análise crítica do problema a ser abordado, bem como suas possíveis soluções. Para iniciar o processo de desenvolvimento, é necessário construir um esboço inicial do que será desenvolvido, logo, dos objetos abstratos que devem ser programados. A utilização de um fluxo para a criação de tipos de dados abstratos proporcionará a redução de custos com a reutilização de códigos de projetos já desenvolvidos, bem como sua manutenção no futuro. No Infográfico, veja o fluxo necessário para o desenvolvimento de tipos abstratos de dados. Conteúdo interativo disponível na plataforma de ensino! CONTEÚDO DO LIVRO A atuação do profissional de tecnologias da informação (TI) abrange diferentes áreas, desde a análise de requisitos à testagem de aplicações. Durante a trajetória de desenvolvimento, há diferentes profissionais em cada etapa de construção de uma aplicação, porém é recomendado que o profissional de TI tenha conhecimento aprofundado em pelo menos uma das áreas no ciclo de vida de um software. No capítulo Introdução aos tipos abstratos de dados, da obra Estrutura de dados, você verá o conceito de estrutura de dados, seus principais elementos, bem como sua correta construção e a importância de realizar a análise de requisitos com foco na construção dos tipos de dados abstratos e suas particularidades. Boa leitura. ESTRUTURA DE DADOS Lucas Plautz Prestes Introdução aos tipos abstratos de dados Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Explicar estruturas de dados. � Descrever os principais elementos para definir os tipos abstratos de dados. � Identificar os recursos de programação para implementar as estruturas de dados. Introdução A Internet possibilitou o acesso a dados nas suas mais diferentes formas. Ao acessar uma rede social, você é capaz de identificar diversos dados de um amigo, gostos pessoais e grupos de interesse. A partir dessas informações, você pode imaginar o quão complexo deve ser estruturá- -las em uma base de dados e classificá-las de forma adequada para o desenvolvimento de um sistema inteligente. Estruturação e classificação de dados não são uma tarefa simples, pois as dificuldades inerentes podem acarretar problemas futuros no modo como os dados serão amostrados e na performance no sistema desenvolvido. Neste capítulo, você vai estudar a importância da estrutura de dados e suas principais características, além de conferir os recursos necessários para a sua implantação de forma clara e concisa. 1 O que é estrutura de dados? Na computação, a estrutura de dados consiste no modo de armazenamento e organização de dados em um computador. Quando estamos nos referindo ao armazenamento de dados, existe uma infinidade de opções nas quais o dado poderá ser armazenado de acordo com o seu tipo e base de dados. Os dados podem ser armazenados em pastas, arquivos de texto, planilhas ou até mesmo em um banco de dados instalado localmente ou em nuvem. Os dados armazenados não consistem somente no local no qual são ar- mazenados, mas nas relações entre eles. A organização dos dados é tão im- portante quanto o modo no qual são armazenamos, pois a correta escolha de sua categoria irá acarretar na performance ou na velocidade que o compu- tador, ou usuário, irá demorar para encontrá-los. Logo, a correta escolha de como devemos armazenar e organizar os dados deverá levar em consideração o modo no qual eles serão utilizados no futuro. No exemplo a seguir, você poderá identificar como as nossas ações diárias estão ligadas diretamente aos conceitos de dados e às suas respectivas estru- turas, bem como o seu efeito se não utilizadas de forma adequada. Hoje, João foi ao maior supermercado da cidade com o objetivo de realizar as compras de sua festa de aniversário. Sua mãe realizou uma lista de compras com 50 itens dos mais variados tipos. Aproveitando a carona, Maria foi acompanhar seu amigo, mas tinha o objetivo de realizar a compra de outros 50 itens para a festa de sua escola. Ao chegarem ao supermercado, os amigos se separaram para realizar as compras mais rapidamente e, depois, tomar um sorvete na praça de alimentação. João foi realizando as compras de acordo com a lista enviada pela mãe, item a item, seguindo a ordem descrita por ela. Maria, mais esperta, antes de iniciar as compras, parou por 5 minutos e classificou a lista de compras de acordo com as categorias de cada corredor, respeitando a sua respectiva ordem, com o objetivo de obter maior eficiência no seu processo. Após uma hora de compras, João estava na metade de sua lista, caminhando de um lado para o outro, a fim de finalizar as compras o mais rápido possível, e encontrou sua amiga na praça de alimentação, tomando sorvete. Perguntou a ela: “Você já acabou suas compras? Mas como?” Maria respondeu: “Claro, classifiquei todos os meus itens, dados, nas suas diferentes categorias, de acordo com seus respectivos tipos, na ordem dos corredores do supermercado. Logo, realizei as compras de forma mais rápida e eficaz”. Introdução aos tipos abstratos de dados2 Quando os dados estão organizados e dispostos de forma coerente, levando em consideração o objetivo no qual foram destinados, caracterizam uma forma, uma estrutura de dados. A organização e os métodos para manipular essa estrutura de dados conferem a ela singularidade. Você sabe a diferença entre dados e informação? Usualmente, falamos as palavras dados e informação, porém, seus conceitos são completamente distintos. Os dados podem ser números, letras e palavras sem qualquer significado. A informação é quando há algum significado para o dado (Figura 1). Dados: 08 12 07 03 Informação: Idades ou Número de pessoas ou Peso de uma caixa Figura 1. Ilustração de uma lista de dados com possíveis informações as quais os dados poderiam representar. � Análise: classificar os dados de acordo com o objetivo, realizar compras no su- permercado, de acordo com seus respectivos tipos, e ordená-los em categorias e corredores faz com que o processo de compras seja mais eficaz. � Objetivo: realizar compras em um supermercado. � Dados: elementos da lista de compras (p. ex.,leite, bolo, chocolate, guardanapo, etc.). � Tipos\categorias: categoria de cada corredor do supermercado (p. ex., laticínios, enlatados, etc.). � Eficaz: eficiência na realização de uma tarefa (compras em um supermercado). Quanto menor o tempo, mais eficiente é o processo e menor será o recurso ne- cessário para a sua realização. 3Introdução aos tipos abstratos de dados 2 Tipos de dados Os dados utilizados em um programa de computador, ou armazenados em um banco de dados, são classificados de acordo com os seus tipos a partir de suas particularidades e limitações. Esses tipos são necessários para definir de forma eficiente o seu processo de armazenamento e manipulação. Apesar de a afirmação anterior ser verdadeira, há linguagens de progra- mação que são fortemente tipadas e outras não. Mas o que isso significa? � Linguagens altamente tipadas: são linguagens de programação que requerem que no momento da declaração de uma variável seja informado de forma explícita o seu tipo e utilizada de acordo com a sua declaração. O programador estará limitado ao tipo definido inicialmente. � Linguagens não tipadas: são linguagens de programação que não reque- rem que no momento da declaração de uma variável seja informado de forma explícita o seu tipo. O compilador irá identificar o possível tipo da variável utilizada pelo programador e defini-la internamente, isso irá trazer liberdade ao programador durante o seu desenvolvimento. As linguagens não tipadas trazem liberdade e velocidade ao programador no desen- volvimento de seus códigos, passando a responsabilidade de definir os tipos de dados ao compilador. Essa prática geralmente irá acarretar maior consumo de memória e processamento na manipulação de dados, pois o compilador desconhece as regras de negócio aplicadas no código, assim, atribuindo tipos de dados que possivelmente irão ocupar mais memória que o necessário para o seu armazenamento e, logicamente, maior processamento em sua manipulação. De acordo com Edelweiss e Galante (2009, p. 36), podemos definir que “[...] um tipo de dado consiste na definição do conjunto de valores (denominado domínio) que uma variável pode assumir ao longo da execução de um programa e do conjunto de operações que podem ser aplicadas sobre ele”. Os dados podem ser classificados como tipos de dados primitivos, também chamados de básicos ou tipos de dados estruturados. Conforme Edelweiss e Galante (2009): Introdução aos tipos abstratos de dados4 � Os tipos de dados primitivos são compostos pelos tipos de dados indi- visíveis, logo, não podem ser decompostos nos demais tipos de dados disponíveis na linguagem de programação escolhida. Um exemplo de dado primitivo é a idade de uma pessoa, que faz parte dos números Naturais na matemática. � Os tipos de dados estruturados permitem a realização de agregação de mais de um valor em uma variável, havendo uma relação estrutural entre os elementos. A matriz utilizada na matemática representa per- feitamente esse tipo de dado, no qual cada elemento tem uma relação entre os seus vizinhos. Alocação de memória: estática e dinâmica A alocação de memória estática ocorre no momento em que realizamos a compilação e a execução do programa. Neste momento, o sistema verifica as variáveis criadas no início do programa e reserva um espaço de memória para cada uma delas de acordo com os seus respectivos tipos. Logo, a memória somente será liberada quando o programa for finalizado. A alocação de memória dinâmica ocorre durante a execução do programa, sendo realizada juntamente às operações durante a sua execução. A liberação de memória no momento do fechamento de um programa ocorre de forma automática pelo sistema operacional, porém, recomenda-se realizar no momento do fechamento a codificação dessa liberação para evitar a criação de “lixo de memória” no sistema operacional. Cada sistema operacional trabalha de uma forma diferente para executar essa liberação, no qual o Windows notoriamente a realiza de forma menos eficaz se comparado aos sistemas operacionais Linux ou MacOs. O exemplo ocorre quando utilizamos o computador por um longo período e temos a sensação de que o sistema operacional fica cada vez mais lento. Isso acontece devido à utilização de memória virtual em virtude de a memória principal estar cheia, mesmo que nenhum programa esteja em execução, logo, essa ocupação provavelmente seja resquício de variáveis de programas anteriormente finalizados. Nesses casos, será recomendado executar programas de limpeza de memória ou o reinício do sistema operacional, forçando, assim, a realocação de toda a memória do sistema operacional. 5Introdução aos tipos abstratos de dados Conforme Cormen (2002), a eficiência de um algoritmo criado para a resolução de um problema se difere de forma drástica a partir da estrutura de dados e seus métodos de manipulação, indo além da avaliação do hardware disponível no computador. Tipos de dados na prática Os tipos de dados utilizados no desenvolvimento de um software, sejam eles atribuídos diretamente no código ou pelo compilador, são extremamente parecidos entre as linguagens de programação, havendo uma infinidade de possibilidades. O Quadro 1 mostra alguns dos tipos de dados mais utilizados e suas características. Fonte: Adaptado de Schildt (1996), Silva e Oliveira (2014). Tipo Bits Faixa mínima Descrição Char 8 –127 a 127 Utilizado para armazenar um caractere da tabela ASCII, seja ele letra, número ou símbolo.Unsigned Char 8 0 a 255 Int 16 –32.767 a 32.767 Utilizado para definir uma variável inteira pertencente ao conjunto dos números inteiros da matemática. Long int 32 –2.147.483.647 a –2.147.483.647 Float 32 Seis dígitos de precisão Utilizado para definir uma variável real pertencente ao conjunto dos números reais. Double 64 Dez dígitos de precisão O tipo double é similar ao tipo float, mas com suporte a um maior número de casas decimais. Quadro 1. Tipos de dados – Padrão ANSI Introdução aos tipos abstratos de dados6 Tipos de dados abstratos Os tipos de dados abstratos (TADs) são estruturas de dados muito impor- tantes capazes de representar os tipos de dados que não foram originalmente previstos nas linguagens de programação e que geralmente são necessárias para o desenvolvimento de aplicações complexas. Essas estruturas são divi- didas em duas camadas, uma chamada de dados e outra de operações. Logo, um TAD é uma forma de definição de um novo tipo de dado em união com operações capazes de manipular esses dados. Conforme Edelweiss e Galante (2009), a característica essencial de um TAD é a separação entre o conceito e a implementação, havendo uma distinção entre a definição do tipo da variável e as suas operações. Para Edelweiss e Galante (2009, p. 38), “[...] um TAD é, portanto, uma forma de definir um novo tipo de dado juntamente com as operações que manipulam esse novo tipo de dado. As aplicações que utilizam esse TAD são denominadas clientes do tipo dado”. Formalmente, podemos definir um TAD como um par (v,o), onde v repre- senta uma ou mais variáveis e o, uma ou mais operações. Devemos salientar que essas operações realizam a manipulação das variáveis definidas pelo mesmo TAD e serão utilizadas pela aplicação. Devemos salientar que o usuário nunca terá acesso direto às variáveis, e sim às operações, também chamadas de funções, que as manipulam. Logo, devemos salientar que sempre será necessário ter pelo menos uma operação de inicialização das variáveis. As principais vantagens em fazer o uso de TADs são: � Reutilização: podemos reutilizar TADs criadas em outros programas em um novo programa sem a necessidade de realizar nova implementação. � Manutenção: podemos facilmente realizar a manutenção em uma TAD criada anteriormente ou adicionar novas operações, se necessário. 3 Recursos necessários para criar um projeto com o uso de TADs O desenvolvimento de uma TAD envolve a correta escolha das operações maisadequadas para a sua respectiva estrutura de dados, levando em consideração o contexto aplicado, bem como a respectiva definição de comportamento de suas operações. A seguir, podemos definir algumas dicas que poderão facilitar o desenvolvimento de uma TAD: 7Introdução aos tipos abstratos de dados � Realizar a correta análise dos tipos de dados utilizados com foco no hardware e nas necessidades da aplicação. � Definir um número pequeno de operações que, combinadas, possibilitem a realização de operações mais complexas com foco na manutenção da aplicação. � Cada operação deverá ter um propósito definido, levando em conside- ração o contexto aplicado e sua futura manutenção e reutilização, sem muitos casos de exceções. Os TADs podem ser classificados como genéricos ou específicos. De acordo com Edelweiss e Galante (2009), podemos definir os tipos como: � Genéricos: estruturas de dados que podem ser utilizados para repre- sentar qualquer tipo de dados de forma generalista. O mesmo TAD poderia ser utilizado para representar uma lista de presença em uma classe ou até mesmo uma lista telefônica. � Específico: estrutura de dados definida para um domínio específico de aplicação com foco em cobrir uma necessidade não contemplada por um TAD genérico. Criaremos um TAD a partir de uma necessidade identificada. Nosso programa precisa criar um tipo de dado que represente a conta-corrente de um banco. Esta conta deverá ser capaz de realizar saques, depósitos e consultar saldo atual. 1. Identificação do problema: criar uma conta-corrente de acordo com o enunciado do problema proposto. 2. Identificação das variáveis: neste exemplo, estamos criando uma conta-corrente, logo, será necessário ter informações como saldo, número da conta e agência. ContaCorrente: Variáveis Ag: inteiro CC: inteiro Saldo: inteiro 3. Identificação das operações: neste exemplo, devemos realizar todas as operações inerentes a uma conta-corrente bancária. ContaCorrente: Operações Introdução aos tipos abstratos de dados8 ■ Função InicializaConta: Entrada: Ag, CC, Saldo Ação: inserir os respectivos dados informados pelo usuário nas variáveis. Saída: Nulo ■ Função Deposito: Entrada: ValorDepositado Ação: atualizar a variável Saldo. Saída: Nulo ■ Função Saque: Entrada: ValorSacado Ação: atualizar a variável Saldo. Saída: Nulo ■ Função Saldo: Entrada: Nulo Ação: retornar a variável Saldo ao usuário. Saída: Saldo 4. Identificação dos testes: a partir do enunciado, é possível identificar as ações a seguir: ■ Criar uma conta-corrente. ■ Realizar depósitos. ■ Realizar saques. ■ Verificar saldo. Você poderá identificar que existem funções nas quais não há qualquer saída identifi- cada. Nesses casos, recomendamos que seja inserida nessas funções uma mensagem ao usuário que informe que a operação foi realizada com sucesso. O conhecimento adquirido com o estudo das estruturas de dados, com os seus respectivos tipos abstratos e possibilidades de utilização, será de suma importância para o desenvolvimento de aplicações robustas que facilitam desde a manutenção da aplicação até o compartilhamento de informações entre os times de desenvolvimento. 9Introdução aos tipos abstratos de dados CORMEN, T. H. Algoritmos: teoria e prática. Rio de Janeiro: Elsevier, 2002. EDELWEISS, N.; GALANTE, R. Estruturas de dados. Porto Alegre: Bookmann, 2009. SCHILDT, H. C: completo e total. 3. ed. São Paulo: Makron Books, 1996. SILVA, R. L. S.; OLIVEIRA, A. M. Algoritmos em C. Juiz de Fora: Rodrigo Luis de Souza da Silva, 2014. Introdução aos tipos abstratos de dados10 DICA DO PROFESSOR A utilização dos tipos adequados de dados é de extrema importância durante o desenvolvimento de uma aplicação, pois ela irá definir o consumo de memória utilizado e, assim, a eficiência do consumo de hardware durante sua utilização. Nesta Dica do Professor, veja como identificar os tipos de variáveis e suas aplicações. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) O tipo de dado que representa números é muito utilizado em programação; logo, é sua correta utilização durante o desenvolvimento de uma aplicação é fundamental. Suponha que você esteja analisando os tipos de dados para a implementação de uma aplicação voltada à contabilidade. Durante essa análise, você questiona qual tipo de dados uma variável deve utilizar para representar o número 10, visando à redução do custo de memória do computador. A) Int. B) Float. C) Long int. D) Char. E) Double. 2) O tipo int é utilizado exclusivamente para números naturais. O char é utilizado para representar um caractere. As demais opções (long int, double e float) fazem uso de mais memória em comparação ao int. Os tipos de dados booleanos têm características específicas em relação aos outros tipos de variáveis. A partir dessa afirmação, identifique a alternativa que apresenta um exemplo de dados booleanos: A) Verdadeiro ou falso. B) Rua Paulista. C) 2,5. D) 10. E) 01/12/2019. 3) Programas de computador fazem uso de diversas variáveis e operações. Em qual momento uma variável ocupa a memória do computador? A) Durante a programação. B) Durante a compilação do programa. C) Durante a execução do programa. D) Quando se finaliza o programa. E) A variável não ocupa espaço de memória. A utilização de variáveis que consomem pouca memória é de suma importância para o desenvolvimento de aplicações com hardware limitado. Por isso, você precisa poupar memória no sistema de presença de uma universidade, na qual os 4) Dados booleanos são utilizados exclusivamente para demonstrar um estado em contraposição a outro, como verdadeiro/falso. O tipo booleano não poderá receber valores numéricos ou palavras, como as demais opções (Rua Paulista; 2,5; 10; 01/12/2019). As variáveis somente existem quando o programa está em execução, pois nesse momento está sendo utilizado um bloco de memória do computador. Durante a finalização do programa, a memória deverá ser liberada, e não alocada. Durante o desenvolvimento do programa ou a compilação, é verificada a estrutura do código, e não a alocação da variável em memória. computadores utilizados serão reciclados pelos alunos de anos iniciais. A partir das informações anteriores, qual tipo de variável deve ser utilizado para representar uma única letra do alfabeto visando à redução do custo de memória do computador? A) String. B) Char. C) Double. D) Int. E) Float. 5) Durante o desenvolvimento de uma aplicação, faz-se uso de diferentes tipos de dados. Na definição de tipos abstratos de dados (TAD), faz-se referência ao par (v,o). Qual é o significado desse par? A) (versão, operações). B) (versão, oportunidade). C) (variável, operação). D) (variável, oportunidade). E) (variável, ofício). Para a representação de um único caractere, seja ele uma letra, um símbolo ou um número, usa-se o tipo char. O tipo string é capaz de representar uma lista de elementos maiores que um caractere. Os tipos int, float e double são utilizados para representar números. Formalmente, pode-se definir TAD como um par (v,o), em que ‘v’ representa uma ou mais variáveis, e ‘o’ , uma ou mais operações. NA PRÁTICA Diariamente surgem problemas que poderiam ser resolvidos facilmente a partir de soluções simples aplicando-se o uso de tecnologias. No entanto, nem sempre as soluções são baratas. Acompanhe, Na Prática, o caso de um analista de negócios com foco em TI que optou pelo desenvolvimento de uma aplicação com redução de custos a partir do conhecimento e da análise prévia de seu problema. SAIBA + Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Declaração de variáveis Neste vídeo, você assiste a uma explicação sobre o modo de declaração de variáveis, bem como sobre seu uso em português estruturado. Conteúdo interativo disponível na plataforma de ensino! Programa VisualG O programaVisualG é utilizado para o desenvolvimento de softwares em português estruturado. Neste link, você terá acesso a informações do software e a seu download. Conteúdo interativo disponível na plataforma de ensino! Tipos de dados Neste link, você acessa um conteúdo completo sobre os tipos de dados. Conteúdo interativo disponível na plataforma de ensino!
Compartilhar