Curso de Bacharelado em Engenharia de Computao Universidade do Sagrado CoraO USC Bauru/SP Estruturas: conceito/definio So colees de variveis relacionadas agrupadas sob um nico nome. Podem conter variveis de muitos tipos de dados diferentes. So usadas para declarar registros a serem armazenados em arquivo. Estruturas de dados mais complexas: listas, filas, pilhas e rvores. Ponteiros e estruturas facilitam a formao dessas estruturas. Tipos de dados derivados (e no primitivos)
Declaraes de Estruturas Declarao 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 de Estrutura usada para declarar variveis desse tipo de estrutura, o identificador deste tipo de estrutura. As variveis dentro da estrutura chamam-se MEMBROS. No esquecer do ponto e vrgula ao final da declarao!
Declaraes 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 vrios tipos de dados diferentes. Exemplo:
struct funcionario { char nome[20]; char sobrenome[20]; int idade; char sexo; double salario; }; Estrutura Autorreferenciada uma estrutura que contm um membro que um ponteiro para o mesmo tipo de estrutura. So 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 } Declaraes de variveis de tipos de estrutura Declaraes de estruturas no criam espao na memria; Declaraes de estruturas criam um novo tipo de dado; Esse novo tipo de dado usado para declarar variveis que ento ocupam espao na memria; Exemplo:
struct card aCard, deck[52], *carPtr; OU struct card { char *face; char *suit; } aCard, deck[52], *carPtr; aCard: uma varivel do tipo struct card; deck: um vetor com 52 posies do tipo struct card; carPtr: um ponteiro para struct card;
Nomes para tags de estruturas O nome para a tag de estrutura opcional; Entretanto, sempre fornea um nome, uma prtica recomendada; Escolha um nome significativo para a tag de estrutura. Isto ajuda a tornar o programa mais legvel e melhor documentado. Se uma declarao de estrutura no tiver um nome para a tag de estrutura, as variveis do tipo da estrutura s podero ser declaradas na declarao da estrutura, e no em uma declarao separada.
Operaes que podem ser realizadas nas estruturas Operaes vlidas: Atribuio de variveis da estrutura a variveis da estrutura de mesmo tipo; Coleta de endereo de uma varivel de estrutura (operador &); Acesso aos membros de uma varivel de estrutura; Uso do operador sizeof para determinar o tamanho de uma varivel de estrutura.
NO PODEMOS: Comparar estruturas usando == e != Inicializao de estruturas Parecido com vetores e matrizes. Exemplo:
struct card aCard = {Trs, Copas};
Inicializa o membro da estrutura FACE com o valor TRS e o membro SUIT com o valor COPAS. Ateno: se o nmero de inicializadores na lista for menor que os membros na estrutura, os membros restantes sero automaticamente inicializados em zero, ou NULL se o membro for um ponteiro. Acesso a membros da estrutura Dois operadores so 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!
/* Declarao da estrutura da carta */ struct card { char *face; //ponteiro char * suit; //ponteiro }; //fim da estrutura
Acesso a membros da estrutura int main(void){ struct card aCard; //declarao de varivel struct card *cardPtr; //declarao de ponteiro //coloca strings em aCard aCard.face = s; aCard.suit = Espadas; //atribui o endereo 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; //concluso bem sucedida } Uso de estruturas com funes As estruturas podem ser passadas a funes ao: Passar membros da estrutura individuais; Passar uma estrutura inteira; Passar um ponteiro para uma estrutura;
Quando as estruturas ou membros individuais da estrutura so passados a uma funo, eles so passados por valor; Os membros das estruturas passados por valor no podem ser modificados pela funo utilizada;
Para passar uma estrutura por referncia: Passe o endereo da varivel da estrutura;
Uso de estruturas com funes Um array pode ser passado por valor usando uma estrutura; Para isto faa: Crie uma estrutura que tenha o array como membro; Estruturas so passadas por valor, de modo que o array tambm passado por valor;
ERRO LGICO: supor que estruturas como arrays sejam passadas automaticamente por referncia e tentar modificar os valores da estrutura passadas por valor na funo utilizada; DICA: passar estruturas por referncia mais eficiente do que passar estruturas por valor; TYPEDEF TYPEDEF: oferece um mecanismo de criao de sinnimos para tipos de dados previamente definidos; Usado para definir um tipo da estrutura, de modo que a tag da estrutura no necessria; Exemplo 1: typedef struct card Card; Exemplo 2:
typedef struct { char *face; char *suit; } Card; TYPEDEF A declarao anterior cria o tipo de estrutura Card sem a necessidade de uma instruo typedef separada. Agora Card pode ser usado para declarar variveis do tipo struct card.
Card deck[52];
Criar um novo nome com TYPEDEF no cria um novo tipo; Typedef simplesmente cria um novo nome de tipo, que pode ser usado como um alias par aum nome de tipo existente; Use TYPEDEF para ajudar a tornar o seu programa mais portvel; Tambm pode ser usado para criar alias para os tipos de dados bsicos.
Exemplo 1 /* Cria uma estrutura para armazenar dados de um aluno */ #include <stdio.h> #include <stdlib.h>
struct aluno { int nmat; //nmero da matrcula float nota[3]; //notas float media; //mdia };
Exemplo 1 int main () { struct Aluno Jose; //declara uma varivel 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(Matrcula: %d \n , Jose.nmat); printf(Mdia: %2f \n , Jose.media); system(Pause); return 0; }
typedef struct { int dia; char mes[10]; int ano; } Data;
typedef struct { int pecas; float preo Data diavenda; } Venda; Exemplo 2 int main () { static Venda A = {20, 110.0, {7, novembro, 2001}}; printf(Peas: %d \n, A.pecas); printf(Preo: %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; } Exemplo 3 /* Mostra a passagem de estruturas para funes por valor. Mostra uma funo que retorna uma estrutura */
#include <stdio.h> #include <stdlib.h>
typedef struct Venda { int pecas; float preco; } Venda;
Venda TotalVendas(Venda C, Venda D); //prottipo Exemplo 3 int main () { Venda A, B, Total; printf( Venda A \n ========== \n); printf( Insira o nmero de peas); scanf(%d, &A.pecas); printf( Insira o preo); scanf(%d, &A.preco);
printf( Venda B \n ========== \n); printf( Insira o nmero de peas); scanf(%d, &B.pecas); printf( Insira o preo); scanf(%d, &B.preco); Exemplo 3 //estruturas como argumento e retorno Total = TotalVendas(A, B); printf( \n \n Venda Total \n ===========); printf( \n Total de Peas %d., Total.pecas); printf( \n Preo 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; }
Exerccios 1. Fornea a definio para uma estrutura ESTOQUE que contm um array de caracteres nomePeca[30], o inteiro numPeca, o preo em ponto flutuante, o inteiro quantidade e o inteiro pedido. 2. Fornea a definio para uma estrutura chamada endereo, que contm os arrays de caracteres rua[25], cidade[20], estado[2] e cep[8]. 3. Fornea a definio para uma estrutura aluno que contm os arrays nome[15] e sobrenome[15] e a varivel endResid do tipo struct endereo do exerccio 2.