Programación en C

34
Programación en C Texto completo De Wikilibros, la colección de libros de texto de contenido libre. < Programación en C Programación en C Contenido 1 Prólogo 1.1 Prólogo 1.1.1 ¿Para quién es este libro? 1.1.2 ¿Por qué otro manual de C? 1.2 Enlaces 1.3 Licencia y autores 1.4 ¿Cómo contribuir a este WikiLibro? 2 Introducción 2.1 Objetivos 2.2 Nota sobre la exactitud 2.3 Estándar utilizado 2.4 Para los principiantes 2.5 Para los más avanzados 2.6 Requisitos 2.7 Herramientas 2.8 Windows 2.9 GNU/Linux 3 Historia de C 3.1 Evolución 3.2 Más información 4 Fundamentos de programación 4.1 Definiciones 4.2 Tipos de lenguajes 4.2.1 Esquemas de programación 4.2.2 Alto o bajo nivel 4.2.3 Compilados o interpretados 4.3 Estructura de la memoria 5 Primer programa en C 5.1 Prerequisitos para la compilación de programas 5.2 Compilación de programas según la plataforma 5.2.1 Windows 5.2.1.1 Compilación del código fuente 5.2.1.2 Salida por pantalla 5.2.2 GNU 5.3 Diseccionando el "Hola Mundo" 5.4 Comentarios 6 Tipos de datos 6.1 Historia 6.2 Enteros 6.3 Flotantes 6.4 Caracteres 7 Interacción con el usuario 7.1 Imprimir por pantalla 7.2 Lectura de datos del teclado 7.2.1 La función scanf()

description

Pequeño tutorial de Programación C

Transcript of Programación en C

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 1/34

    ProgramacinenCTextocompletoDeWikilibros,lacoleccindelibrosdetextodecontenidolibre.

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 2/34

    8Expresiones9Instruccionesdecontrol

    9.1Laestructuracondicionalif...else9.1.1Operadoresdecomparacin9.1.2Operadoreslgicos9.1.3Evaluacindecortocircuito

    9.2Laestructuracondicionalabiertaycerradaswitch...case9.3Elbuclewhile9.4Elbuclefor9.5Elbucledo...while9.6Lasentenciagoto

    10UsodeFunciones10.1Funciones

    10.1.1Lasentenciareturn10.1.2Argumentos10.1.3Declaracinydefinicin10.1.4PasodeParmetros

    10.1.4.1PorValor10.1.4.2PorReferencia

    10.1.5VariablesLocalesyGlobales10.2FuncionesRecursivas

    10.2.1Recursividadindirectaorecursinmutua10.2.2RecursinversusIteracin

    10.2.2.1EjemploIterativo10.2.2.2EjemploRecursivo

    11Vectores12GNUFreeDocumentationLicense

    12.10.PREAMBLE12.21.APPLICABILITYANDDEFINITIONS12.32.VERBATIMCOPYING12.43.COPYINGINQUANTITY12.54.MODIFICATIONS12.65.COMBININGDOCUMENTS12.76.COLLECTIONSOFDOCUMENTS12.87.AGGREGATIONWITHINDEPENDENTWORKS12.98.TRANSLATION12.109.TERMINATION12.1110.FUTUREREVISIONSOFTHISLICENSE

    PrlogoPrlogo

    Elavancedelatecnologaylaconcurrenteentregadeinformacin,nospermitegenerarunaedicin,variableyalternativaenlaenseanzadellenguajedeprogramacinquemsimpactosocialhatenidoenlahistoriadelainformtica.Estelibrohasidoforjadoconlaincansableayudadeinformticosdehablahispana,quienesbyteabytehancolaboradoporhacerdelainformacinunafuentedeconocimientoglobal.Delamismaforma,continahoysiendomodificadoenunaconstantebsquedadesuperacindelacalidad.

    Estaobraestllamadaaserlapiedraangularenlaenseanzadelaprogramacin,lograndoabarcartodoslosaspectosdellenguajeendiversosnivelesydeestaformasertantounareferenciatcnicaparaquienesyadominanellenguajecomounaintroduccinsencillaparaquienesestnempezandoaconocerlo.

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 3/34

    Viajaremosporlahistoriadellenguaje,veremossupropsitoeindagaremosenlacienciadelaprogramacin.ElfinesotorgarallectorunadoctrinaclaradelaprogramacinyellenguajeCloinduciremosaconseguirunmanejoimportantedellenguaje.

    Paraquinesestelibro?

    Estelibroestdirigidoatodoslosquedeseenobtenerconocimientosdeprogramacin,pueselobjetivoexplcitoquenoshamotivadoacrearloesdifundirlaimportanciadellenguajeCenelmundodelainformtica.Sinosenfocamosaungruposocialespecfico,podremosindicarqueestelibrocontribuirconlosestudiantesdecarrerasdelreainformtica,debidoaquelostemasconvenidos,sonpartedesuplandeestudios.

    PorquotromanualdeC?

    PorqueellenguajeCeslabasefundamentaldelaprogramacin.Paraquienesestnenelambientedelainformticaescrucialtenerporlomenosnocionesdeestelenguaje.Variossistemasoperativos,cientosdebibliotecas,ymilesdeprogramasestnconstruidosutilizandoC,alconocerloesposibleentender,colaborarydesarrollarenestelenguaje.

    Lossistemas,programas,juegosyherramientasquenosotrosdisfrutamoshoyfueronconstruidosporpersonascomonosotros,queempezaronconnuestromismopotencialyfueronaprendiendoahacercosasfantsticasconlasherramientasquetenanamano.

    UnaraznimportanteparaotrolibrodelenguajeCestambinqueloslibrosexistentesmuestranmuypocadocumentacindecalidad.EnInternetexisteunacantidadinmensadeinformacinpublicadaperoestdispersa,ymalmanejadaenalgunossitios.Eslaintencindeestelibrocrearunbuencompendiodeinformacin,quepermitaalosinteresadosaprenderaprogramarenC.

    Enlaces

    Nocionesbsicasdeprogramacin(generales,independientesdellenguaje):

    Fundamentosdeprogramacin

    Wikilibrosimilarasteeningls

    CProgramming

    esquemadeoperadoresyexpresiones

    [1](http://es.calameo.com/read/000048582e9eccea231d9)

    Licenciayautores

    Copyright2004EnviteCopyright2005AlejandroMorenoCalvoCopyright2006AndreuCorreaCasablancaCopyright2009zerohours

    Verelhistorialdecadapginaparaelrestodeautores.

    CmocontribuiraesteWikiLibro?

    https://es.wikibooks.org/wiki/Usuario:Envitehttp://es.calameo.com/read/000048582e9eccea231d9https://es.wikibooks.org/wiki/Fundamentos_de_programaci%C3%B3nhttps://en.wikibooks.org/wiki/C_Programminghttps://es.wikibooks.org/wiki/Usuario:Almorcahttps://es.wikibooks.org/w/index.php?title=Usuario:CaStarCo&action=edit&redlink=1https://es.wikibooks.org/wiki/Usuario:Zerohours
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 4/34

    Contribuirconestelibroesmuysimpleprimerodeberasregistrarteunusuarioy/oentrar(estonoesnecesarioperosimuyconveniente)aWikilibros,paraquepodamosidentificartusediciones.Luego,sinuncahascontribuidoenunproyectodewikipediaoenotrowikideberasleerelmanualdeusodewikilibros.

    Unavezhechoestotodoloquetienesquehaceresagregarelcontenidoqueconsideresnecesarioparaellibro.Paraeditarcualquierseccinbastaconhacerclickallinkquediceeditarenlapestaaenlapartesuperiordelapagina,seriabuenorevisar(antesdeeditarcualquiercosa)lapestaadediscusinqueestahparaserusada.Tenencuentaqueelmaterialqueyaestfueescritoporpersonasquedeseabancontribuirigualquet,asquetrataderespetarlo.Aunqueconestonomerefieroaquesisenecesitaalgunacorreccin,reorganizacin,quitarpartesqueseanambiguas,nodejesdehacerlo.Lomejorseraquetodoscontribuyramosdecualquiermaneraallibro.

    Adems,esrecomendableconsultarlapginadediscusindellibroyladelarticuloenparticularquequierasmodificar,yaquedeestamanerasepuedencoordinaresfuerzos.

    RecuerdaquetodoelcontenidoqueaadasallibroespublicadobajolalicenciaGFDL,porloquenousesmaterialquenohayasidoescritoportioquenoestyapublicadobajoGFDL.RecientementewikimediadecidiadoptarlaLicenciaCreativeCommonsCompartirIgual3.0(http://creativecommons.org/licenses/bysa/3.0/deed.es)paratodoslosaportes,porloqueactualmenteellibrotieneunalicenciadual.

    IntroduccinObjetivos

    ElobjetivoprincipaldeesteWikilibroesquecualquierpersonasinconocimientospreviosdeprogramacinpuedasercapazdeprogramarenellenguajeC.

    Unavezlogradoeldominiodellenguaje,esprobablequeloslectoresseinteresenporotrostemasmscomplejosquesuperenalostemasbsicos.Tambinlessermsomenossencilloaprendercualquierotrolenguajedeprogramacinestructurada.

    Sinembargo,estenoesunlibroqueapuntenicamenteaprogramadoresprincipiantes.Tambinpuederesultardeintersparaquienesyatenganexperienciaenelreadeprogramacin.EnestaintroduccinhaydosseccionesenlasqueseexplicaparalosdosgruposprincipalesdelectoresqucaminoseguirparacomenzaraprogramarenellenguajeCobienperfeccionarconocimientos.

    EllenguajeCestanusadoporqueesunlenguajedeprogramacinqueempleapocasinstruccionesenlenguajemquinaparatraducirelementosdelcdigo.Estoreducelostiemposdeejecucindelosprogramas.

    Notasobrelaexactitud

    Muchasdelascosasexpresadasenestewikilibro,especialmenteenlosprimeroscaptulos,nosoncompletamenteexactas,aunquesonbuenasaproximaciones.Losdetallesmsexactosirnapareciendoposteriormente,unavezquelosmaterialesanterioreshayansidocorrectamenteasimiladosporellector.Engeneral,dadasdosdefinicionesodatoscontradictoriosenestewikilibro,debeconsiderarsesiemprecomomsexactoalsegundo,habiendoaparecidoelprimerocomounaintroduccinmsgeneralaltema.

    Estndarutilizado

    EllenguajeCfuecreadoenlosaossetenta,yalolargodesuhistoriahapasadopormuchasmodificaciones,tantoconrespectoalasintaxiscomoconrespectoalcdigoincluidodentrodelabibliotecaestndar.Esporelloquesefuerondesarrollandoestndares,paraquetodossepanconquversindellenguajeseesttrabajando.

    LosdistintosestndaresdellenguajeChansido:elCdeKernighanyRitchie,unestndarnooficialquesurgiluegodelapublicacindesulibroen1978elC89oC90,elprimerestndaroficial,posterioralapublicacindelosestndaresANSIen1989eISOen1990yelC99,publicadoen1999.

    https://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Chttps://es.wikibooks.org/wiki/Especial:Entrarhttps://es.wikipedia.org/wiki/Programaci%C3%B3n_estructuradahttps://es.wikipedia.org/wiki/Licencia_de_documentaci%C3%B3n_libre_de_GNUhttps://es.wikibooks.org/wiki/Discusi%C3%B3n:Programaci%C3%B3n_en_Chttps://es.wikibooks.org/wiki/Wikilibros:Manualhttp://creativecommons.org/licenses/by-sa/3.0/deed.es
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 5/34

    EnestelibroseutilizarelestndarC99,sibienporcuestionesdeestiloycompatibilidadmuchasvecesseutilizarcdigocompatibleconelestndarC89.

    Paralosprincipiantes

    Paraquiennohayaprogramadoantes,esrecomendableseguirelordendellibro.Lostemasestnespecialmenteorganizadosdemaneraincrementaloacumulativa.Talvez,loquesetevaahacermstilenelcaminodelaprendizajeeslaconstanciasterco,notrastabilles,noterindas,talveztupreguntaseacuntasvecestengoqueintentar?,lasvecesnecesariasparalogrartuobjetivo,seralarespuesta.

    Claroqueelprincipalenemigodenosotrosloshumanoseseltiempoyporesoencasodequedeverdadeststrancadoenalgobuscaayudadealguienquesepa"msquet".Quenotienesanadieatualrededorconesacaracterstica?Talveznobuscastebienytalvezquierasusarlaredderedes.Utilizalosbuscadores,preguntaenIRC,enforosdeprogramacin,enlistasdecorreo.

    Paralosmsavanzados

    Ellanzamientoquedalibreporsupuesto,solotsabesloquenecesitas.Lasreglasdeljuegosonlasmismasdesiempre:primerosaberloquesequiereonecesitayatacarporah.

    Enestecaso,tesertilaccederaloscontenidosapartirdelndice,eligiendosloaquellosqueteseannecesarios.

    Requisitos

    Sepresuponequeloslectorestienenconocimientoselementalesdeinformticaaniveldeusuario,ysoncapacesdeinstalaruncompiladordellenguajeCensussistema.LosdetallessobrelainstalacinsevernenlaseccinHerramientas.

    ConrespectoalHardware,slosernecesariocontarconunaPCconsistemaoperativo,dondeseaposibleinstalaruncompilador,yenloposibleunentornodedesarrollo.Cuantomejorsealacomputadora,msrpidoserelprocesodecompilacinyejecucindelosprogramas.Sinembargo,cualquierPCsirveparaaprenderconlosejemplosdeestelibro.

    Paraquienesnotenganconocimientosbsicosdeprogramacin,puedeserunabuenaideacomenzarleyendolosprimeroscaptulosdelWikilibroFundamentosdeprogramacin,yaquealgunostemasexplicadoseneselibroseasumenyaconocidos.

    Finalmente,unrequisitoimprescindibleentodoprogramadorestenersentidocomn.Muchasvecessepuedenadoptarmejoresopeoressolucionesantelosdiversosproblemas,yladecisindeculelegirpasaporlaaplicacindelsentidocomn.

    Herramientas

    ParaprogramartantoenC,comoenC++,Javaocualquierotrolenguajedeprogramacin,necesitamoscontarconaplicacionesoherramientasquenospermitanponerenfuncionamientonuestroprograma.

    EllenguajedeprogramacinCescompilado,asqueenestecasonecesitaremosuncompilador,queserelencargadodetransformarnuestrocdigofuenteencdigoquelacomputadorapuedaejecutar.

    Adems,parafacilitarlatareadelosprogramadoresexistenlosdenominadosEntornodedesarrollointegrados(IDE).Enmuchoscasos,estosentornosincluyenuncompilador,undepurador,yotrasherramientas.

    Lasherramientasainstalardependerndelsistemaoperativoutilizado.AcontinuacinselistanalgunasposibilidadesparaelsistemaoperativoWindowsoGNU/Linux,noesimprescindibleutilizarestasherramientasenparticular,cualquiercompiladorpuedeservir.

    Windows

    https://es.wikibooks.org/wiki/Fundamentos_de_programaci%C3%B3n
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 6/34

    UnodelosentornosdedesarrollomsconocidosentrelosprogramadoresdeCsobreWindows,tantonovatoscomoexpertos,eselBloodshedDevC++,queesunentornolibremultiplataforma.TalentornodedesarrollofueabandonadoyretomadomejorndolopasandoallamarseWxDevC++(http://wxdsgn.sourceforge.net/).OtroentornolibreygratuitoeselCode::Blocks(http://www.codeblocks.org/).AmbosentornospuedenutilizarsetantoparaCcomoparaC++.

    TambinhayotrasalternativasprivativascomoloscompiladoresdeBorlandodeMicrosoft(MicrosoftVisualC++).

    GNU/Linux

    EnlossistemasGNU/Linux,sernecesariotenerinstaladaslasherramientasgccymakeylaversin6delaglibcconsudocumentacin,quesonlasquepermitirncompilarlosprogramas.

    Paraescribirymodificarelcdigo,esposibleutilizarcualquiereditordetextoplano(enloposiblequecuenteconresaltadodesintaxis),comosonemacs,vim,kate,geditogeany.

    Sinembargo,paraquienessonnovatosenlaprogramacin,esrecomendableutilizarunentornodedesarrollocomosonelAnjutaDevStudio(paraelentornoGNOME)oKDevelop(paraelentornoKDE),yaqueincluyenfacilidadesadicionalesparalaejecucinysolucindeproblemas.

    LosprogramasmencionadosseincluyendentrodelainstalacinestndardelamayoradelasdistribucionesactualesdeGNU/Linux,demodoqueparainstalarlosslosernecesarioseguirelprocedimientousualdeinstalacindeaplicacionesparaladistribucindeseada.

    HistoriadeCEllenguajedeprogramacinCfuecreadoporDennisRitchieentre1969y1973cuandotrabajabaenBellLaboratoriesdeAT&TjuntoconKenThompsoneneldiseodelsistemaoperativoUNIX.Cfuecreadoparapoderescribirdichosistemaoperativoenunlenguajedealtonivel,independientedelhardwaredondeseejecutara.

    Contarconunlenguajedealtonivelpermitielavancedelossistemasoperativos,yaqueelmismocdigopodaserutilizadoenlasdistintasplataformas,propiciandolareutilizacindecdigoyreduciendolostiemposdedesarrollo.AsesquelossistemasoperativosbasadosenUNIX,elsistemaBSD,elsistemaGNU/LinuxymuchosotrosfuerondesarrolladosenC.

    Adems,conelpasodeltiemposehandesarrolladocientosdebibliotecasquepermitenalosprogramadoresdeCutilizarelcdigodesarrolladoporotrosparalarealizacindetareascomunes.Esto,asuvez,hapropiciadoeldesarrollodeaplicacionesenlenguajeC.

    ActualmenteesimposiblecontarlacantidaddeaplicacionesyherramientasdesarrolladasenC.

    Evolucin

    Amediadosdelosaos60s,MartinRichardsdiseellenguajeBCPLconlafinalidaddeusarloparaescribirsoftwaredesistemasoperativosycompiladores.

    En1969,KenThompsonescribielLenguajeB,enBellLaboratories,conelobjetivoderecodificarUNIX(escritohastaesemomentoenlenguajeensamblador)usandounlenguajedealtonivelmsportableyflexible.

    Durantelossiguientesaos,DennisRitchiemodificellenguajeB,llegandoacrearellenguajeCyreescribiendoelsistemaUNIXendicholenguajeaadicaractersticasnuevas,comosoneldiseodetiposylasestructurasdedatos.

    https://es.wikipedia.org/wiki/Glibchttp://wxdsgn.sourceforge.net/https://es.wikipedia.org/wiki/Martin_Richardshttps://es.wikipedia.org/wiki/Ken_Thompsonhttps://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Bhttps://es.wikipedia.org/wiki/BCPLhttp://www.codeblocks.org/https://es.wikipedia.org/wiki/Dennis_Ritchie
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 7/34

    En1978,DennisRitchieyBrianKernighanpublicaronlaprimeraedicindellibroEllenguajedeprogramacinC.Estelibrofueduranteaoslaespecificacininformaldellenguaje.Ellenguajedescritoenlaprimeraedicindeestelibro,fueconocidocomo"elCdeKernighanyRitchie"osimplemente"K&RC".Enestelibroseintrodujeronnuevascaractersticasallenguaje:lostipodedatosstruct,longintyunsignedintlosoperadores=+y=fueronsustituidospor+=y=.

    Amediadosdelosaos80,BjarneStroustrup(tambindeloslaboratoriosBell),creaellenguajeC++,unlenguajebasadoenC,connumerosascaractersticasadicionales,siendolaprincipalqueestorientadoaobjetos.SibiensehancreadomuchoslenguajesbasadosenC,C++eselquehapermanecidomsasociadoaC.

    EnlosaossiguientesalapublicacindelCdeKernighanyRitchie,seaadieronallenguajemuchascaractersticasnooficiales,queestabanpresentesenalgunoscompiladoresynoenotros.Fueporelloqueen1989ANSI(AmericanNationalStandardsInstitute)publicelprimerestndaroficialdeC,queesconocidocomoANSIC.

    Enesteestndarsetomaronmuchasdelasfuncionalidadesnooficialesyseagregaronfuncionalidadesnuevascomolosprototiposdefuncin,yunpreprocesadormejorado.Tambinsecambilasintaxisdeladeclaracindeparmetrosdefunciones,paraqueincluyeraneltipojuntoconelnombre.

    Alaosiguiente,en1990sepubliclaestandarizacinISOdellenguaje.EsteestndaresbsicamenteelestndarANSI,conunaspocasmodificacionesdeformato.Aesteestndarseloconoce,entonces,comoC89,oC90,ysetratadelmismolenguaje.

    BasndoseenelestndarANSIqueestabaenpreparacin,en1988KernighanyRitchiepublicaronlasegundaedicindesulibro,queesanhoyutilizadacomounadelasreferenciasprincipalesdellenguaje.

    Durantelossiguientesaos,ellenguajeCpermanecisindemasiadoscambios.Sinembargo,comohabasucedidoantes,losdistintoscompiladoresfueronincorporandocaractersticasadicionales,queotroscompiladoresnotenan,siendoC++laprincipalinfluencia.

    FueporelloqueafinalesdelosnoventasedecidirevisarelestndardeC,loquellevalapublicacindelestndarC99.Esteestndarincluyevariasnuevascaractersticascomoson:lasfuncionesinlinelaposibilidaddedeclararvariablesencualquierpartedelcdigoloscomentariosdeunasolalneautilizando//lostiposdedatoslonglongint,boolycomplex,entreotras.

    Anhoyelprocesodeevolucindellenguajesigueavanzando,ydesde2007seesttrabajandoenelarmadodeunnuevoestndar.

    Msinformacin

    LenguajedeprogramacinBCPLHistoriadellenguajedelprogramacinCTheDevelopmentoftheCLanguage(http://cm.belllabs.com/cm/cs/who/dmr/chist.html)

    FundamentosdeprogramacinEnestecaptuloveremosunresumidolistadodeconceptosbsicos,estainformacinpuedeencontrarseenformamselaboradaenelWikiLibroFundamentosdeprogramacin.

    Definiciones

    Sedenominaalgoritmoaunasecuenciadeinstruccionesquepermitenobtenerunresultadoenparticular.Nonecesariamentesonprogramasdecomputadora,unarecetadecocina,olasinstruccionesparacambiarunneumticosonejemplosdealgoritmosdelavidareal.

    Lascomputadoras,sonmaquinassininteligenciapropia,cuyanicafinalidadesinterpretarelcdigoqueselesprovee.

    Ellenguajedemquinaeselnicolenguajequelacomputadora"entiende"yescapazdeejecutar.

    https://es.wikipedia.org/wiki/Lenguaje_de_m%C3%A1quinahttps://es.wikipedia.org/wiki/Bjarne_Stroustruphttps://es.wikipedia.org/wiki/Computadorahttps://es.wikipedia.org/wiki/BCPLhttps://es.wikipedia.org/wiki/Algoritmohttps://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_C#Historiahttp://cm.bell-labs.com/cm/cs/who/dmr/chist.htmlhttps://es.wikipedia.org/wiki/C%2B%2Bhttps://es.wikibooks.org/wiki/Fundamentos_de_programaci%C3%B3n
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 8/34

    Loslenguajesdeprogramacinsonelmediodecomunicacinentreelprogramadoryunacomputadora.Elprogramadorescribeenalgnlenguajedeprogramacinyutilizalasherramientasprovistasporeselenguajeparatransformarloenlenguajedemquina.

    Finalmente,denominamosprogramaaunasecuenciaderdenesaserejecutadasporunacomputadora.Unprogramadebeestarescritoenalgnlenguajedeprogramacin,ypuedeincluirunoomsalgoritmos.

    Tiposdelenguajes

    Existeunagrancantidaddelenguajesdeprogramacin,queestnpensadosparadistintasfinalidades,siguendistintosparadigmas,ydeunauotraformasediferenciandelosdems.

    Esquemasdeprogramacin

    ElesquemadeprogramacinllamadoProgramacinImperativa,consisteenescribirunasecuenciadeinstruccionesunadetrsdelaotra,queseejecutarnenorden.Algunasdeesasinstruccionespuedenhacerquelamquinapaseaunainstruccinquenosealasiguiente,talvezporquesecumplaunacondicinquehayamosestablecido.

    Enlosltimosaoshatomadofuerzaotroparadigmadecomputacin,llamadoProgramacinOrientadaaObjetos,enelcualseintentanmodelarlossistemascreadoscomoextensionesdelarealidadmedianteladefinicinde"objetos"quemodelanentidadesdelavidarealyqueinteractanentresmediante"mensajes"llamadasmtodos.

    EllenguajeCesunlenguajeimperativo,noorientadoaobjetos.

    Altoobajonivel

    Porotrolado,loslenguajesdeprogramacinseclasificanenniveles.Unlenguajeesdemsbajonivelcuantomscercanoestalcdigodemquina,yunlenguajequeesdemsaltonivelcuantomslejanoestdelamquinaymscercanoallenguajehumano.

    Cesunlenguajedealtonivelaunquetienemuchascaractersticasdelenguajedebajonivel(comoelusoquepermitehacerdelamemoria).EstascaractersticashacenqueCseaunlenguajemuypotente,yaquepermiteoptimizaralmximolosrecursosdelamquina.Porende,estotambinhacequeladificultadyqueloserroresquesepuedancometerprogramandoaumenten.AsqueaCseleconsideradenivelmedio.

    LenguajesdemsaltonivelqueCsonaquellosenlosqueelprogramadornonecesitaencargarsedemanipularlamemoria,comoJava,C#,Python,Ruby,entreotros.

    Compiladosointerpretados

    Otraformadeclasificaraloslenguajesdeprogramacinqueessegnlaformaenqueseejecutansusrdenes.Existenloslenguajesquesoninterpretados,cuyasrdenespasanatravsdeunintrpretequeseencargadeejecutarlas(apartirdelcdigofuente)enelmismomomentoenqueestnsiendoledas.AlgunosdeloslenguajesinterpretadossonPython,PerloTcl,entremuchosotros.

    Lacontrapartedeloslenguajesinterpretadossonloslenguajescompilados(comoelmismoC)quesediferencianenquelasrdenessontransformadasalenguajedemquinaquesealmacenaenunarchivoejecutable.Esearchivopuedeejecutarseluego,sinrecurriralcompilador.

    Loslenguajescompiladostienenlaventajadelavelocidadylaeficiencia,perolosinterpretadostienenlaventajadeque,generalmente,sonmuyportablesydemsaltonivel.

    Estructuradelamemoria

    PartedeestapotenciadeCvienedequepermiteaccederconmuchalibertadalamemoriadelamquina.Paraentenderunpococmoesposible,debemosentendercmoseguardanlosdatosenlamemoria.

    https://es.wikipedia.org/wiki/Lenguaje_interpretadohttps://es.wikipedia.org/wiki/Lenguaje_compiladohttps://es.wikipedia.org/wiki/Lenguaje_de_bajo_nivelhttps://es.wikipedia.org/wiki/Programa_(computaci%C3%B3n)https://es.wikipedia.org/wiki/Programaci%C3%B3n_imperativahttps://es.wikipedia.org/wiki/Lenguaje_de_alto_nivelhttps://es.wikipedia.org/wiki/Paradigma_de_programaci%C3%B3nhttps://es.wikipedia.org/wiki/Pythonhttps://es.wikipedia.org/wiki/Pythonhttps://es.wikipedia.org/wiki/Rubyhttps://es.wikipedia.org/wiki/Tclhttps://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetoshttps://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3nhttps://es.wikipedia.org/wiki/Perlhttps://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Javahttps://es.wikipedia.org/wiki/C_Sharp
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 9/34

    Imaginemosquelamemoriatieneunmontndecasillas,unaenormefiladecasillas,cadaunadelascualescontieneundgitobinario(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(8bits)dememoria,ypuedecontenerunnmeroentre0y255,oentre128y127,dependiendosiqueremosconsiderarlocomosinsignooconl.

    PrimerprogramaenCEnellibro"ElLenguajedeProgramacinC",KernighanyRitchieintrodujeronallenguajeCutilizandounsencilloprogramaquemostrabaunsaludoporlapantalla.DesdeentoncessehizotradicinempezarconcualquierlenguajedeprogramacinconelejemplodelHolamundo.

    EnparticularenCseinvolucranmuchaspartesysintaxisdellenguaje,porlocualesespecialmentetilverlocomoelprimerejemplodeprogramacinenC.

    Ejemplo:Holamundo

    /*Inclusindearchivos*/#include

    /*Funcinprincipal*/intmain(intargc,char**argv){/*Impresinporpantallaysalidadelprograma*/printf("Holamundo\n");return0;}

    Parapodereditaryejecutaresteprogramasernecesarioutilizaralgneditoryluegouncompilador,comoseexplicenlaseccinHerramientasnecesarias.

    SisetieneelcompiladorgccenunentornoUNIXoGNU/Linux,laformasencilladecompilaryejecutarser:

    $gccholamundo.c$./a.outHolaMundo$

    https://es.wikipedia.org/wiki/Bithttps://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Herramientashttps://es.wikipedia.org/wiki/Bytehttps://es.wikipedia.org/wiki/Hola_mundohttps://es.wikipedia.org/wiki/Codificaci%C3%B3n_de_caracteres
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 10/34

    Esdecirqueelcompiladorgeneraunarchivo,enestecasollamadoa.out,ylasalidageneradaporesearchivoes"Holamundo".Acontinuacinunaexplicacindetalladasobreelprocesodecompilacindelprograma,yluegounanlisislneaporlneadelcontenidodeesteejemplo.

    Prerequisitosparalacompilacindeprogramas

    Comoyasemencion,sernecesariotenerinstaladoelcompiladoryuneditoroentornodedesarrolloquepermitanescribirelcdigoacompilar.ParamsinformacinverlaseccinHerramientasnecesarias.

    Elcdigoacompilardebeguardarseconunnombrequerepresentealprogramaencuestinylaextensin.c.EnelcasodelejemplodelHolamundo,elarchivopuedellamarsehola.c.

    Enlasexplicacionesacontinuacin,seasumequesecuentaconuncompiladorinstaladoysehaeditadounarchivohola.cquesequierecompilar.Situsistemaoperativonoapareceenestalistabuscaeninternet,yaqueseguroqueexistealgncompiladorparaesesistema.

    Compilacindeprogramassegnlaplataforma

    Windows

    ParacompilarunprogramaCenentornosWindows,debemosseguirunaseriedepasosquevaransegnelcompiladordeCquequeramosutilizar.Antesquenada,serabuenoqueserevisesladocumentacindelcompiladorelegidoparaconocerloscomandosexactos.

    Compilacindelcdigofuente

    Siseutilizaunentornodedesarrollo,serposiblecompilardirectamentedesdeelentorno,medianteunbotnounacombinacindeteclas.

    Siseejecutaelcompiladordesdelalneadecomandos,lalneaserdistintasegnelcompiladorutilizado.Acontinuacinalgunosejemplosdeciertoscomandossegnelcompilador:

    EnTurboCdeBorlandes:tcchola.cEnC++deBorland:bcchola.cEnVisualCdeMicrosoft:clhola.cEnGNUgcc:gcchola.cocchola.cElCdeZortech:ztchola.c

    Unavezcompiladoelcdigofuentesegeneraunarchivollamadoarchivoobjetooprogramaobjetoqueesluegoenlazadomedianteelenlazador,paragenerarelarchivoejecutable.

    Loscompiladoresactualessuelenhacerdosfuncionesdeunavez,compilandoyenlazandotodoenunasolafuncin,aunqueesposiblepedirlesquenolohaganmedianteparmetrosadicionales.

    Segnelcompiladorylaconfiguracinutilizada,seobtendrndosotresarchivos:

    Elarchivofuente

    hola.c

    Elarchivoobjeto

    hola.obj

    https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Herramientashttps://es.wikipedia.org/wiki/compilador
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 11/34

    Elarchivoejecutable

    hola.exe

    Esteltimoeselquenosinteresa,puestoaqueeselcdigoejecutable,elprogramaens.Alejecutarloseproducirlasalidadeseadaenunaventanadeconsola.

    Salidaporpantalla

    SiejecutamosenentornoWindowselprogramadirectamentedesdeelnavegadordearchivos,otambindesdealgunosentornosdedesarrollo,loquesucederserqueapenasabiertalaventanadelaconsola,semostrarlacadenaesperadayluegodeterminadalafuncin,laconsolasecerrarsintenereltiemposuficientedevernuestromensajeenpantalla.

    Parapoderverlasalidaporpantallasernecesarioejecutarelprogramadesdelalneadecomandos,omodificarlaconfiguracindelentornodedesarrolloparaquemuestrelasalidaporpantallaalejecutarelprograma.

    Unaposiblesolucinesagregarunafuncinadicionalanuestro"hola.c":

    /*Inclusindearchivos*/#include#include

    /*Funcinprincipal*/intmain(intargc,char**argv){/*Impresinporpantallaysalidadelprograma*/printf("Holamundo\n");system("pause");return0;}

    Lasdoslneasagregadaspermitenqueutilicemoslabibliotecastdlib,queincluyelafuncinsystemyquemedianteestafuncinseejecuteelcomandopausedelsistema,queevitaqueelprogramasigahastaquesepresioneunatecla.

    Asesposiblevisualizarquelasalidadehola.csecompletperfectamente.

    GNU

    Sibienexistenotroscompiladores,lomsusualymssencilloparacompilarunprogramaenGNU/Linuxeselcompiladorgcc,yaqueeselqueseincluyeentodaslasdistribuciones.

    Decualquierforma,esposiblerealizarlacompilacindesdelneadecomandosodesdeelentornogrfico.

    Pararealizarladesdelneadecomandos,sernecesariocontarconunaterminal(xterm,konsole,gnometerminal,etc).Noesnecesariocontarconpermisosderootparacrearocompilarprogramas.Enesaterminalsernecesarioescribir

    gcchola.c

    Sinoexistenerroresenelcdigo,estecomandonoscrearunarchivoejecutable,queporomisinsellama"a.out",yquepodemosejecutardesdelalneadecomandosdelasiguienteforma:

    ./a.outHolamundo

    Esunabuenaideaespecificarelnombrequeelarchivoejecutabletendr,pasandocomoparmetroalcompiladorlaopcino,delasiguienteforma:

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 12/34

    gcchola.cohola

    Conlocual,elnombredelarchivocreadoserhola.EstearchivonotieneextensinyaqueeslaformausualdellamaralosarchivosejecutablesenlosentornosUNIXyGNU/Linux,sinembargofuncionaradelamismaformasisellamarahola.exe.

    Paraejecutarlo,haremoslosmismoqueenelcasoanterior:

    ./holaHolamundo

    Existenotrosparmetrosquepodemosespecificaralcompiladorenlalneadecomandos,dependiendodeltipodeprograma,yenfuncindelacomplejidaddelmismo.Porejemplo,podemosagregarlassiguientesopciones:

    gcchola.coholaWallpedantic

    LaopcinWallnosmostrartodoslosavisosqueproduzcaelcompilador,nosolamenteloserrores.Losavisosnosindicandndey/oporqupodrasurgiralgnerrorennuestroprograma.

    LaopcinpedanticnosaportamsinformacinsobreloserroresylosavisosmostradosporGCC.

    Diseccionandoel"HolaMundo"

    AcontinuacinveremosculeslaestructurabsicadeunprogramaenC,parapoderentenderquhacecadaunadelaslneasdenuestrosencilloprograma.

    Esprobablequeloprimeroquesaltealavistasealalnea:

    printf("Holamundo\n");

    EstaeslalneaquehaceaparecerlacadenaHolaMundoennuestrapantalla.NotamosqueenClasentenciaparaimprimiralgoporpantallaesprintf()y,adems,hayquecolocarparntesisalrededordeloquequeremosimprimirparautilizarla.

    EstosedebeaqueenC,printfesunafuncin,queimprimesuargumento(lacadenaHolaMundo\n)enlapantalla.Sedenominainvocarunafuncinalaaccindeutilizarlaparaquerealiceunaaccin.

    Podemosobservartambinquelacadenaaimprimirterminaconunaextraacombinacin:\n.Lacombinacin\nnorepresentaadoscaracteresindependientes,sinoquerepresentaunnicocarcternoimprimible:elsaltodelnea.Sinelsaltodelnea,elresultadoalejecutarelprogramasera:

    $./a.outHolaMundo$

    Esdecirquenohaysaltodelneaentrelacadenaimpresa,ylasiguienteentradadelalneaderdenes,quenoesloqueesperbamos.

    Loltimoanotarenlalneaesqueterminaconunpuntoycoma.EnC,todaslassentenciasterminanconunpuntoycoma.Alprincipiopuedeparecerobviodndeterminaunasentencia,peroyaveremosmsadelantequenoloestanto.

    Observemosahoralasiguientesentenciadelprograma:

    return0;

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 13/34

    Luegodeestasentencia,terminaelprograma.Enelcasodelainstruccinreturndentrodelafuncinmain,elresultadoesquesefinalizaelprograma,comunicndolealsistemaoperativoqueelvalorderetorno(uncdigonumricoqueelsistemautilizaparasabersielprogramahafuncionadobienohadadofallos)es0,esdecir,correcto.

    Lasdosltimassentenciasseencuentranencerradasentrellaves.Deestamanera,formanunbloque,esdecir,ungrupodesentenciasqueseejecutarnsiempredeformacorrelativa.

    Yquesesalneaqueprecede(enrealidad,quedanombre)albloque?

    intmain(intargc,char**argv)

    Puesesladefinicindeunafuncin,enestecasollamadamain.EnC(yengeneralentodosloslenguajesdeprogramacinestructurada)todosehaceabasedefunciones,comomainyprintf.

    Lafuncinmainesespecial,porqueesellaqueseinvocacuandoseejecutaelprograma.TodoslosprogramasenCcomienzansuejecucinalprincipiodelafuncinmain,ycuandostaacaba,elprogramatambin.

    Veamosconmsdetalleladefinicindelafuncin:

    intmain(intargc,char**argv){...}

    Elnombredelafuncinquevieneacontinuacin,entrellaves,esmain.Recibedosargumentos:intargcychar**argv(querepresentanalacantidaddeargumentosingresadosalejecutarelprogramayalosvaloresdeestosargumentosrespectivamente).[1]

    Lafuncindevuelvecomoresultadounnmeroentero,int(queesel0delainstruccinreturn).[2]

    Finalmente,yuntantoaparte(estseparadadelrestoporunalneaenblanco),tenemoslalnea:

    #include

    Queparecebastantedistintaalrestodelprograma,yque,adems,parecenotenersentido,puestoqueyahemosdefinidolafuncinmainquehacetodoeltrabajo.

    Efectivamente,esalneanoespartedelprograma,aunqueseaimprescindible.LalneaesunainstruccindelpreprocesadordeC,comonosloindicaelsmbolo#,yloquehaceesincluirenesepuntoelcontenidodeotrofichero,antes(deahelnombredepreprocesador)dequecomiencelacompilacin.Elficherostdio.heselquecontieneladefinicindelafuncinprintf(),queantesutilizamosperoquenoescribimos,yaqueformapartedelabibliotecaestndardeC.

    Comentarios

    Unavezescritouncdigo,tratardeentenderlounaomstardesoloconleerlopuedeserfrustrante:nohaymaneradesaber(sielprogramaesmedianamentecomplicado)quescadavariable,oquhacecadabloquedecdigo.Poresto,encualquierlenguajedeprogramacinsonimportantesloscomentarios.

    UncomentarioenCestodoloqueseencuentreentrelossmbolos/*y*/.Hayquetenerencuentaqueloscomentariosnosepuedenanidar:sidentrodeuncomentariohayun/*,seguirsiendoelprimer*/elquefinaliceelcomentario,noseesperaralsegundo.

    HayotrotipodecomentariosenC,procedentesdellenguajeC++,eincorporadasalestndardeCapartirdeC99://.Todoloqueestdespusdeestossignos,hastaelfinaldelalnea,seconsideraruncomentarioyelcompiladornolotomarencuenta.

    https://es.wikipedia.org/wiki/Biblioteca_est%C3%A1ndar_de_Chttps://es.wikipedia.org/wiki/Preprocesadorhttps://es.wikipedia.org/wiki/C%2B%2B
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 14/34

    Enelejemplopresentadopuedenversetreslneasconcomentarios,quedocumentansomeramentelasdistintasfuncionalidadesdelcdigo.Enlosprximoscaptulospodrnversemejoresusosdeloscomentariosdentrodelcdigo.

    Tambinpodradecirsequeesunaherramientabsicabasadaencompilador

    1. Enuncaptuloposteriorpodrverunejemplodelusodelosparmetrosquerecibemain.2. Esimportantesealarqueelestndardicequemaindeberdefinirsecomofuncinqueretornaunentero,odelo

    contrarioelresultadoquedaindefinido.

    TiposdedatosHistoria

    EnellenguajeCestandarizadocomoC89,existancuatrotiposdedatosbsicosqueson:losnmerosenteros,losnmerosreales,loscaracteres,ylospunteros.ApartirdelestndarC99seagregan:losvaloreslgicos(verdaderoofalso)ylosnmeroscomplejos.

    Estostiposdedatossonpartedellenguaje,yporelloselosconsideraprimitivos.Msadelanteveremosqueconelusodeestructurasyunionesesposiblecreartiposcompuestosdedatosapartirdeestostiposprimitivos.

    Enestecaptuloveremoslosenteros,losrealesyloscaracteres.Msadelantesevernotrostiposdedatosmscomplejos,comosonlosvectores,lascadenasdecaracteres,ylospunterosengeneral.

    Enteros

    LosenterossoneltipodedatomsprimitivoenC.Seusanpararepresentarnmerosenteros.Perosiempresepuedenencontrarotrasaplicacionesparalosnmerosenteros.Engeneralsepuedenusarpararepresentarcualquiervariablediscreta.

    Lostiposdedatosenterosson:short,int,longylonglong,cadaunorepresentandounnmeroenterodeuntamaoocapacidaddeterminado.Segnelcompiladorylaplataformadehardware,cadaunodeestostiposdedatopuedeocupardesde1bytehasta8bytesenmemoria(paramsdetallesbuscaenlareferencia).

    Adems,ellenguajeChaceladistincindesielenteroesconsigno(signed)osinsigno(unsigned).Encasodequenosedeclaresiesconsignoosinsigno,setomaconsigno.

    Algunosejemplosdedeclaracionesdeenteros:

    inta;unsignedinta;signedlonga;signedlonglonga=10000000;

    Todoslosnmerossonrepresentadosenmemoriamedianteunacadenadebits.Enelcasodelosnmerosconsigno,elbitmssignificativoeselqueseusapararepresentarelsigno.Larepresentacindelosnmerosnegativosserealizamedianteelcomplementoados,queesunatcnicaquepermiteoperarconlosnmerosnegativosdeformalgica.

    Amododeejemplo,larepresentacinenmemoriadelnmero8enunavariablede2bytes,entera,consigno,seralasiguiente:

    1111111111111000

    https://es.wikipedia.org/wiki/Tipo_de_dato_l%C3%B3gicohttps://es.wikipedia.org/wiki/Bit_m%C3%A1s_significativohttps://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Estructuras_y_Unioneshttps://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Referenciahttps://es.wikipedia.org/wiki/Tipo_primitivohttps://es.wikipedia.org/wiki/Complemento_a_dos
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 15/34

    Flotantes

    Sedenominaflotantesalostiposdedatosquerepresentanalosnmerosreales,yaqueutilizanunsistemaderepresentacinbasadoenlatcnicadecomaflotante,quepermiteoperarconnmerosrealesdediversasmagnitudes,medianteunnmerodecimalllamadomantisayunexponentequeindicaelordendemagnitud.

    EltipodedatoflotanteenlenguajeCslotienedostamaos:elfloatyeldouble,queson4bytesy8bytesrespectivamente.Selospuedeutilizartantopararepresentarnmerosdecimales,comopararepresentarnmerosenterosconunordendemagnitudmuygrande.

    Laformadedeclararunavariableflotanteesescribiendoenunalneaunodelostiposdedatosflotantesyacontinuacinelnombredelavariableytalvezalgnvalorqueselesquieradar.

    Algunosejemplos:

    floata;doublea=1e23;doublea=3.1416;floata=4e9;doublea=78;

    Hayquetenerencuentaqueaunquelosvaloresflotantessonmsconvenientesparaalgunasaplicaciones,haycasosenlosqueseprefierenlosenteros.Estosedebeaquelosnmerosflotantesnonecesariamentetienensoportedehardware,enparticularenlasplataformasintegradas.Unaalternativaqueseutilizaenestassituacionesesinterpretarlosenteroscomodecimalesdeformaque150seinterpretecomo1.5y2345como23.45.

    Paraelcasodelosflotantesde4bytes,seutiliza1bitparaelsigno,8bitsparaelexponentey23bitsparaelvalordelnmero.Elprocedimientoparaalmacenarunnmeroenunavariableflotanteeselsiguiente:

    1. Seconvierteabinariolaparteentera.2. Secolocaelsignoenelbitmssignificativodelamismamaneraqueenlosenteros(1paraely0parael+).3. Semuevelacoma(enlarepresentacinbinariadelaparteentera)hastaqueestaladerechadelprimerunoystese

    descarta(elunomssignificativo).Elvalordelexponenteserelnmerodeposicionesquesemovilacoma.Elexponenteusalarepresentacindeunenteroconcomplementoados.

    4. Seconvierteenbinariolapartedecimaldelnmero.Estousandoelpesodelosbits.elbitdecimalmssignificativovale1/2,elsiguientevale1/4,elotro1/8,elotro1/16yashastacompletarloquefaltaparalos23bitsdelvalor.

    5. Seconcatenatodoyeseeselvalorflotanterepresentadoenmemoria.

    Caracteres

    Loscaracteresserepresentanutilizandoeltipochar,quetieneslo1bytedetamao.Estetiposeutilizapararepresentarlos256caracteresdelatabladecaracteresdelsistema.Eltipocharestambinuntipoentero,yaquepuedetomarvaloresde0a255.Porlotantotambinpuedesersignedounsigned.

    Encuantoalaformadedeclararvariablesdetipochareslamismaformaqueconlosotrostipos.

    chara;chara='s';unsignedchara=48;

    Comopuedesver,selepuedeasignarunnmeroaunavariablechar,yaquesetratadeuntipoentero.Enmuchassituacionesseutilizaeltipocharparaalmacenarnmerospequeos,yaqueocupaenmemoriaslamenteunbyte.

    EsimportantenotarqueconlallegadadelacodificacinUTF8,loscaracteresdelosdiversosidiomaspuedenocupar1,2,3o4bytes,demodoqueeltipocharyanoalcanzaparalarepresentacindetodosloscaracteresposibles.Porello,elestndarC99introduceeltipowcharquepuedeocuparmsde1byte,segnseanecesarioparalacodificacinutilizadaporelsistema.

    https://es.wikipedia.org/wiki/Sistema_integradohttps://es.wikipedia.org/wiki/Orden_de_magnitudhttps://es.wikipedia.org/wiki/Mantisahttps://es.wikipedia.org/wiki/UTF-8https://es.wikipedia.org/wiki/Coma_flotante
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 16/34

    InteraccinconelusuarioEnestecaptuloveremosunpocomssobrecomointeractuarconelusuariodenuestrosprogramasdesdelaconsola,utilizandoprintf()comovimosenelprimerejemplo"Holamundo",ascomoscanf()paralalecturadelteclado.

    Imprimirporpantalla

    Comohemosvistohastaahoraenlosejemplos,hayunafuncinqueutilizamosparasacarporpantallatextosarbitrariosoelresultadodealgunaoperacin:lafuncinprintf().

    Simiramos(enladocumentacin)sudefinicin,nonosaclarardemasiado:

    intprintf(constchar*TEMPLATE,...)

    ...claroqueporalgotieneunaseccincompletadeladocumentacinparaellasola.

    Vemoslapocoapoco.Setratadeunafuncindelabibliotecaestndar,loquequieredecirqueparautilizarlatenemosqueincluirpreviamentesudefinicin.Laencontraremosen.

    Loprimeroquevemosenladefinicinesqueesunafuncindetipoint,loquequieredecirquedevuelveunentero.Eseenteroeselnmerodecaracteresimpresosenlapantalla,ounnmeronegativoencasodequeseproduzcaalgnerror.

    Losiguienteanotaressuprimerargumento:constchar*TEMPLATE.Setratadeunacadenadecaracteres(char*)quenosermodificadaporlafuncin(const),conloquepuedeserunaconstantedecadenaounavariablequecontengaunacadena,perosiempredebeacabarconelcarcternulo\0.

    Yluegovienenesosextraospuntossuspensivos.Esaelipsisnosindicaquecomoargumentosadicionalesdeprintf()podemosponerunaserieilimitadadeotrosargumentos,quesesuponequelafuncinsabrquhacerconellos.Yesoesjustamenteloquehacetanfabulosaytilaprintf().

    Comohemosvisto,elusomssimpledeprintf()esimprimirunacadenadetextosimpleycorriente.Comoyavimos:

    printf("HolaMundo\n");/*imprimelacadena*/

    Ytambinhemosvistoprintf()tambinpuede,conunargumentoextrayunasintaxisespecial,imprimirunnmeroenteroquehayamosalmacenadoenunavariable:

    charresultado;

    resultado=5+2;printf("Resultadodelasuma:%i\n",resultado);

    Aquelpuntodeinsercineslasecuencia%i.printf()siempretratalassecuenciasquecomiencenpor%comosecuenciasdecontrolqueledicenquedebeimprimiralgoqueleproporcionamosenlosotrosargumentos.As,podemosimprimirvariosenterosdistintosenlossitiosquequeramosdelacadena,insertandovariasdeestassecuencias%i:

    intnumero;

    numero=3;printf("Eldoblede%ies%iysucuadradoes%i\n",numero,numero*2,numero*numero);

    Lecturadedatosdelteclado

    https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Primer_programa_en_C
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 17/34

    Laentradadedatossepuedehacerdemuchasmanerasyentreellasestndesdeelusodedispositivosespecialeshastanuestrosimpleteclado.Laentradadedatosserefiereacualquierformadeinfluenciadelusuariosobrelosdatosqueposeeelsistema.

    Conelfindemostrarunaformadeentradasimpleparaelaprendizajevamosahablardelafuncinscanf()queseencuentradefinidaenyqueseusaparacapturardiferentestiposdedatos.

    Lafuncinscanf()

    scanf()esunadelasfuncionesmsusadasporlosprincipiantesparahacerentradadedatosenellenguajeC.Tieneunasintaxismuyparecidaaprintf:recibeunacadenaconelformatodelosdatosyluegoseponenlasvariablesenordenquecorrespondanaesetipodedatos.Esdecir,ascomoenprintfsepuedenmostrarporpantallalosdatosdevariasvariablesenunamismasentencia,enscanfsepuedencapturarvariosdatosenunasolasentencia.

    #includeintmain(){inta;printf("digaunvalorparaa:");scanf("%i",&a);printf("elvalores:%i\n",a);return0;}

    Porahoranonosinteresanlasdemssentencias,slolaquecontienescanf.Enelcdigosevelosiguiente:

    scanf("%i",&a);

    Seobservaquelafuncionprintfdejenpantallaunapeticinparaqueelusuariointrodujeraunvalor.Entonces,scanfrecibecomoargumentounacadenadelformatoenquesevanacapturarlosdatosylalistadevariablesquevanarecibirvaloresyquedebencoincidirconlosdelformato.

    Enestecasolacadenadeformato,"%i",especificaqueelusuarioingresarunnmeroentero.Luegosedesignaalavariableaparaconteneraesenmero.Elsmbolo(&)queprecedeaaesparaespecificarqueloqueseestenviandocomoargumentonoeselvalorqueposeelavariableasinoladireccindememoriaenqueseencuentra.Enestemomentoesonotienemucharelevancia,slohayquerecordarquesedebeusarelsmbolo&dentrodelscanf.Enelmomentoenquehablemosdepunterosveremosmsdetallesdeesto.

    Otroejemplodelusodescanf:

    #includeintmain(){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"especificaqueelusuarioingresarunnmero,seguidodeunacoma,yluegootronmero.Elprimer%isercapturadoporlavariableayelsegundoporb.

    ExpresionesVamosatratarahoradequeelordenadorhagaunpocodematemticasparanosotros.Porejemplo,querealiceunaspocassumas,restasmultiplicacionesydivisiones.

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 18/34

    #include

    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.outResultadodelasuma:7Resultadodelaresta:3Resultadodelamultiplicacin:10Resultadodeladivisin:2$

    Fijmonosenlalneadelprincipiodelafuncinmain:

    intresultado;

    Estalnealoquehaceesreservaruntrozodememoria,deltamaodeunint(normalmente4bytes),yasignarleelnombreresultado,parapoderdespusreferirnosal.Apartirdeestemomento,podemosconsiderarqueennuestroprogramaexisteunavariable,quenotienevalordefinido,peroalaquelepodremosdarvalorposteriormente.

    Laslneasconprintf()yalasconocemos,perohayalgoenellasquenohabamosvistoantes.Esos%iylapartederesultadosonnuevasparanosotros.

    Lafuncinprintf()noslosabeimprimircadenassimples,como"HolaMundo\n",sinotambinimprimirvariables.Paraello,enellugardelacadenadondequeremosqueaparezcaelvalordelavariable,introducimosloquesellamaunacadenadeconversindeprintf().Estascadenassiempreempiezanpor%,siendo%ilacadenaparaimprimirunentero,comoesennuestrocasointresultado.Finalmente,printf()debesaberquvalorescribir,poresoledamosotroargumento(uotros),usando,comoseparador,quecontienenlasvariablescuyosvaloresqueremosmostrar.

    Enelrestodelprogramahemosvistocmodecirlealordenadorqueejecuteunasuma,unaresta,unamultiplicacinyunadivisinentera,conlosoperadores+,,*y/.Esdenotarqueelresultadodeunaoperacincomoestasentrenmerosenterossersiempreotroentero,comosepuedeobservarenladivisin,enlaquenoobtenemosunbonitodecimal,sinounresultadoentero.Adems,hemosvistoqueelresultadodeesasoperaciones,quellamamosexpresiones,puedeserasignadoaunavariable:

    resultado=7;

    Esaasignacinsehacemedianteeloperadordeasignacin:=.Conl,yaconocemoscincooperadores.

    Pero,como=tambinesunoperador,cmosabeelordenadorquoperadordebeejecutarprimero?Ysiesunoperador,porqunodaunresultado?Nocreaunaexpresin?

    Operadores Precedencia

    */ Izq.aDer.

    + Izq.aDer.

    https://es.wikipedia.org/wiki/Variable_(programaci%C3%B3n)
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 19/34

    = Der.aIzq.

    Empezandoporlasltimaspreguntas,eloperadordeasignacinscreaunaexpresin,comolosoperadoresdesuma,resta,multiplicacinydivisin,yesaexpresintieneunresultado,queeselvalorqueobtieneelladoizquierdoalrealizarlaoperacin.Encuantoasaberqusedebeejecutarprimero,elordenadortieneunalistadeprecedencia,segnlacualsiempreejecutaprimerolasmultiplicacionesydivisiones,deizquierdaaderecha,acontinuacinlassumasyrestas,deizquierdaaderecha,yacontinuacinlasasignaciones,dederechaaizquierda.Paramsdetallesacercadelaprecedenciadelosoperadoresverelanexodelosoperadores.

    Encuantoaloscaracteresdepuntoycoma,notamosaququeunaexpresintambinpuedeserunasentenciaporsmisma,sinnecesidaddequehayaningunafuncin.Dehecho,unasentenciapuedenotenersiquieraunaexpresin.Lalnea:;esunasentenciaperfectamentevlida,lasentenciavaca,queseratilenpuntosdondeellenguajerequieraunasentenciaperonoseanecesariaparanuestroprograma.

    InstruccionesdecontrolComoyasehamencionado,Cesunejemplodeprogramacinestructurada.Enestetipodeprogramacin,esnecesariocontarconciertasestructurasquepermitancontrolarelflujodelprograma,esdecir,tomardecisionesyrepetiracciones.

    Laestructuracondicionalif...else

    Enlagranmayoradelosprogramassernecesariotomardecisionessobrequaccionesrealizar.Esasdecisionespuedendependerdelosdatosqueintroduzcaelusuario,desisehaproducidoalgnerrorodecualquierotracosa.

    Laestructuracondicionalif...elseeslaquenospermitetomaresetipodedecisiones.Traducidaliteralmentedelingls,selapodrallamarlaestructura"si...sino",esdecir,"sisecumplelacondicin,hazesto,ysino,hazestootro".

    Unejemplosencilloseraelsiguiente(nosetratadeunprogramacompleto,sinotanslounaporcindecdigo):

    if(edad

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 20/34

    Elbloquedelelseesopcional.Sinoseloencuentra,sloserealizarlaaccincorrespondientealbloqueif.

    Acontinuacin,unejemploconunafuncin,quedevuelveelmayordedosnmeros:

    intmayor(inta,intb){ if(b>a){ returnb; }//Noposeeespecificacindelaparte"else",yaquenoesnecesaria.returna;//Finalizalafuncinretornandoelvalorde"a".}

    Operadoresdecomparacin

    Elsmbolo>vistoenelltimoejemploesunoperador,queenestecasocomparadosnmerosenterosydevuelveverdaderosielprimeroesmayor,falsoencasocontrario.

    AcontinuacinunlistadodelosposiblesoperadoresdecomparacinenCysusignificado.

    OperadoresdeComparacinOperador Significado

    < estrictamentemenorque

    > estrictamentemayorque

    = mayoroigualque

    == iguala

    != distintode

    TeniendoencuentaqueenCsetomacomofalsoelvalor0,ycomoverdaderocualquierotrovalor,unaprcticacomnesexpresarcondicionessinutilizarningnoperador:

    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.Permitenoperarconexpresioneslgicasparagenerarexpresionesmscomplejas.

    Porejemplo:determinarsiunaoesbisiestoono.Losaossonbisiestossisondivisiblespor4,peronosisondivisiblespor100,amenosquetambinseandivisiblespor400.

    if((!(a%4)&&(a%100))||!(a%400)){ printf("esunaobisiesto.\n"); }else{ printf("noesunaobisiesto.\n"); }

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 21/34

    Enrealidad,teniendoencuentalaprioridaddelosoperadoresutilizados,podemossimplificarlaexpresinanteriordelsiguientemodo:

    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.Cuandounnmeroesdivisibleporotro,elrestodesudivisinenterasercero.Siendoqueceroesequivalenteafalso,ycualquiervalordistintodeceroesequivalenteaverdadero,podemosusareloperador%paraverificarsielnmeroesmltiplode4,de100ode400.

    Evaluacindecortocircuito

    LaevaluacinencortocircuitoesunacaractersticadellenguajeCqueseutilizaparaoptimizarlaejecucindeprogramas.Consisteenqueelprogramapuedeverificarsiunaexpresinesverdaderaofalsaantesdehaberevaluadotodacondicin.

    Porejemplo,sisetieneunacondicincomolasiguiente:

    if((a>2)||(b2.Enelcasoenqueseaverdadero,nocontinuarconlasiguientecondicin,yaqueelresultadoserdecualquiermodoverdadero.

    Delamismaforma,silacondicinfuera:

    if((a>2)&&(b2,noseevaluarlasiguientecondicin,yaqueelresultadoserfalsodetodosmodos.

    Estacaractersticanotienedemasiadaimportanciaalcomenzaraprogramar,perofacilitarciertasoperacionesyoptimizacionesenprogramasavanzados.

    Laestructuracondicionalabiertaycerradaswitch...case

    Laestructuracondicionalswitch...caseseutilizacuandoqueremosevitarnoslasllamadasescalerasdedecisiones.Laestructuraifnospuedeproporcionar,nicamente,dosresultados,unoparaverdaderoyotroparafalso.Unaestructuraswitch...case,porsuparte,nospermiteelegirentremuchasopciones.Ejemplo:

    https://es.wikipedia.org/wiki/Resto
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 22/34

    #include#include

    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,resultandounenormebloquemuydifcildeleer.Enlamayoradeloscasos,adems,lasentenciaswitchproporcionaunagananciaenvelocidaddelcdigo,puespermitealcompiladortrabajarenbaseaquesetratadeunadecisinmltipleparaunanicavariable,cosaqueconsentenciasifelcompiladornotieneporqudetectar.

    Comovemos,paracadavalordelavariableseejecutaunbloquedesentenciasdistinto,enelquenonecesitamosllaves.Hayuncasoespecial,default,queseejecutasiningnotrocorresponde,yquenoesnecesarioponer.Es,entodo,equivalentealbloqueelsedeunasentenciaif.

    Lassentenciasbreaksonmuyimportantes,yaqueelcomportamientonormaldeunbloqueswitchesejecutarlotododesdelaetiquetacasequecorrespondahastaelfinal.Porello,sinoqueremosquesenosejecutemsdeunbloque,pondremossentenciasbreakalfinaldecadabloqueexceptoelltimo.

    Esdecir,lasetiquetascasesonpuntosdeentradadelaejecucin,ynoimplicanquealacabarseelbloquecaselaejecucinsaltealfinaldelbloqueswitch.Lasetiquetascasesiguientesalaquehemosutilizadoparaentrarson,sencillamente,ignoradas.

    Alaausenciadesentenciasbreakselellama,enocasiones,"dejarcaerlacascadaswitch".

    Elbuclewhile

    Elbuclewhilesirveparaejecutarcdigoreiteradasveces.

    while(/*condicion*/){ /*Cdigo*/}

    Lacondicindebedeserunaexpresinlgica,similaraladelasentenciaif.Primeroseevalalacondicin.Sielresultadoesverdadero,seejecutaelbloquedecdigo.Luegosevuelveaevaluarlacondicin,yencasodedarverdaderosevuelveaejecutarelbloque.Elbuclesecortacuandolacondicindafalso.

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 23/34

    Ejemplo:imprimirlosnmerosde0a99:

    inti=0;while(i

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 24/34

    Laverdadesqueesteejemplopuederesultarunpocoabsurdo,peroesbastanteintuitivo.Elcdigodelbucleasignaunvaloraleatorioalavariabledefinidaanteriormente,ymientrasesavariablenotengaelvalor25,elbuclesigueejecutndose.

    Lasentenciagoto

    Lasentenciagotosirveparaindicaralprogramaquecontinueejecutndosedesdelalneadecdigoindicada.Susintaxisesmsomenosas:

    /*Cdigo*/ETIQUETA:/*Cdigo*/gotoETIQUETA;/*Cdigo*/

    As,cuandoseejecutelasentenciagoto,elprograma"saltar"ycontinuarsuejecucinapartirdelaetiquetamarcada.

    Comosepuedeobservarsepuedeusarparacrearunbucle,oparairaunapartedelcdigouotrasisecombinaconunasentenciaif...else.Peroporlogeneralpuedeobtenerseelmismoefectoutilizandolosbuclesanteriormentevistos.

    Poreso,lasentenciagotoespocoaceptadaporlacomunidaddeprogramadores,puespuedeprovocarquesehaganprogramasunpoco"sucios"yconfusos.Sloenocasionesmuyexcepcionalesserrecomendadoelusodelgotoalcreariteracionesmuycomplejas.Sinembargo,conelpasardelosaosestecomandoyahaquedadoprcticamentedescartadodellenguajedelosprogramadores.

    UsodeFuncionesFunciones

    ComovimosanteriormenteCtienecomobloquebsicolafuncinmain(),tambinhemosvistolasentenciaprintf()queesotrafuncin,ydeigualformahaymuchasmsfuncionespredefinidas,peronosotrosmismostambinpodemosdefinirnuestraspropiasfunciones.Dehecho,esfundamentalhacerlo.

    Podemosdefinirunafuncincualquieradelamismamaneraenquedefinimoslafuncinmain().Bastaconponersutipo,sunombre,susargumentosentreparntesisyluego,entrellaves,sucdigo:

    /*Inclusindearchivos*/#include

    voidholamundo(void)/*Funcindondeseejecutalalgicadelprograma*/{ printf("HolaMundo\n");/*imprimelacadena*/ return;/*saledelafuncin*/}intmain(void)/*Funcinprincipaldelprograma*/{ holamundo();/*llamadaalafuncinholamundo*/ return0;/*saledelprogramaconcdigo0(correcto)*/}

    Estecdigoesentodoequivalenteal"HolaMundo"original,sloquenosmuestracmoescribirycmoutilizarunafuncin.Yademsnosmuestraunprincipiodebuenaprogramacin:meterlassentenciasque"haceneltrabajo"enotrasfuncionesespecficasparasacarlasdemain(),dejandoenstatanslounguingeneraldeloquehaceelprograma,nolasrdenesespecficas.Deestamanerasefacilitalacomprensindelprograma,yportantoelfuturotrabajodemodificarlo.

    https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Primer_programa_en_C#Diseccionando_el_.22Hola_Mundo.22
  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 25/34

    Lasentenciareturn

    Lasentenciareturnpuedeutilizarsedentrodeunafuncinparaterminarsuejecucin.

    Enelejemploanterior,lafuncinholamundofuedeclaradaconvalorderetornodetipovoid(esdecir,valorderetornonulo).Enesecaso,lasentenciareturnnollevaningnparmetroadicional,yaquelafuncinnodebedevolverningnvaloralafuncinquelallama.

    Encambio,lafuncinmaintieneunvalorderetornodetipoint,porloquereturndebeirseguidodeunvalorentero(0enelejemplo).Elvalor0seutilizaparaindicarqueelprogramahallegadoaunpuntoenelquetodosehadesarrolladocorrectamenteyseutilizacualquierotrovalorparaindicarquehahabidoalgntipodeerror.

    Lainstruccinreturnnoesunafuncin,setratadeunasentenciaqueloquehaceesretornarcomovalordelafuncinelvalorqueseleproporcionacomoargumento.

    Argumentos

    Lasfuncionestambinpuedenrecibirargumentosoparmetros,paramodificarsucomportamiento.Porejemplo,ladefinicindeunafuncinparasumardosnmerosseradelasiguientemanera:

    Declaracinydefinicin

    Enelejemploanteriorpodemosnotarquelafuncinsumarfiguraenelcdigoantesquemain.Qupasarasilasescribiramosendistintoorden?

    #include

    intmain(void){ intsuma=sumar(5,3);/*ERROR,sumarnohasidodeclaradaan*/ printf("Lasumaes:%d",suma); return0;}

    intsumar(intnumero1,intnumero2){ returnnumero1+numero2;}

    Enestecasoelprogramaeserrneoynocompila,yaqueenlalneadondesellamaalafuncinsumar,elcompiladorannoconoceningunafuncinconesenombre,yculessonsusargumentosyvalorderetorno.

    Unaposiblesolucinesdeclararelprototipodelafuncinalprincipio,parainformaralcompiladorqueexiste,yluegodefinirelcuerpodelamismaencualquierlugardelprograma:

    #include

    /*Declaracin*/intsumar(intnumero1,intnumero2);

    intmain(void){ intsuma=sumar(5,3); printf("Lasumaes:%d",suma); return0;}

    /*Definicin*/intsumar(intnumero1,intnumero2){ returnnumero1+numero2;}

    PasodeParmetros

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 26/34

    Lasfuncionespuedenrecibirdatoscomolohemosobservado,peroexistendosformasdeenviarlosdatoshaciaunafuncinporvaloryporreferencia,lascualesmodificanendiferenteformaelcomportamientodeelprograma.

    PorValor

    Elpasoporvalorenvaunacopiadelosparmetrosalafuncinporlotantoloscambiosquesehaganenellanosontomadosencuentadentrodelafuncinmain().Ejemplo:

    /**por_valor.c**JulioCsarBrizuela2009**paraelwikilibro"ProgramacinenC"*bajolicenciaFDL,adaptadodelDominioPblico*/

    #include

    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,porlotantoloscambiosquehagalafuncinsiafectanelvalordelavariable.Ejemplo:

    /**por_referencia.c**JulioCsarBrizuela2009**paraelwikilibro"ProgramacinenC"*bajolicenciaFDL,adaptadodelDominioPblico*/

    #include

    voidsumar_referencia(int*numero);/*prototipodelafuncin*/

    intmain(void){ intnumero=57;/*definimosnumeroconvalorde57*/

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 27/34

    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,estostiposdedatosdeclaradosdentrodeunafuncinsolosonaccesiblesdentrodeestamismafuncinyselesconocencomovariableslocales,aspuespodemosdefinirlosmismosnombresdevariablesendiferentesfunciones,yaqueestasvariablessolosonaccesiblesdentrodeesasfunciones.Ejemplo:

    /**locales.c**JulioCsarBrizuela2009**paraelwikilibro"ProgramacinenC"*bajolicenciaFDL,adaptadodelDominioPblico*/

    #include

    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;}

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 28/34

    Enestecasolavariabledato,estadefinidadentrodecadaunadelasfuncionesysontotalmentedistintaunadeotraynosepuedeutilizarfueradeesta,aspuesnum2nopuedeserutilizadaporlafuncion1()ynum1tampocopuedeserutilizadaporfuncion2().

    Existenpuesvariablesquesedefinenfueradelafuncinprincipalmain()yfueradecualquierotrafuncincreadapornosotros,estasvariablesselesconoceconelnombredeVariablesGlobalesyaquesepuedenutilizardentrodemain()ydentrodecualquierfuncincreadapornosotros.Ejemplo:

    /**global.c**JulioCsarBrizuela2009**paraelwikilibro"ProgramacinenC"*bajolicenciaFDL,adaptadodelDominioPblico*/

    #include

    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.Larecursinindirectaimplicautilizarmsdeunafuncin.

    Sepuedeconsiderarlarecursividadcomounaalternativaalaiteracin.Larecursinpermiteespecificarsolucionesnaturales,sencillas,queseran,encasocontrario,difcilesderesolver.Todafuncinrecursivadebecontemplaruncasobaseocondicindesalida,paraterminar,olarecursividadnopodrterminarnunca.

    Unafuncinrecursivapodradefinirseas:

    funcion_recursiva(/*parmetrosrecibidosporlafuncin*/){ /*Cdigo*/ funcion_recursiva();/*llamadaalafuncinmisma*/ /*Cdigo*/}

    Unodelosejemplosmsrepresentativosenlarecursividadeselfactorialdeunnumero(n!):

    ladefinicinderecursividaddelfactoriales:

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 29/34

    Enestadefinicin,n=0,esnuestrocasobase,queledafinalarecursividad.

    Entoncesnuestroprogramaquecalculaelfactoriales:

    /**factorial.c**JulioCsarBrizuela2009**paraelwikilibro"ProgramacinenC"*bajolicenciaFDL,adaptadodelDominioPblico*/

    #include

    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,dondeaybsonnmerosenterospositivosseria:

    Soluciniterativa:

    Solucinrecursiva:

    Aspues es:

    Podemosverquelamultiplicacindedosnmerosa,bsepuedetransformarenotroproblemamspequeomultiplicarapor(b1),elcasobaseseproducecuandob=0yelproductoes0.Ejemplo:

    /**producto.c**JulioCsarBrizuela2009**paraelwikilibro"ProgramacinenC"*bajolicenciaFDL,adaptadodelDominioPblico*/

    #include

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 30/34

    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.Elsiguienteprogramavisualizaelalfabetoutilizandorecursinindirectaomutua:

    /**elalfabeto.c**JulioCsarBrizuela2009**paraelwikilibro"ProgramacinenC"*bajolicenciaFDL,adaptadodelDominioPblico*/

    #include

    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:laiteracinutilizaunaestructurarepetitivaylarecursinunaestructuradeseleccin.Laiteracinutilizaexplcitamenteunaestructurarepetitivamientrasquelarecursinconsiguelarepeticinmediantellamadasrepetitivasafunciones.

    Laiteracinterminasilacondicindelbuclenosecumple,mientrasquelarecursinterminacuandosereconoceuncasobase.

    Larecursinpuedepresentardesventajasantelaiteracinyaqueseinvocarepetidasvecesalmecanismodellamadadefuncionesysenecesitauntiempomayorpararealizarcadallamada.

    Laraznporlacualsepuedeelegiruoptarporusarrecursividadesqueexistenmuchosproblemascomplejosqueposeennaturalezarecursivay,enconsecuencia,sonmasfcilesdeimplementar.

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 31/34

    EjemploIterativo

    /**iterativo.c**JulioCsarBrizuela2009**paraelwikilibro"ProgramacinenC"*bajolicenciaFDL,adaptadodelDominioPblico*/

    #include

    longfactorial(intnumero);

    intmain(intargc,char**argv){ intcontador=0;

    /*calculaelfactorialde0a10*/ for(contador=0;contador=1;i) resultado*=i;

    returnresultado;}

    EjemploRecursivo

    /**recursivo.c**JulioCsarBrizuela2009**paraelwikilibro"ProgramacinenC"*bajolicenciaFDL,adaptadodelDominioPblico*/

    #include

    longfactorial(intnumero);

    intmain(intargc,char**argv){ intcontador=0;

    /*calculaelfactorialde0a10*/ for(contador=0;contador

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 32/34

    VectoresLosvectoressonunaformadealmacenardatosquepermitencontenerunaseriedevaloresdelmismotipo,cadaunodelosvalorescontenidostieneunaposicinasociadaqueseusarparaaccederlos.Estposicinondicesersiempreunnmeroenteropositivo.

    EnClacantidaddeelementosquepodrcontenerunvectoresfijo,yenprincipiosedefinecuandosedeclaraelvector.Losvectoressepuedendeclarardelasiguienteforma:

    tipo_elementonombre[largo];

    Estodeclaralavariablenombrecomounvectordetipo_elementosquepodrcontenerlargocantidaddeelementos,ycadaunodeestoselementopodrcontenerunvalordetipotipo_elemento.

    Porejemplo:

    doublevalores[128];

    Enesteejemplodeclaramosunvectorde128elementosdeltipodouble,losndicesdeloselementosiranentre0(paraelprimerelementoy127paraelltimo).

    Delamismaformaqueconlasotrasdeclaracionesdevariablesquehemosvistoselepuedeasignarunvaloriniciaraloselementos.

    Otambinsepuedendeclarar:

    tipo_elementonombre[largo]={valor_0,valor_1,valor_2};

    Encasoestamosasignadolevaloresalosprimeros3elementosdelvectornombre.Notarquelargodebesermayoroigualalacantidaddevaloresqueleestamosasignandoalvector,enelcasodeserlamismacantidadnoaportainformacin,porloqueellenguajenospermiteescribir:

    tipo_elementonombre[]={valor_0,valor_1,valor_2};

    Quedeclararnombrecomoelvectordelargo3.

    Paraaccederaunelementoaccederemosatravsdesuposicin.Esdecir:

    tipo_elementoelemento; ... elemento=nombre[2];

    Asumiendoquetenemoselvectoranteriordefinidoestaramosguardandovalor_2enelemento.

    Veamosalgunosejemplos:

    /**Ejemplo:Elproductoescalardedosvectores*/#include

    doubleproducto_escalar(doublev1[],doublev2[],intd);

    intmain(){ constintlargo=3; doublevector_1[]={5,1,0};

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 33/34

    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

  • 15/7/2015 ProgramacinenC/TextocompletoWikilibros

    https://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&printable=yes 34/34

    Delamismaformaquevenimosusandovectoresdetiposbsicos,podemostenervectoresdevectores,estossedeclarandelasiguienteforma:

    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]);//Imprime4printf("tabla[2][0]:%i\n",tabla[2][0]);//Imprime9...

    Enesteejemplotablaesunvectordelongitud3,cuyoselementossonvectoresdelongitud4deelementosdetipoint.

    Enresumen,suponiendoquev[n]esunvectordecualquiertipodedatoconncantidaddeposiciones,alvectorvseleaplicanlassiguientesreglas:

    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.0puedenaplicarsetrminosadicionales.VaseTrminosdeusoparamsdetalles.

    https://es.wikibooks.org/wiki/Categor%C3%ADa:Programaci%C3%B3n_en_Chttps://es.wikibooks.org/w/index.php?title=Programaci%C3%B3n_en_C/Texto_completo&oldid=171299https://es.wikibooks.org/wiki/Especial:Categor%C3%ADashttps://es.wikibooks.org/wiki/Categor%C3%ADa:Programaci%C3%B3nhttps://wikimediafoundation.org/wiki/Terms_of_Use/eshttps://creativecommons.org/licenses/by-sa/3.0/deed.es