Introdu¸c˜
ao a Linguagem C
v-0.03
Rodrigo Bonif´acio
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).
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).
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
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˜aoI (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.
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˜aoI (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.
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˜aoI (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.
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 }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 }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
Na essˆencia, duas fun¸c˜oes
scanf: leitura da entrada padr˜ao printf: escrita na sa´ıda padr˜ao
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 o9 ∗ 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 }
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.
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.
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
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 ) ;
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 }
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) { ... }
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 }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 }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.
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.
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.
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.
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 ] ) ;
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 }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 ?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.
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.
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.
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 ] ∗/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.
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.
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 }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] . . .
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] . . .
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] . . .
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].
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] . . .
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.
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.
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]
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 }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
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
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.
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.
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.
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.
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).
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.
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 ) ;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 }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 }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 }Compila¸c˜
ao em diferentes arquivos
$ gcc stack.c main_stack.c -o program # compila
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.
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
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
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)
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 }
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 }