Baixe o app para aproveitar ainda mais
Prévia do material em texto
Laboratório de Programação Alocação Dinâmica - Parte II Prof. Daniel Vecchiato daniel@ic.ufmt.br terça-feira, 19 de março de 2013 Conteúdo Abordado • Tipo de dados; • Algoritmos em C e Pascal; • Estruturas de controle; • Estruturas de repetição; • Variáveis compostas homogêneas; • Variáveis compostas heterogêneas; • Modularização: Blocos e Subprogramas; • Parâmetros e formas de passagem; • Recursividade; • Operações com Arquivos. terça-feira, 19 de março de 2013 Conteúdo a ser abordado • Ponteiros; • Alocação dinâmica; • Estruturas de dados dinâmicas: listas lineares; • Métodos simples de ordenação e pesquisa de dados. terça-feira, 19 de março de 2013 Agenda • Revisão; • Ponteiros em funções; • Ponteiros para registros; • Alocação dinâmica; • Exercícios. terça-feira, 19 de março de 2013 Revisão • Ponteiros armazenam endereço de memória. • Antes de atribuir um valor a um ponteiro, ele deve previamente ter um endereço de memória. • O operador & retorna o endereço de memória de uma variável • O operador * acessa o conteúdo do endereço indicado pelo ponteiro • Ponteiros podem ser utilizados para simular a passagem de parâmetro por referência. terça-feira, 19 de março de 2013 Revisão terça-feira, 19 de março de 2013 Revisão terça-feira, 19 de março de 2013 Revisão • O que será impresso? terça-feira, 19 de março de 2013 Revisão Ponteiros e Vetores • Um vetor pode ser atribuído a um ponteiro: • Após a atribuição, pode-se usar p como se fosse um vetor: terça-feira, 19 de março de 2013 Ponteiros em funções • Um ponteiro passado como parâmetro para uma função é uma cópia do ponteiro da chamada de origem. • Alterar o ponteiro em uma função significa alterar sua cópia e não o ponteiro original. terça-feira, 19 de março de 2013 Ponteiros em funções - Exemplo I • O que será impresso no código abaixo? terça-feira, 19 de março de 2013 Ponteiros em funções - Exemplo II • O que será impresso no código abaixo? terça-feira, 19 de março de 2013 Ponteiros Para Registros • Uma variável do tipo struct, é armazenada na memória como qualquer outra variável; • É possível criar um ponteiro para uma variável de um tipo struct; terça-feira, 19 de março de 2013 Ponteiros Para Registros terça-feira, 19 de março de 2013 Ponteiros Para Registros O que será impresso? terça-feira, 19 de março de 2013 Ponteiros Para Registros • Para acessar os campos de uma variável do tipo struct via ponteiro, pode-se utilizar o operador “*” juntamente com o operador “.”. • Ou, pode-se utilizar o operador “- >” terça-feira, 19 de março de 2013 Ponteiros Para Registros terça-feira, 19 de março de 2013 Exemplo com Registros Exercício • XXII - Faça um programa para manter um cadastro de frutas com as seguintes informações: • Nome, peso médio, calorias. • O programa pode incluir/excluir frutas do cadastro. terça-feira, 19 de março de 2013 Exemplo com Registro Solução • Primeiramente definimos a estrutura: • Usaremos um vetor como uma base de dados para cadastro de frutas. terça-feira, 19 de março de 2013 Exemplo com Registro Solução • Vamos criar as seguintes funções: • void leFruta(Fruta *f);: Lê dados de uma única fruta. • void imprimeFruta(Fruta f);: Imprime dados de uma fruta. • void imprimeFrutas(Fruta vet[], int tam);: Imprime dados do cadastro completo de frutas. • int insereFruta(Fruta vet[], int tam, Fruta f);: Insere fruta no cadastro se houver espaço. • int removeFruta(Fruta vet[], int tam, char nome[]);: Remove fruta pelo nome se esta estiver cadastrada. terça-feira, 19 de março de 2013 Exemplo com Registro Solução - leFruta terça-feira, 19 de março de 2013 Exemplo com Registro Solução - imprimeFruta terça-feira, 19 de março de 2013 Exemplo com Registro Solução - insereFruta terça-feira, 19 de março de 2013 Exemplo com Registro Solução - removeFruta terça-feira, 19 de março de 2013 Exemplo com Registro Solução terça-feira, 19 de março de 2013 Exercício • XXIII - Escreva uma função srtcat que recebe como parâmetro 3 strings: s1, s2 e sres. A função deve retornar em sres a concatenação de s1 e s2. terça-feira, 19 de março de 2013 Alocação Dinâmica • Em aulas passadas ao se trabalhar com matrizes e vetores, era estipulado um valor fixo para seus respectivos tamanhos. • O que fazer se o usuário precisar trabalhar com tamanhos maiores? Alterar os valores e recompilar o programa? terça-feira, 19 de março de 2013 Alocação Dinâmica • Em C, pode-se alocar dinamicamente uma quantidade de memória contígua e associá-la com um ponteiro. • Desta forma pode-se criar programas sem saber a priori a quantidade de dados a ser armazenada. terça-feira, 19 de março de 2013 Alocação Dinâmica • Na biblioteca stdlib.h existem duas funções para fazer alocação de memória. • calloc: Nesta função são passados como parâmetro o número de blocos de memória a serem alocados e o tamanho em bytes de cada bloco. • malloc: Nesta função é passado um único argumento, o número de bytes a serem alocados. terça-feira, 19 de março de 2013 Alocação Dinâmica Exemplos • calloc • malloc: terça-feira, 19 de março de 2013 Alocação Dinâmica • Diferenças: O calloc zera todos os bits da memória alocada enquanto o malloc não. Logo se não for desejável uma inicialização (com zero) da memória alocada, o malloc é preferíver por ser um pouco mais rápido. terça-feira, 19 de março de 2013 Alocação Dinâmica • Além do calloc e do malloc, existe a função free na biblioteca stdlib.h • free: Esta função recebe como parâmetro um ponteiro, e libera a memória previamente alocada. • TODA memória alocada durante a execução de um programa, deve ser desalocada quando não for mais utilizada. terça-feira, 19 de março de 2013 Alocação Dinâmica Exercício • XXIV - Faça um programa para calcular o produto interno de dois vetores. Obs: O tamanho dos vetores devem ser lidos dos usuário e sua memória deve ser alocada dinamicamente. terça-feira, 19 de março de 2013 Alocação Dinâmica Solução terça-feira, 19 de março de 2013 Alocação Dinâmica • Ponteiros distintos podem apontar para mesma região de memória. • Cuidado para não utilizar um ponteiro se a região de memória foi desalocada. terça-feira, 19 de março de 2013 Exercício • XXV - Escreva uma função srtcat que recebe como parâmetro 3 strings: s1, s2 e sres. A função deve retornar em sres a concatenação de s1 e s2. • OBS: O tamanho de s1, s2 devem ser lidos do usuário e sua memória deve ser alocada dinamicamente. terça-feira, 19 de março de 2013 Exercício • XXVI - Escreva um programa para auxiliar um professor a atribuir a nota de uma prova objetiva. Primeiramente o programa deve pedir o número de questões, após alocar memória suficiente, deve-se ler o gabarito e em seguida as respostas do aluno, a saída deve ser a nota. terça-feira, 19 de março de 2013
Compartilhar