• Nenhum resultado encontrado

Introdução a Linguagem C

N/A
N/A
Protected

Academic year: 2021

Share "Introdução a Linguagem C"

Copied!
70
0
0

Texto

(1)

Introdu¸c˜

ao a Linguagem C

v-0.03

Rodrigo Bonif´acio

(2)

Caracter´ısticas da linguagem

I imperativa (como Python, Java, C++)

I sistema de tipos: I estaticamente tipada

I requer anota¸c˜oes expl´ıcitas de tipos

I aceita algumas coer¸c˜oes autom´aticas

I implementa¸c˜oes tipicamente compiladas I gerenciamento de mem´oria de baixo n´ıvel

(tipicamente sem garbage collector).

(3)

Caracter´ısticas da linguagem

I imperativa (como Python, Java, C++)

I sistema de tipos: I estaticamente tipada

I requer anota¸c˜oes expl´ıcitas de tipos

I aceita algumas coer¸c˜oes autom´aticas

I implementa¸c˜oes tipicamente compiladas

I gerenciamento de mem´oria de baixo n´ıvel (tipicamente sem garbage collector).

(4)

Na linguagem C, todo comportamento precisa ser implementado no escopo de fun¸c˜oes. Todo programa em C tem um ponto inicial de execu¸c˜ao, que corresponde a uma fun¸c˜ao main

(5)

Assinatura t´ıpica de uma fun¸c˜

ao main

1 #i n c l u d e < s t d i o . h> 2 3 i n t m a i n (i n t argc , c h a r∗∗ argv ) { 4 5 p r i n t f (” O l a t u r m a de CB , i s s o eh a p e n a s uma\ n ”) ; 6 p r i n t f (” i n t r o d u c a o a l i n g u a g e m C\ n ”) ; 7 8 r e t u r n 0 ; 9 } Observa¸c˜ao

I (a) argc cont´em a quantidade de argumentos passados na linha de comando; enquanto (b) argv ´e um array de strings com os argumentos passados na linha de comando. Note que argv[0] ´e o pr´oprio nome do programa.

(6)

Assinatura t´ıpica de uma fun¸c˜

ao main

1 #i n c l u d e < s t d i o . h> 2 3 i n t m a i n (i n t argc , c h a r∗∗ argv ) { 4 5 p r i n t f (” O l a t u r m a de CB , i s s o eh a p e n a s uma\ n ”) ; 6 p r i n t f (” i n t r o d u c a o a l i n g u a g e m C\ n ”) ; 7 8 r e t u r n 0 ; 9 } Observa¸c˜ao

I (a) argc cont´em a quantidade de argumentos passados na linha de comando; enquanto (b) argv ´e um array de strings com os argumentos passados na linha de comando.

Note que argv[0] ´e o pr´oprio nome do programa.

(7)

Assinatura t´ıpica de uma fun¸c˜

ao main

1 #i n c l u d e < s t d i o . h> 2 3 i n t m a i n (i n t argc , c h a r∗∗ argv ) { 4 5 p r i n t f (” O l a t u r m a de CB , i s s o eh a p e n a s uma\ n ”) ; 6 p r i n t f (” i n t r o d u c a o a l i n g u a g e m C\ n ”) ; 7 8 r e t u r n 0 ; 9 } Observa¸c˜ao

I (a) argc cont´em a quantidade de argumentos passados na linha de comando; enquanto (b) argv ´e um array de strings com os argumentos passados na linha de comando. Note que argv[0] ´e o pr´oprio nome do programa.

(8)

Outra alternativa de defini¸c˜

ao para fun¸c˜

oes main

1 #i n c l u d e < s t d i o . h> 2 3 i n t m a i n ( ) { 4 5 p r i n t f (” O l a t u r m a de CB , i s s o eh a p e n a s uma\ n ”) ; 6 p r i n t f (” i n t r o d u c a o a l i n g u a g e m C\ n ”) ; 7 8 r e t u r n 0 ; 9 }

(9)

Outra alternativa de defini¸c˜

ao para fun¸c˜

oes main

1 #i n c l u d e < s t d i o . h> 2 3 i n t m a i n ( ) { 4 5 p r i n t f (” O l a t u r m a de CB , i s s o eh a p e n a s uma\ n ”) ; 6 p r i n t f (” i n t r o d u c a o a l i n g u a g e m C\ n ”) ; 7 8 r e t u r n 0 ; 9 }

(10)

Roteiro

1. entrada e sa´ıda padr˜ao

2. formas de composi¸c˜ao de instru¸c˜oes I sequenciamento

I estruturas condicionais

I estruturas de repeti¸c˜ao

3. arrays e ponteiros

(11)
(12)

Na essˆencia, duas fun¸c˜oes

scanf: leitura da entrada padr˜ao printf: escrita na sa´ıda padr˜ao

(13)

Exemplo de uso

1 /∗ 2 ∗ f i l e : p1005 . c 3 ∗ a u t h o r : r b o n i f a c i o 4 ∗/ 5 #i n c l u d e ” s t d i o . h ” 6 7 /∗ 8 ∗ Faz a l e i t u r a de d o i s numeros da e n t r a d a p a d r a o

9 ∗ e computa uma media p o n d e r a d a .

10 ∗/ 11 i n t m a i n (i n t argc , c h a r∗∗ argv ) { 12 f l o a t x , y , m e d i a ; 13 14 s c a n f (”%f%f ”, &x , &y ) ; 15 16 m e d i a = ( 3 . 5 ∗ x + 7 . 5 ∗ y ) / 1 1 ; 17 18 p r i n t f (”MEDIA = %.5 f \ n ”, media ) ; 19 }

(14)
(15)

Sequenciamento

Na linguagem C (da mesma forma que em C++ e Java), as senten¸cas podem ser combinadas de forma sequencial com o operador ;.

Blocos de comandos s˜ao delimitados com: {

// ... bloco de comandos. }

Note que um bloco de comando define um novo escopo para o espa¸co de nomea¸c˜ao.

(16)

Sequenciamento

Na linguagem C (da mesma forma que em C++ e Java), as senten¸cas podem ser combinadas de forma sequencial com o operador ;. Blocos de comandos s˜ao delimitados com: {

// ... bloco de comandos. }

Note que um bloco de comando define um novo escopo para o espa¸co de nomea¸c˜ao.

(17)

Estruturas Condicionais

A linguagem C (da mesma forma que C++ e Java), suporta duas constru¸c˜oes para a defini¸c˜ao de condi¸c˜oes:

I if-then-else

(18)

Exemplo de uso (if-then-else)

1 /∗ 2 ∗ f i l e : p1040 . c 3 ∗ a u t h o r : r b o n i f a c i o 4 ∗/ 5 #i n c l u d e < s t d i o . h> 6 7 i n t m a i n ( ) { 8 f l o a t n1 , n2 , n3 , n4 , m e d i a ;

9 s c a n f (”%f%f%f%f ”, &n1 , &n2 , &n3 , &n4 ) ;

10 m e d i a = ( 2 ∗ n1 + 3 ∗ n2 + 4 ∗ n3 + n4 ) / 1 0 ;

11 e x i b e _ r e s u l t a d o ( m e d i a ) ;

(19)

1 v o i d e x i b e _ r e s u l t a d o (f l o a t m e d i a ) { 2 p r i n t f (” Media : %.1 f \ n ”, media ) ; 3 i f( media >= 7 . 0 ) { 4 p r i n t f (” A l u n o a p r o v a d o . ”) ; 5 } 6 e l s e i f( media >= 5 . 0 ) { 7 f l o a t e x a m e ; 8 s c a n f (”%f ”, &exame ) ; 9 m e d i a = ( m e d i a + e x a m e ) / 2 ; 10 p r i n t f (” A l u n o em exame . \ n ”) ;

11 p r i n t f (” Nota do exame : %.1 f \ n ”, exame ) ;

12 i f( media >= 5 . 0 ) { 13 p r i n t f (” A l u n o a p r o v a d o \ n ”) ; 14 } e l s e { 15 p r i n t f (” A l u n o r e p r o v a d o \ n ”) ; 16 } 17 p r i n t f (” Media f i n a l %1. f \ n ”, media ) ; 18 } 19 e l s e { printf (” A l u n o r e p r o v a d o \ n ”) ; } 20 }

(20)

Estruturas de Repeti¸c˜

ao

Em C (da mesma forma que em C++ e Java), est˜ao dispon´ıveis trˆes estruturas de repeti¸c˜ao:

I for(inicializacao; condicao; incremento) { ... }

I while(condicao) { ... }

(21)

Exemplo de uso for

1 f o r(i n t i = 0 ; i < p r o p e r t i e s ; i++){ 2 i n t r , c ; 3 s c a n f (”%d%d ”, &r , &c ) ; 4 r e s i d e n t s += r ; 5 c o n s u m p t i o n += c ; 6 i n t idx = c / r ; 7 g r o u p [ idx ] = g r o u p [ idx ] + r ; 8 }

(22)

Exemplo de uso while

1 // . . . 2 i n t p r o p e r t i e s ; 3 4 s c a n f (”%d ”, &p r o p e r t i e s ) ; 5 6 w h i l e( p r o p e r t i e s != 0 ) { 7 i n t g r o u p [ 2 0 0 0 ] ; 8 i n t i = 0 ; 9 f o r( i = 0 ; i < 2 0 0 0 ; i++){ 10 g r o u p [ i ] = 0 ; 11 } 12 13 i n t r e s i d e n t s = 0 ; 14 i n t c o n s u m p t i o n = 0 ; 15 16 p r i n t f (” C i d a d e# %d : \ n ”, city ) ; 17 // . . . 18 s c a n f (”%d ”, &p r o p e r t i e s ) ; 19 }

(23)
(24)

Arrays

Sequˆencia de dados de um mesmo tipo, organizados de forma cont´ıgua na mem´oria.

Corresponde a um mapeamento, onde a chave (´ındice) precisa ser um tipo enumerado (tipicamente um inteiro).

I acesso eficiente ao ith elemento I atualiza¸c˜ao eficiente do ith elemento

I tamanho precisa ser alocado de forma antecipada. Relativamente caro atualizar o tamanho de um array.

(25)

Arrays

Sequˆencia de dados de um mesmo tipo, organizados de forma cont´ıgua na mem´oria. Corresponde a um mapeamento, onde a chave (´ındice) precisa ser um tipo enumerado (tipicamente um inteiro).

I acesso eficiente ao ith elemento I atualiza¸c˜ao eficiente do ith elemento

I tamanho precisa ser alocado de forma antecipada. Relativamente caro atualizar o tamanho de um array.

(26)

Arrays

Sequˆencia de dados de um mesmo tipo, organizados de forma cont´ıgua na mem´oria. Corresponde a um mapeamento, onde a chave (´ındice) precisa ser um tipo enumerado (tipicamente um inteiro).

I acesso eficiente ao ith elemento I atualiza¸c˜ao eficiente do ith elemento

I tamanho precisa ser alocado de forma antecipada.

(27)

Arrays

Sequˆencia de dados de um mesmo tipo, organizados de forma cont´ıgua na mem´oria. Corresponde a um mapeamento, onde a chave (´ındice) precisa ser um tipo enumerado (tipicamente um inteiro).

I acesso eficiente ao ith elemento I atualiza¸c˜ao eficiente do ith elemento

I tamanho precisa ser alocado de forma antecipada. Relativamente caro atualizar o tamanho de um array.

(28)

1 /∗ f i l e : p1019 . c ∗/ 2 #i n c l u d e < s t d i o . h> 3 4 i n t m a i n ( ) { 5 // a r r a y de i n t e i r o s de t r e s p o s i c o e s 6 i n t i n t e r v a l o [ 3 ] = { 3 6 0 0 , 6 0 , 1 } ; 7 8 // a r r a y de i n t e i r o s de t r e s p o s i c o e s . 9 // sem i n i c a l i z a r a s p o s i c o e s do a r r a y . 10 i n t res [ 3 ] ; 11 i n t v a l o r = 0 ; 12 s c a n f (”%d ”, &valor ) ; 13 14 f o r(i n t i = 0 ; i < 3 ; i++) { 15 res [ i ] = v a l o r / i n t e r v a l o [ i ] ; 16 v a l o r = valor % i n t e r v a l o [ i ] ; 17 } 18

19 p r i n t f (”%d:%d:%d \ n ”, res [ 0 ] , res [ 1 ] , res [ 2 ] ) ;

(29)

Fibonacci n˜

ao recursivo

1 #i n c l u d e < s t d i o . h> 2 3 #d e f i n e MAX NUM 20 4 5 i n t m a i n ( ) { 6 i n t f i b s [ M A X _ N U M ] ; 7 i n t v a l o r = 0 ; 8 f i b s [ 0 ] = 1 ; 9 f i b s [ 1 ] = 1 ; 10 11 p r i n t f (” F o r n e c a um numero e n t r e 0 e %d : ”, M A X _ N U M ) ; 12 s c a n f (”%d ”, &valor ) ; 13 i n t i = 2 ; 14 w h i l e( i <= valor ) { 15 f i b s [ i ] = f i b s [ i −2] + f i b s [ i − 1 ] ; 16 i++; 17 } 18 19 p r i n t f (” f i b o n a c c i de %d eh : %d ”, valor , fibs [ i − 1 ] ) ; 20 }

(30)

Arrays podem ter mais de uma dimens˜

ao

1 // a r r a y com 4 l i n h a s e c i n c o 2 // c o l u n a s 3 i n t m [ 4 ] [ 5 ] = { 4 { 1 0 , 5 , −3, 1 7 , 8 2 } , 5 { 9 , 0 , 0 , 0 , −7} , 6 { 3 2 , 2 0 , 1 , 0 , 1 4 } , 7 { 0 , 0 , 8 , 7 , 6} 8 } ; 9 10 i n t sum = m [ 0 ] [ 2 ] + m [ 2 ] [ 4 ] ; 11 12 // q u a l o v a l o r de sum ?

(31)

Ponteiros

I O operador un´ario & retorna o endere¸co de um objeto

, tal que p = &c;

atribui o endere¸co de c `a vari´avel p. Dessa forma, dizemos que p aponta para c.

I O operador un´ario * ´e o operador de dereferˆencia; quando aplicado a um ponteiro, acessa o objeto que o ponteiro aponta.

(32)

Ponteiros

I O operador un´ario & retorna o endere¸co de um objeto, tal que p = &c;

atribui o endere¸co de c `a vari´avel p. Dessa forma, dizemos que p aponta para c.

I O operador un´ario * ´e o operador de dereferˆencia; quando aplicado a um ponteiro, acessa o objeto que o ponteiro aponta.

(33)

Ponteiros

I O operador un´ario & retorna o endere¸co de um objeto, tal que p = &c;

atribui o endere¸co de c `a vari´avel p. Dessa forma, dizemos que p aponta para c.

I O operador un´ario * ´e o operador de dereferˆencia; quando aplicado a um ponteiro, acessa o objeto que o ponteiro aponta.

(34)

Exemplo

1 i n t x = 1 , y = 2 , z [ 1 0 ] ; 2 i n t ∗ ip ; /∗ i p eh um p o n t e i r o p a r a i n t ∗/ 3 4 ip = &x ; /∗ i p a p o n t a p a r a o end . de x ∗/ 5 y = ∗ ip ; /∗ y eh a t u a l i z a d o p a r a o v a l o r 1 ∗/ 6 ∗ ip = 0 ; /∗ x p o s s u i v a l o r 0 ∗/ 7 ip = z [ 0 ] /∗ i p a p o n t a p a r a o end . z [ 0 ] ∗/

(35)

Note que, da mesma forma que Python, C passa os argumentos por valor. Por outro lado, em C podemos simular passagem de argumentos por referˆencia caso a fun¸c˜ao receba como argumentos ponteiros.

I Escrever uma fun¸c˜ao swap(x,y) que atribui a x o valor de y, e vice versa.

(36)

Note que, da mesma forma que Python, C passa os argumentos por valor. Por outro lado, em C podemos simular passagem de argumentos por referˆencia caso a fun¸c˜ao receba como argumentos ponteiros.

I Escrever uma fun¸c˜ao swap(x,y) que atribui a x o valor de y, e vice versa.

(37)

Fun¸c˜

ao swap

1 #i n c l u d e < s t d i o . h> 2 3 v o i d s w a p (i n t ∗x , i n t ∗ y ) { 4 i n t t e m p = ∗ x ; 5 ∗ x = ∗ y ; 6 ∗ y = temp ; 7 } 8 9 i n t m a i n ( ) { 10 i n t a = 5 ; 11 i n t b = 1 0 ; 12 13 s w a p (&a , &b ) ; 14 i f( a == 10 && b == 5 ) { 15 p r i n t f (” a f u n c a o swap e s t a h ok \ n ”) ; 16 } 17 e l s e { 18 p r i n t f (” E r r o ! ! ! C i m p l e m e n t a p a s s a g e m p o r v a l o r \ n ”) ; 19 } 20 r e t u r n 0 ; 21 }

(38)

Em C, existe uma forte rela¸c˜ao entre ponteiros e arrays. Qualquer opera¸c˜ao que pode ser feita com a indexa¸c˜ao de um array pode ser feita tamb´em com a indexa¸c˜ao de um ponteiro.

A declara¸c˜ao int a[10];

define um array de inteiros a de tamanho 10, isto ´e, um bloco de 10 objectos consecutivos.

a[0] a[1] a[9]

a :

Caso pa seja um ponteiro para um inteiro, a atribui¸c˜ao pa = &a[0] faz com que pa aponte para o endere¸co que cont´em a[0]. Dessa forma, pa+1 aponta para a[1], pa+2 para a[2] . . .

(39)

Em C, existe uma forte rela¸c˜ao entre ponteiros e arrays. Qualquer opera¸c˜ao que pode ser feita com a indexa¸c˜ao de um array pode ser feita tamb´em com a indexa¸c˜ao de um ponteiro. A declara¸c˜ao int a[10];

define um array de inteiros a de tamanho 10, isto ´e, um bloco de 10 objectos consecutivos.

a[0] a[1] a[9]

a :

Caso pa seja um ponteiro para um inteiro, a atribui¸c˜ao pa = &a[0] faz com que pa aponte para o endere¸co que cont´em a[0]. Dessa forma, pa+1 aponta para a[1], pa+2 para a[2] . . .

(40)

Em C, existe uma forte rela¸c˜ao entre ponteiros e arrays. Qualquer opera¸c˜ao que pode ser feita com a indexa¸c˜ao de um array pode ser feita tamb´em com a indexa¸c˜ao de um ponteiro. A declara¸c˜ao int a[10];

define um array de inteiros a de tamanho 10, isto ´e, um bloco de 10 objectos consecutivos.

a[0] a[1] a[9]

a :

Caso pa seja um ponteiro para um inteiro, a atribui¸c˜ao pa = &a[0] faz com que pa aponte para o endere¸co que cont´em a[0]. Dessa forma, pa+1 aponta para a[1], pa+2 para a[2] . . .

(41)

Em C, existe uma forte rela¸c˜ao entre ponteiros e arrays. Qualquer opera¸c˜ao que pode ser feita com a indexa¸c˜ao de um array pode ser feita tamb´em com a indexa¸c˜ao de um ponteiro. A declara¸c˜ao int a[10];

define um array de inteiros a de tamanho 10, isto ´e, um bloco de 10 objectos consecutivos.

a[0] a[1] a[9]

a :

Caso pa seja um ponteiro para um inteiro, a atribui¸c˜ao pa = &a[0] faz com que pa aponte para o endere¸co que cont´em a[0].

(42)

Em C, existe uma forte rela¸c˜ao entre ponteiros e arrays. Qualquer opera¸c˜ao que pode ser feita com a indexa¸c˜ao de um array pode ser feita tamb´em com a indexa¸c˜ao de um ponteiro. A declara¸c˜ao int a[10];

define um array de inteiros a de tamanho 10, isto ´e, um bloco de 10 objectos consecutivos.

a[0] a[1] a[9]

a :

Caso pa seja um ponteiro para um inteiro, a atribui¸c˜ao pa = &a[0] faz com que pa aponte para o endere¸co que cont´em a[0]. Dessa forma, pa+1 aponta para a[1], pa+2 para a[2] . . .

(43)

1 pa = &a [ 0 ] ; // pa a p o n t a p a r a o p r i m e i r o e l e m e n t o de a

2 pa = a ; // pa a p o n t a p a r a o p r i m e i r o e l e m e n t o de a

3 pa [ 5 ] == a [ 5 ] ;// podemos i n d e x a r um p o n t e i r o , como um a r r a y

I Quando um array ´e passado para uma fun¸c˜ao, o que ´e passado, na verdade, ´e o endere¸co do primeiro elemento do array.

I Com base nos exemplos, fica claro que ´e poss´ıvel fazer algumas opera¸c˜oes aritim´eticas com ponteiros.

(44)

1 pa = &a [ 0 ] ; // pa a p o n t a p a r a o p r i m e i r o e l e m e n t o de a

2 pa = a ; // pa a p o n t a p a r a o p r i m e i r o e l e m e n t o de a

3 pa [ 5 ] == a [ 5 ] ;// podemos i n d e x a r um p o n t e i r o , como um a r r a y

I Quando um array ´e passado para uma fun¸c˜ao, o que ´e passado, na verdade, ´e o endere¸co do primeiro elemento do array.

I Com base nos exemplos, fica claro que ´e poss´ıvel fazer algumas opera¸c˜oes aritim´eticas com ponteiros.

(45)

Em C, uma constante string, como ‘‘apenas um teste’’ ´e um array de caracteres (onde, na representa¸c˜ao interna, a ´ultima posi¸c˜ao do array deve ter o caracter ’\0’). Dessa forma: char *lineptr[MAXLINES]

(46)

No problema 1024 do uri

1 c o n s t c h a r∗ encrypt (c h a r p l a i n [ ] ) { 2 i n t i = 0 ; 3 i n t s i z e = s t r l e n ( p l a i n ) ; 4 f o r( ; i < size ; i++) { 5 p l a i n [ i ] = s h i f t ( p l a i n [ i ] , 3 , 1 ) ; 6 } 7 // a l o c a e s p a c o p a r a um c h a r [ 1 0 5 ] 8 // u t i l p a r a d i s c u t i r a l o c a c a o de 9 // memoria 10 c h a r∗ res = malloc ( 1 0 5 ) ; 11 i n t j = 0 ; 12 f o r( ; j < size / 2 ; j++) { 13 res [ j ] = p l a i n [ ( size −1−j ) ] ; 14 } 15 f o r( ; j < size ; j++) { 16 res [ j ] = s h i f t ( p l a i n [ ( size −1−j ) ] , −1, 0 ) ; 17 } 18 r e t u r n res ; 19 }

(47)
(48)

Em C, da mesma forma que em C++ e Python, podemos reusar fun¸c˜oes definidas em bibliotecas e criar novas fun¸c˜oes

— unidades de modulariza¸c˜ao que favorecem o reuso de c´odigo

(49)

Em C, da mesma forma que em C++ e Python, podemos reusar fun¸c˜oes definidas em bibliotecas e criar novas fun¸c˜oes— unidades de modulariza¸c˜ao que favorecem o reuso de c´odigo

(50)

I Exemplos de fun¸c˜oes s˜ao apresentados nesses slides.

I Toda fun¸c˜ao possui uma assinatura, que indica o nome da fun¸c˜ao, o tipo de retorno e os tipos dos argumentos.

I Toda fun¸c˜ao possui um bloco de c´odigo que implementa um comportamento espec´ıfico. Mais ainda, tipicamente uma fun¸c˜ao retorna um valor (utilizando o comando return exp— semelhante a Python e outras linguagens de programa¸c˜ao).

I Em programas maiores, comumente separamos a interface das

fun¸c˜oes (que passam a ser especificadas em arquivos de cabe¸calho) das implementa¸c˜oes.

(51)

I Exemplos de fun¸c˜oes s˜ao apresentados nesses slides. I Toda fun¸c˜ao possui uma assinatura, que indica o nome da

fun¸c˜ao, o tipo de retorno e os tipos dos argumentos.

I Toda fun¸c˜ao possui um bloco de c´odigo que implementa um comportamento espec´ıfico. Mais ainda, tipicamente uma fun¸c˜ao retorna um valor (utilizando o comando return exp— semelhante a Python e outras linguagens de programa¸c˜ao).

I Em programas maiores, comumente separamos a interface das

fun¸c˜oes (que passam a ser especificadas em arquivos de cabe¸calho) das implementa¸c˜oes.

(52)

I Exemplos de fun¸c˜oes s˜ao apresentados nesses slides. I Toda fun¸c˜ao possui uma assinatura, que indica o nome da

fun¸c˜ao, o tipo de retorno e os tipos dos argumentos.

I Toda fun¸c˜ao possui um bloco de c´odigo que implementa um comportamento espec´ıfico. Mais ainda, tipicamente uma fun¸c˜ao retorna um valor (utilizando o comando return exp— semelhante a Python e outras linguagens de programa¸c˜ao).

I Em programas maiores, comumente separamos a interface das

fun¸c˜oes (que passam a ser especificadas em arquivos de cabe¸calho) das implementa¸c˜oes.

(53)

I Exemplos de fun¸c˜oes s˜ao apresentados nesses slides. I Toda fun¸c˜ao possui uma assinatura, que indica o nome da

fun¸c˜ao, o tipo de retorno e os tipos dos argumentos.

I Toda fun¸c˜ao possui um bloco de c´odigo que implementa um comportamento espec´ıfico. Mais ainda, tipicamente uma fun¸c˜ao retorna um valor (utilizando o comando return exp— semelhante a Python e outras linguagens de programa¸c˜ao).

I Em programas maiores, comumente separamos a interface das

fun¸c˜oes (que passam a ser especificadas em arquivos de cabe¸calho) das implementa¸c˜oes.

(54)
(55)

Diferentemente das linguagens OO, em C n˜ao temos uma

constru¸c˜ao que permite combinar a representa¸c˜ao (dados) de uma estrutura de dados com o comportamento espec´ıfico (opera¸c˜oes).

(56)

I Em C, aespecifica¸c˜ao de uma estrutura de dados

(representa¸c˜ao dos dados mais interface das opera¸c˜oes) deve ser descrita em arquivos de cabe¸calho (extens˜ao “.h”). I A implementa¸c˜ao das opera¸c˜oes deve ser feita em um arquivo

separado. Isso possibilita uma maior flexibilidade, pois quem usa uma biblioteca s´o precisa ter acesso `a especifica¸c˜ao.

(57)

Especifica¸c˜

ao de uma pilha (stack.h)

1 #d e f i n e MAX SIZE 10 2 3 t y p e d e f s t r u c t s t a c k { 4 i n t e l e m e n t s [ M A X _ S I Z E ] ; 5 i n t top ; 6 } stack ; 7 8 s t a c k ∗ c r e a t e _ s t a c k ( ) ; 9 i n t s i z e ( s t a c k ∗ s ) ; 10 i n t i s E m p t y ( s t a c k ∗ s ) ; 11 v o i d p u s h ( s t a c k ∗ s , i n t v a l u e ) ; 12 i n t pop ( s t a c k ∗ s ) ;

(58)

Implementa¸c˜

ao de uma pilha (1/2) (stack.c)

1 #i n c l u d e < s t d l i b . h> 2 #i n c l u d e < a s s e r t . h> 3 4 #i n c l u d e ” s t a c k . h ” 5 6 s t a c k ∗ c r e a t e _ s t a c k ( ) { 7 s t a c k ∗ s = ( s t a c k ∗ ) m a l l o c (s i z e o f( stack ) ) ; 8 s−>top = 0 ; 9 r e t u r n s ; 10 } 11 i n t s i z e ( s t a c k ∗ s ) { 12 r e t u r n s−>top ; 13 } 14 15 i n t i s E m p t y ( s t a c k ∗ s ) { 16 r e t u r n s−>top == 0 ; 17 }

(59)

Implementa¸c˜

ao de uma pilha (2/2) (stack.c)

1 i n t pop ( s t a c k ∗ s ) { 2 a s s e r t ( ! i s E m p t y ( s ) ) ; 3 s−>top −−; 4 r e t u r n s−>e l e m e n t s [ s−>top ] ; 5 } 6 7 v o i d p u s h ( s t a c k ∗ s , i n t v a l u e ) { 8 a s s e r t ( ! ( s−>top == M A X _ S I Z E ) ) ; 9 s−>e l e m e n t s [ s−>top++] = v a l u e ; 10 }

(60)

Uso da implementa¸c˜

ao (main stack.c)

1 #i n c l u d e < s t d i o . h> 2 #i n c l u d e ” s t a c k . h ” 3 4 i n t m a i n ( ) { 5 s t a c k ∗ s = c r e a t e _ s t a c k ( ) ; 6 f o r(i n t i = 0 ; i < 5 ; i++){ 7 p u s h ( s , i ) ; 8 } 9 p r i n t f (” tamanho da p i l h a : %d \ n ”, size ( s ) ) ; 10 p r i n t f (” v a l o r no t o p o da p i l h a : %d \ n ”, pop ( s ) ) ; 11 }

(61)

Compila¸c˜

ao em diferentes arquivos

$ gcc stack.c main_stack.c -o program # compila

(62)
(63)

Como a linguagem C ´e estaticamente tipada, com a especifica¸c˜ao da precis˜ao de tipos inteiros relativamente bem especificada, a manipula¸c˜ao de bits em C ´e um pouco mais confort´avel que em Python.

(64)

Tipo Tamanho Faixa de valoues

char 1 byte -128 a 127 ou 0 a 255

unsigned char 1 byte 0 a 255

signed char 1 byte -128 a 127

int 2 ou 4 bytes -32.768 a 32.767 ou -2.147.483.648 a 2.147.483.647

unsigned int 2 ou 4 bytes 0 a 65.535 ou 0 a 4.294.967.295

shout 2 bytes -32.768 a 32.767

unsigned shout 2 bytes 0 a 65.535

long 4 bytes -2.147.483.648 a 2.147.483.647

(65)

Operadores de manipula¸c˜

ao de bits

Operador Python C

and bit a bit x & y x & y

or bit a bit x | y x | y

xor bit a bit x ∧ y x ∧ y

not bit(operador un´ario) ∼ x ∼ x

deslocamento a esquerda y posi¸c˜oes x << y x << y deslocamento a direita y posi¸c˜oes x >> y x >> y

(66)

Considerando a manipula¸c˜ao de um byte, representando apenas valores positivos (unsigned char), implemente as seguintes fun¸c˜oes: I countOnes(word) I setBit(word, pos) I clearBit(word, pos) I flipBit(word, pos) I isBitSet(word, pos)

(67)

countOnes

1 i n t c o u n t O n e s (u n s i g n e d c h a r w o r d ) { 2 // m a s c a r a , r e p r e s e n t a n d o i n i c i a l m e n t e o v a l o r 3 // b i n a r i o 0000 0001 4 u n s i g n e d c h a r m a s k = 1 ; 5 6 i n t o n e s = 0 ; 7 8 f o r(i n t i = 0 ; i < s i z e o f( word ) ∗ 8 ; i++) {

9 i f( word & mask ) {

10 o n e s += 1 ; 11 } 12 m a s k = m a s k << 1 ; 13 } 14 r e t u r n o n e s ; 15 }

(68)

setBit

1 u n s i g n e d c h a r s e t B i t (u n s i g n e d c h a r word , i n t pos ) {

2

3 a s s e r t ( pos > 0 && pos < (s i z e o f( word ) ∗ 8 ) ) ;

4 5 // r e p r e s e n t a uma m a s c a r a com v a l o r i n i c i a l 6 // 0000 0001 d e s l o c a d a a e s q u e r d a ” p o s ” p o s i c o e s . 7 u n s i g n e d c h a r m a s k = ( 1 << pos ) ; 8 9 r e t u r n w o r d | mask ; 10 }

(69)

Fun¸c˜

ao main

1 i n t m a i n ( ) { 2 /∗ u n s i g n e d c h a r c = 0 ; ∗/ 3 4 /∗ f o r ( u n s i g n e d c h a r c = 0 ; c <= 1 2 8 ; c++) { ∗/ 5 /∗ p r i n t f ( ” c o u n t O n e s (%d ) = %d \ n ” , c , c o u n t O n e s ( c ) ) ; ∗/ 6 /∗ } ∗/ 7 8 u n s i g n e d c h a r c = 8 ; 9 10 p r i n t f (” s e t B i t ( 8 , 0 ) = %d \ n ”, setBit ( c , 1 ) ) ; 11 12 r e t u r n 0 ; 13 }

(70)

Fun¸c˜

ao main

1 i n t m a i n ( ) { 2 /∗ u n s i g n e d c h a r c = 0 ; ∗/ 3 4 /∗ f o r ( u n s i g n e d c h a r c = 0 ; c <= 1 2 8 ; c++) { ∗/ 5 /∗ p r i n t f ( ” c o u n t O n e s (%d ) = %d \ n ” , c , c o u n t O n e s ( c ) ) ; ∗/ 6 /∗ } ∗/ 7 8 u n s i g n e d c h a r c = 8 ; 9 10 p r i n t f (” s e t B i t ( 8 , 0 ) = %d \ n ”, setBit ( c , 1 ) ) ; 11 12 r e t u r n 0 ; 13 }

Referências

Documentos relacionados

Ganhos significativos em algumas competências socioemocionais a curto prazo (relacionamento com os pares e competência social)?. Os alunos do GI com níveis médios no

Como recursos para a modelagem do problema, serão adotados os conceitos da Análise de Decisão, capazes de interpretar os diversos aspectos envolvidos no contexto de decisão, bem como

Chora Peito Chora Joao Bosco e Vinicius 000 / 001.. Chão De Giz Camila e

Estas taxas de crescimento estão entre os maiores valores encontrados para esta espécie, evidenciando a potencialidade que a população apresenta para desenvolver

Em conformidade com o disposto na n.° 1 do artigo 28.° da Portaria n.°125-N2019 de 30 de abril, conjugado com o Código do Procedimento Administrativo, a realização da audiência

Por meio deste módulo também pode ser configurado o flúmen que será lido (identificado pelo campo “flúmen para Leitura”), o período de leitura, expresso em segundos, a

c) Quais as possíveis traduções do verbo esse no contexto das frases? d) Alguma vez em português o verbo ser pode ser empregado com outro sentido? Exemplo.. e) Como se constroem

 b) no âmbito da Secretaria da Receita Federal, pela liquidação do saldo consolidado, com a utilização de créditos de prejuízo fiscal e de base de cálculo negativa