<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2spanishfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Programación y desarrollo web</title>
	
	<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>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/puntopeek" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="puntopeek" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">puntopeek</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/content?lg=es&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://eur.i1.yimg.com/eur.yimg.com/i/es/my/addto1.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.feedness.com/alta/http://feeds.feedburner.com/puntopeek" src="http://www.feedness.com/ayuda/wp-content/square_b_sh_feed.gif">Subscribe with Feedness</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/puntopeek" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><item>
		<title>Insertar elemento en un array con C#</title>
		<link>http://www.puntopeek.com/codigos-c/insertar-elemento-en-array-c-sharp/</link>
		<comments>http://www.puntopeek.com/codigos-c/insertar-elemento-en-array-c-sharp/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 10:50:10 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[ejemplos C#]]></category>
		<category><![CDATA[ejercicios C#]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=555</guid>
		<description><![CDATA[Hay algunas operaciones importantes cuando trabajamos con array que provocan cambios en este. Insertar un elemento es una de ellas. En este post se verá la implementación en C# del método Inserta(a, index, valor) que asigna el valor x en la posición index del array a.


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/ejercicios-resueltos-de-array-en-c/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (1)'>Ejercicios resueltos de array con C# (1)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-de-c-3ra-parte/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (3)'>Ejercicios resueltos de array con C# (3)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/' rel='bookmark' title='Permanent Link: El método de ordenación QuickSort'>El método de ordenación QuickSort</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de string en C#'>Ejercicios resueltos de string en C#</a></li>
]]></description>
			<content:encoded><![CDATA[
<p>Hay algunas operaciones importantes cuando trabajamos con array que provocan cambios, por ejemplo, si tenemos un array a y un elemento <em>x</em>, haciendo<em> a[j] = x</em> se modifica el array, en este caso veremos como insertar un elemento en un array en una posición dada.</p>
<p>A continuación verás la implementación en C# del método <em>Inserta(a, index, valor)</em> que asigna el valor <em>x</em> en la posición <em>index </em>del array <em>a</em>, pero hay un detalle, y es que tenemos que desplazar los elementos a partir de la posición<em> i</em> en adelante. En este caso el elemento que esté en la última posición del array será eliminado, ya que en C#, el tamaño del array es fijo (no crece automáticamente como en otros lenguajes como Javascript) y no podemos insertar elementos en una posición negativa o que sea mayor que<em> a.Length-1</em>, que devuelve el tamaño del array &#8211; 1, ya que el primer índice del array es 0.</p>
<h2>Código en C#:</h2>

<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: #0600FF;">void</span> Inserta <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> a, <span style="color: #FF0000;">int</span> index, <span style="color: #FF0000;">int</span> valor<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>index<span style="color: #008000;">&gt;=</span><span style="color: #FF0000;">0</span> <span style="color: #008000;">&amp;&amp;</span> index<span style="color: #008000;">&lt;</span> a.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</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> a.<span style="color: #0000FF;">Length</span><span style="color: #008000;">-</span><span style="color: #FF0000;">1</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&gt;</span>index<span style="color: #008000;">;</span> i<span style="color: #008000;">--</span><span style="color: #000000;">&#41;</span>
		  a<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #008000;">=</span>a<span style="color: #000000;">&#91;</span>i<span style="color: #008000;">-</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
	      a<span style="color: #000000;">&#91;</span>index<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> valor<span style="color: #008000;">;</span>
	<span style="color: #000000;">&#125;</span>
	<span style="color: #0600FF;">else</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Posición no válida&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Si tienen alguna duda o alguna otra implementación de este método, en los comentarios por favor.</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/ejercicios-resueltos-de-array-en-c/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (1)'>Ejercicios resueltos de array con C# (1)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-de-c-3ra-parte/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (3)'>Ejercicios resueltos de array con C# (3)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/' rel='bookmark' title='Permanent Link: El método de ordenación QuickSort'>El método de ordenación QuickSort</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de string en C#'>Ejercicios resueltos de string en C#</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/insertar-elemento-en-array-c-sharp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10+ Consejos sobre CSS</title>
		<link>http://www.puntopeek.com/diseno-web/buenas-practicas-consejos-css-html/</link>
		<comments>http://www.puntopeek.com/diseno-web/buenas-practicas-consejos-css-html/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 08:45:57 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Diseño web]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=532</guid>
		<description><![CDATA[Estos son algunos consejos y buenas prácticas para aprovechar al máximo el lenguaje CSS, optimizar tus hojas de estilo y de alguna forma responder algunas preguntas que como yo, seguramente te has hecho en algún momento.


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[
<p>Algunos no creen que CSS (Cascade Style Sheets) sea un lenguaje de programación, pero junto a javascript hace de la www un lugar mejor, haciendo que nuestros diseños cobren vida y se reflejen nuestras ideas en los navegadores. Pero esto no es tan sencillo como piensan muchos.</p>
<p>El principal motivo de este post no es que aprendan CSS, sino mostrarles algunos consejos y sugerencias a tener en cuenta cuando se diseña con CSS, porque créanlo o no, todo el mundo tiene algo que decir sobre CSS.</p>
<p>1. <strong>La página debe ser usable y legible sin el CSS</strong>, teniendo en cuenta que es así como la ven los buscadores y muchos usuarios que usan navegadores de texto, o que no renderizan CSS.</p>
<p>2. <strong>Las propiedades (clases o capas) se escriben en minúsculas y sin caracteres especiales</strong>, utiliza clases cuando sea algún elemento de la página que se repite más de una vez, por ejemplo, si tienes este código HTML:</p>
<p>Código HTML:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;destacado&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h2</span>&gt;</span>Texto Destacado <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h2</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span> Este es un texto destacado, pero solo habrá uno<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span> 
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;noticia&quot;</span>&gt;</span>Esto es otra noticia dentro de la página<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;noticia&quot;</span>&gt;</span>Esta es la tercera noticia, que se repite<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;noticia&quot;</span>&gt;</span>Y esta es la cuarta noticia<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span></pre></div></div>

<p>Código CSS:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#destacado</span> <span style="color: #00AA00;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">red</span><span style="color: #00AA00;">;</span>
   <span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#destacado</span> h2 <span style="color: #00AA00;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1.4em</span><span style="color: #00AA00;">;</span>
   <span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> georgia<span style="color: #00AA00;">,</span> tahoma<span style="color: #00AA00;">,</span> <span style="color: #993333;">serif</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.noticia</span> <span style="color: #00AA00;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> grey<span style="color: #00AA00;">;</span>
   <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">.9em</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<div class="small"><a href="http://willxd.com/diferencias-entre-id-y-class/">Diferencias entre id y clase</a></div>
<p>3. </strong>Tabula bien todas las clases, y comenta los bloques por secciones</strong>, un ejemplo de una clase sería algo como:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.myclass</span> <span style="color: #00AA00;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">4px</span> <span style="color: #933;">20px</span><span style="color: #00AA00;">;</span>
       <span style="color: #000000; font-weight: bold;">margin-left</span><span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
       <span style="color: #000000; font-weight: bold;">text-decoration</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
       <span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>4. <strong>La mejor forma de enlazar un archivo .css desde el .html es poniendo la siguiente línea</strong> entre las etiquetas &#8220;head&#8221; del código fuente:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">&lt;link rel<span style="color: #00AA00;">=</span><span style="color: #ff0000;">'stylesheet'</span> href<span style="color: #00AA00;">=</span><span style="color: #ff0000;">'style.css'</span> type<span style="color: #00AA00;">=</span><span style="color: #ff0000;">'text/css'</span> media<span style="color: #00AA00;">=</span><span style="color: #ff0000;">'screen'</span> /<span style="color: #00AA00;">&gt;</span></pre></div></div>

<div class="small">Evita usar @import o insertar el código css junto con el de HTML</div>
<p>5. Cuando definas alguna familia de letras, <strong>añade al final algun tipo de letra genérico</strong>, como serif, sans-serif, cursive, o monospace y no hace falta que estén entre comillas. Por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"> <span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> helvetica<span style="color: #00AA00;">,</span> arial<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span></pre></div></div>

<p>6. <strong>Sobre el tamaño de la letra</strong>, algunos dicen que es mejor definirlas en % o em debido a que IE no permitía hacer zoom a las letras cuando estaban definidas en pixeles, pero últimamente he leído que es mejor en pixeles.</p>
<div class="small"><a href="http://kyleschaeffer.com/best-practices/css-font-size-em-vs-px-vs-pt-vs/">Best Practices CSS Font Size</a><br />
<a href="http://www.w3.org/QA/Tips/font-size">Font Size Specification W3C</a></div>
<p>7. <strong>El objetivo de utilizar un reset.css es el de reducir inconsistencias de navegación </strong>en cosas como la altura de las líneas por defecto, los márgenes y el tamaño de las fuentes. El razonamiento general fue discutido en un<a href="http://meyerweb.com/eric/thoughts/2007/04/18/reset-reasoning"> post de Eric Meyer </a> hace unos años. Yo personalmente utilizo el <a href="meyerweb.com/eric/tools/css/reset/"> reset.css </a> desarrollado por el mismo Meyer, aunque existen muchas versiones, pero esta es la más genérica y simple.</p>
<p>8. <strong>Utiliza algún IDE potente y olvídate de la vista previa en modo de diseño</strong> al estilo Dreamweaver. Ya cuando estás escribiendo código HTML y CSS tienes que hacerlo con una idea básica. Yo personalmente uso <a href="http://www.aptana.com/products/studio3/download"> Aptana Studio </a> , que es un IDE para desarrollo web súper profesional y gratis, con autocompletado en CSS y HTML, corrección de código, por no mencionar que permite crear proyectos usando JavaScript, PHP y Ruby on Rails.</p>
<p>9. <strong>Hay algunas técnicas y patrones de diseño</strong> que pueden ayudarte a reducir la cantidad de archivos de imágenes y recursos que uses para construir tu página: <a href="www.alistapart.com/articles/slidingdoors/"> CSS Sliding Doors </a>, <a href="css-tricks.com/158-css-sprites"> CSS Sprites </a>, etc. Siempre es bueno conocer este tipo de hacks.</p>
<p>10. Es importante también últimamente <strong>mantener y preparar la hoja de estilos para impresión y dispositivos móviles</strong>, que son una importante fuente de visitas en muchos casos.</p>
<p>11. <strong>Si <a href="validator.w3.org/">validas tu código</a> a medida que editas tu CSS</strong>, te evitarás muchos dolores de cabeza al final del proceso. De igual forma, asegúrate de que esa propiedad que estás utilizando esté disponible en la mayoría de los navegadores, y si vas a usar alguna de las nuevas, por ejemplo text-shadow, tienes que hacer algo como esto:<!--/p--></p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">text-shadow</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #cc00cc;">#000</span><span style="color: #00AA00;">;</span>
-webkit-<span style="color: #000000; font-weight: bold;">text-shadow</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #cc00cc;">#000</span><span style="color: #00AA00;">;</span>
-moz-<span style="color: #000000; font-weight: bold;">text-shadow</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #cc00cc;">#000</span><span style="color: #00AA00;">;</span></pre></div></div>

<div class="small">Esto se debe a que la propiedad text-shadow, está disponible para Webkit (Safari 3+), Opera 9.5, Firefox 3.1, y Konqueror, y se le añaden los prefijos –moz y –webkit para que se pongan bien en navegadores como Chrome y Firefox 3.0 o menor.</div>
<p>12. Y si quieres seguir leyendo sobre CSS, TripwireMagazine ha creado una recopilación de la mayor <a href="http://www.tripwiremagazine.com/2009/07/mega-css-resource-roundup.html"> lista de recursos </a> para CSS jamás mostrada. En ella se enumeran <strong>más de 155 recursos hacks y tutoriales</strong>.</p>



<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/diseno-web/buenas-practicas-consejos-css-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Identificar subcadenas en C#</title>
		<link>http://www.puntopeek.com/codigos-c/saber-palabra-subcadena-ejercicio-string-c-sharp/</link>
		<comments>http://www.puntopeek.com/codigos-c/saber-palabra-subcadena-ejercicio-string-c-sharp/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 09:09:21 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[ejemplos C#]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=517</guid>
		<description><![CDATA[Como saber en C# si una palabra contiene una subcadena dada. Por ejemplo, la palabra "puntopeek" contendrá la subcadena "peek"? En este post veremos un algoritmo bastante sencillo y podrás descargar el código de este y otros ejemplos del trabajo con String en C#.


Entradas relacionadas<li><a href='http://www.puntopeek.com/tutoriales-c/la-clase-string-en-c/' rel='bookmark' title='Permanent Link: La clase String en C#'>La clase String en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de string en C#'>Ejercicios resueltos de string en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/tres-formas-de-invertir-un-string/' rel='bookmark' title='Permanent Link: Tres formas de Invertir un String'>Tres formas de Invertir un String</a></li>
]]></description>
			<content:encoded><![CDATA[
<p>En este post veremos como saber en C# si una palabra contiene una subcadena dada. Por ejemplo, &#8220;puntopeek&#8221; contiene la subcadena &#8220;peek&#8221;? Para solucionar este problema, seguiremos la siguiente idea:</p>
<h2>Algoritmo</h2>
<p>1. Buscamos los dos primeros caracteres que coincidan<br />
2. A partir de esa posicion recorremos la palabra hasta ver si coincide completamente<br />
3. Si no coinciden, volvemos al paso 1</p>
<h2>Código en C# </h2>

<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;">bool</span> Contiene<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> palabra, <span style="color: #FF0000;">string</span> cadena<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</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> palabra.<span style="color: #0000FF;">Length</span><span style="color: #008000;">-</span>cadena.<span style="color: #0000FF;">Length</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
		<span style="color: #008080; font-style: italic;">//Si encontramos dos letras iguales</span>
		<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>palabra<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #008000;">==</span>cadena<span style="color: #000000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #FF0000;">bool</span> contenida <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
			<span style="color: #008080; font-style: italic;">//Recorremos la cadena desde la posición 1</span>
			<span style="color: #008080; font-style: italic;">//y comparamos con la palabra a partir de </span>
			<span style="color: #008080; font-style: italic;">//la posición donde las dos letras iguales</span>
			<span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> j <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span> j <span style="color: #008000;">&lt;</span> cadena.<span style="color: #0000FF;">Length</span><span style="color: #008000;">;</span> j<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
				<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>palabra<span style="color: #000000;">&#91;</span>i <span style="color: #008000;">+</span> j<span style="color: #000000;">&#93;</span> <span style="color: #008000;">!=</span> cadena<span style="color: #000000;">&#91;</span>j<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>
					contenida <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>
			<span style="color: #008080; font-style: italic;">//Si esta contenida</span>
			<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>contenida<span style="color: #000000;">&#41;</span> 
				<span style="color: #0600FF;">return</span> true<span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #008080; font-style: italic;">//Si no está contenida</span>
	<span style="color: #0600FF;">return</span> false<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<h2> Notas </h2>
<p>Es importante notar que aunque String, es una clase en C#, se puede tratar como un array de caracteres, y que el for se hace hasta palabra.Length-subcadena.Length, para que no de excepción. Si quieres saber más sobre este tema, puedes ver un post que escribí hace un tiempo sobre <a href="http://www.puntopeek.com/tutoriales-c/la-clase-string-en-c/">la clase String en C#</a>. También hay que decir que este ejercicio se puede hacer de otra forma más eficiente usando String Matching y algoritmos como KMP, pero no es el objetivo de este post.</p>
<p>Creo que el código está bien comentado, pero cualquier pregunta en los comentarios.</p>
<h2>Descargar Ejemplo</h2>
<p>Puedes <a href="http://www.puntopeek.com/wp-content/uploads/2011/10/String.zip">descargar este y otros ejemplos de string usando C#</a></p>



<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/tutoriales-c/la-clase-string-en-c/' rel='bookmark' title='Permanent Link: La clase String en C#'>La clase String en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de string en C#'>Ejercicios resueltos de string en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/tres-formas-de-invertir-un-string/' rel='bookmark' title='Permanent Link: Tres formas de Invertir un String'>Tres formas de Invertir un String</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/saber-palabra-subcadena-ejercicio-string-c-sharp/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<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>Métodos extensores en C#</title>
		<link>http://www.puntopeek.com/codigos-c/metodos-extensores-en-c-sharp-net/</link>
		<comments>http://www.puntopeek.com/codigos-c/metodos-extensores-en-c-sharp-net/#comments</comments>
		<pubDate>Sat, 09 Jul 2011 09:07:29 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[ejemplos C#]]></category>
		<category><![CDATA[metodos extensores]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=480</guid>
		<description><![CDATA[
Los métodos extensores son un recurso de C# a partir de la versión 3.0 y permite añadir métodos a tipos ya definidos sin tener que crear un tipo heredero, recompilar o modificar al tipo original de una forma muy sencilla &#8230; <a href="http://www.puntopeek.com/codigos-c/metodos-extensores-en-c-sharp-net/">seguir leyendo &#187;</a></p>


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[
<p>Los métodos extensores son un recurso de C# a partir de la versión 3.0 y permite <strong>añadir métodos a tipos ya definidos</strong> sin tener que crear un tipo heredero, recompilar o modificar al tipo original de una forma muy sencilla y con una sintaxis casi idéntica a la forma tradicional de declarar un método. En otras palabras, si queremos añadirle una funcionalidad a una clase o tipo ya definido anteriormente, no tendremos que modificarla, al no ser que vayamos a usar variables privadas de la clase o cosas por el estilo.</p>
<p>Se definen como <strong>métodos estáticos pertenecientes a una clase estática y no genérica</strong>; pero se llaman de la forma tradicional, como métodos de una instancia de una clase.</p>
<p>Se les pasa como primer parámetro this seguido del tipo de la clase a la cual se va a añadir el método; aquí tenemos un ejemplo de añadirle un método a la clase String de .Net:</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;">class</span> MyExtensions
<span style="color: #000000;">&#123;</span>
     <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">int</span> WordCount<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> <span style="color: #FF0000;">String</span> str<span style="color: #000000;">&#41;</span>
     <span style="color: #000000;">&#123;</span>
         <span style="color: #008080; font-style: italic;">//Split separa la cadena en un array de string utiizando los separadores especificados</span>
         <span style="color: #0600FF;">return</span> str.<span style="color: #0000FF;">Split</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> <span style="color: #FF0000;">char</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> <span style="color: #666666;">' '</span>, <span style="color: #666666;">'.'</span>, <span style="color: #666666;">'?'</span>, <span style="color: #666666;">';'</span> , <span style="color: #666666;">':'</span> <span style="color: #000000;">&#125;</span>, StringSplitOptions.<span style="color: #0000FF;">RemoveEmptyEntries</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Length</span><span style="color: #008000;">;</span>
     <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Utilizando este ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  <span style="color: #FF0000;">string</span> s <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;hello extension methods!&quot;</span><span style="color: #008000;">;</span>
  <span style="color: #FF0000;">int</span> count <span style="color: #008000;">=</span> s.<span style="color: #0000FF;">WordCount</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #008080; font-style: italic;">//Este código imprime: 3</span></pre></div></div>

<p>Este método podrá ser usado en todas las variables de tipo string,<strong> IntelliSense también los reconoce</strong> ya que no violan los principios de encapsulación, pues en realidad <strong>no modifican a la clase ni acceden a sus variables privadas</strong>.</p>
<p>Los métodos extensores se usan para extender una clase o interface; pero no para sobreescribirla. Un método extensor con el mismo nombre y signatura (parámetros) que un método de la clase o la interface, nunca será llamado: en tiempo de compilación, los métodos extensores <strong>tienen menor prioridad que los métodos definidos en el propio tipo</strong> y están definidos en el ámbito del namespace.</p>
<p>Veamos otro ejemplo un poco más complejo usando interfaces y genericidad:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">//Este método devuelve el mayor de una colección que sea </span>
<span style="color: #008080; font-style: italic;">//IEnumerable(List, array, LinkedList, etc)</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> T Mayor<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> IEnumerable items<span style="color: #000000;">&#41;</span> where T <span style="color: #008000;">:</span> IComparable
    <span style="color: #000000;">&#123;</span>
      T max <span style="color: #008000;">=</span> <span style="color: #0600FF;">default</span><span style="color: #000000;">&#40;</span>T<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #FF0000;">bool</span> empty <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
      <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>T x <span style="color: #0600FF;">in</span> items<span style="color: #000000;">&#41;</span>
      <span style="color: #000000;">&#123;</span>
        max <span style="color: #008000;">=</span> x<span style="color: #008000;">;</span> empty <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>  break<span style="color: #008000;">;</span>
      <span style="color: #000000;">&#125;</span>
      <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>empty<span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;The source cannot be empty&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>T x <span style="color: #0600FF;">in</span> items<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: #0000FF;">CompareTo</span><span style="color: #000000;">&#40;</span>max<span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
          max <span style="color: #008000;">=</span> x<span style="color: #008000;">;</span>
      <span style="color: #000000;">&#125;</span>
      <span style="color: #0600FF;">return</span> max<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span></pre></div></div>

<p>Como en el caso anterior, ahora en todas las clases que implementen la interfaz IEnumerable donde sus elementos se puedan comparar, tendremos un método Mayor, que devuelve el mayor elemento de la colección de objetos de tipo T genérico. Veamos algunos ejemplos de como usar este método:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><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: #000000;">&#123;</span> <span style="color: #FF0000;">10</span>, <span style="color: #008000;">-</span><span style="color: #FF0000;">60</span>, <span style="color: #FF0000;">20</span>, <span style="color: #008000;">-</span><span style="color: #FF0000;">50</span>, <span style="color: #FF0000;">30</span>, <span style="color: #008000;">-</span><span style="color: #FF0000;">40</span> <span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>numeros.<span style="color: #0000FF;">Mayor</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">=;</span>
<span style="color: #008080; font-style: italic;">//se va a imprimir 30</span></pre></div></div>

<p>Otro ejemplo podría ser:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">List colores <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List <span style="color: #000000;">&#123;</span> <span style="color: #666666;">&quot;rojo&quot;</span>, <span style="color: #666666;">&quot;verde&quot;</span>, <span style="color: #666666;">&quot;azul&quot;</span>, <span style="color: #666666;">&quot;blanco&quot;</span>, <span style="color: #666666;">&quot;negro&quot;</span><span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>colores.<span style="color: #0000FF;">Mayor</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;">//se va a imprimir verde, que es el mayor en orden alfabético</span></pre></div></div>

<p>Bueno, si quieren ver más ejemplos aquí les dejo unos cuantos <a href="http://www.puntopeek.com/wp-content/uploads/2011/07/metodos-extensores.zip">métodos extensores en C# para descargar</a> con sus probadores y todo, para que practiques y le saques el mayor partido a esta nueva característica de C#. Si tienes alguna duda, propuesta o no entiendes algo en los comentarios por favor. Proximamente estaremos hablando de LINQ, otra de las nuevas características de C# y .Net.</p>



<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/metodos-extensores-en-c-sharp-net/feed/</wfw:commentRss>
		<slash:comments>2</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>Como escoger una tipografía</title>
		<link>http://www.puntopeek.com/tipografias/como-escoger-una-tipografia/</link>
		<comments>http://www.puntopeek.com/tipografias/como-escoger-una-tipografia/#comments</comments>
		<pubDate>Thu, 12 May 2011 05:55:36 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Tipografías]]></category>
		<category><![CDATA[webfonts]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=449</guid>
		<description><![CDATA[Aquí se exponen cinco principios básicos para la selección y uso de tipos de letra, en un artículo de Dan Mayer que leí hace un tiempo en Smashing Magazine, un excelente blog sobre desarrollo web que siempre sigo.


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[
<p>Para muchos principiantes (me incluyo) la tarea de escoger las fuentes para un proyecto se hace un poco complicada, y casi siempre terminamos usando Verdana o Arial, y en el mejor de los casos Trebuchet, porque hemos leido en algún lado que es bastante legible. Pues la verdad, es que es bastante complicado seleccionar el tipo de letra correcta, por no decir mezclarlas, incluso para los diseñadores.</p>
<p>Bueno, aquí les dejo un artículo de <a href="http://portfolio.danmayer.com/">Dan Mayer</a> que leí hace un tiempo en <a href="http://www.smashingmagazine.com">Smashing Magazine</a>, en el cual expone cinco principios para la selección y uso de tipos de letra:</p>
<h3><a href="http://www.smashingmagazine.com/2010/12/14/what-font-should-i-use-five-principles-for-choosing-and-using-typefaces/">“What Font Should I Use?”: Five Principles for Choosing and Using Typefaces</a></h3>
<h2>Otros artículos que te pueden interesar:</h2>
<ul>
<li><a href="http://www.smashingmagazine.com/2011/03/24/how-to-choose-a-typeface/">How to Choose a Typeface</a></li>
<li><a href="http://www.smashingmagazine.com/2010/11/04/best-practices-of-combining-typefaces/">Best Practices of Combining Typefaces</a></li>
<li><a href="http://www.smashingmagazine.com/2011/03/02/the-font-face-rule-revisited-and-useful-tricks/">The @Font-Face Rule And Useful Web Font Tricks</a></li>
<li><a href="http://opentype.info/blog/2011/04/25/the-onion-layer-model-of-legibility/">The Onion Layer Model of Legibility</a></li>
</ul>



<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/tipografias/como-escoger-una-tipografia/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ordenación por mezcla en C#</title>
		<link>http://www.puntopeek.com/codigos-c/el-metodo-de-ordenacion-merge-sort/</link>
		<comments>http://www.puntopeek.com/codigos-c/el-metodo-de-ordenacion-merge-sort/#comments</comments>
		<pubDate>Sat, 02 Apr 2011 06:38:10 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[ordenación]]></category>
		<category><![CDATA[recursividad]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=429</guid>
		<description><![CDATA[Ya he publicado algunos algoritmos de ordenación como Ordenación por burbuja (Bubble Sort) y Ordenación Rápida (Quick Sort). Esta vez estaremos hablando de otro algoritmo recursivo bastante eficiente para ordenar elementos.


Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/' rel='bookmark' title='Permanent Link: El método de ordenación QuickSort'>El método de ordenación QuickSort</a></li>
]]></description>
			<content:encoded><![CDATA[
<p>Ya he publicado algunos algoritmos de ordenación como <em>Ordenación por burbuja</em> (Bubble Sort) y <em>Ordenación Rápida </em>(Quick Sort) implementados con C#. Esta vez estaremos hablando de <em>Ordenación por Mezcla</em> (Merge Sort), otro algoritmo recursivo bastante eficiente para ordenar un array, que tiene un <a href="http://www.lab.dit.upm.es/~lprg/material/apuntes/o/index.html" target="_blank">orden de complejidad</a> O(nlogn) al igual que Quick Sort. Fue desarrollado en 1945 por <a title="John Von Neumann" href="http://es.wikipedia.org/wiki/John_Von_Neumann">John Von Neumann</a> según wikipedia.</p>
<h2>Estrategia de Merge Sort</h2>
<p>Merge Sort está basado en la técnica de diseño de algoritmos <a href="../codigos-c/recursividad-con-c-2/">Divide y Vencerás</a>, de la cual se habló aquí mismo hace un tiempo. Recordando un poco, esta técina  consiste en dividir el problema a resolver en subproblemas del mismo tipo que a su vez se dividirán, mientras no sean suficientemente   pequeños o triviales.</p>
<p><a href="http://www.puntopeek.com/wp-content/uploads/2011/04/merge.png"><img class="alignnone size-full wp-image-430" title="merge" src="http://www.puntopeek.com/wp-content/uploads/2011/04/merge.png" alt="merge Ordenación por mezcla en C#" width="616" height="372" /></a></p>
<p>Veamos una panorámica de la <strong>estrategia que sigue</strong> este algoritmo para ordenar una secuencia S de n elementos:</p>
<ul>
<li>Si S tiene uno o ningún elemento, está ordenada</li>
<li>Si S tiene al menos dos elementos se divide en dos secuencias S1 y S2</li>
<li>S1 contiene los primeros n/2 elementos y S2 los restantes</li>
<li>Ordenar S1 y S2, aplicando recursivamente este procedimiento</li>
<li>Mezclar S1 y S2 en S, de forma que ya S1 y S2 estén ordenados</li>
</ul>
<p>Veamos ahora como sería la <strong>estrategia para mezclar</strong> las secuencias:</p>
<p>Se tienen referencias al principio de cada una de las secuencias a mezclar (S1 y S2). Mientras en alguna secuencia queden elementos, se inserta en la secuencia resultante (S) el menor de los elementos referenciados y se avanza esa referencia una posición.</p>
<h2>Pseudocódigo</h2>
<p>Como ven, la idea es bastante simple, pero programarla no tanto. Para no dar de golpe la solución, veamos primero un pseudocódigo del algoritmo:</p>
<pre><strong>function</strong> mergesort(<strong>array</strong> A[x..y])
<strong>begin</strong>
  <strong>if</strong> (x-y &gt; 1)):
    <strong>array</strong> A1 := mergesort(A[x..(<strong>int</strong>( x+y / 2))])
    <strong>array</strong> A2 := mergesort(A[<strong>int</strong>(1+(x+y / 2))..y])
    <strong>return</strong> merge(A1, A2)
  <strong>else:</strong>
    <strong>return</strong> A
<strong>end</strong>

<strong>function</strong> merge(<strong>array</strong> A1[0..n1], <strong>array</strong> A2[0..n2])
<strong>begin</strong>
  <strong>integer</strong> p1 := 0
  <strong>integer</strong> p2 := 0
  <strong>array</strong> R[0..(n1 + n2 + 2)]//suponiendo que n1 y n2 son las posiciones
  //del array y no el length de este mismo, de otro modo seria (n1 + n2)
  <strong>while</strong> (p1 &lt;= n1 <strong>or</strong> p2 &lt;= n2):
    <strong>if</strong> (p1 &lt;= n1 <strong>and</strong> A1[p1] &lt;= A2[p2]):
      R[p1 + p2] := A1[p1]
      p1 := p1 + 1

    <strong>else</strong>
      <strong>if</strong> (p2 &lt;= n2 <strong>and</strong> A1[p1] &gt; A2[p2]):
        R[p1 + p2] := A2[p2]
        p2 := p2 + 1
  <strong>return</strong> R
<strong>end
</strong></pre>
<h2>El código</h2>
<p>Básicamente, el pseudocódigo sigue la estrategia descrita anteriormente. Veamos el código en C# de una vez:</p>
<pre>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MergeSort
{
 class Program
 {
    static void Main(string[] args)
    {
       //Array desordenado inicial
       int[] nums = new int[] { 2, 7, 4, 7, 2, 9, 13, 4, 6, 8 };
       MergeSort(nums);

       //Imprimo el array ya ordenado
       for (int i = 0; i &lt; nums.Length; i++)
          Console.Write(nums[i]+" ");
       Console.ReadLine();
    }

    //Método portal que llama al método recursivo inicial
    public static void MergeSort(int[] x)
    {
       MergeSort(x, 0, x.Length - 1);
    }

    static private void MergeSort(int[] x, int desde, int hasta)
    {
       //Condicion de parada
       if (desde == hasta)
          return;

       //Calculo la mitad del array
       int mitad = (desde + hasta) / 2;

       //Voy a ordenar recursivamente la primera mitad
       //y luego la segunda
       MergeSort(x, desde, mitad);
       MergeSort(x, mitad + 1, hasta);

       //Mezclo las dos mitades ordenadas
       int[] aux = Merge(x, desde, mitad, mitad + 1, hasta);
       Array.Copy(aux, 0, x, desde, aux.Length);
    }

    //Método que mezcla las dos mitades ordenadas
    static private int[] Merge(int[] x, int desde1, int hasta1, int desde2, int hasta2)
    {
       int a = desde1;
       int b = desde2;
       int[] result = new int[hasta1 - desde1 + hasta2 - desde2 + 2];

       for (int i = 0; i &lt; result.Length; i++)
       {
          if (b != x.Length)
          {
             if (a &gt; hasta1 &amp;&amp; b &lt;= hasta2)
             {
                result[i] = x[b];
                b++;
             }
             if (b &gt; hasta2 &amp;&amp; a &lt;= hasta1)
             {
                result[i] = x[a];
                a++;
             }
             if (a &lt;= hasta1 &amp;&amp; b &lt;= hasta2)
             {
                if (x[b] &lt;= x[a])
                {
                   result[i] = x[b];
                   b++;
                }
                else
                {
                   result[i] = x[a];
                   a++;
                }
             }
          }
          else
          {
             if (a &lt;= hasta1)
             {
                result[i] = x[a];
                a++;
             }
          }
       }
       return result;
    }
  }
}</pre>
<p>Este código lo hice cuando estaba en 1er año, y ahora que lo veo (que ya estoy en 3ro), veo se que se pueden hacer unas cuantas mejoras, pero funciona perfectamente y está bastante comprensible, sobre todo para quien no está familiarizado con el algoritmo y la recursividad.</p>
<p>De todas formas dejo el zip para que puedan <a href="http://www.puntopeek.com/wp-content/uploads/2011/04/MergeSort.zip">descargar el proyecto completo</a>, lo único es que está en Visual Studio 2010. Si tienen alguna duda o aporte, en los comentarios.</p>



<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/' rel='bookmark' title='Permanent Link: El método de ordenación QuickSort'>El método de ordenación QuickSort</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/el-metodo-de-ordenacion-merge-sort/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Graphite, Template gratis de wordpress</title>
		<link>http://www.puntopeek.com/wordpress/graphite-template-gratis-de-wordpress/</link>
		<comments>http://www.puntopeek.com/wordpress/graphite-template-gratis-de-wordpress/#comments</comments>
		<pubDate>Wed, 16 Mar 2011 17:43:09 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[wordpress]]></category>
		<category><![CDATA[themes wordpress]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=419</guid>
		<description><![CDATA[Hoy les presento Graphite, un tema desarrollado por MediaLoot, con una gran calidad, muy bien diseñado, con administración personalizada y muy bien estructurado, de hecho cuenta con toda la calidad para ser de pago.


Entradas relacionadas<li><a href='http://www.puntopeek.com/wordpress/crear-themes-para-wordpress/' rel='bookmark' title='Permanent Link: Crear themes para wordpress'>Crear themes para wordpress</a></li>
]]></description>
			<content:encoded><![CDATA[
<p>Todos los que de una forma u otra nos dedicamos al diseño web, blogging, etc, en algún momento hemos oido por lo menos mencionar a Wordpress. Lamentablemente en la <a title="Sitio oficial de wordpress" href="http://wordpress.org/extend/themes/" target="_blank">página oficial de temas</a> de wordpress no hay suficientes temas de calidad o se hace muy difícil encontrarlos.</p>
<p>Hoy les presento Graphite, un tema desarrollado por MediaLoot, con una gran calidad, muy bien diseñado y estructurado, de hecho cuenta con toda la calidad para ser de pago.</p>
<p><a href="http://www.puntopeek.com/wp-content/uploads/2011/03/Blog_Screenshot.jpg"><img class="alignnone size-full wp-image-420" title="Blog_Screenshot" src="http://www.puntopeek.com/wp-content/uploads/2011/03/Blog_Screenshot.jpg" alt="Blog Screenshot Graphite, Template gratis de wordpress" width="610" height="510" /></a></p>
<p><a href="http://www.medialoot.com/graphite/" target="_blank">Vista previa</a> | <a href="http://medialoot.com/main/freebie/292/" target="_blank">Download</a> | <a href="http://medialoot.com/item/graphite-wordpress-template/">Sitio del autor</a></p>
<p>El tema Graphite es completamente funcional, <strong>gratis</strong> y perfecto para profesionales del desarr0llo y diseño web, se adapata especialmente para sitios de empresas o portafolios.</p>
<p><strong>Principales características:</strong></p>
<ul>
<li>Desarrollado desde 0 usando HTML5 y CSS3</li>
<li>Tipo de contenido para Portfolio</li>
<li>Administracion del tema personalizado</li>
<li>2 alternativas para jquery slider en el home</li>
<li>Administracion de las imágenes mostradas en el slider</li>
</ul>
<p>En caso de que quieras buscar más temas para <strong>wordpress</strong>, o este no sea el más conveniente para tu proyecto, puedes hechar un vistazo en <a href="http://www.smashingmagazine.com/2010/08/19/100-free-high-quality-wordpress-themes-for-2010/" target="_blank">Smashing Magazine</a></p>



<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/wordpress/crear-themes-para-wordpress/' rel='bookmark' title='Permanent Link: Crear themes para wordpress'>Crear themes para wordpress</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/wordpress/graphite-template-gratis-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>2</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>
	</channel>
</rss><!-- Dynamic Page Served (once) in 1.746 seconds -->

