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
Download

Curso de C para Engenharias - Instituto de Informática