Вы находитесь на странице: 1из 34

15/7/2015

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:

82 161 84 161 58 201 82 214 181 106 183 ...


Tambinpodemosrepresentarestosnmerosenbasehexadecimal:
0x52 0xA1 0x54 0xA1 0x3A 0xC9 0x52 0xD6 0x35 0x6A 0xB7 ...
Oconsiderarloscaracteres,mediantealgunacodificacin:
R T : R 5 j ...
EsteeseltipodedatomselementalquenospodemosencontrarenC:elcaracter.Uncaracterocupaexactamenteunbyte(8
bits)dememoria,ypuedecontenerunnmeroentre0y255,oentre128y127,dependiendosiqueremosconsiderarlocomo
sinsignooconl.

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

Вам также может понравиться