Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Centro Nacional de Alto Desempenho CENAPAD-SP Prof. Carlos Rebollo Abril de 2013
1 Sumrio
1 Introduo....................................................................................................................... 7 1.1 O Curso.................................................................................................................... 7 1.2 A tipografia usada na apostila:.................................................................................7 1.3 Linguagem de Programao C.................................................................................. 7 1.4 Prin !pios do padro C.............................................................................................. " 1.4.1 #pirit of C.......................................................................................................... " 1.4.2 $raduo: #pirit of C.......................................................................................... " 2 Aula 1............................................................................................................................ 11 2.1 Primeiro Programa em C ........................................................................................ 11 2.1.1 O omando printf............................................................................................ 1% 2.2 A linguagem de programao C............................................................................. 1% 2.3 $ipo de dado em C................................................................................................. 17 2.4 &e larao de 'ari()eis primiti)as........................................................................1" 2.% $ipos de dados primiti)os e )ari()eis.....................................................................21 2.%.1 *um+ri os inteiros.......................................................................................... 21 2.%.2 *um+ri os ponto flutuante..............................................................................2% 2.%.3 Cara tere........................................................................................................ 27 2., 'alores literais........................................................................................................ 2" 2.,.1 Literal num+ri a inteira...................................................................................2" 2.,.2 Literal num+ri a ponto flutuantes...................................................................2" 2.,.3 Literal ara tere e string................................................................................. 31 3 Aula 2............................................................................................................................ 33 3.1 'ari()eis deri)adas................................................................................................ 33 3.2 Arra-s..................................................................................................................... 33 3.2.1 &e larao de )ari()eis arra-.........................................................................33 3.2.2 Ini iali.ao de )ari()eis Arra-s.....................................................................3% 3.2.3 /tili.ao de )ari()eis Arra-...........................................................................3% 3.3 #tring...................................................................................................................... 37 3.4 #tru t..................................................................................................................... 3" 3.4.1 &e larao de stru t....................................................................................... 3" 3.4.2 /tili.ao de stru t.......................................................................................... 41 3.4.3 Ini iali.ao de stru t...................................................................................... 41 3.% /nion...................................................................................................................... 43 3.%.1 &e larao de union....................................................................................... 43 3.%.2 /tili.ao de union.......................................................................................... 4% 3.%.3 Ini iali.ao de union...................................................................................... 47 3., 0num...................................................................................................................... 4" 3.,.1 &e larao de enum....................................................................................... 4" 3.,.2 /tili.ao de enum.......................................................................................... %1 3.,.3 Ini iali.ao de enum...................................................................................... %1 3.,.4 $-pedef............................................................................................................ %3 3.7 01press2es............................................................................................................. %% 3.7.1 Operadores un(rio3 4in(rios e tern(rios..........................................................%% 3.7.1.1 Operadores aritm+ti os............................................................................%% 3.7.1.2 Operadores rela ionais.............................................................................%7 3.7.1.3 Operadores l5gi os................................................................................... %7 3.7.1.4 Operadores 4it......................................................................................... %" 3.7.1.% Operadores de atri4uio.........................................................................%" 3.7.1., Operador mem4ro.................................................................................... ,1 3.7.1.7 Operadores de geren iamento de mem5ria.............................................,1 3.7.1.6 Operador ondi ional............................................................................... ,3
3.7.1." Operador de on)erso............................................................................,3 3.6 Pre ed7n ia de operadores:...................................................................................,3 Aula 3............................................................................................................................ ,7 4.1 8lo os..................................................................................................................... ,7 4.2 0s opo.................................................................................................................... ,7 4.3 Instruo de seleo.............................................................................................. ," 4.3.1 Instruo if...................................................................................................... ," 4.3.2 Instruo s9it :.............................................................................................. 71 4.4 Instruo de interao............................................................................................ 73 4.4.1 Instruo 9:ile................................................................................................ 73 4.4.2 Instruo do ; 9:ile......................................................................................... 7% 4.4.3 Instruo for.................................................................................................... 77 4.4.4 Instruo ontinue e 4rea<..............................................................................7" 4.% Instruo de salto goto........................................................................................... 7" 4., =un2es.................................................................................................................. 61 4.,.1 &e larao...................................................................................................... 63 4.,.2 &efinio......................................................................................................... 63 4.,.3 /tili.ao......................................................................................................... 6% Aula 4............................................................................................................................ 6" %.1 >eren iamento de mem5ria...................................................................................6" %.1.1 Ponteiro e endereo de mem5ria....................................................................6" %.1.2 Alo ao din?mi a.......................................................................................... "1 %.1.3 Ponteiros para arra-........................................................................................ "3 %.1.4 Ponteiros para string....................................................................................... "% %.1.% Ponteiro para estruturas.................................................................................. "% %.1., Ponteiros para funo...................................................................................... "7 %.1.7 Ponteiros omo par?metros de funo............................................................"7 %.2 &urao de arma.enamento do o4@eto.................................................................."" %.3 0spe ifi ao de lasse de arma.enamento.........................................................."" %.3.1 01tern.............................................................................................................. "" %.3.2 #tati ............................................................................................................. 1A1 %.3.3 Const............................................................................................................. 1A3 %.3.4 Begister e restri t.......................................................................................... 1A3 Aula %.......................................................................................................................... 1A% ,.1 8i4liote a padro C.............................................................................................. 1A% ,.2 Botinas de entrada e sa!da................................................................................... 1A% ,.2.1 ArCui)os........................................................................................................ 1A% ,.2.2 0ntrada e sa!da............................................................................................. 1A7 ,.2.2.1 #a!da de dados formatada.....................................................................1A7 ,.2.2.2 0ntrada de dados formatada..................................................................1A7 ,.2.3 $ratamento de erro........................................................................................ 1A7 ,.2.3.1 =un2es Dteis para o tratamento de erro...............................................1A" ,.2.4 Passagem de par?metros para o programa...................................................113 Eaterial 01tra.............................................................................................................. 11%
1 Introduo
1.1 O Curso
O curso foi estruturado em cinco aulas sendo cada aula tendo uma parte terica e uma parte prtica com exerccios e laboratrios. Os captulos seguem a sequencia das aulas. 1 Introduo 2 Aula 1: Estrutura de um programa C, declarao de variveis primitivas e valores literais. 3 Aula 2: Declarao de variveis derivadas e construo de expresses. 4 Aula 3: Controles de fluxos, estrutura de funes, blocos e escopo. 5 Aula 4: Gerenciamento de memria 6 Aula 5: Biblioteca padro C e entrada/sada 7 Material Extra:
Exemplo if( <expresso lgica> ) <bloco> [else <bloco>] O comando if obrigatoriamente recebe um parmetro <expresso lgica> e um <bloco>. Opcionalmente depois pode-se ter o else. Mas se tivermos o comando else, obrigatoriamente teremos um <bloco> depois. Exemplo: if( 1 > 2 ) comando1(); else comando2();
2 Aula 1
2.1 Acesso ao ambiente CENAPAD utilizando Windows.
1. clica-se no cone do putty
Na primeira vez preencha hostname e saved session com cenapad.unicamp.br. Depois clica-se save. Depois de salvo, clica-se open. Nas outras vezes somente clica-se na sesso salva, e depois open. 3. No terminal preencha o login e password com as informaes da conta recebida no primeiro dia de aula.
O ambiente CENAPAD no tem programas grficos para edio de arquivos. Os editores em linha de comando so o vi e o nano. Para quem j conhece essas ferramentas poder escolher a que mais confortvel. Quem est conhecendo agora, indicamos o nano pela facilidade nos comandos.
0ditar um arCui)o e1istente Para na)egar entre as lin:as ou posi2es utili.e as te las HsetaI Fnano arCui)o Fnano testeA1.
#e o arCui)o no foi alterado3 o programa sai sem perguntar nada. #e for um arCui)o alterado3 ele perguntar( H#a)e modiffied 4ufferI &igite HLI. 0le onfirmar( o nome do arCui)o3 apenas te le H0nterI.
Um programa em C um texto com palavras em ingls e simbolos que tem regras lxicas e semnticas distintas. Essas regras que formam a estrutura e as regras para escrever um programa na linguagem C. Podemos comear a definir dois tipos bsicos de texto que podemos encontrar, textos da linguagem e textos de comentrios. Textos da linguagem formam a estrutura do programa e comentrios servem para documentar o programa e so ignorados pelo compilador. Os comentrios podem ser de uma linha ou comentrios de mltiplas linhas. Comentrios de mltiplas linhas comeam com /* e terminam com */ tudo que estiver entre esses smbolos considerado comentrio. Comentrio de uma linha inicia com // e termina no final da linha. Nesse exemplo podemos identificar comentrio de vrias linhas da linha 1 at a 5. Comentrio de uma linha temos na linha 9. exemplo01.c 1$. ! 1'. ! nome" exemplo#1.c 1*. ! descri%o" primeiro exemplo em & 1+. ! data" 1( #) 2#12 1(. ! 1).,incl-de <stdio..> 10.int main() 2#./ 21. imprime 1om dia 22. printf(21om dia3n4); 2$. ret-rn #; 2'.5 Se removermos os comentrios, ficaramos com: exemplo01.c 1. 2. $. '. *. +.,incl-de <stdio..> (.int main() )./ 0. 1#. printf(21om dia3n4); 11. ret-rn #; 12.5 Se olharmos o cdigo fonte sem os comentrios, a primeira linha com algum comando a linha 6. Essa linha que inicia com #, que indica um comando especial chamado de pr-processamento. Esse comando, o include, recebe como parmetro um nome de arquivo que o compilador l o contedo e coloca no exato lugar do comando. Normalmente veremos o comando include com arquivos com extenso .h que tem o significado de header ( cebealho ) que so arquivo de definies. Nesse caso o arquivo stdio.h um arquivo da biblioteca padro C que define funes de entrada e sada de informaes ( printf na linha 10 ).
Logo depois, na linha 7 int main() a definio de uma funo em C. Nesse caso a funo com o nome main ( principal em ingls). Um programa pode ter vrias funes mas somente uma com o nome main que indica aonde o programa iniciar quando for executado. Alias, o C case-sensetive e diferencia letras minsculas de maisculas: main diferente de MAIN e diferente de Main. A funo main tem uma palavra antes o int que uma palavra que define um tipo de dado em C que representa inteiro. A funo main que por analogia da matemtica (y = f(x)) tem um valor de retorno, valor de resultado da funo. Programas tem uma funo main mas se estivermos programando bibliotecas que apenas disponibilizam uma coleo de funes, no teramos a funo main e o programador que for usar essa biblioteca que vai definir um main em seu programa. A funo main inicia na linha 8 com o caractere { e termina na linha 12 com o caractere }. Toas as linhas entre a 8 e 12 esto na funo main ou mais tecnicamente no escopo da funo main. Toda a linha de comando em C termina com ;. Na linha 11 temos uma outra funo a printf que como analogia a funes em matemtica ( y = f(x) ), recebe como parmetro um texto Bom dia\n. A funo printf imprime na tela do usurio o que recebe como parmetro ( Bom dia\n ). Na linha 12 temos a linha return 0; que um comando especial que alm de sair da funo, e nesse caso do programa, ela especifica o valor de retorno. Funes retornam ao ponto que ela foi chamado. No caso de main, ela retorna para quem executou o programa. A conveno que quando retornamos zero ( 0 ) num programa, quer dizer que ele funcionou como esperado e se tiver valor diferente de zero, seria o nmero de algum erro. Agora vamos compilar esse primeiro exemplo: Na pasta exemplos executamos: icc 6o exemplo#1 exemplo#1.c 67all Para executar o programa: . exemplo#1 Sada na tela: 1om dia Note que os caracteres \n no so exibidos porque essa sequencia representa o carcter de nova-linha. Existem outras sequencias especiais que veremos durante o curso.
A string de formatao um texto que podemos escrever literalmente ou podemos indicar locais para a incluso de variveis usando % e um qualificador que define o tipo e a formatao de sada de cada item. Para cada % que achamos, ele ira usar uma varivel da lista de variveis. printf(2:d :d :d 3n48 1 8 2 8 $ ); para cada :d o printf coloca o 9alor do prximo literal o- 9ari;9el
Letra i ou d u o K ou 1 = ou f 0 ou e > ou g A ou a s p &es rio Inteiro Inteiro sem sinal O tal sem sinal Me1ade imal sem sinal Ponto flutuante. Ponto flutuante notao ientifi a. /sar a mel:or representao e ou f Ponto flutuante em :e1ade imal om sinal Cara tere. #tring Ponteiro
#e olo armos um N1 Cue no ondi. om o tipo da )ari()el ou literal3 o ompilador a)isar( mas dei1ar( passar. Ouando for e1e utado3 esse erro fi ar( aparente. 01emploA2.
1. ! 2. ! nome" exemplo#2.c $. ! descri%o" <rintf '. ! data" #) #' 2#1$ *. ! +.,incl-de <stdio..> (.int main() )./ 0. = comando printf 1#. printf(>1om dia3n>); 11. printf(>?11) 1# @ 12. printf(>?12) 61# @ 1$. printf(>?1$) #.1# @ 1'. printf(>?1') 6#.1# @ 1*. printf(>?1*) c.ar @ 1+. ret-rn #; 1(.5
:d8:i8:-8:o8:x3n>81#81#81#81#81#); :d8:i8:-8:o8:x3n>861#861#861#861#861#); :f8:e8:g8:a8:x3n>8#.1#8#.1#8#.1#8#.1#8#.1#); :f8:e8:g8:a 3n> 86#.1#86#.1#86#.1#86#.1#); :c string @ :s3n>8 AaA 8>1om dia>);
Identificador o nome que podemos dar ou identificar os objetos em C. Identificador pode ser uma varivel, uma funo, uma tag, membro de uma estrutura ou unio, um nome typedef, um nome de label, um parmetro de macro. Podemos usar o mesmo identificador para tipos diferentes em pontos(escopos) diferentes do programa, como podemos ter uma varivel com o mesmo nome de funo. Constantes e literal string so como descrevo os valores no cdigo fonte. Por exemplo o valor numrico 10 ou o carcter 'a' ou no caso de constante string Bom dia. Pontuao so smbolos usados tanto nas operaes matemticas ou lgicas ou para delimitar o escopo ou final de linha.
Esses grupos de tipos de dados so escalares podendo realizar todas as operaes matemticas, lgicas e comparativas. Isso natural para nmeros mas o caractere a representao em bit de um valor numrico e essa representao definida pela tabela ASCII ( letra 'a' o nmero 97). Os tipos de dados derivados: String: Em C string um vetor de vrios caracteres. Array: Estrutura que podemos agrupar valores em formato de vetores ou matrizes de vria dimenses. Cada um pode ser referenciado pelo um ndice numrico. Struct: Estrutura que podemos agrupar variveis de tipo diferente. Cada varivel componente referenciada pelo nome dela. Union: Estrutura anloga ao struct mas todas as variveis ocupam o mesmo espao na memria. Usado para economizar memria. Enum: Estrutura de dado aonde posso enumerar opes usando nomes.
antes. Depois que um programa executa, a memria no apagada e sim sobreposta por outro programa. Para inicializar uma varivel atribumos algum valor neutro para essa varivel. Podemos aproveitar a declarao da varivel para a inicializao dela. <tipo> nome@9alor; <ara inicialiDar o contador int contador@1; <odemos tambm declarar e inicialiDar 9;rias 9ari;9eis int x@#8C@#8D@#; <odemos inicialiDar a 9ari;9el depois de declarar int contador; int x8C8D; contador @1; x@#; C@D@#; Um exemplo completo seria: exemplo03.c 1. ! 2. ! nome" exemplo#$.c $. ! descri%o" Eeclara%o e inicialiDa%o de 9ari;9eis '. ! data" 11 #2 2#1' *. ! +.,incl-de <stdio..> (.int main() )./ 0. Eeclara%o e inicialiDa%o de 9ari;9eis 1#. int contador@#; 11. int x@18C@1; 12. c.ar c; 1$. c@AxA; 1'. 1*. printf(21om dia3n4); 1+. printf(2contador@:d3n48contador); 1(. printf(2x@:d8 C@:d3n48x8C); 1). printf(2c@:c3n48c); 10. 2#. ret-rn #; 21.5
Um exemplo completo exemplo04.c 1. ! 2. ! nome" exemplo#'.c $. ! descri%o" Eeclara%o de 9ari;9eis inteiras '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..>
(.int main() )./ 0. s.ort int Fm; 1#. -nsigned s.ort int idade; 11. long int cm; 12. -nsigned long int saldoGcc; 1$. long long int mm; 1'. -nsigned long long int molec-las; 1*. ret-rn #; 1+.5 Podemos verificar se o ambiente que estamos usando segue o padro C usando a funo sizeof. Essa funo retorna a quantidade de bytes que so 8 bits. exemplo05.c 1. ! 2. ! nome" exemplo#*.c $. ! descri%o" Eeclara%o de 9ari;9eis inteiras '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. printf(2s.ort int @ :l-3n48 siDeof(s.ort int)); 1#. printf(2-nsigned s.ort int @ :l-3n48 siDeof(-nsigned s.ort int)); 11. printf(2long int @ :l-3n48 siDeof(long int)); 12. printf(2-nsigned long int @ :l-3n48 siDeof(-nsigned long int)); 1$. printf(2long long int @ :l-3n48 siDeof(long long int)); 1'. printf(2-nsigned long long int @ :l-3n48 siDeof(-nsigned long long int)); 1*. ret-rn #; 1+.5
$ipo float
,2 4its ,4 4its
A declarao de variveis segue a mesma regra: <tipo> nome; Um exemplo no cdigo fonte exemplo06.c 1. ! 2. ! nome" exemplo#+.c $. ! descri%o" Eeclara%o de 9ari;9eis ponto fl-t-ante. '. ! data" #) #' 2#1$ *. ! +.,incl-de <stdio..> (.int main() )./ 0. float Fm; 1#. do-ble cm; 11. long do-ble mm; 12. ret-rn #; 1$.5 Podemos verificar se o ambiente que estamos usando segue o padro C usando a funo sizeof. Essa funo retorna a quantidade de bytes que so 8 bits. exemplo07.c 1. ! 2. ! nome" exemplo#(.c $. ! descri%o" Eeclara%o de 9ari;9eis inteiras '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. printf(2float @ :l-3n48 siDeof(float)); 1#. printf(2do-ble @ :l-3n48 siDeof(do-ble)); 11. printf(2long do-ble @ :l-3n48 siDeof(long do-ble)); 12. ret-rn #; 1$.5
2.6.3 Caractere.
No C caractere representa uma letra somente que o tipo char. O char um tipo escalar porque cada letra pode ser representada por um nmero como na tabela ASCII. String em c no um tipo primitivo. String implementado como um vetor de char. Veremos esse tipo na prxima aula.
A declarao de variveis segue a mesma regra: <tipo> nome; Um exemplo no cdigo fonte exemplo08.c 1. ! 2. ! nome" exemplo#).c $. ! descri%o" Eeclara%o de 9ari;9eis caractere. '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. c.ar letra; 1#. -nsigned c.ar nota; 11. Hc.arGt -tf; 12. ret-rn #; 1$.5 Podemos verificar se o ambiente que estamos usando segue o padro C usando a funo sizeof. Essa funo retorna a quantidade de bytes que so 8 bits. exemplo09.c 1. ! 2. ! nome" exemplo#0.c $. ! descri%o" Eeclara%o de 9ari;9eis inteiras '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. printf(2c.ar @ :l-3n48 siDeof(c.ar)); 1#. printf(2-nsigned c.ar @ :l-3n48 siDeof(-nsigned c.ar)); 11. printf(2Hc.arGt @ :l-3n48 siDeof(Hc.arGt)); 12. ret-rn #; 1$.5
Argumento de funo. Indicamos e reforamos que a funo no recebe parmetros. Ponteiros void. Ponteiro neutro de tipo.
<odemos -sar a nota%o cientifica #.*e1#8 *.#e28 *.E$ IJmeros na base .exadecimal iniciamos com #x #x#.*p# 8 #x*.#p1 8 #x*.p#
?etras AaA8 AbA8 AcA <odemos -sar seL-encias de escape A3AA8 A34A8 A3M3A <odemos tambem -sar cdigo octal e .exadecimal A3#1'1A8 A3x+1A ?iteral string -samos aspas d-plas 21om dia4
Letra i ou d u :u lu llu f Lf
&es rio Inteiro Inteiro sem sinal s:ort int long int long long int dou4le;float long dou4le
2.8 Exerccios
1. Complete os cdigos abaixo:
&digo N 1.,incl-de <stdio..> 2.GGGGGGGGGGGGGGGGGGGG $./ '. printf(21om dia3n4)GGG *. ret-rnGGG; +.GGG &digo 1 1.,GGG <stdio..> 2.int main() $.GGG '. int aGGGG; *. float GGG@2.1; +. long GGG x@2$.1?; (. printf(2a@:d3n48GGG); ). printf(2C@:f3n48C); 0. printf(2x@:?d3n4GGG x)GGG 1#. GGGG; 11.5 1.Faa um programa em c com o nome lab01.c declarando e inicializando as variveis: a) Inteiros para: dia, ms, ano, idade. b) char letra c) Pontos flutuantes para: altura, peso d) Ponto flutuante para pi ( 3, 14159265358979323846). 2.Altere o lab01.c e acrescente comandos printf para imprimir: a) altura = xxx, peso = xxx b) letra = x c) pi = 3.14159265358979323846 Ser impressa todas as casas do nmero pi? d) Data de nascimento d/m/a tenho n anos 3.Faa a cpia do lab01.c com o nome lab01nc.c e altere todos os literais para notao cientfica, caso possa ser aplicado.
3 Aula 2
3.1 Variveis derivadas
Os tipos de dados derivados o programador que define o formato do dado e ele tambm deve implementar rotinas ou funes que trabalhem com esse tipo de dado. A linguagem de programao no fornece operadores nesses tipos de dados.
3.2 Arrays
Arrays representam em matemtica vetores e matrizes. Em C tanto vetores quanto matrizes so implementados usando uma varivel composta de vrias posies indexadas numericamente. O C padro 99 e posteriores aceita o formato VLA ( laviable-length array array de tamanho varivel ) que quer dizer que podemos definir o tamanho do array na execuo do programa, diferente da alocao esttica que definida na compilao. No confundir com alocao dinmica que poderia alterar dinamicamente o tamanho do array em qualquer hora do cdigo. O C aceta array estatico e VLA mas no array dinamico. Nesse caso podemos utilizar alocao dinamica de memoria. NrraC est;tico int 9etor[1#]; NrraC O?N n @ arg-mento(1); int 9etor[n]; a NrraC dinPmico8 somente para exemplo8 no existe no & int 9etor[1#]; no9oGtaman.o(9etor82#);
exemplo10.c 1. ! 2. ! nome" exemplo1#.c $. ! descri%o" Eeclara%o de 9etores e matriDes '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int idade; 1#. int dataIascimento[$]; 11. int matriD2E[1#][1#]8 matriD$E[1#][1#][1#]; 12. ret-rn #; 1$.5
3.3 String
String em C implementado como um vetor de char que termina com um caractere especial '\0'. Se tivermos uma string Texto ela teria 6 posies (mais a posio do caracter nlo) iniciando com 0 at 5.
e 1 t o SA
Um erro comum tentar usar uma posio fora do limite da string e pode gerar comportamentos inesperados no programa. Um outro problema apagar o caractere de final de string '\0'. Se no tiver esse caractere uma funo que trabalhe com string ir transpor o limite dela at que em alguma outra posio aleatria da memria tiver um '\0' o que pode gerar acesso indevido a memria. c.ar string[taman.o]; c.ar string[taman.o]@4Sexto4; c.ar string[]@4Sexto4; c.ar string[taman.o]@ /ASA8 AeA8 AxA8 AtA8 AoA8 A3#A 5; String como vetor funciona como array, no pode-se alterar o tamanho dela automaticamente mas podemos alterar caractere por caractere como se fosse um vetor. Podemos tambm utilizar funes que tratam de string. A biblioteca padro do C tem vrias funes que trabalham com string. c.ar string[taman.o]@4Sexto4; string[#]@AtA; Um exemplo completo seria: exemplo13.c 1. ! 2. ! nome" exemplo1$.c $. ! descri%o" Eeclara%o e -tiliDa%o de strings '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. c.ar nome[]@4&arlos TenriL-e Uebollo4; 1#. c.ar profissao[0]@4Nnalista4; 11. 12. printf(2Iome :s ( letra inicial :c) profisso :s 3n48 nome8 nome[#]8 profissao); 1$. 1'. ret-rn #; 1*.5
3.4 Struct
Struct so estrutura que agrupam variveis com tipos de dado diferente e sendo cada posio nomeada e no indexada como vetores. Podemos compor structs com variveis do tipo primitivo ou com tipos derivados at compor struct com struct.
Nesse caso: nometipo: o nome desse tipo struct, podemos declarar variveis usando esse nome. <tipos> vars; so as variveis componente dessa struct vstructs so variveis do stipo struct nometipo Na linha struct nometipo outrovar estamos declarando outra variavel do tipo struct nometipo que j foi definido.
Um exemplo completo seria: exemplo14.c 1. ! 2. ! nome" exemplo1'.c $. ! descri%o" Eeclara%o de str-ct '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. str-ct data 1#. / 11. int dia8mes8ano; 12. 5 .oVe; 1$. 1'. str-ct data aman.a; 1*. 1+. ret-rn #; 1(.5
Um exemplo completo seria: exemplo15.c 1. ! 2. ! nome" exemplo1*.c $. ! descri%o" Eeclara%o de str-ct '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. str-ct data 1#. / 11. int dia8mes8ano; 12. 5 .oVe; 1$. 1'. str-ct data aman.a; 1*. 1+. .oVe.dia@1(; 1(. .oVe.mes@1#; 1). .oVe.ano@2#12; 10. 2#. aman.a @ .oVe W 1; erro de compila%o 21. 22. printf(2Eata de .oVe :d :d :d3n48 .oVe.dia8 .oVe.mes8 .oVe.ano); 2$. ret-rn #; 2'.5
3.5 Union
Union um tipo de estrutura anloga ao struct mas todas as variveis ocupam o mesmo espao na memria. Usado para economizar memria. O tamanho total dessa estrutura o tamanho da maior varivel componente.
Um exemplo completo seria: exemplo17.c 1. ! 2. ! nome" exemplo1(.c $. ! descri%o" Eeclara%o de -nion '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. -nion 9alor 1#. / 11. int inteiro; 12. float real; 1$. do-ble bigGreal; 1'. 5 9al1; 1*. 1+. -nion 9alor 9al2; 1(. 1). ret-rn #; 10.5
Um erro comum ao usar union definir uma varivel componente de um tipo e usar uma outra varivel componente de outro tipo. Para a utilizao correta da union precisaria de uma varivel auxiliar que indique qual a varivel que tem o valor significativo. -nion nometipo / <tipo1> 9ar1; <tipo2> 9ar2; ... <tipon> 9arn; 5 9-nion189-nion1; -nion nometipo o-tra9ar; 9-nion.9ar1@9alor1; 9-nion.9ar2@9alor2; Um exemplo completo seria: exemplo18.c 1. ! 2. ! nome" exemplo1).c $. ! descri%o" Eeclara%o e -tiliDa%o de -nion '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. -nion 9alor 1#. / 11. int inteiro; 12. float real; 1$. do-ble bigGreal; 1'. 5 9al1; 1*. 1+. 9al1.inteiro@1#; 1(. 1). printf(>inteiro :d3n>8 9al1.inteiro); 10. printf(>real :f3n>8 9al1.real); 2#. printf(>bigGreal :f3n>8 9al1.bigGreal); 21. 22. 9al1.real@1.*; 2$. 2'. printf(>inteiro :d3n>8 9al1.inteiro); 2*. printf(>real :f3n>8 9al1.real); 2+. printf(>bigGreal :f3n>8 9al1.bigGreal); 2(. 2). ret-rn #; 20.5
str-ct tagged-nion / en-m /KIXI=7I8 YIS8 ?=IZ8 E=K1?E8 <=YISEU5 code; -nion / int i; long l; do-ble d; 9oid !p; 5 -; 5; referencia .ttp" c6faL.com str-ct tagged-nion..tml
3.6 Enum
Enum um tipo de estrutura de dado aonde posso enumerar opes usando nomes. Esses nomes so significativos para o C e representam constantes com o valor numrico. Cada constante da enumerao tem um valor numrico e por padro inicia com 0 e incrementado para cada constante. Podemos alterar esses valores.
Um exemplo completo seria: exemplo20.c 1. ! 2. ! nome" exemplo2#.c $. ! descri%o" Eeclara%o de en-m '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. en-m cores / 9ermel.o8 9erde8 aD-l 5 9al1; 1#. 11. en-m estadoGci9il / solteiro@18 casado8 9i-9o@*8 desL-itado 5; 12. 1$. en-m estadoGci9il 9al2; 1'. 1*. ret-rn #; 1+.5
Um exemplo completo seria exemplo22.c 1. ! 2. ! nome" exemplo22.c $. ! descri%o" Eeclara%o8 inicialiDa%o e -tiliDa%o de en-m '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. en-m cores / 9ermel.o8 9erde8 aD-l 5 9al1@aD-l; 1#. 11. en-m estadoGci9il / solteiro@18 casado8 9i-9o@*8 desL-itado 5; 12. 1$. en-m estadoGci9il 9al2; 1'. 1*. 9al2@casado; 1+. 1(. printf(2cores :- :- :-3n48 9ermel.o8 9erde8 aD-l ); 1). printf(29aria9eis :- :- 3n48 9al18 9al2 ); 10. 2#. ret-rn #; 21.5
3.6.4 Typedef
Typedef define tipos de dados definidos pelo programador que a linguagem de programao reconhece como um tipo definido. O tipo de dado novo dependedo como foi criado pode ser primitivo ou derivado e seguir as mesmas regras seja na declarao, inicializao e utilizao. tCpedef tipo nomeGtipo [s-lfixo]; nomeGtipo 9ar;
/m e1emplo ompleto seria:
exemplo23.c 1. ! 2. ! nome" exemplo2$.c $. ! descri%o" tCpedef '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. 1#. tCpedef int inta8 intb[2]8 intc[2][2]; 11. tCpedef c.ar c.ara8 c.arb[]; 12. tCpedef str-ct tipostr-ct / int x; 5 no9oGtipo; 9ari;9el
no9oGtipo no
1$. 1'. 1*. 1+. 1(. 1). 10. 2#. 21. 22. 2$. 2'. 2*. 2+. 2(.5
inta ia @ 1#; intb ib @ / 1 8 2 5; intc ic @ / /1 8 25 8 /11 8 125 5; c.ara ca @ AaA; c.arb cb @ 2Tello4; no9oGtipo ta @ / .x @ 1## 5; o- declarar str-ct tipostr-ct ta @ / .x @ 1## 5; printf( 2ia@:d8 ib[1]@:d8 ic[1][1]@:d3n48 ia8 ib[1]8 ic[1][1]); printf( 2ia@:c8 ib@:s3n48 ca8 cb); printf( 2ta.x@:d3n48 ta.x ); ret-rn #;
3.7 Expresses
Uma expresso uma sequencia de operadores e operandos que resulta em um valor ou que resulta em um objeto ou em uma funo, ou que resulte em uma atribuio, ou que faa um conjunto dessas aes. As expresses so avaliadas da esquerda para a direita obedecendo a precedncia dos operadores. int x; x @ 1; x @ x W 2 ! 2; nesse caso seria 1 W ( 2 ! 2 ) @ * Se precisar alterar a precedncia dos operadores podemos colocar entre parenteses. int x; x @ 1; x @ (x W 2) ! 2;
e1emplo24a.
1. ! 2. ! nome" exemplo2'.c $. ! descri%o" =peradores aritmticos bin;rios '. ! data" 1$ #2 2#1' *. ! +.,incl-de <stdio..> (.int main() )./ 0. int x@18C@$8D@*; 1#. 11. x@CWD; 12. D@x:C; 1$. C@D x; int int @ int 1'. x@6x; 1*. 1+. printf(2x@:i8 C@:i e D@:i3n48 x8 C8 D ); 1(. ret-rn #; 1).5 Os operadores ++ e - podem ser prefixos e sulfixos e tem o formato: WW9ar o- 9arWW 669ar o- 9ar66 o var tem que ser um lvalue, ou seja, uma varivel escalar e que possa ser atribudo valores ( no constante). A diferena do prefixo e sufixo que no prefixo o operador incrementa a varivel e depois fornece para a expresso o valor dela. No caso do sufixo, ele fornece o valor atual dela e depois a varivel incrementada.
e1emplo244.
1. ! 2. ! nome" exemplo2'b.c $. ! descri%o" =peradores WW e 66 '. ! data" 1$ #2 2#1' *. ! +.,incl-de <stdio..> (.int main() )./ 0. int x@18C@$8D@*; 1#. C@xWW; 11. D@WWx; 12. printf(2x@:i8 C@:i e D@:i3n48 1$. ret-rn #; 1'.5
x8 C8 D );
1. ! 2. ! nome" exemplo2*.c $. ! descri%o" =peradores relacionais bin;rios '. ! data" 1# #' 2#1$ *. ! +.,incl-de <stdio..> (.int main() )./ 0. int x@18C@$8D@*; 1#. 11. printf(>x>C :i8 x<D :i e C<@D :i3n>8 x>C8 x<D8 C<@D ); 12. 1$. printf(>x@@C :d e x[@D :d3n>8 x@@C8 x[@D ); 1'. 1*. printf(>:d3n>8 D > C > x); 1+. 1(. ret-rn #; 1).5
1. ! 2. ! nome" exemplo2+.c $. ! descri%o" =peradores lgicos '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int x8C8D; 1#. 11. x @ 1 \\ #; 12. 1$. C @ x ]] 2#; 1'. 1*. D @ [x;
x8 C8 D );
1. ! 2. ! nome" exemplo2(.c $. ! descri%o" =peradores bit bin;rios '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int x@18C@18D@1; 1#. 11. x @ 1 << 1; 12. C @ 1# \ $; 1$. D @ 1# ] $; 1'. 1*. printf(2x@:i8 C@:i e D@:i3n48 x8 C8 D); 1+. printf(2^x@:i3n48^x); 1(. 1). ret-rn #; 10.5
e1emplo26.
1. ! 2. ! nome" exemplo2).c $. ! descri%o" =peradores de atrib-i%o '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int x@#8C@#8D@1#; 1#. 11. x @ 1; 12. CW@ xW1; 1$. D:@C; 1'. 1*. printf(2x@:i8 C@:i e D@:i3n48 x8 C8 D ); 1+. 1(. ret-rn #; 1).5
1. ! 2. ! nome" exemplo$#.c $. ! descri%o" =peradores relacionais bin;rios '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int x@18C@$8D@*; 1#. 11. x @ x>C M x " C; 12. D @ [D M 1# " DW1#; 1$. 1'. printf(2x@:i8C@:i e D@:i 3n48 x8 C8 D ); 1*. 1+. ret-rn #; 1(.5
3.7.10
Operador de converso.
Podemos usar o operador de converso para alterar o tipo da varivel e do literal. ( tipo ) 9alor Pomos usar essa converso para poder usar o / com variveis int. int x@18C@2; float D@(float)x C; D@x (float)D; D@(float)x (float)D;
3.9 Exerccios
1. Complete ou corrija os cdigos abaixo: &digo N 1.,incl-de <stdio..> 2.int main() $./ '. int 9etor @ / 1828$8'8* 5; *. float precos[2]@ /1.00 2.00 10.00 100.005 +. c.ar string[1*]@4Yntrod-%o ao &4; (. str-ct data / dia8 mes8 ano 5 @ /.dia@2#8 .mes@28 .ano@2#1'5; ). cores / 9erde8 9ermel.o8 aD-l 5; 0. ret-rn #; 1#.5 &digo 1 1.,incl-de <stdio..> 2.int main() $./ '. float a@1.#8b@1#.#8c@1##.#8d@1###.#; *. float media @ a W b W c W d '.#; +. int T @ ' 1 a W 1 b W 1 c W 1 d; (. int aGmaiorGb @ a b; ). int bGmaiorGc @ b c; 0. int aGmaiorGc @ aGmaiorGb bGmaiorGc; 1#. int 9alorGmaiorGab @ aGmaiorGb M b " a; 11. ret-rn #; 12.5 2. Calcule: ( Pode usar um programa em C ) a) =s 9alores de x8C8D int x@18C@$; float D@*8H@(;
x@HWC 2; D@xWD 2; b) =s 9alores de x8C8D8a8b int x@18C@$; int a@xWW; int b@WWx; CW@a; x6@bWW; int D@x666x; c) =s 9alores de x8C8D8a8b int x@18C@$; int a@x>CMx"C; int b@[xMx"^x; x@aMa"bWbMb"1;
3. Crie um arquivo lab02.c declarando: a) Uma string nome_curso b) Dois vetores data_inicio e data_fim ( dia/mes/ano ) c) enumeracao curso = curso_c, curso_mpi, curso_openmp d) Imprima ( altere o %x de acordo com o tipo da varivel): "Nome do curso = %x" "Data de inicio %x/%x/%x" "Data final %x/%x/%x" "Curso %x"
4. Faca uma copia do lab02.c para lab02e.c a) Declare uma struct tregistro com Uma string nome_curso Dois vetores data_inicio e data_fim uma enumerao curso = curso_c, curso_mpi, curso_openmp Declare uma varivel registro do tipo tregistro e inicialize os valores.
b) Imprima usando varivel registro: "Nome do curso = %x" "Data de inicio %x/%x/%x"
5. Faca uma copia do lab02.c para lab02t.c a) Declare typedef para Uma string tnome_curso vetor tdata para ser usado como data ( dia/mes/ano). enumeracao tcurso = curso_c, curso_mpi, curso_openmp typedef struct tregistro com os typedef anteriores Uma varivel registro do tipo tregistro e inicialize ela.
b) Imprima usando registro "Nome do curso = %x" "Data de inicio %x/%x/%x" "Data de final %x/%x/%x" "Curso %x"
4 Aula 3
4.1 Blocos
Em C criamos blocos com os caracteres { e } que agrupam logicamente um conjunto de comandos seja para formar um bloco de uma funo ou at um bloco annimo. Blocos tambm delimitam o escopo.
e1emplo31.
1. ! 2. ! nome" exemplo$1.c $. ! descri%o" 1locos em & '. ! data" #+ 11 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. 1#. printf(21om dia3n4); 11. 12. / 1$. printf(2Eentro do bloco3n4); 1'. 5 1*. 1+. ret-rn #; 1(.5
4.2 Escopo
Se lembrarmos que identificador pode ser um objeto, uma funo, uma tag, membro de estrutura, membro de unio, ou enumerao, um nome typedef, um nome de label. O escopo define o limite aonde um identificador pode ser visto, ou seja, ser usado. Podemos ter escopo de arquivo, bloco, funo e declarao de funo. Como podemos declarar objetos em qualquer parte do programa, podemos identificar se dois objetos esto no mesmo escopo quando eles terminam no mesmo ponto. O nome do identificador tem que ser nico no mesmo escopo. Se for de escopos diferentes, a declarao do escopo interno esconde a declarao do escopo externa.
e1emplo32.
1. ! 2. ! nome" exemplo$2.c $. ! descri%o" Escopo em & '. ! data" #+ 11 2#12 *. ! +. (.int 9arGa@1#; ). 0.,incl-de <stdio..> 1#.int main() 11./ 12. int x@1;
1$. 1'. 1*. 1+. 1(. 1). 10. 2#. 21. 22. 2$. 2'. 2*. 2+. 2(. 2).5
c.ar x@AaA; esse _ sobrepQe a declara%o anterior / int x@2#; int 9arGb@2#; printf(2Eentro do bloco interno :d3n48x); printf(29arGa@:d89arGb@:d3n489arGa89arGb); 5 printf(2Eentro do bloco :c3n48x);
int x@1##; no mesmo escopo printf(29arGa@:d3n489arGa); printf(29arGb@:d3n489arGb); printf(2`ora do escopo :d3n48 x); ret-rn #;
4.3.1 Instruo if
A instruo if avalia a condio, caso seja verdadeira, ele executa o comando/bloco se no, o comando/bloco ignorado. A instruo if tem os formatos: if( condi%o ) comando; if( condi%o ) / bloco do if 5 O comando if avalia se condio verdadeira, isso o resultado diferente de zero. Se sim executado o comando ou o bloco do if. A condio pode ser um literal, uma varivel ou uma expresso. Podemos usar o if em conjunto com o eles que seria o comando/bloco executado caso o teste seja falso. if( condi%o ) comando; else comando; if( condi%o ) / bloco do if 5 else / bloco do else 5
podemos tambm combinar os dois if( condi%o ) comando; else / bloco do else 5 oif( condi%o ) / bloco do if 5 else comando else; Um exemplo completo seria:
e1emplo33.
1. ! 2. ! nome" exemplo$$.c $. ! descri%o" if '. ! data" #+ 11 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int x@18C@$; 1#. if( x > C ) 11. / 12. printf(2x maior L-e C3n4); 1$. 5 1'. else if( x < C ) 1*. / 1+. printf(2x menor L-e C3n4); 1(. 5 1). else 10. / 2#. printf(2x no ig-al a C3n4); 21. 5 22. 2$. if( x @@ C ); 2'. printf(2<orL-e essa lin.a impressaM3n4); 2*. 2+. ret-rn #; 2(.5 O comando if pode conter internamente outro if que chamamos if alinhados. Quando temos ifs alinhado o indicado usar sempre blocos para no confundir qual if faz referencia com qual else.
1. ! 2. ! nome" exemplo$'.c $. ! descri%o" sHitc. '. ! data" #+ 11 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int x@$; 1#. sHitc.( x ) 11. / 12. case 1" printf(2x@13n4); breaF; 1$. case 2" printf(2x@23n4); 1'. case $" printf(2x@$3n4); breaF; 1*. defa-lt" printf(2o 9alor x@ diferente de todos os cases3n4); 1+. 5 1(. ret-rn #; 1).5 Para teste, retire os comandos break do exemplo anterior e defina o x como 2. Compile, execute e verifique o que impresso.
Um erro comum usar uma instruo de interao que nunca chega a condio de parada e fica executado sem parar. Isso chamado de loop infinito.
1. ! 2. ! nome" exemplo$*.c $. ! descri%o" H.ile '. ! data" #+ 11 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int cont@1; 1#. 11. H.ile( cont <@1# ) 12. / 1$. printf(2&1 cont@:d3n48cont); 1'. contWW; 1*. 5 1+. 1(. H.ile( cont66 ) 1). printf(2&2 cont@:d3n48cont); 10. 2#. H.ile( contWW <@1# ); 21. printf(2&$ cont@:d3n48cont); 22. ret-rn #; 2$.5 No exemplo anterior o primeiro while exibiu quais valores para cont e o segundo while? Qual seria a diferena no segundo while se usarmos --cont ou cont--? Teria alguma diferena?
1. ! 2. ! nome" exemplo$+.c $. ! descri%o" do '. ! data" #+ 11 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int cont@1; 1#. 11. do 12. / 1$. printf(2&1 cont@:d3n48cont); 1'. contWW; 1*. 5 1+. H.ile( cont <@1# ); 1(. 1). do 10. printf(2&2 cont@:d3n48cont); 2#. H.ile( cont66 ); 21. 22. ret-rn #; 2$.5 No exemplo anterior o primeiro do/while exibiu quais valores para cont e o segundo do/while? Qual seria a diferena no segundo do/while se usarmos --cont ou cont--? Teria alguma diferena?
1. ! 2. ! nome" exemplo$(.c $. ! descri%o" for '. ! data" #+ 11 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int cont; 1#. 11. for( cont@1 ; cont<@1# ; contWW) 12. printf(2&1 cont@:d3n48cont); 1$. 1'. for( ; cont >@# ; cont66 ) 1*. / 1+. printf(2&2 cont@:d3n48cont); 1(. 5 1). 10. for( ; cont<@1# ; ) 2#. printf(2&$ cont@:d3n48contWW); 21. 22. for( int o-tro@1 ; o-tro<@1# ; o-troWW ) 2$. printf(2&' o-tro@:d3n48o-troWW); 2'. 2*. for( int o-tro@1#8cont@1 ; o-tro>@# \\ cont<@1# ; o-tro668contWW ) 2+. printf(2&* cont@:d e o-tro@:d3n48cont8 o-tro); 2(. 2). ret-rn #; 20.5
Compilando esse programa com -Wall tem o alerta declaration hides variable cont. Que isso quer dizer?
1. ! 2. ! nome" exemplo$).c $. ! descri%o" H.ile e do H.ile '. ! data" #+ 11 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int cont@1; 1#. H.ile( contWW <@1# ) 11. / 12. if( cont@@$ ) contin-e; 1$. if( cont@@* ) breaF; 1'. printf(2&1 cont@:d3n48cont); 1*. 5 1+. 1(. do 1). / 10. if( cont@@$ ) contin-e; 2#. if( cont@@* ) breaF; 21. printf(2&2 cont@:d3n48cont); 22. 5 H.ile( cont66 >@ # ); 2$. 2'. for( cont@1 ; cont <@ 1# ; contWW) 2*. / 2+. if( cont@@$ ) contin-e; 2(. if( cont@@* ) breaF; 2). printf(2&$ cont@:d3n48cont); 20. 5; $#. ret-rn #; $1.5
1. ! 2. ! nome" exemplo$0.c $. ! descri%o" goto '. ! data" #+ 11 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int cont@#; 1#. 11. inicio" 12. 1$. printf(>cont1@:d3n>8WWcont); 1'. 1*. if( cont<@1# ) goto inicio; 1+. else goto fim; 1(. 1). printf(2Sexto final3n4); 10. 2#. fim" 21. 22. ret-rn #; 2$.5 No exemplo acima o Texto final exibido? Por qu?
4.6 Funes
Funes so estruturas que permite que o programa seja desenvolvido em blocos funcionais. A funo em C como funes em matemtica, recebe parmetros e gera um valor de resultado. No C os parmetros e o resultado so tipados. Exemplo40.c 1. ! 2. ! nome" exemplo'#.c $. ! descri%o" f-n%Qes '. ! data" #+ 11 2#12 *. ! +.,incl-de <stdio..> (.int inc(int x) )./ 0. xWW; 1#. ret-rn x; 11.5 12.int dec(int x) 1$./ 1'. x66; 1*. ret-rn x; 1+.5
1(. 1).int main() 10./ 2#. 21. int 9ar@#; 22. printf(>inc(9ar)@:d3n>8inc(9ar)); 2$. printf(>dec(9ar)@:d3n>8dec(9ar)); 2'. 2*. 9ar@inc(9ar); 2+. 2(. printf(>inc(9ar)@:d3n>8inc(9ar)); 2). printf(>dec(9ar)@:d3n>8dec(9ar)); 20. $#. ret-rn #; $1.5
4.6.1 Declarao
A declarao da funo opcional mas uma funo somente pode ser chamada depois de ser declarada ou de ser definida. Se uma funo precisa chamar outra funo, essa outra funo deve estar definida ou declarada anteriormente. Normalmente colocamos as declaraes em arquivos header (.h) e inclumos ela no nosso cdigo fonte. Nesse caso no precisaramos nos preocupar com a ordem de definio e ordem das chamadas de funes. A declarao tem o formato: tipo nome`-ncao ( par1 8 par2 8 ... 8 parn ); O tipo pode ser qualquer um. Se a funo no for retornar valores, podemos indicar com void. O nome da funo tem que ser nico no escopo. Os parmetros podem ser declaraes completas ou pode ser somente o tipo. Se a funo no recebe parmetros podemos deixar os parentes vazio () ou indicar com (void) Um exemplo seria: exemplo41.h 1. ! 2. ! nome" exemplo'1.. $. ! descri%o" declara%o de f-n%Qes '. ! data" #+ 11 2#12 *. ! +.9oid inc(int x); (.9oid dec(int ); ).int s-m(int x8 int C); 0.int s-b(int8 int); O tipo void quer dizer que a funo no tem retorno. O C11 define tambm _Noreturn para indicar uma funo que no retorna valor. _Noreturn no foi implementado em todos os compiladores.
4.6.2 Definio
A definio da funo a funo com o seu bloco de comandos. tipo nome`-ncao ( par1 8 par2 8 ... 8 parn ) / bloco da f-n%o 5 Os parmetros agora tem que estar completamente declarados com o nome e tipo. Esses parmetros criam identificadores que esto no escopo de declarao de funo. Essas variveis somente so visveis dentro da funo. Um exemplo seria: exemplo42.c 1. ! 2. ! nome" exemplo'2.c $. ! descri%o" declara%o de f-n%Qes '. ! data" 1# #' 2#1$ *. ! +.9oid inc(int x) (./ ). xWW; 0.5 1#.9oid dec(int x) 11./ 12. x66; 1$.5 1'.int s-m(int x8 int C) 1*./ 1+. ret-rn x W C; 1(.5 1).int s-b(int x8 int C) 10./ 2#. ret-rn x a C; 21.5
4.6.3 Utilizao
Para usar uma funo basta chamar ela com os parmetros. Exemplo43.c 1.,incl-de <stdio..> 2.,incl-de 2exemplo'1..4 $. incl-ir o conteJdo do arL-i9o exemplo'2.c aL-i pode isar o incl-de '.int main() *./ +. int x@18C@$; (. inc(x); ). dec(C); 0. printf(2x@:d8 C@:d3n48x8C); 1#. x@s-m(x8C);
Quais os valores de x e y depois de chamada as funes inc e dec? Foi alterado os valores de x e y? Na chamada da funo o que passado o valor dela. Isso quer dizer se alteramos dentro da funo o valor de uma varivel, estamos alterando o valor da varivel que est no escopo da funo e no a varivel usada na chamada da funo. No C podemos usar ponteiros para poder criar funes que alteram as variveis passadas.
4.7 Exerccios
1. Crie os arquivo lab03.h ( declaraes somente) e lab03.c ( definies e a funo main ) contendo: a) Uma funo int parImpar ( int num ) que imprimi se num par o impar. A funo tambm retorna 0 para par e 1 para impar. ( x % 2 = 0 par e x % 2 = 1 impar ) O numero %x par ou O numero %x impar b) Uma funo somatorio ( int num ) usando o comando while para retornar o somatrio de num ( num(1) = 1, num(2)=2+1, num(3)=3+2+1. A funo retorna o somatrio e tambm imprime: Somatorio de %x = %res c) Uma funo fatorial usando o comando for ( fatorial de 1!=1, 2!=2*1, 3!=3*2*1). A funo retorna o fatorial e tambm imprime: %x! = %x d) Uma funo saltoPara ( inicio, fim, salta, para ) que executa um loop for com inicio e fim, se o contador for igual a salta executar o continue e se for para executar o break. Se no for salta ou para imprima o contador. e) Uma funo imprima_cor Defina um typedef no header: typedef enum { verde, vermelho, azul } tcores; Uma funo int imprima_cor( tcores var ) Na funo implemente um switch com case cor: printf(texto cor\n); break default: printf(cor nao cadastrada\n); break; f) Na funo main faa pelo menos uma chamada de funo para cada funo do laboratrio.
5 Aula 4
5.1 Gerenciamento de memria
A linguagem C como as linguagens de programao de alto nvel gerenciam automaticamente a utilizao de memria nos programas. O C quando declaramos um objeto ele reserva memria suficiente e quando esse objeto sai do escopo atual, o C desaloca essa memria. O C permite tambm o gerenciamento de memria pelo programador. Esse gerenciamento de memria que veremos agora.
1. ! 2. ! nome" exemplo''.c $. ! descri%o" ponteiros '. ! data" #+ 11 2#12 *. ! +.,incl-de <stdio..> (.int main() )./ 0. int x@18C@$; 1#. int !px@\C8 !pC@\C;
!px@!pxW!pC; printf(2x@:d8 C@:d3n48 x8 C); printf(2!px@:d8 !pC@:d3n48 !px8 !pC); printf(2px@:p8 pC@:p3n48 px8 pC); printf(2\x@:p8 \C@:p3n48 \x8 \C); ret-rn #;
01emplo4%.
1.,incl-de <stdio..> 2.,incl-de <stdlib..> $.int main() './ *. int !px8!pC; +. int x@18C@$; (. ). px@malloc(siDeof(int)); 0. pC@malloc(siDeof(int)); 1#. 11. !px@1#; 12. !pC@$#; 1$. !px@!pxW!pC; 1'. 1*. printf(>x@:d8 C@:d3n>8 x8 C); 1+. printf(>!px@:d8 !pC@:d3n>8 !px8 !pC); 1(. printf(>px@:p8 pC@:p3n>8 px8 pC); 1). printf(>\x@:p8 \C@:p3n>8 \x8 \C); 10. 2#. free(px); 21. free(pC); 22. 2$. printf(>Eepois de free()3n>); 2'. printf(>px@:p8 pC@:p3n>8 px8 pC); 2*. px@pC@IK??; 2+. printf(>px@:p8 pC@:p3n>8 px8 pC); 2(. 2). free(px); 20. free(pC); $#. $1. ret-rn #; $2.5
1.,incl-de <stdio..> 2.,incl-de <stdlib..> $.int main() './ *. int !parraC; +. parraC@(int!)calloc(1#8siDeof(int)); (. int !o-troarraC@(int!)calloc(1#8siDeof(int)); ). 0. parraC[#]@1;
1#. 11. 12. 1$. 1'. 1*. 1+. 1(. 1). 10. 2#. 21. 22. 2$. 2'. 2*. 2+. 2(. 2).5
parraC[0]@1#; printf(>:d printf(>:d printf(>:d printf(>:d :p3n>8 :p3n>8 :p3n>8 :p3n>8 parraC[#]8 \parraC[#]); parraC[0]8 \parraC[0]); !(parraC)8 parraC); !(parraCW0)8 (parraCW0));
parraC@realloc(parraC8siDeof(int)!2#); parraC[10]@1##; printf(>:d :p3n>8 parraC[#]8 \parraC[#]); printf(>:d :p3n>8 parraC[10]8 \parraC[10]); printf(>:d :p3n>8 !(parraCW10)8 (parraCW10)); free(parraC);parraC@IK??; free(o-troarraC);o-troarraC@IK??; ret-rn #;
1. ! 2. ! nome" exemplo'(.c $. ! descri%o" <onteiros para strings '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (.,incl-de <stdlib..> ).int main() 0./ 1#. c.ar !nome@(c.ar!)malloc(siDeof(c.ar)!2#); 11. nome[#]@A&A; 12. nome[1]@AaA; 1$. nome[2]@ArA; 1'. nome[$]@AlA; 1*. nome[']@AoA; 1+. nome[*]@AsA; 1(. nome[+]@A3#A; 1). printf(>Iome :s ( letra inicial :c )(::p :p)3n>8 nome8 nome[#]8 nome); 10. free(nome); nome@IK??; 2#. ret-rn #; 21.5 Porque no printf quando passamos ponteiro para int usamos *ponteiro e agora para string usamos apenas ponteiro?
1. ! 2. ! nome" exemplo').c $. ! descri%o" Eeclara%o de str-ct '. ! data" 1# #' 2#1$ *. ! +.,incl-de <stdio..> (.int main() )./ 0. str-ct data 1#. / 11. int dia8mes8ano; 12. 5 dia @ /.dia@1(8 .mes@1#8 .ano@2#125; 1$. 1'. str-ct data !pdia@\dia; 1*. 1+. printf(>Eata de .oVe :d :d :d3n>8 pdia6>dia8 (!pdia).mes8 dia.ano); 1(. 1). ret-rn #; 10.5 Porque no podemos usar *ponteiro.item ?
1. ! 2. ! nome" exemplo'0.c $. ! descri%o" ponteiro para str-ct '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (. ).int som(int x8 int C) 0./ 1#. ret-rn x W C; 11.5 12.
1$.int main() 1'./ 1*. int (!psom)(int8int)@\som; 1+. printf(>f-ncao psom end@:p res-ltado@:d3n>8psom8psom(182)); 1(. printf(>f-ncao printf end@:p 3n>8printf); 1). ret-rn #; 10.5
operacionais, quando o programa termina, ele desalocada toda memria alocada para o programa mas como o C tambm portado para plataformas com sistema operacional simplificado ou at mesmo sem sistema operacional, ficou sendo uma pratica de boa programao desalocar toda memria alocada no prprio programa.
5.3.1 Extern
Classifica os objetos com armazenamento externo. Se for uma varivel, ela far referencia a uma outra varivel declarada em um arquivo header ou em outro programa. Se for uma funo, como toda as funes j tem o escopo extern, isso seria redundante. exemplo51.c 1. ! 2. ! nome" exemplo*1.c $. ! descri%o" '. ! data" #+ 11 2#12 *. ! +.int 9aria9el@21; exemplo52.c 1. ! 2. ! nome" exemplo*2.c $. ! descri%o" '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (. ).extern int 9aria9el; 0.int main()/ 1#. printf(>9aria9el externa@:d3n>89aria9el); 11. ret-rn #; 12.5
Para compilar: ,icc 67all 6c exemplo*1.c ,icc 67all 6c exemplo*2.c ,icc 67all exemplo*1.o exemplo*2.o 6o exemplo*1e*2 ,. exemplo*1e*2
5.3.2 Static
Uma varivel declarada como static no escopo de funo e no escopo global. No escopo de funo a varivel inicializada somente uma vez e esse armazenamento dura toda a execuo do programa mesmo que o escopo dela esteja limitado. O valor dela tambm conservado. exemplo53.c 1. ! 2. ! nome" exemplo*$.c $. ! descri%o" '. ! data" #$ 1# 2#12 *. ! +.,incl-de <stdio..> (. ).int conta() 0./ 1#. static int 9ar@1; 11. ret-rn 9arWW; 12.5 1$. 1'.int main() 1*./ 1+. printf(>&onta@:d3n>8conta()); 1(. printf(>&onta@:d3n>8conta()); 1). printf(>&onta@:d3n>8conta()); 10. ret-rn #; 2#.5 No escopo global, essa varivel ficaria como escopo interno e no poderia declarar uma outra varivel como extern. arquivo1.c static int 9ar@1$; arquivo2.c extern int 9ar;
isso no f-ncionaria
5.3.3 Const
O qualificador const especifica que o objeto no poder ser alterado depois da declarao. const int 9ar@1#; 9ara@2#; erro
Quando trabalhamos com ponteiros, podemos ter ponteiros para contantes , ponteiros contantes para varivel e ponteiros constantes para contantes. ponteiro para constante const int !ptrGtoGconstant@\9ar; !ptrGtoGconstant@1##; erro ptrGtoGconstant@\o-tro9ar; =X ponteiro contante para 9aria9el int !const constantGptr@\9ar; !constantGptr@1##; =X constantGptr@\o-tro9ar; erro ponteiro constante para constante const int ! const constGptrGtoGconst@\9ar; !constGptrGtoGconst@1##; erro constGptrGtoGconst@\o-tro9ar; erro
5.4 Exerccios
1. Crie o arquivo lab04.c na funo main declare e inicialize a) Variveis: int num=10; int data[3]={19,4,2013}; char hello=Hello; struct sponto { int x,y,z } ponto = { 10 , 20 , 30 };
b) Ponteiros e inicialize apontando para as variveis criadas anteriormente. *pnum ponteiro para num *pdata ponteiro para data *phello ponteiro para hello *pponto ponteiro para ponto
c) Imprima essas mensagens usando os ponteiros: num=%d \n data=%d \n hello=%s \n ponto.x=%d, ponto.y=%d, ponto.z=%d \n
b) variveis ponteiros e utilize malloc ou calloc para alocar memria *pnum do tipo ponteiro para int *pdata do tipo ponteiro para vetor int *phello do tipo ponteiro para char *pponto do tipo ponteiro para struct ponto
c) Imprima essas mensagens usando os ponteiros: num=%d \n data=%d \n hello=%s \n ponto.x=%d, ponto.y=%d, ponto.z=%d \n
3. Crie o lab04s.c com uma funo acumulador( init num ). Use uma varivel static. A funo imprime acumulou %d\n. 4. Crie: a) lab04e.h com definio de acumulador( init num ); b) lab04e.c com include de lab04e.h e o corpo da funo acumulador( init num ){} c) lab04i.c com include de lab04e.h. Na funo main realize chamadas para acumulador d) compile e gere lab04e.o e lab04i.o. Depois gere o lab04e executvel.
6 Aula 5
6.1 Biblioteca padro C
A biblioteca padro C ou C standard library a biblioteca padro definido pela ISO para que todo compilador C deve fornecer. A biblioteca padro C fornece macros, definio de tipos e funes para lidar com strings, computao matemtica, processamento de entrada/sada, alocao de memria e muitas outras funes para os servios do sistema operacional. J vimos o comando printf e a parte de alocao de memria, agora iremos ver sobre processamento de entrada e sada.
6.2.1 Arquivos
O C define o tipo FILE para tratar arquivos. Para trabalhar com arquivos precisamos, declarar uma varivel FILE, abrir o arquivo, escrever ou ler, fechar o arquivo. Para declarar uma varivel FILE: `Y?E !arL-i9o; Para abri o arquivo usamos: arL-i9o @ fopen(2arL-i9o48 modo); arquivo o nome do arquivo modo o modo de abertura do arquivo
Modo r 9 a 4 Ar uivo existente A4rir para leitura A res enta final. 8in(rio Ar uivo inexistente erro
6.2.2.1
A bliblioteca padro C define vrias funes para tratar sada formatada, iremos tratar da printf e da fprintf. A funo fptintf tem o formato: fprintf( arL-i9o 8 2formato48 9ar18 9ar28 9arn); O arquivo pode ser um que declaramos e abrimos anteriormente ou pode ser um que o C define como : stdout ou stderr. A funo printf no tem a opo arquivo mas ela abre o stdout: printf(2formato48 9ar18 9ar28 9arn); fprintf( stdo-t 8 2formato48 9ar18 9ar28 9arn);
6.2.2.2
A biblioteca padro C define vrias funes para tratar entrada formatada, iremos tratar da scanf e da fscanf. A funo fscanf tem o formato: fscanf( arL-i9o8 2formato48 \9ar18 \9ar28 \9arn); A funo scanf no tem a opo arquivo mas ela abre o stdin scanf(2formato48 \9ar18 \9ar28 \9arn); fscanf( stdin8 2formato48 \9ar18 \9ar28 \9arn);
6.2.3.1
Para detectar o final de arquivo: int feof( arL-i9o ); feof retorna verdadeiro para final de arquivo, caso contrrio retorna falso. Para detectar erro na leitura/escrita: int ferror(arL-i9o); ferror retorna zero quando no h erro, caso retorne um nmero, esse nmero o cdigo do erro. Para exibir uma mensagem padro de erro ( sada em stderr): 9oid perror(2texto4); Para traduzir o ero numrico para texto: c.ar !strerror (errorn-m); Para verificar o comando fopen. `Y?E !fp; fp@fopen(2arL-i9o.txt484modo4); if( fp @@ IK?? ) / printf( 2Erro no fopen() codigo :d 6 :s3n48 errno, strerror(errno)) ! e"se # //$"o%o &r'(i)o *+ ! ,&r& )erifi%&r erro n& f(n-.o /rintf e n& f(n-.o fs%&nf f/rintf(f/,0%s0,01e2to3n0) if( errno ) /error(04rro %o5 & f(n%&o f/tintf0) fs%&nf(f/,0%s0,&)&r) if( errno ) /error(04rro %o5 & f(n%&o fs%&nf0) 65 e2e5/"o %o5/"eto seri&:exemplo54.c 1./* 2. * no5e: e2e5/"o78.% $. * 9es%ri-.o: '. * 9&t&: :;/;8/<;:= *. */ +.>in%"(9e <st9io.?> (.>in%"(9e <st9"i$.?> ).>in%"(9e <errno.?> 0.int 5&in() 1#.# 11. @AB4 *f/
12. 1$. 1'. 1*. 1+. 1(. 1). 10. 2#. 21. 22. 2$. 2'. 2*. 2+.
f/=fo/en(0e2e5/"o78.t2t0,0C0) if( f/ == D6BB ) # /error(04rro %o5 & f(n%&o fo/en0) ! e"se # for( int %=: %<=:; %++ ) # f/rintf(f/,0%9 0, %) if( errno ) /error(04rro %o5 & f(n%&o f/tintf0) ! f/rintf(f/,03n0) ! f%"ose(f/) ret(rn ; !
1./* 2. * no5e: e2e5/"o77.% $. * 9es%ri-.o: '. * 9&t&: :;/;8/<;:= *. */ +.>in%"(9e <st9io.?> (.>in%"(9e <st9"i$.?> ).>in%"(9e <errno.?> 0.int 5&in() 1#.# 11. @AB4 *f/ 12. f/=fo/en(0e2e5/"o78.t2t0,0r0) 1$. int n(5 1'. if( f/ == D6BB ) 1*. # 1+. /error(04rro %o5 & f(n%&o fo/en0) 1(. ! 1). e"se 10. # 2#. C?i"e ( fs%&nf(f/,0%90, &n(5) != 4*@ ) 21. # 22. if( errno ) 2$. /error(04rro %o5 & f(n%&o fs%&nf0) 2'. e"se 2*. f/rintf(st9o(t,0D(5ero %93n0,n(5) 2+. ! 2(. ! 2). f%"ose(f/) 20. ret(rn ; $#.!
6.3 Exerccios
1. Crie os arquivos lab05w.c e lab05r.c a) O lab05w.c faa um loop for de 1 a 20 e grave o valor do ndice no arquivo lab05.txt b) O lab05r.c faa um loop while lendo do arquivo os nmeros, teste fim de arquivo. c) Nesses exemplos utilize o tratamento de erro. 2. Crie o arquivo lab05wp.c que abre o arquivo que recebe como parmetro na linha de comando e acrescente no final do arquivo lab05.txt. Converter os parmetros para inteiro antes de gravar. 3. A biblioteca C padro fornece muitas funes interessantes que no poderia abordar aqui no curso mas se olhar na documentao dessas funes, poder com facilidade utilizar ela em algum programa. No Linux padro essas funes so documentadas com o man. a) Verifique a documentao de duas funes matemticas pow e sqrt. Se tiver dificuldade no ingls, converse com o instrutor. man pow man sqrt
b) Escolha uma das funes e escreva o programa lab05rf.c como cpia do lab05r.c e a cada nmero lido imprima pow(%d) = %f ou sqrt(%d)=%f. c) De acordo com a documentao, precisa colocar um header a mais e uma linha a mais na compilao (link).
7 L&teri&" 42tr&
4sse %(rso te)e %o5o referen%i& o /&9r.o %o5o (5 %(rso intro9(tMrio. * /&9r&o N:: &/resent& o(tros re%(rsos %o5o t?re&9s, (sso 9e estr(t(r&s EenIri%&s, entre o(tros. ?tt/://CCC.o/en-st9.orE/Ot%:/s%<</CE:8/CCC/9o%s/n:7P;./9f Q 5&iori& 9&s f(n-Hes 9& $i$"iote%& /&9r.o /er5ite5 /roEr&5&r %M9iEos inseE(ros, isso e, /o9e5 sofrer &t&'(e 9e seE(r&n-& %o5o $(ffer o)erf"oC. ,ens&r e5 seE(r&n-& e essen%i&". ,o9e %o5e-&r %o5 esse 5&teri&" ?tt/s://CCC.se%(re%o9inE.%ert.orE/%onf"(en%e/9is/"&R/se%%o9e/N4S1+N+Te%( re+No9inE+Tt&n9&r9 U()i9&s fre'(entes: ?tt/://%-f&'.%o5/