<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Programación y desarrollo web &#187; Programacion</title>
	<atom:link href="http://www.puntopeek.com/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.puntopeek.com</link>
	<description>Programación en C#, PHP y software libre</description>
	<lastBuildDate>Thu, 26 Jan 2012 04:30:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>LINQ con C#. Ejemplos</title>
		<link>http://www.puntopeek.com/programacion/linq-c-sharp-ejemplos-caracteristicas/</link>
		<comments>http://www.puntopeek.com/programacion/linq-c-sharp-ejemplos-caracteristicas/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 02:53:23 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=491</guid>
		<description><![CDATA[En el último post les estaba hablando sobre una de las nuevas características de C#, los métodos extensores. En esta ocasión veremos algunas características y ejemplos sobre otra nueva característica de C# para trabajar con fuentes de datos: LINQ.


Entradas relacionadas<li><a href='http://www.puntopeek.com/tutoriales-c/herencia-programacion-en-c/' rel='bookmark' title='Permanent Link: Herencia en C#. Concepto y ejemplos'>Herencia en C#. Concepto y ejemplos</a></li>
<li><a href='http://www.puntopeek.com/programacion/genericidad-ejemplos-c-sharp/' rel='bookmark' title='Permanent Link: Genericidad en C#. Ejemplos'>Genericidad en C#. Ejemplos</a></li>
]]></description>
			<content:encoded><![CDATA[<p>Casi todas las aplicaciones medianamente serias, necesitarán en algún momento acceder y consultar una base de datos, para luego convertir estos datos en objetos y trabajar con ellos.</p>
<p>Pues bien, si ya llevas algún tiempo programando, habrás notado que esto de extraer los datos de la fuente de datos y tratarlos como objetos es algo complicado, sobre todo porque existen buenas diferencias entre las bases de datos relacionales y los lenguajes orientados a objetos como <em>C#.</em></p>
<p>Se han diseñado unas cuantas herramientas <em>ORM</em> (Object-Relational mapping) para resolver este problema (crear una base de datos orientada a objetos virtual), pero casi siempre dejan algo que desear, y hoy por hoy, a pesar de haber unas cuantas herramientas de uso libre y comercial, muchos programadores prefieren usar sus propias bibliotecas para trabajar con fuentes de datos.</p>
<p>En este contexto es que nace la idea de <em>LINQ</em> (Language INtegrated Query), en principio una herramienta más para dar solución al problema del mapeo objeto-relacional (ORM) y simplificar la interacción entre objetos y fuentes de datos (XML, ADO.Net, RDBMS), quién luego se convirtió en un conjunto de herramientas de consulta integrado en varios lenguajes de la plataforma .Net.</p>
<p><em>LINQ</em> es un cambio en la forma de manejar y manipular los datos, permite el acceso a cualquier fuente de datos (<em>LINQ to Objects</em>, <em>LINQ to SQL</em>,<em> LINQ to DataSets</em>), mezclar datos de diferentes fuentes con una sintaxis muy sencilla, comprobar en tiempo de compilación las consultas, el uso de IntelliSense de Visual Studio y un enfoque declarativo para escribir códigos más cortos y sencillos. Funciona a partir de <em>C# 3.0</em> y <em>VB.Net 9.0</em> ya que requiere de ayuda por parte del compilador.</p>
<p>En realidad <em>LINQ</em> lo que provee es una capa intermedia entre la fuente de dato y el cliente, por decirlo de alguna forma. Gracias a esta abstracción es que podemos trabajar de la misma forma con <em>LINQ </em>sin importar que la fuente de datos sea un archivo <em>XML</em> o una base de datos.</p>
<p>Bueno,  vamos a ver algunos códigos y ejemplos de consultas <em>LINQ </em>y su ventaja frente a las consultas imperativas que se hacen con <em>C#</em> y a otras.</p>
<p><small>Nota: Para este ejemplo, vamos a suponer que tenemos ya una base de datos llamada <em>Personal </em>mapeada a un conjunto de clases como sigue. Noten que en muchos casos esto se puede hacer de forma automática con <em>Visual Studio</em>. </small></p>
<p>Esta sería la estructura de la clase que hace referencia a la base de datos:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>Table<span style="color: #000000;">&#40;</span>Name<span style="color: #008000;">=</span><span style="color: #666666;">&quot;Personas&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #FF0000;">class</span> Persona
<span style="color: #000000;">&#123;</span>
     <span style="color: #000000;">&#91;</span>Column<span style="color: #000000;">&#40;</span>IsPrimaryKey<span style="color: #008000;">=</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
      <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> ID<span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #000000;">&#91;</span>Column<span style="color: #000000;">&#40;</span>Name<span style="color: #008000;">=</span><span style="color: #666666;">&quot;ContactName&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
      <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Nombre<span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #000000;">&#91;</span>Column<span style="color: #000000;">&#40;</span>Name<span style="color: #008000;">=</span><span style="color: #666666;">&quot;ContactAge&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
      <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Edad<span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #000000;">&#91;</span>Column<span style="color: #000000;">&#93;</span>
      <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Ocupación<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Ahora vamos a obtener todas las personas que tengan menos de 30 años y que sean abogados usando LINQ:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">var consulta <span style="color: #008000;">=</span>
            from persona <span style="color: #0600FF;">in</span> db.<span style="color: #0000FF;">GetTable</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            where persona.<span style="color: #0000FF;">Edad</span><span style="color: #008000;">&lt;</span><span style="color: #FF0000;">30</span> <span style="color: #008000;">&amp;&amp;</span> persona.<span style="color: #0000FF;">Ocupacion</span><span style="color: #008000;">==</span>”abogado”
            select persona<span style="color: #008000;">;</span></pre></div></div>

<p>Y así ya dejamos de tener que hacer las consultas SQL aquellas que nos complicaban la vida, ahora todo es mucho más sencillo, y podemos mantener las mismas consultas sin importar que fuente de dato se esté usando. En el MSDN hay <a href="http://msdn.microsoft.com/en-us/vcsharp/aa336746">unos cuantos buenos ejemplos de LINQ</a>. Terminaré con una frase que describe en dos líneas la idea esencial de LINQ:</p>
<blockquote><p>“Before LINQ it was like you had to order your dinner in one language and drinks in another”<br />
Jason McConnel, Product Manager for Visual Studio at Microsoft</p></blockquote>
<h2>Para seguir leyendo sobre LINQ:</h2>
<p><a href="http://download.damieng.com/dotnet/LINQToSQLCheatSheet.pdf" target="_blank">Hoja de Trucos de LINQ to SQL</a><br />
<a href="http://www.devtroce.com/2009/12/19/un-ejemplo-practico-de-linq-y-c/">Ejemplo práctico con LINQ y C#</a><br />
<a href="http://speakingin.net/tutorial-de-linq-to-sql/">Tutorial de LINQ to SQL </a>*</p>


<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/tutoriales-c/herencia-programacion-en-c/' rel='bookmark' title='Permanent Link: Herencia en C#. Concepto y ejemplos'>Herencia en C#. Concepto y ejemplos</a></li>
<li><a href='http://www.puntopeek.com/programacion/genericidad-ejemplos-c-sharp/' rel='bookmark' title='Permanent Link: Genericidad en C#. Ejemplos'>Genericidad en C#. Ejemplos</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/programacion/linq-c-sharp-ejemplos-caracteristicas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aplicaciones de Consola en C#</title>
		<link>http://www.puntopeek.com/programacion/creando-una-aplicacion-de-consola-c-sharp/</link>
		<comments>http://www.puntopeek.com/programacion/creando-una-aplicacion-de-consola-c-sharp/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 10:07:36 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[ejemplos C#]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=462</guid>
		<description><![CDATA[El principal motivo de este post, es que la mayor parte de los que leen este blog no saben como interactuar con el usuario a través de la consola (lo cual es comprensible), y no tienen una forma dinámica de &#8230; <a href="http://www.puntopeek.com/programacion/creando-una-aplicacion-de-consola-c-sharp/">seguir leyendo &#187;</a></p>


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[<p>El principal motivo de este post, es que la mayor parte de los que leen este blog no saben como interactuar con el usuario a través de la consola (lo cual es comprensible), y no tienen una forma dinámica de probar sus códigos. Generalmente cuando nos enseñan a programar, parten de la parte de como crear métodos, la sintaxis del lenguaje, las estructuras de control (for, foreach, etc) y se pasan por alto la parte de como crear una aplicación, donde el usuario vea resultados a traves de la consola. Bueno, empecemos desde 0:</p>
<h3>Crear una aplicación de Consola:</h3>
<p>Para esto, deberemos ir a File-&gt;New-&gt;Project si usas Visual Studio, pero con cualquier otro IDE debe ser algo parecido. Entonces se mostrará una nueva ventana como la de la figura, seleccionamos C# en el menu izquierdo y luego como tipo de proyecto marcamos &#8220;Console Apliccation&#8221;, le ponemos un nombre al proyecto y le damos Ok. Ya estaremos listos para empezar con el código.</p>
<p><a href="http://www.puntopeek.com/wp-content/uploads/2011/06/screenshot.jpg"><img class="alignnone size-full wp-image-463" title="new-console-apliccation" src="http://www.puntopeek.com/wp-content/uploads/2011/06/screenshot.jpg" alt="screenshot Aplicaciones de Consola en C#" width="566" height="342" /></a></p>
<h3>Métodos útiles para trabajar con la consola</h3>
<p>Para interactuar con el usuario es que existen algunos métodos básicos cuando trabajamos con la Consola. Veamos los más usados:</p>
<p><strong>1- Console.WriteLine();</strong><br />
Escribe una nueva linea en la consola, es como presionar Enter y escribir una linea. Por ejemplo, podemos hacer:<br />
Console.WriteLine(&#8220;Lo que quiera q salga en la consola&#8221;);<br />
También podremos imprimir las variables de nuestro programa, para esto hay dos formas, pero veamos mejor dos ejemplos que son lo mismo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">//declaramos dos variables</span>
<span style="color: #FF0000;">string</span> nombre <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Invitado&quot;</span><span style="color: #008000;">;</span>
<span style="color: #FF0000;">int</span> edad <span style="color: #008000;">=</span> <span style="color: #FF0000;">22</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">//Imprimimos una linea en la consola de dos formas distintas</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Tu nombre es: &quot;</span><span style="color: #008000;">+</span>nombre<span style="color: #008000;">+</span><span style="color: #666666;">&quot; y tienes &quot;</span> <span style="color: #008000;">+</span> edad <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; años.&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">//En C# se usa el operador + para concatenar cadenas</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Tu nombre es {0} y tienes {1} años&quot;</span>, nombre, edad<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Como ven la segunda vía es mucho más simple, solo debes recordar que el numero que está entre cochetes, es el indice del parámetro que se pasa al final del método.<br />
<strong>2- Console.Write()</strong><br />
Hace casi lo mismo que Console.WriteLine() pero sin cambiar de línea, o sea&#8230; concatena el texto que le pasemos al método con lo que se haya escrito hasta ese momento en la consola.</p>
<p><strong>3- Console.ReadLine()</strong><br />
Se usa para leer lo que el usuario escribió en la consola, y podemos guardarlo en una variable para despues usarlo en nuestro programa. No hay que pasarle ningún parámetro y el programa solo continuará cuando el usuario teclee alguna línea y presione Enter. Podemos hacer algo como esto:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Escriba su nombre&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #FF0000;">string</span> nombre <span style="color: #008000;">=</span> Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Importante: Si lo que queremos es recoger lo que el usuario escriba como un tipo en específico, por ejemplo, un entero, deberemos usar el método estático int.Parse, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">int</span> x <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>ya que lo que devuelve Console.ReadLine() es un string.</p>
<p><strong>4-Console.ReadKey()</strong><br />
Este método resulta importante algunas veces, sobre todo cuando queremos darle varias opciones al usuario (a, b, c, d). Aunque se puede utilizar Console.ReadLine(). En este caso, este método lo que devuelve es un objeto de tipo ConsoleKeyInfo, y se puede utilizar de la siguiente forma, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Presiona una tecla&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
ConsoleKeyInfo c <span style="color: #008000;">=</span> Console.<span style="color: #0000FF;">ReadKey</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Presionaste la tecla &quot;</span><span style="color: #008000;">+</span> c.<span style="color: #0000FF;">KeyChar</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<h3Interactuando con el usuario</h3>
<p>Bueno, estos son algunos de los métodos más importantes. Veamos ahora como está compuesto un proyecto de tipo consola. Lo primero que vemos es el namespace que se llama igual que el proyecto, luego vemos que hay una clase Program, la cual se llama así por defecto y dentro de esta, un método Main() con la siguiente signatura:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span></pre></div></div>

<p>
Este es el punto de entrada de nuestra aplicación, el método se llama así por defecto y no se debe cambiar ni añadir ningún parámetro. Bueno, vamos ya a escribir un poco de código, como ejemplo, vamos a calcular la edad de un usuario pidiendole que nos diga el año de nacimiento. Para esto crearemos otro método estático (dentro de Program) que le pasaremos un año de nacimiento y calcula la edad. Veamos:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">int</span> DameEdad<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> dia, <span style="color: #FF0000;">int</span> mes, <span style="color: #FF0000;">int</span> año<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
     <span style="color: #008080; font-style: italic;">//Usamos la clase DateTime y un método estatico para restar fechas</span>
     DateTime fecha_nacimiento <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span>año, mes, dia<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     TimeSpan edad <span style="color: #008000;">=</span> DateTime.<span style="color: #0000FF;">Now</span>.<span style="color: #0000FF;">Subtract</span><span style="color: #000000;">&#40;</span>fecha_nacimiento<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>edad.<span style="color: #0000FF;">Days</span><span style="color: #008000;">/</span><span style="color: #FF0000;">365</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Este método hace uso de la clase DateTime de .Net, que tiene muchas funcionalidades, entre ellas permite restar dos fechas, lo cual sería un algoritmo un poco pesado de programar (no es tan sencillo como restar los años). Cuando hacemos DateTime.Now, accedemos a la fecha actual que tenemos en nuestra PC, por ultimo devolvemos la cantidad de dias que han pasado entre las dos fechas y lo dividimos entre la cantidad de dias que tiene un año.</p>
<p>Ahora veamos como programar el método Main para interactuar con el usuario, pedirle la fecha, y encargarnos que la introduzca correctamente. El código sería algo así:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">//Variables que usaremos para la fecha de nacimiento</span>
    <span style="color: #FF0000;">int</span> dia_nacimiento, mes_nacimiento, año_nacimiento<span style="color: #008000;">=</span><span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
&nbsp;
    Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Escriba su nombre&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #FF0000;">string</span> nombre <span style="color: #008000;">=</span> Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Hola {0}, bienvenido a mi aplicacion!&quot;</span>,nombre<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Por favor, introduce tu fecha de nacimiento:&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008080; font-style: italic;">//El while solo termina cuando se hace break</span>
    <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">//Pedimos el dia y lo validamos</span>
        Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Dia de nacimiento: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        dia_nacimiento <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>dia_nacimiento <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">1</span> <span style="color: #008000;">||</span> dia_nacimiento <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">31</span><span style="color: #000000;">&#41;</span>
             Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Por favor, especifique un dia entre 1 y 31&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">else</span>
             <span style="color: #008080; font-style: italic;">//Si el dia es valido, entonces pasamos a pedir el mes</span>
             break<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">//Pedimos el mes y lo validamos</span>
        Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Mes de nacimiento: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        mes_nacimiento <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>mes_nacimiento <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">1</span> <span style="color: #008000;">||</span> mes_nacimiento <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">12</span><span style="color: #000000;">&#41;</span>
             Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Por favor, especifique un mes entre 1 y 12&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">else</span>
             break<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">//Pedimos el año y lo validamos</span>
        Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Año de nacimiento: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        año_nacimiento <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008080; font-style: italic;">//El año no puede ser posterior a 1900 y anterior al año actual</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>año_nacimiento <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">1900</span> <span style="color: #008000;">||</span> año_nacimiento <span style="color: #008000;">&gt;</span> DateTime.<span style="color: #0000FF;">Now</span>.<span style="color: #0000FF;">Year</span><span style="color: #000000;">&#41;</span>
             Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Por favor, especifique un año entre 1900 y el {0}&quot;</span>, DateTime.<span style="color: #0000FF;">Now</span>.<span style="color: #0000FF;">Year</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">else</span>
             break<span style="color: #008000;">;</span>
     <span style="color: #000000;">&#125;</span>
     <span style="color: #008080; font-style: italic;">//Si llegamos aqui, es porque tenemos una fecha correcta, vamos a calcular la edad con</span>
     <span style="color: #008080; font-style: italic;">//el método DameEdad() que escribimos antes</span>
     <span style="color: #FF0000;">int</span> edad <span style="color: #008000;">=</span> DameEdad<span style="color: #000000;">&#40;</span>dia_nacimiento, mes_nacimiento,año_nacimiento<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>nombre<span style="color: #008000;">+</span><span style="color: #666666;">&quot;, usted tiene &quot;</span> <span style="color: #008000;">+</span> edad <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; años.&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Presione cualquier tecla para terminar el programa&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     Console.<span style="color: #0000FF;">ReadKey</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Por supuesto el código se puede hacer más eficiente y mucho más corto, pero quería mostrarte el uso de las funciones mencionadas antes. El código está bastante bien comentado, y espero que con las cosas que expliqué antes se entienda sin problemas. También <strong><a href="http://www.puntopeek.com/wp-content/uploads/2011/06/Calcula-Edad.zip">les dejo el proyecto</a> </strong>para que lo descarguen. Cualquier duda o aporte, en los comentarios.</p>


<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/programacion/creando-una-aplicacion-de-consola-c-sharp/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>El problema de la Evacuación</title>
		<link>http://www.puntopeek.com/programacion/el-problema-de-la-evacuacion-escape-problem/</link>
		<comments>http://www.puntopeek.com/programacion/el-problema-de-la-evacuacion-escape-problem/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 04:41:37 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[DAA]]></category>
		<category><![CDATA[diseño algoritmos]]></category>
		<category><![CDATA[grafos]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=409</guid>
		<description><![CDATA[En este post verás cómo podemos reducir el problema de encontrar m caminos vértice-disjuntos en un problema de flujo máximo con capacidades 1 y 0, exponiendo una condición necesaria y suficiente. Además incluyo un código en C#.


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[<p>El semestre pasado, dimos la asignatura DAA (Diseño y Análisis de Algoritmos), que nos introducía varias técnicas, métodos y trucos para programar ciertos problemas de forma eficiente. Al final del semestre, nos dejan 3 o 4 problemas por equipo, para los cuales no solo tenemos que programar una solución eficiente, sino que tenemos que demostrar que funciona, y que es bastante eficiente&#8230; pues aquí les dejo mi informe del problema que me orientaron. Pasé largos días buscando información de varios lugares, pero por fin pude reunir toda la información que necesitaba y tuve que leer bastante sobre grafos y en especial el método de <strong>Ford Fulkerson</strong> para encontrar flujo máximo en un grafo, y la verdad me sorprendí bastante cuando logré terminar este ejercicio, justo a tiempo. En la literatura y en Internet se refieren a este problema como <strong>&#8220;Escape Problem&#8221;</strong> o <strong>&#8220;Evacuation Problem&#8221;</strong>. <strong>Aquí están las demostraciones de por que el algoritmo funciona correctamente, y al final, un zip con la solución del problema implementado en C#</strong>.</p>
<h2>Cual es el problema?</h2>
<p>Una rejilla n × n es un grafo no dirigido que consiste de n filas y n columnas de vértices. El vértice de la fila i y la columna j se denota (i, j). Todos los vértices en la rejilla tienen exactamente 4 vecinos, excepto los vértices frontera que corresponden a los (i, j) para los cuales: i = 1, i = n, j = 1 o j = n. Dados m &lt;n2 puntos iniciales (x1, y1), (x2, y2), . . . , (xm, ym) en la rejilla, el problema de la evacuación consiste en determinar si existen m caminos disjuntos (no tienen vértices comunes), que comiencen en los puntos iniciales y lleguen hasta m puntos diferentes de la frontera.</p>
<h2>Resumen</h2>
<p>El problema consiste en encontrar <strong>m caminos disjuntos entre dos conjuntos A y B</strong>, donde A son los m puntos de entrada y B es el conjunto de los vértices en la frontera. Primeramente se verá cómo podemos reducir el problema de encontrar m caminos vértice-disjuntos en encontrar m caminos arista-disjuntos entre dos nuevos vértices s y t transformando la entrada. En la segunda parte reduciremos el problema de saber si existen m caminos arista-disjuntos entre s y t, en un problema de flujo máximo con capacidades 1 y 0, exponiendo una condición necesaria y suficiente. Por último mostraremos un algoritmo para encontrar el flujo máximo en un grafo en O(n3).</p>
<h2>1. Transformando la entrada</h2>
<p>Primeramente veremos cómo el problema de encontrar m caminos vértice-disjuntos entre dos conjuntos de vértices se puede reducir a encontrar m caminos vértice-disjuntos entre dos nuevos vértices s y t.</p>
<p>Sean:<br />
<em>i. A⊂V(G) y B⊂V(G) | A∩B=∅ ^ |A|=m</em><br />
<em>ii. s y t dos nuevos vértices donde s,t ∉V(G).</em><br />
<em>iii. ∀v∈A, E(G) = E(G) + &lt;s,v&gt;</em></p>
<div id="_mcePaste"><em>iv. ∀v∈B, E(G) = E(G) + &lt;v,t&gt;</em></div>
<p>Sea k la cantidad de caminos vértice-disjuntos que van desde A hasta B y sea k’ la cantidad de caminos disjuntos que van de s a t, donde estos son los únicos vértices comunes en los k’ caminos, entonces k=k’, ya que aumentamos cada uno de los A-B caminos vértice-disjuntos con dos aristas &lt;s,v0&gt; y &lt;vn,t&gt; donde v0 es el primer vértice de un A-B camino y vn el último.Luego, si hacemos estos cambios al grafo de la entrada tendremos un nuevo grafo G’=&lt;V’,E’&gt;, donde:</p>
<p><em>V’=V+{s,t}</em><br />
<em>E’=E+{s,u}+{v,t} | u∈A ^ v∈B</em></p>
<p>Ahora convertiremos el grafo G’ en un grafo dirigido de la siguiente forma:</p>
<p>Por cada arista no dirigida en G’, pondremos dos aristas dirigidas, una en cada sentido. Luego, los k caminos vértice-disjuntos en G’ se mantienen luego de hacer esta transformación. Lo siguiente que haremos será convertir los caminos vértice-disjuntos en G en caminos arista-disjuntos en G´, para esto hacemos:</p>
<p><em>V’ = {vin, vout | v∈V(G)}</em><br />
<em>E’ = {(vout, win) | (v,w) ∈E(G)} ∪ {(vin, vin) | v∈V(G)}</em></p>
<p>Con las transformaciones propuestas obtenemos un nuevo grafo G’ donde cada camino vértice-disjunto en G corresponde con un camino arista-disjunto en G’ entre los vértices s y t, ya que cada camino que pasa por un vértice v pasará solo a través de la arista (vin, vout). El costo de obtener G’ a partir de G es claramente O(V), lo que en términos de la entrada sería O(n2).</p>
<h2>2. Reduciendo el problema de encontrar k caminos arista-disjuntos a un problema de flujo máximo en una red de flujo.</h2>
<p>En esta segunda parte, definiremos una red de flujo matemáticamente y veremos en detalle cómo resolver nuestro problema original utilizando un algoritmo para encontrar el flujo máximo en una red con capacidades de valor 1.</p>
<p>Sin pérdida de generalidad, sea G=&lt;V,E&gt; un grafo conexo y dirigido con dos vértices distinguidos s y t que llamaremos origen y destino respectivamente, donde indeg(s)=exdeg(t)=0. Definamos una función c: E→Z+ en G que llamaremos capacidad, y representa intuitivamente la cantidad máxima de flujo que puede pasar por la arista (u,v).</p>
<p>Diremos que un flujo s-t es una función f:E→Z+ donde el valor f(u,v) representa la cantidad de flujo que puede pasar entre los vértices u y v. El flujo f debe satisfacer las siguientes dos propiedades:</p>
<p><em>i. 0≤f(u,v)≤c(u,v), ∀(u,v)∈E(G).</em></p>
<p><em>ii. La sumatoria de los flujos que entran en un vértice es igual a la sumatoria de los flujos que salen de él (no lo puedo porner matemáticamente)</em></p>
<p>Obviamente la propiedad (ii) no se cumple para s y t, ya que indeg(s)=exdeg(t)=0. Llamaremos flujo de G y lo denotaremos por f(G) a la cantidad de flujo generado por s, luego <em>f(G)</em> es la suma de los flujos de las aristas que salen de <em>s</em>. El problema del flujo máximo es hallar cual es el máximo valor de f(G). O sea, ¿Cuál es la mayor cantidad de flujo que se puede enviar desde s sin violar las capacidades de las aristas? Denotaremos el flujo máximo de G como <em>f*(G)</em>.</p>
<p>Volviendo a nuestro problema, después de hacer los cambios propuestos en (1) a la rejilla de entrada, tendremos un grafo D=&lt;V,E&gt; conexo, dirigido y dos vértices distinguidos s y t, indeg(s)=exdeg(t)=0. Luego, podemos definir un flujo s-t en D, donde en un principio todas las aristas tendrán capacidad 1 y se puede ver fácilmente que no se viola ninguna de las dos propiedades. Veamos una condición necesaria y suficiente para saber cuál es el número máximo de caminos arista disjuntos entre s y t:</p>
<p><strong>Teor: El número máximo de caminos arista-disjuntos entre s y t en D, es igual al flujo máximo en D entre s y t donde todas las aristas tienen capacidad 1.</strong></p>
<p><strong>D/ </strong>Sea <em>k</em> el número de caminos arista-disjuntos en <em>D</em> entre <em>s</em> y <em>t</em>, entonces el flujo máximo <em>f(D)≥k</em>.</p>
<p>Sea P el conjunto de los k caminos disjuntos de <em>s</em> a <em>t</em>. Vamos a hacer lo siguiente:</p>
<p><em>1. f(u,v)=1 ∀(u,v)∈E(P)</em></p>
<p><em>2. f(u,v)=0 ∀(u,v)∉E(P)</em></p>
<p>f(u,v) solo toma valores 0 ó 1, por lo que se cumple la propiedad (i). Además, todo camino empieza en s y termina en t, y esto implica que todos los vértices interiores que participan en alguno de los k caminos arista-disjuntos tiene una arista que entra y una que sale de v con flujo 1 por construcción, por lo que se cumplirá la propiedad (ii). Luego, tendremos un flujo válido en D, f(G) =k, que son la cantidad de aristas con flujo que salen de s. Luego,<em> f*(G) ≥f(G) ≥k.</em></p>
<p><em></em>Sea D una red de flujo, donde f(D)= k y todas las aristas tienen capacidad 1, entonces existen al menos k caminos arista-disjuntos entre s y t.</p>
<p>En otras palabras, lo que tenemos que demostrar es que el conjunto de aristas con f(u,v)=1 contiene un subconjunto de k caminos arista-disjuntos entre s y t, esto es porque el flujo en este caso toma siempre valores 0 ó 1, por la forma en la que construimos nuestro grafo D.</p>
<p>Sea f(D)=k y m’ el conjunto de aristas tal que f(u,v)=1.</p>
<p><strong>Para esta demostración haremos inducción en el número de aristas con f(u,v)=1.</strong></p>
<div id="_mcePaste">
<p>(CB) para m’=0 no hay caminos disjuntos en D, ya que no hay ninguna arista con f(u,v)=1, y f(G)=0.</p>
<p>(HI)Supongamos que en D hay un subconjunto de k caminos arista-disjuntos con menos de m’ aristas que llevan flujo.</p>
<p>Sea (s,v) una arista que lleva flujo (tiene que existir porque f(D)&gt;0). Entonces, por la propiedad (ii) de conservación, hay alguna arista que sale de v con f(v,x) =1, x∈V(D). Repitiendo este proceso tenemos dos posibilidades, llegamos a t (1) o volvemos a un vértice que ya habíamos visitado (2).</p>
<p><strong>Caso1</strong>: Si alcanzamos a t, encontramos un camino arista-disjunto partiendo desde s. Sea p dicho camino. Si hacemos f(u,v)=0 ∀(u,v)∈P, se siguen cumpliendo las propiedades (i) y (ii), además reducimos f(G) en 1 unidad. Como tendremos menos de m’ aristas que llevan flujo, entonces tendremos k-1 caminos disjuntos, por hipótesis de inducción, luego volvemos a añadir P, y tendremos k-1+1=k caminos disjuntos desde s hasta t.</p>
<p><strong>Caso2</strong>: Si visitamos un vértice por segunda vez, encontramos un ciclo. Sea C el conjunto de aristas de dicho ciclo. Podemos hacer f(u,v)=0 ∀(u,v)∈C, sin que se afecte el flujo de s a t, ya que cada arista del camino entra y sale de un vértice en C, luego se siguen cumpliendo las propiedades (i) y (ii), y tendremos menos de m´ aristas con flujo. Como f(G) sigue siendo k, por hipótesis de inducción tendremos un conjunto de k caminos disjuntos de s a t.</p>
<p>En virtud del principio de inducción queda demostrado.</p>
<p>Esta demostración no solo nos da una condición necesaria y suficiente para saber cuándo hay m caminos arista-disjuntos en una red de flujo donde todas las aristas tienen capacidades 1, sino como obtener dichos caminos, aunque en nuestro problema solo hay que decir si existen o no.</p>
<p>Luego, el problema se convierte en saber si el flujo máximo de nuestro nuevo grafo (después de hacer las transformaciones y ponerle capacidades 1 a todas las aristas) es igual a m, ya que m son la cantidad máxima de caminos arista-disjuntos que podemos encontrar en G.</p>
<h2>3. Calculando el flujo máximo en una red de flujo</h2>
<p>Para calcular el flujo máximo en un grafo dirigido, conexo y con capacidades en las aristas usaremos el método de Ford Fulkerson, basado en tres conceptos principales: red residual, camino aumentable y corte:</p>
<p>La capacidad residual de un arco intuitivamente es la cantidad de flujo sobrante de cada arco, y representa el flujo que puede pasar por dicho arco sin que se viole la capacidad: cf(u,v)=c(u,v)-f(u,v), note que por la propiedad (i), cf(u,v)≥0</p>
<p>Una <strong>red residual</strong> es aquella formada por el conjunto de las aristas con capacidades residuales positivas que denotaremos por: Df= (u,v)∈E(D) | Cf(u,v)&gt;0.<br />
La <strong>capacidad residual de un camino</strong> es el mínimo de las capacidades residuales de sus arcos, donde: Cf(p)= min{cf(u,v) | (u,v) ∈p}<br />
Un <strong>camino aumentable</strong> es un camino p simple y dirigido de s a t, donde todos sus arcos tienen capacidad residual positiva:∀(u,v)∈p f(u,v)&gt;0.<br />
<strong>Un corte</strong> es una partición de D en dos componentes cualquiera <em>S</em> y <em>T</em>, donde <em>s∈S</em> y <em>t∈T</em>, que denotaremos por (S,T).<br />
La <strong>capacidad de un corte</strong> es la suma de las capacidades de los arcos que cruzan el corte, en el sentido de origen al destino.<br />
Definiremos como<strong> flujo de un corte</strong> a la suma de los flujos que cruzan dicho corte en dirección de <em>s</em> a <em>t</em>.</p>
<p>Veamos un pseudocódigo del algoritmo propuesto:</p>
<p>FORD-FULKERSON-METHOD(G, s, t)<br />
<strong>1 </strong> inicializar el flujo <em>f</em> a <em>0</em><br />
<strong>2</strong> <strong>while </strong>exista un <em>camino aumentable</em> <em>p</em> en <em>la red residual</em><br />
<strong>3</strong> <strong>do</strong> aumentar <em>cf(p)</em> en todas las aristas de <em>p</em><br />
<strong>4</strong> <strong>return</strong> f</p>
<p>En la línea 1 comenzamos con un flujo 0, que asegura el cumplimiento de las propiedades (i) y (ii), ya que por definición c(u,v)&gt;0 ∀(u,v)∈E(D).<br />
En la línea 2 trataremos repetidamente de obtener un camino aumentable p en Gf.<br />
En la línea 3 aumentamos el flujo f a través de todo el camino p por la capacidad residual de p<br />
Por último, en la línea 4, una vez que no hayan más caminos aumentables, el flujo obtenido es máximo.</p>
<h2>4. Correctitud del algoritmo de Ford-Fulkerson</h2>
<p>Para demostrar la correctitud del algoritmo tendremos que probar lo siguiente:<br />
Sea f un flujo en una red de flujo entre s y t. Entonces se cumple que f es un flujo máximo si solo si no hay caminos aumentables en Gf<br />
<strong>→</strong><strong>Sea f(G) el flujo máximo de G. Entonces no hay caminos aumentables en Gf</strong><br />
Para llegar a una contradicción, supongamos que existe al menos un camino aumentable en Gf y f es máximo.<br />
Entonces existe un camino simple entre s y t, donde f(u,v)&gt;0 ∀(u,v) ∈p, luego podemos aumentar el flujo a través de todo el camino sin violar ninguna de las propiedades debido a la elección de cf(p), luego el flujo f(G) aumentará al menos en 1 unidad en nuestro caso, que estamos trabajando con capacidades enteras. Después de ese proceso tendremos un nuevo flujo f’(G)=f(G)+k, donde k = cf(p)&gt;0. Luego, f’(G)&gt;f(G), y por tanto f(G) no es máximo, lo cual es una contradicción, luego lo supuesto es falso, y se cumple lo planteado.<br />
<strong>←</strong><strong> Si no hay caminos aumentables, entonces el flujo f que se tiene en ese momento es máximo.</strong><br />
Supongamos que no hay caminos aumentables en Gf. Sea S el conjunto de vértices que son alcanzables por s y T = V-S. Podemos definir el corte (S,T) donde s∈S y t∈T, ya que si t∈S entonces hubiera un camino aumentable. Fácilmente se puede demostrar que f(S,T)≤c(S,T) para todo corte de G, por la propiedad de conservación (i). Se puede notar f(S,T)=c(S,T), ya que toda arista que cruza el corte en Gf tiene flujo 0 por la forma en que construimos el corte, luego como f(G) ≤c(S,T) y tenemos f(G)=f(S,T)=c(S,T), entonces f(G) es máximo.</p>
<h2>5. Nuestra implementación del método Ford Fulkerson</h2>
<p>Ahora podemos ver el pseudocódigo de nuestra implementación del método Ford Fulkerson, adaptado a nuestro problema donde todas las aristas tienen capacidades de una unidad.</p>
<p><strong>FORD-FULKERSON</strong>(G, s, t)<br />
<strong>1</strong> <strong>foreach</strong> arco (u, v) en E[G]<br />
<strong>2</strong> <strong>do</strong> f[u, v] ← 0<br />
<strong>3</strong> f[v, u] ← 0<br />
<strong>4</strong> <strong>while</strong> BFS(s, t) en Gf<br />
<strong>5</strong> <strong>do</strong> f← f + 1<br />
<strong>6</strong> <strong>foreach</strong> arco (u, v) en p<br />
<strong>7</strong> <strong>do</strong> f[u, v] ← f[u, v] + 1 8 f[v, u] ← f[u, v] &#8211; 1<br />
<strong>9</strong> <strong>return </strong>f</p>
<p>En las líneas 1-3 inicializamos el flujo de cada arista en 0, para que se cumplan todas las propiedades del flujo.<br />
En la línea 4 verificamos la existencia de un camino aumentable en Gf mediante un BFS, que devuelve el camino más corto entre s y t, lo cual mejora la constante de nuestro algoritmo, aunque bien se podía utilizar cualquier otro método que nos dé un camino entre dos vértices de un grafo.<br />
En la línea 5, simplemente aumentamos el flujo en 1, ya que cada vez que se encuentra un nuevo camino aumentable, el flujo aumenta a lo sumo en 1, y todas las capacidades son enteras.<br />
En las líneas 6-8, sumamos una unidad al flujo de cada arista de p en Gf y restamos esta misma cantidad en G.<br />
En la línea 9 simplemente se devuelve el flujo máximo de la red de flujo definida por G, s y t, el cual sabemos que es máximo por el teorema demostrado en (4).</p>
<h2>6- Análisis del tiempo de ejecución</h2>
<p>El costo de reducir nuestro problema original de comprobar cuando o no hay m caminos entre dos conjuntos dados en el problema de encontrar el flujo máximo en una red dirigida es O(|V|) como se vio en la primera parte, donde en el grafo obtenido se tiene:</p>
<p><strong><em>|V|= 2+2n^2=O(n^2)</em></strong><br />
<strong><em>|E|= m+ 4n^2-4=O(n^2)</em></strong></p>
<p>El tiempo de ejecución del método Ford-Fulkerson depende principalmente de cómo se escoja el camino aumentable en cada paso del ciclo, en nuestro caso usamos BFS(G, s, t), que es O(|V|+|E|), y esta operación se hace a lo sumo f* veces, donde f* es el flujo máximo de G, que es el máximo de veces que se ejecuta el ciclo while de nuestro algoritmo. Luego tendremos un costo temporal:<br />
T(n) = O(|V|) + O((|V|+|E|) · f*), pero |V| es O(E), luego:<br />
= O(|V|) + O((|E|) · f*)=max(|V|,|E| · f*)<br />
Además, tenemos que el flujo máximo cumple que: <em>f*≤m≤4*(n-2)</em>, luego <em>f*</em> es <em>O(n)</em>, luego en total tenemos que nuestro algoritmo es:<br />
<em>O(|E| · f*)=O((n^2)n)=O(n^3)</em></p>
<p>Luego, hemos encontrado un algoritmo que calcula el flujo máximo en un grafo con características propias de nuestro problema en orden polinomial.</p>
<p><strong> Tendrás que disculparme por algunos errores en este post, sobre todo de notaciones y simbología</strong>. Esto se debe a que lo tuve que copiar desde un archivo PDF, y aún no he encontrado un buen plugin para wodpress para trabajar con notaciones matemáticas y simbología, a lo mejor me embullo y lo implemento yo mismo.</p>
<p>Ah, se me olvidaba, aquí está lo más importante: El código en C#. Cualquier duda (que seguro vas a tener unas cuantas) en los comentarios por favor.</p>
</div>


<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/programacion/el-problema-de-la-evacuacion-escape-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Genericidad en C#. Ejemplos</title>
		<link>http://www.puntopeek.com/programacion/genericidad-ejemplos-c-sharp/</link>
		<comments>http://www.puntopeek.com/programacion/genericidad-ejemplos-c-sharp/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 07:03:14 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[ejemplos C#]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=296</guid>
		<description><![CDATA[Si no sabes que es la genericidad, te aconsejo que prestes atención, porque sin duda esta nueva característica, que se presenta a partir de la versión 2.0 del Framework .Net, te cambiará totalmente la forma de ver las cosas y &#8230; <a href="http://www.puntopeek.com/programacion/genericidad-ejemplos-c-sharp/">seguir leyendo &#187;</a></p>


Entradas relacionadas<li><a href='http://www.puntopeek.com/tutoriales-c/herencia-programacion-en-c/' rel='bookmark' title='Permanent Link: Herencia en C#. Concepto y ejemplos'>Herencia en C#. Concepto y ejemplos</a></li>
<li><a href='http://www.puntopeek.com/programacion/linq-c-sharp-ejemplos-caracteristicas/' rel='bookmark' title='Permanent Link: LINQ con C#. Ejemplos'>LINQ con C#. Ejemplos</a></li>
]]></description>
			<content:encoded><![CDATA[<p>Si no sabes que es la genericidad, te aconsejo que prestes atención, porque sin duda esta nueva característica, que se presenta a partir de la versión 2.0 del Framework .Net, te cambiará totalmente la forma de ver las cosas y te facilitará la vida a la hora de crear un programa con C#.</p>
<h2>¿Qué es la genericidad?</h2>
<p>Primero lo primero. La <em>genericidad</em> nos permite pasar un tipo genérico (o más), como parámetro a un método, clase, estructura o interfaz. O sea, este nuevo tipo (que llamaremos &lt;T&gt;), viene a sustituir al tipo <em>object</em>, que es usado sobre todo en estructuras de propósito general, como son los arraylist, pilas (stack), colas (queue) y otras que usamos frecuentemente, en las cuales todos los elementos deben ser de un mismo tipo. Por ejemplo, en una lista de números, en la que no queremos que hayan datos de tipo <em>strings</em> o <em>char</em>, solo de tipo <em>int.</em> Ahora se preguntarán <strong>¿Por qué sustituir el tipo Object?</strong></p>
<p>Recuerden que todos los tipos en C# (<em>int</em>, long, <em>string</em>, <em>char</em>, etc) heredan de la clase <em>Object</em>, lo cual es una ventaja para algunas cosas, pero a la vez es un problema a la hora de chequear el tipo de los elementos que se insertan en estas estructuras, ya que no hay una forma rápida y eficaz de verificar que todos los elementos sean del mismo tipo, para controlar esto, tendríamos que <a href="www.carlospes.com/minidiccionario/casting.php" target="_blank">castear</a>* cada vez que queramos obtener un valor de dicha estructura, lo cual puede llevar a errores, por no mencionar que es algo muy pesado, incómodo de programar y hay una gran posibilidad de errores en <a title="tiempo de ejecución" href="http://es.wikipedia.org/wiki/Tiempo_de_ejecución" target="_blank">tiempo de ejecución</a>.</p>
<p>Al usar genericidad también tenemos que tener en cuenta algunos cambios (para bien) en nuestra forma de programar, pero es mejor verlo en la práctica, veamos un ejemplo:  Supongamos que queremos crear una clase con un método o función que nos devuelva el menor de dos valores de un mismo tipo. Utilizando la genericidad, tendríamos algo así:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">class</span> Ejemplo <span style="color: #008080; font-style: italic;">//T es el tipo de dato genérico</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">//Método que devuelve un elemento de tipo T que es el mínimo</span>
    <span style="color: #008080; font-style: italic;">//entre el elemento x y el elemento &lt;em&gt;y&lt;/em&gt;</span>
    T Minimo<span style="color: #000000;">&#40;</span>T x, T y<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
       <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> y<span style="color: #000000;">&#41;</span>
          <span style="color: #0600FF;">return</span> x<span style="color: #008000;">;</span>
       <span style="color: #0600FF;">else</span>
          <span style="color: #0600FF;">return</span> y<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Ahora veamos qué pasa cuando invocamos este método:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">//Supongamos que tenemos una clase Figura</span>
Figura f1 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Figura<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Figura f2 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Figura<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Ejemplo ej <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Ejemplo<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Figura min <span style="color: #008000;">=</span> ej.<span style="color: #0000FF;">Minimo</span><span style="color: #000000;">&#40;</span>f1, f2<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Este código ni siquiera se ejecutaría, y dará un error en <a href="http://es.wikipedia.org/wiki/Tiempo_de_compilación" target="_blank">tiempo de compilación</a> en la línea marcada de la clase <strong>Ejemplo&lt;T&gt;</strong> donde T es la clase Figura, ya que en ninguna parte especificamos cuando una instancia de <em>Figura</em> es menor, mayor o igual que otra, sin embargo, para el tipo <em>int </em>esto no supondría ningún problema verdad?</p>
<h2>¿Qué quiere decir esto?</h2>
<p>Cuando usemos genericidad tenemos que ser mucho más cuidadosos y formales cuando programemos, lo cual no es una mala práctica y es bueno ir acostumbrándose. Ahora arreglemos la clase <em>Ejemplo</em> para que el método <em>Minimo(T x, T y)</em> funcione con cualquier tipo de dato en general (que se pueda comparar):</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">class</span> Ejemplo where T<span style="color: #008000;">:</span> IComparable<span style="color: #008000;">;</span>
<span style="color: #000000;">&#123;</span>
    T Minimo<span style="color: #000000;">&#40;</span>T x, T y<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">int</span> c <span style="color: #008000;">=</span> x.<span style="color: #0000FF;">CompareTo</span><span style="color: #000000;">&#40;</span>y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>c<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">return</span> x<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">else</span>
            <span style="color: #0600FF;">return</span> y<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Ahora ya especificamos que T es un tipo que debe implementar la interfaz IComparable&lt;T&gt;. En otras palabras, obligamos a que los elementos de tipo T se pueden comparar entre ellos, ya que en otro caso, hallar el mínimo pierde el sentido. En estos casos, se utiliza la palabra reservada <em>where:</em> y a continuación todas las restricciones que debe cumplir T, separadas por coma.</p>
<p>Entonces usamos el método <em>CompareTo</em> que debe implementar toda clase T que sea <em>IComparable</em> para saber cuál es el menor elemento. Este método deberá devolver <strong>0 si x=y, 1 si x&gt;y,-1 si x&lt;y</strong>. Por tanto, el resultado de ejecutar <em>Minimo</em>, depende completamente de cómo implementemos el método <em>CompareTo()</em>.  Por ejemplo, si tenemos la clase Figura:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">class</span> Figura<span style="color: #008000;">:</span> IComparable
<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">//Supongamos que tenemos estos métodos implementados</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">long</span> Area<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">long</span> Perimetro<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">//Ahora implementamos el método &lt;em&gt;CompareTo&lt;/em&gt;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> CompareTo<span style="color: #000000;">&#40;</span>Figura f<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Area</span><span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span>f.<span style="color: #0000FF;">Area</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Area</span></pre></div></div>

<p>En este caso, decidimos que una Figura es mayor que otra, en función del área, pero podemos definir que se comparen por el diámetro, por el perímetro, etc. Noten que aquí si podemos usar los operadores binarios dentro del CompareTo, ya que en este caso comparamos implícitamente elementos de tipo long, que son IComparables por defecto.  Ya vas notando algunas ventajas de usar genericidad?</p>
<p>Ahora en un mismo método Mínimo, podemos devolver el elemento menor de cualquier tipo de dato que se pueda comparar, noten que este método nos servirá para Int, String, Long, Figuras, Personas y toda clase o tipo que implemente la interfaz IComparable.</p>
<p>Les dejo dos implementación de la clase <strong>Queue&lt;T&gt;</strong>, que es una cola con algunos métodos genéricos. En una de las implementaciones uso arrays, y en la otra colas enlazables. No lo he probado muy bien, pero funcionaba hace dos años cuando la implementé, jeje.</p>
<p>Veremos algunas otras cosas que podemos hacer con la genericidad en la segunda entrega de este tutorial, la semana próxima. Cualquier duda en los comentarios.</p>
<p>Descarga aquí el archivo en .zip:  <a href="http://www.puntopeek.com/wp-content/uploads/2010/06/cola.zip">Cola en C#</a></p>


<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/tutoriales-c/herencia-programacion-en-c/' rel='bookmark' title='Permanent Link: Herencia en C#. Concepto y ejemplos'>Herencia en C#. Concepto y ejemplos</a></li>
<li><a href='http://www.puntopeek.com/programacion/linq-c-sharp-ejemplos-caracteristicas/' rel='bookmark' title='Permanent Link: LINQ con C#. Ejemplos'>LINQ con C#. Ejemplos</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/programacion/genericidad-ejemplos-c-sharp/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Calcular el día de la semana con C#</title>
		<link>http://www.puntopeek.com/programacion/calcular-el-dia-de-la-semana-con-c/</link>
		<comments>http://www.puntopeek.com/programacion/calcular-el-dia-de-la-semana-con-c/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 08:36:46 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[ejemplos C#]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=236</guid>
		<description><![CDATA[Hoy les traigo un sencillo ejemplo, y muy usado en C# y otros lenguajes de programación. Es una sencilla pregunta, pero la respuesta no es tan sencilla.
Que día de la semana cae el 20 de abril del 2020?
Que día de &#8230; <a href="http://www.puntopeek.com/programacion/calcular-el-dia-de-la-semana-con-c/">seguir leyendo &#187;</a></p>


Entradas relacionadas<li><a href='http://www.puntopeek.com/programacion/creando-una-aplicacion-de-consola-c-sharp/' rel='bookmark' title='Permanent Link: Aplicaciones de Consola en C#'>Aplicaciones de Consola en C#</a></li>
]]></description>
			<content:encoded><![CDATA[<p>Hoy les traigo un sencillo ejemplo, y muy usado en C# y otros lenguajes de programación. Es una sencilla pregunta, pero la respuesta no es tan sencilla.</p>
<p>Que día de la semana cae el 20 de abril del 2020?</p>
<p>Que día de la semana será el 12 de agosto del 2011?</p>
<p>Estas respuestas sin la ayuda de la computadora solo algunos eruditos pueden responderlas (yo conozco a uno). El problema no es tan sencullo como dividir y hallar restos de división.<span id="more-236"></span></p>
<p>Primero hay que buscar una forma de guardar cuantos días tiene cada mes, teniendo en cuenta claro, si el año es bisiesto o no&#8230;</p>
<p>Recuerden que <strong>un año es bisiesto si es divisible entre 400 ó es divisible entre 4 y no entre 100</strong>.</p>
<p>Bueno, vamos a hacer un programa de consola, que primero le pida al usuario que entre una fecha válida, con su día, mes y año y luego imprimiremos en consola que día de la semana será o fue la fecha recibida.</p>
<p>Vamos al código:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">namespace</span> DiaDeLaSemana
<span style="color: #000000;">&#123;</span>
   <span style="color: #FF0000;">class</span> Class1
   <span style="color: #000000;">&#123;</span>
      <span style="color: #008080; font-style: italic;">//Esta es la aplicación de entrada</span>
      <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
      <span style="color: #000000;">&#123;</span>
         <span style="color: #0600FF;">while</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span>
	 <span style="color: #000000;">&#123;</span>
		<span style="color: #008080; font-style: italic;">//Pedimos que entre la fecha y validamos que</span>
                <span style="color: #008080; font-style: italic;">//los datos sean correctos</span>
                Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Escribe una fecha&quot;</span><span style="color: #008000;">+</span><span style="color: #666666;">'<span style="color: #008080; font-weight: bold;">\n</span>'</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Dia: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #FF0000;">int</span> d <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>d<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;=</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> break<span style="color: #008000;">;</span>
		Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Mes: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #FF0000;">int</span> m <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>m<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;=</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> break<span style="color: #008000;">;</span>
		Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Año: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #FF0000;">int</span> a <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>a<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;=</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> break<span style="color: #008000;">;</span>
                <span style="color: #008080; font-style: italic;">//Creamos un array con los días de la semanas</span>
		<span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> days <span style="color: #008000;">=</span> <span style="color: #000000;">&#123;</span><span style="color: #666666;">&quot;Domingo&quot;</span>, <span style="color: #666666;">&quot;Lunes&quot;</span>, <span style="color: #666666;">&quot;Martes&quot;</span>,
                <span style="color: #666666;">&quot;Miercoles&quot;</span>, <span style="color: #666666;">&quot;Jueves&quot;</span>, <span style="color: #666666;">&quot;Viernes&quot;</span>, <span style="color: #666666;">&quot;Sabado&quot;</span><span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
           <span style="color: #008080; font-style: italic;">//Esta es la respuesta, usando el método DayOfWeek()</span>
	   Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Ese dia es &quot;</span><span style="color: #008000;">+</span>days<span style="color: #000000;">&#91;</span>DayOfWeek<span style="color: #000000;">&#40;</span>d,m,a<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	 <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">int</span> DayOfWeek<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> day, <span style="color: #FF0000;">int</span> month, <span style="color: #FF0000;">int</span> year<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
	<span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> mesCode <span style="color: #008000;">=</span> <span style="color: #000000;">&#123;</span><span style="color: #FF0000;">0</span>,<span style="color: #FF0000;">6</span>,<span style="color: #FF0000;">2</span>,<span style="color: #FF0000;">2</span>,<span style="color: #FF0000;">5</span>,<span style="color: #FF0000;">0</span>,<span style="color: #FF0000;">3</span>,<span style="color: #FF0000;">5</span>,<span style="color: #FF0000;">1</span>,<span style="color: #FF0000;">4</span>,<span style="color: #FF0000;">6</span>,<span style="color: #FF0000;">2</span>,<span style="color: #FF0000;">4</span><span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
     <span style="color: #FF0000;">int</span> result <span style="color: #008000;">=</span> year<span style="color: #008000;">%</span>100 <span style="color: #008000;">+</span> <span style="color: #000000;">&#40;</span>year<span style="color: #008000;">%</span>100<span style="color: #000000;">&#41;</span><span style="color: #008000;">/</span><span style="color: #FF0000;">4</span> <span style="color: #008000;">+</span> day <span style="color: #008000;">+</span> mesCode<span style="color: #000000;">&#91;</span>month<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
&nbsp;
	<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">17</span><span style="color: #000000;">&#41;</span> result <span style="color: #008000;">+=</span> <span style="color: #FF0000;">5</span><span style="color: #008000;">;</span>
	<span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">18</span><span style="color: #000000;">&#41;</span> result <span style="color: #008000;">+=</span> <span style="color: #FF0000;">3</span><span style="color: #008000;">;</span>
	<span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">19</span><span style="color: #000000;">&#41;</span> result <span style="color: #008000;">+=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
	<span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">20</span><span style="color: #000000;">&#41;</span> result <span style="color: #008000;">+=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
	<span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">21</span><span style="color: #000000;">&#41;</span> result <span style="color: #008000;">+=</span> <span style="color: #008000;">-</span><span style="color: #FF0000;">2</span><span style="color: #008000;">;</span>
	<span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">22</span><span style="color: #000000;">&#41;</span>  result <span style="color: #008000;">+=</span> <span style="color: #008000;">-</span><span style="color: #FF0000;">4</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">//Vemos si es bisiesto y quitamos un día si</span>
        <span style="color: #008080; font-style: italic;">//el mes es enero o febrero</span>
	<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>EsBisiesto<span style="color: #000000;">&#40;</span>year<span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;</span>amp<span style="color: #008000;">;&amp;</span>amp<span style="color: #008000;">;</span> <span style="color: #000000;">&#40;</span>month<span style="color: #008000;">==</span><span style="color: #FF0000;">1</span> <span style="color: #008000;">||</span> month<span style="color: #008000;">==</span><span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
	    result <span style="color: #008000;">+=</span> <span style="color: #008000;">-</span><span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>	
&nbsp;
        <span style="color: #008080; font-style: italic;">//Esto devuelve un número entre 0 y 7</span>
        <span style="color: #008080; font-style: italic;">//que nos dá el día de la semana</span>
	<span style="color: #0600FF;">return</span> result<span style="color: #008000;">%</span>7<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">//Método para saber si un año es bisiesto</span>
    <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">bool</span> EsBisiesto<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> a<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>a<span style="color: #008000;">%</span>4<span style="color: #008000;">==</span><span style="color: #FF0000;">0</span> <span style="color: #008000;">&amp;</span>amp<span style="color: #008000;">;&amp;</span>amp<span style="color: #008000;">;</span> a<span style="color: #008000;">%</span>100<span style="color: #008000;">!=</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">||</span> a<span style="color: #008000;">%</span>400<span style="color: #008000;">==</span><span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Interesante verdad? Pues ya saben algo nuevo, si quieren este método puede ser un poco más elegante y con menos código, piensen en alguna otra solución y la discutimos en los comentarios.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 509px; width: 1px; height: 1px;">

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #666666;">'<span style="color: #008080; font-weight: bold;">\n</span>'</span></pre></div></div>

</div>


<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/programacion/creando-una-aplicacion-de-consola-c-sharp/' rel='bookmark' title='Permanent Link: Aplicaciones de Consola en C#'>Aplicaciones de Consola en C#</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/programacion/calcular-el-dia-de-la-semana-con-c/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Generando números aleatorios con C#</title>
		<link>http://www.puntopeek.com/programacion/la-clase-random-con-c/</link>
		<comments>http://www.puntopeek.com/programacion/la-clase-random-con-c/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 16:37:05 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Codigos C#]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/programacion/la-clase-random-con-c/</guid>
		<description><![CDATA[Hace un tiempo recibí un comentario en el que alguien preguntaba como crear un array de números aleatorios. Aunque hice este ejemplo en otro post (no recuerdo cual) vendría bien hablarles un poco más sobre la clase Random del namespace &#8230; <a href="http://www.puntopeek.com/programacion/la-clase-random-con-c/">seguir leyendo &#187;</a></p>


Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/mas-ejercicios-de-array-en-c/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (2)'>Ejercicios resueltos de array con C# (2)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/permutaciones-posibles-recursividad-c-sharp/' rel='bookmark' title='Permanent Link: Generando permutaciones en C#'>Generando permutaciones en C#</a></li>
]]></description>
			<content:encoded><![CDATA[<p>Hace un tiempo recibí un comentario en el que alguien preguntaba como crear un array de números aleatorios. Aunque hice este ejemplo en otro post (no recuerdo cual) vendría bien hablarles un poco más sobre la clase Random del namespace System.<span id="more-206"></span> La clase Random es la que nos permite hacer unas cuantas cosas con números aleatorios. Yo uso generalmente la uso para probar algoritmos y en alguno que otro proyecto. Luego veremos algunos ejemplos:  Aclarar que esta clase no es recomendada para encriptar cosas ni mucho menos, pero si vamos a poder conseguir un número aleatorio bastante respetable. Bueno, vamos ya:  En la clase Random con C# (también sirve en ASP.Net) tenemos tres métodos que nos generan un número aleatorio, pero primero de todo tenemos que crear una instancia de la clase Random:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Random r <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Random
<span style="color: #008080; font-style: italic;">// Creamos el objeto Random, que tiene un constructor por defecto</span>
<span style="color: #008080; font-style: italic;">// O para los más exigentes, añadimos un plus de</span>
<span style="color: #008080; font-style: italic;">// aleatoriedad, algo así:</span>
Random r <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Random<span style="color: #000000;">&#40;</span>DateTime.<span style="color: #0000FF;">Now</span>.<span style="color: #0000FF;">Millisecond</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Y una vez tenemos el objeto, utilizaremos uno de esos tres métodos.  <strong></strong></p>
<p><strong>1.- El método Next</strong> Tiene tres sobrecargas:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">int</span> aleatorio1 <span style="color: #008000;">=</span> r.<span style="color: #0000FF;">Next</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// Le imponemos un máximo</span>
<span style="color: #FF0000;">int</span> aleatorio2 <span style="color: #008000;">=</span> r.<span style="color: #0000FF;">Next</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">100</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// Le imponemos un rango, por ejemplo queremos</span>
<span style="color: #008080; font-style: italic;">// un número de 3 cifras</span>
<span style="color: #FF0000;">int</span> aleatorio3 <span style="color: #008000;">=</span> r.<span style="color: #0000FF;">Next</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">100</span>, <span style="color: #FF0000;">999</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// Queremos un número entre el 3 y el 12,</span>
<span style="color: #FF0000;">int</span> aleatorio4 <span style="color: #008000;">=</span> r.<span style="color: #0000FF;">Next</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">3</span>, <span style="color: #FF0000;">12</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>2.- El método NextDouble</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">// Devuelve un double entre 0 y 1</span>
<span style="color: #FF0000;">int</span> aleatorio5 <span style="color: #008000;">=</span> r.<span style="color: #0000FF;">NextDouble</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>3.- El método NextBytes</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> buffer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #FF0000;">100</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
r.<span style="color: #0000FF;">NextBytes</span><span style="color: #000000;">&#40;</span>buffer<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>¡¡Como ven, es super sencillo trabajar con esta clase, ahora veamos un ejemplo de como trabajar con esta clase.</p>
<p>1 &#8211; Crear un array de tamaño aleatorio con números aleatorios. Esto nos puede servir para probar varios métodos que usan arrays (ordenación, búsqueda, etc).</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">//Inicializamos la clase Random</span>
Random r <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Random<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//Creamos un array que va a contener cantidad</span>
<span style="color: #008080; font-style: italic;">//aleatoria de elementos menor que 50.</span>
<span style="color: #FF0000;">int</span> <span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> numeros <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">int</span> <span style="color: #000000;">&#91;</span>r.<span style="color: #0000FF;">Next</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">0</span>,<span style="color: #FF0000;">50</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//Recorremos el array y vamos asignando a cada</span>
<span style="color: #008080; font-style: italic;">//posición un número aleatorio</span>
<span style="color: #0600FF;">for</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i<span style="color: #008000;">=</span><span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&lt;</span>numeros.<span style="color: #0000FF;">Lenght</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
   numeros<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> r.<span style="color: #0000FF;">Next</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">0</span>,<span style="color: #FF0000;">50</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Y hasta aquí, ya veremos después como es por dentro esta clase&#8230;</p>


<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/mas-ejercicios-de-array-en-c/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (2)'>Ejercicios resueltos de array con C# (2)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/permutaciones-posibles-recursividad-c-sharp/' rel='bookmark' title='Permanent Link: Generando permutaciones en C#'>Generando permutaciones en C#</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/programacion/la-clase-random-con-c/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 1.321 seconds -->

