Documentos de Académico
Documentos de Profesional
Documentos de Cultura
GUANo.5
ANSIC: PEQUEOPEROROBUSTO
Profesores:Ing.WalterZelayayCarlosPocasangre Instructores:DanielFloresyRalAlvarenga
GuaNo.5
UESCICLOI2011
1/14
Introduccin.
EllenguajeCesunodelosmsrpidosypotentesquehayhoyenda.Algunosdicenqueestdesfasadoyque elfuturoesJava.Nosesitendrfuturoperoestclaroquepresentesitiene.Nohaymsquedecirqueel sistemaoperativoLinuxestdesarrolladoenCensuprcticatotalidad.Asquecreoquenoslonoperdemos nada aprendindolo sino que ganamos mucho. Para empezar nos servir como base para aprender C++ e introducirnosenelmundodelaprogramacinWindows.SioptamosporLinuxexisteunabibliotecallamada gtk(olibrera,comoprefieras)quepermitedesarrollasaplicacionesestiloWindowsconC. NodebemosconfundirCconC++,quenosonlomismo.SepodradecirqueC++esunaextensindeC.Para empezarenC++convienetenerunaslidabasedeC.
Objetivos.
ConoceralgunosdetallesdelosorgenesdeCascomosuscaractersticasmasnotablesquelohaceuno deloslenguajesmspotentesyeficiente. Escribiralgunospequeosprogramasquepermitanevaluarloscomandosydirectivasnecesariasparala correctacompilacinyejecucindecdigos.
Referenciaterica. Caractersticasdellenguaje
ElCseencuentraenlajerarquadelenguajesenunnivelintermedioentrePascalyelEnsamblador.Pretende serunlenguajedealtonivelconlaversatilidaddelbajonivel. SedisejuntoconelsistemaoperativoUNIXyestmuyorientadoatrabajarensuentorno.Ensudesarrollo sesiguieronunaseriedelneasgeneralestalescomo: Elcompiladordebeserlomspequeoyeficienteposible.Pocaspalabrasreservadas,estoes,unconjunto reducidodesentencias.Noexisteanidamientodeprocedimientos. Laentrada/salidanoseconsiderapartedellenguajeens,sinoquesesuministraatravsdefuncionesde librera.Lamismapolticasesigueconcualquierotrotipocomplejodeinstrucciones. Paraescribirunprogramasedebepoderescribirpocotexto.Paralograrestosereduceelnmerodepalabras claves. Con ello se lleg a un compilador con un poderoso juego de instrucciones, que permite aumentar la productividad/dadelosprogramadores. A pesar deello el Ces un lenguajerpido de aprender, que deriva en compiladores sencillos de disear, robustos,yquegeneranobjetospequeosyeficientes.
GuaNo.5
UESCICLOI2011
2/14
En la siguiente tabla se muestra la sintaxis de algunas expresiones algebraicas, por supuesto que de igual importanciasonlasoperacioneslgicas,deasignacin,etc.,delascualestambindebemosconocersusintaxis.
Operador aritmtico + * / %
x oxy y
rmods
Nosedebeolvidarqueexisteunordendeprioridadessobrelasoperacionesaritmticas.Lasiguientetablalo muestra.
Operador(es) * / % +
Orden de evaluacin (procedencia) Se evalan primero. Si hay muchas, se evalan de izquierda a derecha
GuaNo.5
UESCICLOI2011
3/14
AntecedentesHistricosdelC
EllenguajeCfueinventadoeimplementadoporprimeravezen1970enAT&TporDennisRitchieenunDEC PDP11usandoUnixcomoSistemaOperativo.Ceselresultadodeunprocesodedesarrollocomenzandocon unlenguajeanteriormentedenominadoBCPL,queaunhayquienlousaprincipalmenteenEuropa. PorquelnombredeC?PorlainfluenciaquetuvodellenguajeB,BCPLfuedesarrolladoporMartinRichards einfluenciadoporBinventadoenBellLabs.porKenThompson.Enlosaos70sellenguajeBllevoal desarrollodeC. LaversinoriginaldeCfuepopularizadaporellibroclsico"ElLenguajedeProgramacinC"porBrian KernighanyDennisRitchie.DurantemuchosaoselEstndardeCfuerealmentelaversinproporcionadacon laversin5delSistemaOperativoUnix.ConlapopularidaddelasMicrocomputadorassecrearonmuchas implementacionesdeC,peroenrealidad,comonoexistaningnestndaraparecieronmuchasdiscrepancias. ParaRemediarlasituacin,elInstitutodeEstndaresAmericano(ANSI)estableciuncomitaprincipiosdel veranode1983paracrearelestndarquedefinieradeunavezportodasallenguajeC.Ladefinicinresultante, elestndarANSIo"ANSIC"queseesperabafueraaprobadaafinesde1988. Lamayoradelascaractersticasdelestndaryaseencuentransoportadasporcompiladoresmodernos.Unode lospropsitosdelestndarfueasegurarquelamayoradelosprogramasexistentespudiesenpermanecervalidos o, al menos, que las computadoras pudieran producir mensajes de advertencia acerca de nuevos comportamientos. UnasegundacontribucinsignificativadelestndaresladefinicindeunabibliotecaqueacompaeaC,lacual especificafuncionesparateneraccesoalSistemaOperativo(porejemploleerarchivos,escribirenellosetc.) E/S con formato, asignacin de memoria, manipulacin de cadenas y otras actividades semejantes, una coleccindeheadersestndarproporcionanunaccesouniformealasdeclaracionesdefuncionesytiposde datos. Lamayorpartedelasbibliotecasestaestrechamentemodeladaconbaseenlabibliotecaestndardelsistema Unix.BCPLyBsonlenguajes"carentesdetipos".Encontraste,Cproporcionaunavariedaddetiposdedatos. Los tipos de datos fundamentales son caracteres, enteros y nmeros de punto flotante de varios tamaos. Adems existe una jerarqua de tipo de datos derivados, creados con apuntadores, arreglos, estructuras y uniones.Lasexpresionesseformanapartirdeoperadoresyoperandos,cualquierexpresin,incluyendouna asignacinounallamadaafuncin,puedeserunaproposicin.Losapuntadoresproporcionanunaaritmticade direccionesindependientedelamaquina. EllenguajeCproporcionalasconstruccionesfundamentalesdecontroldeflujoqueserequierenenprogramas bienestructurados:Agrupacindeproposiciones,tomadedecisiones(ifelse),seleccindeuncasoentreun conjuntodeellos(switch),iteracinconlacondicindeparoenlapartesuperior(while,for)oenlaparte inferior(do)yterminacinprematuradeciclos(break). DentrodeloscambiosdeC,hayunoderelevancia,enNewJerseyen1980,BjarneStroustropdesarrolloenBell Labs.aC++ollamadotambin"Cconclases",porloqueen1983secambioelnombreporeldeC++.Desde entonceshaexperimentado2revisionesdeimportancia,unaen1985yotraen1989.
GuaNo.5
UESCICLOI2011
4/14
ElpropsitodeC++esextenderaCparaproporcionarocultamientodeinformacinyunestilodeprogramacin quehaganfasisenlasclasesdeobjetos. LacompatibilidadconC,laeficienciaylaverificacinestrictaentiempodecompilacinfueronlasmetas principalesparaeldiseodeC++. LacompatibilidadconCpermitequeelcdigofuenteexistenteenCcontineutilizndose.Lamayoradelas implementacionesdeC++sonincluso"compatiblesenligado"conC,locualsignificaqueuncdigoenC++ compiladoporseparadopuedeligarseconacervosenCyaexistentes,sinnecesidadesdecompilardenuevolos acervos. Yasedestacolaeficiencia,porlacualnodebedehaberningnproblemaalusarC++enlugardeC. LasimilitudentreCyC++essinembargoengaosa,debidoaqueC++requiereunmtododeprogramacin nuevo,unnuevoparadigmallamado"OrientadoaObjetos"quedanuevosbeneficiosconelusodelasclasesy losobjetos. Stroustrup[1986]advierte:"MientrasmasseconoceaC,esmasdifcilevitarescribirenC++conestiloC,y perderahalgunosbeneficiospotencialesdeC++". Como podr comprobar, una de las razones que motivaron al desarrollo de C++ fue la de permitirle al programadormanejarprogramasdeunacomplejidadcadavezmascreciente. EsunhechoqueC++esun superconjunto deC;porloquelamayoradelosprogramasdeCsontambin implcitamenteprogramasdeC++,sinembargo,hayunacuantasdiferenciasmnimasentreANSICyC++que impidenquepocosprogramasdeCsepuedancompilarmedianteuncompiladorC*.cparaC++*.cpp.
Creandoprogramas
Comoencualquierotroentorno,crearunprogramabajoLINUXrequiereunaseriedepasosqueprobablemente seanyadesobraconocidosporelalumno:
Creacinyedicindelprogramaocdigofuente sobreunarchivodetexto,empleandoparaellouna herramientadenominadaeditor.EncasodeprogramarenlenguajeC,elconvenioesquedichoarchivo tengaextensin.c. Compilacin del cdigo fuente mediante otra herramienta denominada compilador, generndose un archivoobjeto,queenLINUXsueletenerextensin.o.Aveces,enlugardegenerarseelarchivo objeto directamente se genera un archivo intermedio en ensamblador (en UNIX tpicamente con extensin.s)queacontinuacinesnecesarioensamblarconunensambladorparaobtenerelarchivo objeto.Adems,enCexisteunaetapapreviaalacompilacinenlaqueelarchivofuentepasaporotra herramientadenominadapreprocesador. Enlazadodelarchivoobjetoconotrosarchivosobjetonecesarios,ascomoconlasbibliotecasquesea necesario para as obtener el archivo de programa ejecutable. Esta labor es llevada a cabo por un programadenominadoenlazador.
UESCICLOI2011 5/14
GuaNo.5
Finalmenteelprogramapuedeejecutarsetalcualoencasodesernecesariopuedeserdepuradoconuna herramienta denominada depurador o debugger. Si se detectan problemas, ser necesario editar el programafuenteycorregirlosfallos,reinicindoseelciclodedesarrollohastaobtenerunprogramasin errores.
Elprocesoanteriorquedailustradoenelsiguientediagrama:
EnunsistemaLinuxcomoelempleadoenellaboratorio,lasherramientasclsicasencargadasdecadaetapason lassiguientes:
Editor:existegranvariedaddeellos,siendolosmspopularesemacs,kwriteyvi.Enellaboratoriose recomiendaelusodeleditorkwrite. Preprocesador,compilador,ensambladoryenlazador:estasherramientaspuedenencontrarsedeforma individual,peroenunsistemaLinuxtpicamenteencontramoslaherramientagcc(elcompiladordeC de la y arquitectura de computadores, C++ de GNU, gcc), que se encarga de llamarlas segn se necesiten. Encualquier caso, yaunque por logeneral no las utilizaremos de forma individual, las herramientasson:
Depurador:eldepuradorporexcelenciaenelentornoLinux(yenUNIXengeneral)esgdb.
GuaNo.5
UESCICLOI2011
6/14
Edicindelarchivofuente
Sinosvalemosdeleditorgedit,laformadeeditarelprogramaser: user@host>>geditprograma.c EleditorviesmuchomspotenteyrpidoqueloseditorestpicosdeMSDOSoWindows,comoelBlocde Notasoeledit,ascomodeotroseditoresdeentornodeventanas,comogedit.Sinembargo,elusodevial principiopuedeserunpocofrustrante,porloquesielalumnonoconoceelmanejodeestaherramientaes recomendableseguireltutorialenlosapndicesdelaprctica. Unaopcinmuyrecomendadaesaadirkate(ykonsole,enunentornognome),conestopuedetener unavisualizacinmuyampliaparaprogramadores,puesahseincluyetantoeleditordetextocomouna ventana de la terminal para compilar, enlazar y generar el archivo ejecutable del programa. El inconvenienteeslagrancantidadderecursosdememoriaqueconsumeestaaplicacin.
terminal
GuaNo.5
UESCICLOI2011
7/14
Compilacinyenlazado
Elprogramagcceselencargadodecompilar,enlazarygenerarelarchivoejecutableapartirdelarchivofuente. Laformamssencilladeinvocarloes: user@host>>gccprograma.c Estaordenpreprocesa,compila,ensamblayenlaza,generandoelarchivodesalidaejecutablea.out.Tpicamente noqueremosqueestoseaas,porloqueemplearemoslaopcin o paraestablecerelnombredelarchivo generado: user@host>>gccprograma.coprograma Paraejecutarelprogramaesnecesarioinvocarlodelaformasiguiente: user@host>>./programa Esnecesario elempleodel ./ antesdelnombredeprogramaparaindicarlealintrpretede rdenesqueel programaresideeneldirectorioactualdetrabajo(.),yaqueencasodenoespecificarlo,slosebuscarael programaenaquellosdirectoriosdelsistemaespecificadosenlavariabledeentornoPATH. user@host>>echo%PATH /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games Sinembargo,elprogramagcc esmuyflexibleysoportaungrancantidaddeopcionesquelepermiten,por ejemplo,detenersetrasundeterminadopasodelproceso(porejemplo,delacompilacin)oaceptarvarios archivosdeentradainclusodediferentestipos(fuente,objetooenensamblador),siendocapazdeprocesarcada unodeellosdelamaneraadecuadaparagenerarelarchivodesalidaqueselepide. Porejemplo,lasiguienteordencompilaelarchivo programa.c yelobjetoresultanteloenlazaconelobjeto funciones.o,dandocomoresultadoelprogramadenombreprograma: user@host>>gccprograma.cfunciones.ooprograma Lasiguienteordencompilalosarchivosfuenteindicados,generandolosarchivosobjetodecadaunodeellos peronocontinaconelenlazadoygeneracindelejecutablefinal: user@host>>gcccprograma.cfunciones.c
GuaNo.5
UESCICLOI2011
8/14
Acontinuacinsemuestraunresumendelasopcionesmsfrecuentesconlasquesesueleinvocargcc: E S c onombre g(s) Wall pedantic On Dmacro[=valor] Idirectorio Ldirectorio lbiblioteca static Parartraselpreprocesado. Parartraselcompilado(noensamblar) Pararantesdeenlazar Especificarelnombredelarchivodesalida Incluir(eliminar)informacindedepuracin Mostrartodosloswarnings ComprobarqueelprogramaesCestndar Optimizacin,desden=0(ninguna)an=3(mxima) Definirunmacro(#define)ysuvalor(1siseomite) Incluireldirectorioalbuscararchivos.h Incluireldirectorioalbuscarbibliotecas Usarlabibliotecabiblioteca Enlazarbibliotecasestticamente
GuaNo.5
UESCICLOI2011
9/14
Procedimiento
Creeunarchivocongeditynmbrelosuma.c.Unaformadehacerloesescribiendoenlalneadecomandos: user@host>>geditsuma.c& Cuandoustedhagaestoseabrirelprogramagedit,endondepodrverelnumerodelnea,diferentescoloresde textoparacomentarios,directivaseinstrucciones,etc.Escribaelsiguientecdigofijndosecuidadosamente: /*suma.c;Programadesuma*/ #include<stdio.h> /*lafuncinmaininicialaejecucindelprograma*/ intmain() { intentero1;/*primernmerointroducidoporelusuario*/ intentero2;/*segundonmerointroducidoporelusuario*/ intsuma;/*variableenlacualsealmacenalasuma*/ printf("Introduzcaelprimerentero\n");/*indicador*/ scanf("%d",&entero1);/*leeunentero*/ printf("Introduzcaelsegundoentero\n");/*indicador*/ scanf("%d",&entero2);/*leeunentero*/ suma=entero1+entero2;/*asignaeltotalasuma*/ printf("Lasumaes%d\n\n",suma);/*imprimelasuma*/ return0;/*indicaqueelprogramaterminconxito*/ }/*findelafuncinmain*/
GuaNo.5
UESCICLOI2011
10/14
GuaNo.5
UESCICLOI2011
11/14
Siguiendolosmismospasos,escribaelsiguientecdigo,yluegocompileyejecute.Losresultadospodrverlos enlamismaconsola. /*promedio.c;Programaparaobtenerelpromediodecalificacionesdeuna clasemedianteunarepeticincontroladaporcontador*/ #include<stdio.h> /*lafuncinmaininicialaejecucindelprograma*/ intmain() { intcontador; /*nmerodelacalificacinsiguiente*/ intcalificacion; /*valordelacalificacin*/ inttotal; /*sumadelascalificacionesintroducidasporelusuario*/ intpromedio; /*promediodelascalificaciones*/ /*fasedeinicializacin*/ total=0; /*inicializatotal*/ contador=1; /*fasedeproceso*/ while(contador<=10){ /*repite10veceselciclo*/ /*inicializaelcontadordelciclo*/
printf("Introduzcalacalificacion%d:",contador); /*indicadorparalaentrada*/ scanf("%d",&calificacion); total=total+calificacion; contador=contador+1; }/*findewhile*/ /*fasedeterminacin*/ promedio=total/10; /*leelacalificacindelusuario*/ /*sumalacalificacinaltotal*/ /*incrementaelcontador*/
/*divisinentera*/
user@host>>gccopromediopromedio.c user@host>>./promedio
GuaNo.5
UESCICLOI2011
12/14
Enesteotrocdigo,conelcualsepuedecalcularlasolucinaunaecuacincuadrticaparacualquierclasede coeficientes. /*cuadratica.ccalcularracesdeunaecuacindesegundogrado*/ #include<stdio.h> #include<stdlib.h> #include<math.h> intmain() { doublea,b,c; doubled; doublere,im; printf("Coeficientesa,bycdelaecuacion:");scanf("%lf,%lf,%lf,",&a,&b,&c); printf("\n"); if(a==0&&b==0) printf("Laecuacionesdegenerada\n"); else if(a==0) printf("Launicaraizes:%.3lf\n",c/b); else { re=b/(2*a); d=b*b4*a*c; im=sqrt(fabs(d))/(2*a); if(d>=0) { printf("Raicesreales\n"); printf("%0.3lf,%0.3lf\n",re+im,reim); } else { printf("Raicescomplejas\n"); printf("%.3lf+%.3lfi\n",re,fabs(im)); printf("%.3lf%.3lfi\n",re,fabs(im)); } } return0; }//findelMAIN
user@host>>gcclmocuadraticacuadratica.c user@host>>./cuadratica
GuaNo.5
UESCICLOI2011
13/14
Asignacin.
1. PorsedicequeCesunlenguajedenivelintermedio? 2. Describaalmenos3librerasylasfuncionesincluidasenellenguajeC. 3. Aquserefierelaexpresinprogramacinorientadoaobjeto? 4. Investigar las siguientes instrucciones y/o directivas del lenguaje de programacin C, explicar los parmetrosquesepuedenusar,yhaceralmenosdosejemplos:
GuaNo.5
UESCICLOI2011
14/14