Post on 09-Jun-2015
description
Conhecendo ou relembrando CVinícius Alves Hax
Baseado no material de Dave MarshallHack Thursday
Novembro de 2012
I Engenheiro de Computação (FURG), Especialista emAplicações para Web (FURG)
I Cursando Mestrado em Eng. de ComputaçãoI Analista de TI no C3/FURGI Empreendedor www.zeta�ops.com.br
Quem usa C?
I Sistemas OperacionaisI Computação de Alto DesempenhoI Microcontroladores, ArduinoI JogosI CUDA e OpenCL (programação placas grá�cas)
BCPL (Basic Combined Programming Language) (66)
GET "LIBHDR"
LET START( ) = VALOF $ (FOR I = 1 TO 5 DO
WRITEF("%N! = %I4 ∗N" , I , FACT( I ) )RESULTIS 0
) $
AND FACT(N) = N = 0 −> 1 , N ∗ FACT(N − 1)
B: Ken Thompson e Dennis Ritchie (1969)B = BCPL sem frescuras (precisava caber na memória)
C (1972): Melhorias em B, principalmente:
I StructsI Endereçamento por byte
O que levou a ser popular:
I PequenaI Tipagem fracaI Linguagem estruturadaI Operações bit-a-bitI Implementação de ponteiros
C se tornou uma linguagem pro�ssional por diversas razões:
I Construções de alto nívelI Suporta operações de baixo nívelI Produz programas e�cientesI Pode ser compilada em muitos tipos de arquiteturas
https://gist.github.com/4171628
#i n c l u d e <s t d i o . h>
main ( t ,_, a )cha r ∗a ;{ r e t u r n !0< t ? t<3?main (−79 ,−13 ,a+main(−87,1−_,main (−86 , 0 , a+1 )+a ) ) : 1 , t<_?main ( t+1, _, a ) : 3 , main ( −94, −27+t , a)&&t == 2 ?_<13 ?main ( 2 , _+1, "%s %d %d\n" ) : 9 : 1 6 : t <0?t<−72?main (_,t , "@n '+ ,# '/∗{}w+/w#cdnr /+,{} r /∗de}+,/∗{∗+,/w{%+,/w#q#n+,/#{ l ,+ ,/n{n+\,/+#n+,/#;#q#n+,/+k#;∗+,/ ' r : ' d∗ '3 ,}{w+K w 'K: '+} e# '; dq#' l q#'+d 'K#!/\+k#;q#' r }eKK#}w ' r }eKK{ n l ] '/#;#q#n '){)#}w ' ){ ){ n l ]'/+#n ' ; d}rw ' i ;# ){n\l ] ! / n{n# '; r{#w ' r nc{ n l ] '/#{ l ,+ 'K {rw ' iK { ; [ { n l ] ' /w#q#\n 'wk nw ' iwk{KK{ n l ] ! /w{%' l##w#' i ; : { n l ] ' /∗{ q#' l d ; r '}{ nlwb !/∗ de } ' c \; ; { n l '−{}rw]'/+,}##'∗}#nc , ' ,#nw] '/+kd '+e}+;\#' rdq#w! nr '/ ' ) }+}{ r l #'{n ' ')# } '+}##(!!/" ): t<−50?_==∗a ? putcha r ( a [ 3 1 ] ) : main (−65 ,_, a+1):main ((∗ a == ' / ' )+t ,_, a\+1 ):0< t ?main ( 2 , 2 , "%s " ) :∗ a==' / ' | | main (0 , main (−61 ,∗a , " ! ek ; dc \i@bK ' ( q)−[w]∗%n+r3#l , { } : \ nuwloca−O;m . vpbks , f x n t dCegh i r y " ) , a+1);}
Tipos de dados em C:
Variáveis:
var_type l i s t v a r i a b l e s ;
i n t i , j , k ;f l o a t x , y , z ;cha r ch ;
Saída formatada:
p r i n t f ( "%c %f %d" , ch , r e a l_va l , i n t_va l ) ;
Variáveis:Globáis: De�nidas fora de funções
Estáticas: Mantém seu valor entre múltiplas chamadas
v o i d s t a t ( ) ; /∗ p r o t o t yp e fn ∗/
main ( ){ i n t i ;
f o r ( i =0; i <5;++ i )s t a t ( ) ;
}
s t a t ( ) {i n t auto_var = 0 ;s t a t i c i n t s t a t i c_v a r = 0 ;p r i n t f ( " auto = %d , s t a t i c = %d \n" , auto_var , s t a t i c_v a r ) ;++auto_var ;++s t a t i c_v a r ;}
Operações de incremento:
x++;−−y ;
i=i+2;i+=2;
Igualdade: ==Diferença: !=
if (i=j)é válido. Cuidado!
Operadores lógicos:&& (AND)|| (OR)
if (a > b)....else....
Operador ternárioc=(a>b)?a:b;
sw i t c h ( l e t t e r ){ca s e 'A ' :ca s e 'E ' :ca s e ' I ' :ca s e 'O ' :ca s e 'U ' :
numbero fvowe l s++;b r eak ;
ca s e ' ' :numbero f spaces++;b r eak ;
d e f a u l t :numbe ro f cons tan t s++;b r eak ;
}
for (expressao1; expressao2; expressao3)comando;
ou bloco de comandos
f o r ( x=3;x>0;x−){p r i n t f ( "x=%d\n" , x ) ;}
f o r ( ; ; );
f o r ( x=0,y=4, z=4000; z ; z /=10)
i n t x=3;
main ( ){wh i l e ( x>0)
{ p r i n t f ( "x=%d\n" , x ) ;x−;
}}
do {p r i n t f ( "x=%d\n" , x−);}
wh i l e ( x >0);
break � sai de um laçocontinue � pula uma iteração de um laço
int tableofnumbers[50][50];// Vetores começam em zero!
cha r f i r s t n ame [ 5 0 ] , l a s tname [ 5 0 ] , f u l l n ame [ 1 0 0 ] ;
f i r s t n ame= "Arno ld " ; /∗ I l l e g a l ∗/l a s tname= "Schwarznegger " ; /∗ I l l e g a l ∗/f u l l n ame= "Mr"+f i r s t n ame
+las tname ; /∗ I l l e g a l ∗/
Como é armazenada uma string?
f l o a t f i n d a v e r a g e ( f l o a t a , f l o a t b ){ f l o a t ave rage ;ave rage=(a+b )/2 ;r e t u r n ( ave r age ) ;
}
main ( ){f l o a t a=5,b=15, r e s u l t ;
r e s u l t=f i n d a v e r a g e ( a , b ) ;p r i n t f ( " ave rage=%f \n" , r e s u l t ) ;
}
Exercício 1: Descobrir quantas letras A, B ou C existem emuma string.
s t r u c t gun{cha r name [ 5 0 ] ;i n t magaz i n e s i z e ;f l o a t c a l i b r e ;} ;
s t r u c t gun a r n i e s ;
s t r u c t gun a r n i e s={"Uzi " , 30 , 7} ;
t y p e d e f s t r u c t gun{cha r name [ 5 0 ] ;i n t magaz i n e s i z e ;f l o a t c a l i b r e ;} agun ;
agun a r n i e s={"Uzi " , 30 , 7} ;
a r n i e s g u n s [ 5 0 ] . c a l i b r e =100;
Casting
i n t i n t ege rnumbe r ;
f l o a t f l o a tnumbe r =9.87;
i n t ege rnumbe r=( i n t ) f l o a tnumbe r ;
Ponteiros são uma parte fundamental do C. Usar C semponteiros é perder boa parte do poder e �exibilidade que alinguagem permite. O segredo de usar C é usar ponteiros.
Por que ponteiros são importantes?
I É a única maneira de expressar certas computaçõesI Produz código compacto e e�cienteI Provê uma ferramenta poderosa
C usa ponteiros com:
I ArraysI EstruturasI Funções
& - Retorna o endereço de uma variável* - Retorna o conteúdo de um objeto apontado por um
ponteiroint *pointer;
Ponteiros:
i n t ∗ i p ;i n t x ;
i p = &x ;∗ i p = 100 ;
f l o a t ∗ f l p , ∗ f l q ;
∗ f l p = ∗ f l p + 10 ;
++∗ f l p ;
(∗ f l p )++;
f l q = f l p ;
i n t a [ 1 0 ] , x ;i n t ∗pa ;
pa = &a [ 0 ] ; /∗ pa p o i n t e r to add r e s s o f a [ 0 ] ∗/
x = ∗pa ;/∗ x = con t en t s o f pa ( a [ 0 ] i n t h i s ca s e ) ∗/
i n t ∗ i p ;i p = ( i n t ∗) ma l l o c (100∗ s i z e o f ( i n t ) ) ;
Exercício 2: De�nir o tipo de dados número complexo. Fazeruma função que dado dois números complexos, retorne um
número complexo com a soma de ambos.
Referências:
I http://www.cs.cf.ac.uk/Dave/C/
I http://en.wikipedia.org/wiki/BCPL
I http://en.wikipedia.org/wiki/B_
%28programming_language%29
I http://en.wikipedia.org/wiki/C_
%28programming_language%29