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

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

  • Upload
    ngominh

  • View
    219

  • Download
    0

Embed Size (px)

Citation preview

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.