From 636801b890ff84ae25747057e3d2c6074616f16e Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sat, 11 Oct 2003 02:36:35 +0000 Subject: [PATCH 1/1] Se agregan documentos. --- docs/enunciado/TPf.ht1.gif | Bin 0 -> 7218 bytes docs/enunciado/TPf.ht2.gif | Bin 0 -> 8943 bytes docs/enunciado/TPf.ht3.gif | Bin 0 -> 6446 bytes docs/enunciado/TPf.ht4.gif | Bin 0 -> 10516 bytes docs/enunciado/tp.html | 257 ++++++++++++++++++++ docs/oo_callbacks_cpp/default.css | 30 +++ docs/oo_callbacks_cpp/logo.gif | Bin 0 -> 5454 bytes docs/oo_callbacks_cpp/oo_callbacks_cpp.html | 197 +++++++++++++++ 8 files changed, 484 insertions(+) create mode 100644 docs/enunciado/TPf.ht1.gif create mode 100644 docs/enunciado/TPf.ht2.gif create mode 100644 docs/enunciado/TPf.ht3.gif create mode 100644 docs/enunciado/TPf.ht4.gif create mode 100644 docs/enunciado/tp.html create mode 100644 docs/oo_callbacks_cpp/default.css create mode 100644 docs/oo_callbacks_cpp/logo.gif create mode 100644 docs/oo_callbacks_cpp/oo_callbacks_cpp.html diff --git a/docs/enunciado/TPf.ht1.gif b/docs/enunciado/TPf.ht1.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f04a24bdaf2a38ad4e03438aa4cc7a0a2f3727c GIT binary patch literal 7218 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 J-K%?&{|8q`Wgh?l literal 0 HcmV?d00001 diff --git a/docs/enunciado/TPf.ht2.gif b/docs/enunciado/TPf.ht2.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6184c47c6fb71ebed4fb0c88b366b919fa0eb04 GIT binary patch literal 8943 zcmeH~}J983NJ*3euyyr6moz6_5_48zjeIbdE7<^cc-(lCAo)5q0d_CuR&WEF-rYt7@IrEY4!z;Z1s-vUh{{H@d?f>Kd8~DG~0Lu;j{|0{j zU;cL!c!W4S0zyXB>b%ZSLP{R<{_6bh$Y*To*{U@Ky|J`Hj*I;@h3LeW3NegowM7Fd zT>4P+f!gAsj5k(;*=ltqBUxe|`-=m0rDM6Wp~Ot;h_XM0sws~NIuPX(rSA*XA?o!| z!&3D+FmkZIVy5bSeGHRE18lC2q7!N{M9n+jNVzZwae4t?YW2bFyQno*tyKFzBDvOR zs#@)iqU4nxMmTTudNDh>5I5Iu4S{~DQ@4r>+2L7n`vbIE5PM0Gx)Ny%&kNl@Fsq>) zEwenQqDCjouohLr@k&SNlkFvX#A$9%_^tFPvKceer=Sv?AatX5Fj?ocl0$+0ek{_4 z!2j@w(;nM=4yOx2tZ5Q^aji#12dbt-vlS5PN4;v;{bG%iLnnQtq%Zju zFSKs|F|MurdOcBgd2=HMNYU{AGc}9v=0^>6v{ll3x=o+-CAZX)(m5LLa9atCd?>oZ>l%{?~mln_;)^u;%y>58$ z40>29E-lPgMf~sPuz6RSsuIDVd%z2uac6LG&EUdbx3>Dx=rgzH&}C;TmSp-vVeJAS#N*ZbC@ zIQW34j<#<%nK4=G5``UHVi|@(`5)vb@*~T>EErwvmzIv+4x4|>Y2AVk9`8-OU*H!$ z9u;zax7&_|2h2N~N!?w?QIBD7BHa@2u3Sxa#Hw9&wEd3;y+ zpJq=*-{OkhzAa;z?~fzuZZ3%2$5SjO=leRay)chm68il+Zy+A=X{a2}@)T7@=f7}g z4?s5UrLWxUwpC*1X}fP}bKS4)j{d?+SC~I&Kd|4MluV6C<1|)deh*bl4Pmw6wxE_Y5P4<*8!q-WpM$7T zP$bm>H(o-@`qmZoGWvm}0=f@}p7aTT&|RBc!bG_?92l^7&2~`o<&e7kL~8w^El=im zO=s|g;QVVfp^H~TZWKb`52y1qsp zMJ(~4`nB3hpMOtH z>gb1C<_*()Nu6b{28}gtFRJukz`l@3OaKVZs-sBl&1p2|e#u_4W=OG9a%v?|G{1>;?!<&8^R(O;$pbogMiYJR*JsWvtC+3q|S4mIIkQF+A!B@!K=Nx`B zL(7}vRc)v7ZdJ>?E4TBajjvm)g03{6bI{awJhD^Xe+Qfo7_K|qi}^xmhCdBc&}vn= zREPalUlvjF>7s=@hLdEkk@<_cBJQfA*kMJ_vuHb&C2C@fhu5iFuY2Dl)Wq3oZqP4W z_lb?xBzO;R0I=6+S+d%sNX<=FhMRs>?b_sw;Y|+7n}PS18|DR?Tdzx+20xIkMqD8l zU;E#vm`zV+pkKGVse=w#YYX8bhLLZCTW`KNYtLov#KFbf_PRVrG0umJ@1(He1_8>` zxlby~WXIxvMXJo2WFCqW~J+8L{>B28Y;Q7#%ZDQjr2Yh9KE=jhV(^%pA$ z3E_lq5@vT%Ou?6E9GdRTCh;zv-R^QAF#RmbW3g7i?FM8lZJLP%ZrQHi);WS+$`nS0tYeiJgu=Vf)Y`$ieU({;=Hl^#-4miK<;-TasD zQ`!z8(vtIUD=+JHT8>=3-z{$B>^4t8etWfJb1`slDNNf5AlJ_ipZuEXzU|ai8n`|I zyY3y!KK=SVppZe}=CwZR%n$|KE`;5T$S|D|V34_z0)8ARsB?8`sr_HD+bM?T3pl6X zp_Rbq+ytP%p}j59qskwEL0w7Uq)xxRzFS*py6!7|dzK=wu_Y9|m$x#75n>LUF$%sV zL1`I=;bHXs6Qu**KirPTgorkAR5DT zx8)o4@4?FY3b)1z`jf%J#=dwUgNGowRRyJ2VRH8#-x3;s$V~ls1X3L;lwq9ocy$$g zX8hdH*cSgBVB!I6W&0_<6%4ZbDLwTgH&lgNER=Bfr$ChXA zA@!PkaO;)?$M=_N{XzOA#;3iZv239tRN*HoT%ug!&y4hxeZp?nU8>n#akXK^>|wB; zP{l&IM@`}cs6p3t_Gcs{?D}^VsSn1+6iN3`zw zK6~;LHB%zB^x+h$ueN)RAr%flNOA54(cCr3pRi|?ND8n-~HAGxDSuGJG zmd@x4lF0;_mqZ8Cf;kbvm0y(9i7ZoZe$IJjzD&>biU#QtWj%ICHO>SY^#6P=7S4_U zIs2xTbb)DEzUdRC*3D(sIAr%aMAeHcHqK?o6e<{jVo-bOQ+?oWwQTTSQZ{ZcImaa9 z^9LnqpC3;QJk2N}rqQwHH|YxBAhS2%{>l8Zn6nuBWp+s!@ z6mm;MaSP3vXVD2rlW5tdtm{1xC5@$*o$Gz3%h!P%0r3oP-+Wqd{*eg?p_VI($h#5` zwe$opzQ|YbwNGmXV+_+z%OPmGTmdLZe*^TpT>7)8f`eL)YI82HX+l591CK|K+cX7m zn=?mLD0G{t^Z~4g_<6$#-k!@c^DV-N=dVSGYh8ycITrakfZjUhY3xHH6am^iIWhPu zug>$z_6k3!$7}DEsLvLe-9o&s9_W}q)f5s+Q|=N|kw{x=AzqTcUU9SKp#MBU{~JX)oh}zo22m5VgE$o~5!d;g zOR>K2g>d;0kLAE%#r_-7{KpvnD6J|T3}>3EqFl%bf$C99R<~ML|Ap#b(c>%tt+g|zs>2Eetfsja^fi@g zk*9veTP$!pqd>;2P}+sEa{4-ccCc{kPkX;QMTY9*au~e9Fz5v$OAJ9ZRK#JLd0Ad4 zRff23PL#xQBIrSMv8C%O^>_C5Fp07Z`sY6QK%0r5AF)4N{p)2~>%_L=cr*(2(yFDP z6=T-|Ze}@V*!nx;(6E+@f~dwh`G#bK2}@MN_Id4#xrXnpCC%lC$O>7ptR@twG+n-O zhXpP=r0Gaf7Gzfb=AhauT$R`_`Y}~OTvG$bP*ap7bM`HtJXiCqVzb{(Aw0DCU94zU z79xY8A#b56VS(3wp)z^0_V-q+rDHQTN;L>q7Gg1k@H#*kIo1|Pw#*QjBF(;*@>bIi zwwTUGZg3-8QgZ8Jk(?wkLk9*Uu^G(-Z9VL5&Lp);K6=D4&0}<}oJHxULrwV$vHH=b z8(EsS{^`*gAJ}=@9|tu0Eg*@_Q3l`^251#fqG+jbW_mb(A_YWoKfFWD)+sBR(A zt`bpz8)#QUwrMPOPgFSS#MKyZ^hVBi4$pUgF>4RtW$q>Ht%~e=-CFr28_6ZvMJ(cG zAKUjSE?6b57p#t!AgDhSL7T&(aj!3WrDOFc9l?VJMSei*pv4M{wALiaK7()l`iHKu z!+r6uD-$m?8;I$IU%REnl@lEF&lskzNCrKMXs_+@WCdpmImoSgjDCsSE4#XYIc2mDDgH7+-$s}=Iiaca0=%9vEFAbVujyqR~Y z+Tx!aX1<3!zW$Zgw2jNObHqgSU9$`14~+27vJu{#mUB~ z!L~(?M~fpPrhPc3rDVwBMAGAGr&#<#pNBD8g6Aep@^ zS+_hEJ9um%Jii#2K->wRE5J!&m=dle72_A-Z+^?2=>LGAT-+EH(p8|kw*cyWtuf*aD(oFbzeqQK2ZJ?q4PGS%gHb=<1v@+J#ngNu7p zFKA5`1uzQQV$|N!+FCcyVNtT&5(8{syxsl?*s|4TwNEg#L2cU}Zn=_eej(bGD_H_a2OIhv2pgaEwKOy`Z4|7|T7n(LET7sa*S2DBwW*ZqEa?-vHQYvfQsm z9h8ynAzb%6MxDCg!!4GF+zSU#!2W;!KYV$80C!l|ci4?Pm;_X!aar{_M^k_!jpM^* z{)2^t>UHVkxwi-XLC3p*!)es9%JQ+4+3}Bo-gkT_ed;H5i$~YXjQgWUJco#YKM3 zN!m|0o7asE`tFQSAIo(vL)FG+RWTHY5H9JrPa3+REh|EZJzHf~E=2AxJk6S%pqFEY zL$*2>^2|BU?2+@>ONg~Jo4TT+&JPH~g;)DI(fnnke?$pei_QI2<$TYO?<}O56%s-0qTkJgd6xL!9#7 zF;#!;bv(SOm8pRRW2h}##1gSD#sperdKiweoXnoh_a^6zYkezcmpJepK63cw@?9YA zu2Uc|-TV#@iA4vpIa%E@{L zXR6dH^$wJ+o!5o67k#r0L>dL|J~=pTP`RbRd-;+B$K2F zXsoL{6CZ}1NL-f?yGs8#+c<2U8yBorxIyYy$&gDrkI6jIQGBcPqQax9y47*tSsKfa z;1?ye*?9H?&ug&Sp_~}V+-#QQiWpHizx)D*;eZGOCcr?eXH(Q4f^K3;Ue=&xk@~`kp}F} zAIvhg-cGCOEC^10s$x%BaLxKoZRRjzb0zMW=x00%nGC10@OX6UrT@TK$$8N&t!-x9 z?4L{Hr_iz3E3J?bQy>1H4kN}NeXr6~r%XlyuZJVZx0|fCcE5XW1l7MdUS?vWj+Nj$ zNd4CM+Sr!%Q`}MD3+qI;zGl6w;1|trlZkLbbRVq)jp&Bjd7OO(obH#>7vh9R#U0B( zYk=U8D(iZO(nt=lWZLJhmaYu8SH|0w_1fN!^)m@D$4LKeN>>>NY00f$1L<#s(=Fh- zTG1M0pkwfsZR^)=Id?O7#b17%uU5JZW_1}?+FJBqm|IQNx4rqCQAd# z6bU*Q=RDLtk*ud!7%je^4zNW`Tmrq9+SzJZft-Ny!(8er>WfZ?E4sdcf3@QWx5_&- zGAX$LAMb;z6E1@@1UgB!>z7@;-+M!WHs762GHh2tD?AXh{}3%5bfeJNI+%0$1u}@t zNBb?G3{iZ%*v|mY&PBV8bW`GRJVyN24@SK(p`Y-HCZOVhW#8MKEYcji-fiCL2={ec zoYPy0A98)Q85(+tEt=`L8r*oj(eVD0d5ZMMWiI2C8j8DP4YMl%+@?lxxuc7lFg;^)2pY( zy(*@q^hFw63OZJ3z6=b(-AH@}3z&6h+4OtSby<-?e-#fG@&}4*B|gA}%up2tXim!9 z1qcRsAhuW`l*&rr@n4gQr3i#~uXx+I`n$zEvAT@mF+R$uM#deXV!9Fcl8M~?r!=fv zL@It~Fh#b9zh#}+Si?A|di9p5B{;;?i3 z?AC|PbjA@+W^#l(XbM9)_h3|oV(NSQmOT17gXbpV?D5)e;CgaLXsHUH!}_{BP=}TB zhwK!cUh%C?@fl~SmW_jMim)MEyAJC1na3b9WXjdGzQPW&X}r_d`m15865t2b{Uc#4 z1g+=$9Oz_up^nqD0jI%(!}Bc)!A3QXFRCNsSxxGr)O#;q)Fk#UTe9<-^ifY2B=sI1 zbF|Ji8X3Ve30&+G=V$$5rV*uDP@Cp5)5(VEdd3ZBXB+G!5;fh>n3m@JUBiU=_(fwo zf$P`uhicQrGfn8F!io=3=G!7yRfAH+9>tPNf2a?#CwpDJCWw{}9A{crw%EM$i7e03 zX=2uwN`0qVm#_01a}UGa0>pPLEeB^%S84Qtnb99{myH&;ZKc5kz)vxz-bj4quOUnL zpE!ADJIP%sLI(&x6B~b!qbMm17e;yDHic`K2NO)GH8C zLvF!ng`=POkRa6XE#bQ+Bjd>|TE_N6;!mJ8YZj(MN!dL)l0lta)MS8`tTd$st|5#A`P{{8YZnMTO13*$-p$(}~J|{oUG}%t18#)+MFGEvgXF%u&R8iBYUCD`I*b&x|+759`&q+mE(r`PO0OL?H1Iga^oEW;_8K~ za#=cx@E%=ea`Wq+Uc^>W(qO-{7sIN-g*=yv%$=xi{ z-(IL?uhY0C^}a>@Wg*DkVD?VxlaoH%j>_KTM3=kiqTC;ArEdvD`VQMjdw^#aw?)yu zqu)^;IaiB2GEe+|hf8}F&@An$sQ8Vip*%|-xi{)unN3)ceTQNU_uo|cP1|{2qzTa* zn&&pp>=0d6tAO*YGn!||61-qpOG(ad{u*oA?)B|~#}?lHoS2|1i(GbXE5r5W8&{|H z`=xRc#=8L$a%3y9^xrDW0Let#4&YK>yuQKi1`Xh*AnkWZ@L1k>RIzW82TnRLb;g?G z>QXZ17ht1g$82Y>uzd`T%7nLz9h#MN(wcBZA_cUUzO_3pv5nY|VFGy@;q7ZO$m>)| z+{w2lzY0v%&3#1M`CpE}qIf>c%$WCOjnBYx;i)>T@zphiIiPz2hnZ|o+?9j|1=9qn zNw8R7{ZV00mB_(mP@^uML+=@y@HRQJSY>|-$sRbh;rF20Vp}BKJN!sGwo*EX;u;AM zgrq&PiW?oEy^dRq%nDuSv-3J~DjLd3Q7T2?i=vKC4zwGR9mBG+G}evdQF6Okof&0v z42q4tv$S;99mm{q%mG3tES`ymJdv<=EqW;_ zd{JpdDY;rH7y5P{sveh6Mj1pm{d&8sxuWtW`0YCdY?I=qm2_WLkDZyq7zQah`3i_^ z(_ZX8eo*8!-!(8nfx}AcZwhmImg|Kn*`_F&c9ohkioArC8&CF{bjzvkb$(n_qNVDK zW$m-F>TFe0wl-6K;i&w{zwbd@-^Z-J&oJdK-Y)84Wrsy&+rz#OlMKbaYa#p?n+@?CY_Mco`UH!NJhyNM)e`kRAjQYQu zMgGJ8eBv5C<=VgWobT$2x+CfD3Yibo75B#8eyo}Qt{&D0W|egQIZ$7MO?s#r&#BQ+ zI+!M4P-#BcP&Sgmt@@TsQFBw0JsMgz0RU%Agofnz~CwiU;_|+`7GLdHcggy7nJA?mS zTf7crEZ@w$f%dc+OcHHmsRlGUz!DY05(Va62orF#nDTtgs#8s^ z*{~Qo@VF26(PLq0v0i2mgejxF()lU9xzd{Q*wC^Kt-3sR&_Gd8!uTZosO7hH`&f0d z_p6s8&L!0Gcb_;<=PB;o(SC8F>CkgRz8`Xajij>Bc@=y$_?O)d%VR;Ykog6qNu>T9 zzQx6A^wmPt5gK(zFYaN)ZFvV?Z4Q~a6%#hfTu~&o=lw?@xBA0k4^|j_31ol(EWp%8Y@{Mw__1F)7CInxoOJg7eHgYb9<;Bs7+&{Ii|l~=YCv)bf- zJP+YU<6wEwb)@TBmV3kkV{L_bIGu?!nLDlQ%W``fb?`eTteVHvo}6u)iM_o1%hAs5 zcag@_k2_JiMs+(ZUyFw-?c{}so?AruU1sX$((;%^aQKiAH|>gXccS4y@XX7vBJ~szmPpj-fmlSy7ETRo%o_#mNNn zGVA%g<{KM#*0sHr$Bn8Hcr+ShG(En2KdY|_SPx#$fi+Y4%SWcvgK2jjvIdnRrJeV{ z;@&0nXaRMaKN=7psny%#sD7!*`b3)%n~Prqk5rWRBV+i6?_5M;-_S~=oJX#3b2tsC zzt(@7n!nDo;W(&O!6!T5n%pAcwt%vKsA}!D7D1u zA*X4%DZy70Tqba_J^bnGn}ohMHWCmyjf+uie1q*K9aN)5K+PbRL7R01dDiPkP0Zhj#!sLbu?W zjb1)Ps)Q%{wiYi|F>8NclIjUTr9#$V>c~53Hn>8SW$I1g9*k13Vgm3l$w-FeqOHg-V_d_+{;g=5)KY!o60R0Db=T0HmUNN3Ja7d z*V|n-Z#@_5(9Q6#v)RxE4|PI`%rH?FZUrrkk5ReP1)&*mSV>#6-Fk*Xk=%SV6OE57aWfcYN$q3$=6A zQ84*ocpvE;QtsvwG`KEw;?Qm9>|&yT{N7`TL5c1j`GOZ8%G6=tGj4t!aU-9pPEc!x zt70ky)5G!?ahn#rL4qz1NMb+qiOsdzhYP(YFwc%FCU-aL{Et_#+c52Q@llk^=i9uv z?tK~&FAmOM3u?0RjEN%A8zi`f%3M1Kt+mTCYrY@qv$M)^avHFU5Km&u#XQ80Vo#|XJfah9?@##;s=G8yRfxy`$E(+=2x@6sZwjtlZklWB}+DcM?8}pJbpvyHW#!?OM&^5DNxF1hI3nN zE_u|nx+y{v;Z)pwE?~s1Jqk;m!TIyp`+&`w9CMD<7VIdm}ubkmjNtn3~8J`r; zyucSZvpH=EU$^cZ(y0^5=ys5Aliw5I{v>+-0*nju5*7DXQFvoV^!=6wB&ig}=+y}O zHQnk*+!$n=Jh<^W*z35Kxp^afjGdH6%18P+AWSS9hmdFl|L^sHQJO45_XhMwm}=|F zasVpl@l7kwD}@zr6I2*wsAL~P3VMm7#q)yOzmzJW7VGwa%!a?<0{DND-x!^8%7(nfZ#enHMZ|s(;;UAE_chO7D+D4-ncbmN7aMNEq}k( z*6Z#qJLl_U5cUOL?&raar^>j~UefS`;DEuskfDmizj)?$QD!9L641-&H(>5;!c2Zp z_Yy^O>qyi}4!>9PLSaYcc;8pA&7l0ajWJr>zfcRgyh#>re09sMj3Rr?1IF)dMStiU z&pjO$RATx@5x-m#=IP3IkUrKLIgbrkHWs?-XxS>bz`T5UxjlDW+v9#oYT^0aniX=m zydmZUEj$~Y)0sCm+G=5kPCm=P`WX3zrSbc$B7k&NuRxMMZe5_740Ksu55h2pSBBx((*hSVEMM}s<@_M_=3WUF8 z4J>^cs3PF~Z*0(8*>~y#ZbB%2WmF_1tAbWskQBgEJ1!#O59F^N_3Ec zFHFYT`W=s;QP}#HGuhAIJkCB%MR?&L(A_wObP{88KUTdo#zoe*(9bm_%kCwAtTz8! zA6yJ2zuY_UMVymtSgBv!sd`Kt+;)1xirYT+3oFPC9+x9vn~4g;sL|73OHqIZ%sl5;I%sU6B4SEG3rd z9VkII@$bfCW}~2+kwCRA>$A92!NH`0?IcwJq1RtO(QL@^Vj-5_6XmxP1ymvHfJAW_ z&Ub>U@8%$ltdKlMC;f`gJg+?@<$!MqcB)QkHFLb8pm>eg1ffC0gLj#9YUy@p9gahv zWc38)2U$I+RIp^mM|AANfdC71N}!;9FaxCaUDm+U?8qD^&~|1l$OeSZgiptXS41VA zWuL2pCXa{^lO zCS@}P=uHl+-AZ#pAKC>b2Bc+WKpaqpHEi+jZ2G28+~paIDqay4K zotuB=OB?H{fh(@nNRv?yp9i>~g3ZUR;2RVKdN=h9{xfvqqzLjDa*mQ_6JvoOiN#kOp4+=viD^4ZSg5^~<02cnBnK_9o zLaC)-oSjhelV~q3V&P53^6)GXjrmyVNh2v!HBQF3J$RXqVJYQ(bAUFc9B^LhCJz_V zbQC?!yI{??!Q{A~L*{bQKf{wxY*MYtl3D?wTuyNB_!J-2%3VF5WT)UBiEkyEz*Kg) z?GQZEv~Ub$6(^M5A^>+K_)gCiIGcV8&n?54f{W(ghaNv}Ij`(tuWAhhHZYWY60-jV zua1|mE*#VmJc4%RW`X9*X9E$weGb+0$v#f7I?W2WUB<9rWeh$WC10`atw_|A-Khj^ zoSQAh*K~oPr7*-#_PAAaHD2Sh(@-*Ez4rBX&2(<?kSt0FeXGCV@I3*JMyzwa$-VkTpI86% z*mYDI7(~@7$25|gw4&}gvJ30Had|yaDX%UJxcRZJM=gp^!ArA>Pkg~vX~Fz`9@x0b z!NBF~df8VCm!?k(kwyy5I>M2!!M>_lX?EZ!caEVWMzTTOnj)p=Pj=Y z=$z}#RO!eREmSE7Uz`go{CYuHD~8Smlc|U7ebV|^3mu7zY5}*N?_+ATTA_KE4lT*9 z3+c_*kUrtJh@fu{*PDj(T6;+KnOZFq6b=nc)wg()_PMHeqg7f`W{rz^k;^XWD+>*4 zd5Uy`CV$Ua=Rw&lQzKTzf48a~sQg@0pkjKPi31iBVT@;&u)FK+{8; z_dPa{FBe<;KJtb3-){ZjC-k#k3BF0e(jqV0`htd^>2L-KruRM4?hj>80Ejd>bN0Ia z>@Uvovd}aHHY;B$V2MbD&x%eI|7Opi5p0WJPXK#f53(ofFY4Y=zh3;nqQ-ad&!R<8 zR|-wTAG^V{gz6Id?&H=$&Wo#A2_vwnE|rmy^Xabs8>0{WtxU8=bGAmN z5=Phmu&x6-erhYq8e>-SN3%WD3(dzg&7bg9j(H068W6`86~DHKjH{vRj&GPsrVX9t z^U3#)U%INfvj32{n|Y-DLzcRTzWtf>j@`pHP^2qt@dGLvTNIWPtgH_V1~RMeTO^r=0} zt*mXEg078F-57cU)ZC()JW8LY)5`AJnf^t}8xWb11qK*GgJ?xxYAby(+8vKzn`!35 zR<*UKam-qC4S!Z_!zy+;LT5eFbN4FW#ITMH@w&Mv{n)L_!3EDz6Gt^8=lp@Q>xOf_ zmu<)j0q?H`=fiJ)4UG;igzQg_mEv)F7r0~yt|=$@;zj3yMm4dzMm`nzFMfzH(lISE z-^3qAL&SfB%vX#)E>@f8A+!wVC;Z{$Y-GY+wPbQu_Z2}G8h}_{Mi>H!XHLKuGd<3I z04^Ja)#}JxQmQ#dm5Rp^m=5YYiNB)t^oYiGIZU<23>Q#zmNX~oJn=g?{ry4-T@8%A z1lNq8r#)Th=9&ZrtQ_K3ut1ET;PQp&N~%Rc{-XN_u*x~4nUB13hq(I3Px7L20_ySc zlr5D-%(&*evapz)v@))V?&&}lPJ&V^aJjbWwAy64KwIhhM`%@rBl*5%o~m-GF1P6s zVrVtc>ri#2-M{dy+v5+3w!v!Q7H;8qWNF^i+S4su)%=3vSdd_-foqL}8#%}!(OV!f zfD&)8F7?N!9KYkPe(c{|c=DMgF`)+O*e5@MHXGHM93 zq{SREA<1nWB1WWHsxERO%7l!ffJC7-;tErDjhk(wPI5FP8V%L-rjec9t}e zn?&lX-G5&aX?P$P-0e(-zwx?@_1tx7l)XdyJ!=esemReYapw9bvWzq(Hnn;Em6#YS z>Gzu0mlW5a`t2~`_xm?GGhWK)eLJmw%OP7BYUJ-ISSKj!o%8jj1bkB<% z3MJXsEbpepFZYNRoQRVzP+>t$3V%Hqex-zg{(eb34;!2!FK` z4+h0A^^>-U#<_-xmxr*+;VWU)(7^Fq7i;2_?yZdj{tH?64TYO$DdW%Wm5WDf4<>3U zEITUU(5-24{59rl*TS#SFmWr&-d=ef!^EW=#j3aZCZ0vq@_V-4npz^4QYf`x^5=J{ zY%G~?a`ZPeGes>rq6YVEM=~XymcHj0Z0Qy#@ys6*m>oaB-a@$F61^NJquC9K zAER_DB$@&ZNk%mmTK2n)vm`)+-6;FLR_R?6Byf@2B1oEShVj{*<;44vEjmIjt$zwj z|Nhhy%>)isIQ?zi??$H_!)fxzb|^#iQ$Htq-+nAgGK`m&%k*%4tW1ZW8)|w)#D25r WjNvjncAakqF84#tPA0;yDf}OJ>clnx literal 0 HcmV?d00001 diff --git a/docs/enunciado/TPf.ht4.gif b/docs/enunciado/TPf.ht4.gif new file mode 100644 index 0000000000000000000000000000000000000000..b12bbba2db095274421d752831cc17aa7deeafae GIT binary patch literal 10516 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 + + + + +New Page 1 + + + + +

Trabajo práctico final

+

Introducción

+

Diseñar un sistema destinado a la simulación y control de una planta química.

+

El sistema consta de 3 aplicaciones independientes destinadas al diseño, +simulación y control de la planta, respectivamente. Estas tres aplicaciones se +explican a continuación:

+

1 - Diseño de la planta

+

Aplicación Windows, ya sea basada en un diálogo o SDI (Single Document +Interface), destinada al diseño de la planta en forma gráfica.

+

El sistema debe poder cargar y grabar el diseño de la planta en un archivo de +texto.

+

Parte 1 - Modelo de la planta

+

El diseño de la planta debe incluir los siguientes elementos:

+
    +
  • caños: horizontal, vertical. La longitud de los caños debe poder variarse
  • +
  • codos de caños, en todas las 8 direcciones posibles.
  • +
  • bifurcaciones de caños
  • +
  • uniones de caños
  • +
  • tanque
  • +
  • bomba (fuente)
  • +
  • drenaje (salida)
  • +
  • válvula
  • +
+

El programa debe permitir insertar, borrar y mover cada uno de estos +elementos.

+

Algunos de estos elementos de la planta tendrán atributos y estados, tal como +se detalla en la siguiente tabla:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementoAtributosEstados
cañoscaudal máximo (litros / seg.) 
codos  
bifurcaciones  
uniones  
tanquecapacidad (en litros)cantidad de litros en el tanque (valor real)
bombacaudal máximo (litros / seg.). Color del líquido.encendida/apagada (valor binario)
drenaje  
válvula abierta/cerrada (valor binario)
+

Cada elemento del sistema deberá poder asociarse un atributo adicional que +será el nombre del objeto

+

A continuación se muestra como ejemplo el diseño de una planta.

+

+

A continuación se muestra el despiece de la planta en los diferentes objetos +que la componen.

+

+

Parte 2 - Sistema de control

+

Seleccionando alguna opción en la aplicación se debe pasar al diseño del +sistema de control de la planta.

+

En este modo, no se podrá modificar los objetos que componen la planta, sino +que se mostrarán y permitirá modificar los elementos que determinan el control +de la misma.

+

Como se mencionó anteriormente, algunos objetos pueden tener estados +asociados. El programa debe desplegar dos entradas, que permitan modificar dicho +estado (abrir/cerrar) y
+una salida que permita leer dicho estado. En el caso del tanque, sólo se tendrán +2 salidas que indicarán si el contenido del mismo es superior/inferior a un +porcentaje dado.
+
+Estas entradas y salidas deben poder conectarse utilizando un editor gráfico, y +debe permitir agregar los símbolos binarios AND y OR, el símbolo unitario +NEGADOR, un pulsador y un
+temporizador, tal como se muestra en el diagrama.

+

+


+Esta lógica debe grabarse en el archivo con la descripción de la planta en +formato texto, utilizando la nomenclatura que los alumnos prefieran.

+

2 - Simulación

+

Aplicación de consola, destinada a la simulación de la planta.

+

El programa debe cargar una planta de un archivo de texto generada por la +aplicación de diseño descripta anteriormente, simular el funcionamiento de la +misma y comunicarse con el programa de control para permitir la visualización y +control de la planta.

+

Todos los parámetros requeridos por esta aplicación deben recibirse por línea +de comandos.

+

Esta aplicación debe constar de 2 partes o módulos.

+

Módulo Simulación

+

Debe simular el funcionamiento de la planta en base al modelo que se describe +en el apéndice I

+

Servidor TCP/IP.

+

Debe implementar la comunicación con una o más aplicaciones de control de la +planta.

+

El protocolo utilizado para la comunicación debe ser en formato texto, y debe +basarse en la filosofía web-services, que se describe a continuación:

+

El cliente (aplicación de control) envía un requerimiento al servidor en +formato texto (preferentemente XML). Estos requerimientos pueden interpretarse +como llamadas a funciones, donde se pasa el nombre de la "funcion" a invocar y +sus parámetros.

+

El servidor responde con un texto (preferentemente en formato XML).

+

Las funciones a implementar deben permitir:

+

1 - Obtener una descripción de la planta

+

2 - Obtener el estado de un elemento de la planta.

+

3 - Modificar el estado de un elemento de la planta

+

3 - Aplicación de control.

+

Aplicación win32 similar a la descripta en el punto 1 y con similar interfaz +gráfica. El programa no debe permitir modificar la planta, sino que debe mostrar +el estado de la misma.

+

Esta aplicación debe mostrar el estado de todos los elementos que componen la +planta en forma gráfica, animando cada elemento para indicar los flujos de +líquido, con el color correspondiente a cada líquido.

+

Si la capacidad máxima de un tanque es superada, el programa debe emitir una +alerta.

+

El sistema deberá mostrar el contenido de los tanques con el color de los +líquidos que lo llenaron.

+

Apéndice I - Modelo de simulación

+

La planta puede entenderse como un grafo dirigido, donde cada objeto +representa un nodo del grafo y cada caño una arista. Si bien en un caño el +líquido puede fluir en ambas direcciones,
+simplificaremos el modelo suponiendo que el liquido fluye en una única +dirección.
+
+Los objetos de la planta pueden dividirse en 3 tipos:

+

1 - Fuentes. (ejemplo: bomba)
+2 - Drenajes. (ejemplo: salida)
+3 - Los restantes objetos (válvulas, bifurcaciones, uniones, etc) son +idealizados suponiendo que no almacenan líquido.

+

Un caso particular de dispositivo es el tanque, que constituye una fuente y +drenaje al mismo tiempo.

+

Para simular la planta, se analizan todos los flujos de liquido entre todas +las fuentes y drenajes.

+

Las bifurcaciones son simplificadas suponiendo que divide el flujo de líquido +en dos.
+Las uniones son simplificadas suponiendo que sólo aceptan el 50% del caudal +posible de cada entrada.

+

Si una válvula / bomba está cerrada, el programa debe considerar que dicha +parte del grafo no está presente.
+
+Ejemplo:

+

Tomando el diseño de la planta dado anteriormente, se lo dividirá en un +grafo, tal como se muestra a continuación:

+

+

El sistema deberá iterar n veces por segundo, determinando los caudales en +cada arista del grafo. Una vez hecho esto se actualizará los contenidos de +líquido en cada tanque en base a los caudales determinados.

+

En primer lugar se determinan los posibles caminos fuente-drenaje:

+

1 - 4
+3 - 4
+4 - 8
+4 - 10
+8 - 10
+10 - 12

+

Una vez hecho esto se determinará el caudal en cada arista, tal como se +muestra a continuación:

+

Flujo en arista 1
+
Si la bomba 1 está apagada: 0
+Si la bomba 1 está encendida y la 2 apagada:
+mínimo entre:
+* caudal max. entregado por la bomba
+* caudal max. arista 1
+* caudal máx. arista 3
+Si la bomba 1 y 2 están encendidas:
+* caudal max. entregado por la bomba
+* caudal max. arista 1
+* mitad del caudal máx. arista 3.
+
+Flujo en arista 2
+
Similar flujo en arista 1
+
+Flujo en arista 3
+
Suma de los flujos por las aristas 1 y 2
+
+Flujo en arista 4
+
Si la válvula 5 está cerrada, el flujo será 0.
+En caso contrario:
+Si la bomba 8 está apagada, el grafo se reduce y el flujo estará
+dado por el mínimo caudal entre
+* máximo caudal posible en arista 4
+* máximo caudal posible en arista 5
+* máximo caudal posible en arista 8 por dos, ya que sólo la mitad
+del caudal se irá por esta arista.
+* máximo caudal posible en arista 6 por dos, ya que sólo la mitad
+del caudal se irá por esta arista.
+* máximo caudal posible en arista 9 por dos.
+
+Si la bomba 8 está abierta, el análisis es similar solo que el
+último flujo será directamente:
+* máximo caudal posible en arista 9.
+
+Flujo en arista 5
+
Será idéntico al flujo por la arista 4
+
+Flujo en arista 6
+
Será la mitad del flujo en la arista 5
+
+Flujo en arista 8
+
Será la mitad del flujo en la arista 5
+
+Flujo en arista 9
+
Suma de los flujos en aristas 6 y 7
+
+Los restantes flujos pueden ser determinados por los alumnos.
+
+En este análisis no se tuvo en cuenta la existencia de líquido en un tanque. Si +un tanque está vacío, debe considerarse que no hay flujo de líquido (válvula +cerrada). Si un cuanto de flujo de líquido resulta ser superior al líquido +existente en un tanque, dicho caudal deberá ser limitado al caudal existente.

+

Una vez determinado el caudal en cada arista del grafo, el programa debe +actualizar el contenido de todos los tanques.

+

Tener en cuenta que cada bomba de la planta entrega líquidos de distinto tipo +(color) lo cual deberá ser tenido en cuenta al actualizar los volúmenes de cada +tanque, de tal forma que el color mostrado en el grafo sea proporcional (en +forma aproximada) a la densidad de los líquidos entrantes.

+

Por ejemplo:

+

Si un tanque contiene 10 litros de líquido rojo (255,0,0) y recibe 10 litros +de líquido de verde (0,255,0), el color resultante será:

+

(255 * 90 / 100, 255 * 10 / 100, 0)

+

Utilizar números double para minimizar errores de redondeo.

+ + + + \ No newline at end of file diff --git a/docs/oo_callbacks_cpp/default.css b/docs/oo_callbacks_cpp/default.css new file mode 100644 index 0000000..b37c08c --- /dev/null +++ b/docs/oo_callbacks_cpp/default.css @@ -0,0 +1,30 @@ +BODY { + BACKGROUND-COLOR: #ffffff; COLOR: #000000; FONT-FAMILY: Helvetica; FONT-SIZE: 10pt +} +DIV { + MARGIN-LEFT: 1em +} +DIV.note { + MARGIN: 1cm +} +DIV.lastwords { + FONT-STYLE: italic +} +IMG { + FLOAT: left +} +PRE.source { + BORDER-BOTTOM-WIDTH: 1mm; BORDER-LEFT-WIDTH: 1mm; BORDER-RIGHT-WIDTH: 1mm; BORDER-TOP-WIDTH: 1mm; FONT-FAMILY: Lucida Console,Courier New,Courier,monospace; MARGIN-LEFT: 1cm; WHITE-SPACE: pre +} +H1.s1 { + FONT-SIZE: 20pt +} +H2.s2 { + BORDER-BOTTOM-WIDTH: 1pt; BORDER-LEFT-WIDTH: 1pt; BORDER-RIGHT-WIDTH: 1pt; BORDER-TOP-WIDTH: 1pt; FONT-SIZE: 16pt +} +H3.s3 { + FONT-SIZE: 12pt +} +H4.s4 { + FONT-SIZE: 10pt +} diff --git a/docs/oo_callbacks_cpp/logo.gif b/docs/oo_callbacks_cpp/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..f26d9b810349e28c46e4f912305cc2dd9e3853dd GIT binary patch literal 5454 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 literal 0 HcmV?d00001 diff --git a/docs/oo_callbacks_cpp/oo_callbacks_cpp.html b/docs/oo_callbacks_cpp/oo_callbacks_cpp.html new file mode 100644 index 0000000..5eaa828 --- /dev/null +++ b/docs/oo_callbacks_cpp/oo_callbacks_cpp.html @@ -0,0 +1,197 @@ + + +Callbacks in C++: The OO Way + + + + + + + + +
C-Scene Issues 1..9 Authors
Algorithms Books Patterns Graphics Miscellaneous UNIX Web & XML Windows
Feedback FAQs Changes Submissions
+
+

Callbacks in C++: The OO Way

+ +
+

by Jürgen Hermann
last updated 2001/08/02 (version +1.1.1.1)
also available as XML

+
+

What are Callbacks?

+

Many operating systems and other subsystems (like GUI libraries) feature a +special type of hook into those systems, named callbacks or callback functions. +Upon initialization or by calling an API function you pass pointers to the +callback into the subsystem, for later use. The problem with those functions is, +since these subsystems are nowadays not yet OO, that they have no notion of what +an object is. So if you want to have a callback object  instead of +a mere function, some OO magic is called for.

+

As an example, consider the BeginThread API that many OSes have +in a quite similar form; we assume that it takes a pointer to the function that +provides the actual code for the newly created thread plus a data +pointer  that is passed to that function as a startup parameter. Thus, +we end up with BeginThread (void (*thread_func) (void*), void* +startup_data). Now let's make a Thread class of +that.

+
+

A simple Thread class

+

What we want to have is an ABC (abstract base class) that you can inherit +from, creating specialized thread classes and in turn thread objects (i.e. +actual threads). The code of the thread is located in a pure +virtual  function code that is provided by the inherited +class. code is then similar to the thread_func +parameter of the BeginThread call, but is a full-blown member +function, not just a C function. So, we get this interface for the +Thread class:

class Thread {
+public:
+    virtual ~Thread();
+    void run();
+
+protected:
+    Thread();
+    virtual void code() = 0;
+
+private:
+    int running;
+
+    static void dispatch(void* thread_obj);
+};
+
+

This might seem quite unusual to you (like having a protected constructor), +but things will be explained in due course.

+
+

Thread implementation

+

When we put the thread concept into a class, we have to consider lifetime. A +thread exists as long as the thread function does not return, thus the object +has to have the same lifetime. Because of this, an auto thread +object does not make much sense; we insure that every thread object exists on +the heap by making the ctor protected and providing a static factory method +create for thread objects in each derived class:

Thread::Thread() 
+    : running(0) 
+{
+}
+
+DerivedThread& DerivedThread::create()
+{
+    return *new DerivedThread;
+}
+
+

create has to be added to every inherited class, returning an +object of that class.

+

Next, we need a run method that actually starts the thread. This +can't be done in the ctor: when code would be registered as a +thread of execution in the base class  ctor, the superclass would +not yet be fully created and calling code would be quite invalid +and dangerous. run does its job by registering the +dispatch function as a thread, giving that thread the object +pointer as a startup parameter; since dispatch is static, it has a +prototype that matches the void(*)(void*) parameter of +BeginThread.

void Thread::run()
+{
+    // Don't start two threads on the same object
+    if (running) return;
+
+    // Create an OS thread, using the static callback
+    BeginThread(Thread::dispatch, this);
+    running = 1;
+}
+
+

So finally, dispatch is called and performs the step from a +procedural callback to the callback object:

void Thread::dispatch(void* thread_obj)
+{
+    // Call the actual OO thread code
+    ((Thread*)thread_obj)->code();
+
+    // After code() returns, kill the thread object
+    delete (Thread*)thread_obj;
+}
+
+
+

A real Thread class

+

A real-world thread class has to consider a few things we have ignored here. +These things include:

+
    +
  1. more access to the thread data, like a method giving the thread ID. +
  2. a method for killing the thread, including the deletion of the thread + object.
+

Developed and tested on Windows NT, this is the source for a little +example program that implements the above in the real world. If you run it, you +get something similar to the following output:

[\cscene\callback]callback
+Started thread #80 for dice1
+Started thread #84 for dice2
+dice1 rolled 1
+dice2 rolled 1
+dice2 rolled 3
+dice1 rolled 1
+dice2 rolled 4
+dice1 rolled 6
+dice1 rolled 3
+dice2 rolled 3
+dice1 rolled 1
+dice1 rolled 4
+dice2 rolled 4
+dice2 rolled 3
+dice1 rolled 1
+dice2 rolled 6
+dice1 rolled 2
+dice2 rolled 2
+dice1 rolled 1
+dice2 rolled 4
+dice2 rolled 1
+dice1 rolled 4
+dice1 rolled 5
+dice2 rolled 1
+dice1 rolled 3
+dice2 rolled 3
+dice1 rolled 2
+dice1 rolled 6
+dice2 rolled 2
+dice1 rolled 1
+dice2 rolled 3
+dice1 rolled 4
+dice1 rolled 5
+dice2 rolled 3
+dice2 rolled 6
+dice1 rolled 4
+
+

Have fun!

+

This article is Copyright © 1997-98 by Jürgen Hermann
and +Copyright © 1999 by C-Scene. All Rights Reserved.

+
+
+Copyright © 1997-2000 by C-Scene. All Rights Reserved.

Part of the +graphics and stylesheets used to generate this site are
Copyright © 1999-2000 +by Apache Software Foundation.
-- 2.43.0