Você está na página 1de 4

14/02/2016

Linguagem C: struct

Projeto de Algoritmos | Linguagem C | ndice

Registros e Structs
Um registro (= record) um "pacote" de variveis, possivelmente de tipos diferentes. Na
linguagem C, registros so conhecidos como s t r u c t s (o nome uma abreviatura de
structure).

Definio e manipulao de structs


O seguinte exemplo declara um registro x
armazenar datas:
s t r u c
i n
i n
i n
} x ;

com trs campos que pode ser usado para

{
t

d i a ;
m e s ;
a n o ;
t
t

uma boa ideia dar um nome classe de todos os registros de um mesmo tipo. No nosso
exemplo, d m a parece um nome apropriado:
s t r u c
i n
i n
i n
} ;
s t r u c
s t r u c

d m
d i
m e
a n
t
t
t
t
t

a
{
a ;
s ;

d m a
d m a

o ;

x ;

/ /

u m

y ;

/ /

u m

r e g i s t r o
r e g i s t r o

d o
y

d o

t i p o
t i p o

d m a
d m a

Para se referir a um campo de um registro, basta escrever o nome do registro e o nome do


campo separados por um ponto:
x . d i a
x . m e s
x . a n o
=
=
=

3 1 ;
1 2 ;
2 0 1 5 ;

Registros podem ser tratados como um novo tipo-de-dados. Depois da seguinte definio,
por exemplo, podemos passar a dizer "d a t a " no lugar de "s t r u c t d m a ":
t y p e d e f
d a t a x ,

s t r u c t
y ;

d m a

d a t a ;

Exemplo. A funo abaixo recebe a data de incio de um evento e a durao do evento em


http://www.ime.usp.br/~pf/algoritmos/aulas/stru.html

1/4

14/02/2016

Linguagem C: struct

dias. Ela devolve a data de fim do evento.


d a t a

f i
d a t a
. .
. .
f i m .
f i m .
f i m .
r e t u

m E v e n t o
f i m ;

( d a t a

i n i c i o ,

i n t

d u r a c a o )

.
.
d i a
m e s
a n o
r n f

. . .
. . .
. . .
=
=
i m ;

O cdigo foi omitido porque um tanto enfadonho: deve levar em conta a existncia de
meses com 31 dias, de meses com 30 dias, com 29 dias, etc. Eis como essa funo poderia
ser usada:
i n t

m a
d a t
i n t
s c a
s c a

i n

( v o i d )
b ;

a ,
d ;
n f

( " %
( " %
b = f i m E v
p r i n t f ( "
r e t u r n E X
n f

% d % d
d " , & d )
e n t o ( a
% d % d %
I T _ S U C C

" ,

& a . d i a ,

& a . m e s ,

& a . a n o ) ;

;
,

d ) ;
d \ n " ,
E S S ;

b . d i a ,

b . m e s ,

b . a n o ) ;

Exerccios 1
1. Complete o cdigo da funo f i m E v e n t o acima.
2. Escreva uma funo que receba dois structs do tipo d m a , cada um representando uma data
vlida, e devolva o nmero de dias que decorreram entre as duas datas.
3. Escreva uma funo que receba um nmero inteiro que representa um intervalo de tempo
medido em minutos e devolva o correspondente nmero de horas e minutos (por exemplo,
converte 131 minutos em 2 horas e 11 minutos). Use uma struct como a seguinte:
s t r u c t
i n t
i n t
} ;

h m

{
h o r a s ;
m i n u t o s ;

Structs e ponteiros
Cada registro tem um endereo na memria do computador. (Voc pode imaginar que o
endereo de um registro o endereo de seu primeiro campo.) muito comum usar um
ponteiro para guardar o endereo de um registro. Dizemos que um tal ponteiro aponta para
o registro. Por exemplo,
d a t a * p ;
d a t a
x ;
p = & x ;

/ /

/ /

a g o r a

u m

p o n t e i r o
p

http://www.ime.usp.br/~pf/algoritmos/aulas/stru.html

a p o n t a

p a r a
p a r a

r e g i s t r o s

d m a

x
2/4

14/02/2016

Linguagem C: struct

( * p ) . d i a
=

3 1 ;

/ /

m e s m o

e f e i t o

q u e

x . d i a

3 1

(Cuidado! Graas s regras de precedncia, a expresso * p . d i a


tem significado muito diferente de ( * p ) . d i a .)
A expresso p - > m e s
p - > d i a
=

equivale a * ( p . d i a )

uma abreviatura muito til para a expresso ( * p ) . m e s :

3 1 ;

/ /

m e s m o

e f e i t o

q u e

( * p ) . d i a

3 1

Exerccios 2
1. Defina um registro e m p r e g a d o para guardar os dados (nome, sobrenome, data de nascimento,
RG, data de admisso, salrio) de um empregado de sua empresa. Defina um vetor de
e m p r e g a d o s para armazenar todos os empregados de sua empresa.
2. Um racional qualquer nmero da forma p/q, sendo p inteiro e q inteiro no nulo.
conveniente representar um racional por um registro:
t y p e d e f s t r u c t
i n t p , q ;
} r a c i o n a l ;

Vamos convencionar que o campo q de todo racional estritamente positivo e que o mximo
divisor comum dos campos p e q 1 . Escreva funes
r e d
n e g
s o m
m u l
d i v

u z , que receba inteiros a e b e devolva o racional que representa a/b;


, que receba um racional x e devolva o racional x;
a , que receba racionais x e y e devolva o racional que representa a soma de x e y;
t , que receba racionais x e y e devolva o racional que representa o produto de x por y;
, que receba racionais x e y e devolva o racional que representa o quociente de x por y.

Last modified: Tue Dec 1 13:24:55 BRST 2015


http://www.ime.usp.br/~pf/algoritmos/
Paulo Feofiloff
DCC-IME-USP

http://www.ime.usp.br/~pf/algoritmos/aulas/stru.html

3/4

14/02/2016

http://www.ime.usp.br/~pf/algoritmos/aulas/stru.html

Linguagem C: struct

4/4

Você também pode gostar