E STRUTURAS DED ADOS

144 

Full text

(1)

E

STRUTURAS DE

D

ADOS

Bruno Almeida de Jesus

(2)

E

MENTA

 Introdução à programação orientada a objetos.

Classes containers: arrays, arrays ordenados, listas

e suas variantes (alocação dinâmica). Tipos

(3)

E

STRUTURAS DE

D

ADOS TIPOS DE DADOS E

TIPOS ABSTRATOS DE DADOS

Bruno Almeida de Jesus

(4)

S

UMÁRIO

 Motivação

 Tipos de Dados

 Operações

 Tipos Primitivos ou

Escalares

 Tipos Inteiros  Tipos Reais  Tipos Lógicos  Tipo Caracter

 Funções Para Conversão

 Tipos Coleções ou

Não-Escalares

 Tipo Vetor  Tipo Registro  Tipo Conjunto

 Tipos Abstratos de Dados

 Alocação de Memória

 Vantagens e

(5)

M

OTIVAÇÃO

 Por que estudar os tipos de dados?

 Duas são as principais preocupações em um

projeto de software

 Os procedimentos a serem executados;

(6)

M

OTIVAÇÃO

 “Estruturas de Dados” busca descrever modelos de

estruturas de dados e procedimentos

 Exemplos: Arrays, Registros, Listas, Pilhas, Filas e

(7)

M

OTIVAÇÃO

 Os tipos de dados e operações determinam as

estruturas de dados

 Exemplo: em uma pilha ou fila você possui operações

push e pop para colocar e retirar elementos dela;

 A forma como os dados são inseridos ou removidos é que

(8)

T

IPOS DE

D

ADOS

 Define a forma como um dado deve ser

armazenado ou recuperado, bem como os

possíveis valores que ele pode assumir ou as operações que podem ser efetuadas sobre os mesmos

 Exemplo em Pascal:

 integer permite valores inteiros e operações de adição,

multiplicação, subtração e divisão;

(9)

T

IPOS DE

D

ADOS

 Primitivos, derivados ou coleções;

 Os principais tipos primitivos são: inteiro, real, lógico,

caracter, ponteiro;

 Estáticos ou dinâmicos (instanciados em tempo de

(10)

O

PERAÇÕES

 Um conjunto de instruções a fim de manipular um

determinado tipo de dado a fim algum objetivo;

 Criação (declaração)  Percurso

 Busca  Alteração  Retirada

(11)

T

IPOS

P

RIMITIVOS OU

E

SCALARES

 Inteiro (integer, longint, etc.);

 Real (real, double, etc.);

 Lógico (boolean);

(12)

T

IPOS

I

NTEIROS

 Operações numéricas contidas no conjunto dos

números inteiros:

 Soma, subtração, multiplicação, divisão inteira, resto da

divisão;

 Permitem comparações de igualdade e/ou de

(13)

T

IPOS

R

EAIS

 Satisfaz as operações e comparações possíveis

com tipos inteiros;

 Operações numéricas contidas no conjunto dos

números reais:

(14)

T

IPOS

L

ÓGICOS

 Permite operações lógicas (booleanas):

 E, OU, NÃO;

 Deve-se ter muito cuidado na construção de

expressões lógicas

 Quanto maiores elas são, maiores as chances de

(15)

T

IPO

C

ARACTER

 Permite a representação de um único caracter;

 Operações de igualdade e desigualdade;

 Por ser armazenado internamente como um valor

inteiro, podemos fazer um “casting” e efetuar outras

(16)

F

UNÇÕES PARA CONVERSÃO

 De real para inteiro:

 Trunc, Floor, Ceil, Round;

 De caracter para inteiro:

 Ord;

 De inteiro para caracter:

 Char;

 Obs: Dependendo de quais os tipos/classes envolvidos,

(17)

T

IPOS

C

OLEÇÕES OU

N

ÃO

-E

SCALARES

 Vetor;

 Registro;

(18)

T

IPO

V

ETOR

 Coleção de dados homogênea indexada que pode

ser acessada por meio de um índice numérico;

 var v = array [1..5] of integer;

(19)

T

IPO

R

EGISTRO

 Coleção de dados heterogênea cujas informações

podem ser acessadas por meio de um campo;

 var r = record

c1: integer; c2: boolean; end;

(20)

T

IPO

C

ONJUNTO

 Coleção de objetos (ou informações) correlatos que

podem estar presentes ou não em um dado momento;

 var c = set of (V1, V2, V3);

 c := [V1, V2];

(21)

T

IPOS

A

BSTRATOS DE

D

ADOS

 Segundo a Wikipédia:

 Especificação de um conjunto de dados e operações

que podem ser executadas sobre esses dados;

 Exemplo:

 Quando usamos arrays e registros para criar uma

(22)

T

IPOS

A

BSTRATOS DE

D

ADOS

 Vetores, registros e conjuntos são interessantes...

 ... Mas há um problema, são estáticos!

 O que acontece se eu tiver um vetor de 5 posições e

precisar de outras 1000?

 E se meu vetor tiver 100000 posições e eu somente

(23)

A

LOCAÇÃO DE

M

EMÓRIA

 Alocação estática  Variável alocada ocupa

espaço fixo e contíguo na memória;

 Alocação dinâmica  Variável alocada ocupa

(24)

V

ANTAGENS E

D

ESVANTAGENS DA

A

LOCAÇÃO

D

INÂMICA

 Se alocamos dinamicamente, podemos aumentar e

diminuir o tamanho de nossa estrutura quando quisermos!

 Entretanto, necessitaremos de mais algumas operações

para buscar, inserir e/ou remover informações;

 Além disso, um array (estático) de vinte posições

(25)

Arrays

Slides do prof. Rodrigo de Barros Paes

(26)

P

ROBLEMA

 Calcule a média de n números dados e depois de imprimir

a média, devemos imprimir todos os números dados novamente.

(27)

A

RRAY

::

SINTAXE

<tipo de dado> <identificador>[<quantidade máxima de elementos>]

Exemplo:

(28)

FLOAT VALORES

[1000];

(29)

R

ESOLVENDO O PROBLEMA DA MÉDIA

(30)

Q

UANTAS VEZES X APARECEU

? (

LIVRO

10.1)

(31)

E

XERCÍCIOS

(

LIVRO

10.2)

 Usando o programa https://github.com/r0drigopaes/livro/blob/master/10_3.c, imprima

também o índice do elemento que contém o maior valor. Caso existam mais de um maior valor, imprima o primeiro.

 Leia um array com 10 números inteiros e imprima todos os números pares de trás pra

frente. Por exemplo, se os números forem: 2 4 6 5 3 2 5 8 9 1, você deve imprimir: 8 2 6 4 2.

 Leia um array com 10 números inteiros e substitua todos os valores pares por 1 e os

ímpares por -1

 Leia um array com 10 números reais e imprima somente aqueles cujo índice são pares.

(32)

O

UTRAS FORMAS DE INICIALIZAÇÃO

int meu_array[100] = {0}; // todas as posições com zero

int meu_array[100] = {5}; // apenas a primeira posição é inicializada

(33)

PROBLEMA: CALCULAR O DESVIO PADRÃO DE UM CONJUNTO DE VALORES (LIVRO 10.5)

 Medida muito utilizada na estatística para medir o quão

distante da média uma população ou amostra se encontra.

 A raiz quadrada da variância.

 A variância é definida como sendo a média das distâncias

(34)

E

XEMPLO

8, 6, 7, 8, 7, 6, 6, 10 Média: 7.25 Variância:

(8 –7.25)2= 0.5625

(6 - 7.25)2=1.5625

(7 - 7.25)2= 0.0625

(8 - 7.25)2= 0.5625

(7 - 7.25)2= 0.0625

(6 - 7.25)2= 1.5625

(6 - 7.25)2= 1.5625

(10 - 7.25)2= 7.5625

(35)

C

ONT

.

Desvio padrão:

(36)

M

ISSÃO

Função que recebe um array de números como parâmero e retorna o desvio padrão desses números.

Como?

(37)

D

ECOMPONDO

Funções:

media(float n[], int tam)

variância(float n[], int tam) : aqui vamos usar a função média desvio_padrao(float n[], int tam) : aqui vamos usar a função

variância

Vou fazer a média e a variância … e deixar você tentar a

(38)

M

ÉDIA

float media(float n[], int tam) {

int i;

float soma = 0;

for (i=0; i< tam ; ++i) {

soma += n[i]; }

(39)

V

ARIÂNCIA

float variancia(float n[], int tam) {

int i;

float var = 0;

// chama a função média que criamos

float m = media(n,tam);

for (i=0; i< tam ; ++i) {

var += (n[i] - m)*(n[i] - m); }

(40)

S

OLUÇÃO COMPLETA

(41)

E

XERCÍCIOS

(

LIVRO

10.6)

 Escreva uma função que recebe dois parâmetros: um array de inteiros

e um inteiro indicando o tamanho do array e imprime todos os números pares desse array

 Escreva uma função que recebe um array de caracteres e também um

inteiro indicando o seu tamanho e retorna a quantidade de vogais que existem no array.

 Escreva uma função que recebe um array de caracteres e o seu

(42)

S

E USARMOS ARRAY COM UMA DIMENSÃO

float joao[4]; float julia[4]; float maria[4];

float ambrosio[4]; float taise[4];

(43)

A

RRAY BIDIMENSIONAL

<tipo de dado> <identificador>[<linhas>][<colunas>]; Exemplo:

float notas[5][4];

0 1 2 3

0

1

2

3

(44)

A

TRIBUINDO

notas[0][0] = 5.5;

0 1 2 3

0

5.5

1

2

3

(45)

S

EGUNDA NOTA DA

T

AÍSE

notas[4][1] = 8.0;

0 1 2 3

0

5.5

1

2

3

4

(46)

O

U TODA A MATRIZ

(47)

SCANF NA MATRIZ

notas[0][0] = 5.5 ; //atribuição fixa no código

(48)

S

OLUÇÃO

https://github.com/r0drigopaes/livro/blob/master/10_10.c

(49)

E

XERCÍCIOS

(

LIVRO

10.9)

 No código anterior, lemos os elementos da matriz a partir do teclado.

Depois de ler os valores, percorra a matriz e imprima-os, linha por linha.

 Imprima todos os valores da matriz anterior só que agora coluna por

coluna.

 Imprima todos os valores de baixo pra cima, linha a linha, da direita pra

esquerda.

 Imprima todos os valores de baixo pra cima, linha a linha, da esquerda

para a direita.

(50)

E

XERCÍCIO

::

FAZENDO JUNTOS

(

LIVRO

10.10)

(51)

E

XERCÍCIO

::

FAZENDO JUNTOS

 Vamos fazer um programa que lê duas matrizes de inteiros

e preenche uma terceira matriz com o resultado da soma das duas. As matrizes possuem dimensões N x M, onde N e M serão dados pelo usuário. Sabe-se que 1 <= N,M

(52)

S

OLUÇÃO

(53)

M

ATRIZ TRANSPOSTA

(

LIVRO

10.11)

(54)

F

AZENDO JUNTOS

(55)

S

OLUÇÃO

(56)

E

XERCÍCIO

(

LIVRO

10.12)

int main() {

int quadrado[5][5] = {0};

int tabela[5][6] = {{1, 2, 3, 4, 5}, {2, 4, 6, 8, 10},

{20, 10, 5, 3, 1}, {3, 6, 9, 12, 15} };

return 0; }

a) Complete o código ao lado(mas não altere a inicialização das variáveis) para que o conteúdo do

array “quadrado” fique como mostrado a seguir.

(57)

E

XERCÍCIO

(

LIVRO

10.12)

int main() {

int quadrado[5][5] = {0};

int tabela[5][6] = {{1, 2, 3, 4, 5}, {2, 4, 6, 8, 10},

{20, 10, 5, 3, 1}, {3, 6, 9, 12, 15} };

return 0; }

b) Complete o código ao lado para que o conteúdo

(58)

E

XERCÍCIO

(

LIVRO

10.12)

int main() {

int quadrado[5][5] = {0};

int tabela[5][6] = {{1, 2, 3, 4, 5}, {2, 4, 6, 8, 10},

{20, 10, 5, 3, 1}, {3, 6, 9, 12, 15} };

return 0; }

c) Complete o código ao lado para que o conteúdo

(59)

E

XERCÍCIO

(

LIVRO

10.12)

int main() {

int quadrado[5][5] = {0};

int tabela[5][6] = {{1, 2, 3, 4, 5}, {2, 4, 6, 8, 10},

{20, 10, 5, 3, 1}, {3, 6, 9, 12, 15} };

return 0; }

d) O array “tabela” foi parcialmente inicializado.

(60)

Strings

Slides do prof. Rodrigo de Barros Paes

(61)
(62)

M

AS EM MUITOS CASOS

,

PRECISAMOS MANIPULAR

FRASES

!

Problema: Faça um programa para ler uma frase e indicar o seu tamanho!

Exemplo de entrada: o rato

(63)

V

AMOS APRENDER A

:

Como representar uma string Como declarar

(64)

S

TRINGS SÃO ARRAYS DE CARACTERES

char c[8];

c[0] = 'p'; c[1] = 'r'; c[2] = 'o'; c[3] = 'g'; c[4] = 'r'; c[5] = 'a'; c[6] = 'm'; c[7] = 'a';

(65)

M

AS SÃO ESPECIAIS

Inicialização pode ser diferente:

char c[9] = "programa";

(66)

\0

Indica o final de string

char c[9] = "casa";

(67)

L

EITURA VIA SCANF

char c[9];

(68)

T

ENTE DIGITAR “Tudo vale a pena”

(69)

GETS

(70)

I

MPRESSÃO

printf("A frase lida foi: %s\n",frase);

(71)

E

XERCÍCIOS

 Modifique o código do exercício anterior para imprimir a quantidade de vogais

que aparecem na frase e não a quantidade de caracteres.

 Faça um programa para ler uma string e um caractere qualquer e imprima o

número de ocorrências desse caractere na string. Por exemplo, se a string for

“abacate” e o caractere for: ‘a’, então a resposta deve ser 3.

 Leia uma string e copie o seu conteúdo invertido em um outro array. Por exemplo, se a string for “PROGRAMAR”, então a outra string será:

“RAMARGORP”

 Diferentemente do exercício anterior, leia uma string e inverta o seu conteúdo

(72)

Ponteiros

Slides do prof. Rodrigo de Barros Paes

(73)

T

IPO

Um tipo define o conjunto de valores válidos para aquela variável.

Exemplos:

int : números inteiros float : números reais char : caractere

(74)

P

ONTEIRO

Um tipo capaz de armazenar endereços e memória

(75)

A

MEMÓRIA

Código: área onde o programa compilado

reside;

Global: variáveis globais

Pilha: parâmetros de funções e variáveis

locais

(76)
(77)

P

ONTEIROS

Se um ponteiro guarda o endereço de memória, como saber o endereço de memória de uma variável?

OPERADOR &

Endereço da variável x:

(78)

D

ECLARAÇÃO

(79)

D

ESAFIO

Escreva uma função que troque o conteúdo de duas variáveis. #include <stdio.h>

void troca(int x, int y) {

// implementar }

int main() {

int a, b; a = 5; b = 3; troca(a,b);

printf("a=%d, b=%d\n", a, b);

(80)

R

OTEIRO

(81)

E

XERCÍCIO

:

ORDENAR TRÊS VARIÁVEIS INTEIRAS

(82)

S

OLUÇÃO

(83)

P

ONTEIROS

 Ponteiros guardam endereços de memória.

 Um ponteiro também tem tipo. No C quando declaramos ponteiros nós

informamos ao compilador para que tipo de variável vamos apontá-lo.

 Por exemplo, um ponteiro int aponta para um inteiro, isto é, guarda o endereço de

(84)

P

ONTEIROS

 Para declarar um ponteiro temos a seguinte forma geral:

tipo_do_ponteiro *nome_da_variável;

 É o asterisco (*) que faz o compilador saber que aquela variável não vai guardar

um valor mas sim um endereço para aquele tipo especificado.

 Exemplos:

int *pt;

char *temp, *pt2;

 Ponteiros não inicializados apontam para um lugar indefinido.

 Os ponteiros devem ser inicializados (apontado para algum lugar conhecido)

(85)

P

ONTEIROS

 Para atribuir um valor a um ponteiro recém-criado poderíamos igualá-lo a um valor

de memória.

 Mas, como saber a posição na memória de uma variável do nosso programa?

 Podemos então deixar que o compilador faça este trabalho por nós. Para saber o

endereço de uma variável basta usar o operador &. Veja o exemplo:

int count=10; int*pt;

(86)

P

ONTEIROS

 Para alterar o valor de uma variável apontado por um ponteiro, basta usar o

operador *.

 Resumindo:

*pt: o conteúdo da posição de memória apontado por pt;

&count: o endereço onde armazena a variável count.

int count=10; int*pt;

pt = &count; *pt = 12;

(87)

P

ONTEIROS

E

XEMPLO

1

#include <stdio.h>

void main (){

int num, valor; int*p;

num = 55;

p = &num; /* Pega o endereco de num */ valor = *p;

/* Valor e igualado a num de uma maneira indireta */ printf ("\n\n%d\n", valor);

printf ("Endereco para onde o ponteiro aponta: %p\n", p); printf ("Valor da variavel apontada: %d\n", *p);

(88)

P

ONTEIROS

E

XEMPLO

2

#include <stdio.h>

void main (){ int num, *p;

num = 55;

p = &num; /* Pega o endereco de num */ printf ("\n Valor inicial: %d\n", num);

*p = 100; /* Muda o valor de num de uma maneira indireta */ printf ("\n Valor final: %d\n", num);

(89)

O

PERAÇÕES ARITMÉTICAS COM PONTEIROS

 p1 = p2; p1 aponte para o mesmo lugar que p2;

 *p1 = *p2; a variável apontada por p1 tenha o mesmo conteúdo da

variável apontada por p2;

 p++; passa a apontar para o próximo valor do mesmo tipo para o

qual o ponteiro aponta. Isto é, se temos um ponteiro para um inteiro e o incrementamos ele passa a apontar para o próximo inteiro;

 p--; funciona semelhantemente;

 (*p)++; incrementar o conteúdo da variável apontada pelo ponteiro

(90)

O

PERAÇÕES ARITMÉTICAS COM PONTEIROS

 p = p+15; ou p+=15; incrementar um ponteiro de 15;

 *(p +15); usar o conteúdo do ponteiro 15 posições adiante;

 == e != para saber se dois ponteiros são iguais ou diferentes;

 >, <, >= e <= estamos comparando qual ponteiro aponta para uma posição mais

alta na memória. Então uma comparação entre ponteiros pode nos dizer qual dos dois está "mais adiante" na memória.

Há entretanto operações que você não pode efetuar num ponteiro. Você não pode dividir ou multiplicar ponteiros, adicionar dois

(91)

P

ONTEIROS

G

ENÉRICOS

 Um ponteiro genérico e um ponteiro que pode apontar para qualquer tipo de dado.

 Define-se um ponteiro genérico utilizando-se o tipo void:

 O tipo de dado apontado por um void pointerdeve ser controlado pelo usuário

 Usando um type cast (conversão de tipo) o programa pode tratar adequadamente

o ponteiro

void *pv; int x=10; float f=3.5;

(92)

P

ONTEIROS E

V

ETORES

 Há uma diferença entre o nome de um vetor e um ponteiro que deve ser frisada:

um ponteiro é uma variável, mas o nome de um vetor não é uma variável. Isto significa, que não se consegue alterar o endereço que é apontado pelo "nome do vetor".

/* as operações abaixo são válidas */

int vetor[10]; int *ponteiro, i;

ponteiro = &i;

/* as operações a seguir são inválidas */

vetor = vetor + 2; /* ERRADO: vetor não e' variável */ vetor++; /* ERRADO: vetor não e' variável */

vetor = ponteiro; /* ERRADO: vetor não e' variável */ /* as operações abaixo são válidas */

(93)

P

ONTEIROS E

V

ETORES

Exemplo

Podemos ver que p[2] equivale a *(p+2)

#include <stdio.h>

voidmain ()

{

int matrx [10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int *p;

p = matrx;

(94)

P

ONTEIROS E

S

TRINGS

 strings são arrays de caracteres e podem ser acessados através de char *

 abcdef

 O incremento de pc o posiciona sobre o próximo caracter (byte a byte) void main ()

{

char str[]=“abcdef”, *pc;

for (pc = str; *pc != ‘\0’; pc++)

(95)

P

ONTEIROS E

S

TRINGS

 Operações sobre strings com ponteiros

void StrCpy (char *destino, char *origem)

{

while(*origem) /* *origem==‘\0’ encerra while */

(96)

P

ONTEIROS E

S

TRINGS

 Variação de strcpy:

void strcpy (char *destino, char *origem)

{

while((*destino = *origem) != ‘\0’)

(97)

V

ETORES DE

C

ARACTERES

 Percorrendo vetores com ponteiro:

void main () {

char matriz[5][10]; char *pc;

int i;

for (i=0, pc=matriz[0]; i < 50; i++, pc++)

*pc = ‘ ‘; }

void main () {

char matriz[5][10]; int i, j;

for (i=0; i<5; i++) for (j=0; j<10; j++)

matriz[i][j] = ‘ ‘;

(98)

V

ETOR DE

S

TRINGS

 Cada elemento do vetor é um ponteiro para um

caracter.

 Declaração:

char *arstr[] = {“Joao”, “Maria”, “Antonio”, “Zacarias”, “Carlos”};

arstr e um vetor de ponteiros para char, iniciado

(99)

V

ETOR DE

S

TRINGS

 Comparando vetor de string com matriz de char

char *as[]=

{“Joao”,“Maria”,“Antonio”,“Zacarias”,“Carlos”};

char ma[5][10]=

(100)

C

UIDADO COM

S

TRINGS

 E comum esquecer de alocar uma área para

armazenamento de caracteres

void main() {

char *pc; char str[] = “Um string”;

strcpy(pc, str); /* erro! pc indeterminado */

(101)

V

ETORES DE PONTEIROS

 Podemos construir vetores de ponteiros como declaramos vetores de qualquer

outro tipo. Uma declaração de um vetor de ponteiros inteiros poderia ser:

int*pmatrx [10];

(102)

V

ETORES MULTIDIMENSIONAIS

 Vetores podem ter diversas dimensões, cada uma

identificada por um par de colchetes n declaração

 Ex:

char matriz[5][10];

 Declara uma matriz de 5 linhas e 10 colunas;  Na memória, entretanto, os caracteres são

(103)

P

ONTEIROS PARA

P

ONTEIROS

 Um ponteiro para um ponteiro é como se você anotasse o endereço de um papel

que tem o endereço da casa do seu amigo.

 Podemos declarar um ponteiro para um ponteiro com a seguinte notação:

tipo_da_variável **nome_da_variável;

**nome_da_variável é o conteúdo final da variável apontada; *nome_da_variável é

(104)

P

ONTEIROS PARA

P

ONTEIROS

 Para acessar o valor desejado apontado por um ponteiro para ponteiro, o

operador asterisco deve ser aplicado duas vezes, como mostrado no exemplo abaixo:

#include <stdio.h>

void main()

{

floatfpi = 3.1415, *pf, **ppf;

pf = &fpi; /* pf armazena o endereco de fpi */ ppf = &pf; /* ppf armazena o endereco de pf */ printf("%f", **ppf); /* Imprime o valor de fpi */

(105)

C

UIDADO

!!!

 O principal cuidado ao se usar um ponteiro deve

ser:

saiba sempre para onde o ponteiro está apontando.

void main () /* Errado -Nao Execute */ {

(106)
(107)

Q

UIZ

void exemplo2() {

int firstvalue, secondvalue;

int * mypointer; mypointer = &firstvalue;

*mypointer = 10; mypointer = &secondvalue;

*mypointer = 20; printf("%d\n", firstvalue);

printf("%d\n", secondvalue);

(108)
(109)
(110)
(111)

Alocação Dinâmica

Slides do prof. Mário Dantas

(112)

A

LOCAÇÃO DE

M

EMÓRIA

 Alocação Estática

 Espaço de memória é reservado previamente;

 Área de Tamanho FIXO e de Endereço FIXO (estática);  Declarado e reservado em tempo de compilação

Exemplo: variáveis globais - declaradas fora do main/funções

 Alocação Dinâmica:

 Espaço de memória é alocado em tempo de execução

usando as funções “calloc” e “malloc” (dinâmica);  Áreas de Tamanho VARIÁVEL e de Endereço VARIÁVEL

são criadas (reserva memória) e destruídas (libera memória);

 Acesso usualmente através de Endereços e Ponteiros Exemplo: ponteiros+calloc/malloc ou variáveis locais

(113)

ALOCAÇÃO

DINÂMICA DE

MEMÓRIA

 Ponteiros fornecem o suporte necessário para o poderoso sistema de alocação dinâmica.

 Alocação dinâmica é o meio pelo qual um programa

pode obter memória enquanto está em execução.

(114)

ALOCAÇÃO

DINÂMICA DE

MEMÓRIA

 Por exemplo, um processador de texto ou um banco de dados aproveita toda a RAM de um sistema. Porém, como a

quantidade de RAM varia entre computadores esses programas não podem usar variáveis normais.

(115)

ALOCAÇÃO

DINÂMICA DE

MEMÓRIA

 A memória alocada pelas funções de alocação dinâmica é obtida do heap – a região de memória livre do seu

computador.

 Embora o tamanho do heap seja desconhecido, ele

(116)

ALOCAÇÃO

DINÂMICA DE

MEMÓRIA

 No padrão C ANSI existem 4 funções para alocações dinâmica pertencentes a biblioteca stdlib.h. São elas malloc(), calloc(), realloc() e free(). Sendo que as mais utilizadas são as funções

malloc() e free().

malloc() aloca memória

(117)

ALOCAÇÃO

DINÂMICA DE

MEMÓRIA

(118)

MALLOC()

 A sintaxe da função malloc() é dada por:

numero_de_bytes é o número de bytes da memória que você quer alocar.

 O tipo size_t é definido em stdlib.h como sendo um inteiro sem sinal.

 O interessante é que esta função retorna um ponteiro do tipo void podendo assim ser atribuído a qualquer tipo de ponteiro.

(119)

MALLOC()

 O fragmento de código mostrado abaixo aloca 1000 bytes de memória:

(120)

MALLOC()

 Para garantir portabilidade é interessante então efetuar o cast para o tipo de ponteiro que você deseja:

(121)

MALLOC()

 O próximo exemplo aloca espaço para 50 inteiros.

(122)

MALLOC()

 Como o heap não é infinito, sempre que alocar memória, você deve testar o valor devolvido por malloc(), antes de usar o ponteiro, para estar certo de que não é nulo.

(123)

FREE()

 A função free() é o oposto de malloc(), visto que ela devolve memória previamente alocada ao sistema.

 Uma vez que a memória tenha sido liberada, ela pode ser realocada por uma nova chamada a malloc().

 Aqui, pont é um ponteiro para a memória alocada

anteriormente por malloc(). É muito importante que você nunca use free() com um argumento inválido, isso destruiria a lista de memória livre.

(124)

ESTRUTURA DE

DADOS

(125)
(126)
(127)
(128)
(129)

A

LOCAÇÃO

D

INÂMICA DE

M

EMÓRIA

 Alocação de memória:

 calloc - Aloca memória, zerando os dados

 malloc - Aloca memória, sem inicializar os dados

 free - Libera um bloco de memória alocada previamente

 void *calloc ( <quantidade_elementos>, <tamanho_elemento> )

 Exemplo: tabela_inteiros = calloc( 10, sizeof ( int ) );

 void *malloc( <quantidade_elementos>, <tamanho_elemento> )

 Exemplo: tabela_inteiros = malloc( 10, sizeof ( int ) );

 void free ( void *ponteiro)

 Exemplo: free ( tabela_inteiros );

(130)

A

LOCAÇÃO

D

INÂMICA DE

M

EMÓRIA

Exemplos:

int *ptr_int; double *ptr_pf;

ptr_int = (int*)calloc(10,sizeof(int)); /* Aloca 10 inteiros em seqüência */

ptr_pf = (double*)calloc(10,sizeof(double)); /* Aloca 10 n. tipo double */ free (ptr_int); /* Libera a área de memória alocada */

Fazendo a criação de um vetor de duas formas equivalentes:

int tabela[10]; /* Aloca memória: tabela aponta para o início do vetor */ ou

int *tabela; tabela = (int *) calloc (10, sizeof(int));

(131)

E

XEMPLOS 131 #include <stdio.h> #include <stdlib.h> double Tabela[10]; main () { int i;

for (i=0; i < 10; i++) {

printf("Dado %d = ",i); scanf ("%lf",&(Tabela[i])); }

printf("\nDados Lidos:\n"); for (i=0; i < 10; i++)

printf("Dado %d = %.2lf \n",i, Tabela[i]);

system(“pause”);

}

#include <stdio.h>

#include <stdlib.h> /* Inclui a lib do "calloc" */ double *Tabela; /* Cria somente o

ponteiro (não aloca)*/ main () {

int i;

Tabela=(double*)calloc(10,sizeof(double)); for (i=0; i < 10; i++) {

printf("Dado %d = ",i); scanf ("%lf",&(Tabela[i])); }

printf("\nDados Lidos:\n"); for (i=0; i < 10; i++)

printf("Dado %d = %.2lf \n",i, Tabela[i]);

system(“pause”);

}

(132)

Estruturas

Slides do prof. Rodrigo de Barros Paes

(133)

D

ESAFIO

 Fazer o sistema de controle de uma locadora online de

filmes.

Módulo de cadastro de clientes:

Código

Nome

Data de nascimento

Sexo (masculino ou feminino)

(134)

O

PÇÃO

1

int codigo;

char nome[500];

int dia_nascimento; int mes_nascimento; int ano_nascimento;

(135)
(136)

D

ESSA FORMA

PARA IMPRIMIR

Nome e data de nascimento do cliente 30:

printf("%s %d\n",nome[30],ano_nascimento[30]);

Imprimir tudo:

void imprimir(int codigo, char nome[500], int dia_nascimento, int mes_nascimento, int

ano_nascimento, int sexo) {

(137)

STRUCT

Com o struct podemos criar um novo tipo de dados Composto por tipos já existentes

E também por outras estruturas que criamos antes

struct <identificador do tipo> {

(138)

D

ECLARANDO VARIÁVEIS

struct <identificador do tipo> <identificador da variável>;

struct cliente um_cliente;

(139)

M

ODIFICANDO A FUNÇÃO DE IMPRIMIR

De:

void imprimir(int codigo, char nome[500], int dia_nascimento, int mes_nascimento, int ano_nascimento, int sexo)

{ }

Para:

void imprimir(struct cliente c) {

(140)

P

OR DENTRO DA FUNÇÃO IMPRIMIR

Como acessar os campos?

(141)

T

UDO JUNTO

Declaração do tipo

Declaração da variável Passagem de parâmetro Acessando valores

Modificando valores

(142)

A

RRAYS

arrays de inteiros

int a[5];

arrays de floats

float a[5];

arrays de estruturas

(143)

E

XEMPLO COMPLETO

(144)

E

XERCÍCIOS

Modifique o código anterior para que o cliente também tenha CPF. Lembre de ler e imprimir.

Implemente a função:

Figure

Updating...

Download now (144 pages)