24
Programação de Computadores Aula 7 e 8 13 e 20/09/2012 Profª Ms. Engª Elaine Cecília Gatto Unidade 6: Estruturas, Uniões, Enumerações e Tipos Definidos pelo Usuário Curso de Bacharelado em Engenharia de Computação Universidade do Sagrado Coração USC Bauru/SP

Aula 7 pc - estrutura

Embed Size (px)

Citation preview

Page 1: Aula 7   pc - estrutura

Programação de ComputadoresAula 7 e 8

13 e 20/09/2012

Profª Ms. Engª Elaine Cecília Gatto

Unidade 6: Estruturas, Uniões, Enumerações e Tipos Definidos pelo Usuário

Curso de Bacharelado em Engenharia de Computação

Universidade do Sagrado Coração – USC

Bauru/SP

Page 2: Aula 7   pc - estrutura

Estruturas: conceito/definição

• São coleções de variáveis relacionadas agrupadas sob umúnico nome.

• Podem conter variáveis de muitos tipos de dados diferentes.

• São usadas para declarar registros a serem armazenados emarquivo.

• Estruturas de dados mais complexas: listas, filas, pilhas eárvores.

• Ponteiros e estruturas facilitam a formação dessas estruturas.

• Tipos de dados derivados (e não primitivos)

Page 3: Aula 7   pc - estrutura

Declarações de Estruturas

• Declaração de uma estrutura:

struct card {

char * face;

char *suit;

};

• STRUCT é a palavra chave para estrutura;

• TAG DE ESTRUTURA: neste caso é a palavra CARD. A Tag deEstrutura é usada para declarar variáveis desse tipo deestrutura, é o identificador deste tipo de estrutura.

• As variáveis dentro da estrutura chamam-se MEMBROS.

• Não esquecer do ponto e vírgula ao final da declaração!

Page 4: Aula 7   pc - estrutura

Declarações de Estruturas

• Obs.: dois tipos de estruturas diferentes podem ter membros com o mesmo nome;

• Vetores e matrizes tem um único tipo. Exemplo um vetor de reais ou uma matriz de inteiros.

• Estruturas podem ter vários tipos de dados diferentes. Exemplo:

struct funcionario {

char nome[20];

char sobrenome[20];

int idade;

char sexo;

double salario;

};

Page 5: Aula 7   pc - estrutura

Estrutura Autorreferenciada

• É uma estrutura que contém um membro que é um ponteiro para o mesmo tipo de estrutura. São usadas para criar listas interligadas. Exemplo:

struct funcionario2 {

char nome[20];

char sobrenome[20];

int idade;

char sexo;

double salario;

struct funcionario2 *ePtr; //estrutura autorreferenciada

}

Page 6: Aula 7   pc - estrutura

Declarações de variáveis de tipos de estrutura• Declarações de estruturas não criam espaço na memória;

• Declarações de estruturas criam um novo tipo de dado;

• Esse novo tipo de dado é usado para declarar variáveis que entãoocupam espaço na memória;

• Exemplo:

struct card aCard, deck[52], *carPtr;

OU

struct card {

char *face;

char *suit;

} aCard, deck[52], *carPtr;

• aCard: é uma variável do tipo struct card;

• deck: é um vetor com 52 posições do tipo struct card;

• carPtr: é um ponteiro para struct card;

Page 7: Aula 7   pc - estrutura

Nomes para tags de estruturas

• O nome para a tag de estrutura é opcional;

• Entretanto, sempre forneça um nome, é uma práticarecomendada;

• Escolha um nome significativo para a tag de estrutura. Istoajuda a tornar o programa mais legível e melhordocumentado.

• Se uma declaração de estrutura não tiver um nome para a tagde estrutura, as variáveis do tipo da estrutura só poderão serdeclaradas na declaração da estrutura, e não em umadeclaração separada.

Page 8: Aula 7   pc - estrutura

Operações que podem ser realizadas nas estruturas• Operações válidas:

• Atribuição de variáveis da estrutura a variáveis da estrutura demesmo tipo;

• Coleta de endereço de uma variável de estrutura (operador&);

• Acesso aos membros de uma variável de estrutura;

• Uso do operador sizeof para determinar o tamanho de umavariável de estrutura.

• NÃO PODEMOS:

• Comparar estruturas usando == e !=

Page 9: Aula 7   pc - estrutura

Inicialização de estruturas

• Parecido com vetores e matrizes. Exemplo:

struct card aCard = {“Três”, “Copas”};

• Inicializa o membro da estrutura FACE com o valor TRÊS e omembro SUIT com o valor COPAS.

• Atenção: se o número de inicializadores na lista for menor queos membros na estrutura, os membros restantes serãoautomaticamente inicializados em zero, ou NULL se o membrofor um ponteiro.

Page 10: Aula 7   pc - estrutura

Acesso a membros da estrutura• Dois operadores são usados para acessar os membro de uma

estrutura:

• Operador de membro de estrutura ou operador de ponto ( . )– é um ponto de fato!

• Operador de ponteiro de estrutura ou operador de seta ( )– é uma seta de fato!

• Exemplo 1: printf(“%s”, aCard.suit);

• Exemplo 2: printf(“%s”, cardPtr->suit);

• Ambos imprimem na tela o conteúdo de SUIT;

Page 11: Aula 7   pc - estrutura

Acesso a membros da estrutura/* Usando operadores de membro da estrutura e deponteiro da estrutura */

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

/* Declaração da estrutura da carta */

struct card {

char *face; //ponteiro

char * suit; //ponteiro

}; //fim da estrutura

Page 12: Aula 7   pc - estrutura

Acesso a membros da estruturaint main(void){

struct card aCard; //declaração de variável

struct card *cardPtr; //declaração de ponteiro

//coloca strings em aCard

aCard.face = “Ás”;

aCard.suit = “Espadas”;

//atribui o endereço de aCard a cardPtr

cardPtr = &aCard;

printf(“ %s%s%s \n %s%s%s \n %s%s%s \n ”,

aCard.face, “ de ”, aCard.suit,

cardPtr->face, “ de ”, cardPtr->suit,

(*cardPtr).face, “ de ”, (*cardPtr).suit);

return 0; //conclusão bem sucedida

}

Page 13: Aula 7   pc - estrutura

Uso de estruturas com funções

• As estruturas podem ser passadas a funções ao:

• Passar membros da estrutura individuais;

• Passar uma estrutura inteira;

• Passar um ponteiro para uma estrutura;

• Quando as estruturas ou membros individuais da estruturasão passados a uma função, eles são passados por valor;

• Os membros das estruturas passados por valor não podemser modificados pela função utilizada;

• Para passar uma estrutura por referência:

• Passe o endereço da variável da estrutura;

Page 14: Aula 7   pc - estrutura

Uso de estruturas com funções

• Um array pode ser passado por valor usando uma estrutura;

• Para isto faça:

• Crie uma estrutura que tenha o array como membro;

• Estruturas são passadas por valor, de modo que o arraytambém é passado por valor;

• ERRO LÓGICO: supor que estruturas como arrays sejampassadas automaticamente por referência e tentar modificaros valores da estrutura passadas por valor na função utilizada;

• DICA: passar estruturas por referência é mais eficiente do quepassar estruturas por valor;

Page 15: Aula 7   pc - estrutura

TYPEDEF

• TYPEDEF: oferece um mecanismo de criação de sinônimospara tipos de dados previamente definidos;

• Usado para definir um tipo da estrutura, de modo que a tag daestrutura não é necessária;

• Exemplo 1: typedef struct card Card;

• Exemplo 2:

typedef struct {

char *face;

char *suit;

} Card;

Page 16: Aula 7   pc - estrutura

TYPEDEF

• A declaração anterior cria o tipo de estrutura Card sem anecessidade de uma instrução typedef separada. Agora Cardpode ser usado para declarar variáveis do tipo struct card.

Card deck[52];

• Criar um novo nome com TYPEDEF não cria um novo tipo;

• Typedef simplesmente cria um novo nome de tipo, que podeser usado como um alias par aum nome de tipo existente;

• Use TYPEDEF para ajudar a tornar o seu programa maisportável;

• Também pode ser usado para criar alias para os tipos dedados básicos.

Page 17: Aula 7   pc - estrutura

Exemplo 1

/* Cria uma estrutura para armazenar dados de um aluno */

#include <stdio.h>

#include <stdlib.h>

struct aluno {

int nmat; //número da matrícula

float nota[3]; //notas

float media; //média

};

Page 18: Aula 7   pc - estrutura

Exemplo 1

int main () {

struct Aluno Jose; //declara uma variável do tipo struct

Jose.nmat = 456;

Jose.nota[0] = 7.5;

Jose.nota[1] = 5.2;

Jose.nota[2] = 8.4;

Jose.media = (Jose.nota[0] + Jose.nota[1] + Jose.nota[2]) / 3.0;

printf(“Matrícula: %d \n ”, Jose.nmat);

printf(“Média: %2f \n ”, Jose.media);

system(“Pause”);

return 0;

}

Page 19: Aula 7   pc - estrutura

Exemplo 2

/* estruturas aninhadas */

#include <stdio.h>

#include <stdlib.h>

typedef struct {

int dia;

char mes[10];

int ano;

} Data;

typedef struct {

int pecas;

float preço

Data diavenda;

} Venda;

Page 20: Aula 7   pc - estrutura

Exemplo 2

int main () {

static Venda A = {20, 110.0, {7, “novembro”, 2001}};

printf(“Peças: %d \n”, A.pecas);

printf(“Preço: %d \n”, A.preco);

printf(“Data: %d de %s de %d \n”, A.diavenda.dia, A.diavenda.mes, A.diavenda.ano);

system(“PAUSE”);

return 0;

}

Page 21: Aula 7   pc - estrutura

Exemplo 3

/* Mostra a passagem de estruturas para funções por valor. Mostra uma função que retorna uma estrutura */

#include <stdio.h>

#include <stdlib.h>

typedef struct Venda {

int pecas;

float preco;

} Venda;

Venda TotalVendas(Venda C, Venda D); //protótipo

Page 22: Aula 7   pc - estrutura

Exemplo 3

int main () {

Venda A, B, Total;

printf(“ Venda A \n ========== \n”);

printf(“ Insira o número de peças”);

scanf(“%d”, &A.pecas);

printf(“ Insira o preço”);

scanf(“%d”, &A.preco);

printf(“ Venda B \n ========== \n”);

printf(“ Insira o número de peças”);

scanf(“%d”, &B.pecas);

printf(“ Insira o preço”);

scanf(“%d”, &B.preco);

Page 23: Aula 7   pc - estrutura

Exemplo 3

//estruturas como argumento e retorno

Total = TotalVendas(A, B);

printf(“ \n \n Venda Total \n ===========”);

printf(“ \n Total de Peças %d.”, Total.pecas);

printf(“ \n Preço Total: %.2f \n”, Total.preco);

system(“PAUSE”);

return 0;

}

Venda TotalVendas(Venda C, Venda D) {

Venda T;

T.Pecas = C.pecas + D.pecas;

T.Preco = C.preco + D.preco;

Return T;

}

Page 24: Aula 7   pc - estrutura

Exercícios

1. Forneça a definição para uma estrutura ESTOQUE quecontém um array de caracteres nomePeca[30], o inteironumPeca, o preço em ponto flutuante, o inteiro quantidadee o inteiro pedido.

2. Forneça a definição para uma estrutura chamadaendereço, que contém os arrays de caracteresrua[25], cidade[20], estado[2] e cep[8].

3. Forneça a definição para uma estrutura aluno que contémos arrays nome[15] e sobrenome[15] e a variável endResiddo tipo struct endereço do exercício 2.