View
215
Download
0
Category
Preview:
Citation preview
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
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
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
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];
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);
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:
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
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;
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);
}
}
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;
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
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
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
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!
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;
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
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);
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);
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
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)
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
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);
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));
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);
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!");
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);
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.
Recommended