1 Exercícios com ponteiros

Documentos relacionados
1 Exercícios com ponteiros

1/34 GESTÃO DINÂMICA DE MEMÓRIA

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

Aula 17: Ponteiros e Alocação Dinâmica em C

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Ponteiros e Alocação de Memória

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Módulo 5 Vetores e Alocação Dinâmica

Alocação Dinâmica em C

A sintaxe para se declarar uma variável do tipo ponteiro é dada por:

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

Faculdade de Computação

Ponteiros e Tabelas. K&R: Capítulo 5

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

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 3 de setembro de 2010

Linguagem C: Ponteiros - Alocação Dinâmica

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

O que é um apontador em C (type pointer in C)?

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

DAS5102 Fundamentos da Estrutura da Informação

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

Ponteiros. Introdução e Alocação Dinâmica

LINGUAGEM C: ALOCAÇÃO DINÂMICA

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

Estruturas Dinâmicas - Ponteiros

Curso de Programação C em Ambientes Linux Aula 05

Alocação Estática e Dinâmica. Prof. M.Sc. Mariella Berger

Estruturas de Dados Aula 6: Cadeias de 28/03/2010

Modulo 12: alocação dinâmica de memória

Linguagem C: Introdução

Alocação dinâmica de Memória

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Programação: Vetores

Estrutura de Dados. Aula 07 Alocação Dinâmica

Programação de Computadores II. Cap. 5 Alocação Dinâmica

5. Vetores e alocação dinâmica

Aula 8 Oficina de Programação Vetores. Profa. Elaine Faria UFU

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Algoritmos e Estruturas de dados

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

Estrutura de dados 1. Ponteiros

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

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

Transcrição:

Computação para Informática Funções e Ponteiros1 EXERCÍCIOS COM PONTEIROS Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Funções e ponteiros O objetivo desta aula prática é exercitar ponteiros e funções. 1 Exercícios com ponteiros Exercício 1: Objetivo: Notação de ponteiros. Execute o programa 1 e observe os valores impressos procure entender o que foi impresso. Listagem 1: Programa do problema 1. int var; // var e um inteiro int *varptr; // varptr e um ponteiro para inteiros var = 7; varptr = &var; // varptr aponta para onde esta var printf("o endereco de var e %p\n" "O valor de varptr e %p\n", &var, varptr); printf("o valor de var e %d\n" "O valor que varptr aponta e %d\n", var, *varptr); // Para os fortes printf("mostrando que * e & sao complementares\n" "&*varptr = %p\n" "*&varptr = %p\n", &*varptr, *&varptr); Exercício 2: Objetivo: Usar ponteiros para passar parâmetros para funções. Complete o programa 2. Este programa usa a função void troca (int *a, int *b). Esta função função troca os valores apontados por a e b. Listagem 2: Programa do problema 2. void troca (int *a, int *b) int temp; 1 Adriano Cruz

Computação para Informática Funções e Ponteiros1 EXERCÍCIOS COM PONTEIROS temp = *a; *a = *b; /* ******* Falta um comando aqui */ /* Fim de troca */ int x, y; scanf("%d %d", &x, &y); troca(&x, &y); printf("troquei ----> %d %d\n", x, y); Exercício 3: Objetivo: Manipular variáveis usando ponteiros para variáveis previamente declaradas. Considere o programa 3. Procure entender o que será impresso. Procure entender a diferença na notação de ponteiros em p2 = &j e *p2 = temp. #include<stdlib.h> int i = 10, j = 20; int temp; int *p1, *p2; Listagem 3: Programa do problema 3. p1 = &i; /* p1 recebe endereco de i */ p2 = &j /* p2 recebe endereco de j */ temp = *p1; /* conteudo apontado por p1 para temp */ *p1 = *p2; /* conteudo apontado por p2 para o apontado p1 */ *p2 = temp; /* conteudo apontado por p1 para p2 */ /* O que sera impresso???? */ printf("%d %d\n", i, j); 2 Adriano Cruz

Computação para Informática Funções e Ponteiros1 EXERCÍCIOS COM PONTEIROS Exercício 4: O programa 2 foi modificado levemente e virou 4. Complete os pedaços que faltam. Listagem 4: Programa do problema 4. void Troca (int *a, int *b) int temp; temp = *a; *a = *b; *b = temp; /* Fim de Troca */ int x, y; int *px, *py; /* Nao se usa isto normalmente. Isto é um exercício para aprendermos ponteiros */ px = &x; py = &y; /* * Como seria o comando scanf com px e py ao inves x e y? * Dica: lembre-se que era scanf("%d %d", &x, &y); * Agora olhe os dois comandos acima e verifique quem e igual * a &x e &y. */ scanf("%d %d",, ); /* Como seria Troca com px e py? */ Troca(, ); /* Como seria printf com px e py? */ printf("troquei ----> %d %d\n",, ); 3 Adriano Cruz

Computação para Informática Funções e Ponteiros1 EXERCÍCIOS COM PONTEIROS Exercício 5: O exercício 5 mostra um exemplo de função que retorna um ponteiro. A função achasobrenome retorna o ponteiro pnome. O que você acha que o programa imprime? Listagem 5: Programa do problema 5. char * achesobrenome(char nome[]) char *pnome; int i = 0; while (nome[i]!= ' ') i++; i++; pnome = &nome[i]; return pnome; char nomecompleto[80]; char *p; puts("entre com o seu nome e um sobrenome."); gets(nomecompleto); p = achesobrenome(nomecompleto); puts(p); 4 Adriano Cruz

2 Alocando Memória Atenção Nos próximos exercícios usaremos vetores com tamanhos variáveis. Para isto vamos usar funções para reservar memória e quando este espaço não for mais necessário usar uma função para liberá-lo. Estas funções são as seguintes: malloc(), calloc() e free(). Protótipos #include <stdlib.h> void *calloc (size_t nmemb, size_t size); void *malloc (size_t size); void free(void *ptr); Observe que as variáveis nmemb e size são declaradas como sendo do tipo size_t. De acordo com o padrão da linguagem C representa um inteiro sem sinal. Este tipo é recomendado para qualquer variável que representa um tamanho de vetor ou um índice de vetor. Este tipo é definido no cabeçalho <stddef.h>, que é frequentemente incluído em outros cabeçalhos, como por exemplo <stdio.h>. Se você tentar usar size_t e aparecerem erros, simplesmente inclua <stddef.h> em seu programa. Descrição calloc reserva memória para um vetor de nmemb elementos de tamanho size bytes cada e retorna um ponteiro para a memória reservada. A memória é inicializada com zero. malloc reserva size bytes e retorna um ponteiro para a memória reservada. A memória não é inicializada com zero. free libera a área de memória apontada por ptr, que foi previamente reservada por uma chamada a uma das funções malloc()ou calloc(). Comportamento indefinido ocorre se a área já foi liberada antes ou as funções não foram chamadas antes. Se o valor de ptr é NULL nada é executado. Retorno Em calloc() e malloc(), o valor retornado é um ponteiro para a memória alocada, que é alinhada corretamente para qualquer tipo de variável ou NULL se o pedido não pode ser atendido. free() returns no value. 5 Adriano Cruz

Exemplo Como exemplo de uso destas funções considere o problema de reservar n posições para armazenar variáveis do tipo int. Para isto usamos o trecho de programa mostrado em 6. Observe que após alocar o espaço foi usada a notação de vetores comuns. Listagem 6: Programa do problema 6. #include<stdlib.h> int i, n, *pvetor; float media; /* Define um valor para n, scanf ou n = */ scanf("%d", &n); /* aloca espaco na memoria */ pvetor = (int *) malloc(n * sizeof(int)); if (!pvetor) puts("sem memória."); return 1; /* A PARTIR DE AGORA VOLTAMOS PARA VETORES COMUNS */ /* aqui uso pvetor, vamos ler um vetor */ for (i = 0; i < n; i++) scanf("%d", &pvetor[i]); /* faco alguma coisa */ media = 0.0; for (i = 0; i < n; i++) media += pvetor[i]; printf("%f\n", media); /* aqui nao preciso mais de pvetor */ free(pvetor); Exercício 6: Execute o programa 6. Exercício 7: Agora vamos usar somente ponteiros. Execute o programa 7. Listagem 7: Programa do problema 7. 6 Adriano Cruz

#include<stdlib.h> int i, n, *pvetor; float media; /* Define um valor para n, scanf ou n = */ scanf("%d", &n); /* aloca espaco na memoria */ pvetor = (int *) malloc(n * sizeof(int)); if (!pvetor) puts("sem memória."); return 1; /* aqui uso pvetor, vamos ler um vetor */ for (i = 0; i < n; i++) scanf("%d", pvetor + i); /* faco alguma coisa */ media = 0.0; for (i = 0; i < n; i++) media += *(pvetor + i); printf("%f\n", media); /* aqui nao preciso mais de pvetor */ free(pvetor); Exercício 8: Escreva um programa que descubra qual é o maior segmento de memória que é possível reservar neste computador. Dica: Faça um laço que tente reservar espaço, se conseguir libere-o e tente reservar um espaço ainda maior. Para liberar o espaço reservado use free(). Faço isto até verificar que o programa não consegue mais alocar memória. Dica da Dica: Ir aumentando de 1 byte em 1 byte vai fazer o programa demorar muito. Exercício 9: Modifique o programa mostrado na listagem 7 para descobrir quantos números são maiores do que a média. Exercício 10: Modifique o programa mostrado na listagem 7 para colocar o vetor em ordem crescente. 7 Adriano Cruz

Exercício 11: Objetivo: Aritmética de ponteiros. Vamos somar um a um ponteiro. Digite o programa 8 e diga o que ele faz, caso você digite o seu primeiro e último nomes separados por um branco. Compare este programa com o programa 5. Listagem 8: Exercício de cadeias de caracteres void misterio (char *n); int main (void) char nome[41]; gets(nome); misterio(nome); void misterio (char *n) while (*n!= ' ') n++; n++; puts(n); Exercício 12: Objetivo: Verificar que ao se mudar o conteúdo de um vetor dentro de uma função muda-se também o conteúdo do vetor no trecho de programa que chamou a função. Complete o programa 9 que converte um número inteiro positivo da base 10 para a base 2. A função recebe o número na variável numerobase10 e retorna todos os 32 bits no vetor numerobase2. O número na base 2 deve ser armazenado no vetor da seguinte maneira: bit 31 na posição 31, bit 30 na posição 30 e assim sucessivamente. Entrada A entrada é composta de vários conjuntos de teste. Cada caso de teste é um número inteiro positivo. A entrada termina quando um número inteiro negativo for digitado. Saída Para cada conjunto de teste da entrada seu programa deve produzir três linhas. A primeira linha identifica o conjunto de teste, no formato "Teste n", onde n é numerado a partir de 1. A segunda linha deve conter o número lido. A terceira linha deve conter todos os bits do número convertido, inclusive os zeros à esquerda. A quarta linha deve ser deixada em branco. A formato mostrado no Exemplo de Saída, abaixo, deve ser seguida rigorosamente. Exemplo de entrada e saída 8 Adriano Cruz

Entrada: 5 9 13-1 Saída para o Exemplo da Entrada Teste 1 5 00000000000000000000000000000101 Teste 2 9 00000000000000000000000000001001 Teste 3 13 00000000000000000000000000001101 #include <stdio.h> Listagem 9: Exercício de uso de vetor em funcoes void Converter ( i nt numerobase10, i nt numerobase2[32]); int main(int argc, char *argv[]) int nb10, nb2[32], i, teste = 1; while (1) scanf("%d", &nb10); if (nb10 < 0 ) break; /* * Como a funcao e void nao ha valor retornado * e portanto nao posso atribuir a nenhuma variavel */ Converter(nb10, nb2); printf("teste %d\n", teste++); printf("%d\n", nb10); /* Aqui imprimo o vetor */ /* Aqui falta codigo */ printf("\n\n"); void Converter ( i nt numerobase10, i nt numerobase2[32]) /* aqui falta codigo */ /* Nao tem return. 9 Adriano Cruz