A maior rede de estudos do Brasil

Grátis
Estruturas_de_Dados_e_Algoritmos_em_C.erivanildo- Blog - conhecimentovaleouro.blogspot.com by @viniciusf666

Pré-visualização | Página 25 de 50

return MES_EXTENSO[0]; 
 
 return MES_EXTENSO[MES]; 
 } 
PROGRAMAÇÃO ESTRUTURAS DE DADOS E ALGORITMOS EM C 34 
2.6.1 Declaração, inicialização e atribuição de estruturas 
A Figura 2.59 apresenta a definição formal da declaração de uma estrutura, que recorre ao 
construtor struct. A lista de campos é inserida entre chavetas, e segue a regra geral de 
declaração de variáveis da linguagem C. Cada lista de campos começa com a declaração do 
tipo de dados a que pertencem os campos, seguida do nome de um ou mais campos 
separados por vírgulas, e é terminada com o separador ;. 
 
 
Figura 2.59 - Definição formal da declaração de uma estrutura ( struct ). 
A Figura 2.60 apresenta o exemplo da declaração da estrutura tdados_pessoa, que permite 
armazenar os dados pessoais de uma pessoa, composta pelo nome, sexo e data de 
nascimento, que por sua vez é composta pelo dia, mês e ano. 
 
 
Figura 2.60 - Exemplo da declaração de uma estrutura. 
A declaração da estrutura tdados_pessoa indica que de agora em diante o compilador 
reconhece um novo tipo de dados designado por struct tdados_pessoa. Pelo que, para 
declararmos variáveis deste tipo, aplicam-se as mesmas regras da declaração de variáveis 
dos tipos nativos da linguagem C. A Figura 2.61 apresenta a declaração de uma variável, de 
um agregado e de um ponteiro deste novo tipo de dados. 
 
 
Figura 2.61 - Exemplo da declaração de variáveis e ponteiros do tipo struct tdados_pessoa. 
Em alternativa é possível definir o tipo de dados struct tdados_pessoa e declarar variáveis 
desse tipo na mesma instrução, tal como se apresenta na Figura 2.62. 
 
 struct identificador da estrutura 
 { 
 lista de campos ; 
 } ; 
 
 identificador da estrutura ::= identificador válido na linguagem C 
 
 lista de campos ::= elemento campo | lista de campos ; elemento campo 
 
 elemento campo ::= tipo de dados lista de nomes de campos 
 
 tipo de dados ::= qualquer tipo de dados válido na linguagem C 
 
 lista de nomes de campos ::= identificador de campo | 
 lista de nomes de campos , identificador de campo 
 
 identificador de campo ::= identificador válido na linguagem C 
 struct tdados_pessoa PESSOA, GRUPO_PESSOAS[10], *PPESSOA; 
 struct tdados_pessoa 
 { 
 char NOME[60]; 
 char SEXO; 
 unsigned int DIA; 
 unsigned int MES; 
 unsigned int ANO; 
 }; 
35 CAPÍTULO 2 : COMPLEMENTOS SOBRE C 
 
 
 
Figura 2.62 - Exemplo da declaração de uma estrutura e da declaração de variáveis desse tipo. 
Existe uma outra forma de criar um novo tipo de dados em linguagem C usando para esse 
efeito a instrução typedef, que é equivalente à instrução type do Pascal. A Figura 2.63 
apresenta esta forma alternativa. 
 
 
Figura 2.63 - Exemplo da definição de uma estrutura usando o typedef. 
Enquanto que o identificador tdados_pessoa definia apenas a estrutura, agora 
TDADOS_PESSOA é um identificador de toda a declaração da estrutura incluindo a 
palavra reservada struct. Para distinguir o tipo de dados do identificador da estrutura, 
normalmente usa-se o mesmo identificador, mas em caracteres maiúsculos. Quando se 
define uma estrutura através do typedef é possível omitir o identificador da estrutura 
anteriormente usado, ou seja, o identificador tdados_pessoa. 
 
Na definição de uma estrutura usando o typedef, não podem ser declaradas, nem 
inicializadas, variáveis. Estas têm de ser declaradas à parte. A Figura 2.64 apresenta a 
declaração de uma variável, de um agregado e de um ponteiro do tipo de dados 
TDADOS_PESSOA. 
 
 
Figura 2.64 - Exemplo da declaração de variáveis e ponteiros do tipo TDADOS_PESSOA. 
As definições de tipos de dados usando o typedef, são colocados no início dos ficheiros 
fonte logo após as directivas de include, de maneira a tornar o tipo de dados visível por todo 
o programa, ou num ficheiro de interface, que tem a extensão .h, que é depois aludido nos 
ficheiros fonte onde o tipo de dados é necessário. 
 
É possível inicializar uma estrutura da mesma forma que se inicializa um agregado. A 
Figura 2.65 apresenta a declaração e inicialização de uma estrutura de dados do tipo 
TDADOS_PESSOA. 
 
 
Figura 2.65 - Exemplo da declaração e inicialização de uma variável do tipo TDADOS_PESSOA. 
 TDADOS_PESSOA PESSOA = { "Vincent Van Gogh", 'M', 30, 3, 1853 }; 
 TDADOS_PESSOA PESSOA, GRUPO_PESSOAS[10], *PPESSOA; 
 typedef struct 
 { 
 char NOME[60]; 
 char SEXO; 
 unsigned int DIA; 
 unsigned int MES; 
 unsigned int ANO; 
 } TDADOS_PESSOA; 
 struct tdados_pessoa 
 { 
 char NOME[60]; 
 char SEXO; 
 unsigned int DIA; 
 unsigned int MES; 
 unsigned int ANO; 
 } PESSOA, GRUPO PESSOAS[10], *PPESSOA;
PROGRAMAÇÃO ESTRUTURAS DE DADOS E ALGORITMOS EM C 36 
Na linguagem C é possível atribuir uma estrutura a outra estrutura, tal como no Pascal. A 
Figura 2.66 apresenta alguns exemplos de instruções de atribuição envolvendo estruturas. 
 
 
Figura 2.66 - Exemplos da atribuição de estruturas. 
2.6.2 Acesso aos campos de estruturas 
Na linguagem C existem duas formas de aceder aos campos de uma estrutura. Se 
estivermos na presença de uma variável do tipo struct, usa-se o nome da variável e o nome 
do campo separados por um ponto, tal e qual como no Pascal. Vamos designar o operador 
. por operador acesso a campo. Se estivermos na presença de um ponteiro para uma 
variável do tipo struct, então usa-se o nome do ponteiro para a variável e o nome do 
campo separados pelo operador ->. Vamos designar o operador -> por operador 
referência a campo. Este operador é uma abreviatura da linguagem C, que combina o 
operador apontado por * com o operador acesso a campo ., pelo que, a instrução 
PPESSOA->DIA é equivalente a (*PPESSOA).DIA. 
 
A Figura 2.67 mostra a atribuição do valor 30 ao campo DIA, directamente através de uma 
variável, usando o operador acesso a campo, e por referência indirecta através de um 
ponteiro, usando o operador referência a campo. 
 
 
Figura 2.67 - Acesso aos campos de uma estrutura. 
Na formação de expressões de acesso aos campos de uma estrutura, é preciso ter em conta 
que os operadores de acesso aos campos de estruturas são operadores primários, com 
associatividade da esquerda para a direita e com menor precedência do que os operadores 
primários ( ) e [ ], tal como se mostra na Figura 2.53. 
2.6.3 Estruturas hierárquicas 
Tal como no Pascal, também a linguagem C permite que um campo de uma estrutura possa 
ser uma estrutura, o que se designa por estruturas hierárquicas (nested structures). Uma vez 
que a data constitui um tipo de informação muito frequente em programação, faz sentido 
que seja previamente declarada como uma estrutura autónoma e depois seja usada na 
declaração de outras estruturas. 
 TDADOS_PESSOA FUNC_PESSOA (void); /* alusão à função FUNC_PESSOA */
 ... 
 TDADOS_PESSOA PESSOA1 = { "Vincent Van Gogh", 'M', 30, 3, 1853 }; 
 TDADOS_PESSOA PESSOA2, *PPESSOA; 
 ... 
 PESSOA2 = PESSOA1; 
 ... 
 PPESSOA = &PESSOA1; 
 PESSOA2 = *PPESSOA; 
 ... 
 PESSOA2 = FUNC_PESSOA (); 
 TDADOS_PESSOA PESSOA, *PPESSOA = &PESSOA; 
 
 ... /* acesso ao campo DIA através da variável PESSOA */
 PESSOA.DIA = 30; 
 
 ... /* acesso ao campo DIA através do ponteiro PPESSOA */
 PPESSOA->DIA = 30; /* é equivalente a (*PPESSOA).DIA = 30; */
37 CAPÍTULO 2 : COMPLEMENTOS SOBRE C 
 
 
A Figura 2.68 apresenta a decomposição da estrutura TDADOS_PESSOA, 
autonomizando a data na estrutura TDATA. 
 
 
Figura 2.68 - Exemplo da declaração de estruturas hierárquicas. 
Esta declaração hierarquizada em dois níveis provoca algumas consequências na 
inicialização da estrutura TDADOS_PESSOA, bem como, no acesso aos campos da data. 
Como se mostra na Figura 2.69, agora a inicialização da estrutura TDADOS_PESSOA, 
implica a inicialização da estrutura TDATA entre chavetas,