MATEUS CONRAD BARCELLOS DA COSTA. Algoritmos e Estruturas de Dados

Tamanho: px
Começar a partir da página:

Download "MATEUS CONRAD BARCELLOS DA COSTA. Algoritmos e Estruturas de Dados"

Transcrição

1 MATEUS CONRAD BARCELLOS DA COSTA Algoritmos e Estruturas de Dados

2 [ Serra, ES ] [ 2008 ] 2

3 Referências utilizadas na elaboração deste material 1. LISKOV B. Data Abstraction and Hiararchy. In OOPSLA87: Conference on Object Oriented Programming Systems Languages and Applications. Addendum to the proceedings on Object-oriented programming systems, languages and applications, TENENBAUM A. M. Data Structs using C. Prentice Hall Int. Editions, ZIVIANI N. Projeto de Algoritmos. Segunda Edição. Pioneira,

4 Meu nome é Mateus Barcellos Costa, sou professor e pesquisador do Ifes desde Atuo na área de Engenharia de Software e em disciplinas de Programação. Se você quiser mais informações sobre mim e sobre os trabalhos que desenvolvo, pode visitar minha página pessoal em Produzi o material que ora lhe apresento como instrumento básico para o estudo da disciplina de Técnicas de Programação Avançada. Nesta disciplina iremos aprofundar nossos conhecimentos em Programação de Computadores usando uma linguagem imperativa. Exemplos destas linguagens são C e Pascal. Iremos adotar a linguagem C, em nossos exemplos e implementações. No entanto, é preciso que você saiba que os conceitos estudados aqui vão além da linguagem e podem ser aplicados em diversos cenários, na programação e na Engenharia de Software como um todo. 4

5 Sumário M. B. Costa Algoritmos e Estruturas de Dados 1 Abstração de dados Introdução Conceitos de abstração de dados Abstração em Computação Abstração de Procedimentos Tipos Abstratos de Dados Implementação de Tipos Abstratos de Dados Avaliação de Implementações de Tipos Abstratos de Dados Tipos Abstratos de Dados Fundamentais Pilhas Especificação do TAD Pilha Implementação de Pilhas em Arranjos Filas Especificação do TAD FILA Implementação de Filas em arranjos com deslocamento Implementação de Filas com Arranjos circulares Implementação de TADS com alocação dinâmica de memória Revisão de Alocação Dinâmica de Memória Implementação do TAD Pilha Implementação do TAD Fila Listas e Árvores Listas Circulares Lista Circular Duplamente encadeada Árvores Binárias Árvore Binária de Pesquisa O TAD Árvore Binária de Pesquisa Implementação do TAD árvore Binária de Pesquisa Pesquisa em Memória Primária Pesquisa Sequencial Implementação da Pesquisa Seqüencial Tempo de execução de algoritmos Pesquisa Binária Tabelas Hash Operações de Inserção e Pesquisa em Tabelas Hash

6 4.3.2 Tratamento de Colisões Tratamento de Colisão usando endereçamento Aberto Ordenação em Memória Primária Conceitos Básicos de ordenação Operações Típicas de processos de Ordenação Métodos de Ordenação Ordenação por Seleção Método da Inserção Método da Bolha Desempenho dos métodos de Seleção, Inserção e Bolha Método de Shell O Método Quicksort

7 1 ABSTRAÇÃO DE DADOS Olá! Neste Capítulo iremos discutir e aprender sobre Abstração de Dados. Abstração de Dados é uma técnica de programação que visa simplificar o desenvolvimento de programas. Sua aplicação pode se dar no desenvolvimento de programas menores. Mas podemos afirmar que seria impossível o desenvolvimento de sistemas que temos hoje, com milhões de linhas de código, sem o uso de abstração de dados. 1.1 INTRODUÇÃO Um programa de computador desenvolvido para atender alguma finalidade prática é, normalmente, um artefato complexo. Por esse motivo, a atividade de desenvolvimento desses artefatos, a programação de computadores, está entre as atividades mais complexas desempenhadas pelo homem. Se você cursou disciplinas introdutórias de programação, pode estar se questionando: Ora, desenvolver um programa não é tão complexo assim! Basta compreender o problema, suas entradas e suas saídas e construir a solução usando uma linguagem de programação. Simples não? Não! A história da programação tem dado provas que programar não é tão simples assim. Figura 1.1: O Gap Semântico. Programar é uma atividade complexa por diversos aspectos, tanto de cunho teórico quanto prático. Dentre estes aspectos destacamos os seguintes: 1. Programar um computador significa desenvolver programas de computadores (formais e precisos) para atender a finalidades práticas definidas em termos de conceitos do mundo real (informais e imprecisos). Existe um abismo entre o mundo dos problemas reais e o mundo das soluções. Esse abismo é chamado na computação de gap semântico. Transpor o abismo é um dos desafios centrais da programação de computadores e da Engenharia de Software como um 7

8 todo. A Figura 1.1 é uma alegoria que busca mostrar a função do desenvolvedor de software: Transpor o abismo entre o mundo informal (dos problemas) e o mundo formal (das soluções computacionais). Nessa transposição existem muitos desafios e perigos que podem dificultar a trajetória do desenvolvedor. 2. Muitas vezes, em disciplinas iniciais de programação, deparamo-nos com o desenvolvimento de programas mais simples, de cunho didático. Por exemplo, programas para calcular médias ou somatórios. Em outros momentos fazemos programas para aprender a usar um certo mecanismo, por exemplo, apontadores. Aqui, estamos nos referindo a programas de computadores para ajudar pessoas a resolverem problemas do mundo real, problemas grandes e complexos! Exemplos desses problemas incluem: a. Gerenciar as operações financeiras de uma empresa; b. Controlar uma aeronave; c. Controlar os trens de uma malha ferroviária; d. Produzir edições diárias de um jornal; e. Gerenciar o processo de produção de um filme. 3. Problemas como esses não são simples de se resolver. Conseqüentemente, programas voltados para essas finalidades são complexos, levam muito tempo para ficar prontos, têm de ser desenvolvidos por uma equipe de pessoas, utilizando diversas tecnologias e seguindo um processo de desenvolvimento sistemático. 4. Para atender às funcionalidades esperadas, um programa deve apresentar um conjunto de características que juntas vão tornar o programa efetivamente útil e determinarão a qualidade do mesmo. Essas características são as seguintes: a. Um programa deve estar correto, livre de erros; b. Um programa deve ser robusto. Um programa robusto ou sistema robusto é aquele que consegue funcionar, mesmo que precariamente, diante de uma adversidade. Por exemplo, suponha que um programa precise dos dados x, y e z para realizar uma tarefa. Se este for robusto, na falta de um dos dados, o programa pode tentar realizar o processamento possível com a ausência dado; c. Um programa deve ser eficiente. A eficiência de um programa está relacionada ao seu tempo de execução (eficiência na execução) ou ao espaço em memória (eficiência na ocupação) de que necessita para executar (área de dados). Para um problema há infinitas soluções (programas). Quanto menores esses valores mais eficiente o programa. Em computação podese verificar se uma solução é ótima (mais eficiente possível) para um problema; d. Um programa deve ser compatível com outros programas; e. Um programa deve ser fácil de usar; 8

9 f. Um programa deve ser portável, podendo funcionar em diferentes plataformas ou sistemas operacionais; g. Um programa deve ser íntegro, ou seja, deve evitar que os dados sejam corrompidos ou violados; h. O processamento realizado pelo programa deve ser verificável; i. O programa ou partes dele devem poder ser utilizados em outros cenários diferentes daquele para o qual o programa foi originalmente desenvolvido. 5. Por último, devemos considerar a atividade de programação como atividade econômica. Assim como outras atividades econômicas, o desenvolvimento de software é regido por leis de mercado que impõem severas exigências aos desenvolvedores. De acordo com essas leis, não basta apenas desenvolver um programa que atenda à finalidade esperada. Esses programas devem ser desenvolvidos dentro dos prazos e custos estabelecidos. Além disso, o programa precisa ter outras características importantes que permitam a sua evolução. Essas características são chamadas de fatores internos. São eles: a. Facilidade de manutenção; b. Facilidade de evolução; c. Fácililade de entendimento; d. Modularidade. Pelos motivos discutidos acima, o desenvolvimento de programas requer a aplicação de princípios, métodos e técnicas que diminuam a complexidade desse desenvolvimento. A Abstração de Dados envolve uma série de conceitos e princípios para esse fim. A seguir discutiremos esses conceitos. Atividade 1 Nesta introdução foram levantados cinco aspectos que tornam o desenvolvimento de software uma tarefa difícil. Para atacar esses aspectos e tornar o desenvolvimento de software mais simples são consideradas três dimensões: Processo de desenvolvimento, Pessoas (partes interessadas: clientes, desenvolvedores) e Tecnologias de desenvolvimento. Releia os cinco motivos e tente escrever um texto resumido, estabelecendo uma relação entre esses 5 motivos e essas três dimensões. 1.2 CONCEITOS DE ABSTRAÇÃO DE DADOS Abstração em Computação A abstração é um dos conceitos mais importantes da computação. Sem o uso deste conceito podemos afirmar que a evolução apresentada pela computação teria sido mais lenta. Segundo o dicionário Michaelis, temos a seguinte definição para a palavra Abstração: 9

10 1. O ato ou efeito de abstrair. Consideração das qualidades independentemente dos objetos a que pertencem. Abstrair: Considerar um dos caracteres de um objeto separadamente;2. Excluir, prescindir de. A finalidade principal de uso de abstração em qualquer área do conhecimento é colocarmos foco em um subconjunto dos aspectos de um sistema ou processo complexo. Considere, por exemplo, o processo de pintar um quadro. A Figura 1.2 mostra, à esquerda um esquema inicial mostrando as linhas principais do quadro que se encontra do lado direito (A Virgem, o Menino e Sant Ana, Leonardo Da Vinci). Figura 1.2: Abstração na Pintura. Observe que, no desenho, as proporções, os detalhes das posturas e feições são já determinados. Esse processo ajuda o pintor pois, no momento da idealização do quadro, ele não precisa se preocupar com outros aspectos complexos, como cores, nuances de sombras e reflexos, para definir a estrutura e a sua aparência geral. Podemos dizer então que o desenho à esquerda é uma abstração do quadro. Em computação, abstração também possui finalidades semelhantes. Em programação, especificamente, esse conceito está presente quase o tempo todo, seja nas construções existentes nas linguagens, seja nos métodos de programação empregados. Uma das principais abstrações das linguagens de programação é o conceito de variável. Uma variável é um conceito abstrato que esconde diversos aspectos técnicos que não interessam ao programador. Quando declaramos uma variável em um programa, essa declaração implica em coisas que não irão interferir no seu desenvolvimento. Por exemplo, por trás de uma variável do tipo inteiro em C, (ex. int x;), estão escondidas as características físicas do armazenamento da variável em memória, a saber: - A forma de representação de números inteiros usando base 2 (por exemplo, complemento de 2); - O padrão usado pelo hardware (ex. little endian, big endian); - O número de bytes que uma variável do tipo inteiro ocupa; - O endereço da variável na memória principal; - O conjunto de bits responsável por armazenar o sinal do número inteiro. 10

11 Para o programador em C, geralmente, nenhuma dessas informações é importante. O que o programador deseja é utilizar a variável realizando as operações permitidas aos números inteiros (operações aritméticas e comparações), atribuir, recuperar e modificar o valor contido na variável. Assim podemos dizer que uma variável permite ao programador abstrair-se de detalhes que não interessam e não irão influenciar no comportamento do programa. Atividade 2 Os itens 1,2 e 3 são todos abstrações. Para cada um deles descreva os aspectos que estão sendo escondidos e os aspectos que realmente importam ao programador: 1. O comando if(){.. else{.. 2. um arquivo 3. a função scanf Abstração de Procedimentos Podemos afirmar que a grande maioria dos elementos de linguagem utilizados em uma linguagem de programação de alto nível são abstrações. Essas abstrações facilitaram o desenvolvimento de programas mais complexos e sofisticados, evitando que programadores precisassem manipular bits e endereços de memória e interagir diretamente com o sistema operacional. Uma outra abstração de programação importante é a Abstração de Procedimento. Abstração de Procedimento A abstração de procedimento permite que o programador crie, ele mesmo, sua forma de abstrair, utilizando os comandos disponíveis na linguagem. A possibilidade de criar procedimentos permite ao programador criar funcionalidades mais abstratas que escondem a seqüência de operações necessária para a realização de uma tarefa complexa. Por exemplo, sabemos que na linguagem C não existe um comando que seja capaz de ordenar um vetor de inteiros em ordem crescente. Seria muito bom que pudéssemos contar com esse comando, certo? Mas, como não temos esse comando, iremos criar uma função (abstração de procedimento) que realize essa tarefa para nós. A função ordena na Figura 1.3 é essa abstração. 11

12 void ordena(int a[], int tamanho) { int i, j, valor; for(i = 1; i < tamanho; ++i) { value = a[i]; for (j = i - 1; j >= 0 && a[j] > value; --j){ a[j + 1] = a[j]; a[j+1] = valor; Figura 1.3: Função ordena: Cria uma abstração do procedimento de ordenação. Após a implementação da função ordena, quando o programador precisar ordenar um vetor, basta que ele invoque a função, passando os parâmetros necessários. Ou seja, ao usar o procedimento, o programador irá se preocupar apenas com o que a função faz e não mais com os detalhes de sua implementação. Uma abstração de procedimento deve realizar uma tarefa (por exemplo, ordenar um vetor de inteiros) que deve ser independente da forma como este vai ser implementado. O programador deve antes de tudo ver o procedimento como uma caixa preta, cuja especificação deve conter três elementos básicos (Figura 1.4): Entrada: O conjunto de dados de entrada necessário; Saída: O conjunto de dados produzido pelo procedimento; Função: A descrição do que o procedimento faz. ENTRADA FUNÇÃO SAÍDA Figura 1.4: Os elementos considerados na definição de um procedimento. Na especificação do procedimento, o programador não deve estar preocupado com a implementação, mas sim com o comportamento (função) do mesmo. Qualquer implementação que realize a função especificada irá servir como solução. Para o caso da ordenação, veremos adiante neste curso que existem diferentes métodos de ordenar um vetor. O método utilizado na função ordena se chama ordenação por inserção. A implementação interna poderia ser substituída por qualquer outro método de ordenação. A própria linguagem C oferece em sua biblioteca padrão stdlib, uma função chamada qsort, que pode ser usada para ordenar vetores. Essa função utiliza um outro método de ordenação muito conhecido e também muito rápido, chamado de Quick Sort. 12

13 Atividade 3: M. B. Costa Algoritmos e Estruturas de Dados 1. Suponha que você tenha disponíveis as seguintes funções em C: Int CalculaMedia(int *notas); Void DeterminaMaiorEMenorNotas(int *v, int * maior, int *menor); Void lenotas(int *notas); Void MostraResultados(int media,int maiornota, int menornota); Utilizando essas funções, desenvolva um programa em C que leia as notas de 5 turmas e para cada uma delas, imprima a média, a maior e a menor nota Tipos Abstratos de Dados A abstração de dados visa aos mesmos objetivos que a abstração de procedimentos, mas com relação às estruturas de dados utilizadas nos programas. A abstração de dados visa criar novos tipos de dados definidos em temos de seu comportamento. Esses novos tipos são chamados de Tipos Abstratos de Dados - TAD. É muito importante que você perceba que um tipo abstrato de dados não se resume a uma nova estrutura de dados. Vamos então discutir um pouco sobre essa diferença. Primeiramente, uma estrutura de dados pode ser definida simplesmente como uma variável capaz de armazenar mais de um valor simultaneamente. Assim, um vetor, uma matriz ou um registro (struct em C) são exemplos de estruturas de dados. A combinação desses elementos em estruturas mais complexas dá origem a outras estruturas de dados. A Figura 1.5 apresenta as declarações de struct ponto e struct reta, como exemplos de tipos de estruturas de dado. struct ponto{ float x, y; ; struct reta { struct ponto a,b; ; Figura 1.5: Estruturas de Dados ponto e reta. Ao definir a struct ponto, passamos a contar com mais uma alternativa para definição de tipos de variáveis e, conseqüentemente, para a composição de novos tipos de estruturas. Assim a struct reta foi definida como uma composição de duas variáveis do tipo struct ponto. Essas estruturas podem ser usadas para declarar tanto variáveis como argumentos de funções. Em C temos ainda a cláusula typedef, que permite definir o nome do novo tipo. Nesse caso, não precisamos usar a palavra reservada struct na declaração de variáveis do tipo definido. Na Figura 1.6 temos o uso de 13

14 typedef. Veja que na definição do tipo Reta, o nome Ponto é usado sem a palavra reservada struct. typedef struct { float x, y; Ponto; typedef struct { Ponto a,b; Reta; Figura 1.6: Definição dos tipo Reta e Ponto. Estrutura de Dados versus Tipo Abstrato de Dados A definição de uma estrutura de dados se preocupa em demonstrar como o objeto é representado na memória de um computador (representação). Nessa definição são considerados aspectos do tipo: quais as informações que serão armazenadas ali e qual a quantidade destas informações. A definição de um Tipo Abstrato de Dados segue uma abordagem diferente. Essa definição é feita em termos das operações que podem ser realizadas sobre o tipo. A definição de um Tipo Abstrato de Dado (TAD) é chamada de especificação e consiste, basicamente, em definir as operações relacionadas ao tipo. Dizemos que essas operações definem o comportamento do TAD. Vamos aplicar o conceito de TAD considerando os objetos Reta e Ponto. Um passo importante na definição do TAD, que já ajuda na programação de uma maneira geral, é que não conseguimos defini-lo sem conhecermos a sua finalidade e o contexto no qual será usado. Em nosso exemplo precisamos saber para quê? nós queremos um ponto e uma reta. Geralmente essa informação é conseguida a partir do enunciado do problema. Assim, vamos supor a seguinte descrição para o nosso problema envolvendo retas e pontos: Problema A. É necessário um programa de computador que realize operações geométricas envolvendo pontos e retas localizadas no plano cartesiano. O programa deve permitir: calcular a distância do ponto até a origem do plano cartesiano; calcular a distância entre dois pontos; dada a representação da reta por dois pontos, calcular o ângulo de inclinação da reta, fornecer os parâmetros a e b correspondentes a equação da reta ax + b. Determinar a distância de uma reta a um ponto. Evidentemente, o programa deve permitir a leitura e impressão de pontos e retas conforme a necessidade das operações. Com base na descrição acima podemos identificar a necessidade do TAD ponto e do TAD Reta, bem como suas operações. Essas operações aparecem sublinhadas no texto do problema e são apresentadas nas Figuras 1.7 e 1.8. Operações TAD Ponto: - Calcular Distância do ponto até a Origem do plano cartesiano - Calcular Distância 14 até outro ponto - Ler um ponto - Imprimir um ponto

15 Figura 1.7: operações do TAD Ponto para o problema A. Operações TAD Reta: - Calcular o ângulo de inclinação da reta - Calcular os parâmetros a e b - Calcular a Distância da reta a até um ponto - Ler uma reta representada por dois pontos - Imprimir uma reta representada por dois pontos Figura 1.8: operações do TAD Reta para o problema A. Agora, considere que estejamos desenvolvendo um programa para o problema abaixo: Problema B. É necessário um programa de computador para apresentar graficamente figuras geométricas formadas por pontos e retas, usando o monitor do computador como plano. O programa deve permitir: ler um ponto, plotar um ponto na tela, ligar dois pontos por um segmento de reta; dada uma reta passando por esse ponto, deslocar um outro ponto com base na equação dessa reta; dada uma reta representada por dois pontos, plotar esta reta no monitor; dada uma reta e um valor d, criar uma reta paralela à reta dada a uma distancia d da reta. As operações necessárias aos TAD Ponto e Reta neste problema são apresentadas nas Figuras 1.9 e Operações TAD Ponto: - Ler um ponto - Plotar um ponto - Ligar dois pontos - Deslocar um ponto Figura 1.9: operações do TAD Ponto para o problema B. Operações TAD Reta: - Ler uma Reta 15 - Plotar uma Reta - Criar Reta Paralela

16 Figura 1.10: operações do TAD Reta para o problema B. Note que nos dois problemas foram definidos os tipos Ponto e Reta. No entanto, a abstração necessária difere de um problema para o outro, interferindo na definição das operações. Embora existam essas diferenças, iremos sempre tentar criar abstrações mais genéricas o quanto for possível. Quanto mais genérico um TAD, maior o um número de problemas em que esse poderá ser aplicado. Embora as operações não informem nada a respeito da representação interna de um TAD, elas fornecem ao programador tudo o que ele precisa para manipular o TAD. As operações de um TAD especificam a sua interface com o restante do programa. Isso significa que Qualquer ação relacionada ao TAD deve ser feita mediante uma de suas operações. Temos como resultado prático que o programador, ao usar o TAD, não vai precisar se preocupar com sua implementação interna. Iremos agora analisar esse aspecto considerando os TAD Ponto e Reta e o problema A. Na implementação, ponto e reta foram definidos e implementados, originando dois módulos independentes: o módulo Ponto e o módulo Reta. Cada módulo em C é normalmente implementado por dois arquivos: o arquivo.h e o arquivo.c. No arquivo.c teremos a implementação das operações do TAD e no arquivo.h teremos a especificação da interface do TAD. A Figura 1.11 e a Figura 1.12 apresentam as interfaces dos módulos Ponto e Reta, respectivamente. // interface do Tad Ponto: ponto.h typedef struct ponto { int x, int y; Ponto; void lerponto(ponto *); void distanciaorigem(ponto); void distancia2pontos(ponto,ponto); Figura 1.11: Interface do TAD Ponto. // interface do Tad Reta: Reta.h typedef struct reta { struct ponto a,b; Reta; void lerreta(reta *); void distanciaretaponto(reta,ponto); void InclinacaoReta(Reta); void equacaoreta(reta); 16

17 Figura 1.12: Interface do TAD Reta. Com a implementação dos TADs Ponto e Reta concluídas e devidamente testadas, qualquer outro módulo do programa poderá utilizar esses tipos por meio das operações definidas para os mesmos. Quando um módulo A utiliza um módulo B em programação, dizemos que o módulo A é cliente do módulo B. Essa relação de clientela entre os módulos (ou TADs) de um programa pode ser representada graficamente por meio de um diagrama de estrutura modular - DEM. Diagrama de Estrutura Modular Um diagrama de estrutura modular é formado por retângulos e linhas direcionadas relacionando os retângulos. Cada retângulo representa um módulo. As linhas direcionadas significam cliente de e indicam o acionamento de operações contidas no módulo apontado pelo módulo cliente. Esses digramas também são chamados diagramas hierárquicos pois apresentam a hierarquia dos módulos, iniciando por um módulo que inicia o programa e aciona os demais módulos. Como exemplo, suponha que tenhamos também, junto aos módulos Ponto e Reta, um módulo chamado principal. Esse módulo é cliente dos módulos Ponto e Reta. A Figura 1.13 a seguir ilustra o DEM deste programa. O módulo que inicia o programa é o módulo principal (e deve conter uma função main() ). Ele aciona as operações tanto do módulo ponto quanto do módulo reta. Reta, por sua vez, também é cliente do módulo ponto. Ponto Reta Principal Figura 1.13: DEM com módulos Ponto Reta e Principal. A Figura 1.14 ilustra a implementação de um módulo Principal. Note que a única forma de acesso aos TADs Ponto e Reta é por meio das operações definidas em suas respectivas interfaces. Use diagramas de estrutura modular sempre que for iniciar um novo projeto. Defina os TADs e estabeleça o relacionamento entre eles por meio de DEMs. Junto às linhas, você pode especificar as operações do TAD que são acionadas pelo cliente. Isso vai ajudar você na especificação dos TADs. Atividade 4 Implementar as operações do TadPonto e do TadReta considerando o 17

18 enunciado do problema 1, da Seção do texto, e desenvolver um programa usando a função principal (do quadro a seguir) de forma a testar as operações. void principal() { char opcao; Ponto p1,p2; Reta r1; printf("1- Calcular Distância até a origem.\n"); printf("2- Calcular Distância entre pontos.\n"); printf("3- Calcular Distância de uma reta a um ponto.\n"); printf("4- Determinar inclinação da reta.\n"); printf("5- Determinar equação da reta.\n"); printf("0- Sair.\n"); printf("informe a opção Desejada: "); do{ opocao = getchar(); switch(opcao){ case '1': lerponto(&p1); distanciaorigem(p1); break; case '2': lerponto(&p1); lerponto(&p2); distancia2pontos(p1,p2); break; case '3': lerreta(&r1); lerponto(&p1); distanciaretaponto(r1,p1); break; case '4': lerreta(&r1); inclinacaoreta(r1); break; case '5': lerreta(&r1); equacaoreta(r1); break; default: printf("informe uma Opção Válida."); while(opcao!='0'); int main(){ principal(); return 0; Figura 1.14: Módulo Principal para o Problema A. Até o momento, em nosso exemplo envolvendo Ponto e Reta, não abordamos a questão de como as operações serão implementadas propositalmente. É que até a parte que apresentamos do desenvolvimento não precisamos saber mesmo. Você por acaso lembra como se calcula a distância entre dois 18

19 pontos? E a distância entre uma reta e um ponto? Pois bem, o importante é que você tenha compreendido a discussão feita e o exemplo dado, mesmo sem saber responder essas duas perguntas. Assim espero! Implementação de Tipos Abstratos de Dados Um dos principais benefícios da abstração de dados é separar o comportamento do TAD, especificado por meio da definição de suas operações, da sua implementação. Em nosso exemplo, o que definimos a respeito dos TAD Ponto e Reta foi o seu comportamento, as suas operações. Nesta seção, discutiremos melhor como separar em um projeto a definição do comportamento e da implementação de um TAD. O projeto completo de um TAD consiste de dois passos: 1. Especificação - Consiste na especificação do comportamento do TAD; 2. Implementação Implementação das operações e estruturas de dados. Especificação A especificação de um TAD descreve o que TAD faz, mas omite informações sobre como o mesmo é implementado. Por omitir detalhes de implementação, uma única especificação permite muitas implementações diferentes. A especificação é feita por meio da definição das operações do TAD. Para detalhar melhor cada uma destas operações, devemos estabelecer, para cada operação, dois elementos: - Pré-condições: definem as condições necessárias para que a operação possa ser realizada. Por exemplo, suponha que desejamos especificar o TAD Conjunto com a operação listarconjunto. Uma pré-condição para essa operação é que o Conjunto não esteja vazio. - Pós-condições: definem o estado do TAD após a execução da operação,por exemplo, suponha a operação inserirelemento no TAD conjunto. Uma pós-condição para essa operação seria: elementos no conjunto = elementos no conjunto + novo elemento. A Figura 1.15 ilustra a definição do TAD conjunto. TAD Conjunto: Operações: inserirelemento - Pré-condições: conjunto cheio == FALSO - Pós Condições: elementos no conjunto = elementos do conjunto + novo elemento listarconjunto 19 - Pré-Condições: conjuntovazio == FALSO - Pós-Condições: não há

20 Figura 1.15: Especificação do TAD Conjunto. Implementação Um TAD é implementado por um módulo de um programa. Uma única especificação permite diferentes implementações para um mesmo TAD. Uma implementação está correta se esta provê o comportamento especificado para o TAD. Implementações corretas podem diferir uma da outra, por exemplo, em termos do algoritmo ou da estrutura de dados que elas usam. Essas diferenças interferem na eficiência (desempenho em tempo de execução, ou ocupação de espaço) apresentado pelo TAD para realização das operações. Encapsulamento Para uma abstração funcionar corretamente, a sua implementação deve ser encapsulada. Se a implementação for encapsulada, nenhum outro módulo do programa vai depender de detalhes de implementação do TAD. Encapsulamento garante que módulos do programa podem ser implementados e re-implementados independentemente, sem afetar os outros módulos do programa. O encapsulamento geralmente é conseguido por meio da separação da interface e da implementação do módulo. Conforme já vimos anteriormente, em C a implementação de um TAD por meio de um módulo consiste em duas partes: a especificação da interface do módulo por meio do arquivo header ( com extensão.h) e da implementação das operações por meio de um arquivo com extensão.c Avaliação de Implementações de Tipos Abstratos de Dados É fundamental para um programador saber criticar e avaliar a qualidade de uma implementação! Uma implementação baseada em Abstração de Dados é um indicativo de boa qualidade. Nesta Seção, discutiremos elementos que permitem que você verifique se uma implementação realmente está de acordo com essa técnica. Embora a linguagem C não ofereça um mecanismo que impeça realmente que o programador tenha acesso à estrutura interna do TAD, esta é uma regra fundamental e deve ser respeitada pelo programador. Esta regra ou característica de TADs é o encapsulamento, discutido na seção anterior. Dizemos que um TAD é encapsulado por suas operações no sentido de que a estrutura interna do TAD fica preservada e invisível ao restante do programa. Violar essa regra significa não usar corretamente a Abstração de Dados. Localidade O maior benefício do encapsulamento chama-se princípio da Localidade. 20

21 Esse princípio permite que um programa seja implementado, entendido e modificado um módulo de cada vez. A localidade aumenta a qualidade do software que está sendo desenvolvido. Dentre os benefícios oriundos do princípio da localidade temos: 1. O programador de uma abstração sabe o que é necessário pelo que está descrito na especificação. Dessa forma, ele não precisa interagir com programadores de outros módulos (ou, pelo menos, essa interação vai ser bem limitada). 2. De forma análoga, o programador de um módulo que usa a abstração sabe o que esperar desta abstração, apenas pelo comportamento descrito em sua especificação. Uma ferramenta que pode contribuir para esse entendimento é a documentação do TAD. Ou seja, a explicação sobre o seu funcionamento e sobre como utilizá-lo. Procure sempre fazer uma boa documentação do TAD. Essa documentação pode vir como um documento à parte que acompanha o módulo. 3. É necessário apenas o raciocínio local (por módulo), para saber o que o programa faz e se está fazendo a coisa certa. Para estudar e compreender o programa, podemos dividi-lo em módulos, e analisar um módulo de cada vez. Em cada caso, preocupamo-nos em saber se o módulo faz o que é suposto que faça. Ou seja, se ele cumpre o que está na especificação. Pode-se assim limitar a atenção para um módulo, ignorando tanto os módulos usados por este quanto os que o utilizam. Os módulos que utilizam o módulo estudado podem ser ignorados porque dependem apenas de sua especificação e não da sua implementação. Os módulos utilizados são ignorados, raciocinando-se sobre o que eles fazem utilizando apenas sua especificação em vez de sua codificação. Com isso, tem-se uma grande economia de esforço, dado que as especificações são muito menores que as implementações. Observandose apenas as especificações evita-se também um efeito cascata. Por exemplo, se tivermos que olhar o código do módulo que utilizamos, teremos que olhar também o código dos módulos que são utilizados pelos módulos que utilizamos e assim por diante. 4. Finalmente, a modificação do programa pode ser feita módulo por módulo. Se uma abstração particular necessita ser reimplementada para prover um melhor desempenho, corrigir um erro ou prover uma nova funcionalidade, o módulo implementado anteriormente pode ser trocado por uma nova implementação sem afetar os outros módulos. Prototipagem Localidade também provê uma base firme para a prototipação ou prototipagem. Um protótipo é uma implementação inicial, rudimentar e incompleta de um programa a ser desenvolvido. Se mantivermos o 21

22 princípio da localidade no desenvolvimento do protótipo, essa implementação inicial pode ir sendo completada ou substituída por implementações melhores sem grande esforço nem re-trabalho. Localidade também provê suporte para evolução. Abstrações podem ser utilizadas nesse caso para encapsular modificações potenciais no programa. Por exemplo, suponha que desejamos um programa para ser executado em diferentes máquinas. Podemos tratar esse problema inventando abstrações que escondam as diferenças entre as máquinas de forma que, para mover o programa para uma máquina diferente, apenas essas abstrações precisem ser reimplementadas. Um bom princípio de projeto é pensar sobre modificações esperadas e organizar o desenvolvimento utilizando abstrações que encapsulem as mudanças. Domínio da complexidade Os benefícios da localidade são particularmente importantes para a abstração de dados. Estruturas de dados são muitas vezes complicadas e a visão mais abstrata mais simples provida pela especificação torna o resto do programa mais simples. Ainda, mudanças nas estruturas de armazenamento são uma das principais formas de evolução de programas. Portanto, os efeitos dessas mudanças devem ser minimizados encapsulando essas estruturas de dados em abstrações de dados. Se avaliarmos um programa segundo o critério da abstração de dados, devemos observar os seguintes fatores: 1. Os TADs estão realmente encapsulados? a. O entendimento de cada módulo do programa independe dos demais módulos? b. O efeito cascata é evitado na depuração? c. É possível reimplementar um módulo sem afetar os outros? 2. Potenciais mudanças foram previstas no projeto do TAD? 3. Os TADs oferecem abstrações suficientemente simples das estruturas de dados que encapsulam? Atividade 5 Os códigos a seguir especificam as interfaces de dois módulos: Aluno e Turma. /**************** aluno.h *******************/ typedef struct aluno{ char nome[30]; int matricula; int cdgcurso; 22

23 Aluno; void lealuno(aluno *); void imprimealuno(aluno); void AlteraAluno(Aluno *); /******************* turma.h *****************/ #include "aluno.h" #define MAXTURMA 100 typedef struct turma { int nalunos; Aluno alunos[maxturma]; Turma; void inserealuno(turma *,Aluno); /*insere o aluno passado como paramentro na turma */ void localizaaluno(turma *, char *); /* localiza um aluno na turma pelo nome */ void imprimeturma(turma); void atualizaalunodaturma(turma *, char *); Agora, suponha que tenhamos o seguinte módulo principal, utilizando esses módulos: /************ Modulo Principal **************/ #include "turma.h" Turma turma1; void principal(){ int opcao,i; aluno a; char nome[30]; do{ scanf("%d",&opcao); switch(opcao){ case 1: /* cadastrar aluno */ lealuno(&a); inserealuno(&turma1,a); break; case 2: /* imprimir os dados de um aluno cujo nome é xxx*/ scanf("%s",nome); a= localizaaluno(&turma1, nome); printf("%s - %d - %d",a.nome, a.matricula,a.cdgcurso); break; case 3: /* imprimir turma */ for (i=0;i<turma.nalunos;i++) imprimealuno(turma.alunos[i]); break; case 4: /* alterar dados de um aluno */ scanf("%s",nome); atualizaalunodaturma(&turma1, nome); 23

24 break; Tarefas: a) Critique a implementação do módulo acima com base nos critérios de avaliação de TADs discutidos acima. b) Faça uma implementação da operação atualizaalunodaturma, respeitando os princípios de programação baseada em tipos abstratos de dados. Dijkstra ( ) foi, sem dúvida, um dos cientistas que mais contribuíram para o desenvolvimento da Programação de Computadores. Terminamos este capítulo com uma frase dele, que resume o conceito de abstração: O propósito da abstração não é ser vaga, mas sim, criar um novo nível semântico no qual ela possa ser absolutamente precisa. Edsger. W. Dijkstra, The Humble Programmer (O Programador Pobre), Communications of the ACM, 15(10), Reflita sobre isso! 24

PROF. MATEUS CONRAD BARCELLOS DA COSTA TÉCNICAS DE PROGRAMAÇÃO AVANÇADA. [ Serra, ES ] [ 2008 ]

PROF. MATEUS CONRAD BARCELLOS DA COSTA TÉCNICAS DE PROGRAMAÇÃO AVANÇADA. [ Serra, ES ] [ 2008 ] PROF. MATEUS CONRAD BARCELLOS DA COSTA TÉCNICAS DE PROGRAMAÇÃO AVANÇADA [ Serra, ES ] [ 2008 ] CONTEÚDO 1 Abstração de dados... 1 1.1 Introdução... 1 1.2 Conceitos de abstração de dados... 3 1.2.1 Abstração

Leia mais

PROF. MATEUS CONRAD BARCELLOS DA COSTA TÉCNICAS DE PROGRAMAÇÃO AVANÇADA

PROF. MATEUS CONRAD BARCELLOS DA COSTA TÉCNICAS DE PROGRAMAÇÃO AVANÇADA PROF. MATEUS CONRAD BARCELLOS DA COSTA TÉCNICAS DE PROGRAMAÇÃO AVANÇADA VITÓRIA 2008 Governo Federal Ministro de Educação Fernando Haddad CEFETES Diretor Geral Jadir José Pela Diretor de Ensino Denio Rebello

Leia mais

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação Algoritmos e Introdução à Programação Lógica e Linguagem de Programação Prof. José Honorato Ferreira Nunes honoratonunes@softwarelivre.org http://softwarelivre.org/zenorato/honoratonunes Linguagem C Prof.

Leia mais

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura Java First-Tier: Aplicações Orientação a Objetos em Java (I) Paradigmas de Programação Programação Funcional Programação Procedural Programação Orientada por Objetos Grupo de Linguagens de Programação

Leia mais

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objectos - P. Prata, P. Fazendeiro Programação Orientada a Objetos 1.1 - Perspectiva histórica: Conceitos A evolução das linguagens de programação tem-se feito na procura de ferramentas: -cada vez mais próximas da percepção humana - e que

Leia mais

INF1007: Programação 2 9 Tipos Abstratos de Dados. (c) Dept. Informática - PUC-Rio 1

INF1007: Programação 2 9 Tipos Abstratos de Dados. (c) Dept. Informática - PUC-Rio 1 INF1007: Programação 2 9 Tipos Abstratos de Dados (c) Dept. Informática - PUC-Rio 1 Tópicos Módulos e compilação em separado Tipo abstrato de dados Exemplo 1: TAD Ponto Exemplo 2: TAD Círculo Exemplo 3:

Leia mais

Laboratório de Programação II

Laboratório de Programação II Laboratório de Programação II Aula 02 Prof. Diemesleno Souza Carvalho diemesleno@iftm.edu.br http://www.diemesleno.com.br Na aula passada vimos... Na aula passada vimos... 01 Introdução à linguagem C;

Leia mais

Programação: Vetores

Programação: Vetores Programação de Computadores I Aula 09 Programação: Vetores José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/62 Motivação Problema Faça um programa que leia

Leia mais

Programação Estruturada

Programação Estruturada Programação Estruturada Introdução à linguagem C Professores Emílio Francesquini e Carla Negri Lintzmayer 2018.Q3 Centro de Matemática, Computação e Cognição Universidade Federal do ABC Programação estruturada

Leia mais

Aula 1 Conceitos Básicos

Aula 1 Conceitos Básicos Aula 1 Conceitos Básicos Elerson R. S. Santos elerson@dcc.ufmg.br Livro Projeto de Algoritmos Capítulo 1 @ DCC/UFMG O que é um algoritmo? O que é um programa? O que é um TAD? Algoritmos e Estrutura de

Leia mais

Algoritmos e Programação

Algoritmos e Programação Algoritmos e Programação Aula 3 Introdução a Linguagem C Profa. Marina Gomes marinagomes@unipampa.edu.br 1 Aula de Hoje - Criar programas simples em C utilizando a estrutura básica; - Declarar variáveis;

Leia mais

Estrutura de Dados (DPADF 0056)

Estrutura de Dados (DPADF 0056) Estrutura de Dados (DPADF 0056) Aula 2 TADs Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet Prof. Bruno B. Boniati www.cafw.ufsm.br/~bruno

Leia mais

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade. 222222222222222222222222222 8 - FUNÇÕES 81 - Características básicas É um trecho independente de código, com objetivos bem definidos Programas em C, geralmente consistem em várias pequenas funções, ao

Leia mais

Introdução à Programação. Introdução a Linguagem C. Prof. José Honorato F. Nunes

Introdução à Programação. Introdução a Linguagem C. Prof. José Honorato F. Nunes Introdução à Programação Introdução a Linguagem C Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br Resumo da aula Introdução Variáveis Tipos de dados Operadores e Expressões: Operadores

Leia mais

TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TURMA 2008/1 2 PERÍODO MÓDULO 3 AVALIAÇÃO MP2 DATA 2/10/2008 ESTRUTURAS DE DADOS 2008/2

TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TURMA 2008/1 2 PERÍODO MÓDULO 3 AVALIAÇÃO MP2 DATA 2/10/2008 ESTRUTURAS DE DADOS 2008/2 TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TURMA 2008/1 2 PERÍODO MÓDULO 3 AVALIAÇÃO MP2 DATA 2/10/2008 ESTRUTURAS DE DADOS 2008/2 Dados de identificação do Acadêmico: Nome: Login: CA: Cidade:

Leia mais

Aula 11: Desvios e Laços

Aula 11: Desvios e Laços Aula 11: Desvios e Laços Nesta aula explicaremos alguns comandos que podem alterar o fluxo dos seus programas em JavaScript. Você aprenderá a estrutura dos comandos de desvios e laços. Entenderá como funcionam

Leia mais

Tipos Abstratos de Dados

Tipos Abstratos de Dados Tipos Abstratos de Dados Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1 Índice Introdução Definição de Tipos Abstratos de Dados Exemplos de TADs Implementação de TADs Implementação em C Exemplo

Leia mais

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02 Programação 1 Atribuição, operadores aritméticos, entrada de dados Técnico em Eletrônica Semestre 5 02 Armazenando na memória tipo de variável #include #include main() { int ano; Declaração

Leia mais

Aula 12 Tipo Abstrato de Dados. Prof. Me. Sérgio Carlos Portari Jr UEMG Campus de Frutal

Aula 12 Tipo Abstrato de Dados. Prof. Me. Sérgio Carlos Portari Jr UEMG Campus de Frutal Aula 12 Tipo Abstrato de Dados Prof. Me. Sérgio Carlos Portari Jr UEMG Campus de Frutal Representação dos Dados Os dados podem estar representados (estruturados) de diferentes maneiras Normalmente, a escolha

Leia mais

Introdução à Programação em C. Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI

Introdução à Programação em C. Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI Introdução à Programação em C Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI Linguagem C Criada em 1972 para uso no LINUX; Sintaxe base para diversas outras (Java, JavaScript, PHP, C++,

Leia mais

Algoritmos e Estruturas de dados

Algoritmos e Estruturas de dados Algoritmos e Estruturas de dados Listas Encadeadas Prof. Dr. Fábio Rodrigues de la Rocha (Listas Encadeadas) 1 / 21 Definição: Anteriormente estudamos listas encadeadas que foram implementadas como vetores

Leia mais

Conceitos Básicos Linguagem C

Conceitos Básicos Linguagem C Conceitos Básicos Linguagem C PROF. MAURÍCIO A DIAS MACDIASPAE@GMAIL.COM 2 Método Método básico para construção de algoritmos 1. Compreender completamente o problema a ser resolvido, se possível dividindo

Leia mais

Linguagem C Princípios Básicos (parte 1)

Linguagem C Princípios Básicos (parte 1) Linguagem C Princípios Básicos (parte 1) Objetivos O principal objetivo deste artigo é explicar alguns conceitos fundamentais de programação em C. No final será implementado um programa envolvendo todos

Leia mais

P2 Programação II Departamento de Informática/PUC-Rio

P2 Programação II Departamento de Informática/PUC-Rio P2 Programação II 2013.1 Departamento de Informática/PUC-Rio Aluno: Matrícula: Turma: 1. A prova é sem consulta e sem perguntas. A interpretação do enunciado faz parte da prova. 2. A prova deve ser completamente

Leia mais

Variáveis, Tipos de Dados e Operadores

Variáveis, Tipos de Dados e Operadores ! Variáveis, Tipos de Dados e Operadores Engenharias Informática Aplicada 2.o sem/2013 Profa Suely (e-mail: smaoki@yahoo.com) VARIÁVEL VARIÁVEL É um local lógico, ligado a um endereço físico da memória

Leia mais

Motivação. Estrutura de Dados. Motivação. Motivação. Por que estudar os tipos de dados? Duas são as principais preocupações em um projeto de software

Motivação. Estrutura de Dados. Motivação. Motivação. Por que estudar os tipos de dados? Duas são as principais preocupações em um projeto de software Estrutura de Dados Aula 01 -Tipos Abstratos de de Dados Prof. Ms. Luiz Alberto Contato: lasf.bel@gmail.com Motivação Por que estudar os tipos de dados? Duas são as principais preocupações em um projeto

Leia mais

ANHANGUERA ESTRUTURA DE DADOS AULA 02 O QUE É ESTRUTURA DE DADOS? Prof. Thomás da Costa

ANHANGUERA ESTRUTURA DE DADOS AULA 02 O QUE É ESTRUTURA DE DADOS? Prof. Thomás da Costa ANHANGUERA 2015.2 ESTRUTURA DE DADOS AULA 02 Prof. Thomás da Costa thomascosta@aedu.com Recordar é viver Lembrando Programação Estruturada: Estrutura de um programa em C++. Declaração de variáveis. Laços.

Leia mais

Análise e Complexidade de Algoritmos

Análise e Complexidade de Algoritmos Análise e Complexidade de Algoritmos Professor Ariel da Silva Dias Introdução Apresentação Professor Professor Ariel Dias Apresentação Disciplina O que veremos? www.arieldias.com BlackBoard Apresentação

Leia mais

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros Métodos Computacionais Funções, Escopo de Variáveis e Ponteiros Tópicos da Aula Hoje vamos detalhar funções em C Escrevendo funções Comando return Passagem de argumentos por valor Execução de uma função

Leia mais

Conteúdo programático

Conteúdo programático Introdução à Linguagem C Conteúdo programático Introdução à Linguagem C Estrutura de Programas Variáveis, Constantes Operadores, Entrada e Saída de Dados Estruturas de Desvio Estrutura de Múltipla Escolha

Leia mais

Listas Lineares. Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.1

Listas Lineares. Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.1 Listas Lineares Elerson R. S. Santos elerson@dcc.ufmg.br Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.1 http://www2.dcc.ufmg.br/livros/algoritmos/ Listas Lineares Uma das formas mais simples

Leia mais

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO Introdução Criada em 1972, por Dennis Ritchie; Centro de Pesquisas da Bell Laboratories; Para utilização no S.O. UNIX; C é uma linguagem

Leia mais

Algoritmos e Programação

Algoritmos e Programação Algoritmos e Programação Aula 2 Elementos fundamentais de Algoritmos, Conceitos de Variáveis Profa. Marina Gomes marinagomes@unipampa.edu.br 21/03/2017 Engenharia de Computação - Unipampa 1 Aula de Hoje

Leia mais

Aula 12: Funções. CI208 - Programação de Computadores. Prof. MSc. Diego Roberto Antunes

Aula 12: Funções. CI208 - Programação de Computadores. Prof. MSc. Diego Roberto Antunes CI208 - Programação de Computadores Aula 12: Funções Prof. MSc. Diego Roberto Antunes diegor@inf.ufpr.br www.inf.ufpr.br/diegor Universidade Federal do Paraná Setor de Ciências Exatas Departamento de Informática

Leia mais

INTRODUÇÃO À LINGUAGEM C

INTRODUÇÃO À LINGUAGEM C INTRODUÇÃO À LINGUAGEM C Prof. Bruno Feijó, Dept. de Informática, PUC-Rio (2018) C foi criado no início da década de 70, quando os programas mais eficientes eram escritos em linguagem Assembly, bem próxima

Leia mais

INTRODUÇÃO À LINGUAGEM PASCAL PREFÁCIO

INTRODUÇÃO À LINGUAGEM PASCAL PREFÁCIO INTRODUÇÃO À LINGUAGEM PASCAL CESAR BEZERRA TEIXEIRA,MSC PREFÁCIO A linguagem C foi desenvolvida no início da década de 70 por dois pesquisadores do Bell Laboratories, Brian Kernihgan e Dennis Ritchie,

Leia mais

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa? Funções Suponha um conjunto habitacional, com várias famílias...... imagina se todas elas morassem em uma única casa? Funções Programação de Computadores 1 de 28 Funções Na Programação, funções são conjuntos

Leia mais

Programação Básica. Estrutura de um algoritmo

Programação Básica. Estrutura de um algoritmo Programação Básica Estrutura de um algoritmo Código-fonte Como vimos na aula anterior um algoritmo pode ser representado usando um fluxograma Um algoritmo pode também ser representado usando texto Esse

Leia mais

Aula 1 Apresentação do Curso

Aula 1 Apresentação do Curso Departamento de Sistemas de Computação Universidade de São Paulo SSC 502 Laboratório de Introdução a Ciência de Computação I Aula 1 Apresentação do Curso Responsável Prof. Seiji Isotani (sisotani@icmc.usp.br)

Leia mais

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco PONTEIROS E LISTAS Kalinka Regina Lucas Jaquie Castelo Branco kalinka@icmc.usp.br ALOCAÇÃO DINÂMICA DE MEMÓRIA Pode-se assumir que as variáveis declaradas na cláusula variável do pseudo-código do algoritmo

Leia mais

Estrutura de um Algoritmo, Variáveis, Comandos de Entrada e Saída e Expressões Aritméticas

Estrutura de um Algoritmo, Variáveis, Comandos de Entrada e Saída e Expressões Aritméticas Estrutura de um Algoritmo, Variáveis, Comandos de Entrada e Saída e Expressões Aritméticas Estrutura de um Programa em Linguagem Algorítmica Nesse curso nós vamos utilizar a linguagem algorítmica para

Leia mais

BCC202 - Estrutura de Dados I

BCC202 - Estrutura de Dados I BCC202 - Estrutura de Dados I Aula 03: Tipos Abstratos de Dados (TADs) Reinaldo Fortes Universidade Federal de Ouro Preto, UFOP Departamento de Ciência da Computação, DECOM Website: www.decom.ufop.br/reifortes

Leia mais

3. Linguagem de Programação C

3. Linguagem de Programação C Introdução à Computação I IBM1006 3. Linguagem de Programação C Prof. Renato Tinós Departamento de Computação e Matemática (FFCLRP/USP) 1 Principais Tópicos 3.2. Estrutura de Programas e Representação

Leia mais

MODULARIZAÇÃO - PARTE 1

MODULARIZAÇÃO - PARTE 1 AULA 27 MODULARIZAÇÃO - PARTE 1 Os algoritmos que temos construído até então são muito simples, pois resolvem problemas simples e apresentam apenas os componentes mais elementares dos algoritmos: constantes,

Leia mais

Curso de Ciência da Computação Estrutura de Dados Prof. Anselmo C. de Paiva. Cap. 2 Tipos Abstratos de Dados

Curso de Ciência da Computação Estrutura de Dados Prof. Anselmo C. de Paiva. Cap. 2 Tipos Abstratos de Dados Curso de Ciência da Computação Estrutura de Dados Prof. Anselmo C. de Paiva Cap. 2 Tipos Abstratos de Dados Tipos Abstratos de Dados Uma estrutura de dados e uma coleção de funções que operam sobre essa

Leia mais

Lógica de Programação. Profas. Simone Campos Camargo e Janete Ferreira Biazotto

Lógica de Programação. Profas. Simone Campos Camargo e Janete Ferreira Biazotto Lógica de Programação Profas. Simone Campos Camargo e Janete Ferreira Biazotto O curso Técnico em Informática É o profissional que desenvolve e opera sistemas, aplicações, interfaces gráficas; monta estruturas

Leia mais

Introdução aos Algoritmos

Introdução aos Algoritmos Introdução aos Algoritmos Aula 05 Diogo Pinheiro Fernandes Pedrosa http://www2.ufersa.edu.br/portal/professor/diogopedrosa diogopedrosa@ufersa.edu.br Universidade Federal Rural do Semiárido Bacharelado

Leia mais

A Linguagem C. A forma de um programa em C

A Linguagem C. A forma de um programa em C A Linguagem C Criada em 1972 por D. M. Ritchie e K. Thompson. Tornou-se uma das mais importantes e populares, principalmente pela portabilidade e flexibilidade. Foi projetada para o desenvolvimento de

Leia mais

Introdução a Linguagem C. Prof. Me. Hélio Esperidião

Introdução a Linguagem C. Prof. Me. Hélio Esperidião Introdução a Linguagem C Prof. Me. Hélio Esperidião Características de um programa De forma geral a maioria dos programas são compostos por dados de entrada, processamento e dados de saída. Entrada de

Leia mais

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

#include <stdio.h> Void main() { printf( Cheguei!\n); } INTRODUÇÃO A LINGUAGEM C #include Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C ANTES DO C ERA A LINGUAGEM B B foi essencialmente uma simplificação da linguagem BCPL. B só tinha um tipo de dado, que

Leia mais

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. LINGUAGEM C: FUNÇÕES Prof. André Backes FUNÇÃO Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. printf(): função que escreve na tela scanf(): função que lê o teclado

Leia mais

Métodos Computacionais. Tipos Estruturados

Métodos Computacionais. Tipos Estruturados Métodos Computacionais Tipos Estruturados Tipos Estruturados C oferece tipos primitivos que servem para representar valores simples Reais (float, double), inteiros (int), caracter (char) C oferece também

Leia mais

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO RIO GRANDE DO NORTE PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS Docente: Éberton da Silva Marinho e-mail: ebertonsm@gmail.com eberton.marinho@gmail.com

Leia mais

Sub Rotinas. Estrutura de Dados. Prof. Kleber Rezende

Sub Rotinas. Estrutura de Dados. Prof. Kleber Rezende Sub Rotinas Estrutura de Dados Prof. Kleber Rezende Considerações Iniciais Uma dos métodos mais comuns e amplamente utilizados em programação de computadores é o Top-Down. Nesta abordagem um problema é

Leia mais

Prof. Esp. Andrew Rodrigues 1

Prof. Esp. Andrew Rodrigues   1 Prof. Esp. Andrew Rodrigues www.andrewrodrigues.com.br www.andrewrodrigues.com.br 1 PHP em Ação PHP é uma linguagem de programação que pode fazer todo o tipo de coisas: avaliar dados de formulários enviados

Leia mais

Tipos Abstratos de Dados

Tipos Abstratos de Dados Tipos Abstratos de Dados Prof. Jussara Almeida Derivado das transparências do Algoritmos e Estrutura de Dados Algoritmo: Sequência de ações executáveis para a solução de um determinado tipo de problema

Leia mais

1. Selecione a Estrutura de Dados que melhor representa os diretórios ou pastas de arquivos do computador.

1. Selecione a Estrutura de Dados que melhor representa os diretórios ou pastas de arquivos do computador. 1. Selecione a Estrutura de Dados que melhor representa os diretórios ou pastas de arquivos do computador. 1) Fila 2) Pilha 3) Árvore 4) Lista 5) Grafo 2. Selecione a Estrutura de Dados que melhor representa

Leia mais

Linguagem C: Introdução

Linguagem C: Introdução Linguagem C: Introdução Linguagem C É uma Linguagem de programação genérica que é utilizada para a criação de programas diversos como: Processadores de texto Planilhas eletrônicas Sistemas operacionais

Leia mais

Introdução à orientação a objetos

Introdução à orientação a objetos Universidade Federal de Juiz de Fora PET Elétrica Introdução à orientação a objetos Tutor: Francisco José Gomes Aluno: João Tito Almeida Vianna 18/05/2013 1 Programação Estruturada x Orientação a objetos

Leia mais

Introdução aos Algoritmos

Introdução aos Algoritmos Introdução aos Algoritmos Aula 05 Diogo Pinheiro Fernandes Pedrosa http://www2.ufersa.edu.br/portal/professor/diogopedrosa diogopedrosa@ufersa.edu.br Universidade Federal Rural do Semiárido Bacharelado

Leia mais

Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional

Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional Disciplina: Algoritmos e Estruturas de Dados Professor: Flávio Cardeal Lista de

Leia mais

Aula 13 Oficina de Programação Modularização. Profa. Elaine Faria UFU

Aula 13 Oficina de Programação Modularização. Profa. Elaine Faria UFU Aula 13 Oficina de Programação Modularização Profa. Elaine Faria UFU - 2017 O que é modularização? No século XIX, Henry Ford, para baratear e massificar a montagem de carros, criou uma base modular. Esta

Leia mais

Sub-rotinas David Déharbe

Sub-rotinas David Déharbe Sub-rotinas David Déharbe 1 1 Objetivos da aula Os conceitos de sub-rotina, funções e procedimentos; Como usar sub-rotinas em C: parâmetros de sub-rotinas: parâmetros formais e parâmetros efetivos. passagem

Leia mais

6 Alguns conceitos e comandos em programação

6 Alguns conceitos e comandos em programação 6 Alguns conceitos e comandos em programação 6.1 Diretivas Diretivas são instruções que permitem ao programador efetuar algum tipo de modificação à compilação, sendo analisadas e executadas pelo pré-compilador,

Leia mais

Engenharia de Software

Engenharia de Software Sumário Engenharia de Software Modelos de desenvolvimento de software Fases de desenvolvimento Programação modular Abordagem top-down e bottom-up Linguagens de programação: Compilação / Interpretação Aplicação

Leia mais

Programação I Funções. Prof. Carlos Alberto

Programação I Funções. Prof. Carlos Alberto Programação I Funções Prof. Carlos Alberto carlos.batista@facape.br carlos36_batista@yahoo.com.br Funções Funções são blocos de códigos que podem ser nomeados e chamados de dentro de um programa; Funções

Leia mais

Conceitos básicos. Computação eletrônica: Gurvan Huiban

Conceitos básicos. Computação eletrônica: Gurvan Huiban Computação eletrônica: Conceitos básicos Gurvan Huiban ghuiban@cin.ufpe.br Plano de aula 1 Estrutura de um programa em C 2 Variáveis e constantes 3 Comandos de entrada e saída Estrutura de um programa

Leia mais

1 Analise de Sistemas

1 Analise de Sistemas 1 Analise de Sistemas Aula 01 Sumário Capítulo 1 Introdução e Conceitos básicos 1.1 Histórico do Software 1.2 Modelos 1.3 Tipos primitivos de dados 1.4 Tipo Abstrato de dados Comunicação Comunicação cliente

Leia mais

APOSTILA 1 - TUTORIA SISTEMAS OPERACIONAIS

APOSTILA 1 - TUTORIA SISTEMAS OPERACIONAIS APOSTILA 1 - TUTORIA SISTEMAS OPERACIONAIS Objetivos Existe uma grande distância entre os circuitos eletrônicos e dispositivos de hardware e os programas aplicativos em software. Os circuitos são complexos,

Leia mais

Introdução à linguagem de programação C. Alexandre Mota

Introdução à linguagem de programação C. Alexandre Mota Introdução à linguagem de programação C Alexandre Mota acm@cin.ufpe.br Do código-fonte ao executável Nossa preocupação maior neste curso está com o código-fonte. Nossa carta de intenções para com o computador!

Leia mais

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. LINGUAGEM C: FUNÇÕES Prof. André Backes FUNÇÃO Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. printf(): função que escreve na tela scanf(): função que lê o teclado

Leia mais

LINGUAGEM C: COMANDOS DE REPETIÇÃO

LINGUAGEM C: COMANDOS DE REPETIÇÃO LINGUAGEM C: COMANDOS DE REPETIÇÃO Prof. André Backes ESTRUTURAS DE REPETIÇÃO Uma estrutura de repetição permite que uma sequência de comandos seja executada repetidamente, enquanto determinadas condições

Leia mais

Hardware: Componentes Básicos. Sistema de Computador Pessoal. Anatomia de um Teclado. Estrutura do Computador. Arquitetura e Organização

Hardware: Componentes Básicos. Sistema de Computador Pessoal. Anatomia de um Teclado. Estrutura do Computador. Arquitetura e Organização Hardware: Componentes Básicos Arquitetura dos Computadores Dispositivos de Entrada Processamento Dispositivos de Saída Armazenamento Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Sistema de

Leia mais

Vetores são estruturas indexadas utilizadas para armazenar dados de um mesmo tipo: int, char, float ou double. Oexemploaseguirédeumvetordeinteiros:

Vetores são estruturas indexadas utilizadas para armazenar dados de um mesmo tipo: int, char, float ou double. Oexemploaseguirédeumvetordeinteiros: 18 Vetores Ronaldo F. Hashimoto e Carlos H. Morimoto Nessa aula vamos introduzir o tipo vetor. Aofinaldessaaulavocêdeverásaber: Descrever o que são vetores na linguagem C. Declarar vetores. Como acessar

Leia mais

Variáveis e Memória. Revisão. Conceitos. Operações sobre a memória

Variáveis e Memória. Revisão. Conceitos. Operações sobre a memória Variáveis e Memória Revisão Estudamos, na Introdução, que os programas de computador implementam algoritmos, os quais manipulam um conjunto de dados para produzir um resultado. O algoritmo é um conjunto

Leia mais

Modulo 13: para os que ainda tem dúvidas no assunto...

Modulo 13: para os que ainda tem dúvidas no assunto... PROGRAMAÇÃO DE COMPUTADORES V - TCC- 00.323 Modulo 13: para os que ainda tem dúvidas no assunto... Aura -Erick aconci@ic.uff.br, erickr@id.uff.br Roteiro Gabarito da prova Data da vista da P2 e/ou sua

Leia mais

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objectos - P. Prata, P. Fazendeiro Programação Orientada a Objetos 1.1 - Perspectiva histórica: Conceitos A evolução das linguagens de programação tem-se feito na procura de ferramentas: -cada vez mais próximas da percepção humana - e que

Leia mais

Lista de Exercícios sobre Listas Implementadas por Encadeamento

Lista de Exercícios sobre Listas Implementadas por Encadeamento Lista de Exercícios sobre Listas Implementadas por Encadeamento 1) Se você tem de escolher entre uma representação por lista encadeada ou uma representação usando posições contíguas de memória para um

Leia mais

INTRODUÇÃO À LINGUAGEM C

INTRODUÇÃO À LINGUAGEM C INTRODUÇÃO À LINGUAGEM C Prof. Bruno Feijó, Dept. de Informática, PUC-Rio (2018) C foi criado no início da década de 70, quando os programas mais eficientes eram escritos em linguagem Assembly, bem próxima

Leia mais

UNIVERSIDADE DA BEIRA INTERIOR

UNIVERSIDADE DA BEIRA INTERIOR UNIVERSIDADE DA BEIRA INTERIOR Programação e Algoritmos / Programação II 2º Semestre Exame - 1ª chamada Resolução 20/06/2013 1. [2.0 val] Apontadores (Responder esta questão nesta folha e entregar com

Leia mais

5 Comando de Seleção Simples e Composta

5 Comando de Seleção Simples e Composta 5 Comando de Seleção Simples e Composta Ronaldo F. Hashimoto e Carlos H. Morimoto Essa aula introduz o comando de seleção, que permite ao seu programa tomar decisões sobre o fluxo do processamento, ou

Leia mais

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Estruturas de Dados Revisão de Ponteiros Prof. Ricardo J. G. B. Campello Sumário Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Operações Ponteiros e Arranjos

Leia mais

1 Introdução e Conceitos básicos

1 Introdução e Conceitos básicos 1 Introdução e Conceitos básicos Aula 0 Sumário Capítulo 1 Introdução e Conceitos básicos 1.1. Definição 1.. Comandos Básicos 1..1. Comando de saída: impressão na tela 1... Case sensitive 1..3. Função

Leia mais

Variáveis, Comandos de Atribuição e Comando de Entrada e Saída

Variáveis, Comandos de Atribuição e Comando de Entrada e Saída BCC 201 - Introdução à Programação Variáveis, Comandos de Atribuição e Comando de Entrada e Saída Guillermo Cámara-Chávez UFOP 1/1 Estrutura Básica de um programa C I < d i r e t i v a s do pré p r o c

Leia mais

INF 1620 P2-01/11/03 Questão 1 Nome:

INF 1620 P2-01/11/03 Questão 1 Nome: INF 1620 P2-01/11/03 Questão 1 Considere a implementação de uma lista encadeada para armazenar as notas dos alunos de uma turma dada pelo tipo abaixo: struct lista { char nome[81]; int mat; float p1, p2,

Leia mais

Tipos Abstratos de Dados

Tipos Abstratos de Dados Capítulo 3 Tipos Abstratos de Dados A linguagem C possui diversos tipos de dados nativos e disponíveis ao programador como int, float, double, long, char, entre outros. Um programador pode utilizar estes

Leia mais

Métodos Computacionais

Métodos Computacionais Métodos Computacionais Objetivos da Disciplina e Introdução a Linguagem C Construções Básicas Objetivos da Disciplina Objetivo Geral Discutir técnicas de programação e estruturação de dados para o desenvolvimento

Leia mais

<identificador>[<tamanho>]: <tipo>;

<identificador>[<tamanho>]: <tipo>; Vetores e Constantes Imagine uma situação na qual fosse necessário armazenar 100 valores para processamento. Por exemplo, pode ser necessário armazenar as notas de 100 provas de uma turma de alunos. Uma

Leia mais

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica Universidade Federal de Uberlândia Faculdade de Computação Linguagem C: ponteiros e alocação dinâmica Prof. Renato Pimentel 1 Ponteiros 2 Prof. Renato Pimentel 1 Ponteiros: introdução Toda a informação

Leia mais

15/03/2018. Professor Ariel da Silva Dias Algoritmo e Contagem de Instruções. Prof. Ariel da Silva Dias -

15/03/2018. Professor Ariel da Silva Dias Algoritmo e Contagem de Instruções. Prof. Ariel da Silva Dias - Professor Ariel da Silva Dias Algoritmo e Contagem de Instruções 1 Um algoritmo pode ser visto como uma sequência de ações executáveis para a obtenção de uma solução para um determinado tipo de problema.

Leia mais

Algoritmos e Estruturas de Dados I (DCC/003) Variável Indexada Vetor

Algoritmos e Estruturas de Dados I (DCC/003) Variável Indexada Vetor Algoritmos e Estruturas de Dados I (DCC/003) Variável Indexada Vetor 1 Vetores Iremos aprender como armazenar e trabalhar com um grande conjunto de valores no computador Existem várias formas de armazenar

Leia mais

Programação II. Ordenação (sort) Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Ordenação (sort) Bruno Feijó Dept. de Informática, PUC-Rio Programação II Ordenação (sort) Bruno Feijó Dept. de Informática, PUC-Rio Quick Sort (Ordenação Rápida) Algoritmo Quick Sort (recursivo) O algoritmo de Quick Sort foi desenvolvido por Sir Charles Hoare

Leia mais

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador; 1 Microprocessador Um microprocessador é um circuito eletrônico capaz de realizar diversas tarefas conforme os comandos específicos. Para isso ele deve ler esses comandos da memória de programa (ROM) e

Leia mais

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR) Alocação de Memória Linguagem de Programação Estruturada 1 Alocação dinâmica e ponteiros Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR) Sumario Introdução Alocação Estática

Leia mais

Working 03 : Conceitos Básicos II

Working 03 : Conceitos Básicos II Universidade Federal do Espirito Santo Centro Tecnologico Working 03 : Conceitos Básicos II Objetivos: Dominar a construção de estruturas de seleção em C; Aperfeiçoarse na resolução de problemas, da primeira

Leia mais

1. Faça um programa que leia uma string digitada pelo usuário e salve em um arquivo em branco.

1. Faça um programa que leia uma string digitada pelo usuário e salve em um arquivo em branco. Segunda lista de exercícios v100 Engenharia Elétrica - Eletrônica 2º Semestre de 2015 Prof: Daniel Rodrigo Ferraz Bonetti SSC0300 Linguagem de Programação e Aplicações 1 Faça um programa que leia uma string

Leia mais

4ª Lista de Exercícios de Programação I

4ª Lista de Exercícios de Programação I 4ª Lista de Exercícios de Programação I Instrução As questões devem ser implementadas em C. 1. Faça um algoritmo que leia 10 valores inteiros armazenando-os em um vetor e depois calcule a soma dos valores

Leia mais

Lista de Exercícios de Algoritmos - 04 Para cada um dos exercícios abaixo, faça um programa (em laboratório) que teste a função.

Lista de Exercícios de Algoritmos - 04 Para cada um dos exercícios abaixo, faça um programa (em laboratório) que teste a função. Lista de Exercícios de Algoritmos - 04 Para cada um dos exercícios abaixo, faça um programa (em laboratório) que teste a função. Funções e estruturas básicas 1. Faça uma função que recebe a idade de uma

Leia mais

3.1 - Funções para manipular dados de entrada e saída padrão

3.1 - Funções para manipular dados de entrada e saída padrão 1616161616161616161616161616161616161616161616161616 3- ENTRADA E SAÍDA EM C Os principais meios para executar operações de entrada e saída (E/S) são: Entrada e saída pelo console (ou padrão): teclado

Leia mais