tag:blogger.com,1999:blog-59227552606277596022024-03-20T03:23:40.355-06:00Programación sencilla con C SharpUn blog para comentar algunas peculiaridades que se presentan a la hora de utilizar C# para escribir, depurar y ejecutar código. Anonymoushttp://www.blogger.com/profile/18427990855197427049noreply@blogger.comBlogger2125tag:blogger.com,1999:blog-5922755260627759602.post-26543525882373256892013-03-23T19:50:00.002-06:002013-03-23T19:50:52.011-06:00Simulando operaciones de conjuntos con C#.Es comun encontrarnos con problemas que involucran conjuntos de elementos los cuales hay manejar como tales, o sea garantizando que no contengan elementos repetidos y que esten definidas las operaciones de union, interseccion y diferencia.<br />
Aqui dejo un ejemplo de una clase que he nombrado <b><i><span style="font-size: large;">ObjectSet</span> </i></b>que implementa estos servicios sobrecrgando los operadores +, - y * para realizar las operaciones de unión, diferencia e intersección respectivamente.<br />
<br />
La clase tiene un miembro privado una lista genérica.<br />
<span style="color: white;"><span style="background-color: black;"><span style="font-family: "Courier New",Courier,monospace;">private List<T> items;</span></span></span><br />
<br />
A continuación se implementan los siguientes servicios que se esperan por parte los clientes para poder manipular los elementos contenidos en el conjunto. <br />
<span style="color: white;"><span style="background-color: black;"><br /></span></span>
<span style="color: white;"><span style="background-color: black;">AddItem</span></span><br />
<span style="color: white;"><span style="background-color: black;">RemoveItem</span></span><br />
<span style="color: white;"><span style="background-color: black;">RemoveAt</span></span><br />
<span style="color: white;"><span style="background-color: black;">Count</span></span><br />
<span style="color: white;"><span style="background-color: black;">Y una enumeración para obtener/establecer el valor de elementos dentro de la lista items.</span></span><br />
Todo ello se encuentra en la seccion <i>Wrappers </i>de código.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGY3-ZRHD31c1ZXuvOwHnJNAL2SIEcSyeNFy34lclRAJ2_71OewWWGgi1CqkCtLtDcjLHvZQf2QEKuhyphenhyphen_34geXp6O1BAp43oI5RsAA5-QZGoU2s4F-Em1fx_GttrkkGCkPshJdut9eAw/s1600/wrappers.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGY3-ZRHD31c1ZXuvOwHnJNAL2SIEcSyeNFy34lclRAJ2_71OewWWGgi1CqkCtLtDcjLHvZQf2QEKuhyphenhyphen_34geXp6O1BAp43oI5RsAA5-QZGoU2s4F-Em1fx_GttrkkGCkPshJdut9eAw/s1600/wrappers.jpg" /></a></div>
<br />
Podrían seguirse declarando o incluso utilizar un acercamiento diferente haciendo que la clase sea un descendiente de List<>, preferí hacerlo así para poder controlar a que servicios de la clase los clientes tienen acceso y a cuales no de forma más simple.<br />
<br />
Más adelante se sobreescriben algunos métodos para personalizar el comportamiento de la clase como por ejemlo a la hora de mostrala por pantalla [ToString], comparar entre sí objetos de la clase. Esto se encuentra en la seccion <i>Overridings</i>.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjECtAlXOGcmW0kVtjZRaLsN4xy_gFW5fh-e7QfFGf3pTwXLap0ViWRrZFrCMn2Xx-F-eArQORkAysL9uQQEYLHc0RhnCxiVpcTzVrLmc8mvaA13J6FCIt1mKMSIfZfjHY8KkPctyv6DA/s1600/overridings.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjECtAlXOGcmW0kVtjZRaLsN4xy_gFW5fh-e7QfFGf3pTwXLap0ViWRrZFrCMn2Xx-F-eArQORkAysL9uQQEYLHc0RhnCxiVpcTzVrLmc8mvaA13J6FCIt1mKMSIfZfjHY8KkPctyv6DA/s1600/overridings.jpg" /></a></div>
<br />
A continuación aparecen los constructores de la clase. Son tres y puede extenderse la clase creando otros.<br />
<ol>
<li>El constructor sin parámetros solo inicializa la lista.</li>
<li>El constructor que toma como paramétro otro objecto copia los elementos del objeto hacia el nuevo</li>
<li>El constructos que toma como parámetro un arreglo nos sirve inicializar un objeto de la clase partiendo del arreglo.</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHborW2l8wOim-dzfXHNRMnOfdzZc8zt-EHMbEoOuN8AgdKzqO4fK_ywaHlEkjk5aEpORTPpf4VpZY0FEl3K1wBIrn-BISa2IKhbdfjH9UQsFxdQ2RgFd0bIZlzn6SWerIPbX7UguQbA/s1600/constructors.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHborW2l8wOim-dzfXHNRMnOfdzZc8zt-EHMbEoOuN8AgdKzqO4fK_ywaHlEkjk5aEpORTPpf4VpZY0FEl3K1wBIrn-BISa2IKhbdfjH9UQsFxdQ2RgFd0bIZlzn6SWerIPbX7UguQbA/s1600/constructors.jpg" /></a></div>
<br />
Y ahora, la próxima sección del código de implementación de la clase define como se comportarán los operadores: +, - y * para obtener el resultado de la operación Unión, Diferencia e Intersección respectivamente. Es aquí que se realiza el trabajo.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWtK0WSOIgpWauVrsa_m-c-0I1UDe11i-S3ImNBkyo5VfgFctwtwtHpZUzicTiadYtAAPrIjaB7UU5KpKC9fIXa8c6UMDNS0TFFdd7pq3WVrDgnUuICMdj6VsTSHfrYxPQp8Q6o_N66A/s1600/operators.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWtK0WSOIgpWauVrsa_m-c-0I1UDe11i-S3ImNBkyo5VfgFctwtwtHpZUzicTiadYtAAPrIjaB7UU5KpKC9fIXa8c6UMDNS0TFFdd7pq3WVrDgnUuICMdj6VsTSHfrYxPQp8Q6o_N66A/s1600/operators.jpg" /></a></div>
<br />
Por último un ejemplo sencillo de tres arreglos de cadenas y obtener el conjunto unión de los tres.<br />
El código que usa esta clase pues es muy simple:<br />
<span style="color: lime;"><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"> </span></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAlLtXbWckY1AvD7ssx5uEoZqp8NYE2o3LIM7hmR2FtakRjHvwhez3Jk9vDt6A7heU7Bz9xW-gzrEgKVVxKoopm2dUVIm9f3_8E3-SugUlWDstr5DhkJDF6nNtrqJa-Ba33E7UD9wQqw/s1600/program.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAlLtXbWckY1AvD7ssx5uEoZqp8NYE2o3LIM7hmR2FtakRjHvwhez3Jk9vDt6A7heU7Bz9xW-gzrEgKVVxKoopm2dUVIm9f3_8E3-SugUlWDstr5DhkJDF6nNtrqJa-Ba33E7UD9wQqw/s1600/program.jpg" /></a></div>
<br />
Conviene decir que esta clase no está completamente desarrollada ni he probado exahustivamente su código. Muchas mejoras se podrían hacer, por ejemplo se podria habilitar un método que devuelva los elementos del conjunto como un arreglo; pero creo que para ilustrar el propósito del post es suficiente. <br />
<br />
Esta debería ser la filosofía para este tipo de problemas.Anonymoushttp://www.blogger.com/profile/18427990855197427049noreply@blogger.com0tag:blogger.com,1999:blog-5922755260627759602.post-21302635534811859532013-02-10T16:28:00.002-06:002013-02-10T16:28:12.025-06:00Cálculo con numeros relativamente grandes.En algunas ocasiones el sentido común puede ser una guía mas bien engañosa. Sobre todo cuando tratamos problemas simples en los cuales se ven envueltos, a veces sin que estemos completamente conscientes de ello, números grandes.<br />
<br />
Por ejemplo veamos un problema clásico:<br />
<br />
No todos los juegos, son deportes. Aun más son pocos los deportes que tienen asociado a su nacimiento una leyenda que contiene un problema matemático. Me estoy refiriendo a la leyenda que cuenta el origen del
juego de ajedrez. A grandes rasgos la leyenda cuenta que en el momento en que
el sultán conoció el juego, este le gustó tanto que quiso premiar a su creador.
Teniéndose sí mismo por un gran hombre, le pidió que el expresara un deseo y lo
vería hecho realidad. La respuesta fue insólita. El creador del juego pidió un
grano de trigo por la primera casilla del tablero, dos por la segunda, cuatro
por la tercera, ocho por la siguiente y así sucesivamente. El sultán se sintió
menospreciado por este hombre y le ordenó que esperase fuera; que
inmediatamente le sería entregado dentro de un saco lo que pidió.<br />
<br />
<div class="MsoNormal">
Nuestro sultán terminó sin saberlo con dos regalos, un juego
trascendental y una lección de humildad. A veces lo grandes hombres reciben más
regalos de los que pueden apreciar. </div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Volviendo a C#, si nos correspondiese a nosotros desempeñar
el rol de matemático de la corte, nuestra respuesta debería ser la misma que
recibió el sultán de la leyenda: ni sembrando toda la superficie de a tierra
durante varios años y entregando hasta el último grano cosechado podrían
satisfacer la petición formulada por su creador. La única diferencia es que
nosotros podemos llegar más rápido a esa conclusión. Escribir unas pocas líneas
de código C# dentro del cuerpo de una función es todo lo que tenemos que hacer.
Estas líneas podrían tener el siguiente aspecto:</div>
<div class="MsoNormal">
<br /></div>
<div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">static long CantidadSemillas(int alto = 8, int ancho = 8)</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">{</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode" style="text-indent: 35.4pt;">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span lang="EN-US" style="mso-ansi-language: EN-US;">long</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">resultado</span> = 0;</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode" style="text-indent: 35.4pt;">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span lang="EN-US" style="mso-ansi-language: EN-US;">int</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">celdas</span> = <span lang="EN-US" style="mso-ansi-language: EN-US;">alto</span> * <span lang="EN-US" style="mso-ansi-language: EN-US;">ancho</span>;</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<br /></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode" style="text-indent: 35.4pt;">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span lang="EN-US" style="mso-ansi-language: EN-US;">for</span> (<span lang="EN-US" style="mso-ansi-language: EN-US;">int</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span> = 0; <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span> < <span lang="EN-US" style="mso-ansi-language: EN-US;">celdas</span>; <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span>++)</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode" style="text-indent: 70.8pt;">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span lang="EN-US" style="mso-ansi-language: EN-US;">resultado</span> += (<span lang="EN-US" style="mso-ansi-language: EN-US;">long</span>)Math.<span lang="EN-US" style="mso-ansi-language: EN-US;">Pow</span>(2, <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span>);</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode" style="text-indent: 70.8pt;">
<br /></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode" style="text-indent: 35.4pt;">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span lang="EN-US" style="mso-ansi-language: EN-US;">return</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">resultado</span>;</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">}</span></b></span></div>
<span style="color: #274e13;">
</span><div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Utilizando esta función para un tablero de 4x4 casillas,
obtendríamos rápidamente la respuesta: 65535 granos de trigo. Sin embargo para
un tablero normal de 8x8 casillas obtenemos -1. No hay errores en tiempo de
ejecución y sin embargo la respuesta es incorrecta. Esta es la parte donde el “gran
hombre” nos mandaría a decapitar. Aún sin cabeza deberíamos preguntarnos ¿qué fue
lo que ocurrió y por qué recibimos una respuesta disparatada en lugar de un
mensaje de error? </div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Modifiquemos el código anterior para usar enteros largos sin
signo. Quedaría así.</div>
<div class="MsoNormal">
<br /></div>
<div class="CSharpCode">
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;"><span lang="EN-US" style="mso-ansi-language: EN-US;">static</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">ulong</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">CantidadSemillas</span>(<span lang="EN-US" style="mso-ansi-language: EN-US;">int</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">alto</span> = 8, <span lang="EN-US" style="mso-ansi-language: EN-US;">int</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">ancho</span> = 8)</span></b></span></div>
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">
</span></b></span><div class="CSharpCode">
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">{</span></b></span></div>
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">
</span></b></span><div class="CSharpCode" style="text-indent: 35.4pt;">
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">ulong
resultado = 0;</span></b></span></div>
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">
</span></b></span><div class="CSharpCode" style="text-indent: 35.4pt;">
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">int
celdas = alto * ancho;</span></b></span></div>
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">
</span></b></span><div class="CSharpCode">
<br /></div>
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">
</span></b></span><div class="CSharpCode" style="text-indent: 35.4pt;">
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;"><span lang="EN-US" style="mso-ansi-language: EN-US;">for</span> (<span lang="EN-US" style="mso-ansi-language: EN-US;">int</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span> = 0; <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span> < <span lang="EN-US" style="mso-ansi-language: EN-US;">celdas</span>; <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span>++)</span></b></span></div>
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">
</span></b></span><div class="CSharpCode" style="text-indent: 78.0pt;">
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;"><span lang="EN-US" style="mso-ansi-language: EN-US;">resultado</span> += (<span lang="EN-US" style="mso-ansi-language: EN-US;">ulong</span>)Math.<span lang="EN-US" style="mso-ansi-language: EN-US;">Pow</span>(2, <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span>);</span></b></span></div>
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">
</span></b></span><div class="CSharpCode">
<br /></div>
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">
</span></b></span><div class="CSharpCode" style="text-indent: 35.4pt;">
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;"><span lang="EN-US" style="mso-ansi-language: EN-US;">return</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">resultado</span>;</span></b></span></div>
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">
</span></b></span><div class="CSharpCode">
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;"><span style="mso-spacerun: yes;"> </span>}</span></b></span></div>
<div class="CSharpCode">
<br /></div>
<span style="color: #274e13;"><b><span style="font-family: "Courier New",Courier,monospace;">
</span></b></span><div class="MsoNormal">
Al ejecutar este código recibimos la respuesta correcta: <span style="color: #274e13;"><span style="font-family: "Courier New",Courier,monospace;"><b>18446744073709551615</b></span></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
De aquí podemos deducir que anteriormente hubo un error de
desborde, tanto la respuesta como algunos de los cálculos intermedios para
determinar la respuesta era representable usando variables de tipo entero
largo. Las variables de tipo entero largo utilizan 8 bytes y pueden tomar
valores enteros entre <span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">-9223372036854775808</span></b></span> y <span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">9223372036854775807</span></b></span>.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Pero aún tenemos la curiosidad, ¿por qué no nos fue
notificado que había ocurrido un error? Volvamos a modificar el código para que utilice <i style="mso-bidi-font-style: normal;">checked</i> y quede así:</div>
<div class="MsoNormal">
<br /></div>
<div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span><span lang="EN-US" style="mso-ansi-language: EN-US;">static</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">ulong</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">CantidadSemillas</span>(<span lang="EN-US" style="mso-ansi-language: EN-US;">int</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">alto</span> = 8, <span lang="EN-US" style="mso-ansi-language: EN-US;">int</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">ancho</span> = 8)</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span>{</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span>ulong resultado = 0;</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<br /></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span>int
celdas = alto * ancho;</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span></span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span>checked</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span>{</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span><span lang="EN-US" style="mso-ansi-language: EN-US;">for</span> (<span lang="EN-US" style="mso-ansi-language: EN-US;">int</span> <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span>
= 0; <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span> < <span lang="EN-US" style="mso-ansi-language: EN-US;">celdas</span>; <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span>++)</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span><span lang="EN-US" style="mso-ansi-language: EN-US;">resultado</span> += (<span lang="EN-US" style="mso-ansi-language: EN-US;">ulong</span>)Math.<span lang="EN-US" style="mso-ansi-language: EN-US;">Pow</span>(2, <span lang="EN-US" style="mso-ansi-language: EN-US;">i</span>);</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span>}</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<br /></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span>return resultado;</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="CSharpCode">
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;"><span style="mso-spacerun: yes;"> </span>}</span></b></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><b><span style="color: #274e13;">
</span></b></span><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal">
Ahora calculamos la cantidad de semillas de trigo a entregar
si usásemos un ajedrez modificado al estilo Sheldon Cooper y las dimensiones del
tablero fueran de 16X16 casillas.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Ahora sí recibimos nuestra querida Overflow Exception que
nos notifica que algo fue mal evitándonos respuestas incorrectas. Si comentamos
la línea de código que contiene checked y volvemos a correr el programa pues obtenemos
una respuesta incorrecta que tomaríamos como correcta con todas las consecuencias
que podría traer esto. Las computadoras no se equivocan pero este comportamiento
es lo más parecido.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
La palabra clave checked se utiliza para habilitar
precisamente el chequeo de errores de desbordamiento para expresiones no constantes
en tiempo de ejecución. Es necesario prever la aparición de números grandes en cálculos
intermedios para habilitar esta opción o no. Esta trivialidad ha causado
comportamientos anómalos en más de una ocasión que pueden hacernos sentir que "<i>perdemos la cabeza</i>".</div>
<div class="MsoNormal">
<br /></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/18427990855197427049noreply@blogger.com0