Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ProgramacinenC/TextocompletoWikilibros
ProgramacinenC
Textocompleto
DeWikilibros,lacoleccindelibrosdetextodecontenidolibre.
<ProgramacinenC
ProgramacinenC
Contenido
1Prlogo
1.1Prlogo
1.1.1Paraquinesestelibro?
1.1.2PorquotromanualdeC?
1.2Enlaces
1.3Licenciayautores
1.4CmocontribuiraesteWikiLibro?
2Introduccin
2.1Objetivos
2.2Notasobrelaexactitud
2.3Estndarutilizado
2.4Paralosprincipiantes
2.5Paralosmsavanzados
2.6Requisitos
2.7Herramientas
2.8Windows
2.9GNU/Linux
3HistoriadeC
3.1Evolucin
3.2Msinformacin
4Fundamentosdeprogramacin
4.1Definiciones
4.2Tiposdelenguajes
4.2.1Esquemasdeprogramacin
4.2.2Altoobajonivel
4.2.3Compiladosointerpretados
4.3Estructuradelamemoria
5PrimerprogramaenC
5.1Prerequisitosparalacompilacindeprogramas
5.2Compilacindeprogramassegnlaplataforma
5.2.1Windows
5.2.1.1Compilacindelcdigofuente
5.2.1.2Salidaporpantalla
5.2.2GNU
5.3Diseccionandoel"HolaMundo"
5.4Comentarios
6Tiposdedatos
6.1Historia
6.2Enteros
6.3Flotantes
6.4Caracteres
7Interaccinconelusuario
7.1Imprimirporpantalla
7.2Lecturadedatosdelteclado
7.2.1Lafuncinscanf()
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
1/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
8Expresiones
9Instruccionesdecontrol
9.1Laestructuracondicionalif...else
9.1.1Operadoresdecomparacin
9.1.2Operadoreslgicos
9.1.3Evaluacindecortocircuito
9.2Laestructuracondicionalabiertaycerradaswitch...case
9.3Elbuclewhile
9.4Elbuclefor
9.5Elbucledo...while
9.6Lasentenciagoto
10UsodeFunciones
10.1Funciones
10.1.1Lasentenciareturn
10.1.2Argumentos
10.1.3Declaracinydefinicin
10.1.4PasodeParmetros
10.1.4.1PorValor
10.1.4.2PorReferencia
10.1.5VariablesLocalesyGlobales
10.2FuncionesRecursivas
10.2.1Recursividadindirectaorecursinmutua
10.2.2RecursinversusIteracin
10.2.2.1EjemploIterativo
10.2.2.2EjemploRecursivo
11Vectores
12GNUFreeDocumentationLicense
12.10.PREAMBLE
12.21.APPLICABILITYANDDEFINITIONS
12.32.VERBATIMCOPYING
12.43.COPYINGINQUANTITY
12.54.MODIFICATIONS
12.65.COMBININGDOCUMENTS
12.76.COLLECTIONSOFDOCUMENTS
12.87.AGGREGATIONWITHINDEPENDENTWORKS
12.98.TRANSLATION
12.109.TERMINATION
12.1110.FUTUREREVISIONSOFTHISLICENSE
Prlogo
Prlogo
Elavancedelatecnologaylaconcurrenteentregadeinformacin,nospermitegenerarunaedicin,variableyalternativaen
laenseanzadellenguajedeprogramacinquemsimpactosocialhatenidoenlahistoriadelainformtica.Estelibrohasido
forjadoconlaincansableayudadeinformticosdehablahispana,quienesbyteabytehancolaboradoporhacerdela
informacinunafuentedeconocimientoglobal.Delamismaforma,continahoysiendomodificadoenunaconstante
bsquedadesuperacindelacalidad.
Estaobraestllamadaaserlapiedraangularenlaenseanzadelaprogramacin,lograndoabarcartodoslosaspectosdel
lenguajeendiversosnivelesydeestaformasertantounareferenciatcnicaparaquienesyadominanellenguajecomouna
introduccinsencillaparaquienesestnempezandoaconocerlo.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
2/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Viajaremosporlahistoriadellenguaje,veremossupropsitoeindagaremosenlacienciadelaprogramacin.Elfinesotorgar
allectorunadoctrinaclaradelaprogramacinyellenguajeCloinduciremosaconseguirunmanejoimportantedellenguaje.
Paraquinesestelibro?
Estelibroestdirigidoatodoslosquedeseenobtenerconocimientosdeprogramacin,pueselobjetivoexplcitoquenosha
motivadoacrearloesdifundirlaimportanciadellenguajeCenelmundodelainformtica.Sinosenfocamosaungrupo
socialespecfico,podremosindicarqueestelibrocontribuirconlosestudiantesdecarrerasdelreainformtica,debidoaque
lostemasconvenidos,sonpartedesuplandeestudios.
PorquotromanualdeC?
PorqueellenguajeCeslabasefundamentaldelaprogramacin.Paraquienesestnenelambientedelainformticaescrucial
tenerporlomenosnocionesdeestelenguaje.Variossistemasoperativos,cientosdebibliotecas,ymilesdeprogramasestn
construidosutilizandoC,alconocerloesposibleentender,colaborarydesarrollarenestelenguaje.
Lossistemas,programas,juegosyherramientasquenosotrosdisfrutamoshoyfueronconstruidosporpersonascomonosotros,
queempezaronconnuestromismopotencialyfueronaprendiendoahacercosasfantsticasconlasherramientasquetenana
mano.
UnaraznimportanteparaotrolibrodelenguajeCestambinqueloslibrosexistentesmuestranmuypocadocumentacinde
calidad.EnInternetexisteunacantidadinmensadeinformacinpublicadaperoestdispersa,ymalmanejadaenalgunos
sitios.Eslaintencindeestelibrocrearunbuencompendiodeinformacin,quepermitaalosinteresadosaprendera
programarenC.
Enlaces
Nocionesbsicasdeprogramacin(generales,independientesdellenguaje):
Fundamentosdeprogramacin
Wikilibrosimilarasteeningls
CProgramming
esquemadeoperadoresyexpresiones
[1](http://es.calameo.com/read/000048582e9eccea231d9)
Licenciayautores
Copyright2004Envite
Copyright2005AlejandroMorenoCalvo
Copyright2006AndreuCorreaCasablanca
Copyright2009zerohours
Verelhistorialdecadapginaparaelrestodeautores.
CmocontribuiraesteWikiLibro?
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
3/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Contribuirconestelibroesmuysimpleprimerodeberasregistrarteunusuarioy/oentrar(estonoesnecesarioperosimuy
conveniente)aWikilibros,paraquepodamosidentificartusediciones.Luego,sinuncahascontribuidoenunproyectode
wikipediaoenotrowikideberasleerelmanualdeusodewikilibros.
Unavezhechoestotodoloquetienesquehaceresagregarelcontenidoqueconsideresnecesarioparaellibro.Paraeditar
cualquierseccinbastaconhacerclickallinkquediceeditarenlapestaaenlapartesuperiordelapagina,seriabueno
revisar(antesdeeditarcualquiercosa)lapestaadediscusinqueestahparaserusada.Tenencuentaqueelmaterialque
yaestfueescritoporpersonasquedeseabancontribuirigualquet,asquetrataderespetarlo.Aunqueconestonomerefiero
aquesisenecesitaalgunacorreccin,reorganizacin,quitarpartesqueseanambiguas,nodejesdehacerlo.Lomejorsera
quetodoscontribuyramosdecualquiermaneraallibro.
Adems,esrecomendableconsultarlapginadediscusindellibroyladelarticuloenparticularquequierasmodificar,ya
quedeestamanerasepuedencoordinaresfuerzos.
RecuerdaquetodoelcontenidoqueaadasallibroespublicadobajolalicenciaGFDL,porloquenousesmaterialqueno
hayasidoescritoportioquenoestyapublicadobajoGFDL.RecientementewikimediadecidiadoptarlaLicenciaCreative
CommonsCompartirIgual3.0(http://creativecommons.org/licenses/bysa/3.0/deed.es)paratodoslosaportes,porloque
actualmenteellibrotieneunalicenciadual.
Introduccin
Objetivos
ElobjetivoprincipaldeesteWikilibroesquecualquierpersonasinconocimientospreviosdeprogramacinpuedasercapaz
deprogramarenellenguajeC.
Unavezlogradoeldominiodellenguaje,esprobablequeloslectoresseinteresenporotrostemasmscomplejosquesuperen
alostemasbsicos.Tambinlessermsomenossencilloaprendercualquierotrolenguajedeprogramacinestructurada.
Sinembargo,estenoesunlibroqueapuntenicamenteaprogramadoresprincipiantes.Tambinpuederesultardeinterspara
quienesyatenganexperienciaenelreadeprogramacin.Enestaintroduccinhaydosseccionesenlasqueseexplicapara
losdosgruposprincipalesdelectoresqucaminoseguirparacomenzaraprogramarenellenguajeCobienperfeccionar
conocimientos.
EllenguajeCestanusadoporqueesunlenguajedeprogramacinqueempleapocasinstruccionesenlenguajemquinapara
traducirelementosdelcdigo.Estoreducelostiemposdeejecucindelosprogramas.
Notasobrelaexactitud
Muchasdelascosasexpresadasenestewikilibro,especialmenteenlosprimeroscaptulos,nosoncompletamenteexactas,
aunquesonbuenasaproximaciones.Losdetallesmsexactosirnapareciendoposteriormente,unavezquelosmateriales
anterioreshayansidocorrectamenteasimiladosporellector.Engeneral,dadasdosdefinicionesodatoscontradictorioseneste
wikilibro,debeconsiderarsesiemprecomomsexactoalsegundo,habiendoaparecidoelprimerocomounaintroduccinms
generalaltema.
Estndarutilizado
EllenguajeCfuecreadoenlosaossetenta,yalolargodesuhistoriahapasadopormuchasmodificaciones,tantocon
respectoalasintaxiscomoconrespectoalcdigoincluidodentrodelabibliotecaestndar.Esporelloquesefueron
desarrollandoestndares,paraquetodossepanconquversindellenguajeseesttrabajando.
LosdistintosestndaresdellenguajeChansido:elCdeKernighanyRitchie,unestndarnooficialquesurgiluegodela
publicacindesulibroen1978elC89oC90,elprimerestndaroficial,posterioralapublicacindelosestndaresANSIen
1989eISOen1990yelC99,publicadoen1999.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
4/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
EnestelibroseutilizarelestndarC99,sibienporcuestionesdeestiloycompatibilidadmuchasvecesseutilizarcdigo
compatibleconelestndarC89.
Paralosprincipiantes
Paraquiennohayaprogramadoantes,esrecomendableseguirelordendellibro.Lostemasestnespecialmenteorganizados
demaneraincrementaloacumulativa.Talvez,loquesetevaahacermstilenelcaminodelaprendizajeeslaconstancias
terco,notrastabilles,noterindas,talveztupreguntaseacuntasvecestengoqueintentar?,lasvecesnecesariasparalogrartu
objetivo,seralarespuesta.
Claroqueelprincipalenemigodenosotrosloshumanoseseltiempoyporesoencasodequedeverdadeststrancadoenalgo
buscaayudadealguienquesepa"msquet".Quenotienesanadieatualrededorconesacaracterstica?Talvezno
buscastebienytalvezquierasusarlaredderedes.Utilizalosbuscadores,preguntaenIRC,enforosdeprogramacin,en
listasdecorreo.
Paralosmsavanzados
Ellanzamientoquedalibreporsupuesto,solotsabesloquenecesitas.Lasreglasdeljuegosonlasmismasdesiempre:
primerosaberloquesequiereonecesitayatacarporah.
Enestecaso,tesertilaccederaloscontenidosapartirdelndice,eligiendosloaquellosqueteseannecesarios.
Requisitos
Sepresuponequeloslectorestienenconocimientoselementalesdeinformticaaniveldeusuario,ysoncapacesdeinstalarun
compiladordellenguajeCensussistema.LosdetallessobrelainstalacinsevernenlaseccinHerramientas.
ConrespectoalHardware,slosernecesariocontarconunaPCconsistemaoperativo,dondeseaposibleinstalarun
compilador,yenloposibleunentornodedesarrollo.Cuantomejorsealacomputadora,msrpidoserelprocesode
compilacinyejecucindelosprogramas.Sinembargo,cualquierPCsirveparaaprenderconlosejemplosdeestelibro.
Paraquienesnotenganconocimientosbsicosdeprogramacin,puedeserunabuenaideacomenzarleyendolosprimeros
captulosdelWikilibroFundamentosdeprogramacin,yaquealgunostemasexplicadoseneselibroseasumenyaconocidos.
Finalmente,unrequisitoimprescindibleentodoprogramadorestenersentidocomn.Muchasvecessepuedenadoptar
mejoresopeoressolucionesantelosdiversosproblemas,yladecisindeculelegirpasaporlaaplicacindelsentidocomn.
Herramientas
ParaprogramartantoenC,comoenC++,Javaocualquierotrolenguajedeprogramacin,necesitamoscontarcon
aplicacionesoherramientasquenospermitanponerenfuncionamientonuestroprograma.
EllenguajedeprogramacinCescompilado,asqueenestecasonecesitaremosuncompilador,queserelencargadode
transformarnuestrocdigofuenteencdigoquelacomputadorapuedaejecutar.
Adems,parafacilitarlatareadelosprogramadoresexistenlosdenominadosEntornodedesarrollointegrados(IDE).En
muchoscasos,estosentornosincluyenuncompilador,undepurador,yotrasherramientas.
Lasherramientasainstalardependerndelsistemaoperativoutilizado.Acontinuacinselistanalgunasposibilidadesparael
sistemaoperativoWindowsoGNU/Linux,noesimprescindibleutilizarestasherramientasenparticular,cualquiercompilador
puedeservir.
Windows
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
5/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
UnodelosentornosdedesarrollomsconocidosentrelosprogramadoresdeCsobreWindows,tantonovatoscomoexpertos,
eselBloodshedDevC++,queesunentornolibremultiplataforma.Talentornodedesarrollofueabandonadoyretomado
mejorndolopasandoallamarseWxDevC++(http://wxdsgn.sourceforge.net/).Otroentornolibreygratuitoesel
Code::Blocks(http://www.codeblocks.org/).AmbosentornospuedenutilizarsetantoparaCcomoparaC++.
TambinhayotrasalternativasprivativascomoloscompiladoresdeBorlandodeMicrosoft(MicrosoftVisualC++).
GNU/Linux
EnlossistemasGNU/Linux,sernecesariotenerinstaladaslasherramientasgccymakeylaversin6delaglibcconsu
documentacin,quesonlasquepermitirncompilarlosprogramas.
Paraescribirymodificarelcdigo,esposibleutilizarcualquiereditordetextoplano(enloposiblequecuenteconresaltadode
sintaxis),comosonemacs,vim,kate,geditogeany.
Sinembargo,paraquienessonnovatosenlaprogramacin,esrecomendableutilizarunentornodedesarrollocomosonel
AnjutaDevStudio(paraelentornoGNOME)oKDevelop(paraelentornoKDE),yaqueincluyenfacilidadesadicionalespara
laejecucinysolucindeproblemas.
Losprogramasmencionadosseincluyendentrodelainstalacinestndardelamayoradelasdistribucionesactualesde
GNU/Linux,demodoqueparainstalarlosslosernecesarioseguirelprocedimientousualdeinstalacindeaplicacionespara
ladistribucindeseada.
HistoriadeC
EllenguajedeprogramacinCfuecreadoporDennisRitchieentre1969y1973cuandotrabajabaenBellLaboratoriesde
AT&TjuntoconKenThompsoneneldiseodelsistemaoperativoUNIX.Cfuecreadoparapoderescribirdichosistema
operativoenunlenguajedealtonivel,independientedelhardwaredondeseejecutara.
Contarconunlenguajedealtonivelpermitielavancedelossistemasoperativos,yaqueelmismocdigopodaserutilizado
enlasdistintasplataformas,propiciandolareutilizacindecdigoyreduciendolostiemposdedesarrollo.Asesquelos
sistemasoperativosbasadosenUNIX,elsistemaBSD,elsistemaGNU/LinuxymuchosotrosfuerondesarrolladosenC.
Adems,conelpasodeltiemposehandesarrolladocientosdebibliotecasquepermitenalosprogramadoresdeCutilizarel
cdigodesarrolladoporotrosparalarealizacindetareascomunes.Esto,asuvez,hapropiciadoeldesarrollodeaplicaciones
enlenguajeC.
ActualmenteesimposiblecontarlacantidaddeaplicacionesyherramientasdesarrolladasenC.
Evolucin
Amediadosdelosaos60s,MartinRichardsdiseellenguajeBCPLconlafinalidaddeusarloparaescribirsoftwarede
sistemasoperativosycompiladores.
En1969,KenThompsonescribielLenguajeB,enBellLaboratories,conelobjetivoderecodificarUNIX(escritohastaese
momentoenlenguajeensamblador)usandounlenguajedealtonivelmsportableyflexible.
Durantelossiguientesaos,DennisRitchiemodificellenguajeB,llegandoacrearellenguajeCyreescribiendoelsistema
UNIXendicholenguajeaadicaractersticasnuevas,comosoneldiseodetiposylasestructurasdedatos.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
6/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
En1978,DennisRitchieyBrianKernighanpublicaronlaprimeraedicindellibroEllenguajedeprogramacinC.Estelibro
fueduranteaoslaespecificacininformaldellenguaje.Ellenguajedescritoenlaprimeraedicindeestelibro,fueconocido
como"elCdeKernighanyRitchie"osimplemente"K&RC".Enestelibroseintrodujeronnuevascaractersticasallenguaje:
lostipodedatosstruct,longintyunsignedintlosoperadores=+y=fueronsustituidospor+=y=.
Amediadosdelosaos80,BjarneStroustrup(tambindeloslaboratoriosBell),creaellenguajeC++,unlenguajebasadoen
C,connumerosascaractersticasadicionales,siendolaprincipalqueestorientadoaobjetos.Sibiensehancreadomuchos
lenguajesbasadosenC,C++eselquehapermanecidomsasociadoaC.
EnlosaossiguientesalapublicacindelCdeKernighanyRitchie,seaadieronallenguajemuchascaractersticasno
oficiales,queestabanpresentesenalgunoscompiladoresynoenotros.Fueporelloqueen1989ANSI(AmericanNational
StandardsInstitute)publicelprimerestndaroficialdeC,queesconocidocomoANSIC.
Enesteestndarsetomaronmuchasdelasfuncionalidadesnooficialesyseagregaronfuncionalidadesnuevascomolos
prototiposdefuncin,yunpreprocesadormejorado.Tambinsecambilasintaxisdeladeclaracindeparmetrosde
funciones,paraqueincluyeraneltipojuntoconelnombre.
Alaosiguiente,en1990sepubliclaestandarizacinISOdellenguaje.EsteestndaresbsicamenteelestndarANSI,con
unaspocasmodificacionesdeformato.Aesteestndarseloconoce,entonces,comoC89,oC90,ysetratadelmismo
lenguaje.
BasndoseenelestndarANSIqueestabaenpreparacin,en1988KernighanyRitchiepublicaronlasegundaedicindesu
libro,queesanhoyutilizadacomounadelasreferenciasprincipalesdellenguaje.
Durantelossiguientesaos,ellenguajeCpermanecisindemasiadoscambios.Sinembargo,comohabasucedidoantes,los
distintoscompiladoresfueronincorporandocaractersticasadicionales,queotroscompiladoresnotenan,siendoC++la
principalinfluencia.
FueporelloqueafinalesdelosnoventasedecidirevisarelestndardeC,loquellevalapublicacindelestndarC99.
Esteestndarincluyevariasnuevascaractersticascomoson:lasfuncionesinlinelaposibilidaddedeclararvariablesen
cualquierpartedelcdigoloscomentariosdeunasolalneautilizando//lostiposdedatoslonglongint,boolycomplex,
entreotras.
Anhoyelprocesodeevolucindellenguajesigueavanzando,ydesde2007seesttrabajandoenelarmadodeunnuevo
estndar.
Msinformacin
LenguajedeprogramacinBCPL
HistoriadellenguajedelprogramacinC
TheDevelopmentoftheCLanguage(http://cm.belllabs.com/cm/cs/who/dmr/chist.html)
Fundamentosdeprogramacin
Enestecaptuloveremosunresumidolistadodeconceptosbsicos,estainformacinpuedeencontrarseenformams
elaboradaenelWikiLibroFundamentosdeprogramacin.
Definiciones
Sedenominaalgoritmoaunasecuenciadeinstruccionesquepermitenobtenerunresultadoenparticular.No
necesariamentesonprogramasdecomputadora,unarecetadecocina,olasinstruccionesparacambiarunneumticoson
ejemplosdealgoritmosdelavidareal.
Lascomputadoras,sonmaquinassininteligenciapropia,cuyanicafinalidadesinterpretarelcdigoqueselesprovee.
Ellenguajedemquinaeselnicolenguajequelacomputadora"entiende"yescapazdeejecutar.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
7/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Loslenguajesdeprogramacinsonelmediodecomunicacinentreelprogramadoryunacomputadora.El
programadorescribeenalgnlenguajedeprogramacinyutilizalasherramientasprovistasporeselenguajepara
transformarloenlenguajedemquina.
Finalmente,denominamosprogramaaunasecuenciaderdenesaserejecutadasporunacomputadora.Unprograma
debeestarescritoenalgnlenguajedeprogramacin,ypuedeincluirunoomsalgoritmos.
Tiposdelenguajes
Existeunagrancantidaddelenguajesdeprogramacin,queestnpensadosparadistintasfinalidades,siguendistintos
paradigmas,ydeunauotraformasediferenciandelosdems.
Esquemasdeprogramacin
ElesquemadeprogramacinllamadoProgramacinImperativa,consisteenescribirunasecuenciadeinstruccionesuna
detrsdelaotra,queseejecutarnenorden.Algunasdeesasinstruccionespuedenhacerquelamquinapaseauna
instruccinquenosealasiguiente,talvezporquesecumplaunacondicinquehayamosestablecido.
Enlosltimosaoshatomadofuerzaotroparadigmadecomputacin,llamadoProgramacinOrientadaaObjetos,enel
cualseintentanmodelarlossistemascreadoscomoextensionesdelarealidadmedianteladefinicinde"objetos"quemodelan
entidadesdelavidarealyqueinteractanentresmediante"mensajes"llamadasmtodos.
EllenguajeCesunlenguajeimperativo,noorientadoaobjetos.
Altoobajonivel
Porotrolado,loslenguajesdeprogramacinseclasificanenniveles.Unlenguajeesdemsbajonivelcuantomscercano
estalcdigodemquina,yunlenguajequeesdemsaltonivelcuantomslejanoestdelamquinaymscercanoal
lenguajehumano.
Cesunlenguajedealtonivelaunquetienemuchascaractersticasdelenguajedebajonivel(comoelusoquepermitehacerde
lamemoria).EstascaractersticashacenqueCseaunlenguajemuypotente,yaquepermiteoptimizaralmximolosrecursos
delamquina.Porende,estotambinhacequeladificultadyqueloserroresquesepuedancometerprogramandoaumenten.
AsqueaCseleconsideradenivelmedio.
LenguajesdemsaltonivelqueCsonaquellosenlosqueelprogramadornonecesitaencargarsedemanipularlamemoria,
comoJava,C#,Python,Ruby,entreotros.
Compiladosointerpretados
Otraformadeclasificaraloslenguajesdeprogramacinqueessegnlaformaenqueseejecutansusrdenes.Existenlos
lenguajesquesoninterpretados,cuyasrdenespasanatravsdeunintrpretequeseencargadeejecutarlas(apartirdel
cdigofuente)enelmismomomentoenqueestnsiendoledas.AlgunosdeloslenguajesinterpretadossonPython,Perlo
Tcl,entremuchosotros.
Lacontrapartedeloslenguajesinterpretadossonloslenguajescompilados(comoelmismoC)quesediferencianenquelas
rdenessontransformadasalenguajedemquinaquesealmacenaenunarchivoejecutable.Esearchivopuedeejecutarse
luego,sinrecurriralcompilador.
Loslenguajescompiladostienenlaventajadelavelocidadylaeficiencia,perolosinterpretadostienenlaventajadeque,
generalmente,sonmuyportablesydemsaltonivel.
Estructuradelamemoria
PartedeestapotenciadeCvienedequepermiteaccederconmuchalibertadalamemoriadelamquina.Paraentenderun
pococmoesposible,debemosentendercmoseguardanlosdatosenlamemoria.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
8/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Imaginemosquelamemoriatieneunmontndecasillas,unaenormefiladecasillas,cadaunadelascualescontieneundgito
binario(bit):
0101001010100001010101001010000100111010110010010101001011010110001101010110101010110111...
Esexactamenteas,peroesmscmodorecordarqueesosbitsseencuentranagrupadosdeochoenocho,formandooctetos
(bytes):
01010010 10100001 01010100 10100001 00111010 11001001 01010010 11010110 00110101 01101010 10110111 ...
Cadaoctetopuedecontener
combinacionesdistintasdecerosyunos,esdecir,cualquiernmeroentre0y255:
PrimerprogramaenC
Enellibro"ElLenguajedeProgramacinC",KernighanyRitchieintrodujeronallenguajeCutilizandounsencilloprograma
quemostrabaunsaludoporlapantalla.Desdeentoncessehizotradicinempezarconcualquierlenguajedeprogramacincon
elejemplodelHolamundo.
EnparticularenCseinvolucranmuchaspartesysintaxisdellenguaje,porlocualesespecialmentetilverlocomoelprimer
ejemplodeprogramacinenC.
Ejemplo:Holamundo
/*Inclusindearchivos*/
#include<stdio.h>
/*Funcinprincipal*/
intmain(intargc,char**argv)
{
/*Impresinporpantallaysalidadelprograma*/
printf("Holamundo\n");
return0;
}
Parapodereditaryejecutaresteprogramasernecesarioutilizaralgneditoryluegouncompilador,comoseexplicenla
seccinHerramientasnecesarias.
SisetieneelcompiladorgccenunentornoUNIXoGNU/Linux,laformasencilladecompilaryejecutarser:
$gccholamundo.c
$./a.out
HolaMundo
$
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
9/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Esdecirqueelcompiladorgeneraunarchivo,enestecasollamadoa.out,ylasalidageneradaporesearchivoes"Hola
mundo".Acontinuacinunaexplicacindetalladasobreelprocesodecompilacindelprograma,yluegounanlisislneapor
lneadelcontenidodeesteejemplo.
Prerequisitosparalacompilacindeprogramas
Comoyasemencion,sernecesariotenerinstaladoelcompiladoryuneditoroentornodedesarrolloquepermitanescribirel
cdigoacompilar.ParamsinformacinverlaseccinHerramientasnecesarias.
Elcdigoacompilardebeguardarseconunnombrequerepresentealprogramaencuestinylaextensin.c.Enelcasodel
ejemplodelHolamundo,elarchivopuedellamarsehola.c.
Enlasexplicacionesacontinuacin,seasumequesecuentaconuncompiladorinstaladoysehaeditadounarchivohola.c
quesequierecompilar.Situsistemaoperativonoapareceenestalistabuscaeninternet,yaqueseguroqueexistealgn
compiladorparaesesistema.
Compilacindeprogramassegnlaplataforma
Windows
ParacompilarunprogramaCenentornosWindows,debemosseguirunaseriedepasosquevaransegnelcompiladordeC
quequeramosutilizar.Antesquenada,serabuenoqueserevisesladocumentacindelcompiladorelegidoparaconocerlos
comandosexactos.
Compilacindelcdigofuente
Siseutilizaunentornodedesarrollo,serposiblecompilardirectamentedesdeelentorno,medianteunbotnouna
combinacindeteclas.
Siseejecutaelcompiladordesdelalneadecomandos,lalneaserdistintasegnelcompiladorutilizado.Acontinuacin
algunosejemplosdeciertoscomandossegnelcompilador:
EnTurboCdeBorlandes:tcchola.c
EnC++deBorland:bcchola.c
EnVisualCdeMicrosoft:clhola.c
EnGNUgcc:gcchola.cocchola.c
ElCdeZortech:ztchola.c
Unavezcompiladoelcdigofuentesegeneraunarchivollamadoarchivoobjetooprogramaobjetoqueesluegoenlazado
medianteelenlazador,paragenerarelarchivoejecutable.
Loscompiladoresactualessuelenhacerdosfuncionesdeunavez,compilandoyenlazandotodoenunasolafuncin,aunque
esposiblepedirlesquenolohaganmedianteparmetrosadicionales.
Segnelcompiladorylaconfiguracinutilizada,seobtendrndosotresarchivos:
Elarchivofuente
hola.c
Elarchivoobjeto
hola.obj
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
10/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Elarchivoejecutable
hola.exe
Esteltimoeselquenosinteresa,puestoaqueeselcdigoejecutable,elprogramaens.Alejecutarloseproducirlasalida
deseadaenunaventanadeconsola.
Salidaporpantalla
SiejecutamosenentornoWindowselprogramadirectamentedesdeelnavegadordearchivos,otambindesdealgunos
entornosdedesarrollo,loquesucederserqueapenasabiertalaventanadelaconsola,semostrarlacadenaesperaday
luegodeterminadalafuncin,laconsolasecerrarsintenereltiemposuficientedevernuestromensajeenpantalla.
Parapoderverlasalidaporpantallasernecesarioejecutarelprogramadesdelalneadecomandos,omodificarla
configuracindelentornodedesarrolloparaquemuestrelasalidaporpantallaalejecutarelprograma.
Unaposiblesolucinesagregarunafuncinadicionalanuestro"hola.c":
/*Inclusindearchivos*/
#include<stdio.h>
#include<stdlib.h>
/*Funcinprincipal*/
intmain(intargc,char**argv)
{
/*Impresinporpantallaysalidadelprograma*/
printf("Holamundo\n");
system("pause");
return0;
}
Lasdoslneasagregadaspermitenqueutilicemoslabibliotecastdlib,queincluyelafuncinsystemyquemedianteesta
funcinseejecuteelcomandopausedelsistema,queevitaqueelprogramasigahastaquesepresioneunatecla.
Asesposiblevisualizarquelasalidadehola.csecompletperfectamente.
GNU
Sibienexistenotroscompiladores,lomsusualymssencilloparacompilarunprogramaenGNU/Linuxeselcompilador
gcc,yaqueeselqueseincluyeentodaslasdistribuciones.
Decualquierforma,esposiblerealizarlacompilacindesdelneadecomandosodesdeelentornogrfico.
Pararealizarladesdelneadecomandos,sernecesariocontarconunaterminal(xterm,konsole,gnometerminal,etc).Noes
necesariocontarconpermisosderootparacrearocompilarprogramas.Enesaterminalsernecesarioescribir
gcchola.c
Sinoexistenerroresenelcdigo,estecomandonoscrearunarchivoejecutable,queporomisinsellama"a.out",yque
podemosejecutardesdelalneadecomandosdelasiguienteforma:
./a.out
Holamundo
Esunabuenaideaespecificarelnombrequeelarchivoejecutabletendr,pasandocomoparmetroalcompiladorlaopcino,
delasiguienteforma:
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
11/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
gcchola.cohola
Conlocual,elnombredelarchivocreadoserhola.Estearchivonotieneextensinyaqueeslaformausualdellamaralos
archivosejecutablesenlosentornosUNIXyGNU/Linux,sinembargofuncionaradelamismaformasisellamarahola.exe.
Paraejecutarlo,haremoslosmismoqueenelcasoanterior:
./hola
Holamundo
Existenotrosparmetrosquepodemosespecificaralcompiladorenlalneadecomandos,dependiendodeltipodeprograma,y
enfuncindelacomplejidaddelmismo.Porejemplo,podemosagregarlassiguientesopciones:
gcchola.coholaWallpedantic
LaopcinWallnosmostrartodoslosavisosqueproduzcaelcompilador,nosolamenteloserrores.Losavisosnosindican
dndey/oporqupodrasurgiralgnerrorennuestroprograma.
LaopcinpedanticnosaportamsinformacinsobreloserroresylosavisosmostradosporGCC.
Diseccionandoel"HolaMundo"
AcontinuacinveremosculeslaestructurabsicadeunprogramaenC,parapoderentenderquhacecadaunadelaslneas
denuestrosencilloprograma.
Esprobablequeloprimeroquesaltealavistasealalnea:
printf("Holamundo\n");
EstaeslalneaquehaceaparecerlacadenaHolaMundoennuestrapantalla.NotamosqueenClasentenciaparaimprimiralgo
porpantallaesprintf()y,adems,hayquecolocarparntesisalrededordeloquequeremosimprimirparautilizarla.
EstosedebeaqueenC,printfesunafuncin,queimprimesuargumento(lacadenaHolaMundo\n)enlapantalla.Se
denominainvocarunafuncinalaaccindeutilizarlaparaquerealiceunaaccin.
Podemosobservartambinquelacadenaaimprimirterminaconunaextraacombinacin:\n.Lacombinacin\nno
representaadoscaracteresindependientes,sinoquerepresentaunnicocarcternoimprimible:elsaltodelnea.Sinelsalto
delnea,elresultadoalejecutarelprogramasera:
$./a.out
HolaMundo$
Esdecirquenohaysaltodelneaentrelacadenaimpresa,ylasiguienteentradadelalneaderdenes,quenoesloque
esperbamos.
Loltimoanotarenlalneaesqueterminaconunpuntoycoma.EnC,todaslassentenciasterminanconunpuntoycoma.Al
principiopuedeparecerobviodndeterminaunasentencia,peroyaveremosmsadelantequenoloestanto.
Observemosahoralasiguientesentenciadelprograma:
return0;
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
12/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Luegodeestasentencia,terminaelprograma.Enelcasodelainstruccinreturndentrodelafuncinmain,elresultadoesque
sefinalizaelprograma,comunicndolealsistemaoperativoqueelvalorderetorno(uncdigonumricoqueelsistema
utilizaparasabersielprogramahafuncionadobienohadadofallos)es0,esdecir,correcto.
Lasdosltimassentenciasseencuentranencerradasentrellaves.Deestamanera,formanunbloque,esdecir,ungrupode
sentenciasqueseejecutarnsiempredeformacorrelativa.
Yquesesalneaqueprecede(enrealidad,quedanombre)albloque?
intmain(intargc,char**argv)
Puesesladefinicindeunafuncin,enestecasollamadamain.EnC(yengeneralentodosloslenguajesdeprogramacin
estructurada)todosehaceabasedefunciones,comomainyprintf.
Lafuncinmainesespecial,porqueesellaqueseinvocacuandoseejecutaelprograma.TodoslosprogramasenC
comienzansuejecucinalprincipiodelafuncinmain,ycuandostaacaba,elprogramatambin.
Veamosconmsdetalleladefinicindelafuncin:
intmain(intargc,char**argv)
{
...
}
Elnombredelafuncinquevieneacontinuacin,entrellaves,esmain.
Recibedosargumentos:intargcychar**argv(querepresentanalacantidaddeargumentosingresadosalejecutarel
programayalosvaloresdeestosargumentosrespectivamente).[1]
Lafuncindevuelvecomoresultadounnmeroentero,int(queesel0delainstruccinreturn).[2]
Finalmente,yuntantoaparte(estseparadadelrestoporunalneaenblanco),tenemoslalnea:
#include<stdio.h>
Queparecebastantedistintaalrestodelprograma,yque,adems,parecenotenersentido,puestoqueyahemosdefinidola
funcinmainquehacetodoeltrabajo.
Efectivamente,esalneanoespartedelprograma,aunqueseaimprescindible.Lalneaesunainstruccindelpreprocesadorde
C,comonosloindicaelsmbolo#,yloquehaceesincluirenesepuntoelcontenidodeotrofichero,antes(deahelnombre
depreprocesador)dequecomiencelacompilacin.Elficherostdio.heselquecontieneladefinicindelafuncinprintf(),
queantesutilizamosperoquenoescribimos,yaqueformapartedelabibliotecaestndardeC.
Comentarios
Unavezescritouncdigo,tratardeentenderlounaomstardesoloconleerlopuedeserfrustrante:nohaymaneradesaber
(sielprogramaesmedianamentecomplicado)quescadavariable,oquhacecadabloquedecdigo.Poresto,encualquier
lenguajedeprogramacinsonimportantesloscomentarios.
UncomentarioenCestodoloqueseencuentreentrelossmbolos/*y*/.Hayquetenerencuentaqueloscomentariosnose
puedenanidar:sidentrodeuncomentariohayun/*,seguirsiendoelprimer*/elquefinaliceelcomentario,noseesperar
alsegundo.
HayotrotipodecomentariosenC,procedentesdellenguajeC++,eincorporadasalestndardeCapartirdeC99://.Todolo
queestdespusdeestossignos,hastaelfinaldelalnea,seconsideraruncomentarioyelcompiladornolotomaren
cuenta.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
13/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Enelejemplopresentadopuedenversetreslneasconcomentarios,quedocumentansomeramentelasdistintas
funcionalidadesdelcdigo.Enlosprximoscaptulospodrnversemejoresusosdeloscomentariosdentrodelcdigo.
Tambinpodradecirsequeesunaherramientabsicabasadaencompilador
1. Enuncaptuloposteriorpodrverunejemplodelusodelosparmetrosquerecibemain.
2. Esimportantesealarqueelestndardicequemaindeberdefinirsecomofuncinqueretornaunentero,odelo
contrarioelresultadoquedaindefinido.
Tiposdedatos
Historia
EnellenguajeCestandarizadocomoC89,existancuatrotiposdedatosbsicosqueson:losnmerosenteros,losnmeros
reales,loscaracteres,ylospunteros.ApartirdelestndarC99seagregan:losvaloreslgicos(verdaderoofalso)ylos
nmeroscomplejos.
Estostiposdedatossonpartedellenguaje,yporelloselosconsideraprimitivos.Msadelanteveremosqueconelusode
estructurasyunionesesposiblecreartiposcompuestosdedatosapartirdeestostiposprimitivos.
Enestecaptuloveremoslosenteros,losrealesyloscaracteres.Msadelantesevernotrostiposdedatosmscomplejos,
comosonlosvectores,lascadenasdecaracteres,ylospunterosengeneral.
Enteros
LosenterossoneltipodedatomsprimitivoenC.Seusanpararepresentarnmerosenteros.Perosiempresepueden
encontrarotrasaplicacionesparalosnmerosenteros.Engeneralsepuedenusarpararepresentarcualquiervariablediscreta.
Lostiposdedatosenterosson:short,int,longylonglong,cadaunorepresentandounnmeroenterodeuntamaoo
capacidaddeterminado.Segnelcompiladorylaplataformadehardware,cadaunodeestostiposdedatopuedeocupardesde
1bytehasta8bytesenmemoria(paramsdetallesbuscaenlareferencia).
Adems,ellenguajeChaceladistincindesielenteroesconsigno(signed)osinsigno(unsigned).Encasodequenose
declaresiesconsignoosinsigno,setomaconsigno.
Algunosejemplosdedeclaracionesdeenteros:
inta;
unsignedinta;
signedlonga;
signedlonglonga=10000000;
Todoslosnmerossonrepresentadosenmemoriamedianteunacadenadebits.Enelcasodelosnmerosconsigno,elbit
mssignificativoeselqueseusapararepresentarelsigno.Larepresentacindelosnmerosnegativosserealizamedianteel
complementoados,queesunatcnicaquepermiteoperarconlosnmerosnegativosdeformalgica.
Amododeejemplo,larepresentacinenmemoriadelnmero8enunavariablede2bytes,entera,consigno,serala
siguiente:
1111111111111000
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
14/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Flotantes
Sedenominaflotantesalostiposdedatosquerepresentanalosnmerosreales,yaqueutilizanunsistemaderepresentacin
basadoenlatcnicadecomaflotante,quepermiteoperarconnmerosrealesdediversasmagnitudes,medianteunnmero
decimalllamadomantisayunexponentequeindicaelordendemagnitud.
EltipodedatoflotanteenlenguajeCslotienedostamaos:elfloatyeldouble,queson4bytesy8bytesrespectivamente.
Selospuedeutilizartantopararepresentarnmerosdecimales,comopararepresentarnmerosenterosconunordende
magnitudmuygrande.
Laformadedeclararunavariableflotanteesescribiendoenunalneaunodelostiposdedatosflotantesyacontinuacinel
nombredelavariableytalvezalgnvalorqueselesquieradar.
Algunosejemplos:
floata;
doublea=1e23;
doublea=3.1416;
floata=4e9;
doublea=78;
Hayquetenerencuentaqueaunquelosvaloresflotantessonmsconvenientesparaalgunasaplicaciones,haycasosenlosque
seprefierenlosenteros.Estosedebeaquelosnmerosflotantesnonecesariamentetienensoportedehardware,enparticular
enlasplataformasintegradas.Unaalternativaqueseutilizaenestassituacionesesinterpretarlosenteroscomodecimalesde
formaque150seinterpretecomo1.5y2345como23.45.
Paraelcasodelosflotantesde4bytes,seutiliza1bitparaelsigno,8bitsparaelexponentey23bitsparaelvalordelnmero.
Elprocedimientoparaalmacenarunnmeroenunavariableflotanteeselsiguiente:
1. Seconvierteabinariolaparteentera.
2. Secolocaelsignoenelbitmssignificativodelamismamaneraqueenlosenteros(1paraely0parael+).
3. Semuevelacoma(enlarepresentacinbinariadelaparteentera)hastaqueestaladerechadelprimerunoystese
descarta(elunomssignificativo).Elvalordelexponenteserelnmerodeposicionesquesemovilacoma.El
exponenteusalarepresentacindeunenteroconcomplementoados.
4. Seconvierteenbinariolapartedecimaldelnmero.Estousandoelpesodelosbits.elbitdecimalmssignificativovale
1/2,elsiguientevale1/4,elotro1/8,elotro1/16yashastacompletarloquefaltaparalos23bitsdelvalor.
5. Seconcatenatodoyeseeselvalorflotanterepresentadoenmemoria.
Caracteres
Loscaracteresserepresentanutilizandoeltipochar,quetieneslo1bytedetamao.Estetiposeutilizapararepresentarlos
256caracteresdelatabladecaracteresdelsistema.Eltipocharestambinuntipoentero,yaquepuedetomarvaloresde0a
255.Porlotantotambinpuedesersignedounsigned.
Encuantoalaformadedeclararvariablesdetipochareslamismaformaqueconlosotrostipos.
chara;
chara='s';
unsignedchara=48;
Comopuedesver,selepuedeasignarunnmeroaunavariablechar,yaquesetratadeuntipoentero.Enmuchassituaciones
seutilizaeltipocharparaalmacenarnmerospequeos,yaqueocupaenmemoriaslamenteunbyte.
EsimportantenotarqueconlallegadadelacodificacinUTF8,loscaracteresdelosdiversosidiomaspuedenocupar1,2,3
o4bytes,demodoqueeltipocharyanoalcanzaparalarepresentacindetodosloscaracteresposibles.Porello,elestndar
C99introduceeltipowcharquepuedeocuparmsde1byte,segnseanecesarioparalacodificacinutilizadaporelsistema.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
15/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Interaccinconelusuario
Enestecaptuloveremosunpocomssobrecomointeractuarconelusuariodenuestrosprogramasdesdelaconsola,
utilizandoprintf()comovimosenelprimerejemplo"Holamundo",ascomoscanf()paralalecturadelteclado.
Imprimirporpantalla
Comohemosvistohastaahoraenlosejemplos,hayunafuncinqueutilizamosparasacarporpantallatextosarbitrariosoel
resultadodealgunaoperacin:lafuncinprintf().
Simiramos(enladocumentacin)sudefinicin,nonosaclarardemasiado:
intprintf(constchar*TEMPLATE,...)
...claroqueporalgotieneunaseccincompletadeladocumentacinparaellasola.
Vemoslapocoapoco.Setratadeunafuncindelabibliotecaestndar,loquequieredecirqueparautilizarlatenemosque
incluirpreviamentesudefinicin.Laencontraremosen<stdio.h>.
Loprimeroquevemosenladefinicinesqueesunafuncindetipoint,loquequieredecirquedevuelveunentero.Ese
enteroeselnmerodecaracteresimpresosenlapantalla,ounnmeronegativoencasodequeseproduzcaalgnerror.
Losiguienteanotaressuprimerargumento:constchar*TEMPLATE.Setratadeunacadenadecaracteres(char*)quenoser
modificadaporlafuncin(const),conloquepuedeserunaconstantedecadenaounavariablequecontengaunacadena,pero
siempredebeacabarconelcarcternulo\0.
Yluegovienenesosextraospuntossuspensivos.Esaelipsisnosindicaquecomoargumentosadicionalesdeprintf()
podemosponerunaserieilimitadadeotrosargumentos,quesesuponequelafuncinsabrquhacerconellos.Yesoes
justamenteloquehacetanfabulosaytilaprintf().
Comohemosvisto,elusomssimpledeprintf()esimprimirunacadenadetextosimpleycorriente.Comoyavimos:
printf("HolaMundo\n");/*imprimelacadena*/
Ytambinhemosvistoprintf()tambinpuede,conunargumentoextrayunasintaxisespecial,imprimirunnmeroentero
quehayamosalmacenadoenunavariable:
charresultado;
resultado=5+2;
printf("Resultadodelasuma:%i\n",resultado);
Aquelpuntodeinsercineslasecuencia%i.printf()siempretratalassecuenciasquecomiencenpor%comosecuenciasde
controlqueledicenquedebeimprimiralgoqueleproporcionamosenlosotrosargumentos.As,podemosimprimirvarios
enterosdistintosenlossitiosquequeramosdelacadena,insertandovariasdeestassecuencias%i:
intnumero;
numero=3;
printf("Eldoblede%ies%iysucuadradoes%i\n",numero,numero*2,numero*numero);
Lecturadedatosdelteclado
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
16/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Laentradadedatossepuedehacerdemuchasmanerasyentreellasestndesdeelusodedispositivosespecialeshastanuestro
simpleteclado.Laentradadedatosserefiereacualquierformadeinfluenciadelusuariosobrelosdatosqueposeeelsistema.
Conelfindemostrarunaformadeentradasimpleparaelaprendizajevamosahablardelafuncinscanf()queseencuentra
definidaen<stdio.h>yqueseusaparacapturardiferentestiposdedatos.
Lafuncinscanf()
scanf()esunadelasfuncionesmsusadasporlosprincipiantesparahacerentradadedatosenellenguajeC.Tieneuna
sintaxismuyparecidaaprintf:recibeunacadenaconelformatodelosdatosyluegoseponenlasvariablesenordenque
correspondanaesetipodedatos.Esdecir,ascomoenprintfsepuedenmostrarporpantallalosdatosdevariasvariablesen
unamismasentencia,enscanfsepuedencapturarvariosdatosenunasolasentencia.
#include<stdio.h>
intmain(){
inta;
printf("digaunvalorparaa:");
scanf("%i",&a);
printf("elvalores:%i\n",a);
return0;
}
Porahoranonosinteresanlasdemssentencias,slolaquecontienescanf.Enelcdigosevelosiguiente:
scanf("%i",&a);
Seobservaquelafuncionprintfdejenpantallaunapeticinparaqueelusuariointrodujeraunvalor.Entonces,scanfrecibe
comoargumentounacadenadelformatoenquesevanacapturarlosdatosylalistadevariablesquevanarecibirvaloresy
quedebencoincidirconlosdelformato.
Enestecasolacadenadeformato,"%i",especificaqueelusuarioingresarunnmeroentero.Luegosedesignaalavariablea
paraconteneraesenmero.Elsmbolo(&)queprecedeaaesparaespecificarqueloqueseestenviandocomoargumento
noeselvalorqueposeelavariableasinoladireccindememoriaenqueseencuentra.Enestemomentoesonotienemucha
relevancia,slohayquerecordarquesedebeusarelsmbolo&dentrodelscanf.Enelmomentoenquehablemosdepunteros
veremosmsdetallesdeesto.
Otroejemplodelusodescanf:
#include<stdio.h>
intmain(){
inta,b;
printf("introduzcadosvaloresconelformato\"a,b\":");
scanf("%i,%i",&a,&b);
printf("elprimervalor:%i\n",a);
printf("elsegundovalor:%i\n",b);
return0;
}
Aquhemosintroducidounanuevavariableenelcdigo.Lacadenadeformato,"%i,%i"especificaqueelusuarioingresarun
nmero,seguidodeunacoma,yluegootronmero.Elprimer%isercapturadoporlavariableayelsegundoporb.
Expresiones
Vamosatratarahoradequeelordenadorhagaunpocodematemticasparanosotros.Porejemplo,querealiceunaspocas
sumas,restasmultiplicacionesydivisiones.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
17/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
#include<stdio.h>
intmain(void)
{
intresultado;
resultado=5+2;
printf("Resultadodelasuma:%i\n",resultado);
resultado=52;
printf("Resultadodelaresta:%i\n",resultado);
resultado=5*2;
printf("Resultadodelamultiplicacin:%i\n",resultado);
resultado=5/2;
printf("Resultadodeladivisin:%i\n",resultado);
return(0);
}
Despusdegrabarlo(porejemplo,conelnombreejemplo.c),locompilamosyejecutamos,con(respectivamente):
$gccejemplo.c
$./a.out
Resultadodelasuma:7
Resultadodelaresta:3
Resultadodelamultiplicacin:10
Resultadodeladivisin:2
$
Fijmonosenlalneadelprincipiodelafuncinmain:
intresultado;
Estalnealoquehaceesreservaruntrozodememoria,deltamaodeunint(normalmente4bytes),yasignarleelnombre
resultado,parapoderdespusreferirnosal.Apartirdeestemomento,podemosconsiderarqueennuestroprogramaexiste
unavariable,quenotienevalordefinido,peroalaquelepodremosdarvalorposteriormente.
Laslneasconprintf()yalasconocemos,perohayalgoenellasquenohabamosvistoantes.Esos%iylapartederesultado
sonnuevasparanosotros.
Lafuncinprintf()noslosabeimprimircadenassimples,como"HolaMundo\n",sinotambinimprimirvariables.Para
ello,enellugardelacadenadondequeremosqueaparezcaelvalordelavariable,introducimosloquesellamaunacadenade
conversindeprintf().Estascadenassiempreempiezanpor%,siendo%ilacadenaparaimprimirunentero,comoesen
nuestrocasointresultado.Finalmente,printf()debesaberquvalorescribir,poresoledamosotroargumento(uotros),
usando,comoseparador,quecontienenlasvariablescuyosvaloresqueremosmostrar.
Enelrestodelprogramahemosvistocmodecirlealordenadorqueejecuteunasuma,unaresta,unamultiplicacinyuna
divisinentera,conlosoperadores+,,*y/.Esdenotarqueelresultadodeunaoperacincomoestasentrenmerosenteros
sersiempreotroentero,comosepuedeobservarenladivisin,enlaquenoobtenemosunbonitodecimal,sinounresultado
entero.Adems,hemosvistoqueelresultadodeesasoperaciones,quellamamosexpresiones,puedeserasignadoauna
variable:
resultado=7;
Esaasignacinsehacemedianteeloperadordeasignacin:=.Conl,yaconocemoscincooperadores.
Pero,como=tambinesunoperador,cmosabeelordenadorquoperadordebeejecutarprimero?Ysiesunoperador,por
qunodaunresultado?Nocreaunaexpresin?
Operadores
Precedencia
*/
Izq.aDer.
Izq.aDer.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
18/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Der.aIzq.
Empezandoporlasltimaspreguntas,eloperadordeasignacinscreaunaexpresin,comolosoperadoresdesuma,resta,
multiplicacinydivisin,yesaexpresintieneunresultado,queeselvalorqueobtieneelladoizquierdoalrealizarla
operacin.Encuantoasaberqusedebeejecutarprimero,elordenadortieneunalistadeprecedencia,segnlacualsiempre
ejecutaprimerolasmultiplicacionesydivisiones,deizquierdaaderecha,acontinuacinlassumasyrestas,deizquierdaa
derecha,yacontinuacinlasasignaciones,dederechaaizquierda.Paramsdetallesacercadelaprecedenciadelos
operadoresverelanexodelosoperadores.
Encuantoaloscaracteresdepuntoycoma,notamosaququeunaexpresintambinpuedeserunasentenciaporsmisma,
sinnecesidaddequehayaningunafuncin.Dehecho,unasentenciapuedenotenersiquieraunaexpresin.Lalnea:;esuna
sentenciaperfectamentevlida,lasentenciavaca,queseratilenpuntosdondeellenguajerequieraunasentenciaperonosea
necesariaparanuestroprograma.
Instruccionesdecontrol
Comoyasehamencionado,Cesunejemplodeprogramacinestructurada.Enestetipodeprogramacin,esnecesariocontar
conciertasestructurasquepermitancontrolarelflujodelprograma,esdecir,tomardecisionesyrepetiracciones.
Laestructuracondicionalif...else
Enlagranmayoradelosprogramassernecesariotomardecisionessobrequaccionesrealizar.Esasdecisionespueden
dependerdelosdatosqueintroduzcaelusuario,desisehaproducidoalgnerrorodecualquierotracosa.
Laestructuracondicionalif...elseeslaquenospermitetomaresetipodedecisiones.Traducidaliteralmentedelingls,sela
podrallamarlaestructura"si...sino",esdecir,"sisecumplelacondicin,hazesto,ysino,hazestootro".
Unejemplosencilloseraelsiguiente(nosetratadeunprogramacompleto,sinotanslounaporcindecdigo):
if(edad<18)
printf("Nopuedesacceder.\n");
else
printf("Bienvenido.\n");
Estecdigodeejemplodicequesielvalordelavariableedadesmenorque18seimprimir"Nopuedesacceder.\n",mientras
queencasocontrarioseimprimir"Bienvenido.\n".
Comoseveenelejemplo,laestructuradeuncondicionalesbastantesimple:
if(condicin){
sentencias_si_verdadero;
}else{
sentencias_si_falso;
}
Lacondicin,encerradaentreparntesis,esunaexpresinquepuededarcomoresultado0(interpretadocomofalso)o
cualquiervalordistintode0(interpretadocomoverdadero).Cuandolacondicinseaverdadera,seejecutarnlassentencias
dentrodelprimerbloquedecdigo,cuandolacondicinseafalsa,seejecutarnlassentenciasdelsegundobloquedecdigo.
Lasexpresionesyvaloresdetipoverdadero/falsosontambinllamadosvaloreslgicosobooleanos.
Laindentacinosangra(losespaciosalcomienzodelaslneas)noesnecesaria,peroayudaalaclaridaddelcdigo.La
utilizacindelasllaves{...}esobligatoriacuandosequiereutilizarmsdeunainstruccinporbloque,yoptativacuandoslo
sequiereescribirunainstruccin.Porclaridad,sinembargo,esrecomendableutilizarlasancuandoslovayaahaberuna
instruccin.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
19/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Elbloquedelelseesopcional.Sinoseloencuentra,sloserealizarlaaccincorrespondientealbloqueif.
Acontinuacin,unejemploconunafuncin,quedevuelveelmayordedosnmeros:
intmayor(inta,intb)
{
if(b>a){
returnb;
}//Noposeeespecificacindelaparte"else",yaquenoesnecesaria.
returna;//Finalizalafuncinretornandoelvalorde"a".
}
Operadoresdecomparacin
Elsmbolo>vistoenelltimoejemploesunoperador,queenestecasocomparadosnmerosenterosydevuelveverdadero
sielprimeroesmayor,falsoencasocontrario.
AcontinuacinunlistadodelosposiblesoperadoresdecomparacinenCysusignificado.
OperadoresdeComparacin
Operador
Significado
<
estrictamentemenorque
>
estrictamentemayorque
<=
menoroigualque
>=
mayoroigualque
==
iguala
!=
distintode
TeniendoencuentaqueenCsetomacomofalsoelvalor0,ycomoverdaderocualquierotrovalor,unaprcticacomnes
expresarcondicionessinutilizarningnoperador:
floatdivision(intdividendo,intdivisor)
{
if(divisor){
returndividendo/divisor;
}else{
printf("Nosepuededividirporcero\n");
return0;
}
}
Enestecaso,laexpresin(divisor)esequivalentea(divisor!=0).
Operadoreslgicos
Losoperadores&&("y"),||("o")y!("no")sonoperadoreslgicos.Permitenoperarconexpresioneslgicasparagenerar
expresionesmscomplejas.
Porejemplo:determinarsiunaoesbisiestoono.Losaossonbisiestossisondivisiblespor4,peronosisondivisiblespor
100,amenosquetambinseandivisiblespor400.
if((!(a%4)&&(a%100))||!(a%400)){
printf("esunaobisiesto.\n");
}else{
printf("noesunaobisiesto.\n");
}
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
20/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Enrealidad,teniendoencuentalaprioridaddelosoperadoresutilizados,podemossimplificarlaexpresinanteriordel
siguientemodo:
if(!(a%4)&&(a%100)||!(a%400)){
printf("esunaobisiesto.\n");
}else{
printf("noesunaobisiesto.\n");
}
Adems,comoacadaramadeliflesigueunanicainstruccin,podemosexpresarlaexpresinanteriordelsiguientemodo:
if(!(a%4)&&(a%100)||!(a%400))
printf("esunaobisiesto.\n");
else
printf("noesunaobisiesto.\n");
Enestecaso,seutilizaeloperadormdulo(%),queobtieneelrestodeladivisinenteradeunnmeroporotro.Cuandoun
nmeroesdivisibleporotro,elrestodesudivisinenterasercero.Siendoqueceroesequivalenteafalso,ycualquiervalor
distintodeceroesequivalenteaverdadero,podemosusareloperador%paraverificarsielnmeroesmltiplode4,de100o
de400.
Evaluacindecortocircuito
LaevaluacinencortocircuitoesunacaractersticadellenguajeCqueseutilizaparaoptimizarlaejecucindeprogramas.
Consisteenqueelprogramapuedeverificarsiunaexpresinesverdaderaofalsaantesdehaberevaluadotodacondicin.
Porejemplo,sisetieneunacondicincomolasiguiente:
if((a>2)||(b<4)){
...
}
Alejecutarseelprograma,seevaluarprimerosia>2.Enelcasoenqueseaverdadero,nocontinuarconlasiguiente
condicin,yaqueelresultadoserdecualquiermodoverdadero.
Delamismaforma,silacondicinfuera:
if((a>2)&&(b<4)){
...
}
Enestecaso,sinosecumplequea>2,noseevaluarlasiguientecondicin,yaqueelresultadoserfalsodetodosmodos.
Estacaractersticanotienedemasiadaimportanciaalcomenzaraprogramar,perofacilitarciertasoperacionesy
optimizacionesenprogramasavanzados.
Laestructuracondicionalabiertaycerradaswitch...case
Laestructuracondicionalswitch...caseseutilizacuandoqueremosevitarnoslasllamadasescalerasdedecisiones.La
estructuraifnospuedeproporcionar,nicamente,dosresultados,unoparaverdaderoyotroparafalso.Unaestructuraswitch
...case,porsuparte,nospermiteelegirentremuchasopciones.Ejemplo:
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
21/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
#include<stdio.h>
#include<stdlib.h>
intmain(void){
intdia;
printf("quenmerodedadelasemanaes?");
scanf("%i",&dia);
switch(dia){
case1:
printf("Lun,Lunes");
break;
case2:
printf("Mar,Martes");
break;
case3:
printf("Mier,Miercoles");
break;
case4:
printf("Jue,Jueves");
break;
case5:
printf("Vie,Viernes");
break;
case6:
printf("Sab,Sabado");
break;
case7:
printf("Dom,Domingo");
break;
default:
printf("Noexiste");
}
return0;
}
Laestructuraanterior,derealizarseconsentenciasif,necesitaracuatrodeellas,resultandounenormebloquemuydifcilde
leer.Enlamayoradeloscasos,adems,lasentenciaswitchproporcionaunagananciaenvelocidaddelcdigo,puespermite
alcompiladortrabajarenbaseaquesetratadeunadecisinmltipleparaunanicavariable,cosaqueconsentenciasifel
compiladornotieneporqudetectar.
Comovemos,paracadavalordelavariableseejecutaunbloquedesentenciasdistinto,enelquenonecesitamosllaves.Hay
uncasoespecial,default,queseejecutasiningnotrocorresponde,yquenoesnecesarioponer.Es,entodo,equivalenteal
bloqueelsedeunasentenciaif.
Lassentenciasbreaksonmuyimportantes,yaqueelcomportamientonormaldeunbloqueswitchesejecutarlotododesdela
etiquetacasequecorrespondahastaelfinal.Porello,sinoqueremosquesenosejecutemsdeunbloque,pondremos
sentenciasbreakalfinaldecadabloqueexceptoelltimo.
Esdecir,lasetiquetascasesonpuntosdeentradadelaejecucin,ynoimplicanquealacabarseelbloquecaselaejecucin
saltealfinaldelbloqueswitch.Lasetiquetascasesiguientesalaquehemosutilizadoparaentrarson,sencillamente,
ignoradas.
Alaausenciadesentenciasbreakselellama,enocasiones,"dejarcaerlacascadaswitch".
Elbuclewhile
Elbuclewhilesirveparaejecutarcdigoreiteradasveces.
while(/*condicion*/){
/*Cdigo*/
}
Lacondicindebedeserunaexpresinlgica,similaraladelasentenciaif.Primeroseevalalacondicin.Sielresultadoes
verdadero,seejecutaelbloquedecdigo.Luegosevuelveaevaluarlacondicin,yencasodedarverdaderosevuelvea
ejecutarelbloque.Elbuclesecortacuandolacondicindafalso.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
22/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Ejemplo:imprimirlosnmerosde0a99:
inti=0;
while(i<100){
printf("%d\n",i);
i=i+1;
}
Elbuclefor
Elbucleforesunbuclemuyflexibleyalavezmuypotenteyaquetienevariasformasinteresantesdeimplementarlo,su
formamstradicionaleslasiguiente:
for(/*inicializacin*/;/*condicin*/;/*incremento*/){
/*cdigoaejecutar*/
}
Inicializacin:enestaparteseinicialavariablequecontrolaelbucleyeslaprimerasentenciaqueejecutaelbucle.Slose
ejecutaunavezyaquesolosenecesitaalprincipiodelbucle.
Expresincondicional:aligualqueenelbuclewhile,estaexpresindeterminasielbuclecontinuarejecutndoseono.
Incremento:esunasentenciaqueejecutaalfinaldecadaiteracindelbucle.Porlogeneral,seutilizaparaincrementarla
variableconqueseinicioelciclo.Luegodeejecutarelincremento,elbuclerevisanuevamentelacondicin,siesverdadera
tienelugarunaejecucinmsdelcuerpodelciclo,siesfalsaseterminaelcicloyas.
Aqusemuestraelmismoejemplovistoparaelbuclewhile,peroimplementadoconunbuclefor:
inti;
for(i=0;i<100;i=i+1){
printf("%d\n",i);
}
Nota:EnC,lasentenciai=i+1puedeescribirseenformamsreducidacomoi++.Estaformaseutilizamscomnmente
enelbuclefor:
inti;
for(i=0;i<100;i++){
printf("%d\n",i);
}
Elbucledo...while
Elbucledo...whileesunbucleque,porlomenos,seejecutaunavez.Dosignificaliteralmente"hacer",ywhilesignifica
"mientras"
Suformaesesta:
do{
/*CODIGO*/
}while(/*Condicindeejecucindelbucle*/)
Osmuestrounejemplosencillodeuso:
intaleatorio;
do{
aleatorio=rand();
}while(aleatorio!=25);
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
23/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Laverdadesqueesteejemplopuederesultarunpocoabsurdo,peroesbastanteintuitivo.Elcdigodelbucleasignaunvalor
aleatorioalavariabledefinidaanteriormente,ymientrasesavariablenotengaelvalor25,elbuclesigueejecutndose.
Lasentenciagoto
Lasentenciagotosirveparaindicaralprogramaquecontinueejecutndosedesdelalneadecdigoindicada.Susintaxises
msomenosas:
/*Cdigo*/
ETIQUETA:
/*Cdigo*/
gotoETIQUETA;
/*Cdigo*/
As,cuandoseejecutelasentenciagoto,elprograma"saltar"ycontinuarsuejecucinapartirdelaetiquetamarcada.
Comosepuedeobservarsepuedeusarparacrearunbucle,oparairaunapartedelcdigouotrasisecombinaconuna
sentenciaif...else.Peroporlogeneralpuedeobtenerseelmismoefectoutilizandolosbuclesanteriormentevistos.
Poreso,lasentenciagotoespocoaceptadaporlacomunidaddeprogramadores,puespuedeprovocarquesehaganprogramas
unpoco"sucios"yconfusos.Sloenocasionesmuyexcepcionalesserrecomendadoelusodelgotoalcreariteracionesmuy
complejas.Sinembargo,conelpasardelosaosestecomandoyahaquedadoprcticamentedescartadodellenguajedelos
programadores.
UsodeFunciones
Funciones
ComovimosanteriormenteCtienecomobloquebsicolafuncinmain(),tambinhemosvistolasentenciaprintf()quees
otrafuncin,ydeigualformahaymuchasmsfuncionespredefinidas,peronosotrosmismostambinpodemosdefinir
nuestraspropiasfunciones.Dehecho,esfundamentalhacerlo.
Podemosdefinirunafuncincualquieradelamismamaneraenquedefinimoslafuncinmain().Bastaconponersutipo,su
nombre,susargumentosentreparntesisyluego,entrellaves,sucdigo:
/*Inclusindearchivos*/
#include<stdio.h>
voidholamundo(void)/*Funcindondeseejecutalalgicadelprograma*/
{
printf("HolaMundo\n");/*imprimelacadena*/
return;/*saledelafuncin*/
}
intmain(void)/*Funcinprincipaldelprograma*/
{
holamundo();/*llamadaalafuncinholamundo*/
return0;/*saledelprogramaconcdigo0(correcto)*/
}
Estecdigoesentodoequivalenteal"HolaMundo"original,sloquenosmuestracmoescribirycmoutilizarunafuncin.
Yademsnosmuestraunprincipiodebuenaprogramacin:meterlassentenciasque"haceneltrabajo"enotrasfunciones
especficasparasacarlasdemain(),dejandoenstatanslounguingeneraldeloquehaceelprograma,nolasrdenes
especficas.Deestamanerasefacilitalacomprensindelprograma,yportantoelfuturotrabajodemodificarlo.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
24/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Lasentenciareturn
Lasentenciareturnpuedeutilizarsedentrodeunafuncinparaterminarsuejecucin.
Enelejemploanterior,lafuncinholamundofuedeclaradaconvalorderetornodetipovoid(esdecir,valorderetornonulo).
Enesecaso,lasentenciareturnnollevaningnparmetroadicional,yaquelafuncinnodebedevolverningnvalorala
funcinquelallama.
Encambio,lafuncinmaintieneunvalorderetornodetipoint,porloquereturndebeirseguidodeunvalorentero(0enel
ejemplo).Elvalor0seutilizaparaindicarqueelprogramahallegadoaunpuntoenelquetodosehadesarrollado
correctamenteyseutilizacualquierotrovalorparaindicarquehahabidoalgntipodeerror.
Lainstruccinreturnnoesunafuncin,setratadeunasentenciaqueloquehaceesretornarcomovalordelafuncinelvalor
queseleproporcionacomoargumento.
Argumentos
Lasfuncionestambinpuedenrecibirargumentosoparmetros,paramodificarsucomportamiento.Porejemplo,ladefinicin
deunafuncinparasumardosnmerosseradelasiguientemanera:
Declaracinydefinicin
Enelejemploanteriorpodemosnotarquelafuncinsumarfiguraenelcdigoantesquemain.Qupasarasilas
escribiramosendistintoorden?
#include<stdio.h>
intmain(void)
{
intsuma=sumar(5,3);/*ERROR,sumarnohasidodeclaradaan*/
printf("Lasumaes:%d",suma);
return0;
}
intsumar(intnumero1,intnumero2)
{
returnnumero1+numero2;
}
Enestecasoelprogramaeserrneoynocompila,yaqueenlalneadondesellamaalafuncinsumar,elcompiladoranno
conoceningunafuncinconesenombre,yculessonsusargumentosyvalorderetorno.
Unaposiblesolucinesdeclararelprototipodelafuncinalprincipio,parainformaralcompiladorqueexiste,yluego
definirelcuerpodelamismaencualquierlugardelprograma:
#include<stdio.h>
/*Declaracin*/
intsumar(intnumero1,intnumero2);
intmain(void)
{
intsuma=sumar(5,3);
printf("Lasumaes:%d",suma);
return0;
}
/*Definicin*/
intsumar(intnumero1,intnumero2)
{
returnnumero1+numero2;
}
PasodeParmetros
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
25/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Lasfuncionespuedenrecibirdatoscomolohemosobservado,peroexistendosformasdeenviarlosdatoshaciaunafuncin
porvaloryporreferencia,lascualesmodificanendiferenteformaelcomportamientodeelprograma.
PorValor
Elpasoporvalorenvaunacopiadelosparmetrosalafuncinporlotantoloscambiosquesehaganenellanosontomados
encuentadentrodelafuncinmain().Ejemplo:
/*
*por_valor.c
*
*JulioCsarBrizuela<brizuelaalvarado@gmail.com>2009
*
*paraelwikilibro"ProgramacinenC"
*bajolicenciaFDL,adaptadodelDominioPblico
*/
#include<stdio.h>
voidsumar_valor(intnumero);/*prototipodelafuncin*/
intmain(void)
{
intnumero=57;/*definimosnumeroconvalorde57*/
sumar_valor(numero);/*enviamosnumeroalafuncin*/
printf("Valordenumerodentrodemain()es:%d\n",numero);
/*podemosnotarqueelvalordenumerosemodifica
*slodentrodelafuncinsumar_valorperoenlaprincipal
*nmerosiguevaliendo57
*/
return0;
voidsumar_valor(intnumero)
{
numero++;/*lesumamos1alnumero*/
/*elvalordenmerorecibidoseaumentaen1
*ysemodificadentrodelafuncinsumar_valor()
*/
printf("Valordenumerodentrosumar_valor()es:%d\n",numero);
return;
PorReferencia
Elpasoporreferenciasehaceutilizandoapuntadores.Seenvaladireccindememoriadelavariable,porlotantolos
cambiosquehagalafuncinsiafectanelvalordelavariable.Ejemplo:
/*
*por_referencia.c
*
*JulioCsarBrizuela<brizuelaalvarado@gmail.com>2009
*
*paraelwikilibro"ProgramacinenC"
*bajolicenciaFDL,adaptadodelDominioPblico
*/
#include<stdio.h>
voidsumar_referencia(int*numero);/*prototipodelafuncin*/
intmain(void)
{
intnumero=57;/*definimosnumeroconvalorde57*/
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
26/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
sumar_referencia(&numero);/*enviamosnumeroalafuncin*/
printf("\nValordenumerodentrodemain()es:%d",numero);
/*podemosnotarqueelvalordenumerosemodifica
*yqueahoradentrodemain()tambinsehamodificado
*aunquelafuncinnohayaretornadoningnvalor.
*/
return0;
voidsumar_referencia(int*numero)
{
*numero+=1;/*lesumamos1alnumero*/
/*elvalordenumerorecibidoseaumentaen1
*ysemodificadentrodelafuncin
*/
printf("\nValordenumerodentrosumar_referencia()es:%d",*numero);
return;
VariablesLocalesyGlobales
Ademsdepasarvaloresaunafuncin,tambinsepuedendeclarartiposdedatosdentrodelasfunciones,estostiposdedatos
declaradosdentrodeunafuncinsolosonaccesiblesdentrodeestamismafuncinyselesconocencomovariableslocales,
aspuespodemosdefinirlosmismosnombresdevariablesendiferentesfunciones,yaqueestasvariablessolosonaccesibles
dentrodeesasfunciones.Ejemplo:
/*
*locales.c
*
*JulioCsarBrizuela<brizuelaalvarado@gmail.com>2009
*
*paraelwikilibro"ProgramacinenC"
*bajolicenciaFDL,adaptadodelDominioPblico
*/
#include<stdio.h>
voidfuncion1()
{
intdato=53;/*definimosdatoen53*/
charnum1='a';/*num1valea*/
/*imprimimos*/
printf("Funcion1,dato=%d,num1=%c\n",dato,num1);
return;
voidfuncion2()
{
intdato=25;/*definimosdatoen25*/
charnum2='z';/*num2valez*/
/*imprimimos*/
printf("Funcion2,dato=%d,num2=%c\n",dato,num2);
return;
intmain(void)
{
funcion1();/*llamamosafuncion1()*/
funcion2();/*llamamosafuncion2()*/
return0;
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
27/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Enestecasolavariabledato,estadefinidadentrodecadaunadelasfuncionesysontotalmentedistintaunadeotraynose
puedeutilizarfueradeesta,aspuesnum2nopuedeserutilizadaporlafuncion1()ynum1tampocopuedeserutilizadapor
funcion2().
Existenpuesvariablesquesedefinenfueradelafuncinprincipalmain()yfueradecualquierotrafuncincreadapor
nosotros,estasvariablesselesconoceconelnombredeVariablesGlobalesyaquesepuedenutilizardentrodemain()y
dentrodecualquierfuncincreadapornosotros.Ejemplo:
/*
*global.c
*
*JulioCsarBrizuela<brizuelaalvarado@gmail.com>2009
*
*paraelwikilibro"ProgramacinenC"
*bajolicenciaFDL,adaptadodelDominioPblico
*/
#include<stdio.h>
intvariable_global=99;/*inicializamoslavariableglobal*/
voidfuncion();
intmain(void)
{
/*imprimimoselvalor*/
printf("main(),accesoavariable_global%d\n",variable_global);
/*llamamosalafuncin*/
funcion();
return0;
voidfuncion()
{
/*imprimimoselvalor*/
printf("funcion(),accesoavariable_global%d\n",variable_global);
return;
FuncionesRecursivas
Larecursividad(recursin)eslapropiedadporlacualunafuncinsellamaasmismadirectaoindirectamente.La
recursinindirectaimplicautilizarmsdeunafuncin.
Sepuedeconsiderarlarecursividadcomounaalternativaalaiteracin.Larecursinpermiteespecificarsolucionesnaturales,
sencillas,queseran,encasocontrario,difcilesderesolver.Todafuncinrecursivadebecontemplaruncasobaseo
condicindesalida,paraterminar,olarecursividadnopodrterminarnunca.
Unafuncinrecursivapodradefinirseas:
funcion_recursiva(/*parmetrosrecibidosporlafuncin*/)
{
/*Cdigo*/
funcion_recursiva();/*llamadaalafuncinmisma*/
/*Cdigo*/
}
Unodelosejemplosmsrepresentativosenlarecursividadeselfactorialdeunnumero(n!):
ladefinicinderecursividaddelfactoriales:
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
28/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Enestadefinicin,n=0,esnuestrocasobase,queledafinalarecursividad.
Entoncesnuestroprogramaquecalculaelfactoriales:
/*
*factorial.c
*
*JulioCsarBrizuela<brizuelaalvarado@gmail.com>2009
*
*paraelwikilibro"ProgramacinenC"
*bajolicenciaFDL,adaptadodelDominioPblico
*/
#include<stdio.h>
longfactorial(intn)
{
if(n==0)/*casobase*/
return1;/*como0!=1,seretorna1*/
else
returnn*factorial(n1);/*llamadaaestamismafuncin*/
}
intmain(void)
{
/*enestecasosellamaalafuncinyseimprimedirectamente*/
printf("%ld",factorial(5));
return0;
Tambinexistenotrostiposdefuncionesrecursivascomoloeselproductodedosnmeros.Elproductodea b,dondeayb
sonnmerosenterospositivosseria:
Soluciniterativa:
Solucinrecursiva:
Aspues
es:
Podemosverquelamultiplicacindedosnmerosa,bsepuedetransformarenotroproblemamspequeomultiplicarapor
(b1),elcasobaseseproducecuandob=0yelproductoes0.Ejemplo:
/*
*producto.c
*
*JulioCsarBrizuela<brizuelaalvarado@gmail.com>2009
*
*paraelwikilibro"ProgramacinenC"
*bajolicenciaFDL,adaptadodelDominioPblico
*/
#include<stdio.h>
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
29/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
intproducto(inta,intb)
{
if(b==0)/*casobase*/
return0;/*comob=0,seretorna0*/
else
returna+producto(a,b1);/*llamadaaestamismafuncin*/
}
intmain(void)
{
/*enestecasosellamaalafuncinyseimprimedirectamente*/
printf("%i",producto(7,3));
return0;
Recursividadindirectaorecursinmutua
Estaseproducecuandounafuncinllamaaotra,queestaasuvezterminarllamandodenuevoalaprimerafuncin.El
siguienteprogramavisualizaelalfabetoutilizandorecursinindirectaomutua:
/*
*elalfabeto.c
*
*JulioCsarBrizuela<brizuelaalvarado@gmail.com>2009
*
*paraelwikilibro"ProgramacinenC"
*bajolicenciaFDL,adaptadodelDominioPblico
*/
#include<stdio.h>
voidfuncionA(charc);/*sedeclaraelprototipodelafuncinparaqueelllamado*/
voidfuncionB(charc);/*alamismaenlafuncinnoseaimplcita*/
intmain(void)
{
funcionA('z');/*llamadoafuncionA*/
return0;
voidfuncionA(charc)
{
if(c>'a')/*casobasemientrascnoseamenorqueA*/
funcionB(c);/*llamadoalafuncionB*/
printf("%c",c);/*imprimimoselvalordec*/
*lavariableesunparametronoutilizadoparaesteproceso
}
voidfuncionB(charc)
{
funcionA(c);/*llamadoalafuncionAdecrementandoelvalorde'z'*/
}
RecursinversusIteracin
Tantolaiteracincomolarecursinsebasanenestructuradecontrol:laiteracinutilizaunaestructurarepetitivayla
recursinunaestructuradeseleccin.Laiteracinutilizaexplcitamenteunaestructurarepetitivamientrasquelarecursin
consiguelarepeticinmediantellamadasrepetitivasafunciones.
Laiteracinterminasilacondicindelbuclenosecumple,mientrasquelarecursinterminacuandosereconoceuncaso
base.
Larecursinpuedepresentardesventajasantelaiteracinyaqueseinvocarepetidasvecesalmecanismodellamadade
funcionesysenecesitauntiempomayorpararealizarcadallamada.
Laraznporlacualsepuedeelegiruoptarporusarrecursividadesqueexistenmuchosproblemascomplejosqueposeen
naturalezarecursivay,enconsecuencia,sonmasfcilesdeimplementar.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
30/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
EjemploIterativo
/*
*iterativo.c
*
*JulioCsarBrizuela<brizuelaalvarado@gmail.com>2009
*
*paraelwikilibro"ProgramacinenC"
*bajolicenciaFDL,adaptadodelDominioPblico
*/
#include<stdio.h>
longfactorial(intnumero);
intmain(intargc,char**argv)
{
intcontador=0;
/*calculaelfactorialde0a10*/
for(contador=0;contador<=10;contador++)
printf("%d!=%ld\n",contador,factorial(contador));
return0;
/*funcionfactorialiterativa*/
longfactorial(intnumero)
{
longresultado=1;
inti=0;
/*declaraciondelafuncinfactorialiterativa*/
for(i=numero;i>=1;i)
resultado*=i;
returnresultado;
EjemploRecursivo
/*
*recursivo.c
*
*JulioCsarBrizuela<brizuelaalvarado@gmail.com>2009
*
*paraelwikilibro"ProgramacinenC"
*bajolicenciaFDL,adaptadodelDominioPblico
*/
#include<stdio.h>
longfactorial(intnumero);
intmain(intargc,char**argv)
{
intcontador=0;
/*calculaelfactorialde0a10*/
for(contador=0;contador<=10;contador++)
printf("%d!=%ld\n",contador,factorial(contador));
return0;
/*funcinfactorialrecursiva*/
longfactorial(intnumero)
{
if(numero<=0)/*casobase*/
return1;/*casosbases:0!=1y1!=1*/
else/*llamadarecursiva*/
returnnumero*factorial(numero1);/*llamadaalafuncinfactorial*/
}
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
31/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Vectores
Losvectoressonunaformadealmacenardatosquepermitencontenerunaseriedevaloresdelmismotipo,cadaunodelos
valorescontenidostieneunaposicinasociadaqueseusarparaaccederlos.Estposicinondicesersiempreunnmero
enteropositivo.
EnClacantidaddeelementosquepodrcontenerunvectoresfijo,yenprincipiosedefinecuandosedeclaraelvector.Los
vectoressepuedendeclarardelasiguienteforma:
tipo_elementonombre[largo];
Estodeclaralavariablenombrecomounvectordetipo_elementosquepodrcontenerlargocantidaddeelementos,ycada
unodeestoselementopodrcontenerunvalordetipotipo_elemento.
Porejemplo:
doublevalores[128];
Enesteejemplodeclaramosunvectorde128elementosdeltipodouble,losndicesdeloselementosiranentre0(parael
primerelementoy127paraelltimo).
Delamismaformaqueconlasotrasdeclaracionesdevariablesquehemosvistoselepuedeasignarunvaloriniciaralos
elementos.
Otambinsepuedendeclarar:
tipo_elementonombre[largo]={valor_0,valor_1,valor_2};
Encasoestamosasignadolevaloresalosprimeros3elementosdelvectornombre.Notarquelargodebesermayoroigualala
cantidaddevaloresqueleestamosasignandoalvector,enelcasodeserlamismacantidadnoaportainformacin,porloque
ellenguajenospermiteescribir:
tipo_elementonombre[]={valor_0,valor_1,valor_2};
Quedeclararnombrecomoelvectordelargo3.
Paraaccederaunelementoaccederemosatravsdesuposicin.Esdecir:
tipo_elementoelemento;
...
elemento=nombre[2];
Asumiendoquetenemoselvectoranteriordefinidoestaramosguardandovalor_2enelemento.
Veamosalgunosejemplos:
/*
*Ejemplo:Elproductoescalardedosvectores
*/
#include<stdio.h>
doubleproducto_escalar(doublev1[],doublev2[],intd);
intmain()
{
constintlargo=3;
doublevector_1[]={5,1,0};
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
32/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
doublevector_2[]={1,5,3};
doubleresultado=producto_escalar(vector_1,vector_2,largo);
//imprimeelresultado
printf("(%f,%f,%f).(%f,%f,%f)=%f\n",
vector_1[0],vector_1[1],vector_1[2],
vector_2[0],vector_2[1],vector_2[2],
resultado);
return0;
/*productoescalarentredosvectores*/
doubleproducto_escalar(doublev1[],doublev2[],intd)
{
doubleresultado=0;
inti;
for(i=0;i<d;i++){
resultado+=v1[i]*v2[i];
returnresultado;
}
EnelejemploanteriorusamoslosvectoresdeCpararepresentarvectoresmatemticosycalcularelproductoescalarentre
ellos.Unapeculiaridadquesepuedenotaresquealrecibirunarregloenunafuncinnoseespecificaellargo,volveremosa
estoenuncaptuloposterior.
Otrafuncinclsicaeslabsquedadeunmximoomnimo,quepodemosescribirladelasiguientemanera:
intbuscar_maximo(doublevalores[],intnum_valores)
{
intmaximo_pos=0;
for(inti=1;i<num_valores;i++){
if(valores[i]>valores[maximo_pos]){
maximo_pos=i;
returnmaximo_pos;
}
Otroejemplosencillo,calcularelpromediodelosvalores.
doublepromedio(doublevalores[],intlargo)
{
doublesuma=0;
for(inti=0;i<largo;i++){
suma+=valores[i];
returnsuma/largo;
}
Cuandounafuncinrecibeunvectorporparmetroycambiasucontenidoyelcambioespermanente(seveanfueradela
funcin).Estopuedeparecerextraodespusdelnfasisquepusimosenresaltarquetodoslosparmetrosdeunafuncinse
recibenporvalor,peroseaclararenelsiguientecapitulo.
Mientrastantousemosestoparadefinirunafuncinqueleapliqueotrafuncinquerecibeporparmetroacadaelementodel
vector,guardandoelresultadoenelmismovectoryunallamadadeejemploaesta.
voidcuadrados(doublevector[],intlargo)
{
for(inti=0;i<largo;i++){
vector[i]=cuadrado(vector[i]);
}
}
...
doublecuadrado(doublevalor){
returnvalor*valor;
}
...
cuadrados(elementos,num_elem);
...
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
33/34
15/7/2015
ProgramacinenC/TextocompletoWikilibros
Delamismaformaquevenimosusandovectoresdetiposbsicos,podemostenervectoresdevectores,estossedeclarandela
siguienteforma:
intmatriz[3][7];
inttabla[3][4]={{1,2,3,4},
{5,6,7,8},/*losespaciosysaltosdelneasnosontomadosencuenta*/
{9,10,11,12}};
doublev[2][2][2];
...
printf("tabla[0][1]:%i\n",tabla[0][3]);//Imprime4
printf("tabla[2][0]:%i\n",tabla[2][0]);//Imprime9
...
Enesteejemplotablaesunvectordelongitud3,cuyoselementossonvectoresdelongitud4deelementosdetipoint.
Enresumen,suponiendoquev[n]esunvectordecualquiertipodedatoconncantidaddeposiciones,alvectorvseleaplican
lassiguientesreglas:
1. Laprimeraposicinsiempreserv[0]
2. Laltimaposicinesv[n1]
3. EnversionespreviasaC99nesunaconstantedefinidaantesdeladeclaracindev[n]
GNUFreeDocumentationLicense
Obtenidodehttps://es.wikibooks.org/w/index.php?title=Programacin_en_C/Texto_completo&oldid=171299
Categoras: ProgramacinenC Programacin
Estapginafuemodificadaporltimavezel31may2011alas04:07.
EltextoestdisponiblebajolaLicenciaCreativeCommonsAtribucinCompartirIgual3.0puedenaplicarsetrminos
adicionales.VaseTrminosdeusoparamsdetalles.
https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes
34/34