52
DIM0108.0 - Conceitos e Técnicas de Programação Exercícios sobre alocação dinâmica David Deharbe 1 1 Wednesday, November 9, 2011

Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

  • Upload
    others

  • View
    24

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exercícios sobre alocação dinâmica

David Deharbe

1

1Wednesday, November 9, 2011

Page 2: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

strdup

•Crie uma rotina strdup que tem como parâmetro um string s e retorna o endereço de um compartimento de memória com uma nova cópia do texto apontado por s.

2

char * strdup (char * str){ char * result; /* atribua a result o endereco de um compartimento de memoria grande suficiente */ result = malloc(sizeof(char) * (strlen(str) + 1)); /* copie str no compartimento result */ strcpy(result, str); return result;}

2Wednesday, November 9, 2011

Page 3: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

strdinv

•Crie uma rotina strinv que tem como parâmetro um string s e retorna o endereço de um compartimento de memória com um texto formado pelo espelho do texto apontado por s.

3

char * strinv (char * str){ int i; int l = strlen(str); char * result = malloc(sizeof(char) * (l + 1)); /* copie str no compartimento result */ for (i = 0; i < l; ++i) result[i] = str[l-i-1]; result[l] = '\0'; return result;}

3Wednesday, November 9, 2011

Page 4: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

strjoin

•Crie uma rotina strjoin que tem como parâmetro dois strings s1 e s2 e retornam o endereço de um compartimento de memória com o texto formado por s1 seguido de s2.

4

char * strjoin (char * s1, char * s2){ int i; int l1 = strlen(s1); int l2 = strlen(s2); char * result = malloc(sizeof(char) * (l1 + l2 + 1)); for (i = 0; i < l1; ++i) result[i] = s1[i]; for (i = 0; i < l2; ++i) result[l1+i] = s1[i]; result[l1+l2] = '\0'; return result;}

4Wednesday, November 9, 2011

Page 5: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

strjoin

•Crie uma rotina strjoin que tem como parâmetro dois strings s1 e s2 e retornam o endereço de um compartimento de memória com o texto formado por s1 seguido de s2.

4

char * strjoin (char * s1, char * s2){ int i; int l1 = strlen(s1); int l2 = strlen(s2); char * result = malloc(sizeof(char) * (l1 + l2 + 1)); strcpy(result, s1); strcpy(result+l1, s2); return result;}

4Wednesday, November 9, 2011

Page 6: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

strnjoin

•Crie uma rotina strnjoin que tem como parâmetro um inteiro positivo n, um arranjo de n strings a e retorna o endereço de um compartimento de memória com um texto formado pela concatenação dos elementos de a.

5

char * strjoin (int n, char * a[n]){ int i; int l; char * result; l = 0 for (i = 0; i < n; ++i) l += strlen(a[i]); result = malloc(sizeof(char) * (l + 1)); l = 0; for (i = 0; i < l1; ++i) { strcpy(result+l, a[i]); l += strlen(a[i]); } result[l] = '\0'; return result;}

5Wednesday, November 9, 2011

Page 7: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

strnjoin

•Crie uma rotina strnjoin que tem como parâmetro um inteiro positivo n, um arranjo de n strings a e retorna o endereço de um compartimento de memória com um texto formado pela concatenação dos elementos de a.

5

5Wednesday, November 9, 2011

Page 8: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Registros

David Deharbe

6

6Wednesday, November 9, 2011

Page 9: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Plano da aula

•Conceitos;•Registros em C;•Definição de tipo registro;•Registros como parâmetros de sub-rotina;•Registro como retorno de sub-rotina;•Registros e ponteiros.

7

7Wednesday, November 9, 2011

Page 10: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Conceitos

•Um registro é um objeto que agrega uma certa quantidade de valores (possivelmente) de diferentes tipos.‣Exemplo 1: cadastro de pessoa física

✓nome: texto✓número: arranjo de 11 caracteres dígitos

‣ Exemplo 2: cadastro de produto✓código de produto: inteiro✓quantidade em estoque: inteiro✓descrição: texto✓valor unitário: número decimal

•Cada componente do registro é chamado campo.

8

8Wednesday, November 9, 2011

Page 11: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Registro vs arranjo

•Ambos são objetos que agregam valores

•Arranjo: ‣ todos os componentes são do mesmo tipo‣o acesso é através da posição do componente

•Registro: ‣ cada componente tem o seu tipo‣o acesso é através do nome do componente (campo).

9

9Wednesday, November 9, 2011

Page 12: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Declaração de registro na linguagem C.

•Sintaxe <registro> ::= struct { <campo>+ } <nome>+ <campo> ::= <tipo> <nome> ;

•Um registro é iniciado com a palavra chave struct seguida de uma lista de campos delimitada por chaves { e }.

•Cada campo é composto pelo tipo do campo, o nome do campo, e um ponto-e-vírgula.‣ struct { /* um registro com 4 campos */ int codigo; char * desc; int quantidade; float valor; } prod1;

10

10Wednesday, November 9, 2011

Page 13: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

11

#include <stdio.h> /* printf */#include <stdlib.h> /* free */#include <string.h> /* strdup */int main (void){ struct { int codigo; char * desc; int quantidade; float valor; } prod; prod.codigo = 2340012; prod.desc = strdup("Caixa de leite desnatado de 1 litro"); prod.quantidade = 2000; prod.valor = 1.99; printf("descricao = %s\nquantidade = %i\n" "valor unitario = %.2f\nvalor total = %.2f\n", prod.desc, prod.quantidade, prod.valor, prod.quantidade * prod.valor); free(prod.desc); return 0;}

11Wednesday, November 9, 2011

Page 14: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

11

#include <stdio.h> /* printf */#include <stdlib.h> /* free */#include <string.h> /* strdup */int main (void){ struct { int codigo; char * desc; int quantidade; float valor; } prod; prod.codigo = 2340012; prod.desc = strdup("Caixa de leite desnatado de 1 litro"); prod.quantidade = 2000; prod.valor = 1.99; printf("descricao = %s\nquantidade = %i\n" "valor unitario = %.2f\nvalor total = %.2f\n", prod.desc, prod.quantidade, prod.valor, prod.quantidade * prod.valor); free(prod.desc); return 0;}

localhost:aula 26 david$ ./ex1descricao = Caixa de leite desnatado de 1 litroquantidade = 2000valor unitario = 1.99valor total = 3980.00

11Wednesday, November 9, 2011

Page 15: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

12

#include <stdio.h>#include <stdlib.h>#include <string.h>int main (void){ struct { char * desc; int quantidade; float valor; } prod1, prod2; prod1.desc = strdup("Caixa de leite desnatado de 1 litro"); prod1.quantidade = 2000; prod1.valor = 1.99; prod2.desc = strdup("Creme de chocolate com avela 180g"); prod2.quantidade = 512; prod2.valor = 4.99; printf("descricao = %s\nquantidade = %i\nvalor total = %.2f\n", prod1.desc, prod1.quantidade, prod1.quantidade * prod1.valor); printf("descricao = %s\nquantidade = %i\nvalor total = %.2f\n", prod2.desc, prod2.quantidade, prod2.quantidade * prod2.valor); free(prod1.desc); free(prod2.desc); return 0;}

12Wednesday, November 9, 2011

Page 16: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

12

#include <stdio.h>#include <stdlib.h>#include <string.h>int main (void){ struct { char * desc; int quantidade; float valor; } prod1, prod2; prod1.desc = strdup("Caixa de leite desnatado de 1 litro"); prod1.quantidade = 2000; prod1.valor = 1.99; prod2.desc = strdup("Creme de chocolate com avela 180g"); prod2.quantidade = 512; prod2.valor = 4.99; printf("descricao = %s\nquantidade = %i\nvalor total = %.2f\n", prod1.desc, prod1.quantidade, prod1.quantidade * prod1.valor); printf("descricao = %s\nquantidade = %i\nvalor total = %.2f\n", prod2.desc, prod2.quantidade, prod2.quantidade * prod2.valor); free(prod1.desc); free(prod2.desc); return 0;}

localhost:aula 26 david$ ./ex2descricao = Caixa de leite desnatado de 1 litroquantidade = 2000valor total = 3980.00descricao = Creme de chocolate com avela 180gquantidade = 512valor total = 2554.88

12Wednesday, November 9, 2011

Page 17: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exercício

•Considerando os seguintes registros: struct { char * desc; int quantidade; float valor; } prod1, prod2;

•escrever uma sub-rotina que imprime a descrição do produto, e o valor total de todos os itens vendidos do produto.

•Qual deve ser a interface desta rotina?

13

13Wednesday, November 9, 2011

Page 18: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Definição de tipo: motivação

•Para definir a interface de uma sub-rotina, precisamos indicar o tipo dos seus elementos.‣Qual o tipo de um registro?

•O tipo de um registro é um "tipo registro".

•O programador pode definir seus próprios tipos.

14

14Wednesday, November 9, 2011

Page 19: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Definição de tipo: sintaxe e exemplo

•<definição de tipo> ::= typedef <expressão de tipo> nome;

•Exemplo: typedef struct { char * descricao; int codigo; float valor; int quantidade; } Tproduto ; Tproduto prod1, prod2;

•Solução (interface): void imprime_produto (Tproduto p);

15

15Wednesday, November 9, 2011

Page 20: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

16

#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct { char * desc; int quantidade; float valor;} Tproduto;void imprime_produto(Tproduto p) { printf("descricao = %s\nquantidade = %i\nvalor total = %.2f\n", p.desc, p.quantidade, p.quantidade * p.valor);}int main (void) { Tproduto prod1, prod2; prod1.desc = strdup("Caixa de leite desnatado de 1 litro"); prod1.quantidade = 2000; prod1.valor = 1.99; prod2.desc = strdup("Creme de chocolate com avela 180g"); prod2.quantidade = 512; prod2.valor = 4.99; imprime_produto(prod1); imprime_produto(prod2); free(prod1.desc); free(prod2.desc); return 0;}

16Wednesday, November 9, 2011

Page 21: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

16

#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct { char * desc; int quantidade; float valor;} Tproduto;void imprime_produto(Tproduto p) { printf("descricao = %s\nquantidade = %i\nvalor total = %.2f\n", p.desc, p.quantidade, p.quantidade * p.valor);}int main (void) { Tproduto prod1, prod2; prod1.desc = strdup("Caixa de leite desnatado de 1 litro"); prod1.quantidade = 2000; prod1.valor = 1.99; prod2.desc = strdup("Creme de chocolate com avela 180g"); prod2.quantidade = 512; prod2.valor = 4.99; imprime_produto(prod1); imprime_produto(prod2); free(prod1.desc); free(prod2.desc); return 0;}

localhost:aula 26 david$ ./ex3descricao = Caixa de leite desnatado de 1 litroquantidade = 2000valor total = 3980.00descricao = Creme de chocolate com avela 180gquantidade = 512valor total = 2554.88

16Wednesday, November 9, 2011

Page 22: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Registro como retorno de sub-rotina

•Uma sub-rotina pode retornar um registro.

17

Tproduto le_produto(void){ char desc[81]; Tproduto res; printf("Cadastro de produto\n"); printf("Descricao:"); fgets(desc, 81, stdin); if (desc[strlen(desc)-1] == '\n') desc[strlen(desc)-1] = '\0'; res.desc = strdup(desc); printf("Codigo:"); scanf("%i", &res.codigo); printf("Valor:"); scanf("%f", &res.valor); res.quantidade = 0; return res;}int main (void){ Tproduto prod1; prod1 = le_produto(); imprime_produto(prod1); free(prod1.desc); return 0;}

17Wednesday, November 9, 2011

Page 23: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Registro como retorno de sub-rotina

•Uma sub-rotina pode retornar um registro.

17

Tproduto le_produto(void){ char desc[81]; Tproduto res; printf("Cadastro de produto\n"); printf("Descricao:"); fgets(desc, 81, stdin); if (desc[strlen(desc)-1] == '\n') desc[strlen(desc)-1] = '\0'; res.desc = strdup(desc); printf("Codigo:"); scanf("%i", &res.codigo); printf("Valor:"); scanf("%f", &res.valor); res.quantidade = 0; return res;}int main (void){ Tproduto prod1; prod1 = le_produto(); imprime_produto(prod1); free(prod1.desc); return 0;}

localhost:aula 26 david$ ./ex4Cadastro de produtoDescricao:Caixa de leite de um litroCodigo:4578991Valor:1.99codigo = 4578991descricao = Caixa de leite de um litroquantidade = 0valor = 1.99

17Wednesday, November 9, 2011

Page 24: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exercício

•Defina um tipo registro que represente pontos do plano. Cada valor deste tipo deve guardar a abscissa e ordenada do ponto.

•Defina uma função que, dada dois pontos, retorna a distância entre esses dois pontos.‣|(x1, y1) (x2, y2)| = ((x1 - x2)2 + (y1 - y2)2)½

•Defina uma função que, dada dois pontos A e B, retorna o ponto situado na metade do segmento cujas extremidades são A e B.‣ ( (x1,+ x2) / 2 , (y1 + y2) / 2 )

18

18Wednesday, November 9, 2011

Page 25: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Registros e sub-rotinas

•Em C a passagem de parâmetro é realizada por valor.•O registro que a sub-rotina recebe é uma cópia do registro passado em parâmetro.

•Para alterar um registro em uma sub-rotina, deve se usar um ponteiro para registro.

19

19Wednesday, November 9, 2011

Page 26: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

20

…void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}…void altera_preco(Tproduto p, float novo) { p.valor = novo;}int main (void) { Tproduto prod1; prod1 = le_produto(); imprime_produto(prod1); altera_preco(prod1, 2.19); imprime_produto(prod1); free(prod1.desc); return 0;}

20Wednesday, November 9, 2011

Page 27: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

20

…void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}…void altera_preco(Tproduto p, float novo) { p.valor = novo;}int main (void) { Tproduto prod1; prod1 = le_produto(); imprime_produto(prod1); altera_preco(prod1, 2.19); imprime_produto(prod1); free(prod1.desc); return 0;}

localhost:aula 26 david$ ./ex5Cadastro de produtoDescricao:LeiteCodigo:189011Valor:1.99Leite (cod. 189011): 1.99 R$Leite (cod. 189011): 1.99 R$

20Wednesday, November 9, 2011

Page 28: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

21

…void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}…void altera_preco(Tproduto * p, float novo) { (*p).valor = novo;}int main (void) { Tproduto prod1; prod1 = le_produto(); imprime_produto(prod1); altera_preco(& prod1, 2.19); imprime_produto(prod1); free(prod1.desc); return 0;}

21Wednesday, November 9, 2011

Page 29: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

21

…void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}…void altera_preco(Tproduto * p, float novo) { (*p).valor = novo;}int main (void) { Tproduto prod1; prod1 = le_produto(); imprime_produto(prod1); altera_preco(& prod1, 2.19); imprime_produto(prod1); free(prod1.desc); return 0;}

localhost:aula 26 david$ ./ex6Cadastro de produtoDescricao:LeiteCodigo:189011Valor:1.99Leite (cod. 189011): 1.99 R$Leite (cod. 189011): 2.19 R$

21Wednesday, November 9, 2011

Page 30: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Registros e ponteiros

•É muito comum usar ponteiros para registros.•Para acessar o campo C do registro apontado por P, deve-se usar a expressão (* P).C

•A linguagem C possui um operador específico para isto: -> P->C

22

22Wednesday, November 9, 2011

Page 31: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

23

…void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}…void altera_preco(Tproduto * p, float novo) { p->valor = novo;}int main (void) { Tproduto prod1; prod1 = le_produto(); imprime_produto(prod1); altera_preco(& prod1, 2.19); imprime_produto(prod1); free(prod1.desc); return 0;}

23Wednesday, November 9, 2011

Page 32: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

23

…void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}…void altera_preco(Tproduto * p, float novo) { p->valor = novo;}int main (void) { Tproduto prod1; prod1 = le_produto(); imprime_produto(prod1); altera_preco(& prod1, 2.19); imprime_produto(prod1); free(prod1.desc); return 0;}

localhost:aula 26 david$ ./ex7Cadastro de produtoDescricao:LeiteCodigo:189011Valor:1.99Leite (cod. 189011): 1.99 R$Leite (cod. 189011): 2.19 R$

23Wednesday, November 9, 2011

Page 33: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Detalhes de funcionamento

•A passagem de parâmetros é feita por (cópia de) valores.

•Se desejarmos modificar uma variável (registro ou não), devemos apelar por ponteiros.

•Mesmo se não desejamos modificar o registro, na passagem de parâmetro todos os campos são copiados.

•Para evitar a cópia, pode-se apelar para ponteiros também (mesmo que a sub-rotina não faça alterações).

24

24Wednesday, November 9, 2011

Page 34: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

25

void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}

25Wednesday, November 9, 2011

Page 35: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo prod1.desc 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

25

void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}

Tproduto prod1;

25Wednesday, November 9, 2011

Page 36: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo prod1.desc 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

25

void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}

'L' 0x000020'e' 0x000021'i' 0x000022't' 0x000023'e' 0x000024'\0' 0x000025

Tproduto prod1;

prod1.desc 0x000020 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc = "Leite";

25Wednesday, November 9, 2011

Page 37: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo prod1.desc 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

25

void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}

'L' 0x000020'e' 0x000021'i' 0x000022't' 0x000023'e' 0x000024'\0' 0x000025

Tproduto prod1;

prod1.desc 0x000020 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc = "Leite";prod1.codigo = 8956313;

25Wednesday, November 9, 2011

Page 38: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo prod1.desc 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

25

void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}

'L' 0x000020'e' 0x000021'i' 0x000022't' 0x000023'e' 0x000024'\0' 0x000025

Tproduto prod1;

prod1.desc 0x000020 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 1.99 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc = "Leite";prod1.codigo = 8956313;prod1.valor = 1.99;

25Wednesday, November 9, 2011

Page 39: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo prod1.desc 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

25

void imprime_produto(Tproduto p) { printf("%s (cod. %i): %.2f R$\n", p.desc, p.codigo, p.valor);}

'L' 0x000020'e' 0x000021'i' 0x000022't' 0x000023'e' 0x000024'\0' 0x000025

Tproduto prod1;

imprime_produto(prod1);

prod1.desc 0x000020 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 1.99 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 1.99 0xff0008

p.desc 0x000020 0xff000c

p.codigo 8956313 0xff0010

p.valor 1.99 0xff0014

prod1.desc = "Leite";prod1.codigo = 8956313;prod1.valor = 1.99;

25Wednesday, November 9, 2011

Page 40: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo

26

void imprime_produto(Tproduto * p) { printf("%s (cod. %i): %.2f R$\n", p->desc, p->codigo, p->valor);}

26Wednesday, November 9, 2011

Page 41: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo prod1.desc 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

26

void imprime_produto(Tproduto * p) { printf("%s (cod. %i): %.2f R$\n", p->desc, p->codigo, p->valor);}

Tproduto prod1;

26Wednesday, November 9, 2011

Page 42: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo prod1.desc 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

26

void imprime_produto(Tproduto * p) { printf("%s (cod. %i): %.2f R$\n", p->desc, p->codigo, p->valor);}

'L' 0x000020'e' 0x000021'i' 0x000022't' 0x000023'e' 0x000024'\0' 0x000025

Tproduto prod1;

prod1.desc 0x000020 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc = "Leite";

26Wednesday, November 9, 2011

Page 43: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo prod1.desc 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

26

void imprime_produto(Tproduto * p) { printf("%s (cod. %i): %.2f R$\n", p->desc, p->codigo, p->valor);}

'L' 0x000020'e' 0x000021'i' 0x000022't' 0x000023'e' 0x000024'\0' 0x000025

Tproduto prod1;

prod1.desc 0x000020 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc = "Leite";prod1.codigo = 8956313;

26Wednesday, November 9, 2011

Page 44: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo prod1.desc 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

26

void imprime_produto(Tproduto * p) { printf("%s (cod. %i): %.2f R$\n", p->desc, p->codigo, p->valor);}

'L' 0x000020'e' 0x000021'i' 0x000022't' 0x000023'e' 0x000024'\0' 0x000025

Tproduto prod1;

prod1.desc 0x000020 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 1.99 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc = "Leite";prod1.codigo = 8956313;prod1.valor = 1.99;

26Wednesday, November 9, 2011

Page 45: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exemplo prod1.desc 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

26

void imprime_produto(Tproduto * p) { printf("%s (cod. %i): %.2f R$\n", p->desc, p->codigo, p->valor);}

'L' 0x000020'e' 0x000021'i' 0x000022't' 0x000023'e' 0x000024'\0' 0x000025

Tproduto prod1;

imprime_produto(&prod1);

prod1.desc 0x000020 0xff0000

prod1.codigo 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 1.99 0xff0008

0xff000c

0xff0010

0xff0014

prod1.desc 0x000020 0xff0000

prod1.codigo 8956313 0xff0004

prod1.valor 1.99 0xff0008

p 0xff0000 0xff000c

prod1.desc = "Leite";prod1.codigo = 8956313;prod1.valor = 1.99;

26Wednesday, November 9, 2011

Page 46: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Etiqueta de registro

•Quando se cria um registro, ou um tipo registro, pode se dar uma etiqueta ao registro (logo após o struct):

•Exemplo:struct produto { char * desc; int codigo; float valor;};

•Pode-se usar a etiqueta para ‣declarar registros: struct produto prod1, prod2;‣determinar o tamanho da representação (em bytes) sizeof(struct produto)

27

27Wednesday, November 9, 2011

Page 47: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Um exemplo

•Um arranjo dinâmico:‣ inserção e remoção de novos elementos ao final do arranjo

✓ insere, remove‣ substituição de um elemento já inserido

✓grava‣acesso aos elementos já inseridos

✓ le‣quantidade de elementos já inseridos

✓ tamanho‣ criação de um novo arranjo‣destruição de um arranjo

•As sub-rotinas verificarão que os acessos são válidos.28

28Wednesday, November 9, 2011

Page 48: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Um exemplo

typedef struct vetor { int proximo; /**< posicao do proximo valor inserido */ int capacidade; /**< quantos pode inserir */ int * conteudo; /**< elementos inseridos */} * Tvetor;

/* conteudo: eh o endereco de um bloco de memoria que guarda os elementos que foram inseridos no arranjo dinamico proximo: eh a quantidade de elementos atualmente inseridos no arranjo dinamico e eh tambem a posicao onde vai ser armazenado o proximo elemento a ser inserido. capacidade: eh quantos elementos podem ser inseridos no arranjo dinamico antes que o bloco de memoria apontado por conteudo esteja cheio. */

29

29Wednesday, November 9, 2011

Page 49: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Um exemplo

Tvetor vetor_novo(int cap){ Tvetor res; res = malloc(sizeof(struct vetor)); res->conteudo = malloc(cap * sizeof(int)); res->proximo = 0; res->capacidade = cap; return res;}

void vetor_delete(Tvetor v){ free(v->conteudo); free(v);}

30

30Wednesday, November 9, 2011

Page 50: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Um exemplo

void vetor_insere(Tvetor v, int n){ if (v->proximo == v->capacidade) { v->conteudo = realloc(v->conteudo, v->capacidade * sizeof(int), 2 * v->capacidade * sizeof(int)); v->capacidade *= 2; } v->conteudo[v->proximo] = n; v->proximo += 1;}void vetor_remove(Tvetor v){ assert(v->proximo > 0); v->proximo -= 1;}

31

31Wednesday, November 9, 2011

Page 51: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Um exemplo

void vetor_grave(Tvetor v, int i, int n){ assert(0 <= i && i < v->proximo); v->conteudo[i] = n;}int vetor_le(Tvetor v, int i){ assert(0 <= i && i < v->proximo); return v->conteudo[i];}int vetor_tamanho(Tvetor v){ return v->proximo;}

32

32Wednesday, November 9, 2011

Page 52: Exercícios sobre alocação dinâmica · Exercícios sobre alocação dinâmica David Deharbe 1 Wednesday, November 9, 2011 1. DIM0108.0 - Conceitos e Técnicas de Programação

DIM0108.0 - Conceitos e Técnicas de Programação

Exercício

•Escreva um programa que‣ cria um arranjo dinâmico.‣ lê números até que seja entrado o número 0.‣ insere os números lidos no arranjo dinâmico.‣ imprime os números lidos em ordem inversa da leitura.

•Escreva uma sub-rotina que tem como parâmetro um arranjo dinâmico, e retorna uma cópia deste arranjo dinâmico.

•Escreva uma sub-rotina que tem como parâmetro um arranjo dinâmico, digamos v, e retorna um arranjo dinâmico com os elementos de v sem repetições.

33

33Wednesday, November 9, 2011