Registros Em c

Embed Size (px)

DESCRIPTION

Registros Em c paty

Citation preview

  • 14/02/2016 Linguagem C: struct

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

    Projeto de Algoritmos | Linguagem C | ndice

    Registros e Structs

    Um registro (= record) um "pacote" de variveis, possivelmente de tipos diferentes. Nalinguagem C, registros so conhecidos como s t r u c t s (o nome uma abreviatura destructure).

    Definio e manipulao de structs

    O seguinte exemplo declara um registro x com trs campos que pode ser usado paraarmazenar datas:

    s t r u c t { i n t d i a ; i n t m e s ; i n t a n o ; } x ;

    uma boa ideia dar um nome classe de todos os registros de um mesmo tipo. No nossoexemplo, d m a parece um nome apropriado:

    s t r u c t d m a { i n t d i a ; i n t m e s ; i n t a n o ; } ; s t r u c t d m a x ; / / u m r e g i s t r o x d o t i p o d m a s t r u c t d m a y ; / / u m r e g i s t r o y d o t i p o d m a

    Para se referir a um campo de um registro, basta escrever o nome do registro e o nome docampo separados por um ponto:

    x . d i a = 3 1 ; x . m e s = 1 2 ; x . a n o = 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 s t r u c t d m a d a t a ; d a t a x , y ;

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

  • 14/02/2016 Linguagem C: struct

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

    dias. Ela devolve a data de fim do evento.

    d a t a f i m E v e n t o ( d a t a i n i c i o , i n t d u r a c a o ) { d a t a f i m ; . . . . . . f i m . d i a = . . . f i m . m e s = . . . f i m . a n o = . . . r e t u r n f i m ; }

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

    i n t m a i n ( v o i d ) { d a t a a , b ; i n t d ; s c a n f ( " % d % d % d " , & a . d i a , & a . m e s , & a . a n o ) ; s c a n f ( " % d " , & d ) ; b = f i m E v e n t o ( a , d ) ; p r i n t f ( " % d % d % d \ n " , b . d i a , b . m e s , b . a n o ) ; r e t u r n E X I T _ S U C C E S S ; }

    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 datavlida, 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 tempomedido 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 h m { i n t h o r a s ; i n t m i n u t o s ; } ;

    Structs e ponteiros

    Cada registro tem um endereo na memria do computador. (Voc pode imaginar que oendereo de um registro o endereo de seu primeiro campo.) muito comum usar umponteiro para guardar o endereo de um registro. Dizemos que um tal ponteiro aponta parao registro. Por exemplo,

    d a t a * p ; / / p u m p o n t e i r o p a r a r e g i s t r o s d m a d a t a x ; p = & x ; / / a g o r a p a p o n t a p a r a x

  • 14/02/2016 Linguagem C: struct

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

    ( * 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 equivale a * ( p . d i a ) etem significado muito diferente de ( * p ) . d i a .)

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

    p - > d i a = 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 dee 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 mximodivisor comum dos campos p e q 1 . Escreva funes

    r e d u z , que receba inteiros a e b e devolva o racional que representa a/b;n e g , que receba um racional x e devolva o racional x;s o m a , que receba racionais x e y e devolva o racional que representa a soma de x e y;m u l t , que receba racionais x e y e devolva o racional que representa o produto de x por y;d i v , 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

  • 14/02/2016 Linguagem C: struct

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