Sie sind auf Seite 1von 156

8/5/2014 Programar em C/Imprimir - Wikilivros

http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 1/156
ProgramaremC/Imprimir
Origem:Wikilivros,livrosabertosporummundoaberto.
<ProgramaremC
ndice
1PorqueaprenderalinguagemC
2HistriadaLinguagemC
2.1Histria
2.1.1Desenvolvimentosiniciais
2.1.2CdeK&R
2.1.3OsPadresCANSIeCISO
2.1.4C99
2.1.5Resumoemingls
3Prrequisitos
3.1Editor
3.2Compilador
3.3Ligadoroulinker
3.4Obtendoumcompilador
3.4.1ParaWindowsouDOS
3.4.2ParaLinux/Unixlike
3.5Linksexternos
4Utilizandoumcompilador
4.1Compiladores:visogeral
4.2gcc
4.3VisualC++
5Noesdecompilao
5.1Compilao
5.2Etapasdacompilao
6UmprogramaemC
6.1UmprogramaemC
6.2Compilandooprograma
6.2.1Linux
7Conceitosbsicos
7.1Estruturabsica
7.1.1Escopo
7.2Introduosfunes
7.3Expresses
7.4Comentrios
8Variveis
8.1Variveis
8.2Declarandovariveis
8.3Atribuindovalores
8.4Exemplodeerro
8.5Nomesdevariveis
9Entradaesadasimples
9.1Entradaesadasimples
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 2/156
9.2puts()eputchar()
9.3printf()
9.3.1Especificaesdeformato
9.3.1.1Opes
9.3.1.2Larguradocampo
9.3.1.3Preciso
9.3.1.4Tamanhodavarivel
9.3.2Sequnciasdeescape
9.3.2.1Representaooctalehexadecimal
9.4scanf()
9.4.1Valorderetorno
9.5gets()egetchar()
9.6sprintf()esscanf()
10Operaesmatemticas(Bsico)
10.1Operaesmatemticas
10.1.1Abreviaes
11Operaesmatemticas(Avanado)
11.1FunesTrigonomtricas
11.1.1Asfunesacoseasin
11.1.2Asfunesataneatan2
11.1.3Asfunescos,sinetan
11.2FunesHiperblicas
11.3FunesExponencialeLogaritmo
11.3.1Afunoexp
11.3.2Asfunesfrexp,ldexpemodf
11.3.3Asfuneslogelog10
11.4Funespowesqrt
11.4.1Asfunespow
11.4.2Asfunessqrt
11.5FunesdeArredondamentoparaNmerosInteiros,ValoresAbsolutoseRestoda
Diviso
11.5.1Asfunesceilefloor
11.5.2Asfunesfabs
11.5.3Asfunesfmod
11.6Ligaesexternas
12Controledefluxo
12.1Controledefluxo
12.2Expressesdecondio
12.3Testes
12.3.1if
12.3.2switch
12.3.3Operadorternrio"?:"
12.4Loops
12.4.1while
12.4.1.1Loopsinfinitos
12.4.2do...while
12.4.3for
12.4.4breakecontinue
12.5Saltosincondicionais:goto
12.6Terminandooprograma
13Funes
13.1Oquefuno
13.2Definindoumafuno
13.2.1Valorderetorno
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 3/156
13.2.2Parmetros
13.2.3Chamadasdefunes
13.3Doisexemplos
13.4ProttipoouDeclaraodefuno
13.5Variveislocaisversusglobais
13.6Passagemdeparmetrosporvaloreporreferncia
13.7void
13.8Recursividade
13.9inline
14Prprocessador
14.1Oprprocessador
14.2Diretivasdecompilao
14.2.1#include
14.2.2#define
14.2.3#undef
14.2.4#ifdefe#ifndef
14.2.5#if
14.2.6#else
14.2.7#elif
14.3Usoscomunsdasdiretivas
14.4Concatenao
15Bibliotecas
15.1Bibliotecas
15.2Oarquivocabealho
15.3Compilaodabiblioteca
15.3.1NoGCC
15.3.2NoMSVisualC++
15.4Compilaodoprograma
16Entradaesadaemarquivos
16.1Trabalhandocomarquivos
16.2Abrindoefechandoumarquivo
16.2.1Exemplo
16.2.2Arquivosprdefinidos
16.3Escrevendoemarquivos
16.3.1fwrite
16.3.2fputc
16.4Lendodearquivos
16.4.1fgetc
16.4.2fgets
16.4.3fscanf
16.4.4fscanf
16.4.5fread
16.5Movendopeloarquivo
16.5.1fseek
16.5.2rewind
16.5.3feof
16.6Outrasfunes
16.6.1ferroreperror
17ExercciosFinais
18Vetores
18.1Vetores
18.1.1Abreviandoasdeclaraes
18.1.2ExemplodeAplicaodeVetores
18.2Vetoresmultidimensionais(matrizes)
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 4/156
18.3Argumentosnafunomain
18.3.1Exemplodeusodeparmetrosnafunomain
19Strings
19.1Strings
19.2Funesdabibliotecapadro
19.2.1strlen
19.2.2strcpy
19.2.3strcat
19.2.4strcmp
19.2.5strrchr
19.2.6memcpy
19.2.7memset
19.2.8sprintf
20Ponteiros
20.1Bsico
20.1.1Oqueumponteiro?
20.1.2Declarandoeacessandoponteiros
20.1.3PonteiroeNULL
20.1.4Maisoperaescomponteiros
20.2Intermedirio
20.2.1Ponteirodeestrutura
20.2.2Ponteiroscomoparmetrosdefunes
20.2.3Ponteirosevetores
20.2.4Indexaoestranhadeponteiros
20.2.5Comparandoendereos
20.3Avanado
20.3.1Ponteirosparaponteiros
20.3.2Passandovetorescomoargumentosdefunes
20.3.3Ponteirosparafunes
21PassagemdeParametros
22Tiposdedadosdefinidospelousurio
22.1Tiposdedadosdefinidospelousurio
22.2Estruturas
22.2.1Definindootipo
22.2.2Declarando
22.2.3Inicializadordesignado
22.2.4Acessando
22.2.5Vetoresdeestruturas
22.2.6Atribuioecpia
22.2.7Passandoparafunes
22.3Unies
22.4Enumeraes
22.4.1Uso
22.5Campodebits
23Enumerao
23.1Enumerations(enum)
23.2Criandoumnovotipodedados
24Unio
24.1Unions
24.2Declarao
24.3Unionscomestruturas
24.4Anonymousunionsestruturascomunions
25Estruturas
25.1Structures
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 5/156
25.2Declararumaestrutura
25.3Matrizesdeestruturas
25.4Declararinstncias(objetos)daestrutura
25.5Acessarasvariveismembrodasestruturas
25.6Iniciarumaestrutura
25.7Ponteirosparaestruturas
25.8Passandoestruturascomoargumentodefunes
25.9Estruturasaninhadas
26Maissobrevariveis
26.1typedef
26.2sizeof
26.3Conversodetipos
26.3.1Casting:conversomanual
26.4Atributosdasvariveis
26.4.1const
26.4.2volatile
26.4.3extern
26.4.4static
26.4.5register
27Gerenciamentodememria
27.1Alocaodinmica
27.1.1mallocefree
27.1.2calloc
27.1.3realloc
27.1.4AlocaoDinmicadeVetores
27.1.5AlocaoDinmicadeMatrizes
28Sockets
28.1Abstraes
28.2Funesdabibliotecapadro
28.3Famliasdeendereo
28.4Estruturasdeendereo
29Makefiles
29.1Makefile
29.1.1Sintaxedecriaodoarquivo
29.1.1.1Regrascomplementares
29.1.1.2DefinirVariveis
29.1.1.3VariveisPersonalizadas
29.1.1.4Variveisinternas
29.1.1.5Asregrasdeinterferncia
29.1.1.6SubMakefiles
29.1.1.7Makeinstall
30Listadepalavrasreservadas
31Seqnciasdeescape
32Listadefunes
33Listadebibliotecas
33.1Ligaesexternas
34DicasdeprogramaoemC
34.1Convenestipogrficas
34.2Afunoprintfamelhoramigadeumprogramador
34.3Tecle1pararodar
35Listasencadeadas
35.1Primitivas
35.2Listaencadeadalinear
35.3Iniciarumalista
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 6/156
35.4Insero
35.4.1Inseronoincio
35.4.2Inseronofim
35.5Remoo
35.5.1Remoonoincio
35.5.2Remoonofim
35.6Exibio
35.6.1Dofimparaaraiz
35.6.2Daraizparaofim
36Pilha
36.1Pilha
36.2Construodoprottipodeumelementodalista.
36.3Inicializao
36.4Inserirumelementonapilha(push)
36.5Retirarumelementodapilha(pop)
36.6Imprimiroselementosdapilha
37rvoresbinrias
37.1Arvorebinria
37.2Struct
37.3Iniciar
37.4Insero
37.5Remoo
37.5.1Emordem
37.5.2Prordem
37.5.3Psordem
37.6Contarns
37.7Contarfolhas
37.8Alturadarvore
37.9EstruturaCompleta
38Algoritmosdeordenao
39Insertionsort
40Selectionsort
41Bubblesort
41.1CdigodaFuno
41.2CdigodaFunoMelhorado
42Algoritmodealocao
42.1firstfist
42.2bestfit
42.3worstfit
42.4NextFit
42.5BuddySystem
43Estudo
43.1Sumrio
43.1.1Introduo
43.1.2PARTEIBsico
43.1.3PARTEIIConceitosintermedirioseavanados
43.2Apndices
43.2.1Conceitosextras
43.2.2AlgoritmoseEstruturasdedados
43.3Colaborao
43.4Vertambm
44Constantes
44.1Constantes
44.2DEFINEDCONSTANTS(#DEFINE)
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 7/156
44.3Declaredconstants(const)
45Condicionais
46Listadeautores
46.1Listadeautores
47Capa
48Porqueaprenderalinguagemc
PorqueaprenderalinguagemC
Emumaeraondeosoftwareestcadavezmaispresentenonossodiaadiaimportanteteralgumasbases
deprogramao,paraissoimportanteterumbommaterialcomexplicaesclaraseexemplos,eolivro
ProgramaremCseprestabemaoexerccio.
MasporqueCenoJavaouBasic,ouaindaPerl?LinguagenscomooJavaouPerlsolinguagensabase
debytecodeinterpretadoporumamquinavirtualsendoassimnoumcdigointerpretadodiretamente
peloprocessador.Aocontrriodemuitaslinguagensdeprogramao,oCpermiteaoprogramador
enderearamemriademaneiramuitoparecidacomoseriafeitoemAssembly.LinguagenscomooJava
ouoPerlfornecemmecanismosquepermitemqueoprogramadorfaaoseutrabalhosemterquese
preocuparcomaatribuiodememriaoucomapontadores.Geralmenteissobom,umavezque
bastantetrabalhosolidarcomaalocaodememriaquandoescrevemosaplicaescomalgoritmosde
altonvel.Noentanto,quandolidamoscomtarefasdebaixonvelcomoaquelasqueumncleo(kernel)
temobrigaodedesempenhar,comoadecopiarumconjuntodebytesparaumaplacaderede,tornase
altamentenecessrioumacessodiretomemriaalgoquenopossvelfazercomJava.Cpodeser
diretamentecompiladoemcdigodemquina,eporissorpidoeeficiente.Almdisso,Cpermite
personalizarcomoimplementarcadacoisabsico,comoalocaodememria,permitindoadaptaespara
melhorardesempenho.
Valelembrarqueossoftwaresinterpretadoresdescriptoubytecode,comoJavaePython,soescritosem
linguagenscomoCeC++.
SerumasurpresaqueCsejaumalinguagemtopopular?
Comonumefeitodomin,aprximageraodeprogramassegueatendnciadosseusancestrais.
SistemasoperacionaisdesenvolvidosemCsempretmbibliotecasdesistemadesenvolvidasemC.Essas
bibliotecassousadasparacriarbibliotecasdeprograma(comoXlib,OpenGLouGTK),eseus
desenvolvedoresgeralmentedecidemusaramesmalinguagemdasbibliotecasdesistema.
Desenvolvedoresdeaplicaousambibliotecasdeprogramaparadesenvolverprocessadoresdetexto,
jogos,tocadoresdemdia,etc.Muitosvodecidirtrabalharcomamesmalinguagemqueabibliotecafoi
escrita,eassimoprocessocontinua...
Cumadaslinguagensdeprogramaomaispopularesparaseescreversistemasoperacionais,comoo
MicrosoftWindows,oMacOSXeoGNU/Linux.Sistemasoperacionaiscomunicamsediretamentecom
ohardwarenohnenhumacamadamaisbaixaparamediarseuspedidos.Originalmente,ossistemas
operacionaiseramescritosnalinguagemAssembly,oqueresultavaemumcdigomuitorpidoe
eficiente.Entretanto,escreverumsistemaoperacionalemAssemblyumprocessotedioso(lento),e
produzumcdigoquefuncionarsomenteemumaarquiteturadeCPU,talcomoox86ouARM.
Escreverumsistemaoperacionalemumalinguagemdealtonvel,talcomoC,possibilitaqueos
programadoresreadaptemosistemaoperacionalavriasarquiteturassemprecisarreescrevertodoo
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 8/156
KennethThompson(esquerda)eDennisRitchie(
direita),oscriadoresdalinguagemC
cdigo.Oncleo(kernel)LinuxumexemplodesistemaoperacionalescritoemC,comapenasalgumas
seesdocdigoescritasemAssembly,parapoderexecutarinstruesquesexistememumaououtra
arquiteturaeparaalgumasotimizaes.
HistriadaLinguagemC
Estapginaprecisaserreciclada(discuta).
Aomelhorla,vocestarajudandooWikilivros.
Histria
Desenvolvimentosiniciais
OdesenvolvimentoinicialdalinguagemCocorreu
noslaboratriosBelldaAT&Tentre1969e1973.
SegundoRitchie,operodomaiscriativoocorreuem
1972.Deuseonome"C"linguagemporquemuitas
dassuascaractersticasderivaramdeumalinguagem
deprogramaoanteriorchamada"B".Hvrios
relatosquesereferemorigemdonome"B":Ken
Thompsondcrditolinguagemdeprogramao
BCPL,maseletambmcriouumaoutralinguagem
deprogramaochamada'Bon,emhonradasua
mulherBonnie.
Porvoltade1973,alinguagemCtinhasetornado
suficientementepoderosaparaquegrandepartedo
ncleodeUNIX,originalmenteescritonalinguagem
deprogramaoPDP11/20Assembly,fossereescritoemC,tornandoseumdosprimeirosncleosde
sistemaoperacionalimplementadoemumalinguagemsemseroAssembly.Comoexemplosanteriores
podesecitarosistemaMultics(escritoemPL/I)eTRIPOS(escritoemBCPL).
CdeK&R
Em1978,RitchieeKernighanpublicaramaprimeiraediodolivroTheCProgrammingLanguage.
Esselivro,conhecidopelosprogramadoresdeCcomo"K&R",serviudurantemuitosanoscomouma
especificaoinformaldalinguagem.AversodalinguagemCqueeledescreveusualmentereferida
como"CdeK&R".(AsegundaediodolivrocobreoposteriorpadroANSIC,descritoabaixo.)K&R
introduziramasseguintescaractersticasnalinguagem:
Tiposdedadosstruct
Tiposdedadoslong int
Tiposdedadosunsigned int
Ooperador=+foialteradopara+=,eassimsucessivamente(aanliselxicadocompilador
confundiaooperador=+.Porexemplo,i=+10ei=+10).
CdeK&Rfrequentementeconsideradoapartemaisbsicadalinguagemcujosuportedeveser
asseguradoporumcompiladorC.Durantemuitosanos,mesmoapsaintroduodopadroCANSI,ele
eraconsideradoo"menordenominadorcomum"emqueprogramadoresdeCseapoiavamquandouma
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 9/156
portabilidademximaeradesejada,jquenemtodososcompiladoreseramatualizadosparasuportarna
ntegraopadroCANSI,eocdigoCdeK&Rrazoavelmentebemescritotambmvlidoemrelao
aoCANSI.
NosanosqueseseguirampublicaodoCK&R,algumascaractersticas"nooficiais"foram
adicionadaslinguagem,suportadasporcompiladoresdaAT&Tedeoutrosvendedores.Estasincluam:
Funesvoidetiposdedadosvoid *
Funesqueretornamtiposstructouunion
Camposdenomestructnumespaodenomeseparadoparacadatipostruct
Atribuioatiposdedadosstruct
Qualificadoresconstparacriarumobjetosdeleitura
Umabibliotecapadroqueincorporagrandepartedafuncionalidadeimplementadaporvrios
vendedores
Enumeraes
Otipodepontoflutuantedeprecisosimples
OsPadresCANSIeCISO
Duranteosfinaisdadcadade1970,alinguagemCcomeouasubstituiralinguagemBASICcomoa
linguagemdeprogramaodemicrocomputadoresmaisusada.Duranteadcadade1980,foiadotadapara
usonoPCIBM,easuapopularidadecomeouaaumentarsignificativamente.Aomesmotempo,Bjarne
Stroustrup,juntamentecomoutrosnoslaboratriosBell,comeouatrabalharnumprojetoondese
adicionavamconstruesdelinguagensdeprogramaoorientadaporobjetoslinguagemC.A
linguagemqueelesproduziram,chamadaC++,nosdiasdehojealinguagemdeprogramaode
aplicaesmaiscomumnosistemaoperativoWindowsdacompanhiaMicrosoftCpermanecemais
popularnomundoUNIX.
Em1983,oInstitutoNorteAmericanodePadres(ANSI)formouumcomit,X3j11,paraestabelecer
umaespecificaodopadrodalinguagemC.Apsumprocessolongoerduo,opadrofoicompletoem
1989eratificadocomoANSIX3.1591989"ProgrammingLanguageC".Estaversodalinguagem
frequentementereferidacomoCANSI.Em1990,opadroCANSI,apssofrerumasmodificaes
menores,foiadotadopelaOrganizaoInternacionaldePadres(ISO)comoISO/IEC9899:1990.Um
dosobjetivosdoprocessodepadronizaoCANSIfoiodeproduzirumsobreconjuntodoCK&R,
incorporandomuitasdascaractersticasnooficiaissubsequentementeintroduzidas.Entretanto,muitos
programastinhamsidoescritosequenocompilavamemcertasplataformas,oucomumcertocompilador,
devidoaousodebibliotecasdefunesnopadroeaofatodealgunscompiladoresnoaderiremaoC
ANSI.
C99
ApsoprocessoANSIdepadronizao,asespecificaesdalinguagemCpermaneceramrelativamente
estticasporalgumtempo,enquantoquealinguagemC++continuouaevoluir.(Em1995,aNormative
Ammendment1criouumaversonovadalinguagemCmasestaversoraramentetidaemconta.)
Contudo,opadrofoisubmetidoaumarevisonosfinaisdadcadade1990,levandopublicaoda
normaISO9899:1999em1999.Estepadrogeralmentereferidocomo"C99".Opadrofoiadotado
comoumpadroANSIemMarode2000.
AsnovascaractersticasdoC99incluem:
Funesemlinha
Levantamentoderestriessobrealocalizaodadeclaraodevariveis(comoemC++)
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 10/156
Adiodevriostiposdedadosnovos,incluindoolong long int(paraminimizaradorda
transiode32bitspara64bits),umtipodedadosbooleanexplicitoeumtipocomplexque
representanmeroscomplexos
Disposiesdedadosdecomprimentovarivel
Suporteoficialparacomentriosdeumalinhainiciadospor//,emprestadosdalinguagemC++
Vriasfunesdebibliotecanovas,taiscomosnprintf()
Vriosarquivoscabealhonovos,taiscomostdint.h
OinteresseemsuportarascaractersticasnovasdeC99parecedependermuitodasentidades.Apesardo
GCCevriosoutroscompiladoressuportaremgrandepartedasnovascaractersticasdoC99,os
compiladoresmantidospelaMicrosoftepelaBorlandno,eestasduascompanhiasnoparecemestar
muitointeressadasadicionartaisfuncionalidades,ignorandoporcompletoasnormasinternacionais.
Resumoemingls
Em1947,trscientistasdoLaboratrioTelefoniaBell,WilliamShockley,WalterBrattain,eJohnBardeen
criaramotransistor.Acomputaomodernateveincio.Em1956noMIToprimeirocomputador
completamentebaseadoemtransistoresfoiconcludo,theTX0.Em1958naTexasInstruments,Jack
Kilbyconstruiuoprimeirocircuitointegrado.Masmesmoantesdoprimeirocircuitointegradoexistir,a
primeiralinguagemdealtonveljtinhasidoescrita.
Em1954Fortran,aFormulaTranslator,foiescrito.ComeoucomoFortranIem1956.Fortranveioaser
Algol58,oAlgorithmicLanguage,em1958.Algol58veioaserAlgol60em1960.Algol60veioaser
CPL,oCombinedProgrammingLanguage,em1963.CPLveioaserBCPL,BasicCPL,em1967.BCPL
veioaserBem1969.BveioaserCem1971.
BfoiaprimeiralnguadalinhagemCdiretamente,tendosidocriadonoBellLabsporKenThompson.B
eraumalinguageminterpretada,utilizadanoincio,emversesinternasdosistemaoperacionalUNIX.
ThompsoneDennisRitchie,tambmdaBellLabs,melhorouB,chamandoNBnovasprorrogaespara
NBcriaramC,umalinguagemcompilada.AmaioriadosUNIXfoireescritoemNBeC,oquelevoua
umsistemaoperacionalmaisporttil.
Bfoi,naturalmente,onomedeBCPLeCfoioseusucessorlgico.
AportabilidadedoUNIXfoiarazoprincipalparaapopularidadeinicialdeambos,UNIXeCrather
thancreatinganewoperatingsystemforeachnewmachine,systemprogrammerscouldsimplywritethe
fewsystemdependentpartsrequiredforthemachine,andwriteaCcompilerforthenewsystemand
sincemostofthesystemutilitieswerewritteninC,itsimplymadesensetoalsowritenewutilitiesinthe
language.
Prrequisitos
prrequisitoparaumbomaprendizadodequalquerlinguagemdeprogramaoconceitossobrelgica
deprogramao.
Almdisso,paraprogramaremC,vocprecisadeumeditordetextoseumcompilador,discutidosa
seguir.
Editor
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 11/156
Paraeditarocdigodeumprograma,apenasnecessrioumeditordetextos,qualquerum,atmesmoo
BlocodeNotasdoWindows.
Noentanto,hdiversoseditoresqueapresentamrecursosquefacilitamaediodeprogramas,como:
destaque/coloraodesintaxe,complementaodecdigo,formatao(indentao)automtica,ajuda
integrada,comandosintegradosparacompilaretc.EntretodoselespodemosdestacaroVimeoEmacs,
amboscomversesparaWindows,LinuxeMacOS.
EmsistemasGNU/Linux,amaioriadoseditoresdetextojpossuemrecursosparafacilitaraediode
programasemC.Principalmente,devidoaofatodamaioriadeles(dosprogramas)eboapartedosistema
teremsidoprogramadosutilizandoCouC++.
Entretanto,oeditorapenaseditaocdigo.Paratransformaloemlinguagemdemquinaeoexecutar,
precisaremosdeumcompilador.
Compilador
OcdigoemlinguagemCconsisteeminstruesqueocomputadordeverseguir.Ocompiladorrealizao
trabalhodetraduziressasinstruesparalinguagemdemquina,deformaapoderemserexecutadaspelo
computador.
Ligadoroulinker
Aligaodearquivosconsistenaconstruodeumaimagemmemriaquecontmpartesdecdigo
compiladosseparadamente.Emoutraspalavraseleuneosarquivosobjetoseasbibliotecas(estticas,
dinmicas)paraformarumanovabibliotecaouumexecutvel.
Obtendoumcompilador
Existemdiversoscompiladoresdisponveis:
ParaWindowsouDOS
MinGW(antigomingw32):umaespciedegccparaWindows.ocompiladorincludocomo
DevC++,daBloodshed.ODevC++umIDE(siglaeminglsparaAmbienteIntegradode
Desenvolvimento)quefacilitaaedioecompilaodeprogramas.TemtraduoparaPortugus
doBrasil.
BorlandC++:aBorlanddisponibilizouumcompiladorgratuitoquefuncionaemlinhadecomando,
comoalternativaaoIDEcomercial.
DJGPP:portedogccparaDOS.TambmfuncionanoWindows,masseoobjetivoforrodarno
Windows,recomendaseousodomingw,quepodeusufruirdetodososrecursosdoWindows.
MicrosoftVisualC++:compiladorcomercialdaMicrosoft,quetambmtemumIDE.O
Framework.NET,gratuito,tambmincluiocompilador(emlinhadecomando)doVisualC++.
BloodshedDEVC++:ambientededesenvolvimentointegradolivrequeutilizaoscompiladoresdo
projetoGNUparacompilarprogramasparaosistemaoperacionalMicrosoftWindows.
ParaLinux/Unixlike
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 12/156
gcc:umconjuntodecompiladoresoficiaisdoprojetoGNU,decdigoaberto.Costumamvir
instaladosnamaioriadasdistribuiesGNU/Linuxeestdisponvelparadiversasplataformas,
principalmenteparaasbaseadasemsistemasdotipounix.
GNUlinker:oligadordoprojetoGNUonomedoprograma"ld"efazpartedopacoteGNU
BinaryUtilities.
Linksexternos
CodeBlocks(http://www.codeblocks.org):pginaparadownloaddoCodeBlocks,umaIDEparaC
aoestilodoDevC++,porm,maisnova.
DevC++(http://www.bloodshed.net/dev/devcpp.html):pginaparadownloaddoDevC++.
DJGPP(http://www.delorie.com/djgpp/):pginaoficial,cominformaeselinksparadownload.
GCC(http://gcc.gnu.org/):pginaoficialdocompiladorparadiversasplataformas.
Utilizandoumcompilador
Compiladores:visogeral
Umcompilador,geralmente,umprogramademodotexto,quedeveseroperadodiretamentedalinhade
comando,semnenhumainterfacegrfica.Essaumadasrazespelasquaismuitaspessoaspreferemusar
IDEs.Noentanto,saberumpoucosobrecomousarocompiladorpelalinhadecomandopodeviraser
til,porexemploquandovocnotiverumIDEdisposio.Nonenhumbichodesetecabeas,ea
sintaxedamaioriadoscompiladoressemelhante.
Paraexecutarocompilador,vocprecisaabrirumterminal(ou"promptdecomando",comocostumaser
chamadonoWindows,ouaindaconsole).lgicoquesevocestiveremumsistemasemambiente
grfico(comooDOS),vocnoprecisafazerisso.
OWindowsstemumterminalnativo,queointerpretadordecomandosdele(cmd.exeou
command.com).PacotescomooCygwineoMSys(domesmoprojetoqueoMinGW)incluemterminais
alternativosquefuncionambasicamentemaneiradoLinux.
NoLinux,almdosterminaisdemodotexto,hvriosemuladoresdeterminal,entreosquaisestoo
XTerm,oKonsole(KDE)eoTerminaldoGnome.Ousodetodoselesidntico.
gcc
Comogcc,compiladordaGNUutilizadoprincipalmentenosistemaoperacionallinuxoudetipounix,
vocpodeexecutaracompilaoeamontagemseparadamenteoucomumnicocomando.Sevoctem
vriosarquivosfonte,maisrecomendvelexecutarasduasetapasseparadamente:sevocatualizar
apenasumarquivo,sprecisarrecompilaroqueatualizouedepoisremontar.Noentanto,sevocest
desenvolvendoumprojetogrande,recomendvelusarferramentasdeautomaodoprocessode
compilao,comoomake.
Resumo:
gcc [OPES] nome_do_arquivo
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 13/156
Aquisolistadasalgumasdasopesdogcc:
-c:Compilaocdigofontemasnofazasligaes.Asadaumarquivoobjeto.
-o:serveparadarumnomeaoarquivodesada.
-O2:ativaotimizaononvel2
-g:salvaossmbolosdedepurao(oquepermiteusarumdepurador)
-Wall:ativatodososavisosdocompilador
-pedantic:ativaosavisosnecessriosparaqueocdigoestejaestritamentedeacordocomos
padres
Paracompilaroarquivo"programa.c",gerandoocdigoobjeto"programa.o":
gcc [OPES] -c programa.c
Parageraroexecutvel"programabinario"binou"programa.exe"noWindows/DOSapartirdocdigo
objeto:
gcc [OPES] -o programa[.bin] programa.o
Parageraroexecutveldiretamenteapartirdoarquivofonte:
gcc [OPES] -o programa[.bin] programa.c
VisualC++
Estemduloprecisaserrevisadoporalgumqueconheaoassunto(discuta).
EmalgumaversonoespecificadadoVisualC++,paracompilaroarquivo"programa.c",gerandoo
cdigoobjeto"programa.obj":
cl /c programa.c
Parageraroexecutvel"programa.exe"apartirdocdigoobjeto:
link /out:programa.exe programa.obj
Parageraroexecutvelapartirdoarquivofonte:
cl programa.c
Noesdecompilao
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 14/156
Estapginaumesboodeinformtica.AmpliandoavocajudaramelhoraroWikilivros.
Compilao
TodoocdigoemlinguagemCqueescrevermosdevesersalvoemumarquivo,emformatotexto,coma
extenso".c".Essecdigonotemsignificadonenhumparaaunidadedeprocessamentoparaqueo
processadorpossaexecutarnossoprograma,estedevesertraduzidoparaalinguagemdemquina.Essa
traduosechamacompilaoefeitapeloprogramadenominadocompilador.
Ocompiladorltodoocdigoecriaumarquivoexecutvel,emlinguagemdemquina,especficapara
umaarquiteturadeprocessadoreseparaumtipodesistemaoperacional,oquesignificaqueumprograma
compiladonoWindows,porexemplo,norodarnativamentenoLinuxsesimplesmentecopiarmoso
executvel.Devemos,paraisso,recompilarocdigofontedoprograma.
NoWindows,osarquivosexecutveissoaquelescomextenso".exe".NoLinux,osexecutveisso
simplesmentearquivoscomoatributo"executvel".
Etapasdacompilao
Oprocessoquechamamoscorriqueiramentedecompilaonaverdadeumconjuntodeetapas:
opreprocessamento,etapaemqueoprprocessador(programasvezesacopladoaocompilador)
locdigofonteefazalgumassubstituiesparaqueoprogramapossasercompilado.EmC,o
preprocessadortemdiversosusos:compilaocondicional(porexemplo,usartrechosdiferentesdo
cdigoparasistemasoperacionaisdiferentes),macros,substituiodesmboloseinclusode
arquivosexternosquedeclaramfunesevariveis.
averificaosinttica,queprocuraporeventuaiserrosnoscdigosdosprogramas:parntesesno
fechados,faltadepontoevrgulanofinaldainstruo,etc.Todosessesproblemassoalertadose
causamainterrupodacompilao.
acompilaopropriamentedita,quetransformaocdigopreprocessadoemumprogramaobjeto,
queestemlinguagemdemquinapormnoprontoparaserexecutado.
alinkedio(linking,emingls)dosprogramasobjetoebibliotecasnecessriasemumnico
executvel,feitapelolinkeditor(linker).EmC,podesedistribuirumprogramaemvriosarquivos
fonte,oqueajudanaorganizaoepermitecompilarapenasapartedoprogramacorrespondente
quandonecessriorealizaralgumamudana.Namontagem,todasaspartesconstituintesdo
programasodeslocadase/oucortadasconformenecessrioparaquetenhamosumprograma
executvel.
UmprogramaemC
UmprogramaemC
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 15/156
comumqueoprimeiroprogramaescritoemumalinguagemdeprogramaosejaumprogramaque
escreve"Helloworld!"("Olmundo!").Apresentamosocdigoe,aseguir,analisaremoscadaumade
suaslinhas.Nosepreocupesenoentenderaindaalgunsaspectos,tudoserabordadodetalhadamente
maisadiante.
Notequeonmerodaslinhasdadoapenasparafacilitararefernciaseforcopiarocdigo,lembresede
tirarosnmerosdelinha.
1. /* o meu primeiro programa */
2. #include <stdio.h>
3. int main()
4. {
5. printf ("Ol, mundo!");
6. return (0);
7. }
Otextodoprogramatambmconhecidocomocdigodoprogramaousimplesmentecdigofonte.O
cdigofonteoprogramaescritonalinguagemdeprogramao.Emnossocasoacima,chamamoscdigo
Cousimplesmentecdigo.
Vocdevecopiarocdigoacimaemumeditordetextocomonotepadesalvlocomoola.c(semacento).
Lembresederemoverosnmerosdaslinhas.Casocontrrioocdigonoircompilar.Essearquivo
agorarepresentaocdigofontedoprogramaescritoemC.
Salvandoocdigoacimaemumarquivocomaextenso".c"eseguindoasinstruesdecompilaodo
docaptulodeutilizaodecompilador,vocdeververcomoresultadoum"Ol,mundo!"natela.A
seguirvamosaanlisedocdigo.
Aprimeiralinhaumcomentrio,queparaocompiladornotemnenhumsignificado.Qualquertexto
queestejaentreasmarcaes/*e*/,podendoinclusiveocuparvriaslinhas,serconsideradocomo
comentrioesercompletamenteignoradopelocompilador.muitotilcomodocumentao,explicando
oqueasprximaslinhasdecdigofazem.
Alinha2pedequesejainseridoocontedodoarquivostdio.h(queestnumlugarjconhecidopelo
compilador).Essearquivocontmrefernciasadiversasfunesdeentradaesadadedados(stdio
abreviaodeStandardInput/Output,ouEntradaeSadaPadronizadas),demodoquevocprecisardele
empraticamentetodososprogramaseleomeiodequasetodacomunicaocomoteclado,comatela
ecomarquivos.
[1]
OsprogramasemCsoorganizadosemfunestodocdigoemCdevefazerpartedeumafuno.
Emparticular,todoprogramadeveterumafunochamadamain,pelaqualseriniciadaaexecuodo
programa.Afunodefinida,nonossoexemplo,nalinha3,edelimitadapelaschaves{ }.
Apalavrachaveintsignificaqueafunodevolveumvalorinteiro(vocpodepensarnessevalor
exatamentecomoovalordeumafunoemmatemtica).
Nalinha5,executamosafunoprintf,queimprimenatelaosparmetrosquelheforampassadosno
nossoexemplo,passamosaseqnciadecaracteres"Ol,mundo!"comoparmetro.Essaumadas
funesdefinidasemumcabealhodabibliotecaC,oarquivostdio.h.
Noteopontoevrgulanofinaldalinha:todasasinstruesemCdevemterminarcomumpontoe
vrgula.(Essaumacausamuitocomumdeerrosdecompilao).
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 16/156
Nalinha6,dizemosqueafunomaindevedevolver(ouretornar)ovalor0eterminarsuaexecuo.
(Esseovalorinteiroquedissemosqueamosretornarnalinha3.)
OpadrodalinguagemCdizqueafunomaindevedevolverumvalorinteiro,eessevalordizseo
programafoiexecutadocomsucessoouno.Ovalorzeroindicaqueoprogramafoifinalizadosem
nenhumerro,evaloresdiferentesdezeropodemindicardiferenteserros.Vocnoprecisarse
preocuparcomissonoinciodoseuestudoemCovalordevolvidoporumprogramageralmente
usadoemscripts,quando(porexemplo)umcomandospodeserexecutadoseoanteriortiverocorrido
comsucesso.
Compilandooprograma
Linux
AmaioriadasdistribuieslinuxjpossuemcompiladorCnainstalaopadro.Paracompilaro
programaacima(ola.c)abraumterminal,entrenapastaondeoarquivoselocalizaedigiteoseguinte
comando:
gcc -o ola ola.c
Ocompiladorirgeraroarquivoexecutvelchamadoolaquepodeserexecutadodaseguinteforma:
./ola
1. Essecomandoumadiretivadoprprocessadorvocaprendermaissobreessescomandosna
seoPrprocessador.
Conceitosbsicos
VocjviuumprogramabsicoemC.AntesdecomearasededicaraoestudodeC,bomquevoc
compreendaalgunstermosealgunsaspectosdalinguagem,oquefacilitarsuacompreensodoscaptulos
seguintes.Aseguir,formalizaremosalgunsaspectosdaestruturabsicadalinguagem.
Estruturabsica
UmprogramaemCbasicamenteestruturadoemblocosdecdigo.Blocosnadamaissoque
conjuntosdeinstrues,edevemserdelimitadoscomchaves({ ... }).Umblocotambmpode
conteroutrosblocos.
Umainstruogeralmentecorrespondeaumaaoexecutada,edevesempreterminarcomponto
evrgula(;).
Ocompiladorignoraespaos,tabulaesequebrasdelinhanomeiodocdigoessescaracteresso
chamadosgenericamentedeespaoembranco(whitespace).Ouseja,ostrstrechosaseguirso
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 17/156
equivalentes:
printf("Ol mundo");return 0;
printf ("Ol mundo");
return 0;
printf(

"Ol mundo"

);
return
0
;
Noentanto,vocacharmuitomaisfcildelerumestilodecdigomaisparecidocomosegundo
exemplo.Costumaseusar(masnoabusarde)espaosetabulaesparaorganizarocdigo.
Alinguagemsensvelutilizaodemaisculaseminsculas.Porexemplo,sevocescrevesse
Printfnolugardeprintf,ocorreriaumerro,poisonomedafunototalmenteemminsculas.
Escopo
Geralmente,emprogramao,noqueremosqueoutrasfunesusemasvariveisqueestamos
manipulandonomomento.Oconceitodeescopoestjustamenterelacionadoaisso.Escopoonvelem
queumdadopodeseracessadoemChdoisnveis:localeglobal.Umavarivelglobalpodeser
acessadaporqualquerpartedoprogramavariveislocaispodemseracessadasapenasdentrodobloco
ondeforamdeclaradas(ounosseussubblocos),masnoforadele(ounosblocosqueocontm).Isso
possibilitaquevocdeclarevriasvariveiscomomesmonomemasemblocosdiferentes.Vejaum
exemplo:
int a;
{
int a;
int b;
}
{
int b;
}
Asduasvariveischamadasbsodiferentesespodemseracessadasdentrodoprpriobloco.Aprimeira
varivelaglobal,masspodeseracessadanosegundobloco,poisavarivellocalanoprimeirobloco
ocultaavarivelglobaldemesmonome.NotequeissopossvelemC,etomecuidadoparanocometer
errosporcausadisso.
Introduosfunes
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 18/156
Funessomuitousadas,nosemC,masemlinguagensdeprogramaoemgeral.Umafuno
basicamenteumblocodecdigoquerealizaumacertatarefa.Quandoqueremosrealizaraquelatarefa,
simplesmentefazemosumachamadadefunoparaafunocorrespondente.
Umafunopodeprecisarqueoprogramadordcertosdadospararealizaratarefaessesdadosso
chamadosargumentos.Afunotambmpoderetornarumvalor,quepodeindicarseatarefafoi
realizadacomsucesso,porexemploessevalorovalorderetorno.Podemosfazerumaanalogiacomas
funesmatemticas:asvariveisindependentessoosargumentoseovalornumricodafunoovalor
deretorno.
EmC,parachamarumafuno,devemosescreveroseunome,seguidodalistadeargumentos(separados
porvrgula)entreparnteses,mesmoquenohajanenhumargumento.Lembrequeachamadadefuno
tambmumainstruo,portantodevemosescreveropontoevrgulanofinal.Algunsexemplosde
chamadasdefunes:
funcao(arg1, arg2, arg3);
funcao();
Sequisermossaberovalorderetornodeumafuno,podemosarmazenlonumavarivel.Variveis
serointroduzidaslogoadiante,masasintaxemuitofcildeaprender:
valor_de_retorno = funcao(arg1, arg2);
Vejamosumexemplocompleto:
//quadrado.c
//calcula o quadrado de um nmero

#include<stdio.h>

int square( int num1 )
{
return num1 * num1;
}

int main(){
int number;
int result;

printf("\nDigite um numero: ");
scanf("%d", &number);

result = square(number);

printf("O Quadrado de %d eh: %d", number, result);

return 0;
}
EmC,todoocdigo(excetoasdeclaraesdevariveisefunes)deveestardentrodefunes.Todo
programadeveterpelomenosumafuno,afunomain,queporondecomeaaexecuodo
programa.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 19/156
Expresses
Umconceitomuitoimportanteemprogramaoodeexpresso.Expressessoconjuntosdevalores,
variveis,operadoresechamadasdefunesquesoavaliadosouinterpretadospararesultarnumcerto
valor,quechamadoovalordaexpresso.Porexemplo:
3 * 4 + 9umaexpressodevalor21
a + 3 * bumaexpressoequivalenteexpressomatemticaa+3b
foo()umaexpressocujovalorovalorderetornodafunofoo.
Comentrios
Muitasvezesbastantetilcolocarcomentriosnocdigo,porexemploparaesclareceroqueumafuno
faz,ouqualautilidadedeumargumento,etc.Amaioriadaslinguagensdeprogramaopermite
comentriosemC,elespodemaparecerdeduasmaneiras:
/* Comentrios que podem
ocupar vrias
linhas.
*/
e
// Comentrios de uma linha s, que englobam
// tudo desde as duas barras at o final da linha.
Tudoqueestiverentreasmarcas/*e*/ouentre//serignoradopelocompilador.Notequeos
comentriosdeumalinhas(iniciadospor//)foramincorporadosaopadrodalinguagemapenasem
1999,eportantoalgunscompiladorespodemnoossuportar.AsversesmaisrecentesdoGCCnotero
problemaemsuportaressetipodecomentrio.
Variveis
Variveis
Emumprograma,existeanecessidadedeseguardarvaloresnamemria,eissofeitoatravsde
variveis,quepodemserdefinidassimplificadamentecomonomesquesereferemalugaresnamemria
ondesoguardadosvalores.Aodeclararmosumavarivel,noapenasestamosreservandoumespaode
memria,comotambmestamosassociandoumnomeaele,oidentificador.Aoinvsdeutilizarmoso
endereodavarivelnamemria,queseriageralmentenotadonaformahexadecimal,comoporexemplo
0x0012FED4,referimonosaoendereoapenaspeloseunome.Apenasparadeixarclaro,aprprianotao
emhexadecimaljumasimplificao,poiscomputadoresnaverdadetrabalhamcombinrio.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 20/156
EmC,parautilizarumavarivel,eladeveserprimeiramentedeclarada,ouseja,devemosrequisitaro
espaonecessrioparaessavarivel.Apsreservarumespaonamemria,ocomputadorirassociara
eleonomedavarivel.Sevocnodeclararumavariveletentarutilizla,ocompiladoriravislo
dissoenocontinuaracompilao.
Declarandovariveis
Genericamente,paradeclararumavarivel,usamosaseguinteinstruo:
tipo_da_varivel nome_da_varivel;
Porexemplo,paradeclararumavariveldotipointcomonomea,podemosescrever
int a;
semprenecessrioindicarotipodavarivel,poiscadatipotemumtamanhodiferente,ouseja,ocupa
maisoumenosespaonamemriadocomputador.Maisadianteintroduziremosostiposdevarivel.
Atribuindovalores
Sequisermosassociarumvaloraumavarivel,usamosooperador=(igual):
a = 5;
Nessecaso,estamospedindoqueocomputadorguardeovalor5noespaoalocadovarivela.
Observao:Apesardeesteoperadorseassemelharaoigualdamatemtica,suafunodiferente.Para
verificaraigualdadededoisvalores,usamosooperadordecomparao"=="(doisiguais).
possveltambmatribuirumvaloraumavarivelaomesmotempoqueeladeclarada,oque
chamadodeinicializaravarivel.Porexemplo:
int a = 5;
possveltambmdeclararmaisdeumavariveldeummesmotipoemumanicainstruo,separandoos
nomesporvrgulas.Tambmpossvelinicializarasvariveisdessamaneira:
int a, b, c, d;
int e = 5, f = 6;
int g, h = 2, i = 7, j;
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 21/156
Comooprprionomejdiz,ovalorexistentenumavarivelpodesermudado,damesmamaneiraqueele
normalmenteatribudo.Setivermos:
int a;
a = 2;
a = 3;
nofinalovalordavarivelaser3.
Exemplodeerro
a=25
Mesmosabendoqueumexemplodeerro,escrevaocdigoacimaemumarquivo.cetentecompilar
parasefamiliarizarcomasmensagensdeerrodocompilador,assimvocsaberoquefazerquandoelas
ocorrerem.
Noexemploacimanofoideclaradaavarivela,aotentarcompilarocompiladorinformaqueosmbolo
anofoidefinido.
Nomesdevariveis
Existemalgumasrestriesquantoaonomequepodemosdaravariveis.Essasregrasseaplicamtambm
paranomearfuneseestruturas.
Osnomesdevariveisdevemsernicosnomesmoescopo:nopodemosterduasvariveiscomo
mesmonome.
Onomepodeserigualaodeoutravariveljexistenteemescoposuperior,pormrecomendado
fortementequenoseusevariveisiguaissobpenadetornarocdigodoprograma
incompreensveloudedifcilanlise
OC,assimcomomuitasoutraslinguagensdeprogramao,sensvelutilizaodemaisculase
minsculas(casesensitive).Portanto,ocdigoaseguirseriavlidoegerariatrsvariveisdiferentes:
int nome;
int NOME;
int Nome;
Emnomesdevariveis,podemosusarletrasmaisculasouminsculas(deAaZ,semacentos),
algarismosarbicos(09)eocaracteresublinhado(_),masoprimeirocaracteredeveserumaletra
ouosublinhado.
Algumaspalavrasnopodemserusadasparanomesdevariveisporserempalavrasreservadas
(palavrasquetmsignificadoespecialnalinguagem).
OpadroCatualespecificaquenomesdeat31caracteresdevemseraceitos.Algunscompiladores
podemataceitarnomesmaioresqueisso,masnoconsidereissoumaregraenousenomesto
longos.
Entradaesadasimples
Entradaesadasimples
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 22/156
Sevocpensarbem,perceberqueumcomputadorpraticamenteintilsenotivernenhumamaneirade
interagircomousurio.Porexemplo,sevocabrirumprocessadordetexto,nadairaconteceratque
vocabraumarquivooudigitealgumtextonoteclado.Mas,damesmamaneira,necessrioqueo
computadorforneainformaotambm:comovocpoderiasaberseumatarefafoiconcluda?
Astrocasdeinformaoentreocomputadoreousuriosochamadasentradaesada(inputeoutput,em
ingls).Entradaainformaofornecidaaumprogramasadaainformaofornecidapeloprograma.
comumreferirseaosdoistermossimultaneamente:entrada/sadaouE/S(I/O,emingls).
Frequentementesousadosostermos"sadapadro"(standardoutput,stdout)e"entradapadro"
(standardinput,stdin).Elessereferem,namaioriadasvezes,aomonitoreaoteclado,quesoosmeios
bsicosdeinteraocomousurio.Noentanto,ossistemasoperacionaispermitemredirecionarasadaea
entradadeprogramasparaoutrosdispositivosouarquivos.
AsfunesdeentradaesadanalinguagemCtrabalhamcomfluxos(streams,emingls)dedados,que
soumaformadeabstraodedadosdemaneirasequencial.Assim,todaentradaesadafeitadamesma
maneira,comasmesmasfunes,noimportandoodispositivocomoqualestamosnoscomunicando
(teclado,terminal,arquivo,etc.).Asmesmasfunesquedescrevemoacessoaosarquivospodemser
utilizadasparaseacessarumterminaldevdeo.
EmC,asfunesdabibliotecapadroparaentradaesadaestodeclaradasnocabealhostdio.h.Uma
delasjfoiintroduzidaemseesanteriores:printf().Aseguirdaremosmaisdetalhessobreessafunoe
introduziremosoutras.
puts()eputchar()
putssignifica"putstring"(colocarstring),utilizadopara"colocar"umastringnasadadedados.putchar
significa"putchar"(colocarcaractere),utilizadopara"colocar"umcaracterenasadadedados.
Soasfunesmaissimplesdocabealhostdio.h.Ambasenviam(ou"imprimem")sadapadroos
caracteresfornecidosaelasputchar()mandaapenasumcaractere,eputs()mandaumasequnciade
caracteres(oustring).Exemplo:
puts ("Esta uma demonstrao da funo puts.");
putchar ('Z');
Notequejuntocomafunoputsdevemosusarliteraisdestring(comaspasduplas),ecomputchar
devemosusarliteraisdecaractere(comaspassimples).Sevoctentassecompilaralgocomoputchar
("T"),ocompiladordariaumamensagemdeerro.Lembreseque"T"diferentede'T'.
Podemostambmcolocarcaracteresespeciais,comoatabulao(\t)eaquebradelinha(\n):
puts ("Primeira linha\nSegunda linha\te um grande espao");
putchar ('\n'); // apenas envia uma quebra de linha
Estecdigoresultariaemalgoparecidocom:
Primeira linha
Segunda linha e um grande espao
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 23/156
Observequeafunoputs()semprecolocaumaquebradelinhaapsimprimirastring.Jcomas
funesputchar()eprintf()(vistaaseguir),issonoocorre.Ocdigoabaixo,porexemplo:
putchar('c');
putchar('h');
putchar('\n');
puts("String.");
puts("Outra string.");
imprimiriaalgoparecidocomisto:
ch
String.
Outra string.
Observequeoscaracteres'c'e'h'soexibidosnamesmalinha,poisnofoiinseridaumaquebradelinha
entreeles.Jasstrings"String."e"Outrastring."soexibidasemlinhasdiferentes,poisafunoputs()
insereumaquebradelinhaapscadastring,mesmoquenohajaumcaractere'\n'nasliteraisdestringdo
cdigo.
Osoutroscaracteresespeciaissointroduzidosadiante.
Notequeoargumentodeveserumasequnciadecaracteres.Sevoctentar,porexemplo,
imprimironmero42destamaneira:
puts(42);
Naverdadeoqueocompiladortentarfazerimprimirasequnciadecaracteresquecomeana
posio42damemria(provavelmenteeleiralertlosobreissosevoctentarcompilaresse
cdigo).Sevoctentarexecutaressecdigo,provavelmenteocorrerumafalhadesegmentao
(erroqueocorrequandoumprogramatentaacessarmemriaquenolhepertence).Amaneira
corretadeimprimironmero42seriacolocloentreaspasduplas:
puts("42");
printf()
printfvemde"printformatted"(imprimirformatado).
primeiravista,afunoprintf()podepareceridnticaputs().Noentanto,elamuitomaispoderosa.
Elapermitefacilmenteimprimirvaloresquenososequnciasdecaracteres,almdepoderformataros
dadosejuntarvriassequnciasdecaracteres.Porisso,afunoprintf()muitomaisusadaqueaputs().
Elapodeserusadaexatamentecomoafunoputs(),sefornecermosaelaapenasumasequnciade
caracteres:
printf("Este um programa em C");
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 24/156
Elatambmpodeserescritadaseguinteforma:
printf("Ola"
" mundo"
"!!!" );
Maseseprecisarmosimprimirocontedodeumavarivel?Afunoprintftambmpodefazerisso!
Vocdeve,obviamente,especificarondeovalordavariveldeveserimpresso.Issofeitoatravsda
especificaodeformato%d,casoavarivelsejadotipoint(sequnciasparaoutrostiposserodadas
adiante).Voctambmprecisar,logicamente,especificarqualvarivelimprimir.Issofeitodandose
maisumargumentofunoprintf().Ocdigodeverficarassim:
int teste;
teste = 42;
printf ("A varivel 'teste' contm o nmero %d.", teste);
Tendocolocadoissonoseuprograma,vocdeververnatela:
A varivel 'teste' contm o nmero 42.
Vamossuporquevocqueiraimprimirumnmeronointeiro.Vocteriaquetrocar"%d"por%f.
Exemplo:
float pi;
pi = 3.1415;
printf ("O valor de pi %f.", pi);
Ocdigoacimairretornar:
O valor de pi 3.1415.
Vocpodeimprimirquantosvaloresquiser,bastandoparaissocolocarmaisargumentosemais
especificaesdeformato,lembrandodecolocarnaordemcerta.Algunscompiladores,comoogcc,
mostramumavisocasoonmerodeargumentossejadiferentedonmerodeespecificaesdeformato,o
queprovavelmentecausariaresultadosindesejados.Asintaxegeraldafunoprintf():
printf ("string de formatao", arg1, arg2, ...);
Suponhaquevoctemumprogramaquesomadoisvalores.Paramostraroresultadodaconta,voc
poderiafazerisso:
int a, b, c;
... // leitura dos dados
c = a + b; // c o resultado da soma
printf ("%d + %d = %d", a, b, c);
Oqueresultariaem,paraa=5eb=9:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 25/156
5 + 9 = 14
Aseguirmostramososespecificadoresdeformatoparavriostiposdedados.
Especificaesdeformato
Adocumentaomaistcnicaoschamade"especificadoresdeconverso",poisoqueocorrenamaioria
dasvezes,defato,aconversodeumvalornumricoemumasequnciadecaracteresquerepresenta
aquelevalor.Masonome"formato"nodeixadeestarcorreto,poiselesespecificamemqueformato
(inteiro,realetc.)estoargumentocorrespondente.
Cdigo Converso/Formatodoargumento
%d Nmerodecimalinteiro(int).Tambmpodeserusado%icomoequivalentea%d.
%u Nmerodecimalnatural(unsignedint),ouseja,semsinal.
%o Nmerointeirorepresentadonabaseoctal.Exemplo:41367(correspondeaodecimal17143).
%x
Nmerointeirorepresentadonabasehexadecimal.Exemplo:42f7(correspondeaodecimal
17143).Seusarmos%X,asletrasseromaisculas:42F7.
%X Hexadecimalcomletrasmaisculas
%f
Nmerodecimaldepontoflutuante.Nocasodafunoprintf,devidosconversesimplcitasda
linguagemC,servetantoparafloatcomoparadouble.Nocasodafunoscanf,%fservepara
floate%lfserveparadouble.
%e
Nmeroemnotaocientfica,porexemplo5.97e-12.Podemosusar%EparaexibiroE
maisculo(5.97E-12).
%E Nmeroemnotaocientficacomo"e"maisculo
%g
Escolheautomaticamenteomaisapropriadoentre%fe%e.Novamente,podemosusar%Gpara
escolherentre%fe%E.
%p Ponteiro:exibeoendereodememriadoponteiroemnotaohexadecimal.
%c Caractere:imprimeocaracterequetemocdigoASCIIcorrespondenteaovalordado.
%s Sequnciadecaracteres(string,emingls).
%% Imprimeum%
ObservaoSevocquiserimprimirumsinaldeporcentagem,use%%.Exemplo:
printf("O lucro para o ltimo ms foi de 20%%.");
Numasequnciadecontrole,possveltambmindicaralarguradocampo,onmerodecasasdecimais,
otamanhodavarivelealgumasopesadicionais.Oformatogeral:
%[opes][largura do campo][.preciso][tamanho da varivel]tipo de dado
Anicaparteobrigatriaotipodedado.Todasasoutraspodemseromitidas.
Opes
Asopessoparmetrosopcionaisquealteramaformatao.Vocpodeespecificarzerooumaisdelas,
colocandoaslogoapsosinaldeporcentagem:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 26/156
0:otamanhodocampodeveserpreenchidocomzerosesquerdaquandonecessrio,seo
parmetrocorrespondentefornumrico.
-(hfen):ovalorresultantedeveseralinhadoesquerdadentrodocampo(opadroalinhar
direita).
(espao):nocasodeformatosqueadmitemsinalnegativoepositivo,deixaumespaoembranco
esquerdadenmerospositivos.
+:osinaldonmerosersempremostrado,mesmoquesejapositivo.
'(aspasimples/apstrofe):nmerosdecimaisdevemserexibidoscomseparadordemilharescasoas
configuraesregionaisoespecifiquem.EssaoponormalmentesfuncionanossistemasUnix.
Larguradocampo
Comooprprionomejdiz,especificaqualalarguramnimadocampo.Seovalornoocupartodaa
larguradocampo,esteserpreenchidocomespaosouzeros.Porexemplo,podemosimprimirumcdigo
deat5dgitospreenchidocomzeros,demaneiraqueosvalores1,27,409e55192apareamcomo
00001,00027,00409e55192.
Alarguradeveserespecificadalogoapsasopes,sepresentes,epodeserumnmeroqueespecifica
alarguraouumasterisco,quedizquealarguraserespecificadapeloprximoargumento(ouseja,o
argumentoanterioraovaloraserimpresso).Nesteexemplo,ocampoterlarguraigualaovalordenume
ovalorimpressoser300:
printf ("%*d", num, 300);
Ocampoimpressodeacordocomasseguintesregras:
Seovalorformaislargoqueocampo,esteserexpandidoparapoderconterovalor.Ovalornunca
sercortado.
Seovalorformenorqueocampo,alarguradocamposerpreenchidacomespaosouzeros.Os
zerossoespecificadospelaopo0,queprecedealargura.
Oalinhamentopadrodireita.Parasealinharumnmeroesquerdausaseaopo-(hfenou
sinaldemenos)antesdalarguradocampo.
Porexemplo,compareastrsmaneirasdeexibironmero15:
printf ("%5d", 15); // exibe " 15"
printf ("%05d", 15); // exibe "00015"
printf ("%-5d", 15); // exibe "15 "
Ealgunsoutrosexemplos:
printf ("%-10s", "Jos"); // exibe "Jos "
printf ("%10s", "Jos"); // exibe " Jos"
printf ("%4s", "Jos"); // exibe "Jos"
Preciso
Aprecisopodeterquatrosignificadosdiferentes:
Seaconversosolicitadaforinteira(d,i,o,u,x,X):onmeromnimodedgitosaexibir(ser
preenchidocomzerossenecessrio).
Seaconversoforreal(a,A,e,E,f,F):onmerodecasasdecimaisaexibir.Ovalorser
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 27/156
arredondadoseaprecisoespecificadanoformatoformenorqueadoargumento.
Seaconversoforemnotaocientfica(g,G):onmerodealgarismossignificativos.Ovalorser
arredondadoseonmerodealgarismossignificativospedidoformaiorqueodoargumento.
Seaconversofordeumasequnciadecaracteres(s):onmeromximodecaracteresaexibir.
Assimcomoalarguradocampo,aprecisopodeserespecificadadiretamenteporumnmerooucomum
asterisco,masdeveserprecedidaporumponto.
Algunsexemplos:
printf ("%.5d", 314); // exibe "00314"
printf ("%.5f", 2.4); // exibe "2.40000"
printf ("%.5g", 23456789012345); // exibe "2.3457e+13"
printf ("%.5s", "Bom dia"); // exibe "Bom d"
claroquepodemoscombinaralarguracomapreciso.Porexemplo,%10.4findicaumcampode
nmerorealdecomprimentototaldezecom4casasdecimais.Noteque,nalarguradocampo,ovalor
inteirolevadoemconta,inclusiveopontodecimal,enoapenasaparteinteira.Porexemplo,essa
formataoaplicadaaonmero3.45irresultarnisto:
" 3.4500"
Tamanhodavarivel
importanteressaltarquequandosousadosmodificadoresdetamanhodetipos,amaneiracomoos
dadossoarmazenadospodetornarsediferente.Assim,devemosinformarfunoprintf()precisamente
qualotipodavarivelcujovalordesejamosexibir.Afunoprintf()admitecincoprincipaismodificadores
detamanhodevarivel:
hh:indicaqueaconversointeiracorrespondeaumavarivelchar.Porexemplo,poderamosusar
oformato%hhdparaexibirumavariveldotipocharnabasedecimal.
h:indicaqueaconversointeiracorrespondeaumavarivelshort.
l:indicaqueaconversointeiracorrespondeaumavarivellong.
ll:indicaqueaconversointeiracorrespondeaumavarivellong long.
L:indicaqueaconversodenmerorealcorrespondeaumavarivellong double.
Quandootipodavarivelnotemmodificadoresdetamanho(longoushort),noseusanenhum
modificadordetamanhodavarivelnafunoprintf().
Sequnciasdeescape
Sequnciasdeescapesocombinaesdecaracteresquetmsignificadoespecial,esosempreiniciadas
porumabarrainvertida(\).Vocpodeuslasemqualquerliteraldecaractereoustring.Porexemplo,a
string"linha 1\nlinha 2"equivalea:
linha 1
linha 2
poisasequncia\nindicaumaquebradelinha.Comofoicitadoanteriormente,afunoprintf(),
diferentementedeputs(),noimprimeautomaticamenteumaquebradelinhanofinaldastring.Ocdigo
abaixo,porexemplo:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 28/156
printf("string 1");
printf("string 2");
Imprimiriaisto:
string 1string 2
Issopodesertil,poissvezesdesejvelpermanecernamesmalinha.
AseguirapresentamosatabelacomassequnciasdeescapesuportadaspelalinguagemC:
Sequncia Significado
\n Quebradelinha(linefeedouLF)
\t Tabulaohorizontal
\b Retrocedeocursoremumcaractere(backspace)
\r
Retornodecarro(carriagereturnouCR):voltaocursorparaocomeodalinhasemmudar
delinha
\a Emiteumsinalsonoro
\f Alimentaodeformulrio(formfeedouFF)
\v Tabulaovertical(emimpressoras)
\" Aspadupla
\' Aspasimples
\\ Barrainvertida
\0 Caracterenulo(caracteredevalorzero,usadocomoterminadordestrings)
\N OcaracterecujarepresentaooctalN(dgitosde0a7)
\xN OcaracterecujarepresentaohexadecimalN(dgitosde0a9edeAaF)
Representaooctalehexadecimal
Tambmpossveltrocarumasequnciadeescapepeloseuvaloremoctalouhexadecimal.Vocpode,
porexemplo,trocarocaractere"\n"pelovaloroctal"\12"ouhexadecimal"\x0A".Vejamosmaisalguns
exemplos.
Hexadecimal Octal Caracter
\x00 \00 \0
\x0A \12 \n
\x0D \15 \r
\x07 \07 \a
\x08 \10 \b
\x0B \13 \v
scanf()
Afunoscanf()ldadosdaentradapadro(teclado)eosguardaemvariveisdoprograma.Assimcomo
paraprintf(),usamosumastringdeformataoparaespecificarcomoserolidososdados.Asintaxede
scanf()esta:
scanf ("string de formatao", &arg1, &arg2, ...);
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 29/156
Comovocpodever,asintaxequaseigualdeprintf(),comexceodoEcomercial(&).Voc
entendermelhoroseuusonasseesseguintes,masadiantamosqueeleumoperadorqueretornao
endereodeumavarivel.Issonecessriopoisafunoscanf()devemodificarasvariveis,equando
nousamosooperadordeendereo,passamosapenasovalordeumavarivelparaafuno.Issoser
explicadomelhornocaptulosobreponteiros.Ofatodescanfreceberendereosdevariveis(emvezde
seusvalores)tambmexplicaporqueeleprecisaserinformadodadiferenaentre%f(float)e%lf(double)
enquantoqueoprintfnoprecisa.
Umexemplobsicodautilizaodescanf()este:
int a;
scanf ("%d", &a);
Oqueesteexemplofazdeclararumavariveleaguardarousuriodigitaralgo.Osdadosssero
processadosquandoousurioapertarEnter.Depoisdisso,oscaracteresdigitadospelousuriosero
convertidosparaumvalorinteiroeesseinteiroserguardadonoendereoquecorrespondevarivela.
Seovalordigitadonopuderserconvertido(porqueousurionodigitounenhumalgarismovlido),a
varivelnosermodificada.
Assimcomonafunoprintf(),podemosreceberquantosvaloresquisermos,bastandousarvrios
especificadoresdeconverso:
int a;
char b;
float c;
scanf ("%d %c %f", &a,&b,&c);
Dessamaneira,seousuriodigitar120 z 17.63,teremosaiguala120,bigualaocaractere'z'ecigual
aonmero17,63.Seousuriotentardigitarmaisdeumespaoentreosdadosousimplesmentenenhum
espao,aindaassimoprogramaobterosdadoscertos.Porexemplo,120z17.63tambmdaromesmo
resultado.
Agoraumaquestoumpoucomaisdifcil:vamossuporqueespecificamosumformatointeiroeousurio
digitouumnmeroreal,comoporexemplo12.5.Oquedeveracontecer?
#include <stdio.h>
int main ()
{
int a;

printf ("Digite um nmero: ");
scanf ("%d", &a);
printf ("\nO nmero digitado foi %d", a);
return (0);
}
Sevoctestarcomovalor12.5,vaiverqueoprogramaretornaronmero12,poisafunoscanf()
apenasinterpretaoscaracteresvlidosparaaqueleformato.
Osespecificadoresdeconversosopraticamenteosmesmosqueosdafunoprintf(),comalgumas
mudanas.Amaioriadelespulaespaosembranco,excetodois.
%inomaissinnimode%d.Oque%ifazinterpretarovalordigitadocomohexadecimal,se
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 30/156
iniciarsepor0xou0Xcomooctal,seiniciarsepor0oucomodecimal,casonenhumadessas
condiessejaverificada.
%a,%e/%Ee%gsosinnimosde%f.
%lfdeveserusadoparavariveisdotipodouble.
%slumasequnciadecaracteresnobrancos(qualquercaractereexcetoespao,tabulao,quebra
delinhaetc.),ouseja,umapalavra.
%clumasequnciadecaracteres,semignorarespaos.Opadrolerumcaractere,senofor
especificadaalarguradocampo.
%[...]lumasequnciadecaracteres,semignorarespaos,especificandoentrecolchetesquais
caracteresdevemseraceitos,ou,seoprimeirocaracteredentrodoscolchetesforumacento
circunflexo(^),quaisnodevemseraceitos.Almdisso,secolocarmosumtraoentredois
caracteres,todososcaracteresentreosdoisseroincludosnopadro.Porexemplo,sequisermos
incluirqualquerletraminscula,poderimosescrever%[a-z]sequisssemostambmincluiras
maisculas,colocaramos%[a-zA-Z].Aleiturapraquandoforencontradoumcaracterequeno
coincidecomopadroespecificado.
Josmodificadoresfuncionamdemaneirabastantediferente:
Omodificador*(asterisco)especificaqueovaloratualdeveserlidodamaneiraespecificada,mas
noserguardadoemnenhumavarivel,eportantonodevehaverumponteirocorrespondentea
essevalor.Porexemplo,poderimosterumprogramaqueesperalerumapalavraedepoisum
nmero,masnoimportaqualpalavra.Nessecasousaramosomodificador*:scanf
("%*s %d", &numero).Oprogramaleriaapalavraeguardariaonmeronavarivelnumero.
Comonafunoprintf(),existeoespecificadordelarguradocampo,quedeveaparecerantesdo
especificadordeconverso,masemscanf()eleespecificaalarguramxima.Sealarguramxima
foidefinidacomon,scanf()pularparaoprximocamposejtiverlidoncaracteres.Porexemplo,
scanf ("%4d", &num)lerumnmerodeatquatroalgarismos.Seousuriodigitarmais,o
excedentesernoserlidoporessachamada,maspoderserlidoporumaprximachamadaa
scanf.
Maisdetalhessobreosespecificadoresdeconversoeosmodificadorespodemserencontradosna
documentaodabibliotecapadro.
Valorderetorno
Afuncoscanf()retornaonmerodeconversesrealizadascomsucesso.Issotilpois,seovalor
contidonumavarivelapsachamadadescanf()forigualaovaloranterior,nopossvelsaberseovalor
digitadofoiomesmoquejhaviaousenofoifeitaaconverso.Paraobteressenmerodeconverses
realizadas,vocdeveguardaroresultadonumavariveldotipoint.Vejacomoproceder:
int a, b;
int num;
num = scanf("%d%d", &a, &b);
Esteexemploldoisnmerosinteiroseosguardanasvariveisaeb.Onmerodeconversesrealizadas
guardadonavarivelnum.Seapsoscanf,numfordiferentede2,sinaldequeousuriodigitoualgo
incompatvelcomoformatodesejado.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 31/156
Notequeaquiintroduzimosumconceitonovo:ovalorderetornodeumafuno.Elepodeser
obtidosimplesmenteassociandoovalordeumavarivelchamadadafuno.Eleser
detalhadonaseoFunes,masjpossvelcompreenderumpoucosuautilizao.
gets()egetchar()
gets()egetchar(),assimcomoscanf(),lemdaentradapadro.Assimcomoputs()eputchar(),
nosuportamformatao.Comoonomesugere,getchar()lapenasumcaractere,egets()luma
stringatofinaldalinhaouatquenohajamaisdadosparaler,eadicionaoterminadordestring"\0".
Asintaxedasfunes:
gets(ponteiro_para_string);
char c;
c = getchar();
Noentanto,existeumproblemacomafunogets().Vejaoexemploaseguir:
#include <stdio.h>
int main()
{
char buffer[10];
printf("Entre com o seu nome: ");
gets(buffer);
printf("O nome : %s", buffer);
return 0;
}
Anotaochar buffer[10],queaindanofoiintroduzida(eserdetalhadanaseoVetores(arrays)),
pedequesejareservadoumespaopara10caracteresparaastringbuffer.Portanto,seusuriodigitarmais
de9caracteres(poisoterminadordestringadicionadoaoqueousuriodigitou),oscaracteres
excedentesadicionaisserocolocadosnareadememriasubsequenteocupadapelavarivel,
escrevendoumaregiodememriaquenoestreservadastring.Esteefeitoconhecidocomo"estouro
debuffer"epodecausarproblemasimprevisveis.Porisso,nosedeveusarafunogets()maistarde
introduziremosafunofgets(),quenoapresentaesseproblemaequedeveserusadanolugardegets().
sprintf()esscanf()
sprintfesscanfsosemelhantesaprintfescanf.Porm,aoinvsdeescreveremnasadapadroou
leremdaentradapadro,escrevemoulememumastring.Anicamudananosargumentosa
necessidadedeespecificarastringquedeveserlidaouatribudanoincio.Vejaosexemplosparaentender
melhor.
#include <stdio.h>
int main()
{
int i;
char string1[30];
printf("Entre um valor inteiro: ");
scanf("%d", &i);
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 32/156
sprintf(string1, "Valor de i = %d", i);
puts(string1);
return 0;
}
Nesseexemplo,amensagemquequeramosexibirnatelafoiprimeiramentesalvaemumastring,edepois
essastringfoienviadaparaatela.Sevocolharbem,sevoctivessealocadoumvalormenorparastring1,
tambmocorreriaumestourodebuffer.Paraevitaresseproblema,existeafunosnprintf,quetem
maisumargumento:otamanhodastring(devesercolocadodepoisdastringondeamensagemser
gravada).
#include <stdio.h>
int main()
{
int i, j, k;
char string1[] = "10 20 30";
sscanf(string1, "%d %d %d", &i, &j, &k);
printf("Valores lidos: %d, %d, %d", i, j, k);
return 0;
}
Nesseexemplo,usamosafunosscanfparainterpretarosvalorescontidosnastringeguardlosnas
variveisnumricas.
Operaesmatemticas(Bsico)
Operaesmatemticas
EmC,fazeroperaesmatemticassimplesbastantefcileintuitivo.Porexemplo,sequisermosque
umavarivelcontenhaoresultadodaconta123+912,fazemosassim:
var = 123 + 912;
Osoperadoresaritmticosbsicosso5:+(adio),(subtrao),*(multiplicao),/(diviso)e%(resto
dedivisointeira).
Outroexemplo:
int a = 15;
int b = 72;
int c = a * b; /* c valer 1572 */
Podemosusarmaisdeumoperadornamesmaexpresso.Aprecednciaigualusadanamatemtica
comum:
a = 2 + 4 * 10; /* retornar 42, o mesmo que (2 + (4 * 10)) */
a = 2 + 40 / 2 + 5; /* retornar 27, o mesmo que (2 + (40 / 2) + 5) */
Vocpodeusarparnteses,comoemexpressesmatemticasnormais:
a = (2 + 4) * 10; /* retornar 60 */
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 33/156
a = (2 + 40) / (2 + 5); /* retornar 6 */
Notequeumaoperaoentrenmerosinteirossempreretornarumnmerointeiro.Issoevidenteparaa
adio,subtraoemultiplicao.Masemumadivisodeinteiros,porexemplo3/2,aexpressoretornar
apenasaparteinteiradoresultado,ouseja,1.
Sequisermosumresultadonointeiro,umdosoperandosdevesernointeiro.Nesseexemplo,
poderamosusar3.0/2ou3/2.0,oumesmo3./2ou(1.0 * 3)/2,pois,emC,umaoperao
envolvendoumnmeronointeirosempretercomoresultadoumnmeroreal.
NotequeemCoseparadordecimalopontoenoavrgula.
Oseguinteexemplopoderiasurpreender,poisoprogramadirqueovalordefcontinuasendo3.
#include <stdio.h>
int main()
{
int i = 5;
int j = 2;
float f = 3.0;
f = f + j / i;
printf("O valor de f %f", f);
return 0;
}
Mas,segundoaprecednciadosoperadores,j / ideveriasercalculadoprimeiro,ecomoambosos
valoressodotipointeiro,ovalordessaexpressozero.
importantequevocgraveumarquivo.ccomocdigoacimaeexecuteusandoocompiladorparavero
funcionamentocomosprpriosolhos.
Abreviaes
Algunstiposdeatribuiessobastantecomuns,eporissoforamcriadasabreviaes.Porexemplo,
muitocomumincrementaremumaunidadeovalordeumavarivel(emloops,porexemplo).Emvezde
escrevervar = var + 1,podemosescreversimplesmentevar++.Damesmamaneira,existeooperador
dedecremento,quedecrementaemumaunidadeovalordavarivel:var--(equivalenteavar = var -
1).
Osoperadoresdedecrementoeincrementotambmpodemserutilizadosantesdonomedavarivel.Isso
significaqueestasduasinstruessoequivalentes:
var++;
++var;
Agoravamossuporquevocuseemseuprogramaumavarivelqueaumentade10em10unidades.
claroqueusarvar++dezvezesnoabreviarianada.Emvezdisso,existeaabreviaovar += 10.
Genericamente,paraqualquerdoscincooperadoresaritmticosop,valeaabreviao:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 34/156
var = var op num;
var op= num;
Ouseja,osseguintesparessoequivalentes:
x *= 12; x = x * 12;
x /= 10; x = x / 10;
x -= 2; x = x - 2;
x %= 11; x = x % 11;
Esteexemploclarificaousodosoperadoresdeincremento:
#include <stdio.h>
int main()
{
int a, b;
a = b = 5;
printf("%d\n", ++a + 5);
printf("%d\n", a);
printf("%d\n", b++ + 5);
printf("%d\n", b);
return 0;
}
Oresultadoquevocdeveobteraoexecutaroexemplo:
11
6
10
6
Esseresultadomostraque++varevar++nosoamesmacoisaseusadoscomoumaexpresso.
Quandousamososoperadoresnaformaprefixal(antesdonomedavarivel),ovalorretornadodepois
deserincrementadonaformasufixal,ovalorretornadoedepoisincrementado.Omesmovaleparao
operadordedecremento.
Eoqueaconteceriasevocescrevessealgocomooseguinte?
printf("%d\n", a / ++a);
Aresposta:nosabemos.SegundoopadroC,oresultadodissoindefinido(oquesignificaquepode
variardeumcompiladorparaoutro).Noexisteumaregrasobreavaliarprimeiroonumeradorouo
denominadordeumafrao.Ouseja,nouseumavarivelmaisdeumaveznumaexpressoseusar
operadoresqueamodificam.
Talvezvoctenhaachadoestranhaalinha:
a = b = 5;
Issopossvelporqueatribuiessofeitasdadireitaparaaesquerdaeumainstruodeatribuio
tambmumaexpressoqueretornaovaloratribudo.Ouseja,aexpressob = 5retornouovalor5,que
foiusadopelaatribuioa = (b = 5),equivalenteaa = 5.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 35/156
Operaesmatemticas(Avanado)
Ocabealho<math.h>contmprottiposdealgumasfunesnareadematemtica.Naversode1990
dopadroISO,somenteaversodoubledasfunesforamespecficadasnaversode1999foram
adicionadasasversesfloatelong double.
Asfunespodemseragrupadasnasseguintescategorias:
1. FunesTrigonomtricas
2. FunesHiperblicas
3. FunesExponencialeLogaritmo
4. Funespowesqrt
5. FunesdeArredondamentoparaNmerosInteiros,ValoresAbsolutoseRestodaDiviso
FunesTrigonomtricas
Asfunesacoseasin
Afunoacosretornaoarcocossenodosseusargumentosemradianos,eafunoasinretornaoarco
senodosseusargumentosemradianos.Todasasfunesesperamporargumentosqueestejamno
intervalo[1,+1].Oarcocossenoretornavaloresnointervalo[0,]oarcosenoretornavaloresno
intervalo[/2,+/2].
#include <math.h>
float asinf(float x); /* C99 */
float acosf(float x); /* C99 */
double asin(double x);
double acos(double x);
long double asinl(long double x); /* C99 */
long double acosl(long double x); /* C99 */
Asfunesataneatan2
Asfunesatanretornamoarcotangentedosargumentsemradianos,eafunoatan2retornaoarco
tangentedey/xemradianos.Asfunesatanretornamovalornointervalo[/2,+/2](arazopeloque
/2estincluidonointervaloporqueosvaloresdecimaispoderepresentaroinfinito,eatan()=
/2)asfunesatan2retornamovalornointervalo[,+].Paraafunoatan2,um"domainerror"
podeocorrerseosdoisargumentosforemzero.
#include <math.h>
float atanf(float x); /* C99 */
float atan2f(float y, float x); /* C99 */
double atan(double x);
double atan2(double y, double x);
long double atanl(long double x); /* C99 */
long double atan2l(long double y, long double x); /* C99 */
Asfunescos,sinetan
Asfunescos,sin,etanretornamocoseno,seno,etangentedoargumento,expressoemradianos.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 36/156
#include <math.h>
float cosf(float x); /* C99 */
float sinf(float x); /* C99 */
float tanf(float x); /* C99 */
double cos(double x);
double sin(double x);
double tan(double x);
long double cosl(long double x); /* C99 */
long double sinl(long double x); /* C99 */
long double tanl(long double x); /* C99 */
FunesHiperblicas
Asfunescosh,sinhandtanhcomputamocosenohiperblico,osenohiperblicoeatangente
hiperblicarespectivamente.Paraasfunesdesenoecosenohiperblico,umerrode...
#include <math.h>
float coshf(float x); /* C99 */
float sinhf(float x); /* C99 */
float tanhf(float x); /* C99 */
double cosh(double x);
double sinh(double x);
double tanh(double x);
long double coshl(long double x); /* C99 */
long double sinhl(long double x); /* C99 */
long double tanhl(long double x); /* C99 */
FunesExponencialeLogaritmo
Afunoexp
Asfunesexpcomputamafunoexponencialdex(e
x
).Um"rangeerror"ocorreseovalordex
muitogrande.
#include <math.h>
float expf(float x); /* C99 */
double exp(double x);
long double expl(long double x); /* C99 */
Asfunesfrexp,ldexpemodf
Asfunesfrexpdividemumnmerorealnumafraonormalizadaeumnmerointeiromltiplode2.
Asfunesguardamonmerointeironoobjetoapontadoporex.
Asfunesfrexpretornamovalorxdeformaquextemovalor[1/2,1)ouzero,evalueigualax
vezes2elevadoa*ex.Sevalueforzero,asduaspartesdoresultadoseramzero.
Asfunesldexpmultiplicamumnmerorealporumnmerointeiromltiplode2eretornamo
resultado.Um"rangeerror"podeocorrer.
Asfunesmodfdivideoargumentovalueentreumparteinteiraeumafrao,cadaumatemomesmo
sinaldoargumento.Asfunesguardamoparteinteiranoobjetoapontadopor*iptreretornamofrao.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 37/156
#include <math.h>
float frexpf(float value, int *ex); /* C99 */
double frexp(double value, int *ex);
long double frexpl(long double value, int *ex); /* C99 */
float ldexpf(float x, int ex); /* C99 */
double ldexp(double x, int ex);
long double ldexpl(long double x, int ex); /* C99 */
float modff(float value, float *iptr); /* C99 */
double modf(double value, double *iptr);
long double modfl(long double value, long double *iptr); /* C99 */
Asfuneslogelog10
Asfuneslogcomputamologaritmonaturaldoargumentoeretornamoresultado.Um"domainerror"
ocorreseoargumentofornegativo.Um"rangeerror"podeocorrerseoargumentoforzero.
Asfunslog10computamologaritmocomum(base10)doargumentoeretornamoresultado.Um
"domainerror"ocorreseoargumentofornegativo.Um"rangeerror"ocorreseoargumentoforzero.
#include <math.h>
float logf(float x); /* C99 */
double log(double x);
long double logl(long double x); /* C99 */
float log10f(float x); /* C99 */
double log10(double x);
long double log10l(long double x); /* C99 */
Funespowesqrt
Asfunespow
Asfunespowcomputamxelevadoayeretornamoresultado.Um"domainerror"ocorresexfor
negativoeynoforumnmerointeiro.Um"domainerror"ocorreseoresultadonopuderser
representadoquandoxzeroeymenorouigualazero.Um"rangeerror"podeocorrer.
#include <math.h>
float powf(float x, float y); /* C99 */
double pow(double x, double y);
long double powl(long double x, long double y); /* C99 */
Asfunessqrt
Asfunessqrtcomputamaraizpositivadexeretornamoresultado.Um"domainerror"ocorreseo
argumentofornegativo.
#include <math.h>
float sqrtf(float x); /* C99 */
double sqrt(double x);
long double sqrtl(long double x); /* C99 */
FunesdeArredondamentoparaNmerosInteiros,Valores
AbsolutoseRestodaDiviso
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 38/156
Asfunesceilefloor
Asfunesceilcomputamomenornmerointeiroquenosejamenorquexeretornamoresultadoas
funesfloorcomputamomaiornmerointeiroquenosejamaiorquexeretornamoresultado.
#include <math.h>
float ceilf(float x); /* C99 */
double ceil(double x);
long double ceill(long double x); /* C99 */
float floorf(float x); /* C99 */
double floor(double x);
long double floorl(long double x); /* C99 */
Asfunesfabs
Asfunesfabscomputamovalorabsolutodonmerorealxeretornamoresultado.
#include <math.h>
float fabsf(float x); /* C99 */
double fabs(double x);
long double fabsl(long double x); /* C99 */
Asfunesfmod
Asfunesfmodcomputamorestodex/yeretornamovalorxi*y,praalgumnmerointeiroionde,se
yforumnmerodiferentedezero,oresultadotemomesmosinaldexemagnitudemenorquea
magnitudedey.Seyforzero,dependendodaimplementaodafuno,ocorrerum"domainerror"oua
funofmodretornarzero.
#include <math.h>
float fmodf(float x, float y); /* C99 */
double fmod(double x, double y);
long double fmodl(long double x, long double y); /* C99 */
Ligaesexternas
BibliotecaderefernciaC++(C++ReferenceLibrary)cmath(math.h)
(http://www.cplusplus.com/reference/clibrary/cmath/)
Controledefluxo
Controledefluxo
DificilmenteumprogramaemCirexecutarsempreasmesmasinstrues,namesmaordem,
independentementedoquetenhaacontecidoanteriormenteoudovalorquefoifornecido.muitocomum
quealgumqueiraqueumpedaodecdigossejaexecutadoseumacertacondioforverdadeira
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 39/156
tambmcomumquererqueumpedaodecdigosejarepetidovriasvezes,detalmaneiraque
simplesmentecopiarocdigonoresolveriaoproblemaouseriatrabalhosodemais.Paracasoscomo
esses,existemasestruturasdecontroledefluxo.
EmC,existemvriasinstruesrelacionadasaocontroledefluxo:
if,queexecutaumblocoapenasseumacondioforverdadeira
switch,queexecutaumblocodeacordocomovalordeumaexpressoouvarivel
for,queexecutaumblocorepetidasvezesenquantoumacondioforverdadeira,executandouma
instruo(geralmentedeincrementooudecrementodeumavarivel)apscadaexecuo
while,queexecutaumblocoenquantoumacondioforverdadeira
do,semelhanteaowhile,masacondioavaliadaapsaexecuo(enoantes)
goto,quesimplesmentepulaparaumlugarprdefinido.
Porm,antesdeentrarnoestudodessasestruturas,vocdevesabercomoescreverumacondio.oque
explicamosaseguir.
Expressesdecondio
UmaexpressodecondioumaexpressonormalemCque,quandoavaliada,serinterpretadacomo
verdadeiraoufalsa.EmC,naverdade,essevalorumvalorinteiroquesendo0(zero)significafalso,
sendoqualqueroutronmerosignificaverdadeiro.
Geralmenteemexpressescondicionaisusamososoperadoresrelacionais,ouseja,queavaliamarelao
entreseusdoisoperandos.Existemseisdeles:
Operador Significado
> maiorque
>= maiorouiguala
< menorque
<= menorouiguala
== iguala
!= diferentede
Todosessesoperadoressobinrios,ouseja,trabalhamcomdoisvaloresouoperandos.Essesoperadores
semprecomparamovalordaesquerdacomodadireita,ouseja,aexpressoa > bsignifica"amaior
queb".
Notequeparasabersedoisnmerossoiguaisdevemosusardoissinaisdeigual.Umerro
muitocomumesquecerdeumdeles,transformandoacomparaonumaatribuiopor
exemplo:
if (x = 1)
...
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 40/156
Oqueaconteceaquiqueavarivelxrecebeovalor1,demodoqueaexpressoentre
parntesestambmterovalor1tornandoacondiosempreverdadeira.Similarmente,se
usssemosonmerozero,aexpressosempreseriafalsa.Portanto,sempretomecuidadocom
essetipodecomparao.Amaneiracertadecompararcomumnmero:
if (x == 1)
...
Tambmcomumquecombinemoscondies.Porexemplo,podemosquererqueumnmerosejamenor
que10oumaiorque50.Comoooperador"ou""||",escreveramos:n < 10 || n > 50.Aseguir
vocvosoperadoreslgicos:
Operador Significado
|| ou(OR)
&& e(AND)
! no(NOT)
Algumasexplicaessobreosoperadoreslgicos:
Ooperador"no"unrio,ouseja,umaoperaoqueenvolveapenasumvalor.Oqueelefaz
inverterovalordeseuoperando:retornafalsoseaexpressoforverdadeiraeviceversa.Devese
usarparntesesaonegarumaexpresso:!(x > 6),porexemplo.
Ooperador"ou"retorna"verdadeiro"sepelomenosumdosoperandosforverdadeiroretorna
"falso"apenasseambosforemfalsos.
Ooperador"e"retorna"verdadeiro"apenasseambososseusoperandosforemverdadeiros.
ObservaoSevocquersaberseumnmeroestentreoutrosdois,asintaxematemtica(10
< n < 50)nofuncionar.Sevocusaressecdigo,naverdadeprimeiramenteseravaliadaa
expresso10 < n,quepoderresultarem0ou1.Portanto,aexpressoequivalea(0 ou 1) <
50,oquesempreverdadeiro.
Acomparaocorretaenvolveriaooperador"e"(&&):10 < n && n < 50.
Pelofatodetodovalordiferentedezeroseravaliadocomoverdadeiroezerocomofalso,existemas
seguintesequivalncias(apenasquandoestasexpressessousadascomocondies):
(x == 0) equivale a (!x)
(x != 0) equivale a (x)
Testes
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 41/156
Testessoestruturasdecontrolequeexecutamcertosblocosdecdigoapenasseumacertacondiofor
verdadeira.ExistemtrsestruturasdessetipoemC:
if
Otesteifavaliaumacondioe,seelaforverdadeira,executaumblocodecdigo.Asintaxe
correspondenteaisso:
if (condio) {
... /* bloco a ser executado se a condio for verdadeira */
}
Mastambmpodemosespecificarumblocoaserexecutadocasoacondioforfalsa.Nessecaso,
escrevemos:
if (condio) {
... /* bloco a ser executado se a condio for verdadeira */
}
else {
... /* bloco a ser executado se a condio for falsa */
}
Aschavespodemseromitidascasohajaapenasumainstruonobloco.Porexemplo:
if (x == 5)
printf ("x igual a 5.\n");
Percebaque,seesquecermosaschaves,ocompiladornodeverdarnenhumerronoentanto,tudoque
excederaprimeirainstruoserexecutadoincondicionalmente,mesmoqueestejanamesmalinha!No
exemploaseguir,afrase"xiguala5"seriaexibidamesmoqueonmeronofosse5!
if (x == 5)
j++; printf ("x igual a 5.\n");
Podemosavaliardiversascondiescomostestesif,bastandoparaissocolocarumnovotestenobloco
else.Tambmpossvelaninharblocosif,ouseja,colocarumdentrodeoutro:
if (x > 9) {
printf ("x maior que 9.\n");
}
else if (x >= 5) {
printf ("x maior ou igual a 5, mas no maior que 9.\n");
}
else {
if (x == 0) {
printf ("x igual a zero.\n");
}
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 42/156
else {
printf ("x no-nulo e menor que 5.\n");
}
}
switch
Otesteswitchcomparaumaexpressocomdiversosvaloresquepodemestarassociadosablocosde
cdigosdiferentes,eexecutaoblocodecdigocorrespondenteaovalorencontrado.Voctambmpode
especificarumblocoquedeveserexecutadocasonenhumdosoutrosvaloressejaencontrado:obloco
default("padro"emingls).
switch (expresso) {
case valor1:
instrues;
break;
case valor2:
instrues;
break;
...
default:
instrues;
}
Notequenotesteswitchnoprecisamosusarchavesemvoltadosblocos,amenosquedeclaremos
variveisneles.Umexemplodautilizaodeswitchseriaacriaodeummenu:
int opcao;
printf ("[1] Cadastrar cliente\n"
"[2] Procurar cliente\n"
"[3] Inserir pedido\n"
"[0] Sair\n\n"
"Digite sua escolha: ");
scanf ("%d", &opcao);

switch (opcao) {
case 1:
cadastra_cliente();
break;
case 2:
procura_cliente();
break;
case 3:
insere_pedido();
break;
case 0:
return 0;
default:
printf ("Opo invlida!\n");
}
Ainstruobreakindicaquedevesecontinuaraexecuoapsofinaldoblocoswitch(pulandooque
estivernomeio).Seelanofosseusada,paraumcertovalorencontrado,seriamexecutadastambmas
instruesdetodososvaloresabaixodele.Emalgunscasos,podemosomitirintencionalmenteainstruo
break.Porexemplo,noexemploacima,nocolocamosumainstruobreakparaovalorzero,pois
quandoretornamosdeumafuno(return 0)oblocoswitchjabandonado.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 43/156
Tambmpodemosquererqueumainstruosejaexecutadaparamaisdeumvalor.Vamossuporqueno
nossomenuasduasprimeirasopesfossem"Cadastrarpessoafsica"e"Cadastrarpessoajurdica",e
tvessemosumafunoquefazocadastrodiferentementedependendodovalordavarivel
pessoa_fisica.Poderamosfazerumcdigoassim:
switch (opcao) {
case 1: /* pessoa fsica */
pessoa_fisica = 1;
case 2:
cadastra();
break;
...
}
Nessecaso,paraqualquerumadasduasopesseriaexecutadaafunocadastra,masseselecionarmos
"pessoafsica"avarivelseratribudaantes.
Operadorternrio"?:"
Ooperadorternrio?:umaalternativaabreviadadaestruturaif/else.Eleavaliaumaexpressoeretorna
umcertovalorseelaforverdadeira,ououtrovalorseelaforfalsa.Suasintaxe:
condio ? valorSeVerdadeira : valorSeFalsa
Noteque,aocontrriodeif,aousarmosooperadorcondicional?:precisamossempreprovertantoovalor
paraocasodeacondioserfalsaquantoovalorparaocasodeelaserverdadeira.
Ooperadorcondicionalpodeserusadoemsituaescomoessa:
int horaAbertura = (diaSemana == DOMINGO) ? 11 : 9;
printf ("Abrimos s %d horas", horaAbertura);
Ouseja,seodiadasemanafordomingo,avarivelhoraAberturaserdefinidapara11casocontrrio,
serdefinidapara9.
Outroexemplo:
if (numMensagens > 0) {
printf ("Voc tem %d mensage%s",
numMensagens,
(numMensagens > 1) ? "ns" : "m");
}
Nestecaso,oprogramautilizaria"mensagens"casohouvessemaisdeumamensagem,e"mensagem"caso
houvesseapenasumamensagem.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 44/156
Loops
Loopssoconjuntosdeinstruesquedevemserexecutadasrepetidasvezes,enquantoumacondiofor
verdadeira.EmCh3tiposdeloops:while,do...whileefor.
while
Oloopwhiletestaumacondioseelaforverdadeira,oblococorrespondenteexecutadoeoteste
repetido.Seforfalsa,aexecuocontinualogoapsobloco.Asintaxedewhile:
while (condio) {
...
}
Porexemplo:
while (a < b)
{
printf ("%d menor que %d", a, b);
a++;
}
Estecdigoseriaexecutadoatqueafosseigualabseafosseigualoumaiorqueb,nadaseria
executado.Porexemplo,parab=10ea<10,altimamensagemqueousurioveria"9menorque
10".
Reparequeoloopwhilecomofosseumif,ouseja,oblocoexecutadoseacondioforverdadeira.A
diferenaqueaofinaldaexecuo,owhileexecutadonovamente,masoifno.Noloopwhile(assim
comonosloopsdoefor)tambmpodemosusarasintaxeabreviadaparaapenasumainstruo:
while (a < b)
a++;
Loopsinfinitos
Vocpodefazerloopsinfinitoscomwhile,usandoumacondioquesempreverdadeira,como"1==1"
ousimplesmente"1"(que,comoqualquervalornonulo,considerado"verdadeiro"):
while (1) {
...
}
Vocpodesairdeumloopinfinitoounocomainstruobreak,quevocjviunotesteswitche
serexplicadamaisabaixo.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 45/156
do...while
Oloop"do...while"exatamenteigualao"while"excetoporumaspecto:acondiotestadadepois
dobloco,oquesignificaqueoblocoexecutadopelomenosumavez.Aestruturado...whileexecutao
bloco,testaacondioe,seestaforverdadeira,voltaparaoblocodecdigo.Suasintaxe:
do {
...
} while (condio);
Noteque,aocontrriodasoutrasestruturasdecontrole,necessriocolocarumpontoevrgulaapsa
condio.
do
{
printf ("%d\n", a);
a++;
}
while (a < b);
Umexemplodeutilizaodedo...whileemummenu.Pediramosqueousurioescolhesseumaopo
atqueeleescolhesseumaopovlida:
#include <stdio.h>

int main ()
{
int i;
do {
printf ("Escolha a fruta pelo nmero:\n\n");
printf ("\t(1) Mamo\n");
printf ("\t(2) Abacaxi\n");
printf ("\t(3) Laranja\n\n");
scanf("%d", &i);
} while (i < 1 || i > 3);

switch (i) {
case 1:
printf ("Voc escolheu mamo.\n");
break;
case 2:
printf ("Voc escolheu abacaxi.\n");
break;
case 3:
printf ("Voc escolheu laranja.\n");
break;
}
return 0;
}
for
Oloopfornadamaisqueumaabreviaodoloopwhile,quepermitequealgumainicializaosejafeita
antesdoloopequeumincremento(oualgumaoutraao)sejafeitaapscadaexecuosemincluiro
cdigodentrodobloco.Asuaformageral
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 46/156
for (inicializao; condio; incremento) {
instrues;
}
Eequivalea
inicializao;
while (condio) {
instrues;
incremento;
}
Umexemplodousodefor:
for (a = 1; a < 10; a++) {
if(a == 1)
puts ("Numero de voltas previstas 9.");
printf("Numero de loop ou volta : %i ", a );
printf("Valor de a : %i ", a );
}
Nesseexemplo,primeirodefinimosovalordeacomo1depois,ocdigo(...)repetidoenquantoafor
menorquedez,incrementandoemumaunidadeovalordeaapscadaexecuodocdigo.Analisando
essascondies,vocpoderaperceberqueocdigoserexecutadonovevezes:naprimeiraexecuo,
temosa = 1apsanonaexecuo,aiguala10,eportantoobloconosermaisrepetido.
Tambmpodemosdarmaisdeumainstruodeinicializaooudeincremento(separadasporvrgula),
almdepoderusarnaturalmentecondiescompostascomousodosoperadoreslgicos:
for (a = 1, b = 1; a < 10 && (b / a) < 20; a++, b *= 2) {
...
}
Nesseexemplo,"a"e"b"soinicializadoscomovalor1.Acadaloop,ovalorde"a"incrementadoem
umaunidadeeode"b"dobrado.Issoocorreenquanto"a"formenorque10earazoentre"b"e"a"for
menorque20.Sevocconstruirumatabelacomosvaloresdecadavarivelacadaloop(oucolocar
algumcontadordentrodoloop),verqueocorremoitoexecues.
Assimcomowhile,oloopfortestaacondioseacondioforverdadeiraeleexecutaobloco,fazo
incrementoevoltaatestaracondio.Elerepeteessasoperaesatqueacondiosejafalsa.
Podemosomitirqualquerumdoselementosdoforsedesejarmos.Seomitirmosainicializaoeo
incremento,ocomportamentoserexatamenteigualaodewhile.Seomitirmosacondio,ficaremoscom
umloopinfinito:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 47/156
for (inicializao; ; incremento) {
...
}
Podemostambmomitiroblocodecdigo,senosinteressarapenasfazerincrementosousequisermos
esperarporalgumasituaoqueestabelecidaporumafunoexternanessecaso,usamosopontoe
vrgulaapsosparntesesdefor.Issotambmvalidoparaoloopwhile:
for (inicializao; condio; incremento) ;
while (condio) ;
Porexemplo,suponhaquetemosumabibliotecagrficaquetemumafunochamadagraphicsReady(),
queindicasepodemosexecutaroperaesgrficas.Estecdigoexecutariaafunorepetidasvezesat
queelaretornasse"verdadeiro"eentopudssemoscontinuarcomoprograma:
while (!graphicsReady()) ;
breakecontinue
Vocjviubreaksendousadoparasairdotesteswitchnoentanto,elefuncionatambmnosloops
while,doefor.Nostrscasos,elesaidoltimoloopiniciado(mesmoquehajamaisdeum).Por
exemplo:
while (1) {
if (a > b)
break;
a++;
}
breaksemprefazcomqueaexecuodoprogramacontinuenaprimeirainstruoseguinteaoloopou
bloco.
Ainstruocontinueparecidacombreak,pormaoexecutlasaltamosparaaprximaiteraoloop
aoinvsdeterminlo.Usarcontinueequivaleachegaraofinaldoblocoosincrementossorealizados
(seestivermosemumloopfor)eacondioreavaliada(qualquerquesejaoloopatual).
#include <stdio.h>

int main()
{
int opcao = 0;
while (opcao != 5)
{
printf("Escolha uma opo entre 1 e 5: ");
scanf("%d", &opcao);

/* se a opo for invlida, volta ao incio do loop */
if (opcao > 5 || opcao < 1) continue;
switch (opcao)
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 48/156
{
case 1:
printf("\n --> Primeira opcao..");
break;
case 2:
printf("\n --> Segunda opcao..");
break;
case 3:
printf("\n --> Terceira opcao..");
break;
case 4:
printf("\n --> Quarta opcao..");
break;
case 5:
printf("\n --> Abandonando..");
break;
}
}

return 0;
}
Esseexemplorecebeumaopodousurio.Seeledigitarumaopoinvlida(ouseja,noforum
nmerode1a5),ainstruocontinuevoltaraocomeodoloopeoprogramapedirnovamentea
entradadousurio.Seeledigitarumaopovlida,oprogramaseguirnormalmente.
Saltosincondicionais:goto
Ogotoumainstruoquesaltaincondicionalmenteparaumlocalespecficonoprograma.Esselocal
identificadoporumrtulo.Asintaxedainstruogoto:
goto nome_do_rtulo;
Osnomesdertulosoidentificadoressufixadospordoispontos(:),nocomeodeumalinha(podendo
serprecedidosporespaos).Porexemplo:
nome_do_rtulo:
...

goto nome_do_rtulo;
Muitosprogramadoresevitamusarogotopoisamaioriadossaltospodeserfeitademaneiramaisclara
comoutrasestruturasdalinguagemC.Namaioriadasaplicaesusuais,podesesubstituirogotopor
testes,loopsechamadasdefunes.
Terminandooprograma
Oprogramapodeserterminadoimediatamenteusandoafunoexit:
void exit (int codigo_de_retorno);
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 49/156
Parautilizladevesecolocarumincludeparaoarquivodecabealhostdlib.h.Estafunoabortaa
execuodoprograma.Podeserchamadadequalquerpontonoprogramaefazcomqueoprograma
termineeretorne,paraosistemaoperacional,ocdigo_de_retorno.Aconvenomaisusadaqueum
programaretornezeronocasodeumtrminonormaleretorneumnmerononulonocasodeter
ocorridoumproblema.
#include <stdio.h>
#include <stdlib.h> /* Para a funo exit() */

int main (void)
{
FILE *fp;
...
fp=fopen ("exemplo.bin","wb");
if (!fp)
{
printf ("Erro na abertura do arquivo. Fim de programa.");
exit (1);
}
...
return 0;
}
Funes
Estemduloprecisaserrevisadoporalgumqueconheaoassunto(discuta).
Oquefuno
Umafunoumpedaodecdigoquefazalgumatarefaespecficaepodeserchamadodequalquer
partedoprogramaquantasvezesdesejarmos.
Podemostambmdizerquefunesagrupamoperaesemumsnomequepodeserchamadoem
qualquerpartedoprograma.Essasoperaessoentoexecutadastodasasvezesquechamamosonome
dafuno.
Utilizamosfunesparaobter:
Clarezadocdigo:separandopedaosdecdigodafunomain(),podemosentendermais
facilmenteoquecadapartedocdigofaz.Almdisso,paraprocurarmosporumacertaaofeita
peloprograma,bastabuscarafunocorrespondente.Issotornamuitomaisfciloatodeprocurar
porerros.
Reutilizao:muitasvezesqueremosexecutarumacertatarefavriasvezesaolongodoprograma.
Repetirtodoocdigoparaessaoperaomuitotrabalhoso,etornamaisdifcilamanutenodo
cdigo:seacharmosumerronessecdigo,teremosquecorrigiloemtodasasrepetiesdocdigo.
Chamarumafunodiversasvezescontornaessesdoisproblemas.
Independncia:umafunorelativamenteindependentedocdigoqueachamou.Umafuno
podemodificarvariveisglobaisouponteiros,maslimitandoseaosdadosfornecidospelachamada
defuno.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 50/156
Aideiafunespermitirvocencapsularvriasoperaesemumsescopoquepodeserinvocadoou
chamadoatravsdeumnome.Assimpossvelentochamarafunodevriaspartesdoseuprograma
simplesmenteusandooseunome.
Exemplo:
#include <stdio.h>
int main(void) {
imprime_par(3,4);
imprime_par(-2,8);
return 0;
}
Noexemploacima,afunoimprime_parfoiusadaparaexecutaropedaodeprogramaqueimprime
umpardenmeros.Asadadoprogramaacimaser:
{3,4}
{-2,8}
Afunoimprime_pardefinidadaseguinteforma:
void imprime_par(int a, int b)
{
printf("{ %d, %d }\n",a,b);
}
OprogramacompletoemCmostradoabaixo:
#include <stdio.h>

/**
* Declarao da funo imprime_par
* Essa funo recebe dois inteiros como argumento e os imprime
* da seguinte forma {a,b}
*/
void imprime_par(int a, int b);


int main(int argc, char **argv)
{
imprime_par(3,4); //chamando a funo
imprime_par(-2,8); //chamando novamente
return 0;
}

//Implementao da funo
//A implementao da funo pode conter vrias linhas de cdigo
void imprime_par(int a, int b)
{
printf("{ %d, %d }\n",a,b);
}
AdefiniodefunesemCdevemserfeitasantesdousodasmesmas.Porissoemnossoexemplo
definimosafunoimprime_parantesdeusladentrodomain.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 51/156
Alinhaquedefineoudeclaraafunotambmconhecidacomoassinaturadafuno.Normalmenteas
assinaturasdasfunessodefinidasdentrodearquivosdecabealho.h
Definindoumafuno
Umafunopodenecessitardealgunsdadosparaquepossarealizaralgumaaobaseadaneles.Esses
dadossochamadosparmetrosdafuno.Almdisso,afunopoderetornarumcertovalor,que
chamadovalorderetorno.Osparmetros(eseustipos)devemserespecificadosexplicitamente,assim
comootipodovalorderetorno.
Aformageraldadefiniodeumafuno:
[tipo de retorno da funo] [nome da funo] (1 parmetro, 2 parmetro, )
{
//cdigo
}
Paraonomedafunoedosparmetrosvalemasmesmasregrasqueforamdadasparaosnomesde
variveis.Nopodemosusaromesmonomeparafunesdiferentesemumprograma.
Todasasfunesdevemserdefinidasantesdafunomain,oudeveserfeitooprottipoda
funo,queveremosmaisadiante.
Ocdigodeveestarobrigatoriamentedentrodaschavesefuncionacomoqualqueroutrobloco.
Valorderetorno
Freqentemente,umafunofazalgumtipodeprocessamentoouclculoeprecisaretornaroresultado
desseprocedimento.EmC,issosechamavalorderetornoepodeserfeitocomainstruoreturn.Para
poderretornarumvalor,precisamosespecificarseutipo(char,int,float,doubleevariaes).Para
efetivamenteretornarumvalor,usamosainstruoreturnseguidadovalorderetorno,quepodeounovir
entreparnteses.Umexemplobemsimplesdefunoqueretornaumvalorinteiro:
int tres()
{
return 3; // poderia tambm ser return (3);
}
Otipoderetorno,almdostiposnormaisdevariveis(char,int,float,doubleesuasvariaes),podesero
tipoespecialvoid,quenaverdadesignificaquenohvalorderetorno.
NotaMuitoslivrosdizemqueafunomaintemtipoderetornovoid,oquenoestcorreto.
SegundoopadrodalinguagemC,afunomaindeveterretornodotipoint.Compiladores
comoogccdaromensagensdeerrocasoafunomain()nosejadefinidacorretamente.
Parmetros
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 52/156
Comojfoidito,umparmetroumvalorquefornecidofunoquandoelachamada.comum
tambmchamarosparmetrosdeargumentos,emboraargumentoestejaassociadoaovalordeum
parmetro.
Osparmetrosdeumafunopodemseracessadosdamesmamaneiraquevariveislocais.Elesna
verdadefuncionamexatamentecomovariveislocais,emodificarumargumentonomodificaovalor
originalnocontextodachamadadefuno,pois,aodarumargumentonumachamadadefuno,ele
copiadocomoumavarivellocaldafuno.Anicamaneirademodificarovalordeumparmetrousar
ponteiros,queserointroduzidosmaisadiante.
Paradeclararapresenadeparmetros,usamosumalistadeparmetrosentreparnteses,comos
parmetrosseparadosporvrgulas.Cadadeclaraodeparmetrofeitademaneirasemelhante
declaraodevariveis:aformageraltipo nome.Porexemplo:
int funcao (int a, int b)
float funcao (float preco, int quantidade)
double funcao (double angulo)
Paraespecificarqueafunonousanenhumparmetro,alistadeparmetrosdeveconterapenasa
palavrachavevoid.Noentanto,elafreqentementeomitidanessescasos.Portanto,vocpoderia
escreverqualquerumadestasduaslinhas:
void funcao (void)
void funcao ()
Notequeosnomesdosparmetrossousadosapenasnaprpriafuno(paradistinguirosargumentos)
elesnotmnenhumarelaocomasvariveisusadasparachamarafuno.
Chamadasdefunes
Paraexecutarumafuno,fazemosumachamadadefuno,queumainstruocompostapelonome
dafuno,seguidopelalistadeargumentosentreparnteses:
nome_da_funo (arg1, arg2, ...);
Osargumentospodemserqualquertipodeexpresso:podemservariveis,valoresconstantes,expresses
matemticasouatmesmooutraschamadasdefuno.
Lembrequevocdevesempredaromesmonmerodeargumentosqueafunopede.Almdisso,
emboraalgumasconversesdetiposejamfeitasautomaticamentepelocompilador,vocdeveatenderaos
tiposdeargumentos.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 53/156
Notequeovalordosargumentoscopiadoparaafuno,demaneiraqueasvariveisoriginais
ficaminalteradasmesmoquenafunotentemosalterlas.Aissochamamospassagemde
argumentosporvalor(aocontrriodeporreferncia).Veremoscomomodificarasvariveis
originaisnaseoPonteiros.
Aprpriachamadadefunotambmumaexpressocujovalorovalorderetornodafuno,bastando
coloclanoladodireitodeumsinaldeigualparaguardarovalornumavarivel.Porexemplo,seafuno
"quadrado"retornaoquadradodeumnmerointeiro,podemosfazerassimparacalcularoquadradode11
navarivelx:
int x = quadrado (11);
Doisexemplos
#include <stdio.h>

int quadrado (int x)
{
return (x * x);
}

void saudacao (void)
{
printf ("Ol!\n");
}

void despedida (void)
{
printf ("Fim do programa.\n");
}

int main ()
{
int numero, resultado;
saudacao ();

printf ("Digite um nmero inteiro: ");
scanf ("%d", &numero);
resultado = quadrado (numero);
printf ("O quadrado de %d %d.\n", numero, resultado);

despedida ();
return 0;
}
Vocverianatela,aoexecutaroprograma:
Ol!
Digite um nmero inteiro: 42
O quadrado de 42 1764.
Fim do programa.
Repareque,aochegarnachamadadeumafuno,oprogramapassaocontroleparaessafunoe,aps
seutrmino,devolveocontroleparaainstruoseguintenafunooriginal.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 54/156
Maisumexemplo,comumafunode3argumentos:
#include <stdio.h>

/* Multiplica 3 numeros */
void mult (float a, float b, float c)
{
printf ("%f",a*b*c);
}

int main ()
{
float x, y;
x = 23.5;
y = 12.9;
mult (x, y, 3.87);
return 0;
}
ProttipoouDeclaraodefuno
QuandoumprogramaCestsendocompiladoeumachamadadefunoencontrada,ocompilador
precisasaberotipoderetornoeosparmetrosdafuno,paraqueelepossamanipulloscorretamente.O
compiladorstemcomosaberissoseafunojtiversidodefinida.Portanto,setentarmoschamaruma
funoqueestdefinidaabaixodalinhaondeestamosfazendoachamada,oumesmoemoutroarquivo,o
compiladordarumamensagemdeerro,poisnoconseguiureconhecerafuno.
//Exemplo de erro de chamada de funo
int main()
{
int a = 1;
int b = 2;
soma(a,b); // erro: a funo est definida abaixo desta linha!
}
void soma(int a, int b)
{
printf("%d", a+b);
}
Nessescasos,podemosdeclararumafunoantesdedefinila.Issofacilitaotrabalhodeusardiversas
funes:vocnoprecisarseimportarcomaordememqueelasaparecemnosarquivos.
Adeclaraodefuno(tambmchamadadeprottipodefuno)nadamaisqueadefiniodafuno
semoblocodecdigo.Comoumainstruo,eladeveserseguidadeumpontoevrgula.Portanto,para
declararafuno:
int quadrado (int x)
{
return (x * x);
}
escreveramos:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 55/156
int quadrado (int x);
Numadeclarao,tambmpodemosomitirosnomesdosparmetros,jqueestessoignoradosporquem
chamaafuno:
int quadrado (int);
Poderamos,porexemplo,reorganizaroinciodoprogramaexemplodadoumpoucoacima,oque
permitiriacolocarasfunesemqualquerordemmesmoquehouvesseinterdependnciaentreelas:
#include <stdio.h>

int quadrado (int x);
void saudacao (void);
void despedida (void);

// seguem as funes do programa
Notequeadefiniodafunonodevecontradizeradeclaraodamesmafuno.Seissoocorrer,uma
mensagemdeerroserdadapelocompilador.
Variveislocaisversusglobais
Quandodeclaramosasvariveis,nspodemosfazlo
Dentrodeumafuno
Foradetodasasfunesinclusiveamain().
Asprimeirassoasdesignadascomolocais:stmvalidadedentrodobloconoqualsodeclaradas.As
ltimassoasglobais,elasestovigentesemqualquerumadasfunes.
Quandoumafunotemumavarivellocalcomomesmonomedeumavarivelglobalafunodar
prefernciavarivellocal.Daquiconcluiseebemque,podemostervariveiscomomesmonome,oque
contradizoquensdissemosnocapitulodasvariveis.
Entoreformulamos:
Apenasnasituaoemquetemos2variveislocaisquecolocadaarestriodetermosnomes
diferentescasocontrrionoconseguiramosdistinguirumadaoutra.
"largo"e"alto"sovariveisinternasfazempartede"minhaFuncion()".
/*espanhol para incultos :)*/ <== Comentrios da funo
void minhaFuncion()
{
double largo = 5;
double alto = 6;
}
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 56/156
Asvariveislargoealtonoestodefinidasaquiabaixo,istoquerdizerqueelasnaotemnemumvalor.
Enopodemosusarosvaloresdefinidodentroda"minhaFuncion",poisnohnenhumainstruoque
definaquevalorusar.Lembrese:Ocomputadornovaiadivinharqualvalorusar.Devesedefinircada
instruo.
void calcular() /*No houve definio de valor entre parenteses*/
{
long superficie = largo * alto; /*Error bip bip valor nao definido*/
return(superficie);
}
Nesseexemploabaixo,poderemosusarovalordasvariveisexternasdentrodetodasasfunes.
Exemplo:
#include <stdio.h>
/* Variaveis externas */
long largo = 10;
long alto = 20;

void F_soma ()
{
/*soma uma variavel interna
e largo e alto sao variaveis externas */
long soma = largo + alto ;
printf("largo + alto = %i \n", soma);
}

long calcular()
{
long superficie = largo * alto;
return superficie;
}

int main(void)
{
F_somma ();
printf("Superficie : %ld \n", calcular() );
return 0 ;

}
CuriosidadeApalavrareservada"auto"serveparadizerqueumavarivellocal,masautilizaode
autonomaisnecessriapoisasvariveisdeclaradasdentrodeumblocojsoconsideradaslocais.
Passagemdeparmetrosporvaloreporreferncia
Oquenstemosfeitoquandochamamosumafunoaditachamadaporvalor.Querdizer,quando
chamamosumafunoepassamosparmetrosparaafunoprottipoedepoisparaafunodefinio,o
valordosargumentospassadossocopiadosparaosparmetrosdafuno.Estesexistem
independentementedasvariveisqueforampassadas.Elestomamapenasumacpiadovalorpassado,e
seessevalorforalteradoovalordosargumentospassadosnosoalterados.Ouseja,nosoalteradosos
valoresdosparmetrosforadafuno.Estetipodechamadadefunodenominadochamada(ou
passagemdeparmetros)porvalor.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 57/156
Ditodeoutramaneira.Passamosavarivela,elaentranadefiniodafunocomocopiadeaeentra
comovarivelb.Seavarivelbforalteradanodecorrerdafuno,ovalordeanoalterado.
#include <stdio.h>
float quadrado(float num); //prottipo da funo quadrado()
int main ()
{
float num, res; //declaro 2 variveis: num , res
printf("Entre com um numero: ");
scanf("%f", &num); //associo o valor inserido varivel num
res = quadrado(num); //chamo a funo quadrado e passo o parmetro num
printf("\n\nO numero original e: %f\n", num);
printf("e seu quadrado vale: %f\n", res);
getchar();
return 0;
}
float quadrado (float num) //descrio da funo quadrado
{
return num * num; //retorna num ao quadrado
}
Quandoafunomain()executada,elachegaameioevumachamadaparaafunoquadrado()e
ondepassadooparmetro"num".Elajestavaaespera,pois"viu"oprottipo.Elaentovaiexecutara
funoqueestdepoisdafunodomain().Eoqueacontecequeo"num",vaificarcomodobrodo
valor.Essevalordomain()vaientrarnovamentenomain().Eassociadovarivel"res".Depoistemos
aimpressodavarivel"num"e"res".Oraoqueacontecequeovalordo"num"ficaigualaovalor
antesdeentrarnafuno.Fazemosamesmacoisaagoracomavarivel"a"e"b",evemosqueagoraa
funoaalterada.Resumindo,ovalorvarivelquandoentranumaoutrafunonoalterado(na
passagemporvalor).
Quandoovalordoparmetroalteradodenominamoschamada(oupassagem)porreferncia.OCno
fazchamadasporreferncia.MaspodemossimularistocomoutraarmadoCquesoosponteiros,que
seromelhorexplicadosmaisadiante.
void
Comodissemos,umafunoretornaumvalor.Epodereceberparmetros.Ovoidutilizadodaseguinte
forma:
void funo(void)
{
//codigo
}
Noexemploacima,apalavravoiddefineque:
novaireceberparmetrose
novairetornarqualquervalor.
Oumelhor,voidumaexplicitaodoprogramadorqueaquelafunonovaireceberouretornar
nenhumvalor.
Ovalordafunoignorado,masafunorealmenteretornaumvalor,porissoparaqueoresultadono
sejainterpretadocomoumerroebomdeclararvoid.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 58/156
Nota
Nosepodeutilizarvoidnafunoprincipalmain,apesardeexistiremexemploscomvoidem
algumasbibliografias.Infelizmente,algunscompiladoresaceitamvoidmain().Omain()especiale
temderetornarumint.Umaexecuobemsucedidadoprogramacostumaretornar0(zero)e,em
casodeerro,retorna1(um).
Recursividade
Umafunopodechamarasiprpria.Umafunoassimchamadafunorecursiva.Hvrias
operaesmatemticasrecursivas,dasquaisexemplosbemconhecidossoaseqnciadeFibonaccieo
fatorial.
Daremosoexemplodoclculodofatorialdeumnmero,definidocomooprodutodetodososnmeros
naturais(nonulos)menoresouiguaisaeleporexemplo,5!(lse"cincofatorial")iguala
.Atenoconveno .
Umamaneiradedefiniroalgoritmodefatorial:
Eaimplementaocorrespondenteseriaesta:
#include <stdio.h>
#include <stdlib.h>

int fat(int n)
{
if (n)
return n*fat(n-1);
else return 1;
}

int main()
{
int n;
printf("\n\nDigite um valor para n: ");
scanf("%d", &n);
printf("\nO fatorial de %d e' %d", n, fat(n));
return 0;
}
Exemplo2:
#include <stdio.h>
#include <stdlib.h>

unsigned long fib(unsigned int n){
if (n == 0 || n == 1)
return n;
else
return fib(n - 1) + fib(n - 2);
}

int main(){
int n;
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 59/156
printf("\n\nDigite um valor para n: ");
scanf("%d", &n);
printf("\n F(%d) = %d \n ",n, fib(n));
return 0;

}
Vamosintroduzirovalor5paraesteprograma.
Sofeitasasseguinteschamadasrecursivas.Observeaestruturaupsidedown(rvoredecabeapara
baixo)criadapelaschamadasrecursivas.
Fibonacci(5)
/ \
/ \
/ \
/ \
/ \
F(4) + F(3)
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
F(3) + F(2) F(2) + F(1)
/\ /\ | \ \
/ \ / \ | \ \
/ \ / \ | \ \
/ \ / \ | \ \
F(2) + F(1) F(1) + F(0) F(1) + F(0) 1
/\ | | | | |
/ \ | | | | |
/ \ | | | | |
/ \ | | | | |
F(1) + F(0) 1 1 0 1 0
| |
| |
| |
| |
1 0
Cadavezqueasubrotinachamaasimesmo,eladevearmazenaroestadoatualdasubrotina(linhaatual
queestsendoexecutada,osvaloresdetodasasvariveis,etc)emumaestruturadedadoschamadade
"pilha".
Sevocusararecursividadeduranteumlongoperododetempo,apilhavaificarmuitograndeeo
programadarumamensagemdeaviso.
inline
Umafunoinline,emvezdeserchamada,sermovidaparaolocaldechamadanomomentoda
compilao.
Sefizermosumparalelismocomasdiretivasdecompilao,como#define,elavaisubstituircadachamada
dafunopelaprpriafuno,comofosseumamacro.
Masistostemvantagensparacdigospequenoseparaquemnecessitemuitodavelocidadeno
processamento.Algunscompiladoresjfazemistoautomaticamente.
Paratornarumafunoinlinebastaprecederadeclaraodafunocomonomeinline.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 60/156
inline [tipo_de_retorno] [nome_da_funo] (argumentos)
{
//cdigo
}
Prprocessador
Oprprocessador
OprprocessadorCumprogramaqueexaminaoprogramafonteescritoemCeexecutacertas
modificaesnele,baseadonasdiretivasdecompilao(oudiretivasdoprprocessador).Asdiretivas
decompilaosocomandosquenosocompilados,sendodirigidosaoprprocessador,executadopelo
compiladorantesdaexecuodoprocessodecompilaopropriamentedito.
Portanto,oprprocessadormodificaoprogramafonte,queaindanoestariaprontoparaserentregueao
compilador.Todasasdiretivasdecompilaosoiniciadaspelocaractere#(sharp).Asdiretivaspodem
sercolocadasemqualquerpartedoprograma,masnopodemsercolocadasnamesmalinhaqueoutra
diretivaouinstruo.
Asprincipaisdiretivasdecompilaoso:
#include
#define
#undef
#ifdef
#ifndef
#if
#else
#elif
#endif
Diretivasdecompilao
#include
Adiretiva#includedizaoprprocessadorparaincluirnaquelepontoumarquivoespecificado.Sua
sintaxe:
#include "nome_do_arquivo"
ou
#include <nome_do_arquivo>
Adiferenaentreseusar""e<>somenteaordemdeprocuranosdiretriospeloarquivoespecificado.
Sevocquiserinformaronomedoarquivocomocaminhocompleto,ouseoarquivoestivernodiretrio
detrabalho,use"arquivo".Seoarquivoestivernoscaminhosdeprocuraprespecificadosdo
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 61/156
compilador,isto,seeleforumarquivodoprpriosistema(comoocasodearquivoscomostdio.h,
string.h,etc...),use<arquivo>.
#define
Adiretiva#definetemduasutilidades.Umadelasapenasdefinirumsmboloquepodesertestadomais
tarde.Outradefinirumaconstanteouaindaumamacrocomparmetros.Astrsmaneirasdeusara
diretivaso:
#define nome_do_smbolo
#define nome_da_constante valor_da_constante
#define nome_da_macro(parmetros) expresso_de_substituio
Todavezqueoprprocessadorencontrarnome_da_constantenocdigoasercompilado,eledeve
substituloporvalor_da_constante.
Todavezqueoprprocessadorencontrarnome_da_macro(parmetros),eledevesubstituirpor
expresso_de_substituio,tambmsubstituindoosparmetrosencontradosnaexpressode
substituiofuncionamaisoumenoscomoumafuno.Vejaoexemploparaentendermelhor.
Exemplo1:
#include <stdio.h>
#define PI 3.1416
#define VERSAO "2.02"
int main ()
{
printf ("Programa verso %s\n", VERSAO);
printf ("O numero pi vale: %f\n", PI);
return 0;
}
Exemplo2:
#define max(A, B) ((A > B) ? (A) : (B))
#define min(A, B) ((A < B) ? (A) : (B))
...
x = max(i, j);
y = min(t, r);
Aqui,alinhadecdigo:x = max(i, j);sersubstitudapelalinha:x = ((i) > (j) ? (i) : (j));.
Ouseja,atribuiremosaxomaiorvalorentreiouj.
Quandovocutilizaadiretiva#define,nuncadevehaverespaosembranconoidentificador(onomeda
macro).Porexemplo,amacro#define PRINT (i) printf(" %d \n", i)nofuncionarcorretamente
porqueexisteumespaoembrancoentrePRINTe(i).
#undef
Adiretiva#undeftemaseguinteformageral:
#undef nome_da_macro
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 62/156
Elafazcomqueamacroqueaseguesejaapagadadatabelainternaqueguardaasmacros.Ocompilador
passaapartirdestepontoanoconhecermaisestamacro.
#ifdefe#ifndef
Oprprocessadortambmtemestruturascondicionais.Noentanto,comoasdiretivassoprocessadas
antesdetudo,spodemosusarcomocondiesexpressesqueenvolvamconstantesesmbolosdopr
processador.Aestruturaifdefamaissimplesdelas:
#ifdef nome_do_smbolo
cdigo
...
#endif
Ocdigoentreasduasdiretivasssercompiladoseosmbolo(ouconstante)nome_do_smbolojtiver
sidodefinido.Htambmaestruturaifndef,queexecutaocdigoseosmbolonotiversidodefinido.
Lembrequeosmbolodevetersidodefinidoatravsdadiretiva#define.
#if
Adiretiva#iftemaseguinteformageral:
#if expresso
cdigo
...
#endif
Asequnciadedeclaraessercompiladaapenasseaexpressofornecidaforverdadeira.muito
importanteressaltarqueaexpressofornecidanopodeconternenhumavarivel,apenasvalores
constantesesmbolosdoprprocessador.
#else
Adiretiva#elsefuncionacomonaestruturadeblocoif (condio) {...} else {...}:
#if expresso /* ou #ifndef expresso */
cdigo /* ser executado se a expresso for verdadeira */
#else
cdigo /* ser executado se a expresso for falsa */
#endif
Umexemplo:
#define WINDOWS
...
/* cdigo */
...
#ifdef WINDOWS
#define CABECALHO "windows_io.h"
#else
#define CABECALHO "unix_io.h"
#endif
#include CABECALHO
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 63/156
#elif
Adiretiva#elifserveparaimplementarumaestruturadotipoif (condio) {...} else if
(condio) {...}.Suaformageral:
#if expresso_1
cdigo
#elif expresso_2
cdigo
#elif expresso_3
cdigo
.
.
.
#elif expresso_n
cdigo
#endif
Podemostambmmisturardiretivas#elifcom#elseobviamente,sdevemosusarumadiretiva#elsee
eladeveseraltima(antesde#endif).
Usoscomunsdasdiretivas
Umusomuitocomumdasdiretivasdecompilaoemarquivoscabealho,quesprecisam/devemser
includosumavez.Muitasvezesinclumosindiretamenteumarquivovriasvezes,poismuitoscabealhos
dependemdeoutroscabealhos.Paraevitarproblemas,costumaseenvolveroarquivointeirocomum
blococondicionalquessercompiladoseoarquivojnotiverincludo.Paraissousamosumsmbolo
baseadononomedoarquivo.Porexemplo,senossoarquivosechama"cabecalho.h",comumusarum
smbolocomonomeCABECALHO_H:
#ifndef CABECALHO_H
#define CABECALHO_H
.
.
.
#endif
Seoarquivoaindanotiversidoincludo,aochegarnaprimeiralinhadoarquivo,oprprocessadorno
encontrarosmboloCABECALHO_H,econtinuaraleroarquivo,oquelhefardefinirosmbolo.Se
tentarmosincluirnovamenteoarquivo,oprprocessadorpulartodoocontedopoisosmbolojfoi
definido.
Concatenao
OpreprocessadorCofereceduaspossibilidadesparamanipularumacadeiadecaracteres.
Aprimeirausandoooperador#quepermitesubstituiragrafiadeumparmetro.

#include<stdio.h>

int main (void)
{


/* mad equivale a "mad" */
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 64/156
#define String(mad) #mad

printf ( String( Estou aqui ) "\n" );

}
Asegundausandoooperador##queserveparaconcatenarvriosparmetros.
Ex:ban##anaigualabanana.

#include<stdio.h>

int main (void)
{

int teste = 1000 ;

#define CONCAT(x, y) x##y

/* igual a "tes" + "te" */
printf (" %i \n", CONCAT ( tes, te ) );

}
Bibliotecas
Bibliotecas
Bibliotecassoconjuntosdefunesqueforamfeitasporalgumequepodemserusadasporoutros
programassemquenospreocupemoscomocdigodessasfunes.
Almdavantagemdeorganizarocdigo,bibliotecastambmtmavantagemdepoderemserutilizadas
emvriosprogramassemnecessidadedecopiargrandestrechosdecdigobastadizeraocompiladorque
queremosadicionaraquelabibliotecaaoexecutvel.
Porexemplo,vamostentarcriaranossaprpriabiblioteca,comduasfunes:umaparagerarnmeros
(pseudo)aleatrioseumaparacalcularovalordepagamentodeumaamortizaocomjuroscompostos.
Tambmincluiremosumafunoparagerarumnmeroinicialapartirdahoraatual,oquefarcomque
asseqnciasdenmerosnosejamsempreasmesmas.
Chamaremosabibliotecadeteste1.
#include <math.h>
#include <time.h>

int rand_seed = 10;

/* Gerador de nmeros pseudo-aleatrios */
int rand ()
{
rand_seed = rand_seed * 1103515245 + 12345;
return (unsigned int) (rand_seed / 65536) % 32768;
}

void init_seed ()
{
rand_seed = time (NULL);
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 65/156
}

/* Clculo do valor de cada pagamento de uma amortizao
* Dados: vp = valor presente;
* n = nmero de pagamentos;
* i = taxa de juros (em formato decimal)
*/
double vf (double vp, int n, double i)
{
return (vp * i * pow (1 + i, n - 1) /
(pow (1 + i, n) - 1));
}
Aslinhasacimasooarquivodocdigodanossabiblioteca.Abaixoestocdigodeumprogramaque
testaressabiblioteca.Lembresedequeosdoistrechosdevemestaremarquivosseparados.
#include <stdio.h>

int main()
{
int r1, r2, n_pgtos;
double a_vista, juros, v_pgto;

r1 = rand ();
r2 = rand ();
printf ("Nmeros aleatrios: %d, %d\n\n", r1, r2);

printf (" Valor vista: ");
scanf ("%lf", &a_vista);
printf ("Nmero de pagamentos: ");
scanf ("%d", &n_pgtos);
printf (" Taxa de juros: ");
scanf ("%lf", &juros);
juros /= 100; /* converte a porcentagem em nmero */

v_pgto = vf (a_vista, n_pgtos, juros);

printf ("Valor de cada pagamento: %lf\n", v_pgto);

return 0;
}
Algoquevocdeveternotadoquenessearquivonodemosnenhumainformaosobreasfunesvfe
randneleusadas.Realmente,sevoctentarcompilarocdigocomoest,ocompiladordarumaviso
masaotentarcriaroexecutvel,omontadornopodercontinuarpoisnorecebeunenhumainformao
sobreondeasfunesesto.
Paraisso,precisamosrealizartrspassosadicionaisantesdecompilaroprogramateste:
1. Fazerumarquivocabealhocominformaessobreasfunes.Essearquivoserincluidocoma
diretiva#include,damesmamaneiraquecabealhospadrocomo"stdio.h"ou"math.h".
2. Compilarabibliotecaseparadamente.
3. Instruirocompilador/montadoraprocurarpelabibliotecaaocompilaroprogramateste.
Oarquivocabealho
Arquivoscabealhosoarquivosquecontminformaesqueservemparaocompiladorreconhecer
funes("VER:convenesparachamadasafunesoucallingconvention"),macros,tiposdedadose
variveisquenoestonoarquivosendocompilado.Essesarquivoscostumamteraextenso".h"o
caso,porexemplo,doscabealhospadrostdio.hemath.h.AletraHusadapoisainicialdeheader
(cabealhoemingls).
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 66/156
Emumabiblioteca,oscabealhoscontm,osprottiposdasfunesdisponibilizadaspelabibliotecae,
quandonecessrio,sobreostiposdeestruturasusados.Bibliotecasmaiscomplexascostumamdividiressas
funesentrevriosarquivos.
Parafazernossoprpriocabealho,precisamoscolocarasdeclaraesdasfunesdisponveisna
biblioteca:
int rand ();
void init_seed ();
double vf (double, int, double);
Sevocselembradaltimalio,podersugerirquecoloquemosalgumaslinhasamais:
#ifndef _TESTE1_H
#define _TESTE1_H

int rand ();
void init_seed ();
double vf (double, int, double);

#endif
Agora,semprequeprecisarmosusarabibliotecateste1,bastaincluiroarquivoteste1.hnoinciodonosso
programa:
#include "teste1.h"
Notequeseocabealhoestiverinstaladonosdiretriospadrodocompiladoroudosistema,vocdeve
trocarasaspaspelossinaisdemenor/maior(<...>).
Compilaodabiblioteca
Tendosalvoocdigodabibliotecanoarquivoteste1.c,vocdevecompilarabiblioteca.
NoGCC
Compileoarquivofontenormalmente,massemgeraroexecutvel:
gcc -c teste1.c -o libteste1.o
Crieoarquivodabibliotecacomocomandoar.Vocaindanooconhece,masasintaxesimples:
bastadigitarar rv,seguidodonomedoarquivodabibliotecaedepoisdosnomesdosarquivos
objetoaseremincludos(separadosporespaos).NoGCC,asbibliotecasestticascostumamtero
nome"libnome.a".
ar rv libteste1.a libteste1.o
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 67/156
NoMSVisualC++
NoVisualC++,onomepadrodasbibliotecas"nome.lib",assimcomoemvriosoutroscompiladores
paraWindows.Nele,oscomandoscorrespondentesaosdoispassosacimaso:
cl /c teste1.c
lib /out:teste1.lib teste1.obj
Compilaodoprograma
Apscriaroarquivoobjetolibteste1.ocomocomando(gcc -c teste1.c -o libteste1.o)ea
bibliotecaestticacomocomando"ar",vocdeveinstruirocompiladorcomasopesdeediodelinks
parapoderinclulanoseuprograma:
NoGCC:
gcc main.c -L. -l libteste1.a -o main.bin -lm
Noteasopesquevocnoconhecia:-Le-l.Aprimeiraindicaemquediretriodeveserprocuradaa
bibliotecaopontoindicaodiretrioatual.Seessaopoforomitida,ocompiladorprocurarapenasnos
diretriospadro.Asegundaumaopodoeditordelinksindicandoumabibliotecaaserincludao
compiladorprocurarpeloarquivoadicionandooprefixolibeaextenso.a,daanecessidadededaro
nome"libteste1.a"biblioteca.Maisbibliotecaspodemserincludascomoa-lmquenestecasoservepara
chamarabibliotecamathdomath.h,semestecomandoelepoderapresentarumerronahorada
compilao.
NoVisualC++:
link /out:main.exe main.obj teste1.lib
Notequenessecasosimplesmenteespecificamososarquivosquedevemsermontados.Odiretriode
procurapodeserespecificadopelaopo/libpath:diretrio.
Entradaesadaemarquivos
Trabalhandocomarquivos
Jvimoscomopodemosrecebereenviardadosparausurioatravsdotecladoedatelaagoraveremos
tambmcomoleregravardadosemarquivos,oquealismuitoimportanteouatessencialemmuitas
aplicaes.
Assimcomoasfunesdeentrada/sadapadro(tecladoetela),asfunesdeentrada/sadaemarquivos
estodeclaradasnocabealhostdio.hquesignifica"STanDardInputOutput".Alis,asfunespara
manipulaodearquivossomuitosemelhantessusadasparaentrada/sadapadro.Comojdissemosna
seosobreaentradaesadapadres,amanipulaodearquivostambmsedpormeiodefluxos
(streams).
Namanipulaodeumarquivo,hbasicamentetrsetapasqueprecisamserrealizadas:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 68/156
1. abriroarquivo
2. lere/ougravarosdadosdesejados
3. fecharoarquivo.
EmC,todasasoperaesrealizadascomarquivosenvolvemseuidentificadordefluxo,queumavarivel
dotipoFILE *(sobreoqualnocabeagorafalar).Paradeclararumidentificadordefluxo,faacomose
fosseumavarivelnormal:
FILE *fp; // no se esquea do asterisco!
Abrindoefechandoumarquivo
Nosurpreendentemente,aprimeiracoisaquesedevefazerparamanipularumarquivoabrilo.Para
isso,usamosafunofopen().Suasintaxe:
FILE*fopen(char*nome_do_arquivo,char*modo_de_acesso)
Onomedoarquivodeveserumastringoucomocaminhocompleto(porexemplo,
/usr/share/appname/app.confouC:\Documentos\nomes.txt)ouocaminhoemrelaoao
diretrioatual(nomes.txt,../app.conf)doarquivoquesedesejaabriroucriar.
Omododeacessoumastringquecontmumaseqnciadecaracteresquedizemseoarquivo
serabertoparagravaoouleitura.Depoisdeabertooarquivo,vocspoderexecutarostiposde
aoprevistospelomododeacesso:nopoderlerdeumarquivoquefoiabertosomentepara
escrita,porexemplo.Osmodosdeacessoestodescritosnatabelaaseguir.
Modo Significado
r Abreoarquivosomenteparaleitura.Oarquivodeveexistir.(Orvemdoinglsread,ler)
r+ Abreoarquivoparaleituraeescrita.Oarquivodeveexistir.
w
Abreoarquivosomenteparaescritanoinciodoarquivo.Apagarocontedodoarquivoseele
jexistir,criarumarquivonovosenoexistir.(Owvemdoinglswrite,escrever)
w+ Abreoarquivoparaescritaeleitura,apagandoocontedoprexistente.
a
Abreoarquivoparaescritanofinaldoarquivo.Noapagaocontedoprexistente.(Oavemdo
inglsappend,adicionar,apender)
a+ Abreoarquivoparaescritanofinaldoarquivoeleitura.
EmambientesDOS/Windows,aolerarquivosbinrios(porexemplo,programasexecutveisou
certostiposdearquivosdedados),deveseadicionarocaractere"b"aofinaldastringdemodo
(porexemplo,"wb"ou"r+b")paraqueoarquivosejalido/gravadocorretamente.
Issonecessrioporquenomodotexto(opadroquandonoadicionadoob)ocorrem
algumastraduesdecaracteres(porexemplo,aterminaodelinha"\r\n"substitudaapenas
por"\n"naleitura)quepoderiamafetaraleitura/gravaodosarquivosbinrios(indevidamente
inserindoousuprimindocaracteres).
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 69/156
Ovalorderetornodafunofopen()muitoimportante!Eleoidentificadordofluxoquevoc
abriuescomelequevocconseguirlereescrevernoarquivoaberto.
Sehouverumerronaabertura/criaodoarquivo,afunoretornarovalorNULL.Oerro
geralmenteaconteceporduasrazes:
Oarquivonoexiste,casotenhasidorequisitadoparaleitura.
Ousurioatualnotempermissoparaabriroarquivocomomododeacessopedido.Por
exemplo,oarquivosomenteleitura,ouestbloqueadoparagravaoporoutroprograma,
oupertenceaoutrousurioenotempermissoparaserlidoporoutros.
Aoterminardeusarumarquivo,vocdevefechlo.Issofeitopelafunofclose():
intfclose(FILE*fluxo)
Onicoargumentooidentificadordofluxo(retornadoporfopen).Ovalorderetornoindicao
sucessodaoperaocomovalorzero.
Fecharumarquivofazcomquequalquercaracterequetenhapermanecidono"buffer"associadoao
fluxodesadasejagravado.Mas,oqueeste"buffer"?Quandovocenviacaracteresparaserem
gravadosemumarquivo,estescaracteressoarmazenadostemporariamenteemumareade
memria(o"buffer")emvezdeseremescritosemdiscoimediatamente.Quandoo"buffer"estiver
cheio,seucontedoescritonodiscodeumavez.Arazoparasefazeristotemavercoma
eficincianasleiturasegravaesdearquivos.Se,paracadacaracterequefssemosgravar,
tivssemosqueposicionaracabeadegravaoemumpontoespecficododisco,apenaspara
gravaraquelecaractere,asgravaesseriammuitolentas.Assimestasgravaessseroefetuadas
quandohouverumvolumerazoveldeinformaesaseremgravadasouquandooarquivofor
fechado.
Afunoexit()fechatodososarquivosqueumprogramativeraberto.
Afunofflush()foraagravaodetodososcaracteresqueestonobufferparaoarquivo.
Exemplo
Umpequenoexemploapenasparailustraraaberturaefechamentodearquivos:
#include <stdio.h>

int main()
{
FILE *fp;
fp = fopen ("README", "w");
if (fp == NULL) {
printf ("Houve um erro ao abrir o arquivo.\n");
return 1;
}
printf ("Arquivo README criado com sucesso.\n");
fclose (fp);
return 0;
}
Arquivosprdefinidos
NabibliotecapadrodoC,existemalgunsfluxosprdefinidosquenoprecisam(nemdevem)serabertos
nemfechados:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 70/156
stdin:dispositivodeentradapadro(geralmenteoteclado)
stdout:dispositivodesadapadro(geralmenteovdeo)
stderr:dispositivodesadadeerropadro(geralmenteovdeo)
stdaux:dispositivodesadaauxiliar(emmuitossistemas,associadoportaserial)
stdprn:dispositivodeimpressopadro(emmuitossistemas,associadoportaparalela)
Escrevendoemarquivos
Paraescreveremarquivos,hquatrofunes,dasquaistrssoanlogassusadasparasadapadro:
Sadapadro Arquivos Explicao
putchar fputc Imprimeapenasumcaractere.
puts fputs Imprimeumastringdiretamente,semnenhumaformatao.
printf fprintf Imprimeumastringformatada.
N/A fwrite Gravadadosbinriosparaumarquivo.
Aseguirapresentamososprottiposdessasfunes:
voidfputc(intcaractere,FILE*fluxo)
voidfputs(char*string,FILE*fluxo)
voidfprintf(FILE*fluxo,char*formatao,...)
intfwrite(void*dados,inttamanho_do_elemento,intnum_elementos,FILE
*fluxo)
Sintaxequaseigualdeprintf()snecessrioadicionaroidentificadordefluxonoincio.
fwrite
Estafunoenvolveosconceitosdeponteiroevetor,quesseroabordadosmaistarde.
Afunofwrite()funcionacomoasuacompanheirafread(),pormescrevenoarquivo.Seuprottipo:
unsigned fwrite(void *buffer,int numero_de_bytes,int count,FILE *fp);
Afunoretornaonmerodeitensescritos.Estevalorserigualacountamenosqueocorraalgumerro.
Oexemploabaixoilustraousodefwriteefreadparagravareposteriormentelerumavarivelfloatemum
arquivobinrio.
#include <stdio.h>
#include <stdlib.h>
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 71/156

int main()
{
FILE *pf;
float pi = 3.1415;
float pilido;
if((pf = fopen("arquivo.bin", "wb")) == NULL) /* Abre arquivo binrio para escrita */
{
printf("Erro na abertura do arquivo");
exit(1);
}
if(fwrite(&pi, sizeof(float), 1,pf) != 1) /* Escreve a varivel pi */
printf("Erro na escrita do arquivo");
fclose(pf); /* Fecha o arquivo */
if((pf = fopen("arquivo.bin", "rb")) == NULL) /* Abre o arquivo novamente para leitura */
{
printf("Erro na abertura do arquivo");
exit(1);
}
if(fread(&pilido, sizeof(float), 1,pf) != 1) /* Le em pilido o valor da varivel armazenada anteriormente */
printf("Erro na leitura do arquivo");
printf("\nO valor de PI, lido do arquivo e': %f", pilido);
fclose(pf);
return 0;
}
Notaseousodooperadorsizeof,queretornaotamanhoembytesdavariveloudotipodedados.
fputc
Afunofputcaprimeirafunodeescritadearquivoqueveremos.Seuprottipo:
int fputc (int ch, FILE *fp);
Escreveumcaracterenoarquivo.Oprogramaaseguirlumastringdotecladoeescrevea,caracterepor
caractereemumarquivoemdisco(oarquivoarquivo.txt,queserabertonodiretriocorrente).
#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *fp;
char string[100];
int i;
fp = fopen("arquivo.txt","w"); /* Arquivo ASCII, para escrita */
if(!fp)
{
printf( "Erro na abertura do arquivo");
exit(0);
}
printf("Entre com a string a ser gravada no arquivo:");
gets(string);
for(i=0; string[i]; i++) putc(string[i], fp); /* Grava a string, caractere a caractere */
fclose(fp);
return 0;
}
Depoisdeexecutaresteprograma,verifiqueocontedodoarquivoarquivo.txt(vocpodeusarqualquer
editordetextos).Vocverqueastringquevocdigitouestarmazenadanele.
Lendodearquivos
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 72/156
Novamente,hquatrofunes,dasquaistrsseassemelhamsusadasparaasadapadro:
Sadapadro Arquivos Explicao
getchar fgetc Recebeapenasumcaractere.
gets fgets Lumastring(geralmenteumalinhainteira).
scanf fscanf Recebeumastringformatada.
N/A fread Ldadosbinriosdeumarquivo.
intfgetc(FILE*fluxo)
voidfgets(char*string,inttamanho,FILE*fluxo)
voidfscanf(FILE*fluxo,char*formatao,...)
intfread(void*dados,inttamanho_do_elemento,intnum_elementos,FILE
*fluxo)
Estemdulotemaseguintetarefapendente:criarexemplosdeusodasfunes
fgetc
Estfunorequercomoparmetrooindicadordefluxodoarquivo,retornaumcaracteredo
arquivoouEOF,casoocorraumerroouofinaldoarquivosejaatingido,podendoserverificado
respectivamenteporferrorefeof.
Exemplo:
#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *fl;
int c;

if((fl = fopen("caminho/do/arquivo", "r")) == NULL)
{
perror("Erro: fopen");
exit(EXIT_FAILURE);
}

while((c = fgetc(fl)) != EOF)
printf("Caractere lido: %c\n", c);

if((c == EOF) && (feof(fl) == 0) && (ferror(fl) != 0))
perror("Erro: fgetc");
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 73/156


fclose(fl);
return EXIT_SUCCESS;
}
fgets
Aochamarafunofgets(),vocdeveforneceroponteiroparaastringondeosdadoslidosdevem
serguardados,almdotamanhomximodosdadosaseremlidos(paraqueamemriareservada
stringnosejaultrapassada).
Paraselerumastringnumarquivopodemosusarfgets()cujoprottipo:
char *fgets (char *str, int tamanho,FILE *fp);
Afunorecebe3argumentos:astringaserlida,olimitemximodecaracteresaseremlidoseoponteiro
paraFILE,queestassociadoaoarquivodeondeastringserlida.Afunolastringatqueum
caracterdenovalinhasejalidooutamanho1caracterestenhamsidolidos.Seocaracterdenovalinha
('\n')forlido,elefarpartedastring,oquenoaconteciacomgets.
Afunofgetssemelhantefunogets(),porm,almdelapoderfazeraleituraapartirdeumarquivo
dedadoseincluirocaracterdenovalinhanastring,elaaindaespecificaotamanhomximodastringde
entrada.Comovimos,afunogetsnotinhaestecontrole,oquepoderiaacarretarerrosde"estourode
buffer".Portanto,levandoemcontaqueoponteirofppodesersubstitudoporstdin,comovimosacima,
umaalternativaaousodegetsusaraseguinteconstruo:
fgets (str, tamanho, stdin);
fscanf
Sintaxequaseigualdescanf()snecessrioadicionaroidentificadordefluxonoincio.
fscanf
Afunofscanf()funcionacomoafunoscanf().Adiferenaquefscanf()ldeumarquivoenodo
tecladodocomputador.Prottipo:
int fscanf (FILE *fp,char *str,...);
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *p;
char str[80],c;
printf("\n\n Entre com um nome para o arquivo:\n"); /* Le um nome para o arquivo a ser aberto: */
gets(str);
if (!(p = fopen(str,"w"))) /* Caso ocorra algum erro na abertura do arquivo..*/
{ /* o programa aborta automaticamente */
printf("Erro! Impossivel abrir o arquivo!\n");
exit(1);
}
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 74/156
fprintf(p,"Este e um arquivo chamado:\n%s\n", str);
fclose(p); /* Se nao houve erro, imprime no arquivo, fecha ...*/
p = fopen(str,"r"); /* abre novamente para a leitura */
while (!feof(p))
{
fscanf(p,"%c",&c);
printf("%c",c);
}
fclose(p);
return 0;
}
fread
Essafunoenvolveosconceitosdeponteiroevetor,quesseroabordadosmaistarde.
Podemosescreverelerblocosdedados.Paratanto,temosasfunesfread()efwrite().Oprottipode
fread():
unsigned fread (void *buffer, int numero_de_bytes, int count, FILE *fp);
Obufferaregiodememrianaqualseroarmazenadososdadoslidos.Onmerodebytesotamanho
daunidadeaserlida.countindicaquantasunidadesdevemserlidas.Istosignificaqueonmerototalde
byteslidos:
numero_de_bytes*count
Afunoretornaonmerodeunidadesefetivamentelidas.Estenmeropodesermenorquecountquando
ofimdoarquivoforencontradoouocorreralgumerro.
Quandooarquivoforabertoparadadosbinrios,freadpodelerqualquertipodedados.
Movendopeloarquivo
fseek
Parasefazerprocuraseacessosrandmicosemarquivosusaseafunofseek().Estamoveaposio
correntedeleituraouescritanoarquivodeumvalorespecificado,apartirdeumpontoespecificado.Seu
prottipo:
int fseek (FILE *fp, long numbytes, int origem);
Oparmetroorigemdeterminaapartirdeondeosnumbytesdemovimentaoserocontados.Osvalores
possveissodefinidospormacrosemstdio.heso:
Nome Valor Significado
SEEK_SET 0 Incio do arquivo
SEEK_CUR 1 Ponto corrente no arquivo
SEEK_END 2 Fim do arquivo
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 75/156
Tendosedefinidoapartirdeondeirsecontar,numbytesdeterminaquantosbytesdedeslocamentosero
dadosnaposioatual.
rewind
Voltaparaocomeodoarquivodeumfluxo
feof
EOF("Endoffile")indicaofimdeumarquivo.svezes,necessrioverificarseumarquivochegouao
fim.Paraistopodemosusarafunofeof().ElaretornanozeroseoarquivochegouaoEOF,caso
contrrioretornazero.Seuprottipo:
int feof (FILE *fp);
Outraformadeseverificarseofinaldoarquivofoiatingidocompararocaracterelidoporgetccom
EOF.Oprogramaaseguirabreumarquivojexistenteeol,caracterporcaracter,atqueofinaldo
arquivosejaatingido.Oscaractereslidossoapresentadosnatela:
#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *fp;
char c;
fp = fopen("arquivo.txt","r"); /* Arquivo ASCII, para leitura */
if(!fp)
{
printf( "Erro na abertura do arquivo");
exit(0);
}
while((c = getc(fp) ) != EOF) /* Enquanto no chegar ao final do arquivo */
printf("%c", c); /* imprime o caracter lido */
fclose(fp);
return 0;
}
Verifiqueoexemplo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
FILE *p;
char c, str[30], frase[80] = "Este e um arquivo chamado: ";
int i;
printf("\n\n Entre com um nome para o arquivo:\n");
gets(str); /* Le um nome para o arquivo a ser aberto: */
if (!(p = fopen(str,"w"))) /* Caso ocorra algum erro na abertura do arquivo..*/
{
printf("Erro! Impossivel abrir o arquivo!\n");
exit(1); /* o programa aborta automaticamente */
}
strcat(frase, str);
for (i=0; frase[i]; i++)
putc(frase[i],p);
fclose(p); /* Se nao houve erro,imprime no arquivo e o fecha ...*/
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 76/156
p = fopen(str,"r"); /* Abre novamente para leitura */
c = getc(p); /* Le o primeiro caracter */
while (!feof(p)) /* Enquanto no se chegar no final do arquivo */
{
printf("%c",c); /* Imprime o caracter na tela */
c = getc(p); /* Le um novo caracter no arquivo */
}
fclose(p); /* Fecha o arquivo */
}
Outrasfunes
Funo Explicao
remove Removeumarquivoespecificado
ferroreperror
Prottipodeferror:
int ferror (FILE *fp);
Afunoretornazero,senenhumerroocorreueumnmerodiferentedezerosealgumerroocorreu
duranteoacessoaoarquivo.setornamuitotilquandoqueremosverificarsecadaacessoaumarquivo
tevesucesso,demodoqueconsigamosgarantiraintegridadedosnossosdados.Namaioriadoscasos,se
umarquivopodeseraberto,elepodeserlidoougravado.
Porm,existemsituaesemqueistonoocorre.Porexemplo,podeacabaroespaoemdiscoenquanto
gravamos,ouodiscopodeestarcomproblemasenoconseguimosler,etc.Umafunoquepodeser
usadaemconjuntocomferror()afunoperror()(printerror),cujoargumentoumastringque
normalmenteindicaemquepartedoprogramaoproblemaocorreu.
#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *pf;
char string[100];
if((pf = fopen("arquivo.txt","w")) ==NULL)
{
printf("\nNao consigo abrir o arquivo ! ");
exit(1);
}
do
{
printf("\nDigite uma nova string. Para terminar, digite <enter>: ");
gets(string);
fputs(string, pf);
putc('\n', pf);
if(ferror(pf))
{
perror("Erro na gravacao");
fclose(pf);
exit(1);
}
}while (strlen(string) > 0);
fclose(pf);
}
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 77/156
ExercciosFinais
ProgramaremC/ExercciosFinais
Vetores
Vetores
Vetores,tambmchamadosarrays(doingls)ouarranjoouaindamatrizes,soumamaneirade
armazenarvriosdadosnummesmonomedevarivelatravsdousodendicesnumricos.EmC,vetores
devemsempreconterdadosdomesmotipodevarivel.
Declaramosvetoresdemaneiramuitosemelhantedeclaraodevariveisnormais.Anicadiferena
quedepoisdonomedavariveldeveserinformadaaquantidadedeelementosdovetor.Paradeclarar
umvetorchamadovetor,comcincoelementosinteiros,escrevemos:
int vetor[5];
Notequeaquantidadedeelementosdeumvetornopodeseralteradadepoisqueovetorfordeclarado.
Paracriarvetoresdetamanhodinmico,podemosusarponteiros,queseroabordadosmaisadiante.
Damesmamaneiraquepodemosinicializarumavariveljuntocomsuadeclarao,podemosusaras
chaves({})parainicializarumarray.
int vetor[5] = {17, 42, 9, 33, 12};
Parafazerrefernciaaumvalordeumelementocontidoemumvetor,usamosanotaovetor[ndice],
queservetantoparaobterquantoparadefinirovalordeumelementoespecfico,dadasuaposio.Note
queoselementossonumeradosacomeardozero,e,portanto,seonmerodeelementos ,ondice
ouposiodoltimoelementoser .
vetor[0] = 3;
int x = vetor[2];
int y = vetor[5]; // ERRO!
Repareemquealtimalinhacontmumerro:elareferenciaumelementodovetorquenoexiste.No
entanto,ocompiladornoserecusaracompilaressecdigodarapenasumaviso.Seessalinhafor
executada,avarivelyreceberumvalorquenotemnadaavercomovetor.
Abreviandoasdeclaraes
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 78/156
Aoinicializarumvetorcomvriosvalores,podesertrabalhosocontartodososvaloresparacolocaro
tamanhodovetornadeclarao.Porisso,emCpodemosomitironmerodeelementosquandoosvalores
soinicializadosotamanhodovetorseronmerodevaloresinicializados.Porexemplo,asduas
notaesabaixosoequivalentes:
int valores[5] = {1, 2, 3, 4, 5};
int valores[] = {1, 2, 3, 4, 5};
ExemplodeAplicaodeVetores
Ocdigoabaixodeumprogramaquerecebe5nmerosinteiroseinformaqualdestesmaior.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(void)
{
int vetor[5];
int x, i;

printf ("digite 5 numeros\n");

for (i = 0; i < 5; i++) /*Este laco faz o scan de cada elemento do vetor*/
{
scanf("%d", &vetor[i] );
}
i = 1;
x = vetor[0];

while (i < 5) /*Este laco compara cada elemento do vetor*/
{
if (vetor[i] > x)
{
x = vetor[i];
}
i++;
}

printf("\n O maior numero que voce digitou foi %d .\n",x);
getch ();
return 0;
}
Vetoresmultidimensionais(matrizes)
Podemosdeclararaindamaisvariveis
tipo_da_varivel nome_da_varivel [altura][largura];
Atenoque:
ndicemaisdireitavariamaisrapidamentequeondiceesquerda.
Noesquecerosndicesvariamdezeroaovalordeclaradomenosum.
Podemosteraindaconjuntodevariveismultidimensionais.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 79/156
tipo_da_varivel nome_da_varivel [tam1][tam2] ... [tamN];
ondeainiciao:
tipo_da_varivel nome_da_varivel [tam1][tam2] ... [tamN] = {lista_de_valores};
float vect [6] = { 1.3, 4.5, 2.7, 4.1, 0.0, 100.1 };
int matrx [3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
char str [10] = { 'J', 'o', 'a', 'o', '\0' };
char str [10] = "Joao";
char str_vect [3][10] = { "Joao", "Maria", "Jose" };
Podemos,emalgunscasos,inicializarmatrizesdasquaisnosabemosotamanhoapriori.OcompiladorC
vai,nestecasoverificarotamanhodoquevocdeclaroueconsiderarcomosendootamanhodamatriz.
Istoocorrenahoradacompilaoenopodermaissermudadoduranteoprograma
Argumentosnafunomain
NaseoFunes,dissemosqueafunomain()aceitadoisargumentos,masnofalamosmaispoisum
delesenvolveoconceitodevetores.Agorairemosfalarmaissobreeles.
Osdoisargumentosdemain()indicamosargumentosdadosparaoprogramanalinhadecomando,na
formadeumvetordestrings.
Exemplodeusodeparmetrosnafunomain
// somaComArgcArgv.c

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
int result;
if ( argc != 3 )
{
printf("Digite soma <valor1> <valor2>\n");
return 0;
} // fim if ( argc != 3 )

result = atoi(argv[1]) + atoi(argv[2]);

printf("\nO resultado da soma de %s e %s eh: %d\n", argv[1], argv[2], result);
}
Strings
Estapginaumesboodeinformtica.AmpliandoavocajudaramelhoraroWikilivros.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 80/156
Strings
Strings(Ingls)socadeiasouseqnciasordenadasdecaracteres.Naverdadejtrabalhamoscomstrings
nestelivro,maspreferimosdeixarmaioresexplicaesparaummomentoemquejtivessesido
introduzidooconceitodevetor.
AlinguagemC,aocontrriodeoutraslinguagensdeprogramao,nopossuiumtipodedados
correspondentesstringsnolugar,usamsevetores(eponteiros,comoveremosmaisadiante).EmC,
stringssovetoresdecaracteresterminadospelocaracterenulo('\0').Porexemplo:
char nome[] = {'P', 'e', 'd', 'r', 'o', '\0'};
Noentanto,escreverstringsdessamaneiramuitotrabalhosoporisso,foicriadaumanotaoabreviada
queequivalenotaoacimaeeliminaanecessidadedecolocarocaractereterminador:
char nome[] = "Pedro";
Assimcomonosvetores,podemosacessaremodificarelementosindividuaisdeumastring.Podemos
tambmdiminuirotamanhodeumastring:umavezqueanicamarcaodotamanhooterminador\0,
colocarumterminadoremoutrolocaldeterminaronovofinaldastring.Noentanto,aumentarotamanho
dastringmaisdifcilissoficarparaoutraseo.
Atenoaousarseacentosnumastring.Comoexistemdiferentesformasdecodificarcaracteres
acentuados,otratamentodeumastringdotipo:
char nome[] = "Joo";
podeserdiferentedeumamquinaparaoutra.Nestecaptulonoserotratadosacentos,esteassuntoser
abordadomaisadiante.
Funesdabibliotecapadro
Abibliotecapadrofornecevriasfunesteisparamanipularstrings.Aseguirmostraremosalgumas
delas.Parauslas,vocdeveincluirocabealhostring.hnoinciodosseusarquivos.
strlen
strlenretornaotamanho,emcaracteres,deumastringdada.Naverdadeostrlen()procuraoterminador
destringecalculaadistnciadeleaoinciodastring.Porexemplo:
char nome[15] = "Maria da Silva";
int s = strlen (nome);
// s conter o valor 14
/*TL'*/
strcpy
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 81/156
strcpycopiaocontedodeumastringparaoutraecolocaumterminadordestring.Suasintaxestrcpy
(destino, origem).
char nome[] = "Clarice Lispector";
char nome2[] = "Oswald de Andrade";
strcpy (nome, nome2);
// agora nome conter "Oswald de Andrade"
Tomecuidadocomstrcpy(),poisseastringasercopiadaformaiorqueastringdedestino,provavelmente
vocgravardadosemlugaresindesejadosumproblemaconhecidocomoestourodebuffer.Para
evitaresseproblema,useafunostrncpy,querecebeumterceiroargumentoquecorrespondeao
nmeromximodecaracteresaseremcopiados:
char msg[] = "Bom dia!";
char nome[] = "Maria da Silva";
strncpy (msg, nome, strlen(msg));
// agora msg conter "Maria da"
strcat
strcatconcatenaduasstrings,adicionandoocontedodasegundaaofinaldaprimeira,almdo
terminador(\0).Notequeaprimeirastringdeveterespaosuficienteparaconterasegunda,paraqueno
ocorraum"estourodebuffer".Porexemplo:
char nome[50] = "Maria";
char sobrenome[] = " da Silva";
strcat (nome, sobrenome);
// agora nome contm "Maria da Silva"
Analogamentefunostrncpy,existetambmafunostrncat,ondeonmeromximodecaracteres
aseremcopiadosoterceiroargumento.
strcmp
Sevoctentarcriarduasstringscomomesmocontedoecomparlascomofariacomonmeros,ver
queelas"nosoiguais".Issoocorreporque,naverdade,oqueestsendocomparadosoosendereos
dememriaondeestoguardadasasstrings.Paracompararocontedodeduasstrings,vocdeveusara
funostrcmp(ousuasvariantes):
intstrcmp(char*s1,char*s2)
Ovalorderetorno:
menorquezeroses1formenorques2
igualazeroses1es2soiguais
maiorquezeroses1formaiorques2.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 82/156
Costumaparecerestranhodizerqueumastringmenoroumaiorqueoutranaverdadeessacomparao
entreaprimeiraletraquediferenasduasstrings.Assim,setivermoss1 = "abc"es2 = "abd",
diremosques2maiorques1,poisnaprimeiraposioemqueasduasstringsdiferem,aletraems2
"maior".
importantenotarqueacomparaofeitaporstrcmpdistinguemaisculasdeminsculas.Isto,as
strings"ABC"e"abc"nosoiguaisparaessafuno.
Asvariantesmaisusadasdestrcmpso:
strncmpcomparaapenasosnprimeiroscaracteresdasduasstrings,sendonumterceiro
argumento.
stricmpcomparaduasstringssemdistinoentremaisculaseminsculas.Asintaxeigualde
strcmp.Essafunonofazpartedabibliotecapadro,mascomumenteencontradacomo
extensoparticulardevriasdelas.
strrchr
strrchrRetornaumponteirosobreaultimaocorrnciadecdeumastringapontadaporssenoretorna
NULL.Suasintaxestrrchr(const char *s, int c);.
Exemplo:
char path[50] = "/teste/string";
char *p = strrchr(path, '/');
*p++;
printf("Resultado: %s \n", p );
memcpy
Sintaxe:

#include <string.h>

void *memcpy (void *dest, const void *srce, size_t n);
Descrio:Copiarumblocodenoctetosdesrceparadest.
Ateno:Seasregiesdesrceedestsesobreporemocomportamentodafunoimprevisvel.
Valorderetorno:memcpyretornaovalordedest.
Ex:
#include <stdio.h>
#include <string.h>

int main() {
int tab[2][5] = { { 1, 2, 3, 4, 5,
{11, 12, 13, 14, 15} };
int temp[2][5];

8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 83/156
memcpy(temp, tab, sizeof(tab));
puts("Resultado:\n");
printf("temp[1][4] = %d\n", temp[1][4]);
return 0;
}
memset
Sintaxe:

#include <string.h>

void *memset (void *buffer, int c, size_t n);
Descrio:memsetinicializanoctetosdobuffercomointeiroc.
Valorderetorno:Ovalordobuffer.
Ex:
#include <stdio.h>
#include <string.h>

int main() {
char buf[] = "W.I.K.I.";

printf("Buf antes 'memset': %s\n", buf);
memset(buf, '*', strlen(buf));
printf("Buf depois 'memset': %s\n", buf);
return 0;
}
sprintf
Descrio:Adiferenaentreprintfesprintfequeprintfretornaoresultadoparaasadapadro(tela),
enquantosprintfretornaoresultadoemumavarivel.Istomuitoconveniente,porquevocpode
simplesmentedigitarafrasequevocquerteresprintflidacomaprpriaconversoecolocaoresultado
nastringquevocdeseja.
Sintaxe:

#include <stdio.h>

int sprintf(char *s, const char *formato, ...);
Ex:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 84/156
#include <stdio.h>
#include <string.h>

int main() {
char var[256];
char sobrenome[] = "Simpson";
char nome[] = "Homer";

int idade = 30;

sprintf(var, "%s %s tem %d anos",sobrenome, nome, idade);

printf ("Resultado : %s\n", var);

return 0;
}
Ponteiros
Poderamosescreverumlivrointeirosobreponteiros,poisocontedodemasiadamenteextenso.Poresse
motivoesteassuntofoidivididoembsico,intermedirioeavanado,assimoleitorpoderfazerseus
estudosconformesuasnecessidades.
recomendvelparaquemestvendoprogramaopelaprimeiravezaquiquenosepreocupecomo
avanadosobreponteirosporenquanto.
Bsico
Oqueumponteiro?
Umponteirosimplesmenteumavarivelquearmazenaoendereodeoutravarivel.
Umexemplo:Oqueoponteirodeumrelgio?oqueapontaparaashoras,minutosousegundos.Um
ponteiroapontaparaalgo.Emprogramao,temosasvariveisarmazenadasnamemria,eumponteiro
apontaparaumendereodememria.
Imagineasvariveiscomodocumentos,amemriadocomputadorcomopastasparaguardaros
documentos,eoponteirocomoatalhosparaaspastas.
Nosedesesperecasonoconsigaentendernumprimeiromomento,oconceitoficamaisclarocoma
prtica.
Declarandoeacessandoponteiros
Umponteiro,comoqualquervarivel,deveterumtipo,queotipodavarivelparaaqualeleaponta.
Paradeclararumponteiro,especificamosotipodavarivelparaaqualeleapontaeseunomeprecedido
porasterisco:
int ponteiro ; /* declara uma varivel comum do tipo inteiro */
int *ponteiro ; /* declara um ponteiro para um inteiro */
Tomecuidadoaodeclararvriosponteirosemumalinha,poisoasteriscodevevirantesdecadanomede
varivel.Noteostrsexemplos:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 85/156
Esquemadeumponteiro
int p, q, r; // estamos a declarar trs variveis comuns
int *p, q, r; // cuidado! apenas p ser um ponteiro!
int *p, *q, *r; // agora sim temos trs ponteiros
Paraacessaroendereodeumavarivel,utilizamoso
operador&(Ecomercial),chamado"operadorde
referncia"ou"operadordeendereo".Comoonome
sugere,eleretornaoendereonamemriadeseu
operando.Eleunrioedeveserescritoantesdoseu
operando.Porexemplo,seumavarivelnomefoiguardada
noendereodememria1000,aexpresso&nomevaler
1000.
Comisso,ficaclarooesquemaaolado:avarivelacontmovalor1234eoponteiropcontemo
endereodea(&a).
Paraatribuirumvaloraoponteiro,usamosapenasseunomedevarivel.Essevalordeveserumendereo
dememria,portantoobtidocomooperador&:
int a;
int *p;
p = &a;
Claroquetambmpodemosinicializarumponteiro:
int *p = &a;
Nosdoiscasos,oponteiropirapontarparaavarivela.
Mas,comooponteirocontmumendereo,podemostambmatribuirumvalorvarivelguardadanesse
endereo,ouseja,varivelapontadapeloponteiro.Paraisso,usamosooperador*(asterisco),que
basicamentesignifica"ovalorapontadopor".
Ex:
int a ;
int *p = &a ;
*p = 20 ;
Paraveroresultado:
printf (" a :%i\n", a);
printf ("*p :%i\n", *p);
Cuidado!Vocnuncadeveusarumponteirosemantesinicializloesseumerrocomum.
Inicialmente,umponteiropodeapontarparaqualquerlugardamemriadocomputador.Ouseja,
aotentarlerougravarovalorapontadoporele,vocestarmanipulandoumlugardesconhecido
namemria!
int *p;
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 86/156
*p = 9;
Nesseexemplo,estamosamanipularumlugardesconhecidodamemria!Sevoctentar
compilaressecdigo,ocompiladordeverdarumamensagemdeavisoduranteaexecuo,
provavelmenteocorrerumafalhadesegmentao(erroqueocorrequandoumprogramatenta
acessaramemriaalheia).
Umexemplomaiselaborado:

#include <stdio.h>

int main()
{
int i = 10 ;
int *p ;
p = &i ;
*p = 5 ;

printf ("%d\t%d\t%p\n", i, *p, p);
return 0;
}
Primeiramentedeclaramosavariveli,comvalor10,eoponteirop,queapontarparaoendereodei.
Depois,guardamosovalor5noendereoapontadoporp.Sevocexecutaresseexemplo,veralgo
parecidocom:
5 5 0022FF74
claroqueosvaloresdeiede*pseroiguais,jquepapontaparai.Oterceirovaloroendereode
memriaondeesti(e,consequentemente,oprpriovalordep),eserdiferenteemcadasistema.
Cuidado!Osoperadoresunrios&e*nopodemserconfundidoscomosoperadoresbinrios
ANDbitabitemultiplicao,respectivamente.
PonteiroeNULL
Umafalhadesegmentaoouemingls(segmentationfault)ocorrequandoumprogramatentaacessarum
endereonamemriaqueestreservadoouquenoexiste.NossistemasUnixquandoaconteceestetipo
deerroosinalSIGSEGVenviadoaoprogramaindicandoumafalhadesegmentao.
Aquioponteirocontemnull,definidocomoendereo(0x00000000)quecausaumafalhadesegmentao
.

/*Endereo invalido*/
#define null ( (char*) 0 )

8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 87/156
int main(void){

int a = 5;
int *p = null;
*p = a;
}
Esseprogramaterminaanormalmente.Vocestatentandocolocarovalor5emumendereoinvlido.
Paraqueissonoaconteaoponteirodeveserinicializadocomumendereovalido.Exemplo:

#include <stdio.h>
#include <errno.h>
#include <stddef.h>

int main(void){

int a = 5;
int *p = NULL;
p = &a;

/* A operao no permitida */
if(p == NULL) return -EPERM ;

else{

printf("Endereo a disposio:%p\n", p );
*p = a; /* Pode colocar 5 */
}
}
NULLestdefinidodentrodocabealhostddef.h.Aquivocnoesperaqueoprogramaacabecom
algumtipodemgica,seNULLigualaovalordoponteiroissosignificaquenofoiencontradonemum
endereoacessvel,entovocpara.Casocontrariovocestarexecutandoumaoperaoqueno
permitida.Oucolocar5em(0x00000000).
Maisoperaescomponteiros
Suponhamosdoisponteirosinicializadosp1ep2.Podemosfazerdoistiposdeatribuioentreeles:
p1 = p2;
Esseprimeiroexemplofarcomquep1aponteparaomesmolugarquep2.Ouseja,usarp1ser
equivalenteausarp2apsessaatribuio.
*p1 = *p2;
Nessesegundocaso,estamosaigualarosvaloresapontadospelosdoisponteiros:alteraremosovalor
apontadoporp1paraovalorapontadoporp2.
Agoravamosdarmaisalgunsexemploscomoponteirop:
p++;
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 88/156
Aquiestamosaincrementaroponteiro.Quandoincrementamosumponteiroelepassaaapontarparao
prximovalordomesmotipoemrelaoaovalorparaoqualoponteiroaponta.Isto,setemosum
ponteiroparauminteiroeoincrementamos,elepassaaapontarparaoprximointeiro.Notequeo
incrementonoocorrebyteabyte!
(*p)++;
Aqui,colocamos*pentreparntesesparaespecificarquequeremosalterarovalorapontadoporp.Ou
seja,aquiiremosincrementarocontedodavarivelapontadapeloponteirop.
*p++
Nestecaso,oefeitonotoclaroquantonosoutrosexemplos.Aprecednciadooperador++sobreo
operador*fazcomqueaexpressosejaequivalentea(*p)++.Ovaloratualdepretornadoaooperador
*,eovalordepincrementado.Ouseja,obtemosovaloratualdoponteiroejofazemosapontarparao
prximovalor.
x = *(p + 15);
Estalinhaatribuiaumavarivelxocontedododcimoquintointeiroadiantedaqueleapontadoporp.
Porexemplo,suponhamosquetivssemosumasriedevariveisi0,i1,i2,i15equepapontassepara
i0.Nossavarivelxreceberiaovalordei15.
Tenteacompanharesteexemplodosdoistiposdeatribuiodeponteiros:
int *a, *b, c = 4, d = 2;
a = &c; // a apontar para c
b = &d; // b apontar para d
*b = 8; // altero o valor existente na variavel d
*a = *b; // copio o valor de d (apontado por b)
// para c (apontado por a)
*a = 1; // altero o valor da varivel c
b = a; // b aponta para o mesmo lugar que a,
// ou seja, para c
*b = 0; // altero o valor de c
Intermedirio
Ponteirodeestrutura
Paracomearedeixarmaisclarodefinimosumaestruturasimplescomdoiscampos.
struct {
int i;
double f;
} minha_estrutura;
Opassoseguintedefinirumponteiroparaessaestrutura.
struct minha_estrutura *p_minha_estrutura;
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 89/156
Apartirdoponteiropodemosteracessoaumcampodaestruturausandoumseletor">"(umaflecha).
p_minha_estrutura-> i = 1;
p_minha_estrutura-> f = 1.2;
Omesmoresultadopodeseroptidodaseguinteforma.
(*p_minha_estrutura).i = 1;
(*p_minha_estrutura).f = 1.2;
Ooperadorcasttambmebastanteutilizadoparaestruturarreasdeestoquetemporrios(buffer).Ostipos
dentrodaestruturadevemseromesmodoarranjoparaevitarproblemasdealinhamento.
Aseguirumpequenoexemplo:

#include <stdio.h>
typedef struct estruturar{
char a ;
char b ;
};

int main()

{
char buffer[2] = {17, 4};
estruturar *p;
p = (struct estruturar*) &buffer;

printf("a: %i b: %i", p->a,p->b);
getchar();
return 0;

}
Ponteiroscomoparmetrosdefunes
Comecemosporumasituaoproblema:eutenho2variveisequerotrocarovalordelas.Vamoscomear
comumalgoritmosimples,dentrodafunomain():

#include <stdio.h>

int main()
{
int a = 5, b = 10, temp;
printf ("%d %d\n", a, b);

temp = a;
a = b;
b = temp;

printf ("%d %d\n", a, b);
return 0;
}
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 90/156
Esseexemplofuncionarexatamentecomoesperado:primeiramenteeleimprimir"510"edepoisele
imprimir"105".Masesequisermostrocarvriasvezesovalordeduasvariveis?muitomais
convenientecriarumafunoquefaaisso.Vamosfazerumatentativadeimplementaodafunoswap
(troca,emingls):

#include <stdio.h>

void swap(int i, int j)
{
int temp;
temp = i;
i = j;
j = temp;
}

int main()
{
int a, b;
a = 5;
b = 10;
printf ("%d %d\n", a, b);
swap (a, b);
printf ("%d %d\n", a, b);
return 0;
}
Noentanto,oquequeremosnoiracontecer.Vocverqueoprogramaimprimeduasvezes"510".Por
queissoacontece?Lembresedoescopodasvariveis:asvariveisaebsolocaisfunomain(),e
quandoaspassamoscomoargumentosparaswap(),seusvaloressocopiadosepassamaserchamadosde
iejatrocaocorreentreiej,demodoquequandovoltamosfunomain()nadamudou.
Entocomopoderamosfazerisso?Comosoretornadosdoisvalores,nopodemosusarovalorde
retornodeumafuno.Masexisteumaalternativa:osponteiros!

#include <stdio.h>

void swap (int *i, int *j)
{
int temp;
temp = *i;
*i = *j;
*j = temp;
}

int main ()
{
int a, b;
a = 5;
b = 10;
printf ("\n\nEles valem %d, %d\n", a, b);
swap (&a, &b);
printf ("\n\nEles agora valem %d, %d\n", a, b);
return 0;
}
Nesteexemplo,definimosafunoswap()comoumafunoquetomacomoargumentosdoisponteiros
parainteirosafunofazatrocaentreosvaloresapontadospelosponteiros.Jnafunomain(),
passamososendereosdasvariveisparaafunoswap(),demodoqueafunoswap()possamodificar
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 91/156
variveislocaisdeoutrafuno.Onicopossvelinconvenienteque,quandousarmosafuno,teremos
delembrardecolocarum&nafrentedasvariveisqueestivermospassandoparaafuno.
Sevocpensarbem,jvimosumafunoemquepassamososargumentosprecedidosde&:afuno
scanf()!Porquefazemosisso?simples:chamamosafunoscanf()paraqueelaponhanasnossas
variveisvaloresdigitadospelousurio.Ora,essasvariveissolocais,eportantospodemseralteradas
poroutrasfunesatravsdeponteiros!
Quandoumafunorecebecomoparmetrososendereosenoosvaloresdasvariveis,dizemosque
estamosafazerumachamadaporrefernciaocasodesseltimoexemplo.Quandopassamos
diretamenteosvaloresdasvariveisparaumafuno,dizemosqueumachamadaporvalorfoiocaso
dosegundoexemplo.
Ponteirosevetores
EmC,oselementosdeumvetorsosempreguardadossequencialmente,aumadistnciafixaumdo
outro.Comisso,possvelfacilmentepassardeumelementoaoutro,percorrendosempreumamesma
distnciaparafrenteouparatrsnamemria.Dessamaneira,podemosusarponteiroseaaritmticade
ponteirosparapercorrervetores.Naverdade,vetoressoponteirosumusoparticulardosponteiros.
Acompanheoexemploaseguir.

#include <stdio.h>

int main ()
{
int i;
int vetorTeste[3] = {4, 7, 1};
int *ptr = vetorTeste;

printf("%p\n", vetorTeste);
printf("%p\n", ptr);
printf("%p\n", &ptr);

for (i = 0; i < 3; i++)
{
printf("O endereo do ndice %d do vetor %p\n", i, &ptr[i]);
printf("O valor do ndice %d do vetor %d\n", i, ptr[i]);
}
return 0;
}
Comeamosdeclarandoumvetorcomtrselementosdepois,criamosumponteiroparaessevetor.Mas
reparequenocolocamosooperadordeendereoemvetorTestefazemosissoporqueumvetorj
representaumendereo,comovocpodeverificarpeloresultadodaprimeirachamadaaprintf().
Comovocjviuanteriormentenestecaptulo,podemosusarasintaxe*(ptr + 1)paraacessarointeiro
seguinteaoapontadopeloponteiroptr.Mas,seoponteiroapontaparaovetor,oprximointeirona
memriaseroprximoelementodovetor!Defato,emCasduasformas*(ptr + n)eptr[n]so
equivalentes.
Nonecessriocriarumponteiroparausaressasintaxecomojvimos,ovetoremsijumponteiro,
demodoquequalqueroperaocomptrserfeitaigualmentecomvetorTeste.Todasasformasabaixode
acessarosegundoelementodovetorsoequivalentes:
vetorTeste[1];
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 92/156
*(vetorTeste + 1);
ptr[1];
*(ptr + 1)
Vejamaisesteexemplo:

#include <stdio.h>

int main()
{
int numbers[5];
int *p;
int n;

p = numbers;
*p = 10;
p++;
*p = 20;
p = &numbers[2];
*p = 30;
p = numbers + 3;
*p = 40;
p = numbers;
*(p + 4) = 50;

for (n = 0; n < 5; n++)
cout << numbers[n] << ", ";
return 0;
}
Eleresumeasvriasformasdeacessarelementosdeumvetorusandoponteiros.
Indexaoestranhadeponteiros
oCpermitefazerumtipoindexaodeumvetorquandoumavarivelcontrolaseundice.Oseguinte
cdigovlidoefunciona:Observeaindexaovetor[i].
#include <stdio.h>
int main ()
{
int i;
int vetor[10];

for (i = 0; i < 10; i++) {
printf ("Digite um valor para a posicao %d do vetor: ", i + 1);
scanf ("%d", &vetor[i]); //isso equivalente a fazer *(x + i)
}

for (i = 0; i < 10; i++)
printf ("%d\n", vetor[i]);

return (0);
}
Essaindexao,apesardeestranha,funcionacorretamenteesemavisonacompilao.Elaprtica,mas,
paraosiniciantes,podeparecercomplicada.streinarparaentender.
Comparandoendereos
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 93/156
Comoosendereossonmeros,elestambmpodemsercomparadosentresi.Vejaoexemploaseguir,
comefeitoequivalenteaoprimeiroexemplodaseoanterior:

#include <stdio.h>

int main()
{
int vetorTeste[3] = {4, 7, 1};
int *ptr = vetorTeste;
int i = 0;

while (ptr <= &vetorTeste[2])
{
printf("O endereo do ndice %d do vetor %p\n", i, ptr);
printf("O valor do ndice %d do vetor %d\n", i, *ptr);
ptr++;
i++;
}
return 0;
}
Esseprogramaincrementaoponteiroenquantoesseendereoforigual(oumenor)aoendereodoltimo
elementodovetor(lembresequeosndicesdovetorso0,1e2).
Avanado
Estemduloprecisaserrevisadoporalgumqueconheaoassunto(discuta).
Estemdulotemaseguintetarefapendente:moveroquedeC++paraolivrodeC++
Ponteirosparaponteiros
Acompanheesteexemplo:
char a;
char *b;
char **c;
a = 'z';
b = &a;
c = &b;
**c = 'M';

#include <stdlib.h>
#include<stdio.h>

int vInt = 10;
int *pInt = &vInt;
int **pInt2 = &pInt;
int ***pInt3 = &pInt2;
int x=0;

int main(void){
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 94/156
printf("+-----------------+\n");
printf("| vInt |\n");
printf("+-----------------+\n");
printf("|%17d|\n",vInt);
printf("|%17p|<-+\n",&vInt);
printf("+-----------------+ |\n");
printf("| pInt | |\n");
printf("+-----------------+ |\n");
printf("|%17p|--+\n",pInt);
printf("|%17p|<-+\n",&pInt);
printf("|%17d| |\n",*pInt);
printf("+-----------------+ |\n");
printf("| pInt2 | |\n");
printf("+-----------------+ |\n");
printf("|%17p|--+\n",pInt2);
printf("|%17p|<-+\n",&pInt2);
printf("|%17d| |\n",**pInt2);
printf("+-----------------+ |\n");
printf("| pInt3 | |\n");
printf("+-----------------+ |\n");
printf("|%17p|--+\n",pInt3);
printf("|%17p|\n",&pInt3);
printf("|%17d|\n",***pInt3);
printf("+-----------------+\n");

***pInt3 = 76;

printf("+-----------------+\n");
printf("| vInt |\n");
printf("+-----------------+\n");
printf("|%17d|\n",vInt);
printf("|%17p|<-+\n",&vInt);
printf("+-----------------+ |\n");
printf("| pInt | |\n");
printf("+-----------------+ |\n");
printf("|%17p|--+\n",pInt);
printf("|%17p|<-+\n",&pInt);
printf("|%17d| |\n",*pInt);
printf("+-----------------+ |\n");
printf("| pInt2 | |\n");
printf("+-----------------+ |\n");
printf("|%17p|--+\n",pInt2);
printf("|%17p|<-+\n",&pInt2);
printf("|%17d| |\n",**pInt2);
printf("+-----------------+ |\n");
printf("| pInt3 | |\n");
printf("+-----------------+ |\n");
printf("|%17p|--+\n",pInt3);
printf("|%17p|\n",&pInt3);
printf("|%17d|\n",***pInt3);
printf("+-----------------+\n");


// importante ressaltar que o valor de vInt foi modificado pois a indireo mltipla a modoficou.
printf("+----------------------------------------------------------------+");
printf("| PROGRAMA FEITO POR : DANIEL CAMPOS DINIZ - dinizdc@gmail.com |\n");
printf("+----------------------------------------------------------------+");

return 0;

}
Percebaquetemosdois"nveis":capontaparab,ebapontaparaa.Assim,paraacessarausandoo
ponteiroc,necessriousarduasvezesooperador*:umaparaobterovalordeb(cujoendereoest
guardadoemc),eaoutraparaobterovalordea,apontadoporb.
Umaaplicaodeponteirosparaponteirosestnasstrings,jquestringssovetores,queporsuavezso
ponteiros.Umvetordestringsseriajustamenteumponteiroparaumponteiro.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 95/156
Estemdulotemaseguintetarefapendente:Criarcdigoexemplosobreponteiroparaponteiro
Passandovetorescomoargumentosdefunes
Osponteirospodemserpassadoscomoargumentosdefunes.
Parmetroponteiropassandoumarray.

#include <stdio.h>

void atribuiValores(int[], int);
void mostraValores(int[], int);

int main()
{
int vetorTeste[3]; // crio um vetor sem atribuir valores
atribuiValores(vetorTeste, 3);
mostraValores(vetorTeste, 3);
return 0;
}

void atribuiValores(int valores[], int num)
{
for (int i = 0; i < num; i++)
{
printf("Insira valor #%d: ", i + 1);
scanf("%d", &valores[i]);
}
}

void mostraValores(int valores[], int num)
{
for (int i = 0; i < num; i++)
{
printf("Valor #%d: %d\n", i + 1, valores[i]);
}
}
Reparequepassamosdoisparmetrosparaasfunes:
1. O"nome"dovetor,querepresentaoseuendereonamemria.(Temos3maneirasparapassaro
endereodovetor:diretamentepeloseu"nome",viaumponteirooupeloendereodoprimeiro
elemento.)
2. Umaconstante,querepresentaonmerodeelementosdovetor.IssoimportantepoisoCno
guardainformaessobreotamanhodosvetoresvocnodevetentaralterarouacessarvaloresque
nopertencemaovetor.
claroquedevemospassaroendereodovetor(por"referncia"),poisosseusvaloressoalteradospela
funoatribuiValores.Denadaadiantariapassarovetorporvalor,poisovalorsseriaalteradolocalmente
nafuno(comojvimosnocasodetrocadovalordeduasvariveis).
Porcausadessaequivalnciaentrevetoreseponteiros,podemosfazerumapequenaalteraonoprottipo
(tantonadeclaraoquantonadefinio)dasfunesatribuiValoresemostraValores,semprecisaralterar
ocdigointernodessasfunesouachamadaaelasdentrodafunomain?trocando
void atribuiValores(int[], int);
void mostraValores(int[], int);
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 96/156
por
void atribuiValores(int*, int);
void mostraValores(int*, int);
Paraocompilador,vocnofezmudanaalguma,justamenteporcontadessaequivalncia.Emambosos
casos,foipassadooendereodovetorparaasfunes.
Ponteirosparafunes
Osponteirosparafunesservem,geralmente,parapassarumafunocomoargumentodeumaoutra
funo.Nesteexemplo

#include <stdio.h>

int soma(int a, int b)
{
return (a + b);
}

int operacao(int x, int y, int (*func)(int,int))
{
int g;
g = (*func)(x, y);
return (g);
}

int main ()
{
int m;
m = operacao(7, 5, soma);
printf("%d\n", m);
return 0;
}
Vejaquecriamosumafunoqueretornaasomadosdoisinteirosaelafornecidosnoentanto,elano
chamadadiretamente.Elachamadapelafunooperacao,atravsdeumponteiro.Afunomainpassa
afunosomacomoargumentoparaoperacao,eafunooperacaochamaessafunoquelhefoidada
comoargumento.
Notebemoterceiroargumentodafunooperacao:eleumponteiroparaumafuno.Nessecaso,ele
foideclaradocomoumponteiroparaumafunoquetomadoisinteiroscomoargumentoseretornaoutro
inteiro.O*indicaqueestamosdeclarandoumponteiro,enoumafuno.Osparntesesemtornode
*funcsoessenciais,poissemelesocompiladorentenderiaoargumentocomoumafunoqueretorna
umponteiroparauminteiro.
Aformageralparadeclararumponteiroparaumafuno:
tipo_retorno (*nome_do_ponteiro)(lista de argumentos)
Parachamarafunoapontadapeloponteiro,hduassintaxes.Asintaxeoriginal
(*nome_do_ponteiro)(argumentos);
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 97/156
Septrumponteiroparaumafuno,fazbastantesentidoqueafunoemsisejachamadapor*ptr.No
entanto,asintaxemaismodernapermitequeponteirosparafunessejamchamadosexatamenteda
mesmamaneiraquefunes:
nome_do_ponteiro(argumentos);
Porfim,parainicializarumponteiroparafuno,noprecisamosusarooperadordeendereo(elejest
implcito).Porisso,quandochamamosafunooperacao,noprecisamosescrever&soma.
Vejamaisumexemplonaverdade,umaextensodoexemploanterior:

#include <stdio.h>

int soma(int a, int b)
{
return (a+b);
}

int subtracao(int a, int b)
{
return (a-b);
}

int (*menos)(int, int) = subtracao;

int operacao(int x, int y, int (*func)(int,int))
{
int g;
g = func(x, y);
return (g);
}

int main()
{
int m, n;
m = operacao(7, 5, soma);
n = operacao(20, m, menos);
printf("%d\n", n);
return 0;
}
Aqui,criamosmaisumafuno,subtracao,almdecriarumoutroponteiroparaela(umaespciede
"atalho"),menos.Nafunomain,referimonosfunodesubtraoatravsdesseatalho.
Vejatambmqueaquiusamosasintaxemodernaparaachamadadeponteirosdefunes,aocontrriodo
exemploanterior.
PassagemdeParametros
ProgramaremC/PassagemdeParametros
Tiposdedadosdefinidospelousurio
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 98/156
Tiposdedadosdefinidospelousurio
Muitasvezesnecessriomanipulardadoscomplexosqueseriamdifceisderepresentarusandoapenasos
tiposprimitivos(char,int,double,float).Paraisso,h,emC,trstiposdedadosquepodemserdefinidos
pelousurio:
estruturas(struct)
unies(union)
enumeraes(enum).
Asestruturaseuniessocompostasporvriasvariveis(escolhidaspeloprogramador),porissosoditos
definidospelousurio.Jasenumeraesso,resumidamente,tiposcujosvaloresdevempertenceraum
conjuntodefinidopeloprogramador.
Estruturas
Umaestrutura(oustruct)umtipodedadosresultantedoagrupamentodevriasvariveisnomeadas,
nonecessariamentesimilares,numasessasvariveissochamadasmembrosdaestrutura.Paradeclarar
umaestrutura,usamosapalavrachavestruct,seguidadonomequesedesejadarestrutura(aotipode
dados)edeumblococontendoasdeclaraesdosmembros.Vejaumexemplo:
struct mystruct
{
int a, b, c;
double d, e, f;
char string[25];
};
Esteexemplocriaumtipodedadosdenominadomystruct,contendosetemembros(a,b,c,d,e,f,string).
Notequeonomemystructonomedotipodedados,nodeumavariveldessetipo.
Umexemplosimplesdeaplicaodeestruturasseriaumafichapessoalquetenhanome,telefonee
endereoafichaseriaumaestrutura.
Ou,maisamplamente,umaestruturaseriaumarepresentaodequalquertipodedadodefinidopormais
deumavarivel.Porexemplo,otipoFILE*naverdadeumponteiroparaumaestruturaquecontm
algunsdadosqueosistemausaparacontrolaroacessoaofluxo/arquivo.Nonecessrio,paraamaioria
dosprogramadores,conheceraestruturadotipoFILE.
Definindootipo
Adefiniodeumtipodeestruturafeitacomapalavrachavestruct,seguidadonomeaserdadoao
tipoedeumblococontendoasdeclaraesdoselementosdaestrutura:
struct nome_do_tipo
{
tipo_elem a;
tipo_elem b, c;
...
};
muitoimportanteincluiropontoevrgulaaofinaldobloco!
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 99/156
Declarando
Paradeclararumavariveldeumtipojdefinido,fornecemosonomedotipo,incluindoapalavrachave
struct:
struct nome_do_tipo variavel;
Tambmpossvelcondensaradefiniodotipoeadeclaraoemumpasso,substituindoonomedotipo
peladefinio,semopontoevrgula:
struct mystruct
{
int a, b, c;
double d, e, f;
char string[25];
} variavel;
Tambmpossvelinicializarumaestruturausandoaschaves{}paraenvolveroselementosdaestrutura,
separadosporvrgulas.Oselementosdevemestarnaordememqueforamdeclarados,masno
obrigatrioinicializartodosnoentanto,parainicializarumelemento,todososanterioresdevemser
inicializadostambm.Porexemplo,poderamosdeclararvaloresiniciaisparaavarivelacimadaseguinte
maneira:
struct mystruct variavel = {4, 6, 5, 3.14, 2.718, 0.95, "Teste"};
struct mystruct v2 = {9, 5, 7};
Inicializadordesignado
ParaquemusaoC99comocompiladorGNU.Duranteainicializaodeumestruturapossvel
especificaronomedocampocom'.nome_do_campo='antesdovalor.
Exemplo:
struct mystruct v2 = {.a=9,.b=5,.c=7};
Acessando
Paraacessaremodificarosmembrosdeumaestrutura,usamosooperadordeseleo.(ponto).
esquerdadopontodeveestaronomedavarivel(estrutura)edireita,onomedomembro.Podemosusar
osmembroscomovariveisnormais,inclusivepassandoosparafunescomoargumentos:
variavel.a = 5;
variavel.f = 6.17;
strcpy (variavel.string, "Bom dia");
printf ("%d %f %s\n", variavel.a, variavel.f, variavel.string);
Vetoresdeestruturas
Sendoasestruturascomoqualqueroutrotipodedados,podemoscriarvetoresdeestruturas.Porexemplo,
suponhaalgumprogramaquefuncionecomoumservidorepermitaat10usuriosconectados
simultaneamente.Poderamosguardarasinformaesdessesusuriosnumvetorde10estruturas:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 100/156
struct info_usuario {
int id;
char nome[20];
long endereco_ip;
time_t hora_conexao;
};
struct info_usuario usuarios[10];
E,porexemplo,paraobterohorrioemqueo2usuriousurioseconectou,poderamosescrever
usuarios[1].hora_conexao.
Atribuioecpia
Podemosfacilmentecopiartodososcamposdeumaestruturaparaoutra,fazendoumaatribuiosimples
comoadeinteiros:
struct ponto {
int x;
int y;
};
...
struct ponto a = {2, 3};
struct ponto b = {5, 8};
b = a;
// agora o ponto b tambm tem coordenadas (2, 3)
Noentanto,devemostercuidadoseaestruturacontivercamposponteiros,pois,nessescasos,oqueser
copiadooendereodememria(enoocontedodaqueleendereo).Porexemplo,setivermosuma
estruturaquecomportauminteiroeumastring,umacpiasuaconteromesmointeiroeumponteiro
paraamesmastring,oquesignificaquealteraesnastringdacpiaserorefletidastambmno
original!
Passandoparafunes
Jvimosacimaquepodemosnormalmentepassarmembrosdeumaestruturacomoargumentosde
funes.Tambmpossvelpassarestruturasinteirascomoargumentos:
#include <stdio.h>
struct ponto {
int x;
int y;
};
void imprime_ponto (struct ponto p)
{
printf ("(%d, %d)\n", p.x, p.y);
}
int main ()
{
struct ponto a = {3, 7};
imprime_ponto (a);
return 0;
}
Noentanto,hdoispossveisproblemasnisso:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 101/156
Alteraesnosmembrosdaestruturasteroefeitodentrodafunochamada,masnonafuno
queachamou.Issoocorrepoisaestruturapassadaporvalor(enoporreferncia).
Quandoaestruturacontivermuitoselementos,apassagemporvalortornarseumprocessode
cpiademuitosdados.Porisso,decostumepassarestruturasporreferncia(comoponteiros),
mesmoqueaestruturaemquestosejapequena.
Unies
Uniessoparecidascomestruturas,mashumadiferenafundamental:nasunies,todososelementos
ocupamomesmoespaodememria.Porisso,spossvelacessarumelementoporvez,jqueuma
mudanaemumelementocausarmudanaemtodososoutros.Adefinioeadeclaraodeunies
igualdasestruturas,trocandoapalavrastructporunion.
Hprincipalmentedoisusosparaasunies:
economiadeespao,jqueguardamsevriasvariveisnomesmoespao
representaodeumainformaodemaisdeumamaneira.Umexemplodissosoos
endereosIP,quenabibliotecadesocketspodemserrepresentadoscomoumgrupode4octetos
(char)oucomoumnicovalorinteiro(int).Issofeitocomumaunioparecidacomesta:
union ip_address {
int s_long;
char s_byte[4];
};
Dessamaneira,oendereopodeserfacilmenterepresentadodemaneirahumanamentelegvel(com
4octetos),semdificultaroprocessamentointerno(comovalorinteiro).
Enumeraes
Enumerao(enum)outipoenumeradoumtipodedadosquetemcomoconjuntodevalorespossveis
umconjuntofinitodeidentificadores(nomes)determinadospeloprogramador.EmC,cadaidentificador
emumaenumeraocorrespondeauminteiro.
Enumeraessodefinidasdemaneirasimilarsestruturaseunies,comalgumasdiferenas.Apalavra
chaveusadaenum.
enum nome_enumerao {
IDENTIFICADOR_1,
IDENTIFICADOR_2,
...
IDENTIFICADOR_n
};
Noteasdiferenas:nohpontoevrgulanofinalounomeiodasdeclaraes(masaindahnofinaldo
bloco),enohdeclaraodetipos.
Comessadeclarao,aoIDENTIFICADOR_1seratribuidoovalor0,aoIDENTIFICADOR_2ser
atribudoovalor1,eassimpordiante.Podemostambmexplicitarosvaloresquequisermoscolocando
umsinaldeigualeovalordesejadoapsoidentificador.
Casonohajavalordeterminadoparaoprimeiroidentificador,eleserzero.Paraosdemais
identificadores,opadroseguiraordemdosnmeros,apartirdovalordoidentificadoranterior.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 102/156
Podemosmisturaridentificadoresdevalordeterminadocomidentificadoresdevalorimplcito,
bastandoseguiraregraacima.
Porexemplo:
enum cores {
VERMELHO, /* 0 */
AZUL = 5, /* 5 */
VERDE, /* 6 */
AMARELO, /* 7 */
MARROM = 10 /* 10 */
};
Uso
Damesmamaneiraquecriamosumavariveldeumtipostructouunion,podemoscriarvariveisdeum
tipoenumerado(enum):
enum cores cor_fundo;
Paraatribuirvaloresaumavarivelenumerada,podemosusarcomovalortantooidentificadorquantoo
valorcorrespondente.Seriamequivalentes,portanto:
cor_fundo = VERDE;
cor_fundo = 6;
Naverdade,variveisenumeradasagemdemaneiraquaseigualaosinteirospossvel,assim,atribuir
valoresquenocorrespondemanenhumdosidentificadores.
Campodebits
Nalinguagemcocampodebits(bitfields)umaestruturaumpoucoestranha,emvezdeusarvariveis
comtiposdiferentesoscampossoformadoscomaspartesdeuminteiro.Otamanhodeumcampodebits
nopodesermaiorqueotipousado,aquiumshort.
typedef struct
{
unsigned short
campo_1: 6, /* Tamanho 6 bit */
campo_2: 6,
campo_3: 1,
campo_4: 1,
campo_5: 2;
}BIT_FIELD_1;
Essaestruturaestaformadaporumtipoquetemotamanhodeumshortessemesmotiposerdividoem
poresmenores.Noexemploacimaoscampostemostamanhos6,6,1,1,2iguala16bitsqueotamanho
deumunsignedshort.Paraacessaroscamposusamosomesmomtodoqueusamoscomestruturas
normais.
BIT_FIELD_1 meu_campo;
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 103/156
meu_campo.campo_1 = 16;
meu_campo.campo_4 = 0;
Enumerao
Estapginaprecisaserreciclada(discuta).
Aomelhorla,vocestarajudandooWikilivros.
Enumerations(enum)
Aquivamosretornaraumtpicoantigo.
Enumerationssoumoutromtododedefinirconstantes.Recordamse?Tnhamoso:
1. #define
2. constinta=1
3. enumerations.
Criandoumnovotipodedados
Asenumerationsdefinemumnovatipodevarivelelimitadesdelogoosvalores.
enum colors {black, blue, green, cyan, red, purple, yellow, white};
Amaneiramaissimplesdeinterpretarumaenumerationimaginalacomoumamatrizdeapenasuma
linha.Temosonomedalinhadetemosasvriasclulasnalinha.Cadaconstanteenumerada(muitasvezes
chamadodeenumerator)temumvalorinteiro(casonosejaespecificadoelecomeaemzero)
Exemplo:
black blue green cyan purple yellow white
0 1 2 3 4 5 6
Maspodemosdefinirovalortipo
enum forma {quadrado=5, rectangulo,triangulo=27, circulo, elipse}
ficaramoscomanossalinhadotipo:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 104/156
Quadrado Rectngulo Triangulo Circulo Elipse
5 6 27 28 29
reparemnosvaloresdosnmeros.
Avantagememtermosenumeraesqueseumavariveldeclaradatipoenumerao,temumtipo
nicoeosseusvaloresestolimitadosepoderoserverificadosduranteacompilao.
talcomoasestruturascriartiposdevariveis.
#include <stdio.h>
/*Definindo o cabealho*/
enum cores
{
AZUL = 1,
VERDE,
BRANCO,
}; /*Aqui um ponto virgula*/
/*typedef transformamos 2 palavras em uma -> tipo_cores*/
typedef enum cores tipo_cores ;


/*A funo default da lib ou glibc*/
int main(void)
{
/*Agora usando o nosso novo tipo
* Aqui sem typedef teramos que colocar enum cores */

tipo_cores cor = VERDE ;

if(cor == 1)
{
printf("Cor azul \n");
}

if(cor == 2)
{
printf("Cor verde \n");
}

/* printf no ser executado */
if(cor == 3 )
{
printf("Cor branco \n");
}
return 0 ;
/*De um enter depois de } para evitar warning */
}
Aquipodemosverumexemplocomumafuno"mostrarRes()"eumswitch:
Emesteexemploumaconstanteedefinidaeovalordasoutraserdefinidoautomaticamente.
#include <stdio.h>
#include <stdlib.h>

void mostrarRes(int quem);

/*Aqui os valores Italia = 4 e Brasil = 5 so incrementados automaticamente*/
enum { ARGENTINA = 3, ITALIA, BRASIL };

int main(void)
{

/*Colocamos 5 se voc for Argentino coloque 3 */
int n = BRASIL ;
mostrarRes(n);
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 105/156

}


void mostrarRes(int quem)
{

switch(quem)
{
case BRASIL : printf( "Brasil invencvel como de costume\n" );
break;
case ARGENTINA : printf("Argentina um dia quem sabe\n") ;
break;
case ITALIA : printf("Foi sorte\n") ;
break;
default : printf("Se estou vivo teve erro do sistema xx \n") ;

}
printf("The end , hasta la vista\n \n");
/*De um enter depois de } para evitar warning */
}
Unio
Estapginaprecisaserreciclada(discuta).
Aomelhorla,vocestarajudandooWikilivros.
Unions
Asunionssomuitoparecidascomasestruturas,estasguardamvariveisdevriostipos,eportanto
guardamcadavariveldeacordocomaseutipo,ie,setivermosumavarivelmembroqueuminteoutro
float,elaguardaexatamentedeacordocomessetipo.
Oquesepassaaquiquevaiguardarasvariveistodascomumnicotipo,queaquelequeocupamais
espaodentrodostiposdasvariveismembro,ouseja,setivermosumavarivelmembrointeoutrafloat,
aunionvaiguardarestasvariveiscomofossemasduasfloat.
Declarao
union mytypes_t
{
int i;
float f;
} mytypes;
Unionscomestruturas
Nesteexemplotemosunionseestruturasmisturados.
union mix_t
{
long l;
struct
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 106/156
{
short hi;
short lo;
} s;
char c[4];
} mix;
mytypes_t longl Struct CharC[4]
mix
Reparequeaestruturanotemnome
Anonymousunionsestruturascomunions
// estrutura usando "regular union"
struct {
char title[50];
char author[50];
union {
float dollars;
int yens;
} price;
} book;

// estrutura usando "anonymous union"
struct {
char title[50];
char author[50];
union {
float dollars;
int yens;
};
} book;
Sedeclararmosumauniosemnome,elavaificarannimaepoderemosacessarseusmembros
diretamenteatravsdosnomesdosmembros.
// Uso regular
book.price.dollars
book.price.yens
// Uso anonimo
book.dollars
book.yens
Estruturas
Estapginaprecisaserreciclada(discuta).
Aomelhorla,vocestarajudandooWikilivros.
Structures
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 107/156
Asstucturespermitemcomquepossamostervariveisdevriostiposaglomeradossobomesmonome.E
essemesmonomevaipassaraserumnovotipodedadostalcomoointoufloat.
Masousodistoquepodemostervaloresquetenhamalgumarelaolgica,porexemploguardarumint
deidadeeumstringdenome.Istopodeseratributosdeumapessoa.Ousejapodemosempacotarvrias
variveisdevriostiposcomoobjetivoderepresentaromundorealedarumnomeaessasvariveis
todas.
Aofazeristocrimosumtipodedadosdamesmaformacomofazemosemrelaoaointouaofloat.
Declararumaestrutura
Asintaxe:
struct <identificador> {
<tipo> campo_um ;
<tipo> campo_dois ;
};
Aquiotipostructindicaquevamoscriarumaestrutura.Onomeouidentificadorpodeseralunos,famlia,
etc.(tmdeservlidosidentifiers)Noesqueceropontoevrgulanofimdadeclarao.Campo_ume
Campo_doissovariveismembromembervariablesoucampodaestrutura.
Assimcriamosnovostiposdedados.
Primeiromtodo:
struct minha_estrutura
{
int variavel_um;
int campo_dois;
char fruta[40];
} ;
Aquioidentificadordotipo"struct""minha_estrutura"dentrodessaestruturatemostrscamposoultimo
"fruta"
Agorapodemosusaressetipo"struct"paradefinirvariveis.
struct minha_estrutura nova_estructura;
Parateracessoaosmembrosdefinidosdentrodaestruturautilizamosumoperadordeseleaodemembro
"."(umponto).
nova_estrutura.fruta[0];
Nosdoprimeirocaracterdapalavracontidadentrodomembro"fruta".
Parainicializarumcampodaestruturaoprocessoomesmoqueusamoscomasvariveis.
nova_estrutura.campo_dois = 100;
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 108/156
Matrizesdeestruturas
UmaestruturacomoqualqueroutrotipodedadonoC.Podemos,portanto,criarmatrizesdeestruturas.
Vamosvercomoficariaadeclaraodeumvetorde100fichaspessoais:
struct minha_estrutura fichas [100];
Poderamosentoacessarumcampodandoumndicedovetorfichas:
fichas[12].variavel_um;
Declararinstncias(objetos)daestrutura
Podemosdeclararosobjetosdeduasformas:
Aomesmotempoquedeclaramosaestrutura
struct product {
int weight;
float price;
} apple, banana, melon;
Oucomoumavarivelnormal
struct product
{
..
}
int main()
{
struct product apple, banana, melon;
}
Eatpodemosdeclararumarraydelas
Person p[20];
Pergunta:comoquefeitoexatamenteosobjetos?
Paracadaobjetovoserfeitoumacpiadoselementosdaestrutura.
Agoraissosignificaqueosobjetossodistintosentresiemtermosdereservadememria?ie,medida
queenumeroosobjetosvoserreservadoparacadaobjetootamanhoxdebytes?ousomamsetodosos
objetosereservaseparatodososobjetosdeumaformaseguida?Pensoquedevesera1opo.
Setivermosapenasumobjeto(ouvariveldaestrutura)nonecessriodarmosonomedaestrutura
struct {
char item[40]; // name of item
double cost; // cost
double retail; // retail price
int on_hand; // amount on hand
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 109/156
int lead_time; // number of days before resupply
} temp;
Acessarasvariveismembrodasestruturas
Agoraqueremosdarvaloresacadaumadaspessoas,queremosdaronomeeaaltura,paraissofaramos
strcpy(p1.name, "Tiago");
p1.altura =1.9;
Aformagenrica:
structure-varname.member-name
ouseja
[objecto_estrutura][member_estrutura]
Exemplo
#include <stdio.h>
const int MAX = 3;

struct Person
{
char name[100];
int height;
};

int main ()
{
Person p[MAX];
for (int x = 0; x < MAX; x++)
{
printf("Enter person's name: ");
getline(cin, p[x].name);
printf("Enter height in meters: ");
scanf("%d\n", &p[x].height);
}
printf("Outputting person data\n");
printf("======================\n");
for (int x = 0; x < MAX; x++){
printf("Person #%d's name is %s and height is %d.\n", x + 1, p[x].name, p[x].height);
}
return 0;
}
Iniciarumaestrutura
Podemosiniciarumaestruturausandoumalistadeiniciao,queseriaalgocomo:
Person p1 = {"Jeff Kent", 72};
istobasicamenteigualaarrays,apenascomadiferenadetermostiposdiferentes.Logoaordemvai
interessar,porexemploseescrevssemos
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 110/156
Person p1 = {72, "Jeff Kent"}; //no iria funcionar- erro de compilao
Ponteirosparaestruturas
struct movies_t
{
string title;
int year;
};

movies_t amovie;
movies_t * pmovie;
Nscrimosalgo
movies_t title year
amovie
* pmovie
Vejamosquetemosumponteirocomoinstncia.
// pointers to structures
#include <stdio.h>

struct movies_t
{
char title[100];
int year;
};

int main ()
{
string mystr;
movies_t amovie;
movies_t *pmovie;
pmovie = &amovie; //atribumos valor ao ponteiro

printf("Enter title: ");
fgets(pmovie->title, 100, stdin); //operador ->
printf("Enter year: ";
scanf("%d", &pmovie->year);

printf("\nYou have entered:\n");
printf("%s (%d)\n", pmovie->title, pmovie->year); //operador ->
return 0;
}
Comojdevemterdeduzidoooperador>sermuitosimilarapmovie>titleequivalentea
(*pmovie).title
Masolhemquediferentea:
*pmovie.title que equivalente a *(pmovie.title)
Passandoestruturascomoargumentodefunes
Aestruturapassadacomoponteiro.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 111/156
#include <stdio.h>
#include <string.h>

struct Person
{
string name;
int height;
};

void setValues(Person*);
void getValues(const Person*);

int main ()
{
Person p1;
setValues(&p1);
printf("Outputting person data\n");
printf("======================\n");
getValues(&p1);
return 0;
}

void setValues(Person* pers)
{
printf("Enter person's name: ");
fgets(pers.name, 100, stdin);
printf("Enter height in inches: ");
scanf("%d", &pers.height);
}

void getValues(const Person* pers)
{
printf("Person's name is %s and height is %d.", pers.name, pers.height);
}
Estruturasaninhadas
Aideiaterumaestruturadentrodeoutraestrutura.
#include <stdio.h>

struct Date //estrutura chamada de date
{
int day;
int month;
int year;
};
struct Person
{
char name[100];
int height;
Date bDay; //temos uma nova varivel, mas notem o tipo
};

void setValues(Person*);
void getValues(const Person*);

int main ()
{
Person p1;
setValues(&p1);
printf("Outputting person data\n");
printf("======================\n");
getValues(&p1);
return 0;
}

void setValues(Person* pers)
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 112/156
{
printf("Enter person's name: ");
fgets(pers.name, 100, stdin);
printf("Enter height in inches: ");
scanf("%d", &pers.height);
printf("Enter day, month and year of birthday separated by spaces: ");
scanf("%d %d %d\n", &pers.bDay.day, &pers.bDay.month, &pers.bDay.year );
}

void getValues(const Person* pers)
{
printf("Person's name: %s\n", pers.name);
printf("Person's height in inches is: %d\n", pers.height);
printf("Person's birthday in dd/mm/yyyy format is: %d/%d/%d\n", pers.bDay.day, pers.bDay.month, pers.bDay.year );
}
ReparemqueaestruturaDatetemdeserdeclaradaantesdaestruturaPerson,poiscasocontrrioo
compiladornoentenderiaotipodeclaradonaestruturaPerson.
Pergunta:Porquenopodemosacrescentarmaismembros(campos)nasestruturas?
Porqueelassocompiladasestaticamentecomposiodememriajalocadaetipojconhecidoem
tempodecompilao
Pergunta:Aoinvsdetermosapenasvariveisnasestruturas,poderamostertambmfunes?
Sim,comoponteirosparafunes.
Maissobrevariveis
Estemduloprecisaserrevisadoporalgumqueconheaoassunto(discuta).
typedef
Ainstruotypedefserveparadefinirumnovonomeparaumcertotipodedadosintrnsecoda
linguagemoudefinidopelousurio.Porexemplo,sefizssemosaseguintedeclarao:
typedef unsigned int uint;
poderamosdeclararvariveisinteirassemsinal(unsignedint)daseguintemaneira:
uint numero;
// equivalente a "unsigned int numero;"
Comoexemplovamosdaronomedeinteiroparaotipoint:
typedef int inteiro;
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 113/156
Comosev,typedefcriaumaespciede"apelido"paraumtipodedados,permitindoqueessetiposeja
referenciadoatravsdesseapelidoemvezdeseuidentificadornormal.
Umdosusosmaiscomunsdetypedefabreviaradeclaraodetiposcomplexos,comostructsou
estruturas.Vejaesteexemplo:
struct pessoa {
char nome[40];
int idade;
};
struct pessoa joao;
Observeque,paradeclararavariveljoao,precisamosescreverapalavrastruct.Podemosusartypedef
paraabreviaressaescrita:
typedef struct _pessoa {
char nome[40];
int idade;
} Pessoa;
Pessoa joao;
Um"apelido"detipoutilizadocombastantefrequncia,emboranocostumemosdarporisso:otipo
FILE,usadonasfunesdeentrada/sadadearquivos.
typedef struct _iobuf
{
char* _ptr;
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
} FILE;
Ento,quandodeclaramosalgocomo
FILE *fp;
naverdadeestamosadeclararumponteiroparaumaestrutura,queserpreenchidamaistardepelafuno
fopen.
Ateno!VocnodevetentarmanipularumaestruturadotipoFILEsuacomposiofoi
apresentadaapenascomoexemploouilustrao.
sizeof
Ooperadorsizeofusadoparasesaberotamanhodevariveisoudetipos.Eleretornaotamanhodotipo
ouvarivelembytescomoumacontante.Devemosusloparagarantirportabilidade.Porexemplo,o
tamanhodeuminteiropodedependerdosistemaparaoqualseestcompilando.Osizeofumoperador
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 114/156
porqueelesubstitudopelotamanhodotipoouvarivelnomomentodacompilao.Elenouma
funo.Osizeofadmiteduasformas:
sizeof nome_da_varivel
sizeof (nome_do_tipo)
Sequisermosentosaberotamanhodeumfloatfazemossizeof(float).Sedeclararmosavarivelfcomo
floatequisermossaberoseutamanhofaremossizeoff.Ooperadorsizeoftambmfuncionacom
estruturas,unieseenumeraes.
Outraaplicaoimportantedooperadorsizeofparasesaberotamanhodetiposdefinidospelousurio.
Seria,porexemplo,umatarefaumtantocomplicadaadealocaramemriaparaumponteiroparaa
estruturaficha_pessoal,criadanaprimeirapginadestaaula,senofosseousodesizeof.Vejaoexemplo:
typedef struct {
const char *nome;
const char *sobrenome;
int idade;
} Pessoa;


int main(void)
{
Pessoa *joaquim;
joaquim = malloc(sizeof(Pessoa));
joaquim->nome = "Joaquim";
joaquim->sobrenome = "Silva";
joaquim->idade = 15;
}
Outroexemplo:
#include <string.h>
#include <stdio.h>
int
main(void)
{
char *nome;
nome = malloc(sizeof(char) * 10);
sprintf(nome, "wikibooks");
printf("Site: http://pt.%s.org/", nome);
/*
Imprime:
Site: http://pt.wikibooks.org/
*/
}
AsentenaabaixoNOfunciona,poissizeofsubstitudopelotamanhodeumtipoemtempode
compilao.
const char *FRASE;
FRASE = "Wikibooks eh legal";
printf("Eu acho que o tamanho da string FRASE %d", sizeof(FRASE));
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 115/156
Conversodetipos
AsatribuiesnoCtemoseguinteformato:
destino=origem;
Seodestinoeaorigemsodetiposdiferentesocompiladorfazumaconversoentreostipos.Masnem
todasasconversessopossveis.Oprimeiropontoaserressaltadoqueovalordeorigemconvertido
paraovalordedestinoantesdeseratribudoenoocontrrio.
EmC,cadatipobsicoocupaumadeterminadaporodebitsnamemria,logo,aconversoentretipos
nemsemprealgonativodalinguagem,porassimdizer.Hfunescomoatoleatofqueconvertem
stringeminteirolongo(longint)estringemdouble,respectivamente.Masemmuitoscasospossvelusar
ocasting.
importantelembrarquequandoconvertemosumtiponumricoparaoutro,nsnuncaganhamos
preciso.Nspodemosperderprecisoounomximomanteraprecisoanterior.Istopodeserentendido
deumaoutraforma.Quandoconvertemosumnmeronoestamosintroduzindonosistemanenhuma
informaoadicional.Istoimplicaquenuncavamosganharpreciso.
Abaixovemosumatabeladeconversesnumricascomperdadepreciso,paraumcompiladorcom
palavrade16bits:
De Para Informao Perdida
unsigned char char Valores maiores que 127 so alterados
short int char Os 8 bits de mais alta ordem
int char Os 8 bits de mais alta ordem
long int char Os 24 bits de mais alta ordem
long int short int Os 16 bits de mais alta ordem
long int int Os 16 bits de mais alta ordem
float int Preciso - resultado arredondado
double float Preciso - resultado arredondado
long double double Preciso - resultado arredondado
Casting:conversomanual
Sedeclararmosa=10/3,sabemosqueoresultado3,333,ousejaadivisodedoisnmerosinteirosd
umnmeroreal.PormoresultadoemCserointeiro3.Issoacontece,porqueasconstantessodotipo
inteiroeoperaescominteirostemresultadointeiro.Omesmoocorreriaema=b/csebecforem
inteiros.
Sedeclararmos:
int a;
Oresultadoser3.
Mesmoquedeclarssemos:
float a;
oresultadocontinuaaser3masdestavez,3,0000.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 116/156
Parafazerdivisoqueresultenmeroreal,necessriofazercastparaumtipodepontoflutuante:
a = (float)10/3
a = 10/(float)3
Nessecaso,o10ouo3convertidoparafloat.Ooutronmerocontinuacomointeiro,masaoentrarna
divisocomumfloat,eleconvertidoautomaticamenteparafloat.Adivisofeitaedepoisatribuda
varivela.
Empoucaspalavras,castingcolocarumtipoentreparntesesantesdaatribuiodeumavarivel.A
formageralparacast:
(tipo)varivel
(tipo)(expresso)
variavel_destino = (tipo)variavel_origem;
Masexistemumasconversesautomticas:
int f(void)
{
float f_var;
double d_var;
long double l_d_var;
f_var = 1; d_var = 1; l_d_var = 1;
d_var = d_var + f_var; /*o float convertido em double*/
l_d_var = d_var + f_var; /*o float e o double convertidos em long double*/
return l_d_var;
}
Reparequeaconversofeitademenorparaomaior.
possvelfazeraconversoaocontrriodeumtipocommaisbitsparaumcommenosbitseisso
truncar.Nessecaso,ocastexplcitonecessrio.Assim,umnmerofloat:43.023aoserconvertidopara
intdeverser"cortado",ficandointeiro:43.Seconverterlongparashort,osbitsmaissignificativosso
perdidosnaconverso.
Ooperadorcasttambmebastanteutilizadoparaestruturarreasdeestoquetemporrios(buffer).Aseguir
umpequenoexemplo:
#include <stdio.h>
typedef struct estruturar{
char a ;
char b ;
};

int main()
{
char buffer[2] = {17, 4};
estruturar *p;
p = (struct estruturar*) &buffer;
char* x = (char*)malloc(10);

printf("a: %i b: %i", p->a,p->b);
getchar();
return 0;
}
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 117/156
Atributosdasvariveis
Estesmodificadores,comooprprionomeindica,mudamamaneiracomaqualavarivelacessadae
modificada.Algunsdosexemplosusamconceitosquesseroabordadosnasseesseguintes,entovoc
podedeixarestaseoparadepoisseassimodesejar.
const
Omodificadorconstfazcomqueavarivelnopossasermodificadanoprograma.Comoonomej
sugeretilparasedeclararconstantes.Poderamoster,porexemplo:
const float PI = 3.1415;
Podemosverpeloexemploqueasvariveiscomomodificadorconstpodemserinicializadas.MasPIno
poderiaseralteradoemqualqueroutrapartedoprograma.SeoprogramadortentarmodificarPIo
compiladorgerarumerrodecompilao.
Outrousodeconst,alismuitocomumqueooutro,evitarqueumparmetrodeumafunoseja
alteradopelafuno.Istomuitotilnocasodeumponteiro,poisocontedodeumponteiropodeser
alteradoporumafuno.Paraprotegeroponteirocontraalteraes,bastadeclararoparmetrocomo
const.
#include <stdio.h>
int sqr (const int *num);
int main(void)
{
int a = 10;
int b;
b = sqr(&a);
}
int sqr (const int *num)
{
return ((*num)*(*num));
}
Noexemplo,numestprotegidocontraalteraes.Istoquerdizerque,setentssemosfazer
*num = 10;
dentrodafunosqr(),ocompiladordariaumamensagemdeerro.
volatile
Omodificadorvolatiledizaocompiladorqueavarivelemquestopodeseralteradasemqueesteseja
avisado.Istoevita"bugs"quepoderiamocorrerseocompiladortentassefazerumaotimizaonocdigo
quenoseguraquandoamemriamodificadaexternamente.
Digamosque,porexemplo,tenhamosumavarivelqueoBIOSdocomputadoralterademinutoem
minuto(umrelgio,porexemplo).Seriaimportantequedeclarssemosestavarivelcomovolatile.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 118/156
Umusoimportantedevariveisvolatileemaplicaescomvriasthreads(linhasdeexecuo),onde
amemriacompartilhadaporvriospedaosdecdigoquesoexecutadossimultaneamente.
extern
Omodificadorexterndizaocompiladorqueavarivelindicadafoideclaradaemoutroarquivoqueno
podemosincluirdiretamente,porexemploocdigodeumabibliotecapadro.Issoimportantepois,se
nocolocarmosomodificadorextern,ocompiladorirdeclararumanovavarivelcomonome
especificado,"ocultando"avarivelquerealmentedesejamosusar.Esesimplesmentenodeclarssemos
avarivel,jsabemosqueocompiladornosaberiaotamanhodavarivel.
Quandoocompiladorencontraomodificadorextern,elemarcaavarivelcomonoresolvida,eo
montadorseencarregardesubstituiroendereocorretodavarivel.
extern float sum;
extern int count;
float returnSum (void)
{
count++;
return sum;
}
Nesteexemplo,ocompiladorirsaberquecountesumestosendousadosnoarquivomasqueforam
declaradosemoutro.
Umavarivelexternafrequentementeusadaavarivelerrno(declaradanoarquivocabealhoerrno.h),
queindicaoltimocdigodeerroencontradonaexecuodeumafunodabibliotecapadrooudo
sistema.
static
Ofuncionamentodasvariveisdeclaradascomostaticdependedeseestassoglobaisoulocais.
Variveisglobaisstaticfuncionamcomovariveisglobaisdentrodeummdulo,ouseja,so
variveisglobaisquenoso(enempodemser)conhecidasemoutrosmdulos(arquivos).Isto
utilsequisermosisolarpedaosdeumprogramaparaevitarmudanasacidentaisemvariveis
globais.Issoumtipodeencapsulamentoque,simplificadamente,oatodenopermitirque
umavarivelsejamodificadadiretamente,masapenaspormeiodeumafuno.
Variveislocaisestticassovariveiscujovalormantidodeumachamadadafunoparaaoutra.
Vejaoexemplo:
int count (void)
{
static int num = 0;
num++;
return num;
}
Afunocount()retornaonmerodevezesqueelajfoichamada.Vejaqueavarivellocalint
inicializada.Estainicializaosvaleparaaprimeiravezqueafunochamadapoisnumdevemantero
seuvalordeumachamadaparaaoutra.Oqueafunofazincrementarnumacadachamadaeretornar
oseuvalor.Amelhormaneiradeseentenderestavarivellocalstaticimplementando.Vejaporsi
mesmo,executandoseuprprioprogramaqueuseesteconceito.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 119/156
register
Ocomputadorpodeguardardadosnamemria(RAM)enosregistradoresinternosdoprocessador.As
variveis(assimcomooprogramacomoumtodo)costumamserarmazenadasnamemria.Omodificador
registerdizaocompiladorqueavarivelemquestodeveser,sepossvel,guardadaemumregistrador
daCPU.
Vamosagoraressaltarvriospontosimportantes:
Porqueusarregister?VariveisnosregistradoresdaCPUvoseracessadasemumtempomuito
menorpoisosregistradoressomuitomaisrpidosqueamemria.Noentanto,amaioriados
compiladoresotimizantesatuaisusaregistradoresdaCPUparavariveis,entoousoderegister
freqentementedesnecessrio.
Emquetipodevarivelpodemosusaroregister?AntesdacriaodopadroANSIC,
registeraplicavaseapenasaostiposintechar,masopadroatualpermiteousoderegister
paraqualquerumdosquatrotiposfundamentais.claroqueseqnciasdecaracteres,arrayse
estruturastambmnopodemserguardadasnosregistradoresdaCPUporseremgrandesdemais.
registerumpedidoqueoprogramadorfazaocompilador.Estenoprecisaseratendido
necessariamente,ealgunscompiladoresatignoramomodificadorregister,oquepermitidopelo
padroC.
registernopodeserusadoemvariveisglobais,poisistoimplicariaemumregistradorda
CPUficarotempotodoocupadoporessavarivel.
Umexemplodousodoregisterdadoaseguir:
int main (void)
{
register int count;
for (count = 0; count < 10; count++)
{
...
}
return 0;
}
Oloopacima,emcompiladoresquenoguardamvariveisemregistradoresporpadro,deveser
executadomaisrapidamentedoqueseriasenousssemosoregister.Esteousomaisrecomendvel
paraoregister:umavarivelqueserusadamuitasvezesemseguida.
Estapginaumesboodeinformtica.AmpliandoavocajudaramelhoraroWikilivros.
Gerenciamentodememria
Alocaodinmica
Todososdadosdeumprogramasoarmazenadosnamemriadocomputadormuitocomumnecessitar
reservarumcertoespaonamemriaparapoderguardardadosmaistarde.Porexemplo,poderamos
reservarumespaode1000bytesparaguardarumastringqueousurioviesseadigitar,declarandoum
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 120/156
vetorde1000caracteres.Esequisssemosreservarumespaoquesconhecidonotempodeexecuo
doprograma?Eseoespaofossemuitogrande,demodoquedeclararvetoresdetaltamanhoseria
inconveniente(pois,entreoutrascoisas,aumentasemnecessidadeotamanhodoexecutvel)?
Parasolucionaresseproblema,existeaalocaodinmicadememria,quecomoonomesugere,uma
maneiradealocarmemriamedidaqueoprogramavaisendoexecutado.Asquatrofunesrelacionadas
comaalocaodinmicaserodescritasaseguir.
mallocefree
Essasduasfunessoasmaisbsicasparaogerenciamentodememria.mallocresponsvelpela
alocaodeumpedaodememria,efreeresponsvelporliberaressepedaodememria.
Afunomalloc()serveparaalocarmemriaetemoseguinteprottipo:
void *malloc (unsigned int num);
void free (void * ptr);
Paraalocarumespaonamemria,precisamosfornecerfunomalloconmerodebytesdesejados.
Elaalocanamemriaeretornaumponteirovoid*paraoprimeirobytealocado.Oponteirovoid*pode
seratribudoaqualquertipodeponteiro.Senohouvermemriasuficienteparaalocaramemria
requisitadaafunomalloc()retornaumponteironulo.
Parasaberotamanhodoblocoaalocar,precisaremosusarooperadorsizeof.Elepermitetambmsaber
automaticamenteotamanhodestructscriadaspelousurio.
Vejaumexemplodealocaodinmica:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

/* ponteiro para memria que ser alocada */
int *p;
int i;

/* alocar 10 elementos inteiros, ou seja, ( sizeof (int) * 10 ) */
p = (int *) malloc ( sizeof (int) * 10);

if ( p == NULL ) {
printf ("Erro: No foi possivel alocar memria\n");
exit(1);
}

for(i = 0; i < 10; i++) {
p[i] = i * 2;
printf ("%d\n", p[i]);
}

/* libera a memria alocada por malloc */
free (p);

return 0;
}
Outrosexemplos:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 121/156
int main()
{
int *p, *q;
p = malloc(sizeof(int));
q = p;
*p = 10;
printf("%d\n", *q);
*q = 20;
printf("%d\n", *q);
}
int main()
{
int *p, *q;
p = malloc(sizeof(int));
q = malloc(sizeof(int));
*p = 10;
*q = 20;
*p = *q;
printf("%d\n", *p);
}
Ocompiladoraceita*p=*qporquesoambosint.
Ocompiladoraceitatambmp=qporqueambossoponteiroseapontamparaomesmotipo.
Podemossimplificarp=malloc(sizeof(int))porp=malloc(4)mascomotemossistemas
operacionaisde16,32,64bitsaprimeiradeclaraotornaascoisasmaisportveis.
calloc
Afunocalloc()tambmserveparaalocarmemria,maspossuiumprottipoumpoucodiferente:
void *calloc(size_t nelem, size_t elsize);
Afunocallocreservaumblococomotamanho(nelemxelsize)octetosconsecutivos,isto,aloca
memriasuficienteparaumvetordenumobjetosdetamanhosize.Diferentedemalloc(),obloco
reservadoinicializadoa0.Essafunoretornaumponteirovoid*paraoprimeirobytealocado.O
ponteirovoid*podeseratribudoaqualquertipodeponteiro.Senohouvermemriasuficientepara
alocaramemriarequisitadaafunocalloc()retornaumponteironulo.
Exemplo:
#include <stdio.h>
#include <stdlib.h> /* Para usar calloc() */

int main (){
int *p;
int n;
int i;
... /* Determina o valor de n em algum lugar */
p = calloc(n, sizeof(int)); /* Aloca n nmeros inteiros p pode agora ser tratado como um vetor com n posicoes */
//p = malloc(n*sizeof(int)); /* Maneira equivalente usando malloc. */
if (!p)
{
printf ("** Erro: Memoria Insuficiente **");
exit(0);
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 122/156
}
for (i=0; i<n; i++) /* p pode ser tratado como um vetor com n posicoes */
p[i] = i*i;
...
return 0;
}
Noexemploacima,alocadamemriasuficienteparasecolocarnnmerosinteiros.Ooperadorsizeof()
retornaonmerodebytesdeuminteiro.Eletilparasesaberotamanhodetipos.Oponteirovoid*que
calloc()retornaconvertidoparaumint*pelocasteatribudoap.Adeclaraoseguintetestasea
operaofoibemsucedida.Senotiversido,pterumvalornulo,oquefarcomque!pretorne
verdadeiro.Seaoperaotiversidobemsucedida,podemosusarovetordeinteirosalocados
normalmente,porexemplo,indexandoodep[0]ap[(a1)].
realloc
Afunorealloc()servepararealocarmemriaetemoseguinteprottipo:
void *realloc(void *ptr, size_t size);
Afunoreallocajustaotamanhodeumblocoasizeoctetosconsecutivos.Afunomodificaotamanho
damemriapreviamentealocadacommalloc,callocourealloceapontadaporptrparaotamanho
especificadoporsize.Ovalordesizepodesermaioroumenorqueooriginal.Umponteiroparaobloco
devolvidoporquerealloc()podeprecisarmoveroblocoparaaumentarseutamanho.Seissoocorrer,o
contedodoblocoantigocopiadononovobloco,oblocoantigoliberadoenenhumainformao
perdida.Senoprecisarmover,ovalorretornadoigualaptr.Septrfornulo,afunoalocasizebytese
devolveumponteiro,funcionandocomomalloc()sesizezero,amemriaapontadaporptrliberada.Se
nohouvermemriasuficienteparaaalocao,umponteironulodevolvidoeoblocooriginaldeixado
inalterado.
Exemplo:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
char *str1=NULL, *str2=NULL;

str1 = (char *) malloc(11);
strcpy(str1, "ABCDEFGHIJ");

str2 = (char *) realloc(str2, 20);

printf("Endereo de str1 : %p\n", str1);
printf("Endereo de str2 : %p\n", str2);

str1 = (char *) realloc(str1, 100);

printf("Novo endereo de str1 : %p\n", str1);
printf("Conteudo de str1 : %s\n", str1);
free(str1);
free(str2);
return 0;
}
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 123/156
AlocaoDinmicadeVetores
Aalocaodinmicadevetoresutilizaosconceitosaprendidosnaaulasobreponteiroseasfunesde
alocaodinmicaapresentados.Umexemplodeimplementaoparavetorrealfornecidoaseguir:
#include <stdio.h>
#include <stdlib.h>
float *Alocar_vetor_real (int n)
{
float *v; /* ponteiro para o vetor */
if (n < 1)
{ /* verifica parametros recebidos */
printf ("** Erro: Parametro invalido **\n");
return (NULL);
}
v = calloc (n, sizeof(float)); /* aloca o vetor */
if (v == NULL)
{
printf ("** Erro: Memoria Insuficiente **");
return (NULL);
}
return (v); /* retorna o ponteiro para o vetor */
}
float *Liberar_vetor_real (float *v)
{
if (v == NULL) return (NULL);
free(v); /* libera o vetor */
return (NULL); /* retorna o ponteiro */
}
int main (void)
{
float *p;
int a;
... /* outros comandos, inclusive a inicializacao de a

*/
p = Alocar_vetor_real (a);
... /* outros comandos, utilizando p[] normalmente */
p = Liberar_vetor_real (p);
}
AlocaoDinmicadeMatrizes
Aalocaodinmicadememriaparamatrizesrealizadadamesmaformaqueparavetores,coma
diferenaqueteremosumponteiroapontandoparaoutroponteiroqueapontaparaovalorfinal,ouseja
umponteiroparaponteiro,oquedenominadoindireomltipla.Aindireomltiplapodeserlevadaa
qualquerdimensodesejada,masraramentenecessriomaisdeumponteiroparaumponteiro.Um
exemplodeimplementaoparamatrizrealbidimensionalfornecidoaseguir.Aestruturadedados
utilizadanesteexemplocompostaporumvetordeponteiros(correspondendoaoprimeirondiceda
matriz),sendoquecadaponteiroapontaparaoinciodeumalinhadamatriz.Emcadalinhaexisteum
vetoralocadodinamicamente,comodescritoanteriormente(compondoosegundondicedamatriz).
#include <stdio.h>
#include <stdlib.h>

float **Alocar_matriz_real (int m, int n)
{
float **v; /* ponteiro para a matriz */
int i; /* variavel auxiliar */
if (m < 1 || n < 1)
{ /* verifica parametros recebidos */
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 124/156
printf ("** Erro: Parametro invalido **\n");
return (NULL);
} /* aloca as linhas da matriz */
v = calloc (m, sizeof(float *)); /*Um vetor de m ponteiros para float */
if (v == NULL)
{
printf ("** Erro: Memoria Insuficiente **");
return (NULL);
}
for ( i = 0; i < m; i++ ) /* aloca as colunas da matriz */
{
v[i] = calloc (n, sizeof(float)); /* m vetores de n floats */
if (v[i] == NULL)
{
printf ("** Erro: Memoria Insuficiente **");
return (NULL);
}
}
return (v); /* retorna o ponteiro para a matriz */
}

float **Liberar_matriz_real (int m, int n, float **v)
{
int i; /* variavel auxiliar */
if (v == NULL) return (NULL);
if (m < 1 || n < 1)
{ /* verifica parametros recebidos */
printf ("** Erro: Parametro invalido **\n");
return (v);
}
for (i=0; i<m; i++) free (v[i]); /* libera as linhas da matriz */
free (v); /* libera a matriz (vetor de ponteiros) */
return (NULL); /* retorna um ponteiro nulo */
}

int main (void)
{
float **mat; /* matriz a ser alocada */
int l, c; /* numero de linhas e colunas da matriz */
int i, j;
... /* outros comandos, inclusive inicializacao para l e c */
mat = Alocar_matriz_real (l, c);
for (i = 0; i < l; i++)
for ( j = 0; j < c; j++)
mat[i][j] = i+j;
... /* outros comandos utilizando mat[][] normalmente */
mat = Liberar_matriz_real (l, c, mat);
...
}
Sockets
Abstraes
AversoUnixBSD4.1cde1982paraVAXfoiaprimeiraaincluirTCP/IPnokerneldosistema
operacional,oferecendoaomesmotempoumainterfacedeprogramaocomoabstraoparaesses
protocolos.OssoquetesousocketssoumaAPI(ApplicationProgramInterface)issoquerdizeruma
interfaceentreosprogramaseacamadadetransporte.Exemplo:TCP,UDP.Ossoquetespodemusar
outrosprotocoloscomoAppleTalk,XroxXNS,etc.AAPIdesocketsfoidesenvolvidaparaalinguagem
CesoumadasprincipaisAPIparasistemasdotipoUNIX.OWindowspossuiumainterfacesimilar
conhecidacomonomedeWinsock.
Funesdabibliotecapadro
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 125/156
int accept(int, struct sockaddr *restrict, socklen_t *restrict);
int bind(int, const struct sockaddr *, socklen_t);
int connect(int, const struct sockaddr *, socklen_t);
int getpeername(int, struct sockaddr *restrict, socklen_t *restrict);
int getsockname(int, struct sockaddr *restrict, socklen_t *restrict);
int getsockopt(int, int, int, void *restrict, socklen_t *restrict);
int listen(int, int);
ssize_t recv(int, void *, size_t, int);
ssize_t recvfrom(int, void *restrict, size_t, int,
struct sockaddr *restrict, socklen_t *restrict);
ssize_t recvmsg(int, struct msghdr *, int);
ssize_t send(int, const void *, size_t, int);
ssize_t sendmsg(int, const struct msghdr *, int);
ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *,
socklen_t);
int setsockopt(int, int, int, const void *, socklen_t);
int shutdown(int, int);
int socket(int, int, int);
int sockatmark(int);
int socketpair(int, int, int, int[2]);
Famliasdeendereo
Existemvariasfamliasdeendereoecadaumacorrespondeaumprotocoloemparticular.
Asfamliasmaisusadasso:
AF_UNIX:ProtocolointernodoUNIX
AF_INET:ProtocoloInternet
AF_NS:ProtocolodeXeroxNS
Estruturasdeendereo
Variaschamadaaosistemaderedesdounixprecisamapontarparaumaestruturadeendereodesocket.
Adefiniodessasestruturasestadefinidadentrodocabealho<sys/socket.h>.
struct sockaddr {
u_short sa_family ;
char sa_data[14] ;
} ;
sa_family:FamliadeendereolevaovalorAF_xxx.
sa_data:endereoespecificodeprotocolo.
Paraafamliainternetasestruturaestodefinidasdentrodocabealho<netinet/in.h>.
struct in_addr {
u_long s_addr ;
} ;
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 126/156
struct sockaddr_in {
short sin_family ;
u_short sin_port ;
struct in_addr sin_addr ;
char sin_zero[8] ;
} ;
Makefiles
Makefile
OobjetivodeMakefiledefinirregrasdecompilaoparaprojetosdesoftware.Taisregrassodefinidas
emarquivochamadoMakefile.OprogramamakeinterpretaocontedodoMakefileeexecutaasregras
ldefinidas.AlgunsSistemasOperacionaistrazemprogramassimilaresaomake,taiscomogmake,nmake,
tmake,etc.Oprogramamakepodevariardeumsistemaaoutropoisnofazpartedenenhuma
normalizao.
OtextocontidoemumMakefileusadoparaacompilao,ligao(linking),montagemdearquivosde
projetoentreoutrastarefascomolimpezadearquivostemporrios,execuodecomandos,etc.
VantagensdousodoMakefile:
Evitaacompilaodearquivosdesnecessrios.Porexemplo,seseuprogramautiliza120bibliotecas
evocalteraapenasuma,omakedescobre(comparandoasdatasdealteraodosarquivosfontes
comasdosarquivosanteriormentecompilados)qualarquivofoialteradoecompilaapenasa
bibliotecanecessria.
Automatizatarefasrotineirascomolimpezadevriosarquivoscriadostemporariamentena
compilao
Podeserusadocomolinguagemgeraldescriptemborasejamaisusadoparacompilao
AsexplicaesaseguirsoparaoutilitrioGNUmake(gmake)quesimilaraomake.
EntovamosparaaapresentaodoMakefileatravsdacompilaodeumpequenoprojetoem
linguagemC.
Criarumapastacomesses4arquivos:
teste.c,teste.h,main.c,Makefile.
DeumnomeparaapastaProjeto.
/*================ teste.c ======================*/
#include <stdio.h>
#include <stdlib.h>
/*Uma funao makeTeste()*/
void makeTeste(void){
printf("O Makefile super Legal\n");
}
Aquiescrevemosoheader:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 127/156
/*======================= teste.h ===============*/
/*================== Cabealho ou header ========*/
#ifndef _H_TESTE
#define _H_TESTE
/* A nossa funo */
void makeTeste(void);
/* De um enter depois de endif*/
/*Para evitar warning*/
#endif
Agoraafunomain:
/*====================== main.c =================*/
#include <stdio.h>
#include <stdlib.h>
#include "teste.h"
/* Aqui main ;( */
int main(void){
makeTeste();
return (0);
}
ParacompilarfazemosumarquivoMakefileminimal.
#Para escrever comentrios ##
############################# Makefile ##########################
all: teste
teste: teste.o main.o
# O compilador faz a ligao entre os dois objetos
gcc -o teste teste.o main.o
#-----> Distancia com o boto TAB ### e no com espaos
teste.o: teste.c
gcc -o teste.o -c teste.c -W -Wall -ansi -pedantic
main.o: main.c teste.h
gcc -o main.o -c main.c -W -Wall -ansi -pedantic
clean:
rm -rf *.o
mrproper: clean
rm -rf teste
ParanotererrososespaosdevemserfeitocomateclaTAB.
Ecompilarsirdentrodapasta"Projeto"apertarF4escrevermakeeapertarenter.
Umavezcompiladopodemosmodificarteste.c.Seteste.cfoimodificadoentomakemodificateste.oese
nodeixateste.ocomoesta.
all:onomedasregrasaseremexecutadas.
teste:teste.c.Podeserinterpretadocomarquivo_de_destino:arquivo_de_origem.
clean:Apagaosarquivosintermedirios.Sevocescrevernoconsolemakeclean
eleapagaosarquivosobjetodapasta.
mrproper:Apagatudooquedevesermodificado.Noconsoleescrevamakemrproper
Sintaxedecriaodoarquivo
Omakefilefuncionadeacordocomregras,asintaxedeumaregra:
regra: dependncias
Apertar o boto TAB comando
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 128/156
comando ...
Regrascomplementares
all:onomedasregrasaseremexecutadas.
clean:Apagaosarquivosintermedirios.
mrproper:Apagatudooquedevesermodificado.
DefinirVariveis
Asvariveisservemparafacilitarotrabalho.
Emvezdemudarvariaslinhasmudamossovalordavarivel.
Deveserporissoquesechamavarivel,no?
Definimosdaformaseguinte.
NOME=VALOR
E para utilizar esta varivel colocamos entre $() .
Ento ela vai ficar assim $(NOME)
VamosparaoexemplocomonossoMakefile.
Colocamosemvezde:
NOMESRC
EemvezdeVALORmain.c.
Eparapoderusar$(SRC)
Serquenapraticafunciona?.Vamosver..
#Para escrever comentrios ##
############################# Makefile ##########################
#Definimos a varivel
SRC=main.c
all: teste
teste: teste.o main.o
gcc -o teste teste.o main.o
#-----> Distancia com o botao TAB ### e nao com espaos
teste.o: teste.c
gcc -o teste.o -c teste.c -W -Wall -ansi -pedantic
#
#Coloquei $(SRC) em todos os lugares aonde estava main.c
main.o: $(SRC) teste.h
gcc -o main.o -c $(SRC) -W -Wall -ansi -pedantic
clean:
rm -rf *.o
mrproper: clean
rm -rf teste
TodososlugaresdocdigoquecontemoCONTEDOdavarivelsomodificadoscolocandonolugar
respectivooNOMEda
varivel.
VariveisPersonalizadas
CC=gcc.DefinimosCCparanomesdecompiladoresdeCouC++.Aquiogcc.
CFLAGS=WWallansipedantic.Serveparadefiniropespassadasaocompilador.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 129/156
Paraoc++oNOMEeCXXFLAGS.
LDFLAGSeutilizadoparaeditarasopesdelinks.
EXEC=teste.EXECdefineoNOMEdofuturoprogramaexecutvel.
OBJ=teste.omain.o.Paracadaarquivo.cumarquivoOBJETOecriadocomaextenso".o"
arquivo.o.
Entoesolharnasuapastatodososarquivoscomaextenso".c"ecolocarnavarivelOBJcoma
extenso".o".
Outramaneiraemesmacoisa.OBJagoraeigualamain.oteste.o
SRC = main.c teste.c
OBJ= $(SRC:.c=.o)
Esupermaneroatuaidiacamarada.
Maistenho200arquivos.cenoqueroolharonomedetodosumporum.
Temoutraidia??
Poderamosutilizar*cmaisnopodemosutilizarestecaracterjokernadefiniodeuma
varivel.
Entovamosutilizarocomando"wildcard"elepermiteautilizaodecaracteresjokerna
definiodevariveis.
Ficaassim.
SRC= $(wildcard *.c)
OBJ= $(SRC:.c=.o)
Observaosequiserfazeraparecerumamensagemduranteacompilaoescreva@echo"Minha
mensagem".
Emaistemummontedemensagenseficamuitofeio
Temoutraidia??..Opessoalvamosparando)nosouumamaquinadeidias.
Paradeixarasmensagensemmodosilenciosocoloque"@"nocomeodocomando.
Ficaassim
@$(CC) -o $@ $^
Variveisinternas
$@ Nome da regra.
$< Nome da primeira dependncia
$^ Lista de dependncias
$? Lista de dependncias mais recentes que a regra.
$* Nome do arquivo sem sufixo
Asregrasdeinterferncia
Nodissenadaantesporqueestvamosnoestadoprincipiantes"noob".
Soregrasgenricaschamadaspordefault.
.c.o:.Elasignificafazerumarquivo.oapartirdeumarquivo.c.
%.o:%.c.Amesmacoisa.Alinhateste.o:teste.cpodesermodificadacomessaregra.
.PHONY:.Prestebemateno.Estaregrapermitedeevitarconflitos.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 130/156
Porexemplo"clean:"eumaregrasemnemumadependncianotemosnadanapastaquese
chameclean.
Agoravamoscolocarnapastaumarquivochamadoclean.Sevoctentarapagaros
"arquivos.o"escrevendo"makeclean"novaiacontecernadaporquemakedizquecleanno
foimodificado.
Paraevitaresseproblemausamosaregra.PHONY:.Ficaassim.
.PHONY:cleanmrproper
.PHONY:dizquecleanemrproperdevemserexecutadosmesmosearquivoscomesses
nomesexistem.
AgoravamosmodificarmaisumavezonossoMakefilecomtudooquesabemossobrevariveis.
#Para escrever comentrios ##
############################# Makefile ##########################
#Definimos a varivel
CC=gcc
CFLAGS=-W -Wall -ansi -pedantic
EXEC=teste
OBJ=teste.o main.o
all: $(EXEC)
@echo "Vou comear a compilao"
#No coloquei a varivel OBJ para que possam entender as variveis internas.
#Se entenderam podem colocar $(OBJ) no lugar de teste.o main.o
teste: teste.o main.o
# $@ = teste:
# $^ = teste.o main.o
$(CC) -o $@ $^
# teste.o:teste.c
%.o: %.c
$(CC) -o $@ -c $< $(CFLAGS)
main.o: main.c teste.h
$(CC) -o $@ -c $< $(CFLAGS)
.PHONY: clean mrproper
clean:
rm -rf *.o
@echo "Compilaao prontinha"
mrproper: clean
rm -rf $(EXEC)
Polegal)pareceattrabalhodegentegrande.
SubMakefiles
Lertudoissosparacompilarumprograma??
Osubmakefileelanadopormeiodeum"Makefileprincipal"vamossimplificarparaoPatroMakefile.
Aondeestvamos??...Ahsim,paraqueserve??
OMakefilePrincipalexecutaossubmakesfilesdeoutraspastas.
Comoelefaz??
Usamos uma varivel pre-definida $(MAKE).
Baoaotrabalho..Criedentrodapasta"Projetos"outrapastacomonome"submake".Dentrodapasta
submakecrieumarquivo
Makefileeumarquivosubmake.c
DentrodapastasubmakecoloqueesteMakefile.
##################Pasta:sub-make ## Makefile ###################
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 131/156
CC=gcc
CFLAGS=-W -Wall -ansi -pedantic
EXEC=teste2
SRC= $(wildcard *.c)
OBJ= $(SRC:.c=.o)
all: $(EXEC)
@echo "compilando sub-makefile"
@echo "sub-makefile compilado"
teste2: $(OBJ)
@$(CC) -o $@ $^
.PHONY: clean mrproper
clean:
@rm -rf *.o
mrproper: clean
@rm -rf $(EXEC)
Agoravamosescreveroarquivosubmake.c.
#include <stdio.h>
#include <stdlib.h>
/* Informao
* Nao utilizem este cdigo para fazer um kernel
*/
int main(void)
{
printf("Sou o binrio que est em sub-make");
printf("Finalmente em fim vivo graas ao Patro Makefiles ;)");
return (0);
}
Agoraretornenapasta"Projeto"vamosmodificaroMakefile.
Vamoscolocaraseguintelinha:
@cd sub-make && $(MAKE)
Explicando:"@"silencioso"cd"paraabrirapastasubmake"&&"eexecutarmake"$(MAKE)"
Vamosfazeramesmacoisapara"clean:"e"mrproper:"entoaoexecutar"makeclean"noconsole
elevaiexecutaromesmocomandonosubmakefile.
########################## O Makefile principal ##########################"
CC=gcc
CFLAGS=-W -Wall -ansi -pedantic
EXEC=teste
SRC= $(wildcard *.c)
OBJ= $(SRC:.c=.o)
all: $(EXEC)
@echo "Compilando Projeto"
@echo "O patro foi compilado"
#A linha que vai compilar sub-make
@cd sub-make && $(MAKE)
teste: $(OBJ)
@$(CC) -o $@ $^
%.o: %.c
@$(CC) -o $@ -c $< $(CFLAGS)
main.o: main.c teste.h
@$(CC) -o $@ -c $< $(CFLAGS)
.PHONY: clean mrproper
clean:
@rm -rf *.o *~
# E a mesma coisa que dar um F4 dentro da pasta sub-make
# e escrever make clean
@cd sub-make && $(MAKE) $@
mrproper: clean
@rm -rf $(EXEC)
#modificamos aqui tambm
@cd sub-make && $(MAKE) $@
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 132/156
NoesqueadedarTABemtodasaslinhasqueestoembaixodos":"doispontinhos.OKagorasdar
umF4dentrodapastaprojetosevoctemtrscomandosadisposio.
make
makeclean
makemrproper
Makeinstall
Automatizandoainstalaodoprogramacomaregrainstall:.
install:.Colocaobinrioouexecutvelemumadeterminadapasta,comoporexemplo/binou
/usr/binnoLinux.Podeseremqualqueroutra,utilizandoocomando"mv"ou"cp"paramoverou
copiar.
Crieumapastabindentrode"Projetos".Devemsaberquenodevemcolocarnadaintilquevenha
dainternetnapastaraizdolinux.
Vamosfazerduasvariveis:
prefix=/caminho/ateonde/esta/Projetos
bindir=$(prefix)/bin.Iguala/caminhoate/Projetos/dentrodeProjetosapastabin.
Eadicionarmosaregrainstall:allcomseuscomandos.
Modificandoomakeprincipal.
########################## O Makefile principal ##########################"
#Coloque o caminho at Projeto aqui
prefix=/home/USER/Projeto
bindir=$(prefix)/bin
CC=gcc
CFLAGS=-W -Wall -ansi -pedantic
EXEC=teste
SRC= $(wildcard *.c)
OBJ= $(SRC:.c=.o)
all: $(EXEC)
@echo "Compilando Projeto"
@echo "O patrao foi compilado"
#A linha que vai compilar sub-make
@cd sub-make && $(MAKE)
teste: $(OBJ)
@$(CC) -o $@ $^
%.o: %.c
@$(CC) -o $@ -c $< $(CFLAGS)
main.o: main.c teste.h
@$(CC) -o $@ -c $< $(CFLAGS)
#Entao depois e so executar make e depois make install
install:all
@mv $(EXEC) $(bindir)/
.PHONY: clean mrproper
clean:
@rm -rf *.o *~
# E a mesma coisa que dar um F4 dentro da pasta sub-make
# e escrever make clean
@cd sub-make && $(MAKE) $@
mrproper: clean
@cd bin && rm -rf $(EXEC)
#modificamos aqui tambem
@cd sub-make && $(MAKE) $@
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 133/156
Entoquandovocdigitarnoconsole"make"depois"makeinstall"elevaicolocarobinarioqueestaem
"Projetos"dentrode"bin".
Sevocquisercolocarobinarioqueestanapasta"submake"napasta"bin"
Copiarecolarnomakefileda"submake"asvariaveis"prefix"e"bindir"earegrainstall:comseu
comando.
Eno"Makefileprincipal"embaixode"install:"coloqueestalinha@cdsubmake&&$(MAKE)
$@
Aquieumodifiqueio"mrproper"porqueagoraosbinariosquedevemserapagadoscom"make
mrproper"estoem"bin".
Voudeixarvocesmodificaremo"mrproper"do"submakefile"comopessoasadultase
responsaveis)Valeugalera.
Oscomandosnoconsoleso:
make
makeinstall
makeclean
makemrproper.Paraapagarosbinarios.
Listadepalavrasreservadas
AlinguagemCpossuiumtotalde32palavrasconformedefinidopelopadroANSI,quesoelas:
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
importantelembrarquetodasaspalavrasreservadassoescritasemminsculoenopodemser
utilizadasparaoutropropsito.Algunscompiladoresincluemoutraspalavrasreservadascomo,asm,
cdecl,far,fortran,huge,interrupt,near,pascal,typeof.
Seqnciasdeescape
OCtemvriasseqnciasdeescape.Elasservemgeralmenteparainserirumcaractereespecialnuma
String.
Algumasdessasseqnciasso:
\aAlarm,Alarme=Tocaoalarmesonorodosistema
\bBackspace,Retrocesso=Apagaocaractereesquerdadocursor
\nNewLine,Novalinha=Pulaumalinha
\tTabulaohorizontal=EquivaledarumTABnastring
\rCarriageReturn,RetornodoCarro=Voltaparaoinciodalinha.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 134/156
\tHorz.Tab,TabulaoHarizontal=Saltafrenteconformeseusajustesdetabulao
\0Null,Nulo=Caracterenuloouzerogeralmenteestabelecidocomofimdestring
Listadefunes
AquiestoasvriasfunespresentesemCseparadasporcabealho:
stdio.h
printf
scanf
vsnprintf
sprintf
vprintf
fprintf
fscanf
feof
fflush
calloc
malloc
system
gets
fgets
puts
fputs
stdlib.h
atoi
atof
atol
itoa
string.h
strcmp
stricmp
strlen
strstr
strcat
strcpy
strncpy
strncat
strchr
strrev
signal.h
iso10646.h
time.h
math.h
tan
sin
cos
atan
asin
acos
pow
sqrt
abs
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 135/156
Listadebibliotecas
CabealhosdebibliotecaspadroANSIC(C89)/ISOC(C90):
assert.h
ctype.h
errno.h
float.h
limits.h
locale.h
math.h
setjmp.h
signal.h
stdarg.h
stddef.h
stdio.h
stdlib.h
string.h
time.h
CabealhosadicionadosnoISOC(C94/C95):
iso646.h wchar.h wctype.h
CabealhosadicionadosnoISOC(C99)(suportadossomenteemcompiladoresmaisnovos):
complex.h
fenv.h
inttypes.h
stdbool.h
stdint.h
tgmath.h
Ligaesexternas
TheOpenGroupBaseSpecificationsIssue7
(http://www.opengroup.org/onlinepubs/9699919799/functions/contents.html)(english)
BibliotecaC(http://www.cplusplus.com/reference/clibrary/)(english)
DicasdeprogramaoemC
Convenestipogrficas
Umadasmelhoresmaneirasdeobterumcdigoclaroeusandoidentificadorescoerentes.
Porexemplobompoderidentificarrapidamenteasvariveisemfunodesuaspropriedades.
Vejaabaixoalgumasdelas.
prefixos identificadores
- ponteiro p_
- tabela esttica(static array) a_ ou sa_
- tabela dinmica (dynamic array) da_
- cadeia de caracteres(string) s_
Emumcdigocomavarivel"p_exemplo"podemosdeduzirrapidamentequeestamosusandoum
ponteiro.
Afunoprintfamelhoramigadeumprogramador
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 136/156
Umprogramadornovatotendeaverapenasduasaplicaesparaoprintf:
1. Solicitarentradaparaousuriodoprograma.
2. Imprimiroresultadodoprograma.
Ofatoqueumprogramadorpodeaplicaroprintfafimdesaberoqueocorreduranteaexecuode
programa.Istopermite,dentreoutrascoisas,detectarerros.
Porexemplo,suponhaumprogramanoqualvriasfuneserotinassoexecutadas.Algocomo:
int main(int argc, char *argv[])
{
...
funcao1(...);
funcao2(...);
funcao3(...);
funcao4(...);
...
return 0;
}
Digamosqueoprogramatenhasidocompiladocomsucesso,masocorraalgumerrodurantesuaexecuo.
Podemosusaroprintfparadetectaroerrodaseguintemaneira:
int main(int argc, char *argv[])
{
...
printf("iniciando funcao1");
funcao1(...);
printf("completa funo1, iniciando funcao2");
funcao2(...);
printf("completa funo2, iniciando funcao3");
funcao3(...);
printf("completa funo3, iniciando funcao4");
funcao4(...);
printf("completa funo4");
...
return 0;
}
Istopermiteoprogramadordeterminaratquepontooprogramarodaantesdedarerro,facilitandomuitoa
detecodeste.
Outroexemplodecomooprintftilnadetecodeproblemas.Suponhaumprogramacheiodelaos
aninhados.Talcomo:
for(...)
{
while(...)
{
...
for(...)
{
...
}
}
}
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 137/156
Casoduranteaexecuooprogramaentreemumloopinfinito,umaformadedetectaremqualdoslaos
estoproblema:
for(...)
{ printf("Teste 1");
while(...)
{ printf("Teste 2");
...
for(...)
{ printf("Teste 3");
...
}
}
}
Aimpressoqueserepetireternamenteaqueladentrodolaoproblemtico.
Umltimoexemplodedetecodeproblemaspormeiodoprintf.Suponhaquearespostadadaporum
programanoaesperada,quearespostaconsistenaimpressodeumavarivelx,aqualrecebediversas
atribuiesaolongodoprograma.Podemosidentificaroerrodandoumprintfemxapscadaumadesuas
atribuies:
x=...
printf("primeira atribuicao de x eh %tipo", x);
...
x=...
printf("segunda atribuicao de x eh %tipo", x);
...
x=...
printf("terceira atribuicao de x eh %tipo", x);
...
printf("A resposta eh %tipo", x);
Casoovalordexdependadovalordeoutrasvariveisquenosoimpressas,imprimilaspodeajudarna
detecodoproblema.
Parausocomodebug,alinguagemCapresentaduasmacrosquequandoutilizadasjuntocomoprintfso
timosrecursos.
__FILE__=nomedoarquivo.
__LINE__=numerodalinhadeexecuo.
OCompiladorgccaindadispedeumaoutramacrobastanteutil:
__PRETTY_FUNCTION__=nomedafunoatual.
...
printf("%d:%s:%s\n", __LINE__, __FILE__, __PRETTY_FUNCTION__);
...
Otrechoacimavaitedarumasaidaparadebugmuitoutilcomoseguinteconteudo:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 138/156
Exemplo:
3:hello.c:main
Tecle1pararodar
Existemduasformasdemanterumprogramarodandoenquantoousuriodesejar:
1. Conteramaiorpartedoprogramadentrodeumlao.
2. Usarocomandogoto(lembresequeocomandogotonodeusoaconselhadoparaaprogramao
estruturada).
Algunsexemplos:
Comwhile:
int main(int argc, char *argv[])
{

int rodando=1;
while(rodando==1)/*Este laco mantem o programa rodando enquanto o usuario desejar*/
{
...

printf("\nDigite 1 para continuar rodando o programa.");
printf("\nDigite qualquer outro numero para encerrar o programa. ");
scanf("%d", &rodando);
}

return 0;
}
Comdo...while
int main(int argc, char *argv[])
{
short int rodando;
do /*Este laco mantem o programa rodando enquanto o usuario desejar*/
{
...
printf("\nDigite 1 para manter o programa rodando. ");
scanf("%d", &rodando);
}while(rodando==1);

return 0;
}
Comogoto
int main(int argc, char *argv[])
{
MARCA:

...
FIM:
int y;
printf("Tecle 1 para continuar rodando o programa. Tecle 0 para encerrar o programa\n");
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 139/156
scanf("%d",&y);
if(y==1)
{
goto MARCA;
}

if(y!=1 && y!=0)
{
goto FIM;
}
return 0;
}
Listasencadeadas
Listasencadeadassoestruturasdedadoslinearesedinmicas,agrandevantagemqueelaspossuemem
relaoaousodevetorofatodeteremtamanhomximorelativamenteinfinito(otamanhomximoo
damemriadocomputador),aomesmotempoquepodemterotamanhomnimode1elementoevitandoo
desperdciodememria.
Primitivas
Noexistenenhumanormalizaoquantoasprimitivasusadasparaamanipulaodeumalista.
Abaixovocpodeverumalistacomalgumasdelas.
Colocarondicesobreoprimeiroelementodalista.
Colocarondicesobreoltimoelementodalista.
Colocarondicesobreoelementoquesegueoelementoatual.
Colocarondicesobreoelementoqueprecedeoelementoatual.
Verificarsealistaestvazia:Sealistaestivervaziaretornaverdadeiro,seno,falso.
Verificarseoprimeiroelemento:Retornaverdadeiroseoelementoatualoprimeiro,seno,
falso.
Verificarseoltimoelemento:Retornaverdadeiroseoelementoatualoltimo,seno,falso.
Verificaronmerodeelementosdalista:Retornaonmerodeelementosdalista.
Adicionarumelementonoincio:Adicionarumelementoantesdoprimeiroelementodalista.
Adicionarumelementonofim:Adicionarumelementodepoisdoltimoelementodalista.
Insero:Inserirumelementoantesdoelementoatual.
Troca:Trocaroelementoatual.
Remoo:Removeroelementoatual.
Listartodososelementosdalista.
Listaencadeadalinear
Cadanouelementodeumalistaencadeadairpossuirguardarovalordoneoendereodoprximo
n.EmumalistaencadeadalinearoultimoelementoapontaparaNULL.
struct No{
char *p_dados;
struct No *p_prox;
};
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 140/156
Iniciarumalista
Afunoabaixodemonstracomoiniciarumalistacriandooespaodaraiznamemria.
void criar_Lista(struct No **p_Raiz){
*p_Raiz = NULL;
}
Insero
Existem3tiposdeinseroemumalista,podeseinserirnocomeo,nofinalouentredoiselementosda
lista.
Inseronoincio
int inserir_No_Inicio(struct No **p_Raiz, char *p_String){
struct No *p_Novo;
/** Alocao dinmica da memoria */
if((p_Novo = (struct No *) malloc(sizeof(struct No))) == NULL ){
puts( "Falta Memoria\n"); return -1 ;
}

p_Novo->p_dados = p_String;

p_Novo->p_prox = *p_Raiz;
*p_Raiz = p_Novo;
}
Inseronofim
int inserir_No_Fim(struct No **p_Raiz, char *p_String){
struct No *p_Novo;
if(( p_Novo = (struct No *) malloc(sizeof(struct No))) == NULL ){
puts( "Falta Memoria\n"); return -1 ;
}
p_Novo->p_dados = p_String;
p_Novo->p_prox = NULL;

if(*p_Raiz == NULL)
*p_Raiz = p_Novo;
else{
struct No *e_atual; /*@ Elemento atual*/
e_atual = *p_Raiz; /*@ Primeiro elemento*/

while(e_atual->p_prox != NULL){
e_atual = e_atual->p_prox;
}
e_atual->p_prox = p_Novo;
}
}
Remoo
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 141/156
Assimcomonainserotambmexistem3tiposderemoo,noincio,nofimouentredoiselementosda
lista.
Remoonoincio
void remover_No_Inicio(struct No **p_Raiz){
if(*p_Raiz == NULL) printf("\nA lista ja esta vazia\n");
else{
struct No *p_atual;
p_atual = *p_Raiz;

*p_Raiz = (*p_Raiz)->p_prox;
free(p_atual);
}
}
Remoonofim
void remover_No_Fim(struct No **p_Raiz){
if(*p_Raiz == NULL) printf("\nA lista ja esta vazia");
else{
struct No *p_atual, *p_anterior ;
p_atual = *p_Raiz;
while(p_atual->p_prox != NULL){
p_anterior = p_atual ;
p_atual = p_atual->p_prox;
}
p_anterior->p_prox = NULL;
free(p_atual);
}
}
Exibio
Dofimparaaraiz
void mostrar_Do_Fim_Para_Raiz(struct No *p_Raiz){
if(p_Raiz == NULL) printf("\nLista vazia");
else{
struct No *p_Atual_Corredor, *p_Atual_Fim;
p_Atual_Corredor = p_Raiz;
p_Atual_Fim = p_Raiz;
while(p_Atual_Fim->p_prox != NULL){ //ir para o ultimo elemento
p_Atual_Fim = p_Atual_Fim->p_prox;
}
while(p_Atual_Corredor != p_Atual_Fim){
if(p_Atual_Corredor->p_prox == p_Atual_Fim){
printf(" <- %s", p_Atual_Fim->p_dados);
p_Atual_Fim = p_Atual_Corredor;
p_Atual_Corredor = p_Raiz;
}
else p_Atual_Corredor = p_Atual_Corredor->p_prox;
}
printf(" <- %s", p_Atual_Fim->p_dados);
}
}
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 142/156
Daraizparaofim
void mostrar_Da_Raiz_Para_Fim(struct No *p_Raiz){
if(p_Raiz == NULL) printf("\nLista vazia");
else{
struct No *p_atual;
p_atual = *p_Raiz;
while(p_atual != NULL){
printf("%s", p_atual->p_dados);
p_atual = p_atual->p_prox;

}
}
}
Pilha
Pilha
Pilhaoustackumalistalinearemquetodasasinsereseremoesdeelementospodemserfeitosem
umaextremidadechamadatopo.AspilhastambmsochamadasdeestruturasLIFO(LastInFirstOut)ou
sejaoltimoelementoinseridooprimeiroremovido.
Construodoprottipodeumelementodalista.

typedef struct Elemento_da_lista{
char *dados;
struct Elemento_da_lista *proximo;
}Elemento;


struct Localizar{
Elemento *inicio;
int tamanho;
} Pilha;
Inicializao
void iniciar (Localizar *monte){
monte->inicio = NULL;
monte->tamanho = 0;
}
Inserirumelementonapilha(push)
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 143/156
Algoritmo:
Declaraodoelemento(s)aserinserido.
Alocaodamemriaparaonovoelemento
Inicializarocampodedados.
Preencheroponteiroiniciocomoprimeiroelemento
Colocaremdiaotamanhodapilha.
int empilhar(Localizar * monte, char *dados){
Elemento *novo_elemento;
if ((novo_elemento = (Elemento *) malloc (sizeof (Elemento))) == NULL)
return -1;
if ((novo_elemento->dados = (char *) malloc (50 * sizeof (char)))
== NULL)
return -1;
strcpy (novo_elemento->dados, dados);
novo_elemento->proximo = monte->inicio;
monte->inicio = novo_elemento;
monte->tamanho++;
}
Retirarumelementodapilha(pop)
int desempilhar (Localizar *monte){
Elemento *p_elemento;
if (monte->tamanho == 0)
return -1;
p_elemento = monte->inicio;
monte->inicio = monte->inicio->proximo;
free (p_elemento->dados);
free (p_elemento);
monte->tamanho--;
return 0;
}
Imprimiroselementosdapilha
void mostrar(Localizar * monte){
Elemento *atual;
int i;
atual = monte->inicio;

for(i=0;i<monte->tamanho;++i){
printf("\t\t%s\n", atual->dados);
atual = atual->proximo;
}
}
rvoresbinrias
Estemduloprecisaserrevisadoporalgumqueconheaoassunto(discuta).
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 144/156
Arvorebinria
Umaarvorebinriaumaestruturadedadosquepodeserrepresentadacomoumahierarquiaondecada
elementochamadoden.Oninicialouoprimeiroelementochamadoderaiz.Emumarvorebinria
umelementopodeterummximodedoisfilhosnonvelinferiordenominadoscomosubrvoreesquerda
esubrvoredireita.Umnsemfilhoschamadodefolha.Aprofundidadedeumnadistnciadesten
ataraizeadistanciaentreafolhamaisdistanteearaizaalturadaarvore.Umconjuntodenscoma
mesmaprofundidadedenominado,nveldarvore.
Struct
typedef struct No{
int numero;
struct No *esquerda;
struct No *direita;
}No;
Iniciar
void criarArvore(No **pRaiz){
*pRaiz = NULL;
}
Insero
void inserir(No **pRaiz, int numero){
if(*pRaiz == NULL){
*pRaiz = (No *) malloc(sizeof(No));
(*pRaiz)->esquerda = NULL;
(*pRaiz)->direita = NULL;
(*pRaiz)->numero = numero;
}else{
if(numero < (*pRaiz)->numero)
inserir(&(*pRaiz)->esquerda, numero);
if(numero > (*pRaiz)->numero)
inserir(&(*pRaiz)->direita, numero);
}
}
Remoo
No *MaiorDireita(No **no){
if((*no)->direita != NULL)
return MaiorDireita(&(*no)->direita);
else{
No *aux = *no;
if((*no)->esquerda != NULL) // se nao houver essa verificacao, esse n vai perder todos os seus filhos da esquerda!
*no = (*no)->esquerda;
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 145/156
else
*no = NULL;
return aux;
}
}

No *MenorEsquerda(No **no){
if((*no)->esquerda != NULL)
return MenorEsquerda(&(*no)->esquerda);
else{
No *aux = *no;
if((*no)->direita != NULL) // se nao houver essa verificacao, esse n vai perder todos os seus filhos da direita!
*no = (*no)->direita;
else
*no = NULL;
return aux;
}
}

void remover(No **pRaiz, int numero){
if(*pRaiz == NULL){ // esta verificacao serve para caso o numero nao exista na arvore.
printf("Numero nao existe na arvore!");
getch();
return;
}
if(numero < (*pRaiz)->numero)
remover(&(*pRaiz)->esquerda, numero);
else
if(numero > (*pRaiz)->numero)
remover(&(*pRaiz)->direita, numero);
else{ // se nao eh menor nem maior, logo, eh o numero que estou procurando! :)
No *pAux = *pRaiz; // quem programar no Embarcadero vai ter que declarar o pAux no inicio do void! :[
if (((*pRaiz)->esquerda == NULL) && ((*pRaiz)->direita == NULL)){ // se nao houver filhos...
free(pAux);
(*pRaiz) = NULL;
}
else{ // so tem o filho da direita
if ((*pRaiz)->esquerda == NULL){
(*pRaiz) = (*pRaiz)->direita;
pAux->direita = NULL;
free(pAux); pAux = NULL;
}
else{ //so tem filho da esquerda
if ((*pRaiz)->direita == NULL){
(*pRaiz) = (*pRaiz)->esquerda;
pAux->esquerda = NULL
free(pAux); pAux = NULL;
}
else{ //Escolhi fazer o maior filho direito da subarvore esquerda.
pAux = MaiorDireita(&(*pRaiz)->esquerda); //se vc quiser usar o Menor da esquerda, so o que mudaria seria isso:
pAux->esquerda = (*pRaiz)->esquerda; // pAux = MenorEsquerda(&(*pRaiz)->direita);
pAux->direita = (*pRaiz)->direita;
(*pRaiz)->esquerda = (*pRaiz)->direita = NULL;
free((*pRaiz)); *pRaiz = pAux; pAux = NULL;
}
}
}
}
}
Emordem
void exibirEmOrdem(No *pRaiz){
if(pRaiz != NULL){
exibirEmOrdem(pRaiz->esquerda);
printf("\n%i", pRaiz->numero);
exibirEmOrdem(pRaiz->direita);
}
}
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 146/156
Prordem
void exibirPreOrdem(No *pRaiz){
if(pRaiz != NULL){
printf("\n%i", pRaiz->numero);
exibirPreOrdem(pRaiz->esquerda);
exibirPreOrdem(pRaiz->direita);
}
}
Psordem
void exibirPosOrdem(No *pRaiz){
if(pRaiz != NULL){
exibirPosOrdem(pRaiz->esquerda);
exibirPosOrdem(pRaiz->direita);
printf("\n%i", pRaiz->numero);
}
}
Contarns
int contarNos(No *pRaiz){
if(pRaiz == NULL)
return 0;
else
return 1 + contarNos(pRaiz->esquerda) + contarNos(pRaiz->direita);
}
Contarfolhas
int contarFolhas(No *pRaiz){
if(pRaiz == NULL)
return 0;
if(pRaiz->esquerda == NULL && pRaiz->direita == NULL)
return 1;
return contarFolhas(pRaiz->esquerda) + contarFolhas(pRaiz->direita);
}
Alturadarvore
int maior(int a, int b){
if(a > b)
return a;
else
return b;
}

8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 147/156


int altura(No *pRaiz){
if((pRaiz == NULL) || (pRaiz->esquerda == NULL && pRaiz->direita == NULL))
return 0;
else
return 1 + maior(altura(pRaiz->esquerda), altura(pRaiz->direita));
}
EstruturaCompleta
Algoritmosdeordenao
Insertionsort
void insertion_sort(int tabela[], int largura)
{
int i, memoria,
contador;
bool marcador;

for(i=1; i<largura; i++)
{
memoria = tabela[i];
contador = i-1;
do
{
marcador = false;

if(tabela[contador] > memoria)
{
tabela[contador+1] = tabela[contador];
contador--;
marcador = true;
}
if(contador < 0)
marcador = false;
}
while(marcador);
}
tabela[contador+1] = memoria;
Selectionsort
void selectionSort( int vetorDesordenado[], int tamanhoVetor ) //Funao selection recebendo vetor e tamanho
{
int i, j, posicaoValorMinimo;

for (i = 0; i < ( tamanhoVetor - 1 ); i++) //Loop para percorrer o vetor
{
posicaoValorMinimo = i; //O valor minimo de posiao do vetor a ser percorrido e 0
for (j = ( i + 1 ); j < tamanhoVetor; j++)//Percorreremos o vetor da posiao 1 ate o tamanho estimado
{
if( vetorDesordenado[j] < vetorDesordenado[posicaoValorMinimo] ) //Se a posiao que vamos verificar for menos que a posiao que temos em maos
{
posicaoValorMinimo = j;//A variavel 'j' recebe esse valor
}
}

8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 148/156
if ( i != posicaoValorMinimo )
{
trocarPosicaoValores( &vetorDesordenado[i], &vetorDesordenado[posicaoValorMinimo] );//vamos chamar uma outra funao para trocar as posioes de lugares
}
}
}

void trocarPosicaoValores( int *posicaoA, int *posicaoB )//Funao para trocar as posioes que estamos olhando
{
int temporario;
temporario = *posicaoA;
*posicaoA = *posicaoB;
*posicaoB = temporario;
}
Bubblesort
Obubblesort,ouordenaoporflutuao(literalmente"porbolha"),umalgoritmodeordenaodos
maissimples.Aideiapercorrerovetordiversasvezes,acadapassagemfazendoflutuarparaotopoo
maiorelementodasequncia.Essamovimentaolembraaformacomoasbolhasemumtanquedegua
procuramseuprprionvel,edissovemonomedoalgoritmo.
Nomelhorcaso,oalgoritmoexecuta operaesrelevantes,ondenrepresentaonmerodeelementos
dovetor.Nopiorcaso,sofeitas operaes.AcomplexidadedessealgoritmodeOrdemquadrtica.
Porisso,elenorecomendadoparaprogramasqueprecisemdevelocidadeeoperemcomquantidade
elevadadedados.
CdigodaFuno
void BubbleSort(int vetor[], int tamanho)
{
int aux, i, j;

for(j=tamanho-1; j>=1; j--)
{
for(i=0; i<j; i++)
{
if(vetor[i]>vetor[i+1])
{
aux=vetor[i];
vetor[i]=vetor[i+1];
vetor[i+1]=aux;
}
}
}
}
CdigodaFunoMelhorado
Terminaaexecuoquandonenhumatrocarealizadaapsumapassadapelovetor.
void BubbleSort(int vetor[], int tamanho)
{
int memoria, troca, i, j;

troca=1; /*A varivel "troca" ser a verificao da troca em cada passada*/
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 149/156

for(j=tamanho-1; (j>=1) && (troca==1); j--)
{
troca=0; /*Se o valor continuar 0 na prxima passada quer dizer que no houve troca e a funo encerrada.*/

for(i=0; i<j; i++)
{
if(vetor[i]>vetor[i+1])
{
memoria=vetor[i];
vetor[i]=vetor[i+1];
vetor[i+1]=memoria;
troca=1; /*Se houve troca, "troca" recebe 1 para continuar rodando.*/
}
}
}
}
Algoritmodealocao
firstfist
bestfit
Varretodaamemriaeescolheapginamaisajustadaaotamanhodoprocesso.
#include <stdio.h>
#include <windows.h>

int main(){
int p,m;
printf("Entre o numero de processos:");
scanf("%d",&p);
printf("Entre o numero de blocos de memoria:");
scanf("%d",&m);

int parr[p];
struct memoria{
int id; // identificador
int tamanho;
}marr[m];

int i;

for(i=0;i<p;i++)
{
printf("Entre o tamanho do processo %d:",i+1);
scanf("%d",&parr[i]);
}
for(i=0;i<m;i++)
{
printf("Entre o tamanho do bloco de memoria %d:",i+1);
scanf("%d",&marr[i].tamanho);
marr[i].id=i+1;
}
int j;
int tamanho = 0;

for(i; tamanho <= marr[i].tamanho; i++ )
tamanho = marr[i].tamanho;
int tamanho_velho = tamanho ;
int im ;
bool marcador = false ;

for(i=0;i<p;i++){
for(j=0;j<m;j++){
if((marr[j].tamanho>=parr[i]) && (marr[j].tamanho < tamanho) ){
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 150/156

im = j;
tamanho = marr[j].tamanho;
marcador = true ;

}

}

if(marcador){
marcador = false ;
marr[im].tamanho-=parr[i];
tamanho = tamanho_velho ;
printf("\n\nAloca o processo %d no bloco memoria %d\n Tamanho restante apos alocar %d

}else {printf("Memoria insuficiente para o processo %d",i);break;}


}
system ("pause");

return 0;
}
worstfit
Oalgoritmoworstfitalocaoblocodememrianaregioquetemomaiorespaolivre.
Esttcnicaporprocurarocuparprimeiroaspartiesmaioresterminapordeixarespaoslivresque
poderiamserutilizadosparaqueoutrosblocosdeoutrosprogramasasutilizassem,diminuindoe/ou
retardandoafragmentao.
NextFit
BuddySystem
Estapginaumesboodeinformtica.AmpliandoavocajudaramelhoraroWikilivros.
Estudo
Observaes:prrequisitoparaumbomaprendizadodequalquerlinguagemdeprogramao
conceitossobrelgicadeprogramao.
Etapasdedesenvolvimento5fases
Quasenenhumtexto: Textoemcriao: Textoemmaturao: Textodesenvolvido: Textoabrangente:
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 151/156
Sumrio
Introduo
Capa
PorqueaprenderalinguagemC?
HistriadalinguagemC
Prrequisitos
Utilizandoumcompilador
Noesdecompilao
PARTEIBsico
UmprogramaemC
Conceitosbsicos
Variveis
Tiposdedados
Constantes
Entradaesadasimples
Operaesmatemticas(Bsico)
Operaesmatemticas(Avanado)
TodososoperadoresdeC
Controledefluxo
Funes
Oprprocessador
Exerccios
PARTEIIConceitosintermedirioseavanados
Vetores(arrays)
Strings
Passagemdeparmetros
Tiposdedadosdefinidospelousurio
Enumerao(enum)
Unio(union)
Estruturas(structs)
Ponteiros
Maissobrevariveis
Maissobrefunes
Bibliotecas
Entradaesadaemarquivos
Gerenciamentodememria
Apndices
PalavrasReservadasoukeywords
Seqnciasdeescape
Listadefunes
Listadebibliotecas
DicasdeprogramaoemC
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 152/156
Conceitosextras
Sockets
Makefiles
AlgoritmoseEstruturasdedados
Listasencadeadas
Pilha
FilaouQueue
rvoresbinrias
Algoritmosdeordenao
Algoritmodealocao
Colaborao
Listadeautores
Vertambm
ProgramaremC++
Ocdigo{{Ficha do livro}}sdevesercolocadonapginaprincipaldolivro,juntamentecomoseu
ndice.Porfavor,removaodestapgina(casoelanosejaondice),ouadequeaestruturadolivros
convenesdenomenclatura.
Constantes
Estapginaprecisaserreciclada(discuta).
Aomelhorla,vocestarajudandooWikilivros.
Constantes
Emumcaptuloanteriorabordamosasvariveiseagoravamosabordarconstantes.Arazoqueascoisas
estomaismaduraseumapessoasabemuitobemoqueumaconstante.Quesimplesmenteumvalor
quenosealteraduranteaexecuodoprograma.Aquestodenosealterarduranteaescritado
programarealmentearazodestecaptulo.Devemossepararasguasentreumaconstanteeumliteral.O
literaloprpriovalor.
Existem3maneirasparacriarconstantes:
1. #define
2. [const][tipodavarivel][nomedavarivel]
3. enumerations
Estaltimavamosdeixarparamaistarde,poissoumaboaintroduoparaasclasses.
DEFINEDCONSTANTS(#DEFINE)
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 153/156
#define PI 3.14159265
#define NEWLINE "\n"
Secolocarmosestaslinhasnoheader,oquevaiaconteceroseguinte:Oprprocessadorirverificaro
nossocdigofonteesemprequeencontraradiretiva#defineir,literalmente,substituircadaocorrnciado
identificadornocdigofontepelovalordefinido.
Avantagemdistoque:
Podemosterumidentificadoraonossogosto,esemprequenecessitarmosdovalorescrevemoso
identificador,emvezdovalor,atporqueseovalorfossecomplicadopoderamosenganarnosa
escrever.Claroquenospoderamosenganartambmaescreveroidentificador,daaescolhermos
umnomefamiliar.
Esenecessitarmosdealterarovalor,alteramosapenas1vez,emvezdetodasasvezesonde
apareceriaovalor.
Oformatogeral:
#define identificador valor
Reparequeadiretivadepreprocessadornotemopontoevrgulanofim!Oquenormalpara
diretivasdePreprocessador.
Oquequeacontecesetivermosonofim?Serqueencontreiumbug?seeucolocarono#define
NEWLINE'\n'noacontecenada.
Valelembrarquecada#definepreprocessador,ouseja,nopodeseralteradodentrodoprograma
durantesuaexecuo.
// defined constants: calculate circumference
#include <stdio.h>

#define PI 3.14159
#define NEWLINE "\n"

int main (){
double r=5.0; // radius
double circle;
circle = 2 * PI * r; // utilizamos o Pi e no 3.
printf("%f", circle);
printf("%s", NEWLINE );
return 0;
}
Declaredconstants(const)
Nspodemostransformarumavarivelnumaconstantedognero:
constinttamanho=100
constchartabul='\t'
constintcodigo=12440
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 154/156
Comoprefixo"const",dizemosqueavarivelnopoderalteraroseuvalor.
Reparequesefosseumavariveleupoderiater:
int a=5;
elogoaseguirdizer
a=6;
eovalordoaficavacomovalorde6
Agoracomoprefixoconsteunopodereialterarovalor,porqueconstanteconstante,nopodemudaro
valor.
Estamaneirabemmelhordoqueaanteriorparadeclararconstantes,primeiroporqueaquitemosa
informaodotipodevarivel,emsegundoporquepodemosfazeresteconstintacomoumafunolocal
enoglobal.
Condicionais
ProgramaremC/Condicionais
Listadeautores
Listadeautores
EdudobayEduardoSangiorgioDobay
EvertonSEverton.S.Baron
Lightningspirit
ThiagoL
Uder
Wbrito
RenatoResende
Maxtremus
Noturno99BrunoSampaioPinhodaSilva
Capa
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 155/156
ndice>>Irparaondice>>
Porqueaprenderalinguagemc
Emumaeraondeosoftwareestcadavezmaispresentenonossodiaadiaimportanteteralgumasbases
deprogramao,paraissoimportanteterumbommaterialcomexplicaesclaraseexemplos,eolivro
ProgramaremCseprestabemaoexerccio.
MasporqueCenoJavaouBasic,ouaindaPerl?LinguagenscomooJavaouPerlsolinguagensabase
debytecodeinterpretadoporumamquinavirtualsendoassimnoumcdigointerpretadodiretamente
peloprocessador.Aocontrriodemuitaslinguagensdeprogramao,oCpermiteaoprogramador
enderearamemriademaneiramuitoparecidacomoseriafeitoemAssembly.LinguagenscomooJava
ouoPerlfornecemmecanismosquepermitemqueoprogramadorfaaoseutrabalhosemterquese
preocuparcomaatribuiodememriaoucomapontadores.Geralmenteissobom,umavezque
bastantetrabalhosolidarcomaalocaodememriaquandoescrevemosaplicaescomalgoritmosde
altonvel.Noentanto,quandolidamoscomtarefasdebaixonvelcomoaquelasqueumncleo(kernel)
temobrigaodedesempenhar,comoadecopiarumconjuntodebytesparaumaplacaderede,tornase
altamentenecessrioumacessodiretomemriaalgoquenopossvelfazercomJava.Cpodeser
diretamentecompiladoemcdigodemquina,eporissorpidoeeficiente.Almdisso,Cpermite
personalizarcomoimplementarcadacoisabsico,comoalocaodememria,permitindoadaptaespara
melhorardesempenho.
Valelembrarqueossoftwaresinterpretadoresdescriptoubytecode,comoJavaePython,soescritosem
linguagenscomoCeC++.
SerumasurpresaqueCsejaumalinguagemtopopular?
Comonumefeitodomin,aprximageraodeprogramassegueatendnciadosseusancestrais.
SistemasoperacionaisdesenvolvidosemCsempretmbibliotecasdesistemadesenvolvidasemC.Essas
bibliotecassousadasparacriarbibliotecasdeprograma(comoXlib,OpenGLouGTK),eseus
desenvolvedoresgeralmentedecidemusaramesmalinguagemdasbibliotecasdesistema.
8/5/2014 Programar em C/Imprimir - Wikilivros
http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&printable=yes 156/156
Desenvolvedoresdeaplicaousambibliotecasdeprogramaparadesenvolverprocessadoresdetexto,
jogos,tocadoresdemdia,etc.Muitosvodecidirtrabalharcomamesmalinguagemqueabibliotecafoi
escrita,eassimoprocessocontinua...
Cumadaslinguagensdeprogramaomaispopularesparaseescreversistemasoperacionais,comoo
MicrosoftWindows,oMacOSXeoGNU/Linux.Sistemasoperacionaiscomunicamsediretamentecom
ohardwarenohnenhumacamadamaisbaixaparamediarseuspedidos.Originalmente,ossistemas
operacionaiseramescritosnalinguagemAssembly,oqueresultavaemumcdigomuitorpidoe
eficiente.Entretanto,escreverumsistemaoperacionalemAssemblyumprocessotedioso(lento),e
produzumcdigoquefuncionarsomenteemumaarquiteturadeCPU,talcomoox86ouARM.
Escreverumsistemaoperacionalemumalinguagemdealtonvel,talcomoC,possibilitaqueos
programadoresreadaptemosistemaoperacionalavriasarquiteturassemprecisarreescrevertodoo
cdigo.Oncleo(kernel)LinuxumexemplodesistemaoperacionalescritoemC,comapenasalgumas
seesdocdigoescritasemAssembly,parapoderexecutarinstruesquesexistememumaououtra
arquiteturaeparaalgumasotimizaes.
Obtidoem"http://pt.wikibooks.org/w/index.php?title=Programar_em_C/Imprimir&oldid=223086"
Categorias: Livroscomversoparaimpresso Livro/ProgramaremC EsboosdeInformtica
!Tarefaspendentes
Estapginafoimodificadapelaltimavez(s)14h53minde7dejulhode2011.
EstetextodisponibilizadonostermosdalicenaCreativeCommonsAtribuioCompartilhamento
pelamesmaLicena3.0Unportedpodeestarsujeitoacondiesadicionais.ConsulteasCondies
deUsoparamaisdetalhes.