programación en c
Post on 09-Sep-2015
224 Views
Preview:
DESCRIPTION
TRANSCRIPT
-
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
top related