Baixe o app para aproveitar ainda mais
Prévia do material em texto
Laboratório de Programação Alocação Dinâmica - Parte I Prof. Daniel Vecchiato daniel@ic.ufmt.br sexta-feira, 15 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. sexta-feira, 15 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. sexta-feira, 15 de março de 2013 Agenda • Revisão; • Ponteiro; • Passagem de parâmetro; • Ponteiros e Vetores; • Exercícios; • Resumo. sexta-feira, 15 de março de 2013 Revisão • Quais funções são utilizadas para ler/ escrever em um arquivo texto em Pascal? • Quais funções são utilizadas para ler/ escrever em um arquivo binário em Pascal? • Qual função é utilizada para acesso não sequencial em Pascal? sexta-feira, 15 de março de 2013 Revisão Arquivos Textos em C • Crie um ponteiro para o arquivo: FILE *parq; • Abra o arquivo de modo apropriado associando-o a um ponteiro: • parq = fopen(“nomeArquivo”, “modo”); • Leia dados do arquivo na memória usando fscanf: • fscanf(parq, string-tipo-variavel, &variavel); • Dados podem ser lidos até EOF. • Altere dados se necessário e escreva-o novamente em arquivo: • fprintf(parq, string-tipo-variavel, variavel); • Todo arquivo deve ser fechado: • fclose(parq); sexta-feira, 15 de março de 2013 Revisão Arquivos Binários em C • Crie um ponteiro para o arquivo: FILE *parq; • Abra o arquivo de modo apropriado associando-o a um ponteiro: • parq = fopen(“nomeArquivo”, “modo”); • Leia dados do arquivo na memória usando fread: • fread(*pt-mem, tamanho, qtde, *arquivo); • Escreva dados no arquivo usando fwrite: • fwrite(*pt-mem, tamanho, qtde, *arquivo); • Todo arquivo deve ser fechado: • fclose(parq). sexta-feira, 15 de março de 2013 Revisão Arquivos Binários em C • Para acesso não sequencial use fseek: • fseek(*arquivo, num_bytes, origem); • O deslocamento pode ser relativo ao: • inicio do arquivo (SEEK_SET); • ponto atual (SEEK_CUR); • final do arquivo (SEEK_END). sexta-feira, 15 de março de 2013 Revisão Manipulação de Arquivos em Pascal Nome Uso ASSIGN Vincular arquivo à variável. REWRITE Criar arquivo. Caso o arquivo exista seus dados serão apagados. RESET Abrir arquivo. CLOSE Fechar arquivo. Efetua a gravação dos dados. ERASE Apaga o arquivo RENAME Renomeia o arquivo. READ Ler de arquivo. WRITE Escrever em arquivo. SEEK Movimentar ponteiro do arquivo. FILESIZE Obter número de registros de um arquivo. FILEPOS Obter a posição do ponteiro do arquivo. EOF Verifica final do arquivo sexta-feira, 15 de março de 2013 Ponteiro • Ponteiros são tipos especiais de dados que armazenam endereços de memória. • Uma variável do tipo ponteiro deve ser declarada da seguinte forma: • A variável ponteiro armazená um endereço de memória de uma outra variável do tipo especificado sexta-feira, 15 de março de 2013 Operadores de Ponteiro • Existem dois operadores relacionados a ponteiro: • 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 sexta-feira, 15 de março de 2013 Operadores de Ponteiro sexta-feira, 15 de março de 2013 Operadores de Ponteiro sexta-feira, 15 de março de 2013 Cuidado! • Não se pode atribuir um valor para o endereço apontado pelo ponteiro, sem antes ter certeza de que o endereço é válido: • O correto seria: sexta-feira, 15 de março de 2013 Cuidado! • O operador * de ponteiros é igual a multiplicação, preste atenção como utilizá-lo. sexta-feira, 15 de março de 2013 Cuidado! • O operador * de ponteiros é igual a multiplicação, preste atenção como utilizá-lo. Ocorre um erro de compilação pois o * é interpretado como operador de ponteiro. sexta-feira, 15 de março de 2013 Cuidado! • O correto seria algo como: sexta-feira, 15 de março de 2013 Cuidado! • O endereço que um ponteiro armazena é sempre de um tipo específico. • Além do compilador alertar que a atribuição pode causar problemas é impresso um valor diferente de 10.89. sexta-feira, 15 de março de 2013 Operações com ponteiros • Comparações podem ser feitas entre ponteiros ou o conteúdo apontado por estes • Para imprimir um ponteiro usa-se %p sexta-feira, 15 de março de 2013 Operações com ponteiros • Quando um ponteiro não está associado com nenhum endereço válido é comum atribuir o valor NULL para este. • Isto é usado em comparações com ponteiros para saber se um determinado ponteiro possui valor válido ou não. sexta-feira, 15 de março de 2013 Exercício • XVIII - O que será impresso? sexta-feira, 15 de março de 2013 Passagem de Parâmetros • Os valores fornecidos como argumentos a uma função são copiados para as variáveis parâmetros. Este processo é idêntico a uma atribuição. Chamado de passagem por valor. • Alterações nos parâmetros dentro da função não alteram os valores que foram passados. sexta-feira, 15 de março de 2013 Passagem de argumentos por referência • Em C só existe passagem de parâmetros por valor. • Em algumas linguagens existem construções para se passar parâmetros por referência. • Neste último caso, alterações de um parâmetro passado por referência também ocorrem onde foi feita a chamada da função. • No exemplo anterior, se x e y fossem passados por referência, seu conteúdo seria trocado. sexta-feira, 15 de março de 2013 Passagem de argumentos por referência • Pode-se obter algo semelhante em C utilizando ponteiros. • O artificio corresponde em passar como argumento para uma função o endereço da variável, e não o seu valor. • Desta forma pode-se alterar o conteúdo da variável como se fosse feito passagem por referência. sexta-feira, 15 de março de 2013 Passagem de argumentos por referência sexta-feira, 15 de março de 2013 Passagem de argumentos por referência • O uso de ponteiros para passar parâmetros que devem ser alterados dentro de uma função é útil em certas situações como: • Funções que precisam retornar mais do que um valor. • Suponha que queremos criar uma função que recebe um vetor como parâmetro e precisa retornar o maior e menor elemento do vetor. • Pode-se passar ponteiros para variáveis que conterão o maior e menor elemento. sexta-feira, 15 de março de 2013 Exercício • XIX - Faça um função que receba por parâmetro um vetor de inteiros, tamanho do vetor e dois inteiros para serem alterados com o valor mínimo e máximo do vetor. sexta-feira, 15 de março de 2013 Passagem de argumentos por referência sexta-feira, 15 de março de 2013 Ponteiros e Vetores • Quando declaramos uma variável do tipo vetor, é alocado uma quantidade de memória contigua cujo tamanho é especificado na declaração (e também depende do tipo do vetor). • int a[5]: Será alocado 5*4 bytes de memória associada com a. sexta-feira, 15 de março de 2013 Ponteiros e Vetores • Uma variável vetor, assim como um ponteiro, armazena um endereço de memória: O endereço de início do vetor. • int a[5]: A variável a contém o endereço de memória do início do vetor. • Quando passamos um vetor como argumento seu conteúdo pode ser alterado dentro da função. sexta-feira, 15 de março de 2013 Exercício • XX - Faça um programa que contenha uma função que recebe um vetor por parâmetro e atribuao valor 0 em todos os seus elementos. sexta-feira, 15 de março de 2013 Ponteiros e Vetores sexta-feira, 15 de março de 2013 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: sexta-feira, 15 de março de 2013 Ponteiros e Vetores: Diferenças • Uma variável vetor, diferentemente de um ponteiro, possui um endereço fixo. • Não se pode atribuir um endereço para uma variável do tipo vetor. sexta-feira, 15 de março de 2013 Ponteiros e Vetores Diferenças • Se b for declarado como ponteiro não há problemas: sexta-feira, 15 de março de 2013 Resumo • 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. sexta-feira, 15 de março de 2013 Exercício • XXI - Faça um programa que atribua um vetor a um ponteiro de inteiro, utilizando o ponteiro inverta o conteúdo do vetor. sexta-feira, 15 de março de 2013
Compartilhar