Estruturas Typedef Enumerações Exercícios Contato Curso de C para Engenharias Aula 6 Cristiano Dalbem Dennis Balreira Gabriel Moreira Miller Biazus Raphael Lupchinski Universidade Federal do Rio Grande do Sul Instituto de Informática Grupo PET Computação Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Estruturas Estruturas Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Motivação Queremos fazer um programa de simulação e para tanto precisamos manipular corpos. Um corpo tem massa, volume, etc. Como representar isso? 1 2 3 f l o a t massa1 = 3 0 . 2 , volume1 = 2 1 . 8 ; f l o a t massa2 = 1 , volume2 = 3 . 1 ; ... Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Motivação Quais tipos de dados existem? int oat char ... E se pudéssemos criar nossos próprios tipos? Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Motivação Na realidade, podemos! Utilizamos struct. Basicamente, uma struct é um agrupamento de dados de diversos tipos. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Sintaxe 1 2 s t r u c t Nome_da_estrutura { 3 4 5 6 7 8 }; tipo1 tipo2 tipo3 ... tipon nome1 ; nome2 ; nome3 ; nomen ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Exemplo 1 2 s t r u c t Corpo { 3 4 5 6 }; f l o a t massa ; f l o a t volume ; s t r u c t Ponto p o s i c a o ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Declaração e uso 1 2 3 4 5 6 7 ... s t r u c t Corpo c1 , c2 ; c1 . massa = 3 0 . 2 ; c1 . volume = 2 1 . 8 ; c2 . massa = 1 ; c2 . volume = 3 . 1 ; ... Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Ponto!? Existe um tipo Ponto em C ?! Não, 'Ponto' não é um tipo primitivo, mas nada nos impede de criarmos nosso ponto. 1 2 s t r u c t Ponto { 3 4 5 }; float x ; float y ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Inicialização struct NomeDaEstrutura NomeDaVariavel; Exemplos: 1 2 3 s t r u c t Ponto p1 = { 2 , 3 } ; s t r u c t Corpo c1 = { 1 0 , 7 , p1 } ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Acesso Utilizamos o operador '.' 1 s t r u c t Ponto p1 = { 2 , 3 } ; p1.x acessa o campo x de p1. p1.y acessa o campo y de p1. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Atribuição O seguinte trecho de código é válido: 1 2 3 s t r u c t Ponto p1 , p2 ; p1 . x = 2 ; p1 . y = 3 ; 4 5 p2 = p1 ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Comparação Não é possível comparar duas estruturas diretamente. Apenas cada campo separadamente! 1 2 3 4 5 6 7 s t r u c t Ponto p1 = { 1 , 2 } ; s t r u c t Ponto p2 = { 3 . 1 4 , 2 . 7 1 } ; i f ( p1 == p2 ) else p r i n t f ( "São i g u a i s " ) ; p r i n t f ( "Não são i g u a i s " ) ; Não funciona! Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Comparação Corrigindo... 1 2 3 4 5 6 7 s t r u c t Ponto p1 = { 1 , 2 } ; s t r u c t Ponto p2 = { 3 . 1 4 , 2 . 7 1 } ; i f ( p1 . x == p2 . x && p1 . y == p2 . y ) else p r i n t f ( "São i g u a i s " ) ; p r i n t f ( "Não são i g u a i s " ) ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Como retorno É possível criar funções que retornam estruturas 1 2 3 Ponto c r i a P o n t o ( f l o a t x , f l o a t y ) { s t r u c t Ponto p1 ; 4 p1 . x = x ; p1 . y = y ; 5 6 7 8 9 } return p1 ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Como parâmetro É possível passar estruturas como parâmetros para funções 1 2 i n t comparaPontos ( s t r u c t Ponto p1 , s t r u c t Ponto p2 ) { 3 4 5 6 7 } i f ( p1 . x == p2 . x && p1 . y == p2 . y ) return 1 ; else return 0 ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Ponteiros de Estruturas É possível passar ponteiros de estruturas como parâmetros para funções Para acessar os campos tem duas maneiras: feia e bonita (ambas funcionam igualmente) Feia: 1 2 s t r u c t Ponto ∗ p1 ; ( ∗ p1 ) . x = 2 ; Bonita: 1 2 s t r u c t Ponto ∗ p1 ; p1−>x = 2 ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Ponteiros de Estruturas 1 2 i n t comparaPontos ( s t r u c t Ponto ∗ p1 , s t r u c t Ponto ∗ p2 ) { 3 4 5 6 7 } i f ( p1−>x == p2−>x && p1−>y == p2−>y ) return 1 ; else return 0 ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Sem usar ponteiros O que acontece se uma estrutura tiver um elemento que seja do tipo da própria estrutura? 1 2 s t r u c t Exemplo { 3 4 5 }; char i n f o ; Exemplo ex1 ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Sem usar ponteiros O que acontece se uma estrutura tiver um elemento que seja do tipo da própria estrutura? 1 2 s t r u c t Exemplo { 3 4 5 }; char i n f o ; Exemplo ex1 ; A denição da struct 'exemplo' depende da denição dela mesma! Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Sem usar ponteiros 1 2 s t r u c t Exemplo { 3 4 5 }; char i n f o ; Exemplo ex1 ; A linguagem não consegue denir a nossa estrutura. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Usando ponteiros Podemos, porém, ter um elemento que seja um ponteiro para um tipo dessa estrutura 1 2 struct Lista { 3 4 5 }; float x ; struct L i s t a ∗ prox ; Com isso criamos listas,arvores binárias... Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Motivação Uso Estruturas e Funções Estruturas Auto Referenciáveis Estruturas e Arrays Estruturas com arrays 1 1 2 s t r u c t Ponto p s [ 1 0 ] ; s t r u c t Exemplo { 3 4 }; float fs [10]; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Typedef Typedef Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Denição typedef cria aliases ("apelidos") para tipos já existentes 1 typedef i n t i n t e i r o ; 2 3 i n t e i r o i // declara um int Não cria um novo tipo de dado Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Uso 1 2 s t r u c t Ponto { 3 4 5 6 7 }; float x ; float y ; typedef s t r u c t Ponto P o i n t ; 8 9 10 11 P o i n t p1 , p2 ; Point criaPonto ( float x , float y ) ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Enumerações Enumerações Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Denição Se quiséssemos fazer um programa que mexe com estações do ano, um jeito mais eciente do que usando strings seria utilizando constantes. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Denição Para esse tipo de declaração existe o enum que nos facilita a vida. Com ele a declaração das contantes assim: 1 2 enum E s t a c o e s { 3 4 5 6 7 }; VERAO, OUTONO, INVERNO , PRIMAVERA Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Sintaxe 1 2 enum I d e n t i f i c a d o r { 3 4 5 6 7 8 }; A, B, C, ... N 'identicador' é opcional. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Considerações Por padrão, o primeiro símbolo é 0, e os demais são incrementados de 1 do anterior. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Considerações Por padrão, o primeiro símbolo é 0, e os demais são incrementados de 1 do anterior. Vantagens: Mais clareza no código. As vezes não nos importa que o enum dará para a variável, como no caso das Estações. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Inicialização de valores 1 2 enum { 3 4 5 6 7 8 }; DEVICE1 = 2 7 7 , DEVICE2 , DEVICE3 , DRIVE1 = 3 0 1 , DRIVE2 DEVICE2 = 278 DEVICE3 = 279 DRIVE2 = 302 Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Exercícios Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Exercícios Registro Crie uma estrutura registro que contém um string nome, um int idade e um oat salario. Faça uma função para preencher e outra para imprimir esses dados. Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Resposta (com Retorno) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #i n c l u d e < s t d i o . h> #i n c l u d e < s t r i n g . h> struct Registro { char nome [ 5 0 ] ; int idade ; float salario ; }; typedef s t r u c t R e g i s t r o R e g i s t r o ; R e g i s t r o p r e e n c h e R e g i s t r o ( R e g i s t r o r e g , char ∗ nom , i n t id , f l o a t s a l ) { s t r c p y ( r e g . nome , nom ) ; reg . idade = id ; reg . s a l a r i o = s a l ; return r e g ; } Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Resposta (com Retorno) 1 void i m p r i m e R e g i s t r o ( R e g i s t r o r e g ) { 2 3 4 5 6 } i n t main ( ) { Registro r ; 7 char n [ 5 0 ] ; int i ; float s ; 8 9 10 11 12 13 14 15 16 p r i n t f ( "Nome : %s \n" , r e g . nome ) ; p r i n t f ( " I d a d e : %d\n" , r e g . i d a d e ) ; p r i n t f ( " S a l a r i o : %0.2 f \n" , r e g . s a l a r i o ) ; } p r i n t f ( " D i g i t e nome , i d a d e e s a l a r i o : " ) ; g e t s ( n ) ; s c a n f ( "%d" , & i ) ; s c a n f ( "%f " , &s ) ; r = preencheRegistro ( r ,n , i , s ); imprimeRegistro ( r ); return ( 0 ) ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Resposta (por Referência) 1 2 3 4 5 6 7 8 9 10 11 #i n c l u d e < s t d i o . h> #i n c l u d e < s t r i n g . h> struct Registro { char nome [ 5 0 ] ; int idade ; float salario ; }; typedef s t r u c t R e g i s t r o R e g i s t r o void p r e e n c h e R e g i s t r o ( R e g i s t r o ∗ r e g , char ∗ nom , i n t id , f l o a t s a l ) { 12 13 14 15 } s t r c p y ( r e g −>nome , n ) ; // *(reg).nome r e g −>i d a d e = i ; r e g −> s a l a r i o = s ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Resposta (por Referência) 1 void i m p r i m e R e g i s t r o ( R e g i s t r o r e g ) { 2 3 4 5 6 } i n t main ( ) { Registro r ; 7 char n [ 5 0 ] ; int i ; float s ; 8 9 10 11 12 13 14 15 16 p r i n t f ( "Nome : %s \n" , r e g . nome ) ; p r i n t f ( " I d a d e : %d\n" , r e g . i d a d e ) ; p r i n t f ( " S a l a r i o : %0.2 f \n" , r e g . s a l a r i o ) ; } p r i n t f ( " D i g i t e nome , i d a d e e s a l a r i o : " ) ; g e t s ( n ) ; s c a n f ( "%d" , & i ) ; s c a n f ( "%f " , &s ) ; p r e e n c h e R e g i s t r o (& r , n , i , s ) ; imprimeRegistro ( r ); return ( 0 ) ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Exercícios Uma pessoa Crie uma estrutura para representar uma pessoa. Ela deve possuir um nome, ano, mês e dia de nascimento. Os três últimos itens devem ser representados numa estrutura distinta. Desenvolva também uma função principal que teste a estrutura. Obs.: Use enums para representar cada mês disponível. Exemplo de declaração da estrutura: 1 s t r u c t P e s s o a p = { " Manolo " , { 1 9 9 2 ,OUTUBRO, 2 7 } } ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Resposta 1 2 3 #i n c l u d e < s t d i o . h> #i n c l u d e < s t r i n g . h> enum Mes { 4 5 6 7 8 9 10 11 12 13 14 15 16 } JANEIRO ; FEVEREIRO ; MARCO; ABRIL ; MAIO ; JUNHO ; JULHO ; AGOSTO; SETEMBRO ; OUTUBRO; NOVEMBRO; DEZEMBRO; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Resposta 1 2 3 4 5 s t r u c t Nascimento { i n t ano , mes , d i a ; }; struct Pessoa { char nome [ 5 0 ] ; 6 7 8 9 }; i n t main ( ) { s t r u c t P e s s o a p = { " Manolo " , { 1 9 9 2 ,OUTUBRO, 2 7 } } ; 10 11 12 13 14 15 Nascimento nasc ; } p r i n t f ( "%s \n" , p . nome ) ; p r i n t f ( "%d\n" , p . n i v e r . ano ) ; p r i n t f ( "%d\n" , p . n i v e r . mes ) ; p r i n t f ( "%d\n" , p . n i v e r . d i a ) ; return ( 0 ) ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Exercícios Corpos e MRUV Crie uma struct para representar um corpo com posição inicial, velocidade, aceleração e tempo. Crie uma função que recebe um corpo, aplique o MRUV com os dados dele atualize a posição atual deste com o valor obtido. Teste o programa com uma função main. Dica: s = s0 + v0 ∗ ∆t + a ∗ ∆2t Cristiano, Dennis, Gabriel, Miller, Raphael 2 Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Resposta 1 2 3 4 #i n c l u d e < s t d i o . h> #i n c l u d e < s t r i n g . h> s t r u c t Corpo { f l o a t s0 , 5 6 7 8 9 10 11 }; f l o a t p o s A t u a l ( f l o a t s0 , f l o a t v0 , f l o a t a , f l o a t d t ) { return ( s 0 + v0 ∗ d t + a ∗ ( ( d t ∗ d t ) / 2 ) ) ; } i n t main ( ) { s t r u c t Corpo c = { 5 , 3 , 2 , 3 } ; 12 13 14 15 v0 , a , d t ; } p r i n t f ( " P o s i c a o A t u a l : %0.2 f " , p o s A t u a l ( c . s0 , c . v0 , c . a , c . dt ) ) ; return ( 0 ) ; Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias Estruturas Typedef Enumerações Exercícios Contato Dúvidas, Sugestões, Críticas www.inf.ufrgs.br/pet [email protected] Cristiano, Dennis, Gabriel, Miller, Raphael Curso de C para Engenharias