estruturas de dados - feg.unesp.br · 2014 ©mdas estruturas de dados | programação de...

27
Estruturas de Dados | Programação de Computadores 1 de 26 2014 © MdaS Estruturas de Dados Estruturas de Dados Estruturas de Dados Estruturas de Dados Alguns dados não costumam ser tão simples assim... Podem ser compostos por vários dados distintos

Upload: ngominh

Post on 20-Oct-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 1 de 262014 © MdaS

Estruturas de DadosEstruturas de DadosEstruturas de DadosEstruturas de Dados

� Alguns dados não costumam ser tão simples assim...

� Podem ser compostos por vários dados distintos

Page 2: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 2 de 262014 © MdaS

Tipos Estruturados de DadosTipos Estruturados de DadosTipos Estruturados de DadosTipos Estruturados de Dados

� Em C, é possível agregar, NA MESMA VARIÁVEL, vários tipos distintos de dados

� Ex: a variável motorista pode conter� Nome

� String

� RG� Inteiro

� CPF� Inteiro

� Categoria� Caractere

� Validade� String

Page 3: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 3 de 262014 © MdaS

DefiniDefiniDefiniDefiniçççção de Tipo Estruturadoão de Tipo Estruturadoão de Tipo Estruturadoão de Tipo Estruturado

� Antes da declaração das variáveis compostas, énecessário definir o novo tipo de dados

� Para isto, é utilizada a função typedef struct

� Deve ser inclusa antes da declaração das variáveis

typedef struct {

char nome[80];

int rg;

int cpf;

char categ;

int val[3];

} motorista;

typedef struct e abre as chaves

Declaração dos dados

assim como são nas variáveis

Fecha as chaves e dá-se

o nome do bloco

Page 4: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 4 de 262014 © MdaS

DeclaraDeclaraDeclaraDeclaraçççção do Tipo Estruturadoão do Tipo Estruturadoão do Tipo Estruturadoão do Tipo Estruturado

� Após a definição, para se utilizar uma variável de tipo estruturado, é feita a declaração das variáveis de tal tipo

� É semelhante à dos tipos primitivos � float, int, double, char

� Pode ser declarado como vetor ou matriz

motorista a;

motorista b[20];

motorista caminnhoneiro[10][10];

Page 5: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 5 de 262014 © MdaS

AtribuiAtribuiAtribuiAtribuiçççção de Valoresão de Valoresão de Valoresão de Valores

� A atribuição de valores deve ser feita por elemento da variável

� É separada por meio de um ponto

a.nome = "Bento Ribeiro";

a.rg = 123456789;

b[0].categ = 'A';

b[2].categ = 'D';

gets(carro.marca); gets(carro.modelo);

carro.ano = 2009;

carro.km = 17890.3;

scanf("%d", &carro.portas);

Page 6: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 6 de 262014 © MdaS

ExemploExemploExemploExemplo#include <stdio.h>

#include <stdlib.h>

#include <math.h>

typedef struct {

float x;

float y;

} ponto;

ponto P, Q;

float dist;

//programa

int main()

{

printf("Ponto P: ");

scanf("%f %f", &P.x, &P.y);

printf("Ponto Q: ");

scanf("%f %f", &Q.x, &Q.y);

dist = sqrt(pow((P.x - Q.x), 2) + pow((P.y - Q.y), 2));

printf("Dist(P, Q) = %f\n", dist);

system("PAUSE");

}

Calcular a distância entre dois pontos no plano bidimensional, dado que:

Page 7: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 7 de 262014 © MdaS

ExemploExemploExemploExemplo

� Ler e exibir uma lista de chamada com 10 alunos, contendo o nome do aluno, o registro de matrícula e o município onde reside

Page 8: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 8 de 262014 © MdaS

ExemploExemploExemploExemplo

� Declaração das variáveis

#include <math.h>

#define N 10

typedef struct {

char nome[80];

int matricula;

char municipio[50];

} aluno;

aluno classe[N];

int i;

Page 9: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 9 de 262014 © MdaS

ExemploExemploExemploExemplo

� Restante do códigoint main()

{

for (i = 0; i < N; i++)

{

printf("Nome do aluno %d: ", i);

gets(classe[i].nome);

printf("Matricula %d: ", i);

scanf("%d", &classe[i].matricula);

printf("Municipio do aluno %d: ", i);

gets(classe[i].municipio);

}

printf("LISTAGEM DE ALUNOS: \n");

for (i = 0; i < N; i++)

{

printf("%7d - %s\n", classe[i].matricula, classe[i].nome);

printf("Reside em: %s ", classe[i].cidade);

}

}

Page 10: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 10 de 262014 © MdaS

ExercExercExercExercíííícioscioscioscios

1. Faça um algoritmo que peça para entrar com o nome, registro e nota final de um aluno e exiba a listagemdos alunos que tiveram notas maiores que 5

2. Num algoritmo, insira os dados de 5 carros e peçapara que o programa exiba:� a) O número de carros da VW� b) a marca e o modelo dos carros

da cor prata//carro:

typedef struct {

char marca[20];

char modelo[20];

int ano;

char cor[20];

} carro;

Page 11: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 11 de 262014 © MdaS

PonteirosPonteirosPonteirosPonteiros

� Considere um carteiro recém-chegado na vila

� Na vila, a referência para se encontrar a casa é pelo morador

Page 12: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 12 de 262014 © MdaS

PonteirosPonteirosPonteirosPonteiros

� No entanto, as cartas são direcionadas de acordo com o endereço das casas

Page 13: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 13 de 262014 © MdaS

PonteirosPonteirosPonteirosPonteiros

� Em C, os dados (representados pelas variáveis) não são representados na memória pelo seu nome� Esta tarefa é realizada apenas na programação

� Na memória, os dados são armazenados em função dos seus respectivos endereços

� A variável ocupa um espaço endereçável da memória a partir do momento em que ela é declarada

Page 14: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 14 de 262014 © MdaS

EndereEndereEndereEndereççççosososos

� Para saber o endereço de memória onde a variável está alocada, utiliza--se a expressão %X em meio ao printf

� Note que a variável é precedida por um &

� Este caractere significa que estásendo referenciado o endereço da variável na memória� Por isso que ele é utilizado no scanf...

printf("Posicao da variavel %X: ", &x);

GATA, EU NÃO SOU CARTEIRO, MAS VIM TE DAR UM SELINHO. BOA NOITE!

Page 15: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 15 de 262014 © MdaS

PonteirosPonteirosPonteirosPonteiros

� Algumas variáveis são utilizadas para armazenar o endereço de memória de algumas informações

� Estas variáveis são conhecidas como ponteiros

� Em suas declarações, são precedidas por um *

int *a;

float *x;

char *c;

cliente *ender;

Page 16: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 16 de 262014 © MdaS

PonteirosPonteirosPonteirosPonteiros

� Em suma, o ponteiro serve para armazenar o endereço de memória de um determinado valor

� Cada ponteiro deve possuir o * ao ser declarado

� O elemento neutro de um ponteiro é o NULL

float x = 5.0;

float *y;

y = &x;

5.0x 0D5 0D5y 0A4

Page 17: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 17 de 262014 © MdaS

Tipos de ReferênciaTipos de ReferênciaTipos de ReferênciaTipos de Referência

� Referência direta – o acesso à memória é feito por meio da variável associada ao endereço

a = 500;

printf("Valor de a: %d\n", a);

printf("Endereco de a: %p\n", &a);

a++;

printf("%d" ,a);

Page 18: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 18 de 262014 © MdaS

Tipos de ReferênciaTipos de ReferênciaTipos de ReferênciaTipos de Referência

� Referência indireta – o acesso à memória é feito através do ponteiro associado ao endereço

*pa = 500;

printf("Valor de a: %d\n", *pa);

printf("Endereco de a: %p\n", pa);

*pa++;

printf("%d", *pa);

Page 19: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 19 de 262014 © MdaS

Deslocamento de um ponteiroDeslocamento de um ponteiroDeslocamento de um ponteiroDeslocamento de um ponteiro

� Em se tratando de ponteiros, os sinais aritméticos + e –servem como deslocadores dos endereços de memória

� Têm como finalidade modificar a direção dos ponteiros para posições posteriores e anteriores da memória, respectivamente

� O mesmo pode ser aplicado à índices de vetores

char s[80], *ps, c;

ps = s; // equivalente à ps = &s[0];

//Atribui o elemento da posição 6 da string s à variável c

c = s[6]; // indexação de vetores, ou

c = *(ps + 6); // aritmética de ponteiros

Page 20: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 20 de 262014 © MdaS

AlocaAlocaAlocaAlocaçççção Dinâmica de Memão Dinâmica de Memão Dinâmica de Memão Dinâmica de Memóóóóriariariaria

� Em C, variáveis e constantes devem ser declaradas antes de serem utilizadas

� Se forem vetores ou matrizes, o número máximo jádeve ser pré-determinado (alocação estática)

� Porém, ponteiros permitem que este número possa ser estabelecido durante a execução do programa (alocação dinâmica)

Page 21: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 21 de 262014 © MdaS

AlocaAlocaAlocaAlocaçççção Dinâmica de Memão Dinâmica de Memão Dinâmica de Memão Dinâmica de Memóóóóriariariaria

� Algumas funções são utilizadas para a alocação dinâmica de memória� sizeof(valor): comprimento em bytes de um dado� calloc(num, tam): faz a alocação dinâmica, onde:

� num: número de elementos do vetor� tam: tamanho em bytes de cada elemento

� free(variavel): libera da memória o espaço ocupado pela variável

� Antes da função calloc(), deve ser colocado entre parênteses o tipo estruturado do dado juntamente com o ponteiro

Page 22: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 22 de 262014 © MdaS

AlocaAlocaAlocaAlocaçççção Dinâmica de Memão Dinâmica de Memão Dinâmica de Memão Dinâmica de Memóóóóriariariaria

� Exemplo de uma alocação dinâmica de um vetor de inteiros de dimensão n:

int *x;

int n, i;

printf("Tamanho do vetor: ");

scanf("%d", &n);

x = (int *) calloc(n, sizeof(int));

puts("Informe os elementos do vetor x:");

for (i = 0; i < n; i++)

scanf("%d", &x[i]);

...

free(x);

Page 23: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 23 de 262014 © MdaS

AlocaAlocaAlocaAlocaçççção Dinâmica de Memão Dinâmica de Memão Dinâmica de Memão Dinâmica de Memóóóóriariariaria

� No caso de uma matriz, a alocação deve ser feita em duas etapas

int **Y;

int m, n, i;

printf("Numero de linhas: ");

scanf("%d", &m);

Y = (int **) calloc(m, sizeof(int *));

printf("Numero de colunas: ");

scanf("%d", &n);

for (i = 0; i < m; i++)

Y[i] = (int *) calloc(n, sizeof(int));

Page 24: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 24 de 262014 © MdaS

AlocaAlocaAlocaAlocaçççção Dinâmica de Memão Dinâmica de Memão Dinâmica de Memão Dinâmica de Memóóóóriariariaria

� Para a liberação da variável da memória, utiliza-se a função free():� A liberação pode ser feita vetor a vetor

� Em se tratando de strings, a alocação dinâmica é bem mais simples...

for (i = 0; i < m; i++)

free(Y[i]);

free(Y);

char *nome;

puts("Entre com seu nome: ");

gets(nome);

printf("Seu nome: %s\n", nome);

Page 25: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 25 de 262014 © MdaS

AlocaAlocaAlocaAlocaçççção Dinâmica de Memão Dinâmica de Memão Dinâmica de Memão Dinâmica de Memóóóóriariariaria

� Em algumas situações, é necessário que seja feita a verificação da alocação de memória

� Um exemplo de verificação é dado da seguinte maneira:

� Neste caso, se não ocorre a alocação de memória, a mensagem aparecerá

� Pode ser colocados comandos para, por exemplo, encerrar o programa, caso seja necessário

if (p == NULL)

puts("Memoria nao alocada para p!");

Page 26: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 26 de 262014 © MdaS

ExercExercExercExercíííícioscioscioscios

1. Escreva um programa em C que calcule a soma de dois vetores de tamanho n alocados dinamicamente

2. Reescreva em um programa C o seguinte trecho de código e responda (Pereira, 2010)

a) Qual a saída fornecida pelo programa?b) Se os &’s fossem omitidos, qual seria a saída do programa?

char c, *pc;

int i, *pi;

double x, *px;

pc = &c;

printf("Tam. c: %dB\tEndereco c: %p\t Prox. endereco: %p\n", sizeof(c), pc, pc+1);

pi = &i;

printf("Tam. i: %dB\tEndereco i: %p\t Prox. endereco: %p\n", sizeof(i), pi, pi+1);

px = &x;

printf("Tam. x: %dB\tEndereco x: %p\t Prox. endereco: %p\n", sizeof(x), px, px+1);

Page 27: Estruturas de Dados - feg.unesp.br · 2014 ©MdaS Estruturas de Dados | Programação de Computadores 1de 26 ... //carro:b) a marca e o modelo dos carros da cor prata typedef struct

Estruturas de Dados | Programação de Computadores 27 de 262014 © MdaS

ExercExercExercExercíííícioscioscioscios

1. Faça um programa em C que leia um vetor de dimensão n e calcule, em um outro vetor, a soma do valor do elemento pelo seu respectivo índice. Utilize alocação dinâmica de memória.

2. Tendo como base o conhecimento adquirido por ponteiros, dadas duas matrizes quadradas A e B, de dimensão n, calcule A – Bt, utilizando alocação dinâmica de memória.