You are on page 1of 129

LENGUAJE PROGRAMACION USANDO C++ y C#

Cesar Carrasco Bocangel 20 de abril de 2012

Parte I

CURSO LENGUAJE DE PROGRAMACION

Captulo 1

Introduccion
1.1. Algoritmo
he(nimos omo lgoritmo un onjunto de psos neesrios pr resolver un prolem y se mnulmente o por mtodos menizdos queD son los ms usules en l tuliddF il onepto de lgoritmos fue de(nido iniilmente por el mtemtio ers elEuhowrizm% en el siglo dieinueveF v ejeuin de un lgoritmo no dee inluir proedimientos intuitivos o que requiern retividdF or ejemploD un reet de oin puede denominrse un lgoritmo si ontiene ls instruiones preiss pr preprr lgoD siempre y undo no teng detlles tles omo sl l gustoD o oinr hst que est suveD que son preiiones sujetivs del que prepr l reetF heemos indir que los lgoritmos deen umplir un requisito fundmentl y es que todo lgoritmo dee terminr en un nmero (nito de psosF i onsidermos el sistem opertivo veremos que no es un lgoritmo porque no termin nunD ddo que est en un ilo in(nitoF odemos itr lgunos ejemplos de lgoritmos onoidosD el mtodo de multiplir que prendimos en l esuelD el lgoritmo pr veri(r si un nmero es primo y muhos otrosF

1.1.1. Problemas e instancias


i pensmos los proedimientos pr multiplir nmeros que onoemos veremos que hy vris forms de resolver el prolem de multipliinF enemos los mtodos que prendimos en l esuelD mtodos por divisin y multipliin por P denomindo multipliin l rus y otrosF gul de sts posiles soluiones hy que implementrc ist deisin orresponde un re muy desrrolld en el mpo de l informti denomind nlisis de lgoritmosF n instni prtiulr ser por ejemplo multiplir el nmero IPQ por el RSTU pero un lgoritmo dee ser pz de funionr orretmente no solo en un instni del mtodo sino ms ien en tods ls instnis posilesF r demostrr que un lgoritmo es inorretoD es su(iente demostrr que es inorreto pr un instni F es omo es difil pror que un teorem es orreto tmin es difil pror que un lgoritmo es orretoF ixisten limitiones propis de ls omputdors que ponen restriiones los lgoritmosF ists pueden ser deido l tmno de los nmerosD espio de memori o lmenmientoF in el nlisis de los lgoritmosD se trt de nlizrlos en form strt iniilmenteD pero en el trnsurso del texto tmin toremos spetos espe(os sore l implementin y l e(ieni de los mismosF gonsideremos por ejemplo que queremos hllr el mximo de tres nmeros D D F r resolver sto esriimos el siguiente digoX

maximo=0 maximo=Max(a,b) maximo=Max(c,maximo) Max @DA if b return else return


P

1.1. ALGORITMO

CAPTULO 1. INTRODUCCION

e puede ver que se requieren extmente dos ompriones pr determinr el vlor mximo de D D F i esriirmos wx@wx@DADA tmin se relizrn dos omprionesF iste mismo lgoritmo lo podemos esriir omo sigueX

maximo=0 if @ b A if(a b A maximo a else maximo a else if b maximo a else maximo a


emos que n undo hemos odi(do ms ompriones en l ejeuin solo se ejeutn dos omo el so nteriorF e he neesrio estleer que es lo que deemos onsiderr en los progrmsD sto he neesrio de(nirD lo que se entiende por operiones elementlesF

1.1.2. Operaciones elementales


is un operin uyo tiempo de ejeuin est otdo por un onstnte que solo depende de un imE plementin prtiulr omo ser l mquinD el lenguje de progrminD etF in el ejemplo que relizmos estremos interesdos en medir el nmero de ompriones neesris pr hllr el mximoF il resto de ls operiones ls onsidermos operiones elementlesF in el so de l sum de elementos de un vetor lo que desemos medir es l ntidd de sums relizds pr resolver el prolem y ls operiones de omprin neesris pr implementr un soluinD se onsidern operiones elementlesF

1.1.3. Anlisis del mejor caso, caso medio y peor caso


il tiempo que tom un lgoritmo puede vrir onsiderlemente en funin de diferentes instnis de un mismo tmnoF r omprender esto mejor onsideremos el ejemplo del progrm de lsi(in por inserinF

insercin(t) for iaI to n x= ti j=i-1 while j b H nd x`tj t[j+1]=t[j] j=j-1 t[j+1]=x


gonsideremos un onjunto e en el ul queremos proesr el lgoritmo de ordenrF r ordenr e utilizrmos inserin@eAF i l instni e est previmente ordend en form sendente podemos pror que el tiempo de proeso es el ptimo porque solo insert vlores en el vetor y no reliz intermiosF in el so de que el vetor estuvier ordendo en orden desendente por d elemento hy que reorrer todo el vetor intermindo los vloresF iste lrmente es el peor omportmiento que podemos tenerF i el vetor estuvier ordendo en form sendente no relizr ningn intermio y este es el mejor so en el que se puede estrF in emrgo si el vetor estuvier desordendo en form letori el omportmiento se onsider del so medioF gundo el tiempo de respuest de un prolem es rtio normlmente nlizmos el peor so que es muho ms fil de nlizr que el so medioF or lo tnto un nlisis til de un lgoritmo requiere un onoimiento priori de ls instnis que vmos proesrF Q

Captulo 2

Algoritmos y Diagramas de ujo


in los psos seguir pr el desrrollo de un prolemD existen simente dos tipos de elementos on los ules es posile espei(r un prolem en form esquemti y on un notin orientd l omputinD ests herrmients son los lgoritmos y los digrms de )ujo que se omplementnF il onepto de lgoritmo es muy importnte dentro del re de omputinD uyo signi(do tul es similr un reetD proesoD mtodoD tniD proedimiento o rutin pr relizr un tividdD exepto que el lgoritmo tiene un onnotin ligermente diferenteF n lgoritmo es un onjunto de regls que determinn l seueni de ls operiones seguir pr resolver un prolem espe(o y que umple on ls siguientes ino rterstisX IA pinitudX n lgoritmo dee terminr despus de ejeutr un nmero (nito de psosF PA he(niinX gd pso en un lgoritmo dee estr de(nido on preisinD esto esD l in seguir no dee ser miguD sino rigurosmente espei(dF x lgoritmo desrito en un lenguje omo ingls o espolD en el ul un mism plr puede signi(r vris ossD puede no umplir on este puntoF is por eso que se hn de(nido los lengujes de progrmin o lengujes de omputin pr espei(r lgoritmosD y que en ellos el signi(do de d plr es uno y slo unoF QA intrdX e onsider omo entrd el onjunto de dtos o informin requerid pr resolver un proE lem ddoF xo ulquier grupo de dtos se puede onsiderr omo entrd en el proedimiento seldoF RA lidX v slid es un onjunto de resultdos que se otienen l plir el lgoritmo l onjunto de dtos de entrdF SA ifetividdX n lgoritmo dee llevr l soluin del prolem plntedoD en otrs plrsD se puede deir que tods ls operiones que efet el lgoritmoD deen ser lo su(ientemente simples pr que en prinipioD se puedn ejeutr on ppel y lpiz y l (nl otener el resultdo desedoF

2.1. Diagrama de ujo


Introduccin
n higrm de plujo represent l esquemtizin gr( de un lgoritmo D el ul muestr gr(mente los psos o proesos seguir pr lnzr l soluin de un prolem F u orret onstruin es summente importnte porqueD prtir del mismo se esrie un progrm en lgn venguje de rogrminF i el higrm de plujo est ompleto y orreto el pso del mismo un venguje de rogrmin es reltivmente simple y diretoF is importnte resltr que el higrm de plujo muestr lugres de origen y destino de los dtosD trnsformiones ls que son sometidos los dtosD lugres en los que se lmenn los dtos dentro del sistemD los nles por donde iruln los dtosF edems de esto podemos deir que este es un representin retiulr de un sistemD el ul lo ontempl en trminos de sus omponentes indindo el enle entre los mismosF el igul que el pseudodigoD los digrms de )ujo son tiles pr el desrrollo y l representin de lgoritmosD unque l myor prte de los progrmdores pre(eren el pseudodigoF vos digrms de )ujo muestrn on lridd mo opern ls estruturs de ontrol utilizds en l progrmin estruturdF n digrm de )ujo onst de un onjunto de smolos on diferentes signi(dos suseptiles de ser onetdos entre siF in todo digrm de )ujo podemos enontrr los siguientes elementosX A sniio de proesoF A ispei(in de l limentin de dtos pr efetur el proesoF R

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

A eiones pliles los dtosF dA ytenin de resultdosF eA pin del proesoF r d un de ests tividdes existen smolos espe(os que denotn los elementos o iones que se tomrn en el proesoF xotX istos hn sido normlizdos por el snstituto xortemerino de xormlizin @exsAF

Programacin estructurada
v progrmin estruturd signi( esriir un progrm de uerdo ls siguientes reglsX il progrm tiene un diseo modulrF vos mdulos son disedos de modo desendenteF gd modulo se odi( utilizndo ls tres estruturs de ontrol sisX seuenilD lterntiv y repetE itivF il termino progrmin estruturd se re(ere un onjunto de tnis que umentn onsiderlemente l produtividd del progrm reduiendo en elevdo grdo el tiempo requerido pr esriirD veri(rD depurr y mntener los progrmsF v progrmin estruturd utiliz un nmero limitdo de estruturs de ontrol que minimizn l omplejidd de los progrms y por onsiguiente reduen los erroresF v progrmin estruturd es el onjunto de tnis que inorpornX eursos strtosF hiseo desendente @top ! hownAF istruturs sis de ontrolF

Recursos abstractos
hesomponer un progrm en trminos de reursos strtos ! segn hijkstr ! onsiste en desomponer un determind in omplej en trminos de un nmero de iones ms simplesF

Diseo descendente
il diseo desendente es el proeso medinte el ul un prolem se desompone en un serie de niveles o psos suesivos de re(nmientoF v metodolog desendente onsiste en efetur un relin entre ls suesivs etps de estruturinD de modo que se relionen uns on otrs medinte entrds y slids de informinF is deirD se desompone el prolem en etps o estruturs jerrquis de form que se puede onsiderr d estrutur desde dos puntos de vistX u hec gmo lo hecF i se onsider un nivel n de re(nmientoD ls estruturs se onsidern de l siguiente mnerX

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

il diseo desendente se puede ver en l siguiente (gurF

Estructuras bsicas
gulquier progrm on un solo punto de entrd y un solo punto de slid puede resolverse on tres tipos de estruturs sis de ontrolX euenilD lterntiv y repetitivF

- Secuencial is quell que ejeut ls iones suesivmente uns ontinuin de otrs sin posiilidd
de omitir ningunD y nturlmente sin ifuriones @sltos surutinsAF ods ests estruturs tendrn un entrd y un slidF

- Alternativa is quell en l que nimente se reliz un lterntiv dependiendo del vlor de un

determind ondiin o predidoF vs estruturs lterntivs tmin llmds ondiionles pueden ser de tres tiposX impleD dole o mltiple elterntiv simpleX on quells en donde l existeni o umplimiento de l ondiin impli l ruptur de l seueni y l ejeuin de un determind inF

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Alternativa doble
is quell que permite l elein entre dos iones o trtmientos en funin de que se umpl o no determind ondiin

Alternativa mltiple
e dopt undo l ondiin puede tomr n vlores enteros distintosF egn se elij uno de estos vlores en l ondiin se relizr un de ls n ionesF ist estrutur propuest por roreD es l se del lenguje sl o se de los fsi estruturdos @gse a estrutur de sosAF

Repetitiva o iterativa
on quells en ls que ls iones se ejeutn un nmero determindo de vees y dependen de un vlor prede(nido o el umplimiento de un determind expresin lgiF n ule o lzo es el onjunto de iones repetirF in onseueni es preiso disponer de estruturs lgortmis que permitn desriir un iterin de form modF vs tres estruturs ms usules dependiendo de que l ondiin se enuentre l prinipio o l (nl de l iterin sonX istrutur mientrsD repetir hst y estrutur prF

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Estructura Mientras il ule mientrs determin l repetiin de un grupo de instruiones mientrs l ondiin se umplF ist estrutur se onoe normlmente omo hileF

Estructura Hacer  Mientras il nmero de iteriones del grupo de instruiones se ejeut un o vris

vees hst que l ondiin no se umplF ist ondiin se ejeut l menos un vezF e est estrutur tmin se le onoe omo ho hileF

Estructura Para gon el vlor iniil se iniiliz l vrile de ontrol de iloD se veri( l ondiinD si
est se umple se ejeut el uerpo del ilo y posteriormente se inrement l vrile de ontrolD lo nterior se repite hst que l ondiin no se umplF

Secuencia intendemos por seueni l ejeuin o relizin de psos o iones en el desrrollo de un


lgoritmoD siguiendo el orden estleidoF

Programa e le llm progrm l serie de instruiones esrits en lguno de los lengujesD por medio de los

ules se logr que l omputdor relie tods ls operiones o deisiones selds en dihs instruionesF odemos distinguir dos tipos de progrmX rogrm fuenteX es el onjunto de instruiones esrits en lgn lenguje de omputdorD ls ules hn sido trnsritos pr ser interpretds por lgn dispositivo de leturF rogrm ojetoX es el onjunto de instruiones que omponen un progrm fuente y que hn sido trduids l lenguje mquin por medio del ompildor orrespondienteF V

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

n ompildor es un progrm que trdue el progrm fuente progrm ojetoF n ompildor indepenE diente se requiere pr d lenguje de progrminF ste efet slo l trduinD no ejeut el progrmF n vez ompildo el progrmD el resultdo en form de progrm ojeto ser diretmente ejeutleF

Pseudocdigo il pseudodigo de puede de(nir omo un lenguje de espei(iones de lgoritmosF il pseudodigo no es relmente un digo sino un imitin y un versin revid de instruiones reles pr ls omputdorsF

2.1.1. EJEMPLO DEMOSTRATIVO


sngresr dos numeros interos y mostrr el myor de los dos pr resolver este prolem primero relizmos el pseudoodigo

Programa wyorPxumerosY Entorno Entero numeroIDnumeroPY Inicio Escribe sntrodue el rimer numero un nmeroXY Lee numeroIY Escribe sntrodue el egundo numero un nmeroXY Lee numeroPY Si numero Ib numeroP entones Escribe il pimer nmero es myorY Sino Escribe il egundo nmero es myorY Fin siY Fin;
ehor proederemos resolver utilizndo un softwre de digrms de )ujo de htos

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

IH

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

II

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

2.1.2. EJERCICIOS RESULETOS


Programa gomprrxumeroY Entorno intero numeroY Inicio

Algoritmo que lea un nmero por el teclado e indique si el nmero ledo es mayor que 10 y si el nmero ledo es menor que 20.

Escribe sntrodue un nmeroXY Lee numeroY Si numero b IH entones Escribe il nmero es myor que IHY Fin siY Si numero ` PH entones Escribe il nmero es menor que PHY Fin siY Fin; Algoritmo que lea dos nmeros por teclado y muestre un mensaje por pantalla indicando si el cuadrado el primero es mayor que el cubo del segundo. Programa goprgonyperionesY Entorno Entero numID numPY GG xs leidos por teldo Entero udrdoD uoY GG rsF emporles Inicio Escribe sntrodue el primer nmeroY Lee numIY Escribe sntrodue el segundo nmeroY Lee numPY cuadrado a nI B nIY cubo a nP B nP B nPY Si udrdo b uo entones Escribe il udrdo del I es myor que el uo del PY Fin siY Fin;

IP

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Algoritmo que lean un nmero entero entre 1 y 10, y nos muestre por pantalla el nmero en letra (el literal). Si el nmero ledo no esta comprendido entre 1 y 10 mostrar dicha incidencia. Programa xumeroeviterlY Entorno Entero nY Inicio isrie sntrodue un nmeroX Y Lee nY /* eunque se umpl un ondiin el ordendor dee evlurls todsD on el oste de rendimiento que
esto represent BG

Si n a I entones Escribe noY Fin siY Si n a P entones Escribe hosY Fin siY Si n a Q entones Escribe resY Fin siY Si n a R entones Escribe gutroY Fin siY Si n a S entones Escribe ginoY Fin siY Si n a T entones Escribe eisY Fin siY Si n a U entones Escribe ieteY Fin siY Si n a V entones Escribe yhoY Fin siY Si n a W entones Escribe xueveY Fin siY Si n a IH entones Escribe hiezY Fin siY /* gompromos si el nmero no est entre I y IH pr mostrr mensje BG Si n ` I o nb IH entones Escribe il nmero no est entre I y IHY Fin siY Fin;
IQ

2.1. DIAGRAMA DE FLUJO


Programa xumerosyrdendosY

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Realizar un algoritmo que lea tres nmeros por teclado y nos indique cual de ellos es el mayor. Entorno intero nID nPD nQY GG xs leidos por teldo Inicio Escribe sntrodue Q nmerosY Lee nID nPD nQY Si nI b nP entones // il myor ser nI o nQ Si nI b nQ entones Escribe il myor es D nIY Sino GG nI `a nQ Escribe il myor es D nQY Fin siY Sino // nI `a nPD deemos omprr nP y nQF il myor ser nP o nQ Si nP b nQ entones Escribe il myor es D nPY Sino Escribe il myor es D nQY Fin siY Fin si Fin Algoritmo que lee tres nmeros cualesquiera y los escribe ordenados de forma ascendente. Programa xumerosyrdenesendenteY Entorno Entero nID nPD nQY Inicio Escribe sntrodue tres nmerosX Y Lee nID nPD nQY Si nI b nP entones Si nP b nQ entones Escribe nQD nPD nIY Sino GG nP `a nQ Si nI b nQ entones Escribe nPD nQD nIY Sino Escribe nPD nID nQY Fin siY Fin siY Sino GG nI `a nP Si nP ` nQ entones Escribe nID nPD nQY
IR

2.1. DIAGRAMA DE FLUJO


Sino GG nP ba nQ y nP ba nI Si nI b nQ entones Escribe nQ nID nPY Sino Escribe nID nQD nPY Fin siY Fin siY Fin si Fin;

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Algoritmo que lee una calicacin numrica entre 0 y 10 y la transforma en calicacin alfabtica, escribiendo el resultado
H`axot`Q Q`axot`S S`axot`T T`axot`U U`axot`W W`axot`aIH wh sx p fsi xy yf

Programa xumeroeviterlY Entorno Entero nY Inicio Escribe sntrodue un nmeroX Y Lee nY GB xo sngrremos tods ls sentenis inluids dentro del ino pues no hy espio en el ppel Si n a I entones Escribe noY Sino i n a P entones Escribe hosY Sino i n a Q entones Escribe resY Sino i n a R entones Escribe gutroY Sino i n a S entones Escribe ginoY Sino i n a T entones Escribe eisY Sino i n a U entones Escribe ieteY Sino i n a V entones Escribe yhoY Sino i n a W entones Escribe xueveY
IS

y dems est form es ms lrF xo hy que olvidr poner tntos pin si omo i hymos ierto BG

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Sino i n a IH entones Escribe hiezY Sino /* il nmero no est entre I y IH pr mostrr mensje BG Escribe il nmero no est entre I y IHY Fin siY Fin iY Fin iY . . . pin iY /* e difereni de l implementin del ejeriio Q este lgoritmo undo un ondiin es iert no
evl el resto inneesrimente BG

Fin; Algoritmo que lee tres nmeros cualesquiera y nos indica todas sus relaciones de igualdad Programa elionessgulddY Entorno Entero nID nPD nQY Inicio Escribe sntrodue tres nmerosX Y Lee nID nPD nQY Si nI a nP y nI a nQ entones Escribe vos tres nmeros son igulesY Sino Si nI a nQ entones Escribe il I y el P son igulesY Sino Si nP a nQ entones Escribe il P y el Q son igulesY Sino Escribe odos son distintosY Fin siY Fin siY Fin siY Fin; Algoritmo que recibe como datos de entrada una hora expresada en horas, minutos y segundos que nos calcula y escribe la hora, minutos y segundos que sern transcurrido un segundo. Programa negundohespuesY Entorno Entero horD minD segY Inicio Escribe sntrodue horX Y Lee horY
IT

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Escribe sntrodue minutoX Y Lee minY Escribe sntrodue segundoX Y Lee segY seg a seg CIY Si seg b TH entones min a min C IY seg a HY Si min b TH entones hora a hor C IY min a HY Si hor b PR entones hora a HY Fin siY Fin siY Fin siY Escribe n segundo despus son lsX D horD XD minD XD segY Fin; Algoritmo que lee como dato de entrada un ao y nos dice si se trata de un ao bisiesto o no. Se sabe que son bisiestos todos los aos mltiplos de 4, excepto los que sean mltiplos de 100 sin ser mltiplos de 400.
rogrm isfisiestoY

Entorno Entero nyoY Inicio isrie sntrodue eoX Y Lee nyoY Si @nyo 7 R a HA y xo @ nyo 7 IHH a H y no @ nyo 7 RHH aHA A entones Escribe il o D nyo D  es isiestoY Sino Escribe il o D nyo D  xy es isiestoY Fin siY Fin; En un determinado comercio se realiza un descuento dependiendo del precio de cada producto. Si el precio es inferior a S/. 6 , no se hace descuento; si es mayor o igual a S/. 6 y menor que S/.60 se hace un 5 % de desceunto, y si es mayor o igual a S/. 60 se hace un 10 % de descuento. Realizar el algoritmo que lee el precio de un producto y nos calcula y escribe su precio nal. Programa gluloreiopinlY Entorno Entero reiosniilD htoY Inicio Escribe sntrodue preio sniilX Y Lee reiosniilY
IU

2.1. DIAGRAMA DE FLUJO


Si reiosniil ` T entones Dto a HY Sino Si resiosnil ` TH entones Dto a SY Sino Dto a IHY Fin siY

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Escibe reio (nl a D reiosniilB@I C htoGIHHAD hesuento a D htoD  7Y Fin; Algoritmo que lee el precio nal pagado por un producto y su precio de tarifa y nos calcula el porcentaje de descuento que le ha sido aplicado. Programa glulohesuentoY Entorno intero reiopinlD reiorifY Inicio Escribe sntrodue preio rifX Y Lee reiorifY Escribe sntrodue preio pinlX Y Lee reiopinlY /* v di(ultd de este prolem es ser que frmul mtemti se dee utilizrF epens tiene omE
plejidd lgortmi BG

Dto a @IEreiopinlGreiorifABIHHY Escibe hesuento a D htoD  7Y Fin; Algoritmo que lee 3 nmeros distintos y nos dice cual de ellos es el menor. Programa xumerowenorY Entorno intero nID nPD nQY GG xs leidos por teldo Inicio Escribe sntrodue Q nmerosY Lee nID nPD nQY Si nIanP o nIanQ o nPanQ entones Escribe vos nmeros no son distintosY Sino Si nI ` nP entones // il menor ser nI o nQ Si nI ` nQ entones Escribe il menor es D nIY Sino // nI ba nQ Escribe il menor es D nQY Fin siY
IV

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Sino // nI ba nPD deemos omprr nP y nQF il menor ser nP o nQ Si nP ` nQ entones Escribe il menor es D nPY Sino Escribe il menor es D nQY Fin siY Fin siY Fin siY Fin 12.4 Algoritmo que lee como datos de entrada una fecha expresada en da (1..31), mes (1..12, y ao y nos dice la fecha que ser el da siguiente. Se supondr que febrero tiene siempre 28 das. Programa nhihespuesY Entorno Entero diD mesD nyoY Entero numhiswesY Inicio Escribe sntrodue hiX Y Lee diY Escribe sntrodue wesX Y Lee mesY Escribe sntrodue eoX Y Lee eoY Si mes a P entones numDiasMes a PVY Sino Si mesaR o mesaT o mesaW o mesaII entones // weses de QH dsX erirD tunioD eptF xovF NumDiasMes a QHY Sino // il resto tiene QI ds NumDiasMes a QIY Fin siY Fin siY Si di b numhiswes entones mes a mes C IY di a IY Si mes b IP entones anyo a nyo C IY mes a IY Fin siY Fin siY Escribe n d despus esX D diD GD mesD GD nyoY Fin;
IW

2.1. DIAGRAMA DE FLUJO


Programa nhihespuesY Entorno intero diD mesD nyoY Entero numhiswesY Inicio

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Plantea el algoritmo anterior sin suponer que febrero tiene 28 das.

Escribe sntrodue hiX Y Lee diY Escribe sntrodue wesX Y Lee mesY Escribe sntrodue eoX Y Lee eoY Si mes a P entones Si @nyo 7 R a HA y xo @ nyo 7 IHH a H y no @ nyo 7 RHH aHA A entones // is isiesto numDiasMes a PWY Sino numDiasMes a PVY Fin iY Sino Si mesaR o mesaT o mesaW o mesaII entones
GG weses de QH dsX erirD tunioD eptF xovF

NumDiasMes a QHY Sino // il resto tiene QI ds NumDiasMes a QIY Fin siY Fin siY // piltrmos si l feh es orret Si dibaI y di`anumhiswes y wes ba I y mes `a IP entones Si di b numhiswes entones mes a mes C IY dia a IY Si mes b IP entones anyo a nyo C IY mes a IY Fin siY Fin siY Escribe n d despus esX D diD GD mesD GD nyoY Sino Escribe v feh es inorretY Fin iY Fin;

PH

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Algoritmo que lee dos nmeros enteros, positivos y distintos y nos dice si el mayor es mltiplo del menor o, lo que es lo mismo, si el menor es divisor del mayor. Programa ishivisorilwenorY Entorno Entero nID nPY GG xs ledos por teldo Entero myorD menorY GG riles temporles Inicio Escribe sntrodue P nmerosY Lee nID nPY // fusmos el myor y el menor Si nI b nP entones mayor a nIY menor a nPY Sino mayor a nPY menor a nIY Fin siY Si myor 7 menor a H entones Escribe wyorD  es mltiplo de D menorY Sino Escribe xo existe ningun relin entre los nmerosY Fin siY Fin Algoritmo que calcula la edad de una persona recibiendo como datos de entrada la fecha de nacimiento, y la fecha actual, ambas en tres variables. Programa iddinenyosY Entorno Entero dnD mmD nY GG peh de nimiento Entero dD mD Y GG peh de tul Entero iddY GG vrile temporl Inicio Escribe sntrodue peh nimientoX Y Lee dnD mnD nY Escribe peh tulX Y Lee dD mD Y /* v edd de un person ser igul l o tul menos el o de nimientoF i un no h umplido
os en el o tul hr que restrle IBG Edad a ! nY /*Comprobamos si y h umplido los os o no BG Si m ` mn o @m a mn y di ` dnA entones // eun no h umplido los os este o Edad a idd E IY Fin siY Escribe idd a D iddY

Fin;
PI

2.1. DIAGRAMA DE FLUJO


rogrm reswenoresueIHHY

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Realizar un algoritmo que muestre por pantalla los nmeros pares menores de 100. Entorno Entero nY Inicio n a PY Mientras n`IHH her Escribe nY n a n C PY Fin wientrsY Fin
ytr form

Programa reswenoresueIHHY Entorno Entero nY Inicio n a IY Mientras n`IHH her Si n 7 P a H entones Escribe nY Fin siY n a n C IY Fin wientrsY Fin Realizar un algoritmo que muestre por pantalla los nmeros mltiplos de 5 menores que 10000. Programa wultheSwenorIHHHY Entorno Entero nY Inicio n a SY Mientras n`IHHH her Escribe nY n a n C SY Fin wientrsY Fin

PP

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

16.3 Algoritmo que lea un nmero por teclado e imprima por pantalla todos los nmeros positivos menores que N Programa vistxumerosY Entorno Entero nY Entero iY GG gontdor Inicio Escribe sntrodue un nmeroX Y Lee nY i a IY Mientras i ` n her Escribe iY i a i C IY Fin wientrsY Fin
ytr form

Programa vistxumerosY Entorno intero nY Inicio Escribe sntrodue un nmeroX Y Lee nY Mientras nbI her n a n E IY Escribe nY Fin wientrsY Fin Algoritmo que lee una secuencia de 10 nmeros y obtiene e imprime cuantos hay positivos, negativos y nulos. Programa guentxumerosY Entorno Entero nY Entero iY GG rile ontrol del ule Entero nosD nxegD nxulosY GG gontdores Inicio nPos=0; nNeg=0; nNulos=0; i a HY Mientras i`IH her
PQ

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Escribe sntrodue un nmeroX Y Lee nY Si nbH entones nPos a nos C IY GG is positivo Sino Si n ` H entones nNeg a nxeg C IY GG is negtivo Sino nNulos a nxulos C IY GG is ero FinSi; FinSi; i a i C IY Fin wientrsY Escribe otl positivos XD nosY Escribe otl negtivos XD nxegY Escribe otl nulos XD nxulosY Fin Algoritmo que lee una secuencia de nmeros no nulos, terminada con la introduccin de un 0, y obtiene e imprime el mayor, visualizando un mensaje de si ha ledo algn nmero negativo. Programa guentxumerosY Entorno Entero nY Entero myorY GG qurd el vlor del myor Booleano hyxegtivosY GG swith Inicio hayNegativos a flseY GG suponemos que no hy negtivos /* il menor de los posilesD ulquier nmero de los ledos por teldo ser myor que este BG mayor a EWWWWWWWY hacer Escribe sntrodue un nmeroX Y Lee nY Si n `b H entones GG roesmos el nmero ledo Si n ` H entones hayNegativos a trueY // e h enontrdo un negtivo FinSi; Si n b myor entones /* e h enontrdo un nmero myor que el tulD lo seleionmos omo myor BG mayor a n Fin siY Fin siY Mientras n `b HY Escribe il myor es XD myorY Si hy xegtivos entones
PR

2.1. DIAGRAMA DE FLUJO


Fin iY Fin

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Escribe e hn enontrdo nmeros negtivosY

ytr formD no presuponemos ningn nmero omo myor

Programa guentxumerosY Entorno Entero nY Entero myorY GG qurd el vlor del myor Booleano hyxegtivosY GG swith Booleano esrimerezY Inicio hayNegativos a flseY esPrimeraVez a trueY hacer Escribe sntrodue un nmeroX Y Lee nY Si n `b H entones // roesmos el nmero ledo Si n ` H entones hayNegativos a trueY // e h enontrdo un negtivo FinSi; Si esrimerez o n b myor entones /* e h enontrdo un nmero myor que el tul o es el primer nmero leidoD lo seleE mayor a nY esPrimeraVez a flseY
ionmos omo myor BG

Fin siY Fin siY Mientras n `b HY Si esrimerez entones Escribe xo se h introduido ningn nmeroY Sino Escribe il myor es XD myorY Fin siY Si hy xegtivos entones Escribe e hn enontrdo nmeros negtivosY Fin iY Fin

PS

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Algoritmo que lee un nmero entero positivo N y calcula e imprime el factorial de N!. Si lee un nmero negativo indica con un mensaje que no es posible la operacin. Programa ptorilY Entorno Entero nY Entero iY GG gontdor Entero resultdoY Inicio Escribe sntrodue un nmeroX Y Lee nY Si n ` H entones Escribe xo existe ftoril de un nmero negtivoY Sino resultdo a IY // sniilizmos el umuldor i a IY Mientras i ` n her resultado a resultdo B iY Fin wientrsY Escribe il ftoril de D nD  es D resultdoY Fin siY Fin Algoritmo que lee un nmero X y otro entero positivo N y calcula la N-sima potencia de X (sin utilizar el operador de potencia). Programa oteniY Entorno Entero xD nY Entero iY GG gontdor Entero resultdoY Inicio Escribe sntrodue un nmeroX Y Lee xY Escribe sntrodue l poteniX Y Lee nY Si n ` H entones Escribe xo se lulr potenis negtivsY Sino resultado a IY // sniilizmos el umuldor i a IY Mientras i ` n her resultado a resultdo B xY Fin wientrsY Escribe xD elevdo D nD  es D resultdoY Fin siY Fin
PT

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Algoritmo que obtenga el producto de dos nmeros enteros positivos mediante sumas sucesivas.
GB emplimos el prolem pr permitir nmeros negtivos BG

Programa rodutoY Entorno Entero nID nPY Entero iY GG gontdor Entero resultdoY Booleano resultdoxegY Inicio Escribe sntrodue un nmero IX Y Lee nIY Escribe sntrodue un nmero PX Y Lee nPY /* heemos onsiderr el so de que lguno de los nmeros se negtivoD lo mejor es poner los dos
nmeros en positivo y luego onsiderr el signoF mos evitr usr el operdor de produto B G

resultadoNeg a @nI ` H o nP ` HA y no @nI ` H y nP ` HAY // gonvertimos los nmeros positivo Si nI ` H entones n1 a EnIY Finsi Si nP ` H entones n2 a EnPY Finsi resultado a HY // sniilizmos el umuldor i a IY Mientras i ` nP her resultado a resultdo C nIY Fin wientrsY Si resultdoxeg entones resultadoNeg a EresultdoxegY // gmimos de signo Fin siY Escribe nID  por D nPD  es D resultdoY Fin siY Fin

PU

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Algoritmos que obtenga el cociente y el resto de dos nmeros enteros positivos mediante restas.
GB emplimos el prolem pr permitir nmeros negtivos BG

Programa hivisionY Entorno Entero dividendoD divisorY Entero restoD oienteY Booleano resultdoxegY Inicio Escribe sntrodue dividendoX Y Lee dividendoY Escribe sntrodue divisorX Y Lee divisorY /* heemos onsiderr el so de que lguno de los nmeros se negtivoD lo mejor es poner los dos
nmeros en positivo y luego onsiderr el signoF mos evitr usr el operdor de produto B BG

resultadoNeg a @dividendo ` H o divisor ` HA y no @dividendo ` H y divisor ` HAY // gonvertimos los nmeros positivo Si dividendo ` H entones dividendo a E dividendoY Finsi Si divisor ` H entones divisor a E divisorY Finsi cociente a HY // sniilizmos el umuldor resto a dividendoY Mientras divisor ` resto her resto a resto a divisorY cociente a oiente C IY Fin wientrsY Si resultdoxeg entones cociente a EoienteY // gmimos de signo Fin siY Escribe dividendoD  entre D divisorD  d D oiente D  on resto D restoY Fin Algoritmo que lee tres nmeros A, B, C, y los imprime en orden creciente e indica si fueron introducidos en ese orden. /* iste prolem es si idntio uno resulto on nterioridd BG Programa xumerosyrdenesendenteY Entorno Entero nID nPD nQY
PV

2.1. DIAGRAMA DE FLUJO


Inicio

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Escribe sntrodue tres nmerosX Y Lee nID nPD nQY Si nI b nP entones Si nP b nQ entones Escribe nQD nPD nIY Sino GG nP `a nQ Si nI b nQ entones Escribe nPD nQD nIY Sino Escribe nPD nID nQY Fin siY Fin siY Sino GG nI `a nP Si nP ` nQ entones Escribe nID nPD nQY Sino GG nP ba nQ y nP ba nI Si nI b nQ entones Escribe nQ nID nPY Sino Escribe nID nQD nPY Escribe vos nmeros se introdujeron ordendosY Fin siY Fin siY Fin si Fin; Algoritmo que lea un nmero por teclado y nos diga si es primo. /* n nmero es primo undo solo es divisile por si mismo y por el IF r ser si un nmero es primo
deemos dividirlo suesivmente por sus posiles divisores @nmeros menor que lA y si enontrmos lgn divisor diremos que el nmero xy es primoD es so ontrrio ser un nmero primoF BG

Programa xumerorimoY Entorno Entero nD ontY Booleano esrimoY GG rile que indir si es primo o no Inicio Escribe sntrodue un nmeroX Y Lee nY esPrimo a trueY // suponemos que el nmero es primo cont a PY GG impezmos dividiendo por P /* sremos dividiendo el nmero por sus posiles divisores hst que enontremos un divisorD y por tnto
el nmero deje de ser primo o hst que emos l list de posiles divisores @los menores que lA BG PW

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Mientras ont ` n y esrimo her // v line nterior es igul X // wientrs ont ` n y esrimoatrue her Si n 7 ont aa H entones esPrimo a flseY GG e h enontrdo un divisor Fin siY Fin mientrsY Si esrimo entones Escribe il nmero D nD  es primoY Sino Escribe il nmero D nD  xy es primoY Fin siY Fin; Algoritmo que genera la lista de los N primeros nmeros primos, siendo N el dato de entrada. /* r resolver este lgoritmo es neesrio relizr un proximin desendenteF rtiendo del heho de que
y semos lulr si un nmero es o no primoD dmos por supuest est operin e intentmos resolver el prolemF

v proximin primer ser

Lee nY i a IY GG gontdor que vnz por los nmeros nPrimos a HY GG x de primos que hemos visulizdo mientras i ` n her Si i es un nmero primo entones Escribe iY nPrimos a nrimos C IY Fin iY /* pijrse que est fuer del siD se inrement siempre independiente de que el nmero i se primo o no BG i a i C IY Fin wientrsY
n vez tenemos l I proximin tn solo tenemos que introduir el digo que nos indi si un nmero es primo donde proedF gundo vemos funionesD veremos que est tre es trivilF BG

Programa xrimerosrimosY Entorno // riles utilizds pr ver si el nmero i es primo Entero iD ontY Booleano esrimoY GG rile que indir si es primo o no // riles utilizds pr ir prondo los nmeros Entero nrimosY Entero nY
QH

2.1. DIAGRAMA DE FLUJO


// interio iY helrd previmente Inicio

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Escribe sntrodue un nmeroX Y Lee nY i a IY GG gontdor que vnz por los nmeros nPrimos a HY GG x de primos que hemos visulizdo mientras i ` n her /* i i es un numero primo entones BG esPrimo a trueY GG suponemos que el nmero es primo cont a PY GG impezmos dividiendo por P Mientras ont ` i y esrimo her // wientrs ont ` i y esrimoatrue her re los mismo Si n 7 ont entones esPrimo a flseY GG e h enontrdo un divisor Fin siY Fin mientrsY Si esrimo entones Escribe iY nPrimos a nrimos C IY Fin iY /* pijrse que est fuer del siD se inrement siempre independiente de que el nmero i se primo i a i C IY Fin wientrsY Fin; Algoritmo lea un nmero N y muestre por pantalla los nmeros primos menores que N. /* r resolver este lgoritmo es neesrio relizr un proximin desendenteF rtiendo del heho de que
y semos lulr si un nmero es o no primoD dmos por supuest est operin e intentmos resolver el prolemF o no BG

v proximin primer ser

Lee nY Para iaI hst nEI her Si i es un nmero primo entones Escribe iY Fin iY Fin rY
n vez tenemos l I proximin tn solo tenemos que introduir el digo que nos indi si un nmero es primo donde proedF gundo vemos funionesD veremos que est tre es trivilF iste lgoritmo difereni del nterior s los nmeros primos menores que xD mientrs que el otro s los x primeros primosF v difereni es l siguienteD pr xaS x primeros X IDPDQDSDU ` x X IDPDQDS BG QI

2.1. DIAGRAMA DE FLUJO


Programa xrimerosrimosY Entorno

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

// riles utilizds pr ver si el nmero i es primo Entero iD ontY Booleano esrimoY // rile que indir si es primo o no // riles utilizds pr ir prondo los nmeros Entero nY // interio iY helrd previmente Inicio Escribe sntrodue un nmeroX Y Lee nY Para iaI hst nEI /* i i es un numero primo entones BG esPrimo a trueY GG suponemos que el nmero es primo cont a PY GG impezmos dividiendo por P Mientras ont ` i y esrimo her Si n 7 ont entones esPrimo a flseY GG e h enontrdo un divisor Fin siY Fin mientrsY Si esrimo entones Escribe iY Fin iY Fin rY Fin; Algoritmo que calcula e imprime los nmeros perfectos menores que 1000. (Un nmero es perfecto si la suma de sus divisores, excepto l mismo, es igual al propio nmero.). /* r resolver este lgoritmo es neesrio relizr un proximin desendenteF hmos por supuest l
operin es numero perfeto que ms delnte desrrollremos v proximin primer ser

Para naI hst WWW her Si n es numero perfeto entones Escribe nY Fin iY Fin rY
ehor deemos desrrollr el suprolem es numero perfeto

sumaDivisores a HY Para iaI hst nEI her Si n 7 i a H entones sumaDivisores a sumhivisores C nY


QP

2.1. DIAGRAMA DE FLUJO


Fin siY Fin r Si sumhivisores a n entones // x es un nmero perfeto Fin siY

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

De nuevo unimos ls dos soluiones y y tenemos resuelto el prolem */ Programa xumeroserfetosY Entorno Entero n iD sumhivisoresY Inicio Para naI hst WWW her /* i n es numero perfeto entones BG sumaDivisores a HY Para iaI hst nEI her Si n 7 i a H entones sumaDivisores a sumhivisores C nY Fin siY Fin r Si sumhivisores a n entones // x es un nmero perfeto Escribe nY Fin iY Fin rY Fin; Algoritmo que evala un polinomio de grado N. Los datos de entrada son el valor de la variable y los coecientes. Programa ivluolinomioY Entorno Entero oefD grdoD xD iY Entero vlorolY Inicio isrie qrdo del polinomioX Y Lee grdoY Escribe lor de X Y Lee xY GG eumuldor en el que gurdremos el vlor del polinomio valorPol a HY Para iax hst H inremento EI Escribe sntrodue oe(iente de grdo @D iD AXY Lee oefY valorPol a vlorol C oef B x iY Fin prY Escribe il vlor del polinomio esX D vlorolY Fin
QQ

2.1. DIAGRAMA DE FLUJO


Programa lwultiplirY Entorno intero nD iY Inicio

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Algoritmo que lee un nmero entero positivo N e imprime su tabla de multiplicar.

Escribe sntrodue un nmeroX Y Lee nY Para iaI hst IH Escribe iD  x D nD  a D iBnY GG iguiente trmino de l Fin rY Fin Algoritmo que lee un nmero entero y positivo N y escribe la lista de sus divisores. Programa visthivisoresY Entorno intero nD iY Inicio Escribe sntrodue un nmeroX Y Lee nY Para iaI hst n Si n 7 i a H entones Escribe iY Fin iY Fin rY Fin Algoritmo que lee un nmero entero y positivo y calcula y escribe la suma de sus divisores. Programa umhivisoresY Entorno intero nD iY Entero sumY Inicio Escribe sntrodue un nmeroX Y Lee nY Suma=0; Para iaI hst n Si n 7 i a H entones Suma a sum C iY Fin iY Fin rY Escribe v sum de sus divisores esX D sumY Fin
QR

2.1. DIAGRAMA DE FLUJO

CAPTULO 2. ALGORITMOS Y DIAGRAMAS DE FLUJO

Algotimo que lee un nmero entero y positivo N y escribe los N primeros trminos de la sucesin de Fibonacci. La sucesin se caracteriza porque cada trmino es igual a la suma de sus dos anteriores, dandose por denicin el primero (0) y el segundo (1).
I a H Pa I n a nEI C nEP

Programa pioniY Entorno Entero nD nIY Entero sumY GG n C nI Entero nD ontY Inicio Escribe sntrodue un nmeroX Y Lee nY // gsos seD triviles Si n b H entones Escribe HY Fin siY Si n b I entones Escribe HY Fin siY // gomenzmos ule an_1 a HY an a IY /* vos dos sos nteriores y se hn visulizdoD por eso empezmos en Q BG Para ontaQ hst n Suma a n C nIY // glulmos el trmino siguiente isrie sumY // vos dos ltimos trminos vnzn un posiin an_1 a nY an a sumY Fin rY Fin

QS

Captulo 3

INTRODUCCION LENGUAJE C++


il lenguje g es un lenguje de progrmin de propsito generlD es uno de los ms rpidos y potentes que existenF il lenguje g h demostrdo ser un lenguje extremdmente e(zD hst omo pr rer sistems opertivosD omo vinux que fue redo en este lengujeF iste lenguje tiene ierts rteristisD uns de ells sonX IF is un lenguje gompildo e difereni de otros lengujesD que son lengujes interpretdosD los ules neesitn del digo fuente pr funionr @por ejemplo fsiAD g es un lenguje ompildo esto quiere deir que onvierte el digo fuente en un (hero ojetoD ste es enlzdo on ls lirers neesris dndo lugr un (hero ejeutleF PF is un lenguje de xivel medio isto quiere deir que omin elementos de lenguje de lto nivel on l funionlidd del lenguje ensmldorD o se que trj un nivel erno l omputdorD sin emrgoD nos ofree posiiliddes de onstruir estruturs de dtos equivlentes los que mnejn los lengujes de lto nivelF QF is un lenguje istruturdo isto quiere deir que permite rer proedimientos en loques dentro de otros proedimientosF RF is un lenguje ortle iste lenguje permite utilizr el mismo digo en diferentes equipos y sistems informtiosD o se que es independiente de l rquitetur de ulquier mquinF SF is un lenguje reltivmente pequeo iste es un lenguje eonmio en unto expresiones se re(ereD se puede desriir en poo espio y es fil y rpido de prenderF TF iene undni de yperdores y ipos de htos iste lenguje prtimente posee un operdor pr d un de ls posiles operiones en digo de mquinF ero l igul que otros lengujesD el g tiene sus desventjsX Egree de instruiones entrdGslidF Egree de instruiones de mnejo de den de rteresF Ev preedeni de los operdores di(ultn l omprensin de lguns expresionesF odo progrm en gD se ompone de un o ms funionesF v funin que se ejeut de primero es un funin llmd min@AD est funin es l ms importnte de todo progrm y es l que nun dee fltrF e est funin no se le puede mir el nomreF e su vez tod funin del progrm dee devolver un vlor l progrmD este vlor se indi on l plr reservd 4return4F gierts vees no queremos que l funin devuelv ningn vlor pr estos sos simplemente le indimos 4return H4 o esriimos l plr reservd 4void4 ntes del nomre de l funinF gomentrios n uen progrm dee ontener uenos omentriosF esi si lo retommos en el futuro no tendremos que desifrr lo que hiimos en el psdoF is un uen ostumre del progrmdor omentrer sus progrmsF n uen omentrio es quel que ni ofende el onoimiento del progrmdorD ni tmpoo dej impliito lo que se est hiendoF r poner un omentrio st on enerrr el texto entre los signos GB omentrio BGF ijemploF

main() {
QT

CAPTULO 3. INTRODUCCION LENGUAJE C++


/*este es un omentrioBG }

TIPOS DE DATOS
gundo usmos un progrm es muy importnte mnejr dtosF in g podemos lmenr los dtos en vrilesF il ontenido de ls vriles se puede ver o mir en ulquier momentoF ists vriles pueden ser de distintos tipos dependiendo del tipo de dto que quermos gurdr en ellsF xo es lo mismo gurdr un nomre que un nmeroF ry que reordr tmin que l memori del ordendor es limitdD s que undo gurdmos un dtoD deemos usr slo l memori neesri sdenti(dores on nomres ddos onstntesD vriles y funionesF il identi(dor est formdo por un seueni de un o ms letrsD dgitos y el rter de surydoF il primer rter de un identi(dor siempre dee ser un letr o el rter de surydoD en estos identi(dores @nomres de vrilesA se dee tener grn uiddoD y que el g he difereni entre mysuls y minsulsF or ejemploD wxD mx y we son tres identi(dores diferentesF gonstntes vs onstntes son un vlor que un vez (jdo por el ompildorD no mi durnte l ejeuin del progrmF il g indi l progrm que se trt de un onstnte usndo l diretiv 5de(neF or ejemploF 5de(ne pi QFIRIT ist line de(ne l vrile pi omo un onstnte on el vlor QFIRITD este vlor de ls onstntes puede ser un numero o ien un den de rteresF

Tipos de Datos
Tipo Int
in un vrile de este tipo se lmenn nmeros enteros @sin deimlesAF il rngo de vlores que dmite es EQPUTU QPUTUF gundo de(nimos un vrile lo que estmos hiendo es deirle l ompildor que nos reserve un zon de l memori pr lmenr dtos de tipo intF ry que deirle l ompildor que queremos rer un vrile y hy que indirle de qu tipoF i est delrin se he ntes del min@AD esto indi que l vrile ser un vrile glolD o se que se usr en todo el min@A y en el resto de funionesF wientrs que si se delr dentro del min@AD esto indi que l vrile ser un vrile lolD o seD slo pr l funin min@AF or ejemploF int vlorY min@AFFF ist expresin delr un vrile glol de nomre 4vlor4 y de tipo enteroF min@A { )ot vlorY } ist expresin delr un vrile lol de nomre 4vlor4 y de tipo )ot @om )otnteA

Tipo Char
vs vriles de tipo hr sirven pr lmenr rteresF vos rteres se lmenn en relidd omo nmeros del H l PSSF vos IPV primeros @H IPUA son el egss estndrF il resto es el egss extendido y depende del idiom y del ordendorF r delrr un vrile hr solo esriimosX 4hr nomreY4 y listoD y existe un vrile 4nomre4 que lmenr dtos de tipo rterF

Tipo Float
in este tipo de vrile podemos lmenr nmeros deimlesD no slo enteros omo en los nterioresF il rngo de posiles vlores es del QFR iEQV l QFR iCQVF r delrr un )otD de form similrD esriimosX 4)ot promY4 y on esto hemos delrdo un vrile de nomre 4prom4 que tendr un dto de tipo )ot o om )otnteF

QU

CAPTULO 3. INTRODUCCION LENGUAJE C++


Tipo double
in ls vriles tipo doule se lmenn nmeros relesD estos tiene el rngo de IFUWUTW iEQHV IFUWUTW iCQHVF el igul que ls nteriores pr delrrl esriimosX 4doule numY4 y tenemos un vrile de nomre 4num4 que eptr dtos tipo douleF wodi(dor nsigned iste modi(dor @que signi( sin signoA modi( el rngo de vlores que puede ontener un vrileF lo dmite vlores positivosF iste modi(dor se us sX 4unsigned int totlY4 esto delr un vrile de nomre 4totl4D de tipo entero positivoF

RESUMEN DE TIPOS DE DATOS

INTRODUCIR E IMPRIMIR DATOS


is usul que en un progrm el usurio introduz dtos por el teldoF r ello ontmos on vris posiiliddesX sr ls funiones de l iliote estndr es l ms usul de stsD unque no es l mejor es l ms fil de prender y es l que nosotros utilizremosF

scanf
el utilizr l plr snfD nosotros podemos her que el usurio introduz dtos por el teldoF il uso de snf es de l siguiente mnerX 4snf@4 7i4D 8numAY4 est ltim expresin indi l progrm que se dee soliitr un nmero entero @ 7iD es un espei(in de formto y esto lo puedes ver en l sein de operdores y mnipuldoresAD luego se indi el nomre de l vrile en l que se v gurdr el dtoD ste @el nomreA preedido por el signo 8D que indi l progrm l direin de st vrileF

QV

CAPTULO 3. INTRODUCCION LENGUAJE C++


printf
il uso de printfD es similr l de snfD lo que snf he pr leer un vrileD printf lo he pr imprimirlF he est mner podemos imprimir en pntllD y se un mensje o el vlor ontenido en un vrileF v sintxis de printf es sX 4printf@4 7d4D numAY4 est senteni lo que he es imprimir el vlor de l vrile num en el lugr donde pree el 4 7d4F il printf nos sirve tmin pr mndr imprimir en pntll un mensje sX 4printf@4fienvenidos l mundo de g4A4 esto impirmir en pntllX fienvenidos l mundo de g xotX r her uso de ests funionesD es neesrio inluir l diretiv o rhivo de eer stdioFhD esto se he de l siguiente mnerX 45inlude 4D s qued inluid ste rhivo y se podr proeder on el progrmF ehor hremos uso de lo que hemos prendido pr her un progrmF

# inlude stdioFh main() { int xY printf("Bienvenidos l mundo de gn4AY printf("Introduzca un vlor entero 4AY scanf(" %i", 8xAY printf("\nEl vlor que introdujo fue 7i4DxAY return HY }
ehor expliremos lo que heX rimero se delr un vrile de tipo entero y de nomre xF hespus se mnd imprimir en pntll el mensje 4fienvenidos l mundo de g4D el 4n4 que sigue es pr dr un slto de lne en el progrmD si no lo pusiermos el siguiente mensje preer pegdo l nteriorF vuego se imprime 4sntroduz un vlor entero4D pr que el usurio pued introduir un vlor por medio del teldo y se mnd gurdr este vlor l vrile ntes delrdF hespues se imprime un mensje y el vlor de l vrileF gomo pueden verD no es tn difilF v expresin 4return H4 es un instruinF gomo vernD tod funin dee retornr un vlorD omo no queremos que nuestr funin min devuelv ndD entones le deimos que retorne HF v slid del progrm nterior serX fienvenidos l mundo de g sntroduz un vlor entero PS @por ejemplo PSA il vlor que introdujo fue PS

getch y getche
i lo que queremos es que el usurio introduz un rter por el teldo usmos ls funiones geth y getheF ists espern que el usurio introduz un rter por el teldoF v difereni entre gethe y geth es que l primer s por pntll l tel que hemos pulsdo y l segund noF or ejemploF

# inlude stdioFh int min@A { char letrY printf( 4sntroduz un letrX 4 AY letra a gethe@AY printf( 4nv letr que introdujo esX 74D letr AY return HY }

QW

CAPTULO 3. INTRODUCCION LENGUAJE C++


v slid del progrm nterior serX sntroduz un letrXx v letr que introdujo esX x ehor hgmos el mismo progrm on geth@AX

# inlude stdioFh int min@A { char letrY printf( 4sntroduz un letrX 4 AY letra a geth@AY printf( 4nv letr que introdujo esX 74D letr AY return HY }
v slid del progrm nterior serX sntroduz un letrX v letr que introdujo esX x e dee tener en uentD unque no se hg en estos ejemplosD que el rhivo de eer stdioFh dee estr entre los signos `bD de lo ontrrio se produir un error en el progrmF

OPERADORES (MANIPULADORES)
vos operdores son smolos que indin omo son mnipuldos los dtosF istos operdores se pueden lsi(r enX ritmtiosD lgiosD relionlesD de signinD de mnejo de its y otrosF

Operadores de Asignacin
istos operdores son los que nos sirven pr drle @signrleA un vlor un vrileF iste vlor lo podemos teler mnulmente o ien puede ser el vlor de otr vrileF or ejemploF xaSY GBisto mete un vlor diretmenteBG xaY GBisto sign el vlor de otr vrileBG

Operadores Aritmticos
vos operdores ritmtios son quellos que sirven pr relizr operiones tles omo sumD restD divisin y multipliinF gon ellos podemos lulr el resto o mdulo de un divisin enterD o ien podemos inrementr o disminuir el vlor de ls vrilesF or ejemploF

# inlude stdioFh main() { int xaUY int yY int zaPY GBgomo vern es posile delrr e iniir l vrile l mismo tiempoBG printf("El vlor de x esX 7in4D xAY y=x+z; GBesign el vlor de un sumBG x++; GBsnrement el vlor de x en unoBG printf("Los vlores de xD yD z son 7iD 7iD 7i4D xDyDzAY return HY }
v slid este progrm serX il vlor de x esX U vos vlores de xD yD z son VD WD P RH

CAPTULO 3. INTRODUCCION LENGUAJE C++


Operadores Lgicos
istos operdores son los que nos permiten her ompriones entre dos o ms vrilesF istos operdores son los que nos permitirn deidir en un senteni ondiionl que veremos ms delnteF or ejemploF x`U88taaRY GBist lne devuelve ID si x es menor que U 4y4 t es igul RBG

Operadores Binarios
istos permiten ver el ontenido de ls vriles omo vlores inriosF tiles en el eso its individules en memoriD tles omo l memori de pntll pr mostrr gr(osF vs funiones de estos operdores se desrien en l tlD y se oupn similrmente en los progrmsF

Operador Sizeof
ixiste un operdor muy utilizdo que es el sizeofF iste operdor nos devuelve el tmo en ytes de un vrileF he est mner no tenemos que preouprnos en reordr o lulr unto oupF edems el tmo de un vrile mi de un ompildor otroD es l mejor form de segurrseF e us poniendo el nomre de l vrile despus de sizeof y seprdo de un espioF

Por ejemploF int min@A { oat vrileY printf( 4mo de l vrileX 7fn4D sizeof vrile AY }
e dee tener grn uiddo l grupr estos operdoresD pues uns iones se llevn o ntes que otrsD esto depende del nivel de preedeni que teng el operdorF r esto se present un tlD en l que se muestr en orden desendente l prioridd de los mismosF

OPERADORES DE ASIGNACION
yperdor C E B G 7 CC ! yperin um dos numerosD pueden ser enteros o reles est dos numerosD pueden ser enteros o reles wultipli dos numerosD pueden ser enteros o reles hivisinD el resultdo depende de los tipos de dtos wdulo o resto de un divisin enterD los operndos tienen que ser enteros snrement en uno l vrile herement en uno l vrile

OPERADORES LOGICOS
yperdor 88 || 3 yperin exh D en espol F h omo resultdo el vlor lgio ID si mos operdores son distintos de ero yD en espol yF il resultdo es eroD si mos operndos son ero xyD en espol xyF il resultdo es ero si el operndo tiene un vlor distinto de ero

OPERADORES DE RELACION
yperdor ` b `a ba aa 3a yperin rimer operndo rimer operndo rimer operndo rimer operndo rimer operndo rimer operndo menor que el segundo myour que el segundo menor o igul que el segundo myor o igul que el segundo igul que el segundo distinto del segundo RI

CAPTULO 3. INTRODUCCION LENGUAJE C++


OPERADORES BINARIOS
yperdor 8 3 ~ b#b `#` yperin exhD ompr los its dos dosD si mos son I el resultdo es I yD ompr los its dos dosD si lguno de ellos es ID se otien I yD ompr los its dos dosD si son distintos el resultdo es I gomplementoD onvierte los eros uno y los unos ero hesplzmiento l derehD esto equivle dividir por P hesplzmiento l izquierdD esto equivle multiplir por P

OPERADORES DE ASIGNACION
yperdor a Ba Ga 7a Ca Ea `#`a b#ba 8a 3a a yperin esignin simple wultipliin ms signin hivisin ms signin wdulo ms signin um ms signin est ms signin hesplzmiento l izquierd ms signin hesplzmiento l dereh ms signin yperin exh sore its ms signin yperin y sore its ms signin yperin y sore its ms signin

NIVELES DE PRECEDENCIA
yperdor @A ~ 3 8 CC ! B G7 CE `#` b#b ` `a b ba aa 3a 3 88 || a Ba Ga 7a Ca Ea 8a a 3a `#`a b#ba

SENTENCIAS Y BUCLES
rst hor los progrms que hemos visto ern linelesF y se que ls instruiones se ejeutn en orden y un sol vezF ero result que muhs vees no es esto lo que queremos que ourrF vo que nos suele interesr es que dependiendo de los vlores de los dtos se ejeuten uns instruiones y no otrsF y tmin puede que quermos repetir uns instruiones un nmero determindo de veesF r esto estn ls senteni de ontrol de )ujoF

Bucles
vos ules nos ofreen l soluin undo queremos repetir un tre un nmero determindo de veesF upongmos que queremos esriir IHH vees l plr fienvenidoF gon lo que semosD tendrmos que esriir IHH vees l expresin 4printf@4fienvenidon4AY4D sin emrgo un ilo for nos filitr en grnde est treF istos ules pueden serX por @rAD hile @wientrsAD ho while@rer mientrsAF

El Bucle For:
iste ule nos permite her un nmero (nito de tresD unts vees neesitemosF v sintxis del for es l siguienteX RP

CAPTULO 3. INTRODUCCION LENGUAJE C++


for([valor inilYondiinYinrementoA { ...sentencias ...sentencias }
v prte del vlor iniilD es el vlor on el que empiez l vrile ontdorD o l vrile que nos v deir undo slirF v ondiinD es l que nos determinr el nmero de vees que se llevrn o ls instruiones que siguenF ists sentenis se relizrn mientrs l ondiin estipuld se umplF il inrementoD es el numero en que vmos inrementr l vrile ontdorF

El Bucle While:
v sintxis del ule while es l siguienteX

while @ ondiin A { bloque de instruiones ejeutr }


v ondiin de este uleD l igul que el forD es l que indi unts vees se ejeutrn ls instruionesF ists @ls instruionesA se ejeutrn mientrs l ondiin estipuld se umplF

El Bucle Do While
v sintxis de este ule esX

do { instrucciones ejeutr } while @ ondiin AY


in este uleDls instruiones se llevn o l menos un vezD puesto que l ondiin se evl l (nl del mismoY difereni del while o el forD que si l ondiin iniil no se umpleD entones ls instruiones no se umplen ni un sol vezF v ondiin es similr ls ntes desritsF

Sentencias Condicionales
rst qu hemos visto mo podemos repetir un onjunto de instruiones ls vees que deseemosF ero hor vmos ver mo podemos ontrolr totlmente el )ujo de un progrmF hependiendo de los vlores de lgun vrile se tomrn uns iones u otrsF

Sentencia if
v plr if signi( si @ondiionlAD su sintxis es omo sigueX

if @ ondiin A { instrucciones ejeutr }


RQ

CAPTULO 3. INTRODUCCION LENGUAJE C++


gundo se umple l ondiin entre prntesis se ejeut el loque inmeditmente siguiente l if @instruiones ejeutrAF or ejemploF

# inlude stdioFh main() { int xaPY if(x==2) printf("X es P4AY return HY }


il progrm nterior nliz l ondiin de que si x es igul dosD entones se imprime el mensje 4 es P4F

Sentencia if-else
in el ifD si l ondiin no se umplD entones ls instruiones no se ejeutn y el progrm (nliz o segu on ls siguientes instruionesF in el ifEelseD @siEsinoA si no se umple l ondiin entones se relizrn otrs instruionesF u sintxis es l siguienteX

if @ ondiin A { bloque que se ejeut si se umple l ondiin } else { bloque que se ejeut si no se umple l ondiin }
or ejemploF

int min@A { int Y printf( 4sntrodue un nmero 4 AY scanf( 4 7i4D 8 AY if @ aaV A { printf @ 4il nmero que introdujo es ohoFn4 AY } else { printf @ 4il nmero que introdujo no es oho4n4 AY } }
RR

CAPTULO 3. INTRODUCCION LENGUAJE C++


in este ejemplo se mnd soliitr un nmeroD si el nmero introduido es ohoD entones mnd un mensje positivD mientrs que si el numero no es oho mnd un mensje negtivoF e pueden grupr vrios ifD o se que si se umple unoD luego se pregunt otr ondiin y s suesivmenteF e esto se le llm if niddosF e l vez es posile nlizr ms de un ondiin siempre y undo ests vyn ligds on su respetivo operdorF or ejemploF

int min@A { int Y printf( 4sntrodue un nmero 4 AY scanf( 4 7i4D 8 AY if @ `IH A { printf @ 4il nmero introduido er menor de IHFn4 AY } else if @ bIH 88 `IHH A { printf @ 4il nmero est entre IH y IHH4n4 AY } else if @ bIHH A { printf( 4il nmero es myor que IHHn4 AY }
in este ejemplo lo que se he es pedir un numeroD se nliz un ondiin y si se umple se mnd un mensjeD sinoD se nliz otr ondiin y se mnd imprimir un mensje pr d soF

Sentencia switch
v senteni swithD nliz un ondiin y dependiendo del vlor esoge entre vris opiones pr relizr distints instruiones y si l opin no est estleidD simplemente ejeut un opin por defetoF v sintxis pr el swith esX

switch @ vrile A { case opin IX cdigo ejeutr si l vrile tiene el vlor de l opin I break; case opin PX cdigo ejeutr si l vrile tiene el vlor de l opin P break; default: cdigo que se ejeut si l vrile tiene un vlor distinto los nteriores break; }
ehor miremosD el swith nliz el vlor de 4vrile4 luego si vrile tiene el vlor 4opion I4 entones se ejeutn ls instruiones que siguenD y s suesivmenteF is importnte poner l (nl de d grupo de instruiones l plr 4rek4D l que indi l progrm que h terminn ls sentenisF e pueden poner unts opiones se desee y l (nl es reomendle @unque no exigidoA que se pong un grupo de instruiones que se ejeuten si l vrile tom un vlor que no se h de(nidoF ist ltim se pone despues de l plr 4defult4F RS

CAPTULO 3. INTRODUCCION LENGUAJE C++


Sentencia goto
v senteni goto @ir A nos permite her un slto l prte del progrm que deseemosF in el progrm podemos poner etiquetsD ests etiquets no se ejeutnF is omo poner un nomre un prte del progrmF ists etiquets son ls que nos sirven pr indir l senteni goto dnde tiene que sltrF or ejemploF

int min@A { printf( 4vne In4 AY goto lineQY GB ve deimos l goto que usque l etiquet lineQ BG printf( 4vne Pn4 AY linea3: GB ist es l etiquet BG printf( 4vne Qn4 AY }
gomo resultdo tenemosX vne I vne Q y se que el printf de l line P no se ejeutD puesto que lo sltmos on el gotoF

ARREGLOS O MATRICES
n rry @rregloA es un onjunto de vriles del mismo tipoD ls ules se diferenin entre s por su posiin @uiinAF r ilustrrloD supongmos un tl dividid en elds y d eld es un vrile en prtiulrD por supuesto que tods ls elds son del mismo tipo y perteneen l mism tlF vos rreglos se delrn sX tipodto nomrerreglo tmoY il tipo de dtoD puede ser uno de los de(nidos nteriormenteF il nomre del rreglo es ulquier identi(dor vlido y el tmo es el tmo que desemos que teng el rregloD este siempre dee ir entre orhetesF vos dtos del rreglo empiezn introduirse por el dto HF or ejemploF int tempPRY GB gon esto tenemos delrds PR vriles de tipo enteroBG r poder introduir los dtos en un rreglo deemos reorrerloD o se ir d eld del rreglo y h esriir el dtoF r esto se us freuentement un ilo for de l siguiente mnerX

for( horaHY hor`PRY horCC A { printf( 4empertur de ls 7iX 4D hor AY scanf( 4 7i4D 8temphor AY media Ca temphorY }
vos rreglos l igul que ls otrs vriles se pueden iniilizrD pr herlo se prosigue de l siguiente mnerX int tempertursPR a { ISD IVD PHD PQD PPD PRD PPD PSD PTD PSD PRD PPD PID PHD IVD IUD ITD IUD ISD IRD IRD IRD IQD IP }Y he est mner hemos iniilizdo el rreglo on los vlores orrespondientesF esi temperturH tiene el vlor ISD temperturI tiene el vlor IV y s suesivmenteF unteros erreglos equ tenemos otro de los importntes usos de los punterosD los punteros rrysF istos estn ntimmente reliondosF r que un puntero punte un rry se puede her de dos formsD un es puntndo l primer elemento del rryX or ejemploF int BpunteroY int tempertursPRY puntero a 8tempertursHY RT

CAPTULO 3. INTRODUCCION LENGUAJE C++


ytr form equivlenteD pero muho ms usd esX puntero a tempertursY ehor vmos ver mo eder l resto de los elementosF r ello empezmos por mo funion un rryX n rry se gurd en posiiones seguids en memoriD de tl form que el segundo elemento v inmeditmente despus del primero en l memoriF ijemploF

#include int min@A { int iY int tempPRY for( iaHY i`PRY iCC A { printf( 4v direin del elemento 7i es 7pFn4D iD 8tempi AY } }
xotX euerd que 7p sirve pr imprimir en pntll l direin de un vrile en hexdeimlF il resultdo esX v direin del elemento H es RRQHF v direin del elemento I es RRQRF v direin del elemento P es RRQVF v direin del elemento Q es RRQF FFF v direin del elemento PI es RRVRF v direin del elemento PP es RRVVF v direin del elemento PQ es RRV so de un erreglo un funin in g no podemos psr un rry entero un funinF vo que tenemos que her es psr un puntero l rryF gon este puntero podemos reorrer el rryD sX

int sumr@ int Bm A { int sumD iY suma a HY for( iaHY i`IHY iCC A { suma Ca miY } return sumY } int min@A { int ontdorY int mtrizIH a { IHD IID IQD IHD IRD WD IHD IVD IHD IH }Y for( ontdoraHY ontdor`IHY ontdorCC A printf( 4 7Qin4D mtrizontdor AY printf( 4C "!n4 AY printf( 4 7Qi4D sumr@ mtriz A AY }
iste progrm tiene lgun osill diionl omo que muestr tod l mtriz en un olumnF edems se us pr imprimir los nmeros 7QiF il Q indi que se tienen que liner los nmeros l derehD s qued ms elegnteF gomo he indido no se ps el rryD sino un puntero ese rryF RU

CAPTULO 3. INTRODUCCION LENGUAJE C++

STRINGS (CADENAS DE CARACTERES)


mos ver por (n mo mnejr texto on gD hst hor slo smos mo mostrrlo por pntllF r empezr dir que en g no existe un tipo string omo en otros lengujesF xo existe un tipo de dtos pr lmenr textoD se utilizn rrys de hrsF punionn igul que los dems rrys on l difereni que hor jugmos on letrs en vez de on nmerosF e les llm densD strings o tirs de rteresF e prtir de hor les llmremos densF r delrr un den se he omo un rryX hr textoPHY el igul que en los rrys no podemos meter ms de PH elementos en l denF

Por ejemploF int min@A { char nomrePHY printf( 4sntroduz su nomre @PH letrs mximoAX 4 AY scanf( 4 7s4D nomre AY printf( 4nil nomre que h esrito esX 7sn4D nomre AY }
emos oss urioss omo por ejemplo que en el snf no se us el smolo 8F xo he flt porque es un rryD y y semos que esriir el nomre del rry es equivlente poner 8nomreHF min puede llmr l tenin l form de imprimir el rryF gon slo usr 7s y se imprime todo el rryF veremos esto ms delnteF

Inicializacin de un gden int min@A { char nomre a 4qork4Y printf( 4extoX 7sn4D nomre AY printf( 4mo de l denX 7i ytesn4D sizeof nomre AY }
gomo vemos l iniilizin es preid l de un rregloD solo que qui se esrie tod l frse pr iniilizrlF gundo iniilizmos un den el g utomtimente introdue omo ultimo elemento el 4H4 que indi (n de l denF isto sirve pr que l hor de imprimir el gD sep undo dee prr de imprimirF is importnte no olvidr que l longitud de un den es l longitud del texto ms el smolo de (n de denF or eso undo de(nmos un den tenemos que reservrle un espio diionlF

Funciones de Manejo de Cadenas


ixisten vris funiones pr el mnejo de dens de rteres o stringsF r poder utilizr ests funiones es neesrio inluir l funin de iliote stringFhF ists funiones sonX strlenD strpyD strtD sprintfD strmpF

strlen
u sintxis esX strlen@hr BsA ist funin nos devuelve el nmero de rteres que tiene l den @sin ontr el 9H9AF i no utilizrmos est funinD pr poder ser untos elementos tiene un den tendrmos que reorrerl on un punteroF

RV

CAPTULO 3. INTRODUCCION LENGUAJE C++


strcpy
u sintxis esX hr Bstrpy@hr BdenID onst hr BdenPAY ist funin opi el ontenido de denP en denIF denP puede ser un vrile o un den diret @por ejemplo 4hol4AF heemos tener uiddo de que l den destino @denIA teng espio su(iente pr lergr l den origen @denPAF

strcat
u sintxis esF hr Bstrt@hr BdenID onst hr BdenPAY ist funin opi l denP l (nl de l denIF gomo siempre tenemos que segurrnos que l vrile en l que metemos ls dems dens teng el tmo su(ienteF

sprintf
u sintxis esX int sprintf@hr BdestinoD onst hr BformtD FFFAY punion de mner similr printfD pero en vez de mostrr el texto en l pntll lo gurd en un vrile @destinoAF il vlor que devuelve @intA es el nmero de rteres gurddos en l vrile destinoF

strcmp
u sintxis esX int strmp@onst hr BdenID onst hr BdenPAY gompr denI y denPF i son igules devuelve HF n nmero negtivo si denI v ntes que denP y un nmero positivo si es l revsF

Ejemplo. #include stdioFh #include stringFh int min@A { char nomreIa4qork4Y char nomrePa4edro4Y char nomreompletoSHY char nomrea4qork4Y char pellidoa4rruti4Y sprintf( nomreompletoD 4 7s 7s4D nomreD pellido AY printf( 4il nomre ompleto esX 7sFn4D nomreompleto AY printf( 4 7i4D strmp@nomreIDnomrePAAY }
in este ejemplo vemos lrmente el uso de ls funiones ntes meniondsD pr l slid es mejor prorloF intrd de gdens por el eldo

scanf
remos visto en ptulos nteriores el uso de snf pr nmerosD hor es el momento de ver su uso on densF nf lmen en memori @en un u'erA lo que vmos esriiendoF gundo pulsmos ixi lo nlizD omprue si el formto es orreto y por ltimo lo mete en l vrile que le indimosF nf tom un plr omo denF s los espios pr seprr vrilesF esi si introduimos un plrD dmos espio y esriimos otrD snf solo lmenr l prime plrF is importnte siempre segurrse de que no vmos lmenr en den ms letrs de ls que enF r ello deemos limitr el nmero de letrs que le v introduir snfF RW

CAPTULO 3. INTRODUCCION LENGUAJE C++


gets
ist funin nos permite introduir frses entersD inluyendo espiosF u sintxis esX hr Bgets@hr Bu'erAY elmen lo que vmos telendo en l vrile u'er hst que pulsmos ixiF i se h lmendo lgn rter en u'er le de un 9H9 l (nl y devuelve un puntero su direinF i no se h lmendo ninguno devuelve un puntero xvvF

Por ejemploF int min@A { char denQHY char BpY printf( 4isrie un plrX 4 AY ush( stdout AY p a gets@ den AY if @pA printf@ 4re gurddoX 4 7s4 n4D den AY else printf@ 4xo he gurddo nd3n4 AY }
u son los u'erc

#include stdioFh int min@A { char hY char nomrePHD apellido[20],telefono[10]; printf( 4isrie tu nomreX 4 AY scanf( 4 7eEs4D nomre AY printf( 4vo que reogemos del snf esX 7sn4D nomre AY printf( 4vo que h queddo en el u'erX 4 AY while( @hagethr@AA3a9n9 A printf( 4 74D h AY }
in este ejemplo el eE lo que he es que solmente lee ls letrs mysulsF l slid serX isrie tu nomreX qyk vo que reogemos del snf esX qy vo que h queddo en el u'erX k

Arreglos de Cadenas
n rry de dens puede servirnos pr grupr un serie de mensjesF or ejemplo todos los mensjes de error de un progrmF vuego pr eder d mensje st on usr su nmeroF or ejemploF

#include stdioFh #include stringFh int error@ int errnum A {


SH

CAPTULO 3. INTRODUCCION LENGUAJE C++


char Berrores a { "No se h produido ningn error4D "No hy su(iente memori4D "No hy espio en diso4D "Me he nsdo de trjr4 }; printf( 4irror nmero 7iX 7sFn4D errnumD erroreserrnum AY exit( EI AY } int min@A { error( P AY }
v slid este progrm serX irror nmero PX xo hy espio en disoF n rry de dens es en relidd un rry de punteros densF il primer elemento de l den @4xo se h produido ningn error4A tiene un espio reservdo en memori y erroresH punt ese espioF

FUNCIONES
vs funiones son de un grn utilidd en los progrmsF xos yudn que sen ms legiles y ms ortosF gon ellos estruturmos mejor los progrmsF n funin sirve pr relizr tres onrets y simpli(r el progrmF xos sirve pr evitr tener que esriir el mismo digo vris veesF hemos visto en el urso lguns funiones omo printfD gotoxyD snf y lrsrF ists funiones estn de(nids en un iliote @l iliote estndr de gAF xo tenemos que preouprnos de ell porque el ompildor se enrg de ell utomtimenteF in emrgo nosotros tmin podemos de(nir nuestrs propis funionesF os vees se ve un progrm un poo omplejo que no use funionesF n de ellsD que usmos siempreD es l funin minF n funin tiene l siguiente estruturX tipodevrile nomredelfunin@ rgumentos A { de(niin de vrilesY uerpo de l funinY return HY } il nomre de l funin dee ser un nomre de identi(dor vlidoF iste se utiliz pr llmr l funin dentro del progrmF il tipodevrileX gundo un funin se ejeut y termin dee devolver un vlorF iste vlor puede ser ulquier de los tipos de vriles que hemos visto en el ptulo de ipos de dtos @intD hrD )otD douleAD o un tipo de dto de(nido por el usurioF il vlor que devuelve l funin suele ser el resultdo de ls operiones que se relizn en l funinD o si hn tenido exito o noF equi tmin podemos usr el tipo voidD el ul nos permite que podmos devolver ulquier tipo de vrile o ningunF he(niin de vrilesX hentro de l funin podemos de(nir vriles que slo tendrn vlidez dentro de l propi funinF i delrmos un vrile en un funin no podemos usrl en otrF guerpo de l funinX equ es donde v el digo de l funinF eturnX entes hemos indido que l funin devuelve un vlorF v senteni return se us pr estoF il dto que se pone despues de return es el dto que se devuelveF uede ser un onstnte o un vrileF hee ser del mismo tipo que tipodevrileF ergumentosX istos son vriles que se psn omo dtos un funinF heen ir seprdos por un omF gd vrile dee ir on su tipo de vrileF vs funiones deen de(nirse ntes de ser llmdsF ijemploF

#include stdioFh #include onioFh


SI

CAPTULO 3. INTRODUCCION LENGUAJE C++


void preprpntll@A GB xo se dee poner punto y om qu BG { clrscr(); printf( 4v pntll est limpin4 AY return; GB xo he flt devolver ningn vlorD muh gente ni siquier pone este return BG } int min@A { prepara_pantalla();/* vlmmos l funin BG }
iste ejemplo unque no devuelve ningn vlorD nos muestr omo se de(ne y llm un funinF ijemploF

#include stdio #include onioFh int ompr@ int D int A GB wetemos los prmetros y l funin BG { int myorY GB ist funin de(ne su propi vrileD est vrile slo se puede usr qu BG if @ b A mayor a Y else mayor a Y return myorY } int min@A { int numID numPY int resultdoY printf( 4sntroduz dos nmerosX 4 AY scanf( 4 7i 7i4D numID numP AY resultado a ompr@ numID numP AYGB eogemos el vlor que devuelve l funin en resultdo BG printf( 4il myor de los dos es 7in4D resultdo AY }
in este ejemplo vemos l de(niin y llmd de l funinD dems que podemos ver que devuelve un vlorF iste vlor es l omprin de dos numerosF vs vriles ls podemos de(nir en ulquier prte del progrmD unque es reomendle que se de(nn ntes de que se llmenF ry quienesD primero ls delrn l iniio del progrm y l (nl del mismo ls de(nenD pero esto se puede her de l mner que nosotros querrmosF

SP

CAPTULO 3. INTRODUCCION LENGUAJE C++


Duracin de una Variable
gundo de(nimos un vrile dentro de un funinD es vrile slo es vlid dentro de l funinF i de(nimos un vrile dentro de min slo podremos usrl dentro de minF i por el ontrrio l de(nimos omo vrile glolD ntes de ls funionesD se puede usr en tods ls funionesF odemos rer un vrile glol y en un funin un vrile lol on el mismo nomreF hentro de l funin undo llmmos es vrile llmmos l lolD no l glolF isto no d errores pero puede rer onfusin l progrmr y l nlizr el digoF

Argumentos de un Programa
semos mo psr rgumentos un funinF v funin min tmin ept rgumentosF in emrgo slo se le pueden psr dos rgumentosF emos ules son y mo se delrnX int min@ int rgD hr Brgv A il primer rgumento es rg @rgument ountAF is de tipo int e indi el nmero de rgumentos que se le hn psdo l progrmF il segundo es rgv @rgument vluesAF is un rry de strings @o puntero puntero hrAF in el se lmenn los prmetrosF xormlmente @omo siempre depende del ompildorA el primer elemento @rgvHA es el nomre del progrm on su rutF il segundo @rgvIA es el primer prmetroD el terero @rgvPA el segundo prmetro y s hst el (nlF e los rgumentos de min se les suele llmr siempre sD no es neesrio pero es ostumreF ijemploF 5inlude stdioFh int min@int rgDhr BrgvA { int iY for@ iaH Y i printf@ 4ergumento 7iX 7sn4D iD rgvi AY } i llmmos l progrm rgumentosF y lo ompilmos @rgumentosFexeA podrmos teler 4Xprogrmsb rgumentos hol migos4 y tendrmos omo slidX ergumento HX XprogrmsrgumentosFexe ergumento IX hol ergumento PX migos

ESTRUCTURAS
upongmos que queremos her un gend on los nmeros de telfono de nuestros migosF xeesitrmos un rry de gdens pr lmenr sus nomresD otro pr sus pellidos y otro pr sus nmeros de telfonoF isto puede her que el progrm quede desordendo y difil de seguirF qu es donde vienen en nuestro uxilio ls estrutursF r de(nir un estrutur usmos el siguiente formtoX strut nomredelestrutur { mpos de estruturY }Y or ejemploF strut liente { hr nomreQHY hr pellidoRHY hr telefonoIHY hr eddY }Y gon esto hemos redo un estrutur llmd liente l que lmen R dtos de tipo den de rteres que sonX el nomre y el pellido del lienteD telefono y edd del mismoF ehor que tenemos l estrutur de(nidD es neesrio delrr un vrile del tipo de l estruturD esto se he sX strut liente lienteIY ehor tenemos un vrile del tipo lienteF r eder d uno de sus miemros usmo un punto 4F4F es pr eder l nomre simplemente esriimos 4lienteIFnomre4F ijemploF SQ

CAPTULO 3. INTRODUCCION LENGUAJE C++


# inlude stdioFh struct migo { GB he(nimos l estrutur estruturmigo BG char char char char }; struct migo migoY int min@A { printf( 4isrie el nomre del migoX 4 AY ush( stdout AY scanf( 4 7s4D 8migoFnomre AY printf( 4isrie el pellido del migoX 4 AY ush( stdout AY scanf( 4 7s4D 8migoFpellido AY printf( 4isrie el nmero de telfono del migoX 4 AY ush( stdout AY scanf( 4 7s4D 8migoFtelefono AY printf( 4il migo 7s 7s tiene el nmeroX 7sFn4D migoFnomreD migoFpellidoD migoFtelefono AY }
in este ejemplo se puede usr un getsD en vez del snfD deido que lguien puede introduir un nomre seprdo por espiosD el ul no ser eptdo por snfF nomreQHY pellidoRHY telefonoIHY eddY

Arreglos de Estructuras
upongmos hor que queremos gurdr l informin de vrios lientesF gon un vrile de estrutur slo podemos gurdr los dtos de unoF r mnejr los dtos de ms gente @l onjunto de todos los dtos de d person se les llm iqsyA neesitmos delrr rrys de estrutursF isto se he de l siguiente mnerX strut liente lienteIxwiyiviwixyY ehor pr eder un elemento determindo simplemente hemos lienteIHFnomreF ijemploF

#include stdioFh #dene iviwixy Q struct estruturmigo { char nomreQHY char pellidoRHY char telefonoIHY int eddY }; struct estruturmigo migoiviwixyY
SR

CAPTULO 3. INTRODUCCION LENGUAJE C++


int min@A { int nummigoY for( nummigoaHY nummigo { printf( 4nhtos del migo nmero 7iXn4D nummigoCI AY printf( 4xomreX 4 AY ush( stdout AY gets(amigo[num_amigo].nombre); printf( 4epellidoX 4 AY ush( stdout AY gets(amigo[num_amigo].apellido); printf( 4elfonoX 4 AY ush( stdout AY gets(amigo[num_amigo].telefono); printf( 4iddX 4 AY ush( stdout AY scanf( 4 7i4D 8migonummigoFedd AY while(getchar()!='\n'); } /* ehor imprimimos sus dtos BG for( nummigoaHY nummigo { printf( 4il migo 7s 4D migonummigoFnomre AY printf( 4 7s tiene 4D migonummigoFpellido AY printf( 4 7i os 4D migonummigoFedd AY printf( 4y su telfono es el 7sFn4 D migonummigoFtelefono AY } }
in este ejemplo deemos introduir los dtos de Q migos y podemos ver l mner que se imprimen los dtosF

Inicializacin de una estructura


e ls estruturs se les pueden dr vlores iniiles de mner nlog omo hmos on los rrysF rimero tenemos que de(nir l estrutur y luego undo delrmos un vrile omo estrutur le dmos el vlor iniil que quermosF ijemploF strut liente lienteI a { 4edro4D 4vopez4D 4PTHEHRVQ4D QH }Y in lo nio que se dee tener uiddo es que se dee seguir el orden de l delrin de los miemros de l estruturF es que si de delr primero el pellidoD se deer poner primero el pellidoF he form nlog se puede iniilizr un rreglo de estrutursF iempre teniendo en uent el orden de ls mismsF ijemploF SS

CAPTULO 3. INTRODUCCION LENGUAJE C++


strut liente lienteI a { 4tun4D 4vopez4D 4PPHEWTQP4D QHD 4edro4D 4qonzlez4D 4SPHEIPSV4D RPD 4en4D 4wrtinez4D 4UIQESTWR4D PH }Y in este ejemplo d lne es un registroF gomo sued en los rrys si dmos vlores iniiles l rry de estruturs no he flt indir untos elementos v tenerF in este so l mtriz tiene Q elementosD que son los que le hemos psdoF

Punteros a Estructuras
gmo noD tmin se pueden usr punteros on estrutursF mos ver omo funion esto de los punteros on estrutursF rimero de todo hy que de(nir l estrutur de igul form que hmos ntesF v difereni est en que l delr l vrile de tipo estrutur deemos ponerle el operdor 9B9 pr indirle que es un punteroF is importnte reordr que un puntero no dee puntr un lugr ulquierD deemos drle un direin vlid donde puntrF xo podemos por ejemplo rer un puntero estrutur y meter los dtos diretmente medinte ese punteroD no semos dnde punt el puntero y los dtos se lmenrn en un lugr ulquierF ijemploF

#include stdioFh struct estruturmigo { char nomreQHY char pellidoRHY char telefonoIHY int eddY }; struct estruturmigo migo a { "Juanjo", "Lopez", "592-0483", 30 }; struct estruturmigo BpmigoY int min@A { p_amigo a 8migoY printf( 4 7s tiene 4D pmigoEbpellido AY printf( 4 7i os 4D pmigoEbedd AY printf( 4y su telfono es el 7sFn4 D pmigoEbtelefono AY }
ehor que de(nimos el puntero y le indimos que punte migoD podemos esr los dtos de l estrutur medinte el punteroF v difereni es que hor no se es on 4F4D sino que hor se utiliz 4Eb4F eesndo estos dtos podemos leer e imprimirlosF

ST

CAPTULO 3. INTRODUCCION LENGUAJE C++


Punteros a Arreglos de Estructuras
or supuesto tmin podemos usr punteros on rrys de estrutursF v form de trjr es l mismD lo nio que tenemos que her es segurrnos que el puntero iniilmente punte l primer elementoD luego sltr l siguiente hst llegr l ltimoF ijemploF

# inlude stdioFh # de(ne iviwixy Q struct migo { char nomreQHY char pellidoRHY char telefonoIHY int eddY }; struct migo migo a { "Juan", 4vopez4D 4QHSERQRP4D QHD "Marcos", 4qomez4D 4TQSERVPQ4D RPD "Ana", 4wrtinez4D 4UIQESTWR4D PH }; struct migo BpmigoY int min@A { int nummigoY p_amigo a migoY GB puntmos l primer elemento del rry BG /* ehor imprimimos sus dtos BG for( nummigoaHY nummigo { printf( 4il migo 7s 4D pmigoEbnomre AY printf( 4 7s tiene 4D pmigoEbpellido AY printf( 4 7i os 4D pmigoEbedd AY printf( 4y su telfono es el 7sFn4 D pmigoEbtelefono AY /* y hor sltmos l siguiente elemento BG pmigoCCY } }
ehor que semos esr los dtos de un rreglo de estruturs por medio de punterosD entones podemos introduir dtos y tmin mndrlos imprimirF

Paso de estructuras a Funciones


vs estruturs se pueden psr diretmente un funin igul que hmos on ls vrilesF or supuesto en l de(niin de l funin deemos indir el tipo de rgumento que usmosD sX int nomrefunin @ strut nomredelestrutur nomredel vrileestrutur A mien podemos psr solo los miemros de l estrutur l funinF SU

CAPTULO 3. INTRODUCCION LENGUAJE C++


Estructuras Anidadas
is posile rer estruturs que tengn omo miemros otrs estrutursF isto tiene diverss utiliddesD por ejemplo tener l estrutur de dtos ms ordendF or ejemploD si queremos un estrutur de lientes de un no on sus dtos y tmien l feh del ltimo pgoD se podr her de l siguiente mnerX strut ultimopgo{ int diY int mesY int oY }Y hor l estrutur totlD inluyendo l de l feh del ltimo pgoF strut liente{ hr nomrePSY hr pellidoPSY )ot sldoY strut ultimopgo pgoY } lienteIY he est mner tenemos un vrile 4lienteI4 del tipo liente on un estrutur niddF

PUNTEROS
vos punteros son un de ls ms potentes rterstis de gD pero l vez uno de sus myores peligrosF vos punteros nos permites eder diretmente ulquier prte de l memoriF isto d los progrms g un grn poteniF in emrgo son un fuente ilimitd de erroresF n error usndo un puntero puede loquer el sistem y vees puede ser difil detetrloF ytros lengujes no nos dejn usr punteros pr evitr estos prolemsD pero l vez nos quitn prte del ontrol que tenemos en gF

Memoria
gundo hlmos de memori nos estmos re(riendo l memori ew del ordendorF on uns pstills que se onetn l pl se y nd tienen que ver on el diso duroF il diso duro gurd los dtos permnentemente @hst que se rompeA y l informin se lmen omo rhivosF xosotros podemos deirle l ordendor undo grrD orrrD rir un doumentoD etF v memori ew en mioD se orr l pgr el ordendorF v memori m l usn los progrms sin que el usurio de stos se de uentF

Direcciones de Variables
el delrr un vrile estmos diiendo l ordendor que nos reserve un prte de l memori pr lmenrlF gd vez que ejeutemos el progrm l vrile se lmenr en un sitio diferenteD eso no lo podemos ontrolrD depende de l memori disponile y otros ftores misteriososF uede que se lmene en el mismo sitioD pero es mejor no (rseF hependiendo del tipo de vrile que delremos el ordendor nos reservr ms o menos memoriF gomo vimos en el ptulo de tipos de dtos d tipo de vrile oup ms o menos ytesF gundo (nliz el progrm todo el espio reservdo qued lireF ixiste un form de ser qu direiones nos h reservdo el ordendorF e trt de usr el operdor 8 @operdor de direinAF r mostrr l direin de l vrile usmos 7p en lugr de 7iD sirve pr esriir direiones de punteros y vrilesF il vlor se muestr en hexdeimlF xo hy que onfundir el vlor de l vrile on l direin donde est lmend l vrileF v vrile 99 est lmend en un lugr determindo de l memoriD ese lugr no mi mientrs se ejeut el progrmF il vlor de l vrile puede mir lo lrgo del progrmD lo mimos nosotrosF ise vlor est lmendo en l direin de l vrileF il nomre de l vrile es equivlente poner un nomre un zon de l memoriF gundo en el progrm esriimos 99D en relidd estmos diiendoD 4el vlor que est lmendo en l direin de memori l que llmmos 99F

QUE ES UN PUNTERO?
n puntero es un vrile un tnto espeilF gon un puntero podemos lmenr direiones de memoriF in un puntero podemos tener gurdd l direin de un vrileF

SV

CAPTULO 3. INTRODUCCION LENGUAJE C++


wuhs vees los punteros se usn pr gurdr ls direiones de vrilesF imos en el ptulo ipos de htos que d tipo de vrile oup un espio distintoF or eso undo delrmos un puntero deemos espei(r el tipo de dtos uy direin lmenrF r delrr un puntero se utiliz un sterisoD pr indir que se trt de un punteroF or ejemploF hr BpuntY isto delr un vrile puntero que lmenr l direion de un vrile de tipo hrF gundo un puntero ontiene l direion de un vrileD se die que ese puntero punt es vrileF v sintxis generl pr delrr un puntero es omo sigueX tipodedto BnomredelpunteroY

Utilidad de un Puntero
vos punteros tienen muhs utiliddesD por ejemplo nos permiten psr rgumentos @o prmetrosA un funin y modi(rlosF min permiten el mnejo de dens y de rrysF ytro uso importnte es que nos permiten eder diretmente l pntllD l teldo y todos los omponenetes del ordendorF xos deen dejr tmin l posiilidd de eder ess posiiones de memoriF r eder ells se us el operdor BD que no hy que onfundir on el de l multipliinF ijemploF

# inlude stdioFh int min@A { int numeroY int BpuntY numero a RQY punt a 8numeroY printf( 4hirein de numero a 7pD vlor de numero a 7in4D 8numeroD Bpunt AY }
e puede oservr en el ejemplo que pr esr l vlor de numero usmos Bpunt en vez de numeroF isto es porque punt punt numero y Bpunt nos permite esr l vlor l que punt puntF sndo un puntero podemos puntr un vrile y on Bpuntero vemos o mimos el ontenido de es vrileF n puntero no slo sirve pr punt un vrileD tmin sirve pr puntr un direin de memori determindF unteros omo rgumentos de funiones remos visto en el ptulo de funiones mo psr prmetros y mo otener resultdos de ls funiones @on los vlores devueltos on returnAF ero tiene un inonvenienteD slo podemos tener un vlor devueltoF ehor vmos ver mo los punteros nos permites modi(r vris vriles en un funinF ijemploF

# inlude stdioFh int sum@ int BD int A { int Y c a B C Y *a a HY return Y } int min@A {
SW

CAPTULO 3. INTRODUCCION LENGUAJE C++


int vrID var2; var1 a SY var2 a VY printf( 4v sum esX 7i y vleX 7in4D sum@8vrID vrPAD vrI AY }
in este ejemplo podemos ver omo on un puntero podemos mir el vlor de un vrileD trves de ellos podemos esr y mir los dtosF mien los podemos utilizr omo rgumentos de funionesD tl es el so del ejemplo nteriorF

ASIGNACION DINAMICA DE MEMORIA


emos que d vez que queremos usr un vrileD deemos reservrle un lugr en memori l omenzr el progrmD o se que deemos indir de ntemno unt memori vmos utilizrF ero hy osiones en que esto no es uenoD hy vees en ls que no semos unt memori vmos neesitrF or ejemplo si hemos un editor de texto no podemos ser de ntemno ul v ser l longitud del textoF or eso vees es neesrio poder reservr memori segn se v neesitndoF edems de est form nuestros progrms provehrn mejor l memori del ordendor en el que se ejeutenD usndo slo lo neesrioF

malloc y free
ixisten vris funiones pr l signin dinmi de l memoriD pero ls dos funiones sis son mllo y freeF v funin mllo sirve pr reservr un prte de l memoriD y devuelve l direin del omienzo de es prteF ist direin podemos lmenrl en un puntero y s podemos eder l memori reservdF v sintxis de mlloD es omo sigueX puntero a @tipodevrile BA mllo@ nmero de ytes reservr AY punteroX es un vrile tipo puntero que lmen l direin del loque de memori reservdoF uede ser un puntero hrD intD )otDFFF @tipodevrile BAX es lo que se llm un moldeF v funin mllo nos reserv un iert ntidd de ytes y devuelve un puntero del tipo void @que es uno genrioAF gon el molde le indimos l ompildor que lo onviert en un puntero del mismo tipo que l vrile punteroF isto no es neesrio en gD y que lo he utomtimenteD unque es onsejle ostumrrse usrloF n vez reservd l memori y gurdd su direin en un puntero podemos usr ese puntero omo hemos visto hst horF i no h su(iente memori lire mllo devolver el vlor xvvF il puntero por tnto puntr xvvF is muy importnte ompror siempre si se h podido reservr memori o no omprondo el vlor de punteroF isto se puede her de l siguiente mnerX if@punteroA i hy memori su(iente entones se umple l ondiionD de lo ontrrio es flsoF gundo y no neesitemos ms el espio reservdo deemos lierrloD es deirD indir l ordendor que puede destinrlo otros (nesF i no liermos el espio que y no neesitmos orremos el peligro de gotr l memori del ordendorF r ello usmos l funin freeF v sintxis de free esX free@ puntero AY ijemploF

# inlude stdioFh int min@A { int ytesY char BtextoY printf("Cuantos ytes quieres reservrX 4AY scanf(" %i",&bytes); texto a @hr BA mllo@ytesAY /* gompromos si h tenido xito l operin BG
TH

CAPTULO 3. INTRODUCCION LENGUAJE C++


if @textoA { printf("Memoria reservdX 7i ytes a 7i kytes a 7i wytesn4D bytes, ytesGIHPRD ytesG@IHPRBIHPRAAY printf("El loque omienz en l direinX 7pn4D textoAY /* ehor liermos l memori BG free( texto AY } else printf("No se h podido reservr memorin4AY }
in este ejemplo vemos lrmente l signion y lierion de l memoriD despues de preguntr unt memori se dese reservrD se omprue si se reservo y luego se proede ls instruiones de lo ontrrio inmeditmente mnd el mensje 4xo se h podido reservr memori4F

ARCHIVOS
vetur de un rhivo ods ls funiones de entrdGslid estndr usn el puntero Bpsvi pr onseguir informin sore el rhivo iertoF iste puntero no punt l rhivo sino un estrutur que ontiene informin sore lF ist estrutur inluye entre otrs oss informin sore el nomre del rhivoD l direin de l zon de memori donde se lmen el (heroD tmo del u'erF r poder utilizr este puntero se dee inluir el rhivo de eer stdioFhF r rir el rhivo utilizmos l funion fopenF v sintxis de est funion es siX psvi Bfopen@onst hr Bnomre(heroD onst hr BmodoAY il nomre del rhivo se puede indir diretmente o usndo un vrileF il rhivo se puede rir de distints formsD ests se muestrn en l tlF rmetro wodo r ere un rhivo existente pr letur w gre un rhivo nuevo y lo re pr esritur i el rhivo existeD orr su ontenido ere un rhivo @si no existe lo reA pr esritur il puntero se situ l (nl del rhivoD de form que e pueden dir iertos modi(dores estos prmetrosF istos sonX wodi(dor eion ere el rhivo en modo inrio t ere el rhivo en modo texto C ere el rhivo pr letur y esritur istos modi(dores se pueden ominr on los prmetros ddos nteriormente pr rir el rhivo en l form desedF ijemploF wC gre el rhivo @o lo orr si existeA en modo inrio pr letur y esriturF rt ere un rhivo existente en modo texto pr leturF n os muy importnte despus de rir un (hero es ompror si relmente est iertoF il sistem no es inflile y pueden produirse fllosX el (hero puede no existirD estr ddo o no tener permisos de leturF i intentmos relizr operiones sore un puntero tipo psvi undo no se h onseguido rir el (hero puede her prolemsF or eso es importnte ompror si se h ierto on xitoF i el (hero no se h ierto el puntero (hero @puntero psviA tendr el vlor xvvD si se h ierto on xito tendr un vlor distinto de xvvF or ejemploF

if @(heroaaxvvA { printf( 4xo se puede rir el (heroFn4 AY exit( I AY }


iste es un ejemplo pr pror si el rhivo se rio on exitoF i no se h ierto on exito lo ms onveniente es slir del progrmD esto se puede her on un funion exitF TI

CAPTULO 3. INTRODUCCION LENGUAJE C++


Leer un archivo
r leer un rhivo podemos utilizr l funin getD que lee los rteres uno unoF e puede usr tmin l funin fgetF edems de ests dos existen otrs funiones omo fgetsD fred que leen ms de un rterF v sintxis de l funion get y fget es siX int get@psvi BrhivoAY ijemploF letr a get@ (hero AY in este ejemplo se tom un rter de rhivoD lo lmen en letr y el puntero se olo en el siguiente rterF

Comprobar el n de un Archivo
gundo entrmos en el ule whileD l letur se reliz hst que se enuentre el (nl del (heroF r detetr el (nl del (hero se pueden usr dos formsX on l funin feof@A omprondo si el vlor de letr es iypF ist funin omprue si se h llegdo l (nl de (hero en uyo so devuelve un vlor distinto de HF i no se h llegdo l (nl de (hero devuelve un eroF ijemploF

# inlude stdioFh int min@A { FILE B(heroY char letrY chero a fopen@4origenFtxt4D4r4AY if @(heroaaxvvA { printf( 4xo se puede rir el (heroFn4 AY exit( I AY } printf( 4gontenido del (heroXn4 AY letra=getc(chero); while @feof@(heroAaaHA { printf( 4 74Dletr AY letra=getc(chero); } if @flose@(heroA3aHA printf( 4rolems l errr el (heron4 AY }
in este ejemplo se pli todo lo que hemos diho nteriormenteD se re el rhivo pr leturF

Cerrar un Archivo
n vez relizds tods ls operiones deseds sore el rhivo hy que errrloF is importnte no olvidr este pso pues el rhivo podr orromperseF el errrlo se vn los u'ers y se gurd el rhivo en disoF n rhivo se ierr medinte l funin flose@(heroAF i todo v ien flose devuelve un eroD si hy prolems devuelve otro vlorF

TP

CAPTULO 3. INTRODUCCION LENGUAJE C++


Escritura de un Archivo
in est etp se utilizn ls misms funiones que pr l leturD l difereni es que hor se dee rir pr esriturF r l esritur en un rhivo usmos l funion putD l ul tiene l siguiente sintxisX int put@int D psvi B(heroAY equi ontiene el rter que queremos esriir en el (hero y el puntero (hero es el (hero sore el que trjmosF he est form vmos esriiento en un (hero el ontenido de otro (heroF ijemploF

# inlude stdioFh int min@A { FILE BorigenD BdestinoY char letrY origen=fopen("origen.txt","r"); destino=fopen("destino.txt","w"); if @origenaaxvv || destinoaaxvvA { printf( 4rolems on los (herosFn4 AY exit( I AY } letra=getc(origen); while @feof@origenAaaHA { putc(letra,destino); printf( 4 74Dletr AY letra=getc(origen); } if @flose@origenA3aHA printf( 4rolems l errr el (hero origenFtxtn4 AY if @flose@destinoA3aHA printf( 4rolems l errr el (hero destinoFtxtn4 AY }
equi se puede oservr l pertur del rhivoD luego l letur del origen y l esritur en el destinoF

Comprobando el nal del chero


gomo siempre que leemos dtos de un (hero deemos ompror si hemos llegdo l (nlF lo deemos ompror si estmos l (nl del (hero que leemosF xo tenemos que ompror el (nl del (hero en el que esriimos puesto que lo estmos rendo y n no tiene (nlF iempre hy que ordrse de errr el rhivo en el que estmos trjndoD reordemos que est ion l hemos on l funion flose@(heroAF r esriir linesD se oup l funion fputsD l ul trj on l funion fgetsF v sintxis de est funion es omo sigueX int fputs@onst hr BdenD psvi B(heroAY

fread y fwrite
ists funiones nos permiten trtr on dtos de ulquier tipoD inluso on estruturs dentro de un rhivoD l ontrrio de ls psds en ls que solo sirven pr mnejr rteres y densF TQ

CAPTULO 3. INTRODUCCION LENGUAJE C++


fwrite
pwrite nos permite esriir en un (heroF ist funin tiene l siguiente sintxisX sizet fwrite@void Bu'erD sizet tmnoD sizet numeroD psvi Bp(heroAY u'erX vrile que ontiene los dtos que vmos esriir en el (heroF tmnoX el tmo del tipo de dto esriirF uede ser un intD un )otD un estruturD FFF r onoer su tmo usmos el operdor sizeofF numeroX el nmero de dtos esriirF p(heroX il puntero l (hero sore el que trjmosF ijemploF

#include struct { char nomrePHY char pellidoPHY char telefonoISY } registroY int min@A { FILE B(heroY chero a fopen@ 4nomresFtxt4D 44 AY do { printf( 4xomreX 4 AY ush(stdout); gets(registro.nombre); if @strmp@registroFnomreD44AA { printf( 4epellidoX 4 AY ush(stdout); gets(registro.apellido); printf( 4elfonoX 4 AY ush(stdout); gets(registro.telefono); fwrite( registroD sizeof@registroAD ID (hero AY } } while @strmp@registroFnomreD44A3aHAY fclose( (hero AY }
in este ejemplo gurdmos los dtos personles medinte fwrite usndo l estrutur registroF erimos el (hero en modo 99D pr que los dtos que introduimos se dn l (nl del (heroF n vez ierto entrmos en un ule doEwhile medinte el ul introduimos los dtosF vos dtos se vn lmenndo en l vrile registro @que es un estruturAF gundo y tenemos todos los dtos de l person los esriimos en el rhivo on l funion fwriteD l que tiene l siguiente sintxisX fwrite@ registroD sizeof@registroAD ID (hero AY in dondeX registro E es l vrile @en este so un estruturA que ontiene l informin meter l (heroF sizeof@registroA E lo utillizmos pr ser ul es el nmero de ytes que vmos gurdrD el tmo en ytes que oup l estruturF I E indi que slo vmos gurdr un elementoF gd vez que se reorre el ule gurdmos slo un elementoF (hero E el puntero psvi l (hero donde vmos esriirF fred TR

CAPTULO 3. INTRODUCCION LENGUAJE C++


v funin fred se utiliz pr sr informin de un erhivoD su sintxis esX sizet fred@void Bu'erD sizet tmnoD sizet numeroD psvi Bp(heroAY iendo u'er l vrile donde se vn esriir los dtos ledos del (hero rhivoF il vlor que devuelve l funin indi el nmero de elementos de tmo 9tmno9 que h onseguido leerF ijemploF

# inlude stdioFh struct { char nomrePHY char pellidoPHY char telefonoISY } registroY int min@A { FILE B(heroY chero a fopen@ 4nomresFtxt4D 4r4 AY while @3feof@(heroAA { if @fred@ registroD sizeof@registroAD ID (hero AA { printf( 4xomreX 7sn4D registroFnomre AY printf( 4epellidoX 7sn4D registroFpellidoAY printf( 4elfonoX 7sn4D registroFtelefonoAY } } fclose( (hero AY }
in este ejemplo oservmos l utilidd de ls funiones ntes meniondsF

fseek y ftell fseek


v funin fseek nos permite siturnos en l posiin que quermos de un (hero iertoF gundo leemos un (hero hy un 9puntero9 que indi en qu lugr del (hero nos enontrmosF gd vez que leemos dtos del (hero este puntero se desplzF gon l funin fseek podemos situr este puntero en el lugr que deseemosF v sintxis de fseek es siX int fseek@psvi Bp(heroD long desplzmientoD int modoAY p(hero es un puntero de tipo psvi que punt l (hero on el que queremos trjrF desplzmiento son ls posiiones @o ytesA que queremos desplzr el punteroF iste desplzmiento puede ser de tres tipos dependiendo del vlor de modoX iiui il puntero se desplz desde el prinipio del rhivo iiug il puntero se desplz desde l posiion tul del rhivo iiuixh il puntero se desplz desde el (nl del rhivo ists tres onstntes estn de(nids en el (hero F gomo uriosidd se indin ontinuin sus de(niionesX 5de(ne iiui H 5de(ne iiug I 5de(ne iiuixh P i se produe lgn error l intentr posiionr el punteroD l funin devuelve un vlor distinto de HF i todo h v ien el vlor devuleto es un HF ijemploF TS

3.1. EJERCICIOS PROPUESTOS


# inlude stdioFh int min@A {

CAPTULO 3. INTRODUCCION LENGUAJE C++

FILE B(heroY long posiionY int resultdoY chero a fopen@ 4origenFtxt4D 4r4 AY printf( 4u posiin quieres leerc 4 AY ush(stdout); scanf( 4 7h4D 8posiion AY resultado a fseek@ (heroD posiionD iiui AY if @3resultdoA printf( 4in l posiin 7h est l letr 7Fn4D posiionD get@(heroA AY else printf@ 4rolems posiionndo el ursorFn4 AY fclose( (hero AY }
in este ejemplo se mostro el funionmiento de fseekF

ftell
v funin ftell es omplementri fseekD devuelve l posiin tul dentro del (heroF u sintxis es l siguienteX long ftell@psvi Bp(heroAY il vlor que nos d ftell puede ser usdo por fseek pr volver l posiin tulF

fprintf y fscanf
ists dos funiones trjn igul que sus equivlentes printf y snfF v ni difereni es que podemos espei(r el (hero sore el que se dese operrF vs sintxis de ests dos funiones sonX int fprintf@psvi Bp(heroD onst hr BformtoD FFFAY int fsnf@psvi Bp(heroD const hr BformtoD FFFAY

3.1. EJERCICIOS PROPUESTOS


IF upong que un individuo dese invertir su pitl en un no y dese ser unto dinero gnr despus de un mes si el no pg rzn de P 7 mensulF PF n vendedor reie un sueldo se ms un IH 7 extr por omisin de sus ventsD el vendedor dese ser unto dinero otendr por onepto de omisiones por ls tres vents que reliz en el mes y el totl que reiir en el mes tomndo en uent su sueldo se y omisionesF QF n tiend ofree un desuento del IS 7 sore el totl de l ompr y un liente dese ser unto deer pgr (nlmente por su omprF RF n lumno dese ser ul ser su li(in (nl en l mteri de psiF hih li(in se ompone de los siguientes porentjesX SS 7 del promedio de sus tres li(iones prilesF QH 7 de l li(in del exmen (nlF IS 7 de l li(in de un trjo (nlF SF n mestro dese ser que porentje de homres y que porentje de mujeres hy en un grupo de estudintesF TF elizr un progrm que lule l edd de un personF TT

3.1. EJERCICIOS PROPUESTOS

CAPTULO 3. INTRODUCCION LENGUAJE C++

UF hd un ntidd en pesosD otener l equivleni en dlresD sumiendo que l unidd mir es un dto desonoidoF VF in un hospitl existen tres resX qineologD editrD rumtologF il presupuesto nul del hospitl se reprte onforme l sigF tlX re orentje del presupuesto qineolog RH 7 rumtolog QH 7 editr QH 7 ytener l ntidd de dinero que reiir d reD pr ulquier monto presupuestlF WF glulr el nmero de pulsiones que un person dee tener por d IH segundos de ejeriioD si l formul esX numF ulsiones a @PPH E eddAGIH IHF il dueo de un tiend ompr un rtulo un preio determindoF ytener el preio en que lo dee vender pr otener un gnni del QH 7F IIF rogrm que onvierte de metros pies y pulgdsF IPF veer un nmero y esriir el vlor soluto del mismoF IQF v presinD el volumen y l tempertur de un ms de ire se relionn por l formulX ws a @presin B volumenAG@HFQU B @tempertur C RTHAA IRF glulr el nuevo slrio de un orero si otuvo un inremento del PS 7 sore su slrio nteriorF ISF odos los lunesD miroles y viernesD un person orre l mism rut y ronometr los tiempos otenidosF heterminr el tiempo promedio que l person trd en reorrer l rut en un semn ulquierF ITF res persons deiden invertir su dinero pr fundr un empresF gd un de ells invierte un ntidd distintF ytener el porentje que d quien invierte on respeto l ntidd totl invertidF IUF n lumno dese ser ul ser su promedio generl en ls tres mteris ms difiles que urs y ul ser el promedio que otendr en d un de ellsF ists mteris se evln omo se muestr ontinuinX v li(in de wtemtis se otiene de l sigF wnerX ixmen WH 7D romedio de tres IH 7 in est mteri se pidi un totl de tres tresF v li(in de psi se otiene de l sigF wnerX ixmen VH 7 romedio de tres PH 7 in est mteri se pidi un totl de dos tresF v li(in de umi se otiene de l sigF wnerX ixmen VS 7 romedio de tres IS 7 in est mteri se pidi un promedio de tres tres IVF elizr un rogrm que le l entrd de HP nmeros y muestre el dole produto del primero menos l mitd del segundoF IWF hesrrollr un progrm que permit pturr pregunts omo @iddD sueldoD y msot fvoritA y l (nl muestre los dtos pturdos en onjunto PHF e dese otener el preio totl de l vent de un produtoD onoiendo el nmero de js dquirids por un lienteD el nmero de uniddes que tiene jD del preio por unidd y de l ts de impuestoF PIF hisee un progrm que gurde y muestre l not del exmen (nl de Q lumnos

TU

3.1. EJERCICIOS PROPUESTOS

CAPTULO 3. INTRODUCCION LENGUAJE C++

PPF hisee un progrm que muestreD los diferentes tipos de dtosD usdos en gF rimeroD dee indirsele l usurio que introduz un vlorD de un tipo ddoY luego y despus de her introduido vlores en tods ls vrilesD dee imprimirse el ontenido de ellsD junto on un mensje que indiqueD el tipo de dtoF PQF hisee un progrmD en el ul se introduzn el nomre y el peso y de un lumnoD y luego l muestre en pntllF il xomre dee inluir el pellidoD y en el mpo del pesoD solo deen inluir vlores numriosF PRF n empres neesit onoer el sueldo neto pgr un empledoF eniendo omo entrd el slrio produz un slid de sueldo netoF vos desuentos plir sonX s S 7D ep U 7 y ent IH 7D estos desuentos son sore el slrioD y es sueldo neto es l difereni entre el slrio y el totl de ls retenionesF PSF hisee un progrm que lul el udrdo y el uo de tres nmeros introduidos por el usurioF

TV

Captulo 4

Programacin en C#
g5 @lseD en ingls g shrpD y en espol g lmohdillA es un lenguje de progrmin que permite el desrrollo de pliiones pr snternetD pr mviles y pliiones de propsito generlF sniilmente se desrroll pr progrmr en l pltform FxiD pero dds ls rterstis de est y l estndrizin que se h heho de su estrutur por prte de ls priniples entiddes de estndres internionlesD se hn desrrolldo otrs pltforms que umplen on dih estrutur y por lo tnto g5 puede ser utilizdo omo lenguje de progrmin en ellsF intre ests pltforms se dest el royeto wyxyD desrrolldo pr vinux y wF il lenguje g5 es orientdo ojetos y se h redo sndose en l estrutur de g y gCCD espeilmente su sintxis y poteniD y doptndo el estilo y metodolog de l progrmin en isul fsiF in emrgo es importnte lrr que g5 no es el resultdo de l evoluin diret de ninguno de estos lengujesD sino que h sido redo desde eroD pr progrmr sore l pltform FxiF is un lenguje que fue oneido on el ojetivo de progrmr est pltform y por lo tnto se puede deir que es el lenguje nturl de FxiF v empres wirosoftD redor de g5D en un intento de superr otrs pltforms que estn imponindose en el soporte pliiones que trjn en redD espeilmente sore snternetD deidi estndrizr l pltform Fxi y on ell el lenguje se de l mismD g5F gon est deisin se h logrdo que wirosoft de onoer ls espei(iones tnto de l pltform omo del lenguje de progrminD y de est mner permitir que tereros desrrollen implementiones de Fxi pr el mismo indows o pr sistems opertivos diferentesF

4.1. La plataforma .NET


r omenzr no entrremos en muhos detlles sore l pltform FxiD y evitr de est mner onfundir l letor poo experimentdoD on teniismos que undo se teng un mejor fmiliridd se pueden ordr on myor propieddF FxiD en eseni es un lirer de lses que ontienen o enpsuln un grn ntidd de funiones que trjn sore el sistem opertivoF v rtersti fundmentl de este spetoD es que dihs lses tienen un estrutur omn pr todos los lengujes que trjen sore est pltformF isto tre omo onseueni que un lse que se progrmd en g5D podr ser heredd o utilizd en ulquier lenguje de l pltformD omo pueden ser isul fsi Fxi o triptD pr omenzrF hesde l perspetiv del progrmdor el speto ms importnteD es que Fxi pone su disposiin un mro o entorno de trjoD llmdo Fxi prmeworkD el ul le permite eder un infrestrutur dotd on lengujes de progrmin omo g5D isul fsi FxiD gCC y triptD y on l posiilidd de eder in(nidd de serviios tiles pr desrrollr ulquier tipo de pliinF

4.2. Lo necesario para programar .NET con C#


il ojetivo iniil de este urso es onoer los fundmentos sios de l progrmin g5 pr pliiones de propsito generl en FxiD y no el mnejo de un herrmient espei( de softwreF in emrgoD en el trnsurso del mismoD y pr her ms fil l tre de progrminD se reomiend utilizr softwre sistente que se enrgue de dministrr los detlles tnios repetitivos y nos permite onentrrnos en los detlles de nuestro intersF r iniir progrmr en g5 y FxiD tn solo se neesit el entorno de trjoD onoido omo Fxi prmeworkD el ul inluye l pltform de desrrollo y ejeuin de ls pliiones FxiF etulmente est TW

4.3. LA LNEA DE COMANDOS

CAPTULO 4. PROGRAMACIN EN C#

disposiin del plio l versin RFH de este entornoD que puede ser desrgd grtuitmente desde l pgin de wirosoftD pero pr efetos de este urso se utilizr l versin PFHD pr l ul existe myor soporte y doumentinF in emrgoD se sugiere desrgr el kit de desrrollo de softwre de wirosoft Fxi PFHD que ontiene dems del Fxi prmework un serie de herrmients y rhivos de yud tiles l hor de progrmrF e sugiere que ls prtis iniiles se progrmen utilizndo nimente un editor de texto senilloD omo el flo de notsD y se relie l ompilin medinte l lne de omndosF isto on el (n de que tengmos l posiilidd de omprender l detlle quellos spetos que un entorno de desrrollo integrdoD omo el isul tudioD no nos permite oservrD pero uy omprensin y fmiliridd resultn muy importntes l hor de desrrollr pliiones que requieren progrmin vnzdF

4.3. La lnea de comandos


r ompilr nuestrs pliiones trvs de l lne de omndosD lo primero que se dee her es on(gurr deudmente este entornoF gulquier pliin de Fxi depende pr su ejeuin de un serie de lirers propis de l pltformD ls ules le suministrn l omuniin neesri on el sistem opertivoF or lo tnto pr ompilr un rhivo es neesrio poner disposiin del ompildor ls direiones donde posilemente pued enontrr lgn omponente que requier o que se est utilizndo en l pliinF r filitr est tre vmos de(nir lguns vriles de entorno que filitn el trjo de indir ls direiones sis del frmework FxiF vo primero que se dee rer es un rpetD donde se gurdrn los rhivos fuente y sus orrespondientes ompildosF r filitr l ohereni entre este esrito y ls prtis que se desrrollen se sugiere rer l rpet gXgursovF

Para evitr tener que rer mnulmente ls vriles de entorno on ls direiones neesris pr el omE

pildorD vmos rer un rhivo de proesmiento por lotesD BFfeD que relie este trjo en form rpid y utomtiF ijeute el flo de notsD opie ls lnes siguientes y gurde el rhivo en el diretorio gXgursovD nomrndolo omo mdhrpvFtX

@echo o' iho vne de omndos pr el ompildor de Fxi prmework PFH ihoF rem ijeute este rhivo on l instruinX 7omspe 7 Gk mdhrpvFt @SET hirprmeworkagXsxhywirosoftFxiprmework @SET erprmeworkavPFHFSHUPU @set era 7hirprmework 7vPFHY 7hirprmework 7 7erprmework 7Y 7er 7 @set vsfera 7hirprmework 7vPFHY 7hirprmework 7 7erprmework 7Y 7vsfer 7 cd gXursov
e ontinuin r l ventn ijeutr @puede herse medinte l ominin de tels sxhyCA y ejeute l siguiente instruinX 7omspe 7 Gk XsursoursovFt

e ontinuin dee rgrse l ventn de lne de omndos on(gurd on ls direiones neesris pr trjr on los ompildores instldos on el frmework FxiF e dee repetir este ltimo pso siempre que se desee rir un nuev lne de omndos pr ompilr un progrm desrrolldo en g5

UH

4.4. ESTRUCTURA BSICA DE UN PROGRAMA C#

CAPTULO 4. PROGRAMACIN EN C#

Ejemplo 1: Mi primer programa con C#


il primer progrm que vmos desrrollr es el lsio rol wundoF F F 3F iste progrm l ejeutrse mostrr en l ventn de omndos el mensje de texto rol mundo g5FFF3 is un progrm muy simple y elementlD dems utiliz un medio de slid en formto textoD poo usul en los progrms modernosD que todo lo hen trvs de ventnsF ero pr omenzr est ienD luego nos preoupremos por ir mejorndo pr mostrr mensjes ms so(stidos y trvs de ls y trdiionles ventnsF el igul que sus hermnosD g y gCCD el lenguje g5 exige que todo progrm ejeutle @BFiiA dee inluir un punto de esoD el ul se dee identi(r on l funin win@AF edems omo g5 es un lenguje totlmente orientdo ojetosD ulquier funin que se desee implementr dee estr inmers dentro de un lse y l funin win@A no es l exepinF sniie un nuevo rhivo de texto en el flo de nots y digite ls siguientes lnes de digo g5X

public lss rimerrogrm { static void win@A { System.Console.WriteLine("Hola mundo g5FFF34AY } }


qurde el rhivo en l rpet de trjoDgursovD y signe el nomre ejemploHIFsF il ompildor de g5 se identi( omo sFexe @g hrp gompilerAD y tiene un diversidd de opionesD dependiendo del tipo de ompilin que se desee relizrF r este soD st on ejeutr el ompildor seguido del nomre del rhivo fuente que se dese ompilrF or defeto se gener un rhivo ejeutleD BFiiF v instruin de ompilin es l siguienteX b s ejemploHIFs il siguiente gr(o muestr el resultdo de l ompilin de ejemploHIFs y posterior ejeuin del progrm generdoF

4.4. Estructura bsica de un programa C#


gomo se h dihoD g5 es un lenguje de progrmin orientd ojetos y todo en l son lsesF v lse es el onepto fundmentl de est metodolog de progrmin y es quin identi( los omponentes que onstituyen un progrmF in un senillo progrm omo el del ejemplo ID el progrmdor solo esrie un lseD pero en l prti existen muhs lses trjndo pr permitir que el progrm se ejeuteF odo progrm g5 est onstituido por ms de un lseD unque el progrmdor tn solo de esriir un de ellsF il ejemplo I muestr un estrutur si de un senillo progrm que se ejeutr en un onsol de omndosD o l menos l prte que dee onstruir el progrmdorD pero permite visulizr on detlle los elementos eseniles que soportn ulquier pliin de softwreD sin importr el entorno donde vy ejeutrseF UI

4.4. ESTRUCTURA BSICA DE UN PROGRAMA C#


public lss rimerrogrm { static void win@A { // snstruiones } }

CAPTULO 4. PROGRAMACIN EN C#

v lse es lgo s omo l estrutur o molde de un omponente de softwreD y se de(ne on l plr lve lssF il trmino puli le inform l sistem que dih lse y sus omponentes estn disponiles pr ser vistos desde fuer del omponente de softwre que l ontieneD en este so el propio progrmF il progrm en sD oserveD es un lseD pero no se puede perder de vist que en l prti el progrm neesit otros omponentes de softwre pr poder ejeutrseD y lo ms seguro es que estos ltimos de lgun mner dependn de un o ms lsesF gundo se ejeut el progrmD el sistem opertivo trvs de l pltform de ejeuinD FxiD re un instni @pr omenzr entindseD un omponente de softwre sdo en ese moldeA de est lse e interpret ls ordenes ontenids en ellF in este so el nomre que se h olodo l lseD rimerrogrmD es un den de texto tomdo ritrrimente e indiferente omo se lo esriD lo importnte es tener en uent ls regls que l myor de lengujes imponen los nomres de sus elementosF gomo regl generl se h estleido que los nomres de los elementos de progrmin deen iniir por un rter lftio @letrA o por un ry jo @AF in emrgoD se sugiere no utilizr est ltim form de iniir el nomre de un elementoD y que le he perder estti l ontenido y sore todo di(ult su letur por prte del progrmdorF edemsD unque no es un requisitoD es importnte tener en uent ls reomendiones hehs por l doumentin del Fxi prmeworkD sore l nomenltur de los nomres signdos los diferentes elementos que se utilizn en el desrrollo de un progrmD y que permiten estndrizr los nomres utilizdos en nuestrs pliiones y en los omponentes que vymos gregr l mismo entorno de desrrolloF esD por ejemploD pr nomrr ls lses se sugiere identi(dores que iniien por un letr mysulD y undo se requier utilizr plrs ompuestsD d plr dee iniir por mysulD tles omoX wirogrmD rogrmhiujoD xominrjdoresimpresD etF xo es orreto llmr un lseD omoX SrogrmhiujoD rogrm5diujoD progrmEdiujoF edemsD un uen progrmdor dee mnejr un estilo de esritur de digo que hg lr su interpretinD no solo por l mismoD sino por otrs persons quienes les puede interesr revisrloF gomo sugereni de estiloD l ul mnejremos en este esritoD se sugiere utilizr identi(dores lo ms explitivos posileF is mejor evitr el uso de revitursD y que on el tiempo podemos olvidr su signi(do y undo el progrmdor de volver revisr su digoD despus de lgunos meses o osD le omplir su interpretinF lvezD despus de lgn tiempoD se ms fil interpretr pr que sirv un lse llmd sdentiddrjdorD que un on el nomre gsrF odo progrm desrrolldo en g5 dee inluir un mtodo win@AD el ul le inform l ompildor por donde dee iniir y tmin terminr un progrmF iste mtodo o funin siempre se de(ne nteedid de l plr lve sttiD l ul permite utilizr l lse diretmenteD sin neesidd de instnir un ojeto de ellF isto dee ser s por que en el momentos de iniir l ejeuin de un progrmD n no se h montdo en el sistem todos los omponentes neesris pr mnejr ojetos y por lo tnto el proesdor no se que her on ellosF v plr lve voidD que nteede winD le die l sistem que l funin que viene en seguid no retornr ningn vlor y que por lo tnto no espere ndF in g5D est funin tmin se puede de(nir omo int v funin win@A puede ir omo se mostr en el ejemplo ID o tmin inluir rgumentos de tipo den de textoF hihos rgumentos se identi(n por un rreglo o vetor del tipo string @den de textoAD omo en l siguiente formX

static void win@string rgumentosA { // snstruiones }

UP

4.5. LA CONSOLA

CAPTULO 4. PROGRAMACIN EN C#

in prieniD los rgumentos de iniio de ejeuin solo son vlidos pr progrms de onsolD y no pr progrms que mnejn un sistem gr(o de ventnsD omo ls pliiones tipo indowsF ero esto no es muy extoD los progrms tipo indowsD o en generl que mnejn ventnsD tmin pueden requerir rgumentos de entrd en el instnte en que iniin su ejeuinF n uen ejemplo son los progrms que mnejn lgn formto de rhivo espei(oD omo puede ser el flo de nots que gener rhivos de texto que se identi(n on l extensin BF y los ulesD generlmenteD el sistem opertivo soi on este editorF isto tre omo onseueni dos forms de iniir l ejeuin del flo de notsX unD trvs de su eso direto en el men de rogrmsD y l otr hiendo dole li en el rhivo de textoF in este ltimo so el sistem opertivo env un rgumento l progrm informndole que su ejeuin l iniio un rhivo y no el eso direto del men de progrmsF il rgumento que se env ontiene el nomre ompleto del rhivo que lo llmD y de est form el progrm se ejeut y reliz su perturF

Ejemplo2: Un programa de bienvenida con argumentos de entrada


il siguiente progrmD que se identi(r on l lse fienvenidosD reie un den de texto omo rguE mentoD que ien podr ser el nomre de un personD y lo muestr en pntll hiendo prte de un mensje de ienvenidF isri este progrm en el flo de nots y gurdelo on el nomre ejemploHPFsX

public lss fienvenid { static void win@string nomreA { System.Console.WriteLine("Bienvenido(a) 4 C nomreHAY } }


gompile el progrm on l instruinD b s ejemploHPFs in seguid relie l ejeuin del progrm llmndo ejemploHP seguido de un nomreD omo por ejemploX b ejemploHP romero i todo h slido ienD l slid que muestr el progrm despus de teler ixi esD fienvenido@A romero ruee ejeutr el progrm sin envirle un rgumentoF yservr que se produe un errorD el ul es informdo por l pltform de ejeuin del FxiF

4.5. La consola
iste es el nomre omo en indowsD e inluso en otros sistems opertivosD se onoe l interfz que permite envir rdenes l sistem opertivo trvs de omndos esritosF les omndosD no son otr os sino progrms desrrolldos pr este entorno de ejeuinF r Fxi l onsol de indows se mnipul trvs de un ojeto que se identi( on el nomre gonsoleD el ul inluye tods ls funiones sis pr mnejr este elemento del sistem opertivoF n de ess funiones es ritevine que se enrg de envir l pntllD o tmin otros dispositivos de slidD el rgumento que se le signeD y se un den de texto o un vlor numrioF in l instruin que hemos utilizdo en el nterior ejemploD ystemFgonsoleFritevine@4fienvenido@A 4 C nomreHAY se oserv que el ojeto gonsole est nteedido por el identi(dor ystemF iste en relidd es lo que se denomin espio de nomresD que no es ms que el nomre de un onjunto que grup un serie de lsesD que por lo generl el progrmdor onsider gurdn lgun relin entre sF in este so l lse gonsole pertenee l onjunto o espio de nomres llmdo ystemF

UQ

4.5. LA CONSOLA
wiemro flk flue gyn hrkflue hrkgyn hrkqry hrkqreen hrkwgent hrked hrkellow qry qreen wgent ed hite ellow golor xegro ezul egumrin ezul mrino erde zuldo qris osuro erde osuro pusi osuro ojo osuro emrillo osuro qris erde pusi ojo flno emrillo

CAPTULO 4. PROGRAMACIN EN C#

Ejemplo 3: Programa de consola para ingresar y mostrar datos


mos desrrollr un progrm que lee dos dtos trvs de l onsolD el nomre y el doumento de identiddD utilizndo el mtodo edvine de l lse gonsoleF r mostrr ls etiquets y los mensjes se utilizrn los mtodos ritevine y riteF v difereni entre estos mtodos es que el primero esrie el mensje y ps el ursor l siguiente lneD mientrs que rite mntiene el ursor l (nl de l lne esritF ediionl lo nteriorD y pr rerernos un poo en medio de tnt osuridd de l onsolD vmos signr olor l textoF r est tre el ojeto gonsole uent on l propiedd poregroundgolorD que permite signr un olor l texto de l onsolF v pltform de desrrollo de Fxi pone disposiin del progrmdor un olein de oloresD medinte l enumerin gonsolegolorsD pr signrlos tnto l olor de fondo omo l texto de l onsolF

public lss vetorhtos { static void win@A { System.Console.ForegroundColor a ystemFgonsolegolorFqreenY System.Console.Write("Nombre del usurioX 4AY System.Console.ReadLine(); System.Console.Write("Nmero de indenti(inX 4AY System.Console.ReadLine(); System.Console.WriteLine("Acceso permitido4AY System.Console.ResetColor(); // eestlee ls opiones de olor } }
sniie un nuevo rhivo de texto en el flo de notsD inluy ls lnes de odigo sugerids y gurdelo on el nomre ejemploHQFsF in los ejemplos nteriores l ompilin se reliz utilizndo l opin si que ofree el ompildor de g5D llmndo l ompildor y signndole el nomre del rhivo fuente que se dese ompilrF or defetoD el ompildor sign l rhivo ompildo el mismo nomre del rhivo fuenteD pero en un momento ddo el progrmdor puede deser signr un nomre onveniente l rhivo ejeutleF gomo ulquier de los ompildores nteesores g5D este uent on un serie de opiones que permiten otener diferentes slids en el proeso de ompilinF r este so en prtiulrD se puede utilizr el prmetro outD que permite signr un nomre l rhivo ompildoD diferente l de su fuenteF e pli siguiendo l sintxisD UR

4.6. ESPACIOS DE NOMBRES

CAPTULO 4. PROGRAMACIN EN C#

s GoutXerhivogompildo erhivopuente eniendo en uent lo nterior ompile el progrm on l instruinD b s GoutXvetorhtosFexe ejemploHQFs y ejetelo medinte l llmdD b vetorhtos in l progrmin de este ejemplo nos hemos ddo uent que ls instruiones pueden ser un tnto omplejs de esriirD dd l neesidd de tener que inluir el espio de nomres en ls llmds ls lses y sus mtodosF i tenemos en uent que l progrmin en Fxi se he se de ojetosD uys lses hen prte de espios de nomresD y que muhos de estos espios de nomres su vez hen prte de otros espios de nomresD el grdo de di(ultd pree umentrse inneesrimente pr el progrmdor de g5D us de estos mtodos de signin de nomresF in emrgoD est form de identi(r ls lses y sus ojetos tiene un poderos rzn de ser yD en vez de perjudirD ms ien es un ene(io pr el progrmdorF in seguid se desrie l importni de est metodolog de grupmiento de lses y l form omo podemos evitr ls di(ultdes que ofree el mnejo de los espios de nomresF

4.6. Espacios de nombres


n espio de nomres es un nomre que identi( un onjunto de lses y que yud distinguirls de otrs que pueden llevr el mismo nomre seF or ejemploD l lse gonsole que hemos utilizdo en todos los ejemplosD he prte del espio de nomres ystemD que grup tods ls lses sis de l pltform FxiF i un progrmdor neesit de(nir otr lse on el nomre gonsoleD puede herlo sin ningun prolem siempre y undo inluy un espio de nomres diferenteD omo por ejemplo gursoghrpFgonsoleF ems lses pueden ser utilizds en un mism pliin sin ningn prolemD pero pr referenirls se deer utilizr su nomre ompuestoD espio de nomres y nomre de l lseD tl omo ystemFgonsole y gursoghrpFgonsoleF

min se puede deir que un espio de nomres es lgo s omo un diretorio que grup un onjunto de lsesD ls ules el progrmdor ls grup dependiendo de su riterioF v pltform Fxi posee muhos espios de nomresD que grupn lses uy funionlidd tiene lgun rtersti que ls relion uns on otrsF v siguiente tl muestr lgunos de los espios de nomres sios que se hn de(nido en FxiD y los rhivos hvv que los ontienen junto sus lses @o tmin llmds tiposAX

is importnte destr que estos son solo lgunos de los espios de nomres que existen en FxiF ero todos los espios de nomre que onformn l pltform Fxi se enuentrn de(nidos dentro del espio de nomres ystemD y un grn ntidd de ellos estn uidos dentro de los nteriores espios de nomresF US

4.6. ESPACIOS DE NOMBRES

CAPTULO 4. PROGRAMACIN EN C#

ytro speto interesnteD es oservr l form omo hn sido nomrdos los rhivos hvv que ontienen estos espios de nomresD omo por ejemplo el espio de nomres ystemFhrwing es gurddo en el rhivo ompildo ystemFhrwingFdllF xo signi( esto que se trte de un regl oligtori que vy tener lgn efeto en el proeso de ompilinD sino ms ien un uestin de orgnizin que filit muho l identi(in del espio de nomres y sus lsesF or lo generl los entornos de desrrollo integrdoD omo hrpdevelop y isultudio Fxi genern estos nomres en form utomtiF il ojetivo fundmentl de los espios de nomresD dems de yudr en l orgnizinD es impedir ls inomptiiliddes reds por l posile dupliidd de nomres signdos ls lsesF is tnt l ntidd de lses que se enuentrn de(nids dentro de l pltform de Fxi y ls que vy utilizr el progrmdor de pliionesD que ien podr entrr en on)ito l hor de dr un nomre un lseD lo ul unque puede ser detetdo por el ompildorD de tods mners puede perjudir el diseo y sore todo l posiilidd de trjr un proyeto on omponentes de softwre signdos diferentes grupos de desrrolloF edems se orre el riesgo que los nomres de ls lses de un progrmdor oinidn on ls de otroD lo ul rer inonsistenis l sistemF upongmos un soX un equipo de desrrollo enrg dos grupos diferentes de progrmdores el diseo de lgunos de los omponentes de softwre pr l pliin de softwre que est desrrollndoF vos dos gruposD deido l di(ultd que tienen de omuniinD implementnD d uno de ellosD un lse llmd golorexto pr olorer ls lnes de texto de l slidD pero on funionliddes un tnto diferentesF or ejemploD el primer grupo dot est lse on l funionlidd de olorer el texto on rojoD mientrs que el segundo grupo le sign funionliddes pr olorer on mrillo y zulF i el equipo de desrrollo se neesit utilizr los tres oloresD est oligdo utilizr ls dos lses por que uentn on ls funionliddes que se neesitn y no se puede ovir un de ellsD pero puede verse en un serio prolem si ms fueron ompilds on el mismo nomreF v soluin l nterior prolem es utilizr los espios de nomres pr identi(r lrmente d lse y evitr on)ito de nomresF upongmos que los equipos de progrmdores se identi(n on los nomres de elf y fet y hen prte de l orgnizin wiimpresD entones podrn utilizr omo nomres pr sus respetivs lsesD
MiEmpresa.EquipoAlfa.ColorTexto

y
MiEmpresa.EquipoBeta.ColorTexto

gon esto qued perfetmente soluiondo el prolem de l dupliidd de lses y permite l utilizin de ms lses sin ningn prolemF r estleer un espio de nomres se utiliz l plr lve nmespeD que tiene l siguiente estruturX

namespace xomre { // he(niin de ls lses que // onformn el espio de nomres }


e puede nidr ulquier ntidd de espios de nomres pr permitir lrgr l identidd de ls lsesF he est mner l lse de nuestro ejemplo puede de(nirseD por prte del iquipo elf sX

namespace wiimpres { namespace iquipoelf { public lss golorexto { // snstruiones } } }


y por prte del equipo fet siX UT

4.6. ESPACIOS DE NOMBRES


namespace wiimpres { namespace iquipofet { public lss golorexto { // snstruiones } } }

CAPTULO 4. PROGRAMACIN EN C#

in el so ntes plntedoD l refereni ls lses result un tnto omplej y que se dee esriir el nomre ompleto de l lseD inluyendo los identi(dores de sus espios de nomresF isto puede omplir el trjo del progrmdorD l oligrlo teler demsido digoF r evitr tener que teler nomres demsido lrgos us de los espios de nomresD g5 uent on l plr lve using que permite direionr los espios de nomres en el enezdo del rhivo fuente y ortr l refereni un lseD y se llmndol por su nomre sio o l menos sin tener que reurrir todos los espios de nomres que l identi(nD siempre y undo no entre en on)ito on otros nomresF

Ejemplo 4: Ensamblado para colorear texto


in el siguiente ejemplo de progrmin vmos llevr l prti el trjo del equipo elfD ntes menE iondoD pr mostrr simente el uso de l plr lve usingF eroD dems este ejeriio nos permitir errnos l desripin teri de desrrollr un pliin por omponentesF mos suponer que este equipo dee ompilr y entregr su omponente de softwre en un rhivo hvvD que en el mundo Fxi se onoe omo ensmldoF sniie un nuevo rhivoD en el flo de notsD y esri el siguiente digoX

// erhivoX iquipoelfFgolorextoFs using ystemY namespace iquipoelf { public stti lss golorexto { public stti void ojo@string denA { Console.ForegroundColor a gonsolegolorFedY gonsoleFritevine@denAY Console.ResetColor(); } } }
yserve queD se h utilizdo l instruin using ystemY pr direionr l espio de nomres ystemF he est mner se le inform l ompildor donde dee usr l de(niin de l lse gonsoleF eunque l progrmin orientd ojetos estlee que ls lses son plntillsD o moldesD que desrien en form generl omo es un ojetoD hst el momento no l hemos utilizdo en este ontextoD que en l prti es su verdder y ms importnte (nliddD sino trvs del uso direto de ls lses y sus mtodosF g5 le permite l progrmdorD en iert mnerD evdir el onepto de progrmin orientd ojetos de(niendo lses esttisF iste tipo de lses se omportn omo plntills que nimente sirven pr grupr funionesD omo quells que se utilizn en ulquier lenguje de progrmin estruturd y que le sirven l progrmdor UU

4.6. ESPACIOS DE NOMBRES

CAPTULO 4. PROGRAMACIN EN C#

pr relizr lgun tre onretF iste tipo de lses se de(nen on l plr lve sttiF odos los mtodos o funiones de un lse estti deen de(nirse tmin omo sttiF edemsD ests lses se utilizn diretmente y que no permiten de(nir ojetos prtir de ellsF iguiendo el esquem de nomres sugerido nteriormenteD gurde el rhivo nterior on el nomre iquipoelE fFgolorextoFs y omplelo utilizndo el prmetro GtrgetXlirryD omo lo muestr l siguiente instruin teled en l lne de omndosX b s GtXlirry iquipoelfFgolorextoFs i todo sle ienD l revisr l rpet de trjo se oserv que se h ompildo en el ensmldo iquipoelE fFgolorextoFdllFv siguiente prte del ejemplo onsiste en utilizr est lirer y su lse en un progrm ejeutleF il progrm que se v desrrollr le pide l usurio ingresr un mensje desde el teldo y lo esrie ontinuin en olor rojoF sniie un nuevo rhivo en el flo de nots y telee el siguiente digoX

// erhivoX ijemploHRFs using ystemY using iquipoelfY public lss wensjehegolor { static void win@A { string swensjeY Console.Write("Escriba su mensjeX 4AY sMensaje a gonsoleFedvine@AY ColorTexto.Rojo(sMensaje); Console.WriteLine("Terminado..."); } }
r mir olor rojo el mensje ingresdo por el usurioD el progrm utiliz l lse golorexto de(nid en el ensmldo iquipoelfFgolorextoFdllF in el proeso de ompilin de este progrmD el ompildor dee estleer donde se enuentr l lse y (jr est informin en el rhivo ejeutle que se v generrF r ello es neesrio indirle l ompildor de g5 el nomre del reurso on el ul dee relizr el enleD medinte l opin Gresoures seguido del nomre del rhivo hvvD que en form simpli(d se esrie omo GrF in onseueni l ompilin se dee relizr medinte l siguiente instruinX bs GrXiquipoelfFgolorextoFdll ejemploHRFs in de(nitiv hemos desrrolldo un pliin que onst de dos ensmldosD l menos desde l perspetiv del progrmdorX un rhivo ejeutle otenido en l ltim ompilin y un rhivo hvv que ontiene l lse que se enrg de ponerle olor l textoF ist estrutur es l que utilizn l myor de pliiones modernsD donde d omponente se ompil en un rhivo independienteD en el so de Fxi en un ensmldoD lo ul tre un ventj priniplD es que permite her mios l pliin sin neesidd de tener que volver ompilr todoD sino nimente el omponente que se neesrioF

Ejemplo 5: Clculo de las funciones trigonomtricas


il siguiente ejemplo soliit un vlor numrio orrespondiente un ngulo y lul el vlor de ls tres priniples funiones trigonomtrisF il vlor de d funin es mostrdo en un olor diferenteF r signr olor l texto de slidD reutilizremos el ensmldo iquipoelfFgolorextoFdllD redo en el ejemplo nterior y que esrie un texto en olor rojoD y reremos el omponente que permite trjr on dos olores msD redo por el equipo fetF gomo se estlei en l desripin teriD este ensmldo dee perteneer l espio de nomres iquipofet y relizr el trjo trvs de un lse estti llmd golorextoF el (nlD el progrm ejeutle utilizrD pr relizr su trjoD dos ensmldosX iquipoelE fFgolorextoFdll y iquipofetFgolorextoFdllF

// erhivoX iquipofetFgolorextoFs using ystemY


UV

4.6. ESPACIOS DE NOMBRES

CAPTULO 4. PROGRAMACIN EN C#

namespace iquipofet { public stti lss golorexto { public stti void emrillo@string denA { Console.ForegroundColor a gonsolegolorFellowY Console.WriteLine(cadena); Console.ResetColor(); } public stti void ezul@string denA { Console.ForegroundColor a gonsolegolorFflueY Console.WriteLine(cadena); Console.ResetColor(); } } }
qurde el rhivo on el nomre iquipofetFgolorextoFs y omplelo on l instruin de lne de omndosD b s GtXlirry iquipofetFgolorextoFs gon esto y tenemos los ensmldos entregdos por los equipos elf y fet y los vmos utilizr en nuestro proyeto de softwreF il digo del progrm que nos permite lulr ls funiones trigonomtris es el siguienteX

// erhivoX ijemploHSFs using ystemY public lss rigonometri { static void win@A { double ngulo a HY Console.Clear(); Console.Title a 4puniones trigonomtris4Y Console.Write("Valor del ngulo en grdos a 4AY angulo a gonvertFohoule@gonsoleFedvine@AAY angulo a ngulo B wthFs G IVHY // gonvierte de grdos rdines EquipoBeta.ColorTexto.Amarillo("\nSeno a 4 C wthFin@nguloAAY EquipoBeta.ColorTexto.Azul("Coseno a 4 C wthFgos@nguloAAY EquipoAlfa.ColorTexto.Rojo("Tangente a 4 C wthFn@nguloAAY Console.ReadLine(); // hetiene l ejeuin hst presionr ixi } }
iste progrmD pr empezr limpi e iniiliz l pntll medinte el mtodo ler de l lse gonsole y sign un ttulo l rr de ttulos de l onsolD medinte l propiedd itleF v letur de dtos se reliz medinte el mtodo edvineF ero este mtodo ptur el dto omo un den de texto de tipo stringD lo ul impli que pr poderse mnipulr omo un vlor numrio se dee UW

4.6. ESPACIOS DE NOMBRES

CAPTULO 4. PROGRAMACIN EN C#

onvertir primero nmeroF in este so se utiliz l glse estti gonvert y su mtodo ohouleD que lo onvierte de den un vlor de tipo doule @numero rel de preisin doleAF minD es neesrio relizr un onversin del dto ingresdoD psndolo de grdos rdinesD y que este es el formto que utilizn ls funiones trigonomtris de FxiF nto el vlor de l onstnte s omo ls funiones trigonomtrisD y otrs funiones mtemtisD se enuentrn de(nids e implementds en l lse estti wthF pinlmenteD hy que ompilr este rhivo fuenteD pr generr el ensmldo de nuestro progrmD teniendo en uent que este depende de dos ensmldos msD iquipoelfFgolorextoFdll y iquipofetFgolorextoFdllF in el llmdo l ompildor se dee psr el listdo de ls lirers que se neesitn pr l ompilinD utilizndo l opin GrX seguid de los nomres de los rhivos hvvD seprdos por oms @pero sin espiosAF hee tenerse en uent que pr llmr l lse golorextoD fue neesrio inluir el espio de nomres l ul perteneD ddo que si no se hi s se rer un migedd que no permitir l sistem ser de ul lse se est hlndoF v ompilin se reliz ejeutndo l siguiente instruin en l lne de omndosX b s GrXiquipoelfFgolorextoFdllDiquipofetFgolorextoFdll ejeriioHSFs gon este senillo ejemplo se h mostrdo l form omo se puede orgnizr un pliin de softwre y l reutilizin de lgunos de sus omponentes pr horrr trjo y gnr tiempo en el proeso de desrrolloF gundo ordemos el onepto de progrmin orientd ojetosD propimente dihoD se dr myor nfsis este tipo de diseoF

VH

BIBLIOGRAFIA
IF ghWR fernrd ghzelleF gomputtionl geometryX retrospetiveF sn yg 9WRX roeedings of the twentyEsixth nnul egw symposium on heory of omputingD pges US!WRD xew orkD xD eD IWWRF egw ressF PF guUW tohn gF ghernivsky nd muel xF uminF e omplete nd onsistent hore xiomtis for simple progrmming lngugeF tF egwD PT@IAXIIW!IPVD IWUWF QF grHS qry gornell gy F rorstmnF gore tv P tPi SFH olume IF un wirosystems ressD PHHSF RF irWT rtj hni illis rorowitsF pundmentls of elgoritmsF gomputer iene ressD IWWTF SF pelHS ishi eF peldmnF ehing qulity ojetEoriented progrmmingF tF iduF esourF gomputFD S@IAXI!ITD PHHSF TF qfWT ul frtley qilles frssrdF pundmentls of elgoritmsF rintie rllD IWWTF UF qriUU lph F qrimldiF wtemti hisretF eddison essleyD IWUUF VF roVQ gF eF F roreF gommuniting sequentil proessesF gommunF egwD PT@IAXIHH!IHTD IWVQF WF ufyC HS fenjmin eF uupermnD grl iF frodleyD rilmi yzdognogluD F xF ijykumrD nd enkit tloteF hetetion nd prevention of stk u'er over)ow ttksF gommunF egwD RV@IIAXSH!STD PHHSF IHF vehVV ghrles rF vehmnnF qeometr enltiF iditoril vimusD IWVVF IIF vgC HP qF vevensD iF ollD gF gliftonD F gheonD nd gF uyF tml referene mnulD PHHPF IPF weHQ teven F kien wiguel eF evillF rogrmming ghllengesF pringerD PHHQF IQF wgHI te'rey tF wgonnellF enlysis of elgorithmsX en etive verning epprohF tones nd frtlett uD PHHIF IRF wisWU wishrF gomputtionl rel lgeri geometryF sn to iF qoodmn nd toseph y9ourkeD editorsD rndook of hisrete nd gomputtionl qeometryD gg ressD IWWUF IWWUF ISF edWH dy F eddyF porml methods in trnsformtionl derivtion of progrmsF sn gonferene proE eedings on porml methods in softwre developmentD pges IHR!IIRD xew orkD xD eD IWWHF egw ressF ITF vqWR yren tshnik onld vF qrhmD honld iF unuthF gonrete wthemtisF eddison essleyD IWWRF IUF rgWH ghrles iF veiserson homs rF gormen nd onld vF ivestF sntrodution to elgorithmsF wsshusetts snstitute of ehnologyD IWWHF IVF osHI nj osF wtodos pormles ispei(in y eri(inF msD PHHIF

VI

Parte II

ANEXOS: PRACTICAS Y ARTICULOS INTERESANTES ENCONTRADAS EN LA WEB

VP

Elementos de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 3: Sentencias de Seleccin en C++.


Los programas definidos hasta este punto se ejecutan de modo secuencial, es decir, una sentencia despus de otra. La ejecucin comienza con la primera sentencia del programa y prosigue hasta la ltima sentencia, cada una de las cuales se ejecuta una sola vez. Esta forma de programacin es adecuada para programas sencillos. Sin embargo, para la resolucin de problemas de tipo general se necesita la capacidad de controlar cules son las sentencias que se ejecutan, y en qu momentos

Estructuras de Seleccin
Las estructuras de seleccin o condicionales controlan si una sentencia o secuencia de sentencias se ejecutan, en funcin del cumplimiento o no de una condicin o expresin lgica. C++ tiene dos estructuras de control para la seleccin, if y switch.

Sentencia if
La sentencia if elige entre varias alternativas en base al valor de una o ms expresiones lgicas. La notacin BNF de esta sentencia es la siguiente: <sent_if> ::= if '('<expres_log>')' (<sent>|<bloque>) {else if '('<expres_log>') (<sent>|<bloque>)} [else (<sent>|<bloque>)] donde <expres_log> es una expresin lgica que ha de ir entre parntesis, y <sent> es una sentencia, y <bloque> es un bloque de sentencias.

Sentencia switch La sentencia switch es una sentencia de C++ que se utiliza para seleccionar una de entre mltiples alternativas. Esta sentencia es especialmente til cuando la seleccin se basa en el valor de una variable de un tipo simple o de una expresin de un tipo simple denominada expresin de control o selector. La notacin BNF de la sentencia es la siguiente:
switch '('<expres_log>')' '{' {<rama>} [default : {<sent>}] '}' <rama> ::= {<etiqueta>} {<sent>} [break;] <etiqueta> ::= CASE <exp_const> : donde <expres_log> es una expresin lgica, <sent> es una sentencia o secuencia de sentencias terminadas en punto y coma (;), y <exp_const> es una expresin constante. EJEMPLO. Veamos el siguiente ejemplo en el que usan sentencias if y swtich Escribir un programa que lea un nmero entre 1 y 5. Si el nmero es menor que 1 o mayor que 5 el programa debe avisar y no hacer nada y en caso de que sea vlido debe mostrar el nmero romano que lo representa. #include <iostream.h> #include <stdlib.h> // Permite el uso de la E/S estandard // Permite el uso de funciones estndar <sent_case>::=

// Zona de Declaracin de CONSTANTES const int MIN = 1; const int MAX = 5; int main() { // Zona de Declaracin de VARIABLES int num; cout << "Introduzca un nmero entre " << MIN << " y " << MAX << ": "; cin >> num; if (num<MIN) { cout << "Error: El Nmero debe ser mayor que " << MIN << endl; } else if (num>MAX) { cout << "Error: El Nmero debe ser menor que " << MAX << endl; Jos Luis Pastrana Brincones @ 2001 1

Elementos de Programacin 1A E.T.S.I. Informtica Gestin } else { switch(num) { case 1: cout << num << " = I " << endl; break; case 2: cout << num << " = II " << endl; break; case 3: cout << num << " = III " << endl; break; case 4: cout << num << " = IV " << endl; break; case 5: cout << num << " = V " << endl; break; } } system("PAUSE"); return 0; } ENUNCIADO PRCTICA. 1. Una empresa maneja cdigos numricos con las siguientes caractersticas: q Cada cdigo consta de cuatro dgitos: q El primero representa a una provincia. q El segundo el tipo de operacin. q Los dos ltimos el nmero de la operacin. Escriba un programa que lea de teclado un nmero de cuatro dgitos, y posteriormente imprima en pantalla la siguiente informacin. PROVINCIA & TIPO DE OPERACION & NUMERO DE OPERACION && En caso de que el nmero no tenga exactamente cuatro dgitos, en lugar del mensaje anterior, habr que imprimir en pantalla el siguiente mensaje de error: ERROR: CODIGO INVALIDO. 2. El recibo de la electricidad se elabora de la siguiente forma: q 100 Ptas de gastos fijos. q 50 Ptas/Kw para los primeros 100 Kw. q 35 Ptas/Kw para los siguientes 150 Kw. q 25 Ptas/Kw para el resto. Elabore un programa que lea de teclado los dos ltimos valores del contador, y calcule e imprima en pantalla el importe total a pagar. 3. Codifique un programa que se comporte como una calculadora simple. Para ello deber tener las siguientes caractersticas: Solo efectuar operaciones con dos operandos enteros. Operaciones permitidas: (+,-,*,/). Pedir en primer lugar el operados, y a continuacin los dos operandos. Si el operador no se corresponde con alguno de los indicados se emitir un mensaje de error. EJEMPLO: Operacion : * Operando 1 : 24 Operando 2 : 3 Resultado : 72 4. Escriba un programa que resuelva completamente una ecuacin de segundo grado, tanto si tiene races reales como imaginarias. Los coeficientes se leern de teclado. EJEMPLO: Primer coeficiente : 1 Segundo coeficiente : 0 Tercer coeficiente : 1 SOLUCIONES: 0+i 0-i // Hace una pausa // Valor de retorno a S.O.

Jos Luis Pastrana Brincones @ 2001 2

Elementos de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 4: Sentencias de Iteracin en C++.


C++ soporta tres tipos de estructuras de iteracin: los bucles while, do-while y for. stos se corresponden con los esquemas de iteracin vistos en el pseudolenguaje definido en Elementos de Programacin. Sentencia while Se corresponde con el esquema MIENTRAS del pseudolenguaje. La notacin BNF de la sentencia while es la siguiente: <sent_while> ::= while '('<expres_log>')' <sent> | <bloque> Un bucle while tiene una condicin de control o expresin lgica (<expres_log>), que ha de ir encerrada entre parntesis, que controla la secuencia de repeticin. La sintaxis de la sentencia es la siguiente: while (<expres_log>) { <sec_sent> } Sentencia do-while Se corresponde con el esquema REPETIR del pseudolenguaje. La notacin BNF de la sentencia do-while es la siguiente: <sent_do-while> ::= do <sent>|<bloque> while '('<expres_log>')'; En esta sentencia, el cuerpo del bucle se ejecuta hasta que sea FALSA la expresin lgica (<expres_log>)(que ha de ir encerrada entre parntesis). Por tanto, al igual que en el bucle while el cuerpo del bucle se ejecuta mientras la expresin lgica sea cierta. Esto supone una diferencia con la sentencia REPETIR del pseudolenguaje en la que el cuerpo del bucle se ejecutaba hasta que la expresin lgica fuese verdadera. El bucle do-while tambin se denomina post-prueba, ya que la expresin lgica se comprueba cada vez despus de la ejecucin del cuerpo del bucle. La sintaxis del bucle do-while es la siguiente: do { <sec_sent> } while (<expres_log>); El cuerpo de una sentencia do-while siempre se ejecuta al menos una vez. Cuando esto deba ocurrir en un programa (el cuerpo del bucle tenga que ejecutarse una o ms veces), es conveniente el uso de la sentencia do-while en lugar de la sentencia while. Sentencia for Se corresponde con el esquema PARA del pseudolenguaje. Su notacin BNF es la siguiente: <sent_for> ::= for '(' <inicializacion> ; <expres_log> ; <incremento> ')' <sent>|<bloque> <inicializacion> ::= <ident> = <expresion_constante> donde (<inicializacion>) es la parte en la que se inicializa la variable de control del bucle, (<expres_log>) es una expresin lgica que hace que el bucle ejecute el bloque de sentencias mientras que dicha expresin sea cierta, e (<incremento>) es una expresin que incrementa o decrementa la variable de control del bucle. Una estruuctura tpica for sera la siguiente: for (<inicializacion> ; <expres_log> ; <incremento>) { <sec_sent> } NOTA: NO SE PERMITE EL USO DE LAS SENTENCIAS break O continue EN UN BUCLE (for, do-while o while) NI LA MODIFICACIN DE LA VARIABLE CONTADORA DE UN BUCLE FOR DENTRO DEL MISMO.

Jos Luis Pastrana Brincones @ 2001 1

Elementos de Programacin 1A E.T.S.I. Informtica Gestin

1. Dado un nmero entero que representa una determinada cantidad de dinero, escriba un programa que lea dicho nmero del teclado y lo desglose para saber cuantas monedas de 500, 100, 50, 25, 5 y 1 pesetas se necesitan. 2. Escriba un programa que lea un nmero N e imprima una pirmide de nmeros con N filas como en la siguiente figura: 1 121 12321 1234321 3. Calculador repetitivo. Modifique el programa de la prctica anterior para que se repita un nmero indefinido de veces. El calculador dejar de trabajar cuando se introduzca como cdigo de operacin &. Ejemplo: Operacin : * Operando 1 : 13 Operando 2 : 10 Resultado : 130 Operacin : u ERROR!!!! Operacin : + Operando 1 : 12 Operando 2 : 3 Resultado : 15 Operacin : & FIN DEL PROGRAMA. 4. Escribe un algoritmo que lea un nmero natural N y un carcter por teclado. La salida debe ser un rombo compuesto del carcter y de la anchura que especifica el nmero N. Por ejemplo, si N es 5 y el carcter es *, el rombo sera:

* * * * * * * * * * * * * * * * * * * * * * * * *

Jos Luis Pastrana Brincones @ 2001 2

Elementos de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 5: Procedimientos y Funciones en C++.


En su concepcin ms simple, un procedimiento es una construccin que permite dar nombre a un conjunto de sentencias y declaraciones asociadas que se usan para resolver un subproblema dado. Los procedimientos no siempre realizan la misma funcin y pueden recibir parmetros. No repetir cdigo no es la nica razn para estructurar un programa usando procedimientos. Puesto que un subproblema puede codificarse como un procedimiento, un problema complejo puede dividirse en subproblemas ms simples, quienes a su vez pueden ser de nuevo subdivididos hasta llegar a la descripcin de subproblemas muy simples que se puedan codificar como procedimientos escritos en C++. La filosofa que acabamos de presentar se denomina Refinamiento Progresivo o por pasos, diseo descendente, Programacin Top-Down o bien Divide y Vencers. En C++ no hay diferencias entre procedimientos y funciones: todo son funciones, con la diferencia de que un procedimiento es una funcin que no devuelve nada (void). Tanto procedimientos como funciones, deben ser declarados antes de poder ser usados. Esto es posible de dos formas: indicando su cabecera (nombre, parmetros y tipo de retorno) despus de la zona de constantes y antes del programa principal, o bien escribir el procedimiento o la funcin entera en dicha zona. Nosotros recomendamos la segunda opcin. Mientras que un procedimiento ejecuta un grupo de sentencias, una funcin adems devuelve un valor al punto donde se llam. Una llamada a una funcin puede aparecer como operando de alguna expresin. El valor de la funcin se usa, por tanto, para calcular el valor total de la expresin. El uso de una funcin puede ser algo como 2.0+Maximo(3.0,p)/6.90, de forma que la llamada devolver el mayor valor entre 3.0 y el contenido de la variable p y con dicho valor se evaluar el resto de la expresin. Otro ejemplo puede ser: p = Maximo( 3.0, p ). Obsrvese que el tipo del resultado que devolver la funcin aparece declarado en la cabecera sustituyendo a la palabra void que identifica a un procedimiento. En este sentido, en C++, puede verse a un procedimiento como un tipo especial de funcin que devuelve un valor void (nulo). q Las funciones en C++ pueden devolver cualquier tipo menos arrays. q Toda funcin debe ejecutar una sentencia return. Sintaxis de un Funcin: Cabecera: <tipo> <identificador> ( <parmetros> ) ; Ejemplo: int mi_funcion( int x); Implementacin: <tipo> <identificador> ( <parmetros> ) { <sentencias> return <valor>; } Ejemplo: int mi_funcion( int x) { return 0; } Parmetros de entrada (valor) Los parmetros de entrada (valor) se usan para proporcionar informacin de entrada a un procedimiento. Dentro de ste pueden considerarse como variables cuyo valor inicial es el resultado de evaluar los parmetros actuales. Como parmetro actual debe aparecer una expresin cuyo resultado sea un valor de un tipo asignable al correspondiente parmetro formal. Puesto que las variables usadas como parmetros formales de entrada no sirven para cambiar a los parmetros actuales (slo para conocer su valor en el momento de la llamada y asignarle un nombre a ese valor dentro del procedimiento) se les suele denominar Parmetros por valor. Ejemplo: void dibLineas( int anchura, int altura ) { int nFila; int nColumna;
Jos Luis Pastrana Brincones @ 2001 1

Elementos de Programacin 1A E.T.S.I. Informtica Gestin

for( nFila = 1 ; nFila <= altura; nFila ++ ) { for( nColumna = 1; nColumna <= anchura; nColumna++ ) { cout << "-"; } cout << endl; } } Parmetros de entrada/salida (referencia) Para usar parmetros de entrada/salida, el parmetro formal debe estar precedido por el smbolo & y el parmetro actual debe ser una variable (no una expresin cualquiera). Los parmetros de entrada/salida se usan cuando se desea que un procedimiento MODIFIQUE el contenido de la variable actual. El hecho de definir estos parmetros explcitamente como variables hace consciente al programador de los lugares donde un procedimiento cambia a una variable que se le pase como parmetro. El funcionamiento de los parmetros de entrada/salida est basado en pasar al procedimiento una referencia a la variable actual en lugar de su valor. Por ello, a estos parmetros tambin se los denominan parmetros por referencia. Ejemplo: void raices( float a, float b, float c, float &R1, float &R2 ) { float DiscriminanteS; // Se supone un discriminante positivo DiscriminanteS = sqrt( b*b-4.0*a*c ); R1 = (-b + DiscriminanteS) / (2.0*a); R2 = (-b - DiscriminanteS) / (2.0*a); } Para el compilador la zona de memoria representada por el parmetro formal y real es la misma y al terminar la ejecucin del procedimiento el parmetro real puede haber cambiado su valor. No existe ninguna relacin entre los identificadores de los parmetros formales y reales. La transferencia de valores se efecta por posicin en la lista de parmetros y no por el nombre que stos tengan. Por ejemplo, el resultado de ejecutar a= 5; b = 3; p(a,b); es el mismo que el de ejecutar b = 5; a = 3; p(b,a); siempre que el procedimiento p no intente cambiar el valor de las variables que recibe como parmetros. Ejercicios 1. Dos nmeros a y b se dice que son amigos si la suma de los divisores de a (salvo l mismo) coincide con b y viceversa. Disea un programa que tenga como entrada dos nmeros naturales y que muestre en la pantalla todas las parejas de nmeros amigos que existan en dicho intervalo. 2. Escribe un algoritmo que lea 2 nmeros enteros positivos y un carcter. En funcin de este carcter ledo efectuar las siguientes operaciones: 'p' : calcula los nmeros perfectos en el rango dado por los 2 nmeros. 'm': calcula el mnimo comn mltiplo de ambos nmeros. 'd' : calcula el mximo comn divisor de los mismos. '+', '*', '-', '/' : realiza la operacin correspondiente con los nmeros. '&' Salir del programa
Jos Luis Pastrana Brincones @ 2001 2

Elementos de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 6: Arrays Unidimensionales en C++.


En los temas anteriores se han estudiado los diferentes tipos de datos simples de C++, usados para representar valores simples como enteros, reales o caracteres. Sin embargo, en muchas situaciones se precisa procesar una coleccin de valores que estn relacionados entre s, como por ejemplo una lista de calificaciones, una tabla de temperaturas, etc. El procesamiento de tales conjuntos de datos utilizando tipos simples puede ser extremadamente complejo y tedioso, y por ello la mayora de los lenguajes de programacin incluyen mecanismos sintcticos para manipular agrupaciones de datos, son las llamadas estructuras de datos. La estructura de datos ms bsica soportada por los lenguajes es el array. Un array se puede visualizar como una coleccin de cajas que representan variables de un mismo tipo de datos, tal y como se ilustra en la siguiente figura. A este tipo de array se le suele denominar array unidimensional o vector. Para hacer referencia a una caja o componente en particular, usaremos el nombre o identificador del array seguido por un nmero (ndice) entre corchetes, que indicar su posicin dentro del array. Realmente lo que va entre corchetes al referirse a la posicin de un componente de un array, puede ser cualquier expresin que al evaluarse d como resultado un valor numrico entero positivo. Un rasgo importante de los arrays en C++ es que el tipo ndice es siempre un subrango de naturales empezando por 0, por lo que a la hora de definir un array solo ser necesario indicar su dimensin. As definimos una variable de un tipo array como: tipo nombre_array [dimensin]; Donde tipo es el tipo base de los componentes del array y "dimensin" es un nmero natural mayor de cero que representa la longitud o dimensin del array. Ejemplos: int vector [10]; // Array de 10 enteros bool logicos [50]; // Un array de 50 lgicos Aunque lo ms adecuado, tal como se ha comentado en el programa de ejemplo del apartado anterior, es usar constantes globales para definir la dimensin de los arrays. const int MAXVECTOR = 10; const int MAXLOGICOS = 50; int vector [MAXVECTOR]; bool logicos [MAXLOGICOS]; // Array de 10 enteros // Array de 50 lgicos

Aunque como hemos visto se pueden definir variables de array al mismo tiempo que se define su tipo base y su dimensin (definicin implcita de tipos array), lo correcto es definir separadamente los tipos de datos, asignndoles un nombre, y posteriormente declarar las variables como pertenecientes a los tipos anteriormente definidos. C++ incorpora un mecanismo para definir nuevos tipos de datos, la sentencia typedef. Sintaxis: typedef tipo_conocido nombre_nuevo_tipo; Ejemplo: Declarar variables de tipo TContador: typedef unsigned int Tcontador; Tcontador i, j; El objetivo fundamental de esta sentencia es mejorar la claridad del cdigo fuente asociando nombres simblicos a tipos de datos definidos por el programador. Segn esto, en el caso de definicin de tipos array la sintaxis concreta sera entonces: typedef tipo_base nombre_nuevo_tipo [dimensin]; Ejemplos: const unsigned int MAXVECTOR = 4; const unsigned int MAXLISTA = 7; typedef int Tvector [MAXVECTOR]; typedef unsigned int Tlista [MAXLISTA]; Posteriormente se pueden definir variables de estos tipos: Tvector v; Tlista mi_lista; Nota: Slo se puede definir un nico tipo en cada sentencia typedef. Jos Luis Pastrana Brincones @ 2002 1

Elementos de Programacin 1A E.T.S.I. Informtica Gestin

Un polinomio de grado n, p(x) = a0 + a1x + a2x2 + + anxn , podemos representarlo mediante un array de sus coeficientes (a0, a1, a2, , an). Disea un programa C++ que defina el tipo TPolinomio como un array de un tamao mximo de 10 elementos (grado mximo del polinomio) y que presente al usuario las siguientes opciones de men: Cada operacin deber mostrar el resultado por pantalla, hacer una pausa y volver al men principal. Vase el siguiente ejemplo de Men:
#include <iostream.h> #include <stdlib.h> #include <ctype.h> // Necesario para toupper char void void bool Menu(); Pausa(); clrscr(); ConfirmarSalida();

CALCULADORA DE POLINOMIOS Elaborado Por : Nombre Apellidos E.T.S.I Informtica de Gestin Curso: 1A Fecha: 16 de Enero de 2.002

A.- Leer el Polinomio 1 (p1) B.- Leer el Polinomio 2 (p2) C.- Calcular p1 + p2 D.- Calcular p1 - p2 E.- Calcular p1 * p2 F.- Calcular Derivada de p1 G.- Calcular Derivada de p2 X.- Salir del Programa Opcin:

int main() { bool salir; char OpcionMenu; salir = false; while(!salir) { clrscr(); OpcionMenu = Menu(); switch(OpcionMenu) { case 'A': cout << "Ha seleccionado la Opcion A" << endl; break; case 'B': cout << "Ha seleccionado la Opcin B" << endl; break; case 'C': cout << "Ha seleccionado la Opcion C" << endl; break; case 'X': salir = ConfirmarSalida(); break; } Pausa(); } return 0; } char Menu() { char op; cout << " MENU" << endl; cout << " ====" << endl; cout << "Elaborado Por : Nombre Apellidos" << endl; cout << "E.T.S.I Informatica de Gestion Curso: 1-A " << endl; cout << "Fecha: 16 de Enero de 2.002" << endl << endl << endl; // 3 saltos de lnea cout << "A.- Opcion A" << endl; cout << "B.- Opcion B" << endl; cout << "C.- Opcion B" << endl; cout << "X.- Salir del Programa" << endl; cout << endl << "Opcion: "; cin >> op; op = toupper(op); // Paso op a maysculas while ( (op!='X') && ((op<'A') || (op>'C')) ) { cout << endl << "Opcion Incorrecta ..." << endl << "Opcion: "; cin >> op; op = toupper(op); // Paso op a maysculas } return op; } bool ConfirmarSalida() { char si_no; cout << endl << endl << "Esta seguro de que quiere salir (S/N)?"; cin >> si_no; si_no = toupper(si_no); return (si_no=='S'); } /* Pause y clrscr pueden ser implementadas de forma ms eficiente. Ms adelante, cuando se trate el tema de libreras y compilacin separada, se vern otras soluciones ms elegantes. */ void Pausa() { system("Pause"); } void clrscr() { system("cls"); }

Jos Luis Pastrana Brincones @ 2002 2

Elementos de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 7: Arrays multidimensionales y Cadenas de caracteres en C++.


Arrays Multidimensionales
A veces, es til y necesario poder declarar arrays de ms de una dimensin. Esto se corresponde con estructuras de datos muy utilizadas como matrices, tablas, cubos, etc. Formalmente, pueden ser declarados como tipos y luego usarlo para declarar variables: typedef <tipo> <nomTipo> [<valor_cte>]{[<valor_cte>]}; y posteriormente <nomTipo> <nomVar>; o bien, en la declaracin de variables <tipo> <nomVar> [<valor_cte>]{[<valor_cte>]}; Suponiendo declarados const int DIM1=3; const int DIM2=4; Dichos arrays se declaran de la siguiente forma1: typedef int TMatriz[DIM1][DIM2]; y posteriormente TMatriz m; o bien, en la declaracin de variables int m[DIM1][DIM2]; El acceso a las componentes de una variable m de tipo TMatriz se realiza indicando sus ndices entre corchetes. Por ejemplo, m[i][j] o bien m[1][2]

Cadenas de Caracteres (Strings).


Una cadena de caracteres no es ms que un array de caracteres.
EN C++ TODAS LAS CADENAS DE CARACTERES DEBEN LLEVAR EL CARCTER 0 COMO TERMINADOR.

Veamos a continuacin una posible definicin de cadenas de caracteres, as como la implementacin de algunas de las funciones ms tpicas de manejo de cadenas de caracteres. const char FINCAD = char(0)2; const int MAXCAD = 20; const int ENTER = '\n'; typedef char TCadena[MAXCAD+1]; // MAXCAD caracteres + FINCAD int LongitudCadena(TCadena s) { int i; i=0; while ((i<MAXCAD)3&& (s[i]!=FINCAD) ) { ++i; } return i; } void CopiaCadena(TCadena s1, TCadena &s2) // s2 <- s1 { int i; i=0; while ( (i<MAXCAD) && (s1[i]!=FINCAD) )
1 2 3

La declaracin de tipos permite su uso a lo largo de todo el programa, lo que lo hace un mtodo ms adecuado y elegante. Tambin es vlido el uso de '\0' para indicar el carcter constante 0 Si bien esta comparacin no es necesaria, es conveniente su uso para evitar errores producidos por datos "corruptos".

Jos Luis Pastrana Brincones @ 2002 1

Elementos de Programacin 1A E.T.S.I. Informtica Gestin { s2[i]=s1[i]; ++i; } s2[i]=FINCAD; } void LeeCadena(TCadena &s) { int i; char c; i=0; c = cin.get(); while ( (i<MAXCAD) && (c!=ENTER) ) { s[i]=c; ++i; c = cin.get4(); // cin.get lee 1 carcter sin saltarse los de control } s[i] = FINCAD; } Ejercicio 1. Implementa un procedimiento que concatene 2 cadenas de caracteres, de tal manera que la segunda quede "pegada" detrs de la primera. Posteriormente, escriba un programa que lea 2 cadenas y muestre su concatenacin por pantalla. void append(TCadena &s1, TCadena s2) Ejercicio 2. Escriba un programa que lea un NIF y compruebe que su letra es correcta, es decir, la letra introducida por el usuario se corresponde con la calculada. Algoritmo para el clculo del NIF: 1. Calcule el Mdulo 23 (resto de la divisin) del nmero del DNI. 2. La letra corresponde a la que haya para ese valor en la siguiente tabla: MODULO 0 1 2 3 4 5 6 7 8 9 10 11 LETRA T R W A G H Y F P D X B MODULO 12 13 14 15 16 17 18 19 20 21 22 LETRA N J Z S Q V H L C K E

Se usa la funcin cin.get() porque cin ignora los espacios y caracteres de control.

Jos Luis Pastrana Brincones @ 2002 2

Elementos de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 8: Enumerados y Registros en C++.


Tipos Enumerados.
Aunque los tipos de datos predefinidos son tericamente adecuados para cualquier propsito, existe un gran nmero de situaciones en las cuales es conveniente que el programador pueda definir sus propios tipos de manera que especifique literalmente los valores que una variable de ese tipo puede tomar. Estos son los llamados tipos enumerados. Si , por ejemplo, quisiramos definir una variable para que represente una situacin de un problema en el que hay cinco posibles colores, (rojo, amarillo, verde, azul y naranja) podramos hacer lo siguiente: const int rojo const int azul const int verde = 0 ; = 1 ; = 2 ;

int color1, color2; Sin embargo, en C++ podemos definir un nuevo tipo ordinal que conste de esos cinco valores exactamente: typedef enum { rojo, azul, verde } TColor; Tcolor color1, color2; La declaracin de un tipo de esta ndole consiste en asociar a un identificador una enumeracin de los posibles valores que una variable de ese tipo puede tomar, por lo que una misma constante no puede aparecer en dos definiciones de tipo. El orden de los valores de estos nuevos tipos declarados por el programador ser aquel en que aparecen dentro de la lista de enumeracin de los elementos del tipo. El tipo enumerado es tambin un tipo escalar y ordinal, por lo que permite calcular su ordinal y valor. Expresin Valor Expresin Valor 0 TColor(0) Rojo int(rojo) 1 TColor(1) Azul int(azul) 2 TColor(2) Verde int(verde) Sin embargo, al no estar definidos sobre ellos las operaciones de suma y resta, cmo obtener su sucesor o predecesor? La solucin consiste en la definicin de una funcin que calcule su ordinal, incremente este, y posteriormente lo retorne a enumerado. Veamos un ejemplo: TColor SUC (TColor c) { int ord; TColor res; ord = int(c) + 1; res = TColor(ord); return res; } } TColor PRED (TColor c) { int ord; TColor res; ord = int(c) - 1; res = TColor(ord); return res;

Esta solucin, tiene el problema de que es responsabilidad del usuario el no utilizarlas sobre el primer o ltimo elemento, pero tiene la ventaja de que permite tambin, que el implementador realice un modelo circular de sucesin como el siguiente: const int MAX_COLOR = 3; TColor SUC (TColor c) { int ord; TColor res; ord = (int(c) + 1)% MAX_COLOR; res = TColor(ord); return res; } } TColor PRED (TColor c) { int ord; TColor res; ord = (MAX_COLOR + int(c) - 1) % MAX_COLOR ; res = TColor(ord); return res;

Otro problema del uso de enumerados reside en que no pueden ser ledos y escritos directamente por pantalla/teclado, sin embargo, no es difcil realizar funciones de conversin entre enumerados y cadenas o viceversa. (Ver apuntes). Jos Luis Pastrana Brincones @ 2002 1

Elementos de Programacin 1A E.T.S.I. Informtica Gestin

Registros
Un registro es una estructura cuyos componentes pueden ser de diferente tipo. Para declarar un tipo registro se debe incluir el nombre y el tipo de cada componente del mismo. En C++ se usa la palabra reservada struct para indicar que el tipo que se est definiendo es un registro o estructura. Los campos de un registro pueden ser de cualquier tipo, incluyendo arrays y registros y son llamados campos o variables miembro que pueden ser accedidas individualmente mediante notacin '.' Formalmente, podemos definir un registro de la siguiente manera: <TipoRegistro>::= struct <nombreTipo> '{' { <tipo> <nomVar> {, <tipo> <nomVar>}; } '}'; Algunos Ejemplos: const char FINCAD = char(0); const int MAXCAD = 20; typedef char TCadena[MAXCAD+1]; // MAXCAD caracteres + FINCAD struct Tfecha { int dia, mes, anho; }; struct TPersona { TCadena nombre, apellido1, apellido2; int edad; TCadena nif; Tfecha fecha_nacimiento; } Las declaraciones de variables se realizan normalmente, es decir: TPersona per; Tfecha f1; Los nombres de los campos de un registro son locales a l, por lo que no hay conflicto con otros nombres usados en el mdulo. Una referencia a un campo de un registro consiste en el nombre de la variable registro y el nombre del campo, separados por un punto, por ejemplo: per.edad = 30; Un registro completo puede aparecer en cualquier parte de una sentencia de asignacin y como parmetros de procedimientos, por ejemplo: per.fecha_nacimiento = f1;

Prctica
La empresa Los Planes Reformados S.A., ha decidido informatizar la gestin de sus trabajadores. Dicha empresa tiene un mximo de 10 trabajadores en plantilla, debindose almacenar la siguiente informacin de cada trabajador: nombre, apellidos (ambos son cadenas de un mximo de 80 caracteres), y turno (matinal, tarde, noche) que debe implementarse obligatoriamente con un tipo enumerado. La aplicacin deber mostrar en pantalla un men con las siguientes opciones: A. Insertar Trabajador. Se pedir el nmero de trabajador, que debe ser un nmero entre el 1 y el 10 y se comprobar que no hay ningn trabajador almacenado con ese nmero. Si el nmero de trabajador no fuera vlido (no est entre 1 y 10) o ya estuviera algn trabajador almacenado con ese nmero, se informar del pertinente error y se volver al programa principal. En cambio, si el nmero es vlido, se pedirn el resto de los datos (nombre, apellidos y turno) y se insertar dicho trabajador en la estructura. B. Buscar Trabajador. Se pedir por teclado el nmero de trabajador. Si el nmero de trabajador no fuera vlido (no est entre 1 y 10) o no hubiera algn trabajador almacenado con ese nmero, se informar del pertinente error y se volver al programa principal. En cambio, si el nmero es vlido, se mostrar por pantalla todos los datos (nombre, apellidos y turno) de dicho trabajador. C. Listar Trabajadores. Se mostrar por pantalla todos los datos (nombre, apellidos y turno) de los trabajadores que estn almacenados en la estructura precedidos de su nmero de trabajador. D. Borrar Trabajador. Se pedir por teclado el nmero de trabajador. Si el nmero de trabajador no fuera vlido (no est entre 1 y 10) o no hubiera algn trabajador almacenado con ese nmero, se informar del pertinente error y se volver al programa principal. En cambio, si el nmero es vlido, se mostrar por pantalla todos los datos (nombre, apellidos y turno) de dicho trabajador y se informar de que va a ser borrado, pasndose a eliminarlo de la estructura (sin pedir conformidad). X. Salir del Programa. Se pedir al usuario una confirmacin de abandono del programa, saliendo del mismo en caso de que sea afirmativa y mostrando el nombre, apellidos y curso del autor del programa o volviendo al men principal si no lo es. Jos Luis Pastrana Brincones @ 2002 2

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 9: Ordenacin y Bsqueda en C++.


Teora
Veamos a continuacin algunos de los algoritmos clsicos de ordenacin y bsqueda. y sus posibles implementaciones en C++.
// CUEPROS DE PROCEDIMIENTOS Y FUNCIONES void BusquedaSecuencial(int x, TVector v, int ini, int fin, int &pos, bool &encontrado) { pos = ini; encontrado=false; while ( (pos <=fin) && (!encontrado) ) { if (v[pos]==x) { encontrado=true; } else { ++pos; } } } void BusquedaBinaria(int x, TVector v, int ini, int fin, int &pos, bool &encontrado) { encontrado=false; while ( (ini <=fin) && (!encontrado) ) { pos = (ini+fin)/2; if (v[pos]==x) { encontrado=true; } else if (x < v[pos]) { ini = pos +1; } else { fin = pos-1; } } } void OrdenacionInserccion(TVector &v,int ini, int fin) { int i, pos, aux; for(i=ini+1;i<=fin;++i) { aux = v[i]; pos = buscar_posicion(aux, v, ini, i-1); abrir_hueco(v, pos, i); v[pos]=aux; } } void OrdenacionSeleccion(TVector &v,int ini, int fin) { int i,pos; for(i=ini;i<fin;++i) { pos = PosicionmenorElemento(v,i,fin); intercambia(v[i],v[pos]); } } void OrdenacionIntercambio(TVector &v,int ini, int fin) { int i,j,aux; bool intercambio; intercambio= true; i=ini; while( (i<=fin-1) && (intercambio) ) { intercambio = false; for(j=ini;j<=fin-1;++j) { if (v[j]>v[j+1]) { intercambio= true;

Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin


intercambia(v[j],v[j+1]); } } ++i; } } int buscar_posicion(int aux, TVector v, int ini, int fin) { int i; i = ini; while( (i<=fin) && (v[i]<aux) ) { ++i; } return i; } void abrir_hueco(TVector &v, int ini, int fin) { int i; for(i=fin;i>=ini+1;--i) { v[i] = v[i-1]; } } void intercambia(int &x, int &y) { int t; t = x; x = y; y = t; } int PosicionmenorElemento(TVector v,int ini, int fin) { int i,menor; menor = ini; for(i=ini+1;i<=fin;++i) { if (v[i]<v[menor]) { menor = i; } } return menor; }

Prctica
Se desea elaborar un diccionario ingls/espaol, en el que cada palabra en ingls tiene un mximo de 5 posibles traducciones al espaol, junto con un conjunto de usos gramaticales de esa palabra (sustantivo, adjetivo, preposicin, verbo). Por cuestiones de eficiencia se decide implementar el diccionario usando una tabla hash, cuyo ndice vaya de la 'A' a la 'Z' y se usar un cubo de un mximo de 20 palabras para manejar las posibles colisiones (palabras diferentes que empiecen por la misma letra). Debido a que las palabras en un diccionario deben estar ordenadas, ser necesario que las colisiones y las traducciones tambin lo estn. Esto, adems, podr ser utilizado para buscar una palabra de forma ms rpida, ya que podremos usar un algoritmo de bsqueda binaria. Se pide realizar un programa en C++ con las siguientes opciones de men: A. Inserta una palabra en el diccionario. B. Busca una palabra en el diccionario a partir de su nombre en ingls y escribe en pantalla todas sus traducciones y usos gramaticales. C. Borra una palabra del diccionario a partir de su nombre en ingls. D. Modifica una palabra del diccionario. E. Listar Diccionario. Muestra todas las palabras del diccionario, as como sus traducciones y usos, ordenadas alfabticamente. X. Salir del Programa. Se pedir al usuario una confirmacin de abandono del programa, saliendo del mismo en caso de que sea afirmativa y mostrando el nombre, apellidos y curso del autor del programa o volviendo al men principal si no lo es.

Jos Luis Pastrana Brincones @ 2002 2

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Teora

Prctica 10: Recursividad en C++.

La recursividad consiste en que En el cuerpo de sentencias del subalgoritmo se invoca al propio subalgoritmo para resolver una versin ms pequea del problema original. Por ejemplo, la funcin factorial podra implementarse: int factorial( int n) { if (n>0) { return n*factorial(n-1); } else { return 1; } }

Prctica.
Completar el cdigo que se muestra a continuacin para que ordene un vector generado aleatoriamente utilizando los algoritmos QuickSort y MergeSort. El algoritmo bsico de Ordenacin Rpida (QuickSort) es: SI terminado ENTONCES Dividir el array por un valor V (Pivote) OrdRpida los elementos menores iguales que V OrdRpida los elementos mayores que V FINSI

El algoritmo bsico de Ordenacin por Mezcla (MergeSort) es: a) Sea k el ndice del elemento mitad del array. b) Ordena los elementos hasta a[k], incluyndolo. c) Ordena los elementos siguientes. d) Mezcla los dos subarrays en un nico array ordenado. #include <iostream.h> #include <stdlib.h> #include <time.h> //CONSTANTES const int MAX = 10; //TIPOS typedef int TVector[MAX]; // CABECERA DE PROCEDIMIENTOS Y FUNCIONES void void void void void void void void generaVector( TVector &v); CopiaVector( TVector v1, TVector &v2); pintaVector( TVector v); QuickSort(TVector &v,int ini, int fin); MergeSort(TVector &v,int ini, int fin); Particion(TVector &v,int ini, int fin, int &ptoDiv); Merge(TVector &v,int ini, int fin, int k); intercambia(int &x, int &y);

// PROGRAMA PRINCIPAL int main() { TVector v1,v2; int x,pos; bool ok; generaVector(v1); Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin CopiaVector(v1,v2); // v2 = v1; pintaVector(v1); cout << "Ordenacin QuickSort: " << endl ; QuickSort(v1,0,MAX-1); pintaVector(v1); cout << "Ordenacin MergeSort: " << endl ; MergeSort(v2,0,MAX-1); pintaVector(v2); system("Pause"); return 0; } void generaVector( TVector &v) { int i; srand((unsigned)time(NULL)); // Inicializacin aleatorios for(i=0;i<MAX;++i) { v[i] = rand(); // almaceno en v[i] un valor aleatorio } } void CopiaVector( TVector v1, TVector &v2) { int i; for(i=0;i<MAX;++i) { v2[i] = v1[i]; } } void pintaVector( TVector v) { int i; cout << "v = { "; for(i=0;i<MAX-1;++i) { cout << v[i] << ", "; } cout << v[MAX-1] << " }" << endl; } void QuickSort(TVector &v,int ini, int fin) { } void Particion(TVector &v,int ini, int fin, int &ptoDiv) { } void MergeSort(TVector &v,int ini, int fin) { } void Merge(TVector &v,int ini, int fin, int k) { } void intercambia(int &x, int &y) { int t; t = x; x = y; y = t; } Jos Luis Pastrana Brincones @ 2002 2

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 11: Repaso de Conceptos Previos


Un Hotel desea llevar de manera informatizada la gestin de reservas y facturas de sus habitaciones. El Hotel consta de 3 plantas y 10 habitaciones por planta, siendo suite la primera habitacin de cada planta, simple la ltima y doble el resto. Para cada habitacin tendremos la siguiente informacin: Tipo de Habitacin(simple, doble o suite), N.I.F., nombre, primer apellido y segundo apellido de la persona que realiza la reserva(todos ellos con un mximo de 20 caracteres) y fecha de entrada en el hotel. Se pide realizar un programa para la gestin de dicho hotel. Para ello debern definirse los tipos que se consideren necesarios e implementar los procedimientos y funciones que el alumno considere oportuno para ofrecer al usuario las siguientes opciones de men: HOTEL TEATINOS A. B. C. D. E. F. Descripcin de las Opciones: Reservar Habitaciones. Se pedir al usuario el NIF, nombre, apellidos, tipo de habitacin (que deberemos asegurar que sea simple, doble o suite) y fecha de entrada. Se buscar una habitacin libre del tipo que desea el usuario y se almacenar toda la informacin correspondiente. Si la operacin se ha realizado con xito, se dar como salida al usuario el nmero de habitacin 1, en caso contrario se dar un mensaje de error indicando que no existen habitaciones libres de esas caractersticas, volviendo el programa al men principal. Nmero Habitaciones Libres de un Tipo. Se pedir al usuario el nombre de un tipo de habitacin que debe ser correcto y se mostrar como salida por pantalla el nmero de habitaciones libres que hay en el hotel de ese determinado tipo. Visualizar el Hotel. Se mostrar por pantalla todas las habitaciones del hotel, indicando para cada una de ellas el nmero de habitacin, el tipo de habitacin, si est libre u ocupada y en caso de que est ocupada el nombre y apellidos del ocupante. Buscar Persona Alojada. Se pedir el nombre y los apellidos de una persona, mostrndose en pantalla todos los datos de dicha persona, el nmero de la habitacin en que se encuentra y la fecha en que lleg al hotel. Si la persona no est alojada en el hotel, se dar un mensaje de error indicando esta situacin. Abandonar el Hotel y Emitir Factura. Se pide al usuario el nmero de habitacin 1 y la fecha de salida2. Se mostrar en pantalla los datos del cliente y habitacin, as como el nmero de das que ha estado en el hotel y el importe total de la factura3 , tras lo cual esa habitacin quedar libre. Salir del Programa. Se pedir al usuario una confirmacin de abandono del programa, saliendo del mismo en caso de que sea afirmativa y mostrando el nombre, apellidos y curso del autor del programa o volviendo al men principal si no lo es.
3

Reservar Habitaciones. Nmero Habitaciones Libres de un Tipo. Visualizar el Hotel. Buscar Persona Alojada. Abandonar el Hotel y Emitir Factura. Salir del Programa

Precios por Habitacin y Da


Tipo de Habitacin simple doble Suite Precio 12.000 ptas. 17.000 ptas. 45.000 ptas.

El nmero de habitacin est formado por 3 dgitos. El primero corresponde al nmero de planta y los otros dos al orden de la habitacin dentro de la planta. Ejemplo: La habitacin 205 es la quinta habitacin de la segunda planta. 2 Para mayor simplicidad se supondr que la fecha de entrada y salida son en el mismo mes del mismo ao. 3 Ver tabla adjunta de precios.

Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 12: Gestin

Dinmica de Memoria

Teora. Los tipos de datos vistos hasta ahora, tanto los simples como los estructurados, sirven para describir datos o estructuras de datos cuyos tamaos y formas se conocen de antemano. Sin embargo, hay muchos programas cuyas estructuras de datos pueden variar de forma y tamao durante la existencia del mismo. Las variables de todos los tipos de datos vistos hasta ahora son variables estticas, en el sentido de que se declaran en el programa, se designan por medio del identificador declarado, y se reserva para ellas un espacio en memoria en tiempo de compilacin. El contenido de la variable podr cambiar durante la ejecucin del programa, pero no el tamao de memoria reservado para esta variable. Sin embargo C++, permite la posibilidad de crear o destruir variables en tiempo de ejecucin, a medida que van siendo necesitadas durante la ejecucin del programa. Puesto que estas variables no son declaradas en el programa, no tienen nombre y se denominan variables annimas. Si un lenguaje permite la creacin de variables annimas, debe tambin proporcionar una forma de referirse a estas variables, de modo que se le puedan asignar valores. Del mismo modo, debe proporcionar una forma de acceder a estas. Para ello C++ proporciona el tipo Puntero. Definicin: Un puntero es una variable cuyo valor es la direccin de memoria de otra variable. Se hace una distincin entre la variable referencia (puntero) y la variable referenciada por un puntero (annima o apuntada). Variable Referencia (Puntero): Es una variable esttica, es decir se crea en tiempo de compilacin. Variable Referenciada (Annima): Es una variable dinmica creada en tiempo de ejecucin, que nicamente puede ser accedida a travs de un puntero. Una variable puntero no puede apuntar a cualquier variable annima; debe apuntar a variables annimas de un determinado tipo. El tipo de la variable annima vendr determinado por el tipo de la variable que la apunta. Este tipo debe ser incluido en la especificacin del tipo puntero. Una declaracin de puntero consiste en un tipo base, un * y el nombre. La forma general de declaracin de un puntero es: typedef <tipo> *<t_puntero>; ......................... <t_puntero> <id_variable>; <t_ tipo > *<id_variable>;

donde tipo es el tipo base del puntero, que puede ser cualquier tipo vlido. Ejemplos de declaracin de punteros son los siguientes:
int *contador; // Puntero a una variable de tipo entero (int) char *carcter; // Puntero a una variable de tipo carcter (char) struct TComplex { float parte_real; float parte_imag; }; TComplex *ptr1; // ptr1 es un puntero a un valor de tipo TComplex ptr1, es un puntero, por tanto contendr una direccin de memoria; en esa posicin de memoria (*ptr1)habr una variable de tipo TComplex. Cuando hablamos de asignacin dinmica de memoria, nos referimos al hecho de crear variables annimas, es decir reservar espacio en memoria para estas variables en tiempo de ejecucin, y tambin a liberar el espacio reservado para una variable annima en tiempo de ejecucin, en caso de que dicha variable ya no sea necesaria. La funcin new() reservar la cantidad apropiada de memoria para almacenar un dato de dicho tipo. El prototipo de la funcin new() es: void *new(<nombre_tipo>); La funcin new tambin se encarga de averiguar cual es el tamao en bytes del tipo de datos para el cual se desea reservar memoria. Observar en el ejemplo anterior que se indica el que se quiere reservar memoria para un dato de tipo char y no cual es el tamao en bytes que se quiere reservar. Tras una llamada con xito, new() devuelve un puntero al primer byte de la regin de memoria dispuesta del montn. Si no hay suficiente memoria libre para satisfacer la peticin, se produce un fallo de asignacin y new() devuelve un nulo. La funcin delete() es la complementaria de new(). Una vez que la memoria ha sido liberada, puede ser reutilizada en una posterior llamada a new(). El prototipo de la funcin delete() es: Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin void delete(void *p); C++ permite punteros a estructuras igual que permite punteros a cualquier otro tipo de variables. Sin embargo, hay algunos aspectos especiales que afectan a los punteros a estructuras que vamos a describir a continuacin. En un programa podemos tener un puntero a una estructura de dos formas diferentes. La primera forma es declarar en el programa una variable de tipo estructura, y una variable que sea un puntero a dicha estructura. struct bal { float balance; char nombre[80]; }; bal persona; bal *p; // Variable persona de tipo struct bal // Puntero a una estructura de tipo struct bal

A continuacin tenemos que usar el operador & para colocar la direccin de la estructura persona en el puntero p. p = &persona; // p tiene la direccin de la variable persona La segunda forma es declarar una variable puntero a la estructura y reservar memoria para la estructura de forma dinmica. p = new(bal); // p apunta a una variable annima Para acceder a los miembros de una estructura a travs de un puntero a esa estructura se debe usar el operador ->. p -> balance // accede al campo balance de la estructura A -> se le denomina operador flecha y consiste en el signo menos seguido de un signo de mayor. Cuando se accede a un miembro de una estructura a travs de un puntero a la estructura, se usa el operador flecha en lugar del operador punto. Los punteros y la asignacin dinmica de memoria permiten la construccin de estructuras enlazadas. Una estructura enlazada es una coleccin de nodos, cada uno de los cuales contiene uno o ms punteros a otros nodos. Cada nodo es un registro en el que uno o ms campos son punteros. La estructura enlazada ms sencilla es la lista enlazada. Una lista enlazada consiste en un nmero de nodos, cada uno de los cuales contiene uno o varios datos, ms un puntero; el puntero permite que los nodos formen una cadena.

Una variable puntero (puntero externo) apunta al primer nodo en la lista, el primer nodo apunta al segundo, y as todos los dems. El ltimo nodo contiene el valor nulo en su campo de tipo puntero. Ejemplo: typedef struct TNodo *TLista; /* Hace falta indicar que es un puntero a una estructura porque sta todava no se ha definido */ struct TNodo { char c; TLista sig; }; Podemos dibujar un valor de tipo TNodo como una caja con dos campos. Una lista de caracteres tendra la forma siguiente, donde primero es el puntero externo que apunta al primer nodo de la lista: TLista primero;

a primero

Jos Luis Pastrana Brincones @ 2002 2

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin Con esta estructura, para almacenar una cadena de caracteres en memoria iremos leyendo carcter a carcter desde teclado, y creando variables annimas de forma dinmica, almacenando en cada una de ellas un carcter y enlazndolas mediante los campos puntero; as hasta que nos introduzcan un retorno de carro, que me indicar el final de la cadena de caracteres. Prctica.

Deseamos realizar un programa que nos permita realizar ciertas operaciones con polinomios que tengan un nmero de trminos variable. Para ello, implementaremos el tipo polinomio como una lista enlazada de registros que contienen el coeficiente y el exponente. Debemos mostrar las siguientes opciones de men:
Laboratorio de Programacin. Prctica 12: El Tipo Puntero Autor: < Nombre y Apellidos del alumno> POLINOMIOS A. B. C. D. E. F. Evaluar Buscar trmino Grado Derivada Suma Salir del Programa

q q q q q q

Evaluar polinomio. Se pedir por pantalla/Teclado un polinomio y un valor. Se evaluar el polinomio en ese punto. Buscar trmino. Se pedir un polinomio y un grado g, devolvindose el coeficiente de grado g de ese polinomio. Grado. Se mostrar el grado de un polinomio dado por teclado. Derivada. Dado un polinomio se realizar la derivada, y, con posterioridad, se escribir por pantalla el polinomio resultado. Suma. Dados dos polinomios, se realizar la suma de ambos, y, con posterioridad, se escribir por pantalla el polinomio resultado. Salir del Programa. Se pedir confirmacin de salida, si esta es afirmativa saldremos del mismo, en caso contrario volveremos al men principal.

Despus de cada opcin se har una pausa y se limpiar la pantalla antes de volver al men principal.

Jos Luis Pastrana Brincones @ 2002 3

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 13: Gestin

Dinmica de Memoria

Modificar la prctica nmero 8, de manera de que el nmero de trabajadores de la empresa sea ilimitado. Para ello, en vez de un array, tendremos la siguiente estructura:

Figura 1. Esquema de la Estructura de Datos Enunciado. La empresa Los Planes Reformados S.A., ha decidido informatizar la gestin de sus trabajadores. Dicha empresa tiene un nmero indeterminado de trabajadores en plantilla, debindose almacenar la siguiente informacin de cada trabajador: nombre, apellidos (ambos son cadenas de un mximo de 80 caracteres), y turno (matinal, tarde, noche) que debe implementarse obligatoriamente con un tipo enumerado. La aplicacin deber mostrar en pantalla un men con las siguientes opciones: Laboratorio de Programacin. Prctica 13: Gestin Dinmica Autor: < Nombre y Apellidos >

de

Memoria

Los Planes Reformados S.A. 2.0 A. B. C. D. Insertar Trabajador Buscar Trabajador Listar Trabajadores Borrar Trabajador

X. Salir del Programa Introduzca su Opcin:

A. Insertar Trabajador. Se pedir el nmero de trabajador y se comprobar que no hay ningn trabajador almacenado con ese nmero. Si ya estuviera algn trabajador almacenado con ese nmero, se informar del pertinente error y se volver al programa principal. En cambio, si el nmero es vlido, se pedirn el resto de los datos (nombre, apellidos y turno) y se insertar dicho trabajador en la estructura. B. Buscar Trabajador. Se pedir por teclado el nmero de trabajador. Si no hubiera algn trabajador almacenado con ese nmero, se informar del pertinente error y se volver al programa principal. En otro caso, se mostrar por pantalla todos los datos (nombre, apellidos y turno) de dicho trabajador. C. Listar Trabajadores. Se mostrar por pantalla todos los datos (nombre, apellidos y turno) de los trabajadores que estn almacenados en la estructura precedidos de su nmero de trabajador. D. Borrar Trabajador. Se pedir por teclado el nmero de trabajador. Si existe un trabajador con dicho nmero, se mostrar por pantalla todos los datos (nombre, apellidos y turno) de dicho trabajador y se informar de que va a ser borrado, pasndose a eliminarlo de la estructura (sin pedir conformidad). En caso contrario no se har nada. X. Salir del Programa. Se pedir al usuario una confirmacin de abandono del programa, saliendo del mismo en caso de que sea afirmativa y mostrando el nombre, apellidos y curso del autor del programa o volviendo al men principal si no lo es. Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 14: Ficheros

en C++

Todos los programas vistos hasta ahora trabajaban con informacin almacenada en memoria principal, no obstante, hay situaciones en que esto no es apropiado. Algunas de esas situaciones podran ser: Los datos con los que necesita trabajar el programa son demasiado grandes (ocupan mucha memoria) para que entren en la memoria principal. Nos interesa mantener la informacin despus de cada ejecucin, necesitamos utilizar datos procedentes de otros programas (editores, etc.), o generar datos para que puedan ser utilizados por otros programas. En dichos casos se utilizarn ficheros para contener la informacin en memoria secundaria (disco duro, disquetes, etc.). Definicin de Fichero: Es una coleccin de elementos lgicamente relacionados y almacenados en memoria secundaria. A ms bajo nivel, un fichero es una secuencia de bits almacenado en algn dispositivo externo (como por ejemplo uno de memoria secundaria). En C++ un fichero es simplemente un flujo externo que se puede abrir para entrada (dando lugar a un flujo de archivo de entrada que, para simplificar, llamaremos simplemente archivo o fichero de entrada), para salida (dando lugar a un flujo de archivo de salida que, para simplificar, llamaremos simplemente archivo o fichero de salida) o para entrada-salida (archivo o fichero de entrada-salida o archivo de E/S). C++ soporta dos tipos de archivos: de texto y binarios. Los primeros almacenan datos como cdigos ASCII. Los valores simples, tales como nmeros y caracteres estn separados por espacios o retornos de carro. Los segundos almacenan bits de forma directa (por lo que no se necesitan separadores) y se necesita usar la direccin de una posicin de almacenamiento. Una biblioteca en C++ que proporciona funciones y operadores para el manejo de ficheros es la biblioteca fstream. #include <fstream.h> Definicin, Apertura y Cierre de Ficheros. Declaracin de Variables de tipo "Fichero": ifstream descriptor; ofstream descriptor; Apertura de Ficheros: ifstream in; ofstream out; in.open(nombre.extensin); out.open(nombre.extensin); // Para ficheros de entrada // Para ficheros de salida /* Apertura de Fichero de Texto o Binario para Lectura */ /* Apertura de Fichero de Texto o Binario para Escritura. (borra el contenido si lo hubiera) */ /* Apertura de Fichero de Texto o Binario para aadir datos al final */ /* Apertura de Fichero de Texto o Binario para Lectura y Escritura */ /* Apertura de Fichero de Texto o Binario para Lectura y Escritura */ // Para ficheros de entrada // Para ficheros de salida

in.open(nombre.extensin,ios::app); in.open(nombre.extensin, ios::in | ios:: out); out.open(nombre.extensin, ios::in | ios:: out);

Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin Ejemplo 1: Las dos lneas siguientes abren el fichero mio.txt como fichero de entrada (para lectura) y lo asocian al descriptor in. ifstream in; // descriptor del fichero a abrir in.open(mio.txt); // Apertura del fichero;

Ejemplo 2: Para abrir el fichero salida.dat en modo salida (si el fichero no existe lo crea, y si existe borra su contenido) asocindolo al descriptor out podemos usar la siguiente sentencia; ofstream out; out.open("salida.dat");

Ejemplo 3: // Abrimos el fichero F2.txt como fichero de salida en modo AADIR. fstream inout; inout.open("F2.txt", ios::app);

Cierre de ficheros. Un fichero anteriormente abierto y con un descriptor asociado a l debe ser cerrado con el fin de liberar los recursos asociado a l de la siguiente forma: descriptor.close() Deteccin de fin de fichero y otras funciones. La funcin eof() que devuelve true si se ha alcanzado el final del fichero y falso en cualquier otro caso. REQUIERE LECTURA ADELANTADA: Para que la funcin eof() devuelva un valor de verdad (actualizado). La funcion fail() devuelve true si existe un error en una operacin de flujo asociada al fichero La funcin bad() devuelve true si el flujo est corrupto. La funcin good() que devuelve true si no existe un error en una operacin de flujo y false en caso contrario. Antes de empezar a leer o escribir en un fichero es siempre conveniente verificar que la operacin de apertura se realiz con xito. Ejemplo 4: ifstream in; in.open("F1.dat"); if (in.bad() ) { cout << "\n Incapaz de crear o abrir el fichero "; cout << " para salida " << endl; } else { // Se opera sobre el fichero }

// salida estndar

Jos Luis Pastrana Brincones @ 2002 2

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin Ficheros de texto La lectura y la escritura en un archivo de texto se puede realizar directamente con los operadores << y >> al igual que se realiza sobre los flujos estndares cin y cout. Ejemplo 5: El siguiente programa escribe tres lneas en un fichero llamado EJEMPLO5.TXT que se crea en el programa (si ya existe borramos su contenido). Cada lnea consta de un entero, un real y una cadena de caracteres. Los datos en cada lnea estn separados por espacios en blanco. #include <fstream.h> #include <iostream.h> // Biblioteca para el manejo de ficheros // Biblioteca para la entrada-salida estndar

int main() { ofstream fichout("EJEMPLO5.TXT",ios::out); if (fichou.bad()t) { cout << "\n Incapaz de crear este o abrir el fichero \n"; } else { // Escritura en el fichero fichout << "Alumno 1" << " " << 5.0 << " APROBADO" << endl; fichout << "Alumno 2" << " " << 1.1 << " SUSPENSO" << endl; fichout << "Alumno 3" << " " << 8.0 << " NOTABLE " << endl; fichout.close(); } } // Fin del main Comentario: El operador >> omite los espacios en blanco al igual que ocurra en la entrada estndar. Ejemplo 6: El siguiente programa lee el fichero de texto EJEMPLO5.TXT, creado en el ejemplo anterior, y visualiza su contenido en el monitor. #include <fstream.h> // Libreria para el manejo de ficheros #include <iostream.h> typedef char TCadena[30]; int main() { ifstream fichin; int i; float r; TCadena cad; // declaracion del fichero

fichin.open("EJEMPLO5.TXT"); if (fichin.bad()) { cout << "Incapaz de crear o abrir el fichero " << endl; } else { fichin >> i; // Observese la lectura adelantada!!! while (!fichin.eof()) { cout << i << " "; // Lectura de valores en el fichero fichin >> r; cout << r << " "; // Lectura de valores en el fichero fichin >> cad; cout << cad << endl; // Lectura de valores en el fichero fichin >> i; } fichin.close(); } // Fin del main Jos Luis Pastrana Brincones @ 2002 3

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin Comentarios: (1) Observe en el ejemplo anterior que ha sido necesario realizar una lectura adelantada previamente al chequeo del fin de fichero. Si no se realiza de esta forma podriamos tener problemas. (2) Observe tambin que no es necesario realizar una lectura para saltarse los espacios en blanco que fueron introducidos en el fichero EJEMPLO5.TXT en el ejemplo 5. Esto es debido a que, como ya se coment anteriormente, el operador >> omite los espacios en blanco (3) No olvide cerrar los ficheros!! Ficheros Binarios Los ficheros binarios tiene la informacin tal cual est en memoria, es decir, sin convertirla a texto, La manera de leer y escribir en ficheros binarios consiste en utilizar las funciones read() y write(). descriptor.read(&c, num); Descriptor.write(&c, num); donde c es una variable de cualquier tipo, pasada por referencia, y num es un entero o una variable de tipo entero, ejecuta una lectura/escritura (a partir de la posicin actual del cursor del fichero asociado a la variable descriptor) de num bytes del fichero. Normalmente, para expresar el tamao o nmero de bytes a leer/escribir se usa la funcin sizeof que nos retorna el nmero de bytes que ocupa una variable o tipo. Por ejemplo, para leer/ escribir un nmero entero en binario, usaremos: int x; ... descriptor.read(&x,sizeof(int)); descriptor.write(&x,sizeof(int)); Ejemplo de Lectura/Escritura de Ficheros: Una Agenda de Telfonos #include #include #include #include <iostream.h> <stdlib.h> <fstream.h> <ctype.h>

// Ejemplo de una agenda de telfonos con toda la informacin en disco. //CONSTANTES const char FINCAD = char(0); const int MAXCAD = 80; const int ENTER = '\n'; const char SP = ' '; //TIPOS typedef char TCadena[MAXCAD+1]; // MAXCAD caracteres + FINCAD struct TPersona { TCadena nombre; TCadena apellido1; TCadena apellido2; int telefono; }; // CABECERA DE PROCEDIMIENTOS Y FUNCIONES char menu(); void pausa(); void borrar_pantalla(); bool confirmar_salida(); void LeerPersona(TPersona &p); void EscribirPersona(TPersona p);

Jos Luis Pastrana Brincones @ 2002 4

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin // Algoritmos de Manejo de Ficheros de Texto void insertarPersonaTXT(TCadena nombreFichero, TPersona p); void listarAgendaTXT(TCadena nombreFichero); void LeePersonaFicheroTXT(ifstream &fichero, TPersona &p); void EscribePersonaFicheroTXT(ofstream &fichero, TPersona p); // Algoritmos de Manejo de Ficheros Binarios void insertarPersonaBIN(TCadena nombreFichero, TPersona p); void listarAgendaBIN(TCadena nombreFichero); void LeePersonaFicheroBIN(ifstream &fichero, TPersona &p); void EscribePersonaFicheroBIN(ofstream &fichero, TPersona p); // PROGRAMA PRINCIPAL int main() { TPersona p;; char opcion; int num; bool fin,encontrado; TCadena nomFich; fin = false; do { borrar_pantalla(); opcion = menu(); switch(opcion) { case 'A': cout << "Nombre del Fichero: "; cin >> nomFich; LeerPersona(p); insertarPersonaTXT(nomFich,p); break; case 'B': cout << "Nombre del Fichero: "; cin >> nomFich; LeerPersona(p); insertarPersonaBIN(nomFich,p); break; case 'C': cout << "Nombre del Fichero: "; cin >> nomFich; listarAgendaTXT(nomFich); break; case 'D': cout << "Nombre del Fichero: "; cin >> nomFich; listarAgendaBIN(nomFich); break; case 'X': fin = confirmar_salida(); break; } if (!fin) { pausa(); } } while (!fin); pausa(); return 0; } // IMPLEMENTACIN DE PROCEDIMIENTOS Y FUNCIONES void pausa() { system("PAUSE"); }

Jos Luis Pastrana Brincones @ 2002 5

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin void borrar_pantalla() { system("CLS"); } char menu() { char op; cout << "AGENDA EN FICHERO" << endl; cout << "-----------------" << endl; cout << "Autor: <Apellidos> <Nombre>" << endl; cout cout cout cout cout cout cout << << << << << << << "A. Insertar Persona TXT" << endl; "B. Insertar Persona BIN" << endl; "C. Listar TXT" << endl; "D. Listar BIN" << endl; "X. Salir del Programa." << endl; endl; "Introduzca Opcin:";

cin >> op; op = toupper(op); while( ((op<'A') || (op>'D')) && (op!='X') ) { cout << "... OPcin Incorrecta ..." << endl; cout << endl; cout << "Introduzca Opcin:"; cin >> op; op = toupper(op); } return op; } void LeerPersona(TPersona &p) { cout << "Nombre : " ; cin >> p.nombre; cout << "Apellidos1: " ; cin >> p.apellido1; cout << "Apellidos2: " ; cin >> p.apellido2; cout << "Telfono : "; cin >> p.telefono; } void EscribirPersona(TPersona p) { cout << "Nombre : " << p.nombre << endl; cout << "Apellidos : " << p.apellido1 << " " << p.apellido2 << endl; cout << "Telfono : " << p.telefono << endl; } bool confirmar_salida() { char car; cout << "Est seguro de salir (S/N)?"; cin >> car; car = toupper(car); return (car=='S'); }

Jos Luis Pastrana Brincones @ 2002 6

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin // Algoritmos de Manejo de Ficheros de Texto void insertarPersonaTXT(TCadena nombreFichero, TPersona p) { ofstream out; out.open(nombreFichero,ios::app); // Abro el fichero para aadir if (out.bad()) { // El fichero no existe ... lo creo out.open(nombreFichero); } EscribePersonaFicheroTXT(out,p); out.close(); } void listarAgendaTXT(TCadena nombreFichero) { ifstream in; TPersona persona; in.open(nombreFichero); if (in.bad()) { cout << "Error al abrir el fichero: " << nombreFichero << endl; } else { LeePersonaFicheroTXT(in,persona); while (!in.eof()) { EscribirPersona(persona); LeePersonaFicheroTXT(in,persona); pausa(); } in.close(); } } void LeePersonaFicheroTXT(ifstream &fichero, TPersona &p) { fichero >> p.nombre; fichero >> p.apellido1; fichero >> p.apellido2; fichero >> p.telefono; } void EscribePersonaFicheroTXT(ofstream &fichero, TPersona p) { fichero << p.nombre << SP; fichero << p.apellido1 << SP; fichero << p.apellido2 << SP; fichero << p.telefono << endl; } // Algoritmos de Manejo de Ficheros Binarios void insertarPersonaBIN(TCadena nombreFichero, TPersona p) { ofstream out; out.open(nombreFichero,ios::app); // Abro el fichero para aadir if (out.bad()) { // El fichero no existe ... lo creo out.open(nombreFichero); } EscribePersonaFicheroBIN(out,p); out.close(); }

Jos Luis Pastrana Brincones @ 2002 7

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin void listarAgendaBIN(TCadena nombreFichero) { ifstream in; TPersona persona; in.open(nombreFichero); if (in.bad()) { cout << "Error al abrir el fichero: " << nombreFichero << endl; } else { LeePersonaFicheroBIN(in,persona); while (!in.eof()) { EscribirPersona(persona); LeePersonaFicheroBIN(in,persona); pausa(); } in.close(); } } void LeePersonaFicheroBIN(ifstream &fichero, TPersona &p) { fichero.read(&p,sizeof(TPersona)); } void EscribePersonaFicheroBIN(ofstream &fichero, TPersona p) { fichero.write(&p,sizeof(TPersona)); } Enunciado. Modificar la prctica nmero 13, para que permita la lectura de datos de los trabajadores desde fichero binario y de texto, as como el guardado de los datos, tanto en binario como en texto. Laboratorio de Programacin. Prctica 14: Ficheros en C++ Autor: < Nombre y Apellidos > Los Planes Reformados S.A. 3.0 A. B. C. D. E. F. G. H. Insertar Trabajador Buscar Trabajador Listar Trabajadores Borrar Trabajador Leer Trabajadores desde Fichero de Texto Leer Trabajadores desde Fichero Binario Guardar Trabajadores a Fichero de Texto Guardar Trabajadores a Fichero Binario

X. Salir del Programa Introduzca su Opcin:

E. Leer Trabajadores desde Fichero de Texto. Se pedir al usuario el nombre del fichero de texto donde est guardada la informacin en el formato adjunto y se aadirn a la lista los trabajadores del fichero cuyo nmero de trabajador no estn en la lista que se encuentra en memoria. F. Leer Trabajadores desde Fichero Binario. Se pedir al usuario el nombre del fichero binario donde est guardada la informacin en el formato que desee el alumno y se aadirn a la lista los trabajadores del fichero cuyo nmero de trabajador no estn en la lista que se encuentra en memoria. G. Guardar Trabajadores a Fichero de Texto. Se pedir al usuario el nombre del fichero de texto donde se guardar toda la informacin que se encuentre en memoria segn el formato adjunto. Si hubiera alguna informacin en el fichero, esta se destruir. H. Guardar Trabajadores a Fichero Binario Se pedir al usuario el nombre del fichero de texto donde se guardar toda la informacin que se encuentre en memoria segn el formato adjunto. Si hubiera alguna informacin en el fichero, esta se destruir. Jos Luis Pastrana Brincones @ 2002 8

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 15: Repaso

de Conceptos

Realizar un programa en C++ que ofrezca al usario el men adjunto y cuyas opciones se describen a continuacin: Laboratorio de Programacin. Prctica 15: Repaso de Conceptos Autor: < Nombre y Apellidos del alumno> MENU PRINCIPAL A. Invertir Fichero Texto. B. Listar Fichero Binario. X. Salir del Programa Introduzca su Opcin: _
q

Invertir Fichero Texto. Se pedir al usuario el nombre de un fichero de entrada y otro de salida. El fichero de entrada tiene un nmero indeterminado de palabras de un mximo de 80 caracteres cada una (slo una palabra por lnea). El programa deber generar un fichero de salida en que las palabras figuren con sus caracteres en orden inverso. Ejemplo: Laboratorio de Programacin. Prctica 15: Repaso de C++ ---------------------------Autor: <Apellidos> <Nombre> A. Invertir Fichero Texto. B. Listar Fichero Binario. X. Salir del Programa. Introduzca Opcin:a Nombre del Fichero de Entrada: entrada.txt Nombre del Fichero de Salida : salida.txt Presione cualquier tecla para continuar. . . >type entrada.txt palabra1 palabra2 palabra3 palabra4 palabra5 >type salida.txt 1arbalap 2arbalap 3arbalap 4arbalap 5arbalap

Listar Fichero Binario. Se pedir al usuario el nombre de un fichero binario donde hay un nmero indeterminado de nmero reales (double). Se deber leer todo el fichero y almacenarlo en una lista enlazada, para su posterior visualizacin. No se olvide ni de inicializar la lista ni de liberar toda la memoria cuando deje de usarse. Ejemplo: Laboratorio de Programacin. Prctica 15: Repaso de C++ ---------------------------Autor: <Apellidos> <Nombre> A. Invertir Fichero Texto. B. Listar Fichero Binario. X. Salir del Programa. Introduzca Opcin:b Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin Nombre del Fichero de Entrada: reales.bin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Presione cualquier tecla para continuar. . .
q

Salir del Programa. Se pedir confirmacin de salida, si esta es afirmativa saldremos del mismo, en caso contrario volveremos al men principal. Despus de cada opcin se har una pausa y se limpiar la pantalla antes de volver al men principal.

Jos Luis Pastrana Brincones @ 2002 2

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 16: Mdulos

en C++

Teora. Cualquier programa real est compuesto por varias partes separadas. Hasta ahora hemos utilizado los procedimientos y funciones para escribir estas partes en las que dividimos la solucin a un problema. El uso de mdulos pretende ser un paso ms en la metodologa del diseo descendente, permitiendo definir por separado las distintas partes de un programa y las interfaces entre ellas. Adems, un mdulo permite agrupar elementos que compartan alguna afinidad Escribir un programa como una coleccin de mdulos ofrece muchas ventajas: Los mdulos son una herramienta potente para crear grandes programas. Un programador puede disear un programa grande como un conjunto de mdulos, relacionados entre s mediante interfaces definidas apropiadamente. Escribir y depurar el programa es ms fcil porque el programador puede trabajar con un mdulo cada vez, usando los servicios facilitados por otros mdulos pero ignorando los detalles de cmo estos mdulos trabajan (principio de abstraccin). Este tipo de diseo modular es particularmente necesario cuando el programa se est desarrollando entre un conjunto de programadores. Ayudar a que el programa sea ms fcil de modificar. Puesto que los detalles de implementacin de un mdulo se ocultan al resto de mdulos se pueden cambiar detalles de un mdulo sin afectar al resto. Hacer los programas ms portables. El programador puede ocultar los detalles dependientes de la mquina en un mdulo, de forma que cuando se transporte a otro ordenador, slo debe preocuparse de dichos aspectos. Hacer posible la compilacin separada. El programa se divide en trozos, que el compilador puede procesar separadamente. De esta forma, un cambio en un mdulo solo requiere volver a compilar dicho mdulo, no el programa completo. Permiten desarrollar bibliotecas con cdigo reutilizable. Ello conlleva no solo un ahorro de trabajo, sino adems un aumento de la fiabilidad del programa, pues dichas bibliotecas estarn ms probadas que si la parte de la biblioteca que se usa se codificara de nuevo. Para poder trabajar con varios ficheros fuente en Dev-C++ es necesario crear previamente un proyecto. Para ello se utiliza la opcin New Project del men File. Al seleccionarla nos sale una ventana como la de la Figura 1. Para nuestros ejemplos utilizaremos la opcin Empty Project y pulsaremos OK, tras lo cual se nos pedir el nombre del proyecto. Una vez elegido un nombre se nos pregunta el directorio donde se desea guardar el fichero de proyecto. Este fichero, que tiene extensin dev, es el que usa el compilador para guardar toda la informacin sobre el proyecto (ficheros fuente que lo componen, opciones de compilacin del proyecto, etc.).

Figura 1 Podemos crear nuevos ficheros fuente dentro del proyecto con la opcin New Unit in Project del men Project. La figura 1 muestra un proyecto que consta de tres ficheros fuentes: principal.cpp, complejo.h y complejo.cpp. Con las opciones respectivas del men Project tambin se pueden agregar ficheros fuente ya existentes o eliminar del proyecto un fichero fuente. Una vez creado el proyecto se puede compilar con la opcin Compile del men Execute tal como lo habamos hecho hasta ahora cuando slo usbamos un fichero fuente. Una vez compilados todos los ficheros, se procede al enlazado automtico de los distintos ficheros objeto que se han generado para crear el ejecutable. Un programa consistir en un mdulo de programa (el programa principal) y cualquier nmero de mdulos de biblioteca desde los cuales el mdulo de programa importa entidades (constantes, tipos, variables y procedimientos). Estos mdulos de biblioteca a su vez pueden importar de otros mdulos de biblioteca. El compilador proporciona una Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin coleccin bsica de mdulos de biblioteca (stdlib, iostream, etc.) adems de los cuales, el programador tambin puede escribir sus propios mdulos de biblioteca adicionales, para usarlos en uno o en varios programas. Esto es precisamente lo que vamos a estudiar en este tema. Tendremos por tanto: Mdulos de programa: son unidades de programa completas que pueden importar recursos (constantes, variables, procedimientos..) desde mdulos de biblioteca. Son mdulos de programa aquellos con los que hemos estado practicando hasta el momento ya que contienen la funcin main(). Mdulos de Biblioteca: estn constituidos por dos partes, el mdulo de definicin y el mdulo de implementacin. Los mdulos de biblioteca se usan para exportar recursos a otros mdulos. Un mdulo de biblioteca consta de dos partes, la parte de definicin y la parte de implementacin. La parte de definicin contiene slo las definiciones de entidades o servicios que el mdulo exporta, es decir, define la interfaz del mdulo de biblioteca con el resto del programa. La parte de implementacin describe cmo implementar los servicios o entidades indicados en la parte de definicin. La primera es tambin llamada fichero de cabecera y, aunque no es obligatorio, lo normal es darle a este fichero la extensin .h (header en ingls). La segunda, la parte de implementacin, tiene extensin .cpp y tambin es llamada cuerpo del mdulo. Un espacio de nombres se utiliza para expresar una agrupacin lgica. Es decir, si algunas declaraciones pertenecen, de forma lgica, al mismo grupo, de acuerdo con algn criterio, se pueden poner en el mismo espacio de nombres. Un espacio de nombres es un mbito, por lo cual, si un nombre se declara dentro de un espacio de nombres podr ser visible dentro de ese espacio de nombres con las reglas habituales de mbitos. Sin embargo, para usar ese nombre fuera del espacio de nombres hay que utilizar el nombre del espacio de nombres seguido de la expresin :: a la cual seguir el nombre que queremos utilizar. Esto es muy til para programas grandes donde puede ser que tengamos varios subprogramas con el mismo nombre. Poner delante el nombre del espacio de nombres (lo que se denomina, cualificar el nombre) nos evitara entrar en conflictos. Para definir un espacio de nombres se utilizar la palabra namespace seguida del identificador que queramos asignarle. A continuacin encerramos entre llaves todo el espacio de nombres. Los espacios de nombres proporcionan una herramienta excelente para la programacin modular. /* declara funciones para la conversin entre ngulos */ #ifndef _conversionangulos_h_ // para evitar inclusin duplicada #define _conversionangulos_h_ /* Si no esta definida la macro _conversionangulos_h_ defnela. Si ya lo estaba no hagas nada (puesto que no hay nada despus de la directiva #endif). */ namespace Mconversionangulos { double gradosAradianes (double grad); /* convierte un ngulo de grados a radianes */ double radianesAgrados (double rad); /* convierte un ngulo de radianes a grados */ } #endif Cdigo Fuente 1 . ConversionAngulo.h #include "conversionangulos.h" namespace Mconversionangulos { const double pi=3.14159; double gradosAradianes (double grad) /* convierte un ngulo de grados a radianes */ { return (pi * grad) / 180.0; } double radianesAgrados (double rad) /* convierte un ngulo de radianes a grados */ { return 180 * rad / pi; } } // fin del mdulo

Jos Luis Pastrana Brincones @ 2002 2

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica.

Modificatr la prctica 12 (polinomios) para ofrecer un mdulos de polinomios llamado MPolinomio, cuya definicin sea la siguiente:
//Fichero de cabecera MPOlinomio.h #ifndef _MPOlinomio_h_ #define _MPOlinomio_h_ /* Si no esta definida la macro _conversionangulos_h_ defnela. Si ya lo estaba no hagas nada (puesto que no hay nada despus de la directiva #endif). */ namespace MPolinomio { //CONSTANTES const int MAXCAD = 40; const char FINCAD = char(0); //TIPOS typedef char TCadena[MAXCAD+1]; typedef struct TNodo *TPoli; struct TNodo { int grado; double coef; TPoli sig; }; // CABECERA DE PROCEDIMIENTOS Y FUNCIONES TPoli CrearPolinomio(); void insertarMonomio(TPoli &p, int grado, double coef); void destruirPolinomio(TPoli &p); void PintarPolinomio(TPoli p); TPoli LeePolinomio(); double evaluar(TPoli p,double x); double buscar_termino(TPoli p, int x); int ver_grado(TPoli p); TPoli derivada(TPoli p); TPoli suma(TPoli p1, TPoli p2); TPoli LeerPolinomioFicheroTexto(TCadena nomFich); TPoli LeerPolinomioFicheroBinario(TCadena nomFich); void EscribirPolinomioFicheroTexto(TPoli p, TCadena nomFich); void EscribirPolinomioFicheroBinario(TPoli p, TCadena nomFich); } #endif

Jos Luis Pastrana Brincones @ 2002 3

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Implementar tambien el programa principal que ofrezca las siguientes opciones de men:
Laboratorio de Programacin. Prctica 15: Mdulos Autor: < Nombre y Apellidos del alumno> MDULO DE POLINOMIOS A. B. C. D. E. F. G. H. I. J. K. L. M. N. O. X. Leer P1 desde Teclado. Leer P2 desde Teclado. Leer P1 desde Fichero de Texto. Leer P2 desde Fichero de Texto. Leer P1 desde Fichero Binario. Leer P2 desde Fichero Binario. Evaluar P1. Evaluar P2. Buscar trmino P1. Buscar trmino P2. Grado P1. Grado P2. Derivada P1. Derivada P2. Suma P1 + P2. Salir del Programa

q q q q q q

Evaluar polinomio. Se pedir por pantalla/Teclado un polinomio y un valor. Se evaluar el polinomio en ese punto. Buscar trmino. Se pedir un polinomio y un grado g, devolvindose el coeficiente de grado g de ese polinomio. Grado. Se mostrar el grado de un polinomio dado por teclado. Derivada. Dado un polinomio se realizar la derivada, y, con posterioridad, se escribir por pantalla el polinomio resultado. Suma. Dados dos polinomios, se realizar la suma de ambos, y, con posterioridad, se escribir por pantalla el polinomio resultado. Salir del Programa. Se pedir confirmacin de salida, si esta es afirmativa saldremos del mismo, en caso contrario volveremos al men principal.

Despus de cada opcin se har una pausa y se limpiar la pantalla antes de volver al men principal.

Jos Luis Pastrana Brincones @ 2002 4

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 17: Pilas


Teora.

en C++

Una pila es una estructura de datos homognea (elementos del mismo tipo), secuencial y de tamao variable. Slo es posible un modo de acceso a esta estructura: a travs de la cabeza de la pila. De este modo podemos aadir un elemento a la cabeza de la pila o extraer un elemento de la cabeza de la pila. Debido a que las operaciones de extraccin e insercin se realizan por el mismo extremo, el ltimo elemento en ser aadido ser el primero en ser extrado; por ello a estas estructuras se las conoce con el nombre de LIFO (last-in, first-out; ltimo en entrar, primero en salir).

Insertar

Extraer

Cabez a

Pila
Otras operaciones posibles sobre la pila son la creacin de una pila vaca, la interrogacin de la misma para determinar si contiene o no algn elemento y la destruccin de la pila. Para implementar una pila como una estructura dinmica de datos se usan listas enlazadas, las operaciones de extraccin e insercin en la lista (pila) se hacen siempre sobre la cabeza de la misma.

#ifndef _Pila_h_ #define _pila_h_ namespace MPila { typedef struct TNodo *TPila; struct TNodo { int val; TPila sig; }; TPila CrearPila(); void DestruirPila(TPila &p); void MeterPila(TPila &p, int x, bool &llena); void SacarPila(TPila &p,int &x, bool &vacia); bool PilaLlena(TPila p); bool PilaVacia(TPila p); }
#endif

Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica

Implementar una pila de enteros segn la definicin anterior y usarla para realizar un programa que presente en pantalla el siguiente men para la evaluacin de expresiones postfijas.
Laboratorio de Programacin. Prctica 17: Pilas en C++ ---------------------------Autor: <Apellidos> <Nombre> A. Evaluar desde Teclado. B. Evaluar desde Ficher. X. Salir del Programa. Introduzca Opcin:

Evaluar desde Teclado. Se pedir por teclado una expresin postfija que debe ser vlida y en la que estarn separados por espacio todos los operandos y operadores y terminar en un '.' (punto). y se mostrar el resultado en pantalla Evaluar desde Fichero. Se pedir por teclado una expresin postfija que debe ser vlida y en la que estarn separados por espacio todos los operandos y operadores y se mostrar el resultado en pantalla Salir del Programa. Se pedir confirmacin de salida, si esta es afirmativa saldremos del mismo, en caso contrario volveremos al men principal.

Despus de cada opcin se har una pausa y se limpiar la pantalla antes de volver al men principal.

Jos Luis Pastrana Brincones @ 2002 2

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 18: Colas


Teora.

en C++

En muchas aplicaciones se cumple el hecho de que el primer proceso que solicita un servicio o recurso es el primero en ser servido. Para retirar elementos (servicios, recursos) en el mismo orden en que fueron solicitados, se necesitan unas estructuras de datos abstractas que mantengan una secuencia de valores y permitan aadir nuevos elementos por un extremo y retirarlos por el otro. Esta estructura recibe el nombre de cola. En las colas el elemento que entr el primero sale tambin el primero, por ello se le conoce tambin como listas FIFO (first-in, first-out; primero en entrar, primero en salir.) Se define la cola, como una estructura de datos homognea de tamao variable que soporta el siguiente modo de acceso: insercin por un extremo y extraccin por el opuesto. Operaciones posibles sobre la cola son la creacin de una cola vaca, la determinacin de s la cola est o no vaca y la destruccin de la cola. De igual modo que se ha visto para la pila, una cola se puede implementar haciendo uso de las estructuras dinmicas de datos. En este caso, se simula mediante una lista enlazada que mantiene dos punteros, uno llamado frente por donde se van extrayendo los elementos ms antiguos de la cola, y otro llamado final, que seala al extremo por el cual se irn aadiendo elementos a la cola. De esta forma, el puntero final nos garantiza que cada vez que se tenga que extraer un elemento de la cola, no sea necesario recorrer sta desde el principio, lo cual sera altamente ineficiente para colas largas. Las operaciones de insertar y extraer de la cola tienen acceso directo a los nodos de la cola en los que se van a realizar estas operaciones. La diferencia con las pilas reside en el modo de entrada y salida de los datos, en las colas las inserciones se realizan al final de la lista, no al principio.

Extraer

Aadir

Cola FrenteFinal
Prctica Se desea simular el comportamiento de una parada de autobs a la que slo puede llegar un autobs. Cuando llegue un autobs con n plazas libes, las personas que estn esperando subirn por orden de llegada a la parada hasta completar las plazas vacas o no haber esperando ms personas dicho autobs. El comportamiento de la parada es idntico a una estructura de Cola. Por lo que se debe implementar una Cola (a partir de la definicin que se adjunta Y SIN MODIFICAR LA DEFINICIN DE LA MISMA) y un programa cliente con las siguientes opciones de menu:

Nombre: (Apellidos, Nombre) Especialidad: (Gestin/Sistemas) Puesto: nmero de ordenador Prctica 18: Colas en C++ A. Llegar Persona Parada B. Llegar Bus Parada C. Primero Bus Parada D. PintarParada X. Salir del Programa

Curso: Grupo: (A/B/C/D) Fecha: dd/mm/aa

Llegar Persona Parada. Se pedir por teclado el nombre de la persona que est esperando el autobs y se meter en la cola. Llegar Bus Parada. Se pedir por teclado el nmero de plazas libres que tiene el autobs y se quitarn de la cola (mostrando su nombre por pantalla) tantas personas como plazas libres haya o hasta que la cola est vaca. Primero Bus Parada. Mostrar por pantalla el nombre de la primera persona que espera el autobs. PintarParada. Muestra por orden todas las personas que estn en la cola. Salir del Programa. Se pedir confirmacin de salida. Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Despus de cada opcin se har una pausa y se limpiar la pantalla antes de volver al men principal.
// Fichero Cadena.h #ifndef _Cadena_h_ #define _Cadena_h_ namespace MCadena { const int MAXCAD = 80; const char FINCAD = char(0); typedef enum { Menor, Igual, Mayor } TCompara; typedef char TCadena[MAXCAD+1]; void CopiaCadena(TCadena s1, TCadena &s2); // s2 = s1 TCompara ComparaCadena(TCadena s1, TCadena s2); bool IgualCadena(TCadena s1, TCadena s2); bool MayorCadena(TCadena s1, TCadena s2); bool MenorCadena(TCadena s1, TCadena s2); } #endif // Fichero Cola.h #ifndef _Cola_h_ #define _Cola_h_ #include "Cadena.h" namespace MCola { using namespace MCadena; typedef struct TNodo *TLista; struct TNodo { TCadena val; TLista sig; }; struct TCola { TLista frente; TLista final; }; TCola CrearCola(); void DestruirCola(TCola &c); void MeterCola(TCola &c, TCadena s, bool &llena); void SacarCola(TCola &c, TCadena &s, bool &vacia); bool ColaLlena(TCola c); bool ColaVacia(TCola c); } #endif

Jos Luis Pastrana Brincones @ 2002 2

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 19: rboles


Teora.

Binarios de Bsqueda en C++

Las estructuras dinmicas vistas hasta ahora son lineales (listas enlazadas, pilas, colas). Estas estructuras tienen grandes ventajas en cuanto a flexibilidad sobre las representaciones contiguas, pero tienen un punto dbil: son listas secuenciales, es decir, estn dispuestas de forma que es necesario recorrer cada posicin al menos una vez (cada elemento tiene un sucesor). Mediante los rboles binarios se introduce el concepto de estructura de bifurcacin, donde cada elemento puede tener ms de un posible 'siguiente', con lo cual es posible resolver algunos problemas de difcil solucin cuando se usan estructuras dinmicas lineales. El rbol es una estructura muy usada en todos los mbitos de la informtica ya que se adapta a la representacin natural de informaciones homogneas organizadas y de una gran comodidad y rapidez de manipulacin. Las estructuras tipo rbol se usan para representar datos con una relacin jerrquica entre sus elementos, como son rboles genealgicos, tablas, etc. Un rbol se define como un conjunto finito de uno o ms nodos relacionados de la siguiente forma: Hay un nodo especial llamado raz del rbol, que proporciona un punto de entrada a la estructura. Los nodos restantes se subdividen en m>=0 conjuntos disjuntos, cada uno de los cuales es a su vez un rbol. Estos rboles se llaman subrboles del raz. Ntese que esta definicin es recursiva, se define un rbol en funcin de otros rboles. La representacin y terminologa de los rboles se realiza con las tpicas notaciones de las relaciones familiares en los rboles genealgicos: padre, hijo, hermano, ascendiente, descendiente. Junto a estos conceptos se definen otros tales como raz, nodo, hoja, camino, nivel, profundidad, etc., con los cuales se supone familiarizado al alumno.

1 2 4 5 9
Un rbol Binario se define como un conjunto de 0 ms nodos tales que: Existe un nodo llamado raz del rbol. Cada nodo puede tener 0,1, 2 subrboles conocidos como subrbol izquierdo y subrbol derecho. Un rbol binario puede ser representado fcilmente eligiendo las estructuras de datos adecuadas. Un rbol general puede transformarse en un rbol binario aplicando determinados algoritmos de conversin, el resto del epgrafe se centrar en el estudio de los rboles binarios. La representacin dinmica de un rbol binario utiliza variables punteros y asignacin dinmica de espacios de memoria. Cada nodo del rbol contiene al menos los siguientes campos: Campo de datos que almacena el tipo de datos. Puntero al subrbol izquierdo. Puntero al subrbol derecho. Se llama recorrido de un rbol binario al proceso que permite acceder una sola vez a cada uno de los nodos del rbol. Cuando un rbol se recorre, el conjunto completo de nodos se examina. Los algoritmos de recorrido de un rbol realizan las siguientes tareas comunes: Procesar el nodo raz. Recorrer el subrbol izquierdo. Recorrer el subrbol derecho. El orden en que se realizan estas acciones da nombre a los tres algoritmos ms usuales: pre-orden, in-orden y post-orden:

3 6 7 8

Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin void inOrden(TArbol a) { if (!arbolVacio(a)) { inOrden(Izda(a)); procesar(a); inOrden(Decha(a)); } } void preOrden(TArbol a) { if (!arbolVacio(a)) { procesar(a); preOrden(Izda(a)); preOrden(Decha(a)); } } void postOrden(TArbol a) { if (!arbolVacio(a)) { postOrden(Izda(a)); postOrden(Decha(a)); procesar(a); } }

En cuanto a las operaciones aplicables a un rbol binario se muestran en el mdulo de implementacin Marbol las siguientes: - crearVacio: Devuelve un rbol binario vaco. - crearRaiz: Crea el nodo raz de un rbol, y almacena en este nodo el valor que se le pasa como parmetro a la funcin. - crearIzda: Dado un rbol binario que no tiene desarrollada su rama izquierda, esta funcin crea un nodo con el valor que se recibe como argumento, y se asigna a la rama izquierda del rbol binario original. - crearDcha: Es similar al procedimiento anterior pero aplicable a la rama derecha. - sacarRaiz: Esta funcin devuelve el valor de la raz de un rbol binario. - arbolVacio: Determina si un rbol binario est o no vaco. - destruirArbol. Libera la memoria utilizada por el rbol. Hace un recorrido en postorden. rboles binarios de bsqueda: es un rbol binario en el que el subrbol izquierdo de cualquier nodo (si no est vaco) contiene valores menores que el que contiene dicho nodo, y el subrbol derecho (si no est vaco) contiene valores mayores.

Prctica Se desea implementar un diccionario espaol/Ingls de tal manera que para cada palabra tengo slo 1 traduccin al Diccionario Elaborado por: <Nombre>< Apellidos> <Curso> <Fecha> A.- Cargar Datos desde un Fichero Binario. B.- Cargar Datos desde un Fichero de Texto. C.- Introducir una palabra y sus traducciones desde Teclado. C.- Buscar los Significados de una Palabra. D.- Mostrar por pantalla todo el diccionario ordenado alfabticamente por la palabra en ingls. E.- Salvar el Diccionario en un fichero Binario. F.- Salvar el Diccionario en un fichero de Texto. X.- Salir del Programa. Introduzca Opcin: _ ingls. El programa deber presentar al usuario el siguiente men cuyas opciones se describen a continuacin:

Cargar Datos desde un Fichero Binario. Se pedir al usuario el nombre de un fichero binario y se insertar su contenido en el diccionario (el diccionario puede o no estar vaco). Si el fichero no existiera no se inserta nada. Cargar Datos desde un Fichero de Texto. Se pedir al usuario el nombre de un fichero texto y se insertar su contenido en el diccionario (el diccionario puede o no estar vaco). Si el fichero no existiera no se inserta nada. (El formato del fichero ser el mismo de la opcin F). Introducir una palabra y sus traducciones desde Teclado. Se pedir al usuario la palabra en espaol y su traduccin al ingls y se insertar dicha palabra en el diccionario. Buscar los Significados de una Palabra. Se pedir al usuario la palabra en ingls y se mostrar por pantalla todas las traducciones que existan de esa palabra. Si no existiera esa palabra en el diccionario se informar de su no existencia. Mostrar por pantalla todo el diccionario ordenado alfabticamente por la palabra en ingls. Se mostrar por pantalla todas las palabras del diccionario y sus traducciones ordenadas por la palabra en ingls. Jos Luis Pastrana Brincones @ 2002 2

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin Salvar el Diccionario en un fichero Binario. Se pedir al usuario el nombre de un fichero y se grabar todo el contenido del diccionario en formato binario. (Si el fichero suministrado no estuviera vaco se borrar su contenido previo) Salvar el Diccionario en un fichero de Texto. Se pedir al usuario el nombre de un fichero y se grabar todo el contenido del diccionario en formato texto. (Si el fichero suministrado no estuviera vaco se borrar su contenido previo) El formato de grabacin ser el siguiente: una lnea por cada entrada del diccionario en la que estarn por este orden: <palabra espaol> <palabra ingls> Ejemplo formato: chico boy chica girl anfitrin host archivo file .......... Salir del Programa. Pedir confirmacin de salida, liberar todos los recursos que hayan sido reservados y saldr al sistema. Para la implementacin de nuestro diccionario utilizaremos un rbol binario de bsqueda para almacenar los datos cuya definicin se adjunta. Definiciones de los Mdulos que NO PODRN SER MODIFICADA:

Despus de cada opcin se har una pausa y se limpiar la pantalla antes de volver al men principal.
// Fichero Cadena.h #ifndef _Cadena_h_ #define _Cadena_h_ namespace MCadena { const int MAXCAD = 80; const char FINCAD = char(0); typedef enum { Menor, Igual, Mayor } TCompara; typedef char TCadena[MAXCAD+1]; void CopiaCadena(TCadena s1, TCadena &s2); // s2 = s1 TCompara ComparaCadena(TCadena s1, TCadena s2); bool IgualCadena(TCadena s1, TCadena s2); bool MayorCadena(TCadena s1, TCadena s2); bool MenorCadena(TCadena s1, TCadena s2); } #endif // Fichero ABB.h #ifndef _ABB_h_ #define _ABB_h_ #include <fstream.h> #include "Cadena.h" namespace MABB { using namespace MCadena; typedef enum { preorden, inorden, postorden } TRecorrido; struct TElemento { TCadena esp; TCadena ing; }; typedef struct TNodo *TABB; struct TNodo { TElemento raiz; TABB izq; Jos Luis Pastrana Brincones @ 2002 3

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin TABB dch; }; TABB CrearABB(); // Construye un ABB Vacio

TABB izqABB(TABB a); // Retorna el hijo izquierdo TABB dchABB(TABB a); // Retorna el hijo derecho /* Nota en los casos anteriores se considera que el hijo izquiero o derecho de un rbol vaco es el rbol vaco */ void raizABB(TABB a, TElemento &e, bool &vacio); // retorna la informacin de la raiz del rbol void insABB(TABB &a, TElemento e, bool &lleno); // inserta 'e' en el rbol void buscarABB(TABB &a, TCadena clave, TElemento &e, bool &encontrado); // busca el elemento cuya clave se suministra void eliminarABB(TABB &a, TCadena clave); // elimina el elemento dada su clave bool ABB_Vacio(TABB a); // Comprueba si el rbol est vaco bool ABB_Lleno(TABB a); // Comprueba si el rbol est lleno void escribirABB(TABB a, TRecorrido forma); // escribe en pantalla el rbol segn el recorrido elegido void escribirABBFicheroTXT(TABB a, TRecorrido forma, ofstream &fich); /* escribe en fichero de texto el rbol segn el recorrido elegido. EL formato del fichero debe ser: <palabra_espaol> <espacio> <palabra_ingls> <ENTER> */ void escribirABBFicheroBIN(TABB a, TRecorrido forma, ofstream &fich); /* escribe en fichero binario la informacin de todos los nodos del rbol (TElemento)segn el recorrido elegido */ void LeerABBFicheroTXT(TABB &a, ifstream &fich); /* Inserta en el arbol el contenido del fichero. EL formato del fichero debe ser: <palabra_espaol> <espacio> <palabra_ingls> <ENTER> */ void LeerABBFicheroBIN(TABB &a, ifstream &fich); /* Inserta en el arbol el contenido del fichero. El fichero debe contener TElemento's */ void destruirABB(TABB &a); // Destruye el rbol } Jos Luis Pastrana Brincones @ 2002 4

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin #endif

Jos Luis Pastrana Brincones @ 2002 5

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Prctica 20: El

Super

El nuevo supermercado HiperMod nos ha solicitado la elaboracin del software para la gestin y manejo de sus cajas. Para ello deberemos implementar y usar el mdulo MBolsa cuya definicin se adjunta, y realizar un programa llamado hiper.cpp con las siguientes opciones de men:

Programa Realizado por: Apellido1 Apellido2, Nombre Especialidad: Gestin/Sistemas Grupo: A/B/C/D Mquina: XXX HiperMod ======== A. B. C. D. E. X. Introducir Producto en la Bolsa. Mostrar el contenido de la Bolsa. Sacar un Producto de la Bolsa. Imprimir Ticket. Compra por Internet. Salir del programa

Descripcin de Opciones: A. Introducir un Producto en la Bolsa: Solicita al usuario la referencia y nombre del producto, introducindolo en la bolsa. En caso de que la bolsa estuviera llena se informar del error y no se insertar. B. Mostrar el contenido de la Bolsa: Muestra por pantalla el contenido de la bolsa (referencia y nombre), sin modificar el contenido de la misma. C. Sacar un Producto de la Bolsa: Solicita al usuario la referencia de un producto y lo elimina de la bolsa. D. Imprimir Ticket: Muestra por pantalla el contenido de la bolsa (referencia, nombre y precio), a medida que va vaciando la misma. Al final de todos los productos se imprime el total de la compra. Los precios de los productos se obtendrn del fichero "PVP.TXT". El fichero PVP.TXT es un fichero que contiene un registro por lnea con el formato: <Referencia> <Precio> Ejemplo: PVP.TXT 125 98 424 2995 321 6708 010 78778 ........ E. Compra por Internet: Se solicitar el nombre de un fichero en el que se encuentran los productos solicitados por el cliente en el formato siguiente: <nombre del producto>#<Referencia> Ejemplo: Cliente.txt Patatas Fritas#125 CD Kill'em All#424 .................. Se leer dicho fichero generndose una bolsa con el contenido del mismo, de la cual se generar un ticket en el fichero de texto TICKET.OUT (si dicho fichero existe se borrar su contenido) con el mismo formato que la impresin de tickets por pantalla. X. Salir del programa: Se pedir confirmacin antes de salir del programa y en caso afirmativo se liberarn todos los recursos que hayan sido reservados.

Jos Luis Pastrana Brincones @ 2002 1

Laboratorio de Programacin 1A E.T.S.I. Informtica Gestin

Mdulo de definicin de una bolsa (MBolsa) QUE NO SE LE PODR AADIR O QUITAR FUNCIONALIDAD.

Tipo TElemento: Registro que contiene un entero (referencia del producto) y una cadena de caracteres(nombre del producto). Tipo TBolsa: Estructura que maneja la bolsa. Debe ser dinmica. CrearBolsa: Funcin que crea una bolsa vaca. BolsaVacia: Comprueba si la bolsa est vaca. BolsaLlena: Comprueba si la bolsa est llena. MeterBolsa: Mete un elemento en la bolsa, si la bolsa no est llena. En caso de estar llena no realiza nada. Es responsabilidad del usuario de este mdulo el control de que la bolsa est o no llena. SacarBolsa: Saca un Elemento CUALQUIERA de la bolsa, si la bolsa no est vaca. En caso de estar vaca no realiza nada. Es responsabilidad del usuario de este mdulo el control de que la bolsa est o no vaca. DestruirBolsa: Destruye la bolsa que se le pasa como parmetro.

Jos Luis Pastrana Brincones @ 2002 2

You might also like