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

<channel>
	<title>Programación y desarrollo web &#187; Codigos C#</title>
	<atom:link href="http://www.puntopeek.com/category/codigos-c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.puntopeek.com</link>
	<description>Programación en C#, PHP y software libre</description>
	<lastBuildDate>Thu, 26 Jan 2012 04:30:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>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>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>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>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>Cola con Prioridad en C#</title>
		<link>http://www.puntopeek.com/codigos-c/cola-prioridad-heap-codigo-en-c-sharp/</link>
		<comments>http://www.puntopeek.com/codigos-c/cola-prioridad-heap-codigo-en-c-sharp/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 07:22:00 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[estructuras C#]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=390</guid>
		<description><![CDATA[Existen diversas formas de implementar una cola con prioridad, pero en casi todas, alguna de las operaciones principales son en O(n). En este post, veremos una forma eficiente de implementar esta estructura usando un Árbol Parcialmente Ordenado (Heap).


Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/la-clase-arbol-en-c/' rel='bookmark' title='Permanent Link: La clase Arbol en C#'>La clase Arbol en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/la-clase-linkednode-en-c-interfaz-ilist/' rel='bookmark' title='Permanent Link: La clase LinkedNode en C#. Interfaz Ilist'>La clase LinkedNode en C#. Interfaz Ilist</a></li>
]]></description>
			<content:encoded><![CDATA[<p>Cuando hablamos de<strong> colas con prioridad </strong>hablamos de una lista de elementos ordenados según su prioridad, que es una función asignada a cada elemento de la cola.</p>
<p>La estructura cola (queue) está basada en el principio que plantea que “el primero en entrar a la cola es el primero en salir (First In First Out), de aquí que a estas estructuras se le llaman <em>(FIFO)</em>. En este caso no se va a cumplir este principio, ya que los elementos van a estar ordenados en función de la prioridad. Las operaciones que definiremos sobre una cola con prioridad son:</p>
<p><strong>Insertar</strong> &#8211; Inserta un elemento en la cola con prioridad. Luego de esta operación, el elemento insertado estará en su posición de acuerdo con su prioridad.</p>
<p><strong>Extrae-Min (Extrae-Max)</strong> – Extrae el elemento de mayor prioridad de la cola.</p>
<p><strong>Devuelve-Min (Devuelve-Max)</strong> – Retorna el elemento de mayor prioridad, pero no lo elimina.</p>
<p>Esta estructura pudiera ser útil, por ejemplo, en la sala de urgencia de un hospital, donde cada paciente debe ser atendido en función de su gravedad. Luego, con esta estructura podríamos formar un orden entre los pacientes logrando que los pacientes mas graves fueran atendidos primero.</p>
<p>Existen diversas formas de implementar esta estructura, pero en casi todas, alguna de las operaciones principales (ExtraeMin o Insertar) son de orden lineal respecto a la cantidad n de elementos que se almacenan. En este post, veremos cómo lograr una buena implementación de esta estructura usando un tipo de árbol binario que cumple ciertas características, llamado <strong>Árbol Parcialmente Ordenado (Heap)</strong>, donde ambas operaciones serán <em>O(log(n))</em>. Veamos formalmente que es un <em>heap</em>.</p>
<h2>Que es un Heap?</h2>
<p>Un Heap es un árbol que tiene las siguientes características:</p>
<p>i. Es un árbol binario.<br />
ii. Todos los niveles están llenos, excepto, quizás, el último.<br />
iii. Los niveles se van llenando de izquierda a derecha. Si el árbol no es completo, en el último nivel, las hojas están agrupadas a la izquierda.<br />
iv. Cada nodo tiene una prioridad mayor que la de sus dos hijos.</p>
<p><a href="http://www.puntopeek.com/wp-content/uploads/2011/01/heap.png"><img class="alignnone size-full wp-image-391" title="heap" src="http://www.puntopeek.com/wp-content/uploads/2011/01/heap.png" alt="heap Cola con Prioridad en C#" width="467" height="211" /></a></p>
<h2>Heap como árbol parcialmente ordenado</h2>
<p>Lo primero que podemos ver es que puede haber varios elementos con una misma prioridad, y lo segundo es que el árbol no está ordenado completamente, es decir, entre sus hijos no hay prioridad. Como vimos en el post anterior con los <a href="http://www.puntopeek.com/codigos-c/la-clase-arbol-en-c/">arboles binarios de búsquedas</a>, donde el hijo izquierdo tenía que ser menor que el padre y este a su vez, menor que el hijo derecho. De aquí que este tipo de árbol binario se conoce como <strong>Árbol Parcialmente Ordenado</strong>, porque no define un orden total entre sus nodos.</p>
<p>Como hablamos de un árbol binario, podríamos pensar en representar un Heap con un arreglo donde A[0] es la raíz del árbol, el hijo izquierdo del nodo i será A[2*i+1] y el derecho A[2*i+2].</p>
<h2>Operaciones con el Heap</h2>
<p>Veamos ahora como serían los métodos para garantizar que las operaciones sean O(log(n)):<br />
<strong>DEVUELVE-MIN</strong>(<em>Heap h</em>)<br />
1 <strong>if</strong>(count(h)&gt;0)<br />
2  <strong>do return</strong> A[0]</p>
<p>Claramente este primer método es bastante sencillo, ya que el elemento de mayor prioridad siempre va a ser la raíz</p>
<p><strong>EXTRAE-MIN</strong>(Heap H)<br />
1  <strong>Intercambiar</strong>(0,n);<br />
2  H[n] ←null;<br />
3  n←n+1<br />
4  <strong>HEAPIFY</strong>( 0);</p>
<p>En Extrae-Min lo que hacemos es eliminar el nodo raíz y poner el ultimo nodo a la derecha del primer nivel como raíz, disminuimos la cantidad de elementos y llamamos a un método llamado recursivo heapify que será el encargado de ubicar al elemento A[0] en su posición de acuerdo a su prioridad. Para esto, lo que hace es en cada paso del algoritmo ver si se viola alguna de las condiciones, y en caso positivo, lo intercambiar con el hijo de menor prioridad, esto es lo que hace que las operaciones sean O(log(n)), veamos un pseudocódigo para ilustrar mejor la idea:</p>
<p><strong>HEAPIFY</strong> (Heap H, nodo i)<br />
1  <strong>if</strong>(i&lt;left(i) and i&lt;right(i))<br />
2  <strong>do return</strong>;<br />
3  max = <strong>Max</strong>(left(i), right(i);<br />
4  <strong>Intercambiar</strong>(i,max);<br />
5 <strong> Heapify</strong>(H, max);</p>
<p>Luego, el método Insert(Heap H, x) sería agregar el nuevo elemento al final del array que representa el Heap y hacer heapify, pero en este caso en el orden contrario, desde las hojas hacia la raíz. A continuación el pseudocódigo:</p>
<p><strong>INSERT</strong>(Heap H, x)<br />
1  n←n+1<br />
2  H[n] ←x;<br />
4  <strong>HEAPIFY</strong>( n);</p>
<p>Esto es básicamente una buena implementación de Heap con array, que mejora un poco la representación por Arbol, ya que para insertar un nuevo elemento, nos evitamos el trabajo de buscar cual es la hoja más a la derecha, que como sabemos, en la representación por array será el nodo de la posición n.</p>
<h2>Código en C# de un Heap</h2>
<p>Bueno, aquí les dejo una <a href="http://www.puntopeek.com/wp-content/uploads/2011/01/Heap.zip"><strong>implementación de Heap en C#</strong></a> que hice el año pasado como parte de una tarea. El código está bien comentado y entendible. De cualquier forma, si ves algún error o tienes alguna duda, en los comentarios. <a href="http://www.codeproject.com/KB/recipes/priorityqueue.aspx">Otra implementación</a> que he usado es proyectos más grandes es la que ofrecen en CodeProjects, que es una clase PriorityQueue mucho más completa, con más métodos y propiedades.</p>


<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/la-clase-arbol-en-c/' rel='bookmark' title='Permanent Link: La clase Arbol en C#'>La clase Arbol en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/la-clase-linkednode-en-c-interfaz-ilist/' rel='bookmark' title='Permanent Link: La clase LinkedNode en C#. Interfaz Ilist'>La clase LinkedNode en C#. Interfaz Ilist</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/cola-prioridad-heap-codigo-en-c-sharp/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>La clase Arbol en C#</title>
		<link>http://www.puntopeek.com/codigos-c/la-clase-arbol-en-c/</link>
		<comments>http://www.puntopeek.com/codigos-c/la-clase-arbol-en-c/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 22:31:47 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[arboles]]></category>
		<category><![CDATA[clases]]></category>
		<category><![CDATA[estructuras C#]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=384</guid>
		<description><![CDATA[Los árboles son una de las estructuras de datos más comunes en la programación de software para almacenar y procesar datos, gracias a sus innumerables aplicaciones. En este post veremos algunas características de los árboles y las implementaciones de algunos &#8230; <a href="http://www.puntopeek.com/codigos-c/la-clase-arbol-en-c/">seguir leyendo &#187;</a></p>


Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/cola-prioridad-heap-codigo-en-c-sharp/' rel='bookmark' title='Permanent Link: Cola con Prioridad en C#'>Cola con Prioridad en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/la-clase-linkednode-en-c-interfaz-ilist/' rel='bookmark' title='Permanent Link: La clase LinkedNode en C#. Interfaz Ilist'>La clase LinkedNode en C#. Interfaz Ilist</a></li>
]]></description>
			<content:encoded><![CDATA[<p>Los árboles son una de las estructuras de datos más comunes en la programación de software para almacenar y procesar datos, gracias a sus innumerables aplicaciones. En este post veremos algunas características de los árboles y las implementaciones de algunos métodos y propiedades usando C#.</p>
<p>Informalmente, un árbol es una colección de objetos llamados nodos, de los cuales uno constituye la raíz. Sobre los nodos se define una relación “ser padre” que garantiza la estructura jerárquica entre los nodos. Como se puede apreciar, un hijo de un nodo de un árbol, es también un árbol, por lo que podemos definir un árbol recursivamente como una estructura formada por un nodo raíz r y un conjunto de árboles cuyas raíces son los hijos de r.</p>
<p><a href="http://www.puntopeek.com/wp-content/uploads/2010/11/arbol.png"><img class="alignnone size-full wp-image-385" title="arbol" src="http://www.puntopeek.com/wp-content/uploads/2010/11/arbol.png" alt="arbol La clase Arbol en C#" width="320" height="200" /></a></p>
<h2>Algunas definiciones</h2>
<p>Un nodo es hoja si no es padre de ningún nodo.<br />
Un árbol que no tenga ningún nodo es un árbol nulo.<br />
Un árbol es ordenado si existe una relación de orden entre los hijos de un nodo.<br />
Un árbol binario es un árbol donde cada nodo tiene como máximo dos hijos. De igual forma podemos definir un árbol k-ario, donde cada nodo tiene a lo sumo k hijos.<br />
Un árbol binario ordenado es un árbol donde cada nodo tiene un hijo izquierdo y un hijo derecho.<br />
Veamos algunos métodos y propiedades que se pueden tener en un árbol:</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;">void</span> Add<span style="color: #000000;">&#40;</span>T x<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#40;</span>agrega un objeto al árbol<span style="color: #000000;">&#41;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> Contains<span style="color: #000000;">&#40;</span>T x<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#40;</span>dice si el árbol contiene el objeto especificado<span style="color: #000000;">&#41;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Widht<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#40;</span>devuelve el ancho del árbol, o sea el total de hojas<span style="color: #000000;">&#41;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Height<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#40;</span>devuelve la altura del árbol, que es la mayor distancia desde la raíz a una de la hojas<span style="color: #000000;">&#41;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">object</span> Value<span style="color: #000000;">&#123;</span>get<span style="color: #008000;">;</span><span style="color: #000000;">&#125;</span> <span style="color: #000000;">&#40;</span>devuelve el valor de la raíz del árbol<span style="color: #000000;">&#41;</span></pre></div></div>

<p>Nota: Si no estás familiarizado con la notación “T x” utilizada para clases genéricas, puedes leer aquí sobre <a href="http://www.puntopeek.com/programacion/genericidad-ejemplos-c-sharp/">genericidad en C#</a>.</p>
<p>Existen varias formas de recorrer un árbol, en dependencia de cómo estén ordenados, los recorridos más comunes son preorden, entreorden, a lo ancho y postorden.</p>
<p>PreOrden: Este recorrido imprime primero los padres y después los hijos en preorden. El algoritmo sería el siguiente:</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;">void</span> Preorder<span style="color: #000000;">&#40;</span>Tree t<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>T key <span style="color: #0600FF;">in</span> t.<span style="color: #0000FF;">Keys</span><span style="color: #000000;">&#41;</span>
     <span style="color: #008080; font-style: italic;">//Imprime la llave i-esima</span>
     Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>key<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Tree child <span style="color: #0600FF;">in</span> t.<span style="color: #0000FF;">Childs</span><span style="color: #000000;">&#41;</span>
     <span style="color: #008080; font-style: italic;">//Recorrer en preorden el hijo i-esimo</span>
     Preorder<span style="color: #000000;">&#40;</span>child<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>El resultado de este recorrido para el árbol de la figura anterior sería A, B, C, D, E, F.</p>
<p>EntreOrden: Primero se imprime el primer hijo izquierdo con su recorrido EntreOrden, después la raíz, y luego el segundo hijo en EntreOrden, y así sucesivamente los restantes hijos. Si el árbol en cuestión es un árbol binario ordenado (ABB) el recorrido sería exactamente una ordenación de los elementos de dicho árbol, ya que hay un orden establecido entre los hijos, pero luego trataremos un post completo sobre los árboles binarios de búsqueda, que tienen algunas aplicaciones y propiedades importantes.</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: #0600FF;">void</span> EntreOrden <span style="color: #000000;">&#40;</span>Tree t<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>t.<span style="color: #0000FF;">Childs</span>.<span style="color: #0000FF;">Length</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>
      <span style="color: #008080; font-style: italic;">// Recorre en simétrico el primer hijo</span>
      EntreOrden<span style="color: #000000;">&#40;</span>t.<span style="color: #0000FF;">Childs</span><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: #008000;">;</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;">1</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> t.<span style="color: #0000FF;">Childs</span>.<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: #000000;">&#123;</span>
      <span style="color: #008080; font-style: italic;">// Imprime la llave (i-1)-esima</span>
      Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>t.<span style="color: #0000FF;">Keys</span><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: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #008080; font-style: italic;">// Recorre en entreorden el hijo i-esimo</span>
      EntreOrden<span style="color: #000000;">&#40;</span>t.<span style="color: #0000FF;">Childs</span><span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Para el ejemplo anterior tendríamos el siguiente recorrido: B, A, D, C, E, F<br />
PostOrden: Se recorren primero los hijos y luego los padres en postorden.</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: #0600FF;">void</span> PostOrden<span style="color: #000000;">&#40;</span>Tree t<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Tree child <span style="color: #0600FF;">in</span> t.<span style="color: #0000FF;">Childs</span><span style="color: #000000;">&#41;</span>
      <span style="color: #008080; font-style: italic;">// Recorre en postorden el hijo i-esimo</span>
      PostOrden<span style="color: #000000;">&#40;</span>child<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>T key <span style="color: #0600FF;">in</span> t.<span style="color: #0000FF;">Keys</span><span style="color: #000000;">&#41;</span>
      <span style="color: #008080; font-style: italic;">// Imprime la llave i-esima</span>
      Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>key<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>El recorrido postorden para el ejemplo sería B, D, E, F, C, A</p>
<p>Por último, le dejo algunos códigos que hice hace algunos años donde pueden ver otros métodos y funcionalidades de la clase árbol (añadir elementos, eliminar, altura, espejo, ancho, recorridos, dibujar arbol,  etc), también añadí la clase <strong>árbol binario</strong>, que hereda de la <strong>clase árbol</strong>, y una aplicación de consola donde se prueban varios métodos de estas clases.</p>
<p>Espero que les sirva de ayuda. Si tienen alguna duda con el código, dejen su comentario.</p>
<p><a href="http://www.puntopeek.com/wp-content/uploads/2010/11/ArbolClass.zip" target="_blank">Descargar Código</a></p>


<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/cola-prioridad-heap-codigo-en-c-sharp/' rel='bookmark' title='Permanent Link: Cola con Prioridad en C#'>Cola con Prioridad en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/la-clase-linkednode-en-c-interfaz-ilist/' rel='bookmark' title='Permanent Link: La clase LinkedNode en C#. Interfaz Ilist'>La clase LinkedNode en C#. Interfaz Ilist</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/la-clase-arbol-en-c/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Calcular el día de la semana C#</title>
		<link>http://www.puntopeek.com/codigos-c/calcular-el-dia-de-la-semana-c/</link>
		<comments>http://www.puntopeek.com/codigos-c/calcular-el-dia-de-la-semana-c/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 08:10:19 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[ejercicios C#]]></category>
		<category><![CDATA[resueltos]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=381</guid>
		<description><![CDATA[Hola, esta vez les traigo un programa clásico, que es de los primeros que hay que hacer al iniciarse en la programación, calcular el día de la semana (lunes, martes, miércoles&#8230;) a partir de una fecha (1/2/2021).
Lo primero es saber &#8230; <a href="http://www.puntopeek.com/codigos-c/calcular-el-dia-de-la-semana-c/">seguir leyendo &#187;</a></p>


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[<p>Hola, esta vez les traigo un programa clásico, que es de los primeros que hay que hacer al iniciarse en la programación, calcular el día de la semana (lunes, martes, miércoles&#8230;) a partir de una fecha (1/2/2021).</p>
<p>Lo primero es saber q esto se puede hacer de muchas formas, pero hay que tener en cuenta algunas cosas, como por ejemplo, que pasa cuando el año es bisiesto, cuando febrero tiene 29 días, etc&#8230;</p>
<p>Bueno, aquí les dejo un código que hice cuando estaba en primer año para resolver este problema, sencillo pero nada trivial. Si tienen alguna otra solución estaría encantado de que la compartieran, para ver entre todos cual es la mejor forma de hacer esta función.</p>
<p>Bueno, aquí les pongo el código, que consiste en un método: DayOfWeek(int dia, int mes, int año) y la clase Main, en la que hice un pequeño programa de consola para que introduzcan una fecha, y imprima el día de la semana correspondiente, incluso en mi facultad, había uno de mis compañeros, que podía hacer esto en la mente, en menos de 2 segundos, aún me pregunto como lo hacía, sin más, el código:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">namespace</span> DiaDeLaSemana
<span style="color: #000000;">&#123;</span>
   <span style="color: #FF0000;">class</span> Class1
   <span style="color: #000000;">&#123;</span>
      <span style="color: #008080; font-style: italic;">//Esta es la entrada principal del programa</span>
      <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
      <span style="color: #000000;">&#123;</span>
         <span style="color: #0600FF;">while</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span>
         <span style="color: #000000;">&#123;</span>
            Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">'<span style="color: #008080; font-weight: bold;">\n</span>'</span><span style="color: #008000;">+</span><span style="color: #666666;">&quot;Escribe una fecha &quot;</span><span style="color: #008000;">+</span><span style="color: #666666;">'<span style="color: #008080; font-weight: bold;">\n</span>'</span><span style="color: #008000;">+</span><span style="color: #666666;">&quot;
            Escribe un numero menor q '0' para salir&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Dia: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">int</span> d <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>d<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;=</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> break<span style="color: #008000;">;</span>
            Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Mes: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">int</span> m <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>m<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;=</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> break<span style="color: #008000;">;</span>
            Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Año: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">int</span> a <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>a<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;=</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> break<span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> days <span style="color: #008000;">=</span> <span style="color: #000000;">&#123;</span><span style="color: #666666;">&quot;Domingo&quot;</span>, <span style="color: #666666;">&quot;Lunes&quot;</span>, <span style="color: #666666;">&quot;Martes&quot;</span>,
            <span style="color: #666666;">&quot;Miercoles&quot;</span>, <span style="color: #666666;">&quot;Jueves&quot;</span>, <span style="color: #666666;">&quot;Viernes&quot;</span>, <span style="color: #666666;">&quot;Sabado&quot;</span><span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">int</span> dia<span style="color: #008000;">=</span> DayOfWeek<span style="color: #000000;">&#40;</span>d,m,a<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;Ese dia es &quot;</span><span style="color: #008000;">+</span>days<span style="color: #000000;">&#91;</span>dia<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
         <span style="color: #000000;">&#125;</span>
      <span style="color: #000000;">&#125;</span>
&nbsp;
      <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">int</span> DayOfWeek<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> day, <span style="color: #FF0000;">int</span> month, <span style="color: #FF0000;">int</span> year<span style="color: #000000;">&#41;</span>
      <span style="color: #000000;">&#123;</span>
         <span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> mesCode <span style="color: #008000;">=</span> <span style="color: #000000;">&#123;</span><span style="color: #FF0000;">0</span>,<span style="color: #FF0000;">6</span>,<span style="color: #FF0000;">2</span>,<span style="color: #FF0000;">2</span>,<span style="color: #FF0000;">5</span>,<span style="color: #FF0000;">0</span>,<span style="color: #FF0000;">3</span>,<span style="color: #FF0000;">5</span>,<span style="color: #FF0000;">1</span>,<span style="color: #FF0000;">4</span>,<span style="color: #FF0000;">6</span>,<span style="color: #FF0000;">2</span>,<span style="color: #FF0000;">4</span><span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
         <span style="color: #FF0000;">int</span> result <span style="color: #008000;">=</span> year<span style="color: #008000;">%</span>100 <span style="color: #008000;">+</span> <span style="color: #000000;">&#40;</span>year<span style="color: #008000;">%</span>100<span style="color: #000000;">&#41;</span><span style="color: #008000;">/</span><span style="color: #FF0000;">4</span> <span style="color: #008000;">+</span> day <span style="color: #008000;">+</span> mesCode<span style="color: #000000;">&#91;</span>month<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
&nbsp;
         <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">17</span><span style="color: #000000;">&#41;</span>
            result <span style="color: #008000;">+=</span> <span style="color: #FF0000;">5</span><span style="color: #008000;">;</span>
         <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">18</span><span style="color: #000000;">&#41;</span> result <span style="color: #008000;">+=</span> <span style="color: #FF0000;">3</span><span style="color: #008000;">;</span>
         <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">19</span><span style="color: #000000;">&#41;</span> result <span style="color: #008000;">+=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
         <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">20</span><span style="color: #000000;">&#41;</span> result <span style="color: #008000;">+=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
         <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">21</span><span style="color: #000000;">&#41;</span> result <span style="color: #008000;">+=</span> <span style="color: #008000;">-</span><span style="color: #FF0000;">2</span><span style="color: #008000;">;</span>
         <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>year<span style="color: #008000;">/</span><span style="color: #FF0000;">100</span><span style="color: #008000;">==</span><span style="color: #FF0000;">22</span><span style="color: #000000;">&#41;</span>  result <span style="color: #008000;">+=</span> <span style="color: #008000;">-</span><span style="color: #FF0000;">4</span><span style="color: #008000;">;</span>
&nbsp;
         <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>EsBisiesto<span style="color: #000000;">&#40;</span>year<span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;</span>amp<span style="color: #008000;">;&amp;</span>amp<span style="color: #008000;">;</span> <span style="color: #000000;">&#40;</span>month<span style="color: #008000;">==</span><span style="color: #FF0000;">1</span> <span style="color: #008000;">||</span> month<span style="color: #008000;">==</span><span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
            result <span style="color: #008000;">+=</span> <span style="color: #008000;">-</span><span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
&nbsp;
         <span style="color: #0600FF;">return</span> result<span style="color: #008000;">%</span>7<span style="color: #008000;">;</span>
      <span style="color: #000000;">&#125;</span>
&nbsp;
      <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">bool</span> EsBisiesto<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> a<span style="color: #000000;">&#41;</span>
      <span style="color: #000000;">&#123;</span>
         <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>a<span style="color: #008000;">%</span>4<span style="color: #008000;">==</span><span style="color: #FF0000;">0</span> <span style="color: #008000;">&amp;</span>amp<span style="color: #008000;">;&amp;</span>amp<span style="color: #008000;">;</span> a<span style="color: #008000;">%</span>100<span style="color: #008000;">!=</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">||</span> a<span style="color: #008000;">%</span>400<span style="color: #008000;">==</span><span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
      <span style="color: #000000;">&#125;</span>
   <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Bueno, la tarea va a ser entender lo que hace este método, y para que se necesita el array mesCode. Cualquier duda en los comentarios.</p>


<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/calcular-el-dia-de-la-semana-c/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>El método de ordenación QuickSort</title>
		<link>http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/</link>
		<comments>http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 05:20:32 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[array]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=374</guid>
		<description><![CDATA[Hoy les presento un método de ordenación que ha dado muy buenos resultados y es considerado el método de ordenación más rápido que existe, de ahí viene su nombre tan sugerente: QuickSort. Aunque su caso peor es O(n2), la probabilidad &#8230; <a href="http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/">seguir leyendo &#187;</a></p>


Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/ordenacion-por-burbuja-en-c/' rel='bookmark' title='Permanent Link: Ordenacion por burbuja en C#'>Ordenacion por burbuja en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/el-metodo-de-ordenacion-merge-sort/' rel='bookmark' title='Permanent Link: Ordenación por mezcla en C#'>Ordenación por mezcla en C#</a></li>
]]></description>
			<content:encoded><![CDATA[<p>Hoy les presento un método de ordenación que ha dado muy buenos resultados y es considerado el <strong>método de ordenación más rápido que existe</strong>, de ahí viene su nombre tan sugerente: QuickSort. Aunque su caso peor es O(<em>n</em><sup>2</sup>), la probabilidad de que esto ocurra es muy baja si tomamos algunas de sus variantes aleatorias. Su caso promedio es O(<em>n</em> log <em>n</em>) y es lo que determina la eficiencia de este método.</p>
<p>La idea de este algoritmo de ordenación es particionar el arreglo de elementos en dos subarreglos, no necesariamente de igual tamaño, donde cualquier elemento de la primera será menor que todo elemento de la segunda partición. Esto se logra seleccionando un valor aleatorio del arreglo, y una vez realizada esta parte del algoritmo, se aplica el algoritmo recursivamente a cada una de los subarreglos semiordenados.</p>
<p>En la práctica, se usa QuickSort hasta obtener subarreglos de un tamaño fijo mucho menor (una longitud que ha traído buenos resultados es 20). Entonces se aplica <strong>Ordenación por Inserción </strong>a estos subarreglos, que es bastante eficiente cuando el arreglo está casi ordenado y hay pocas inversiones.</p>
<p>Veamos ahora el pseudocódigo, para entender un poco mejor que hace este maravilloso algoritmo de búsqueda:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">void</span> QuickSort<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: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
QuickSort<span style="color: #000000;">&#40;</span>A, <span style="color: #FF0000;">0</span>, A.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">void</span> QuickSort <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> p, <span style="color: #FF0000;">int</span> r<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
   <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>p <span style="color: #008000;">&lt;</span> r<span style="color: #000000;">&#41;</span>
   <span style="color: #000000;">&#123;</span>
      <span style="color: #FF0000;">int</span> q <span style="color: #008000;">=</span> Partition<span style="color: #000000;">&#40;</span>A, p, r<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #008080; font-style: italic;">//ordena los primeros q elementos</span>
      QuickSort <span style="color: #000000;">&#40;</span>A, p, q<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #008080; font-style: italic;">//ordena los restantes n - q elementos</span>
      QuickSort <span style="color: #000000;">&#40;</span>A, q <span style="color: #008000;">+</span> <span style="color: #FF0000;">1</span>, r<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #FF0000;">int</span> Partition<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> p, <span style="color: #FF0000;">int</span> r<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #008080; font-style: italic;">//elemento pivote del arreglo</span>
   <span style="color: #FF0000;">int</span> x <span style="color: #008000;">=</span> A<span style="color: #000000;">&#91;</span>p<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
   <span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> p <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
   <span style="color: #FF0000;">int</span> j <span style="color: #008000;">=</span> r <span style="color: #008000;">+</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</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: #0600FF;">do</span> j<span style="color: #008000;">--;</span> <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span>x <span style="color: #008000;">&lt;</span> A<span style="color: #000000;">&#91;</span>j<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF;">do</span> i<span style="color: #008000;">++;</span> <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span>A<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #008000;">&gt;</span> x<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>i <span style="color: #008000;">&gt;</span> j<span style="color: #000000;">&#41;</span>
         Swap<span style="color: #000000;">&#40;</span>A, i, j<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF;">else</span>
         <span style="color: #0600FF;">return</span> j<span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>El método Partition(), lo que hace es intercambiar elementos que estén invertidos, en función del pivote seleccionado. O sea, Pone a un lados, los elementos menores que el pivote, y al otro lado, los mayores.</p>
<p>Les dejo una implementación en C# que hice hace algún tiempo, si ven algún problema me dicen. Si tienen alguna duda o pregunta, en los comentarios.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">//Ordenacion rapida (QuickSort)</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> QuickSort<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: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   QuickSort<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">0</span>,a.<span style="color: #0000FF;">Length</span><span style="color: #008000;">-</span><span style="color: #FF0000;">1</span>,a<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> QuickSort<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> ini,<span style="color: #FF0000;">int</span> fin,<span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> a<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #FF0000;">int</span> left<span style="color: #008000;">=</span>ini<span style="color: #008000;">;</span>
   <span style="color: #FF0000;">int</span> right<span style="color: #008000;">=</span>fin<span style="color: #008000;">;</span>
   <span style="color: #FF0000;">int</span> mid<span style="color: #008000;">=</span>a<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#40;</span>ini<span style="color: #008000;">+</span>fin<span style="color: #000000;">&#41;</span><span style="color: #008000;">/</span><span style="color: #FF0000;">2</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
&nbsp;
   <span style="color: #0600FF;">do</span>
   <span style="color: #000000;">&#123;</span>
      <span style="color: #008080; font-style: italic;">//Este es el Partition</span>
      <span style="color: #0600FF;">while</span><span style="color: #000000;">&#40;</span>a<span style="color: #000000;">&#91;</span>left<span style="color: #000000;">&#93;</span><span style="color: #008000;">&lt;</span>mid<span style="color: #000000;">&#41;</span>
         left<span style="color: #008000;">++;</span>
      <span style="color: #0600FF;">while</span><span style="color: #000000;">&#40;</span>a<span style="color: #000000;">&#91;</span>right<span style="color: #000000;">&#93;</span><span style="color: #008000;">&gt;</span>mid<span style="color: #000000;">&#41;</span>
         right<span style="color: #008000;">--;</span>
      <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>left<span style="color: #008000;">&lt;=</span>right<span style="color: #000000;">&#41;</span>
      <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">//Intercambio los elementos</span>
        <span style="color: #008080; font-style: italic;">//si estan invertidos</span>
        <span style="color: #FF0000;">int</span> t<span style="color: #008000;">=</span>a<span style="color: #000000;">&#91;</span>left<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
        a<span style="color: #000000;">&#91;</span>left<span style="color: #000000;">&#93;</span><span style="color: #008000;">=</span>a<span style="color: #000000;">&#91;</span>right<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
        a<span style="color: #000000;">&#91;</span>right<span style="color: #000000;">&#93;</span><span style="color: #008000;">=</span>t<span style="color: #008000;">;</span>
        left<span style="color: #008000;">++;</span>
        right<span style="color: #008000;">--;</span>
      <span style="color: #000000;">&#125;</span>
   <span style="color: #000000;">&#125;</span>
   <span style="color: #0600FF;">while</span><span style="color: #000000;">&#40;</span>left<span style="color: #008000;">&lt;=</span>right<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
   <span style="color: #008080; font-style: italic;">//Ordeno recursivamente los dos subarreglos</span>
   <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>left<span style="color: #008000;">&lt;</span>fin<span style="color: #000000;">&#41;</span>
      QuickSort<span style="color: #000000;">&#40;</span>left,fin,a<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>right<span style="color: #008000;">&gt;</span>ini<span style="color: #000000;">&#41;</span>
      QuickSort<span style="color: #000000;">&#40;</span>ini,right,a<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>



<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/ordenacion-por-burbuja-en-c/' rel='bookmark' title='Permanent Link: Ordenacion por burbuja en C#'>Ordenacion por burbuja en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/el-metodo-de-ordenacion-merge-sort/' rel='bookmark' title='Permanent Link: Ordenación por mezcla en C#'>Ordenación por mezcla en C#</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ejercicios resueltos de string en C#</title>
		<link>http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/</link>
		<comments>http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 21:33:35 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[ejemplos C#]]></category>
		<category><![CDATA[ejercicios C#]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=283</guid>
		<description><![CDATA[Aquí les pongo unos cuantos ejercicios resueltos y códigos escritos en C# relacionados con el manejo de strings (cadenas) que seguro te ayudará de muchas formas a mejorar el uso de este popular tipo de dato. Pero primero veamos cuales &#8230; <a href="http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/">seguir leyendo &#187;</a></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/saber-palabra-subcadena-ejercicio-string-c-sharp/' rel='bookmark' title='Permanent Link: Identificar subcadenas en C#'>Identificar subcadenas en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/permutaciones-posibles-recursividad-c-sharp/' rel='bookmark' title='Permanent Link: Generando permutaciones en C#'>Generando permutaciones en C#</a></li>
<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>
<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>
]]></description>
			<content:encoded><![CDATA[<p>Aquí les pongo unos cuantos ejercicios resueltos y códigos escritos en C# relacionados con el manejo de strings (cadenas) que seguro te ayudará de muchas formas a mejorar el uso de este popular tipo de dato. Pero primero veamos cuales son los métodos y propiedades de esta clase String.<span id="more-283"></span> <strong>Métodos y propiedades fundamentales</strong> <em>public char this[int index] {get;} </em> Devuelve el caracter de la posición especificada de la cadena.  <em>public int Length {get;}</em> Devuelve la longitud de la cadena (cantidad de caracteres que contiene) empezando a contar desde 1.  <em>public string Insert(int startIndex, string value); </em> Inserta la cadena especificada a partir de la posición dada.  <em>public string Remove(int startIndex,int count);</em> Elimina el número especificado de caracteres a partir de la posición dada.  <em>public string[] Split(params char[] separator); </em> Busca las subcadenas contenidas dentro de la cadena, delimitándolas por los separadores que se le especifiquen, y las copia a un arreglo de cadenas.  <em>public string Substring(int startIndex);</em> Devuelve la subcadena contenida a partir de la posición especificada.  <em>public string Substring(int index, int length);</em> Devuelve la subcadena que empieza a partir del índice específico, y tiene la longitud indicada.  <strong>Ejercicios resueltos</strong> 1- Implemente un método que dado un string s cualquiera, devuelva un nuevo string que se el inverso de s. (ej: entrada: “puntopeek”; salida: “keepotnup”)</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Invierte<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> a<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
  <span style="color: #FF0000;">string</span> b <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">;</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;">&amp;</span>lt<span style="color: #008000;">;</span> a.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
    b <span style="color: #008000;">=</span> a<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #008000;">+</span> b<span style="color: #008000;">;</span>
  <span style="color: #0600FF;">return</span> b<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>2- Implemente una función que dado un string, una posición de comienzo y una cantidad de caracteres, devuelva una subcadena (substring) de una cadena dada a partir de los parámetros dados (ej: entrada: “puntopeek”, pos= 2, cant= 4; salida: “ntop”.)</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> SubString<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> a, <span style="color: #FF0000;">int</span> pos, <span style="color: #FF0000;">int</span> cant<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #FF0000;">string</span> pedazo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span> <span style="color: #008000;">;</span>
   <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>pos <span style="color: #008000;">+</span> cant<span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> a.<span style="color: #0000FF;">Length</span><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;&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #0600FF;">else</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> j <span style="color: #008000;">=</span> pos<span style="color: #008000;">;</span> j <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> cant <span style="color: #008000;">+</span> pos <span style="color: #008000;">;</span> j <span style="color: #008000;">++</span> <span style="color: #000000;">&#41;</span>
         pedazo <span style="color: #008000;">+=</span> a<span style="color: #000000;">&#91;</span>j<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF;">return</span> pedazo<span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>3- Implemente un método Replace, que reciba un string s, y dos caracteres old y new. Dicha función debe reemplazar todas las ocurrencias del caracter old por el carácter new, y devolver un nuevo string con dicha característica.  (ej: entrada: “programacion”, old= ‘a’, new=’i’; salida: “progrimicion”)</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Replace <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> a, <span style="color: #FF0000;">char</span> old, <span style="color: #FF0000;">char</span> <span style="color: #008000;">new</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #FF0000;">string</span> result <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">;</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;">&amp;</span>lt<span style="color: #008000;">;</span> a.<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: #000000;">&#123;</span>
      <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>a<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #008000;">==</span> old<span style="color: #000000;">&#41;</span>
         result <span style="color: #008000;">+=</span> new<span style="color: #008000;">;</span>
      <span style="color: #0600FF;">else</span>
         result <span style="color: #008000;">+=</span> a<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
   <span style="color: #0600FF;">return</span> result<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>4*- Implemente un método Combinar, que dado un string s, devuelva todas las combinaciones posibles que se pueden formar a partir de los caracteres de s. Este método es un poco más complicado, pero muy útil y práctico. Para esto usaremos recursividad, para ir generando todas las posibles combinaciones. (ej: entrada: “hoy”; salida: “hoy”, “hyo”, “ohy”, “oyh”, “yho”, “yoh”)</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;">void</span> Combina<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> s<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #FF0000;">bool</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> marcas <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">bool</span><span style="color: #000000;">&#91;</span>s.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
   Combina<span style="color: #000000;">&#40;</span>s, <span style="color: #666666;">&quot;&quot;</span>, marcas<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
<span style="color: #0600FF;">void</span> Combina<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> original, <span style="color: #FF0000;">string</span> combinado, <span style="color: #FF0000;">bool</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> marcas<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>original.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">==</span> combinado.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>
      Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>combinado<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</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;">&amp;</span>lt<span style="color: #008000;">;</span> marcas.<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: #000000;">&#123;</span>
      <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">!</span>marcas<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>
      <span style="color: #000000;">&#123;</span>
         marcas<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
         Combina<span style="color: #000000;">&#40;</span>original, combinado <span style="color: #008000;">+</span> original<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span>, marcas<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
         marcas<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>
      <span style="color: #000000;">&#125;</span>
   <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Si tienes alguna duda sobre los códigos anteriores, o quieres agregar algo, en los comentarios. Bueno, hasta aquí esta entrega de ejercicios resueltos. Espero que te sirva, y si quieres practicar, guíate por estos ejemplos y trata de implementar otros métodos relacionados con string, como son: 1- Eliminar un carácter dado de una cadena.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Eliminar<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> s, <span style="color: #FF0000;">char</span> c<span style="color: #000000;">&#41;</span>.</pre></div></div>

<p>2- Ver si un string es palíndromo ó no, o sea, se escribe igual al derecho que al revés.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">    <span style="color: #0600FF;">public</span>  <span style="color: #FF0000;">bool</span> EsPalindromo<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> s<span style="color: #000000;">&#41;</span></pre></div></div>

<p>3- Ver cuál es el letra que más se repite en una cadena.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">char</span> MasPopular<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> s<span style="color: #000000;">&#41;</span></pre></div></div>

<p>Es muy aconsejable que traten de hacer estos ejercicios solos, auxiliándose de los ejemplos anteriores. De todos modos pondré la respuesta de estos ejercicios en una próxima entrega la semana que viene.</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/saber-palabra-subcadena-ejercicio-string-c-sharp/' rel='bookmark' title='Permanent Link: Identificar subcadenas en C#'>Identificar subcadenas en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/permutaciones-posibles-recursividad-c-sharp/' rel='bookmark' title='Permanent Link: Generando permutaciones en C#'>Generando permutaciones en C#</a></li>
<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>
<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>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Tres formas de Invertir un String</title>
		<link>http://www.puntopeek.com/codigos-c/tres-formas-de-invertir-un-string/</link>
		<comments>http://www.puntopeek.com/codigos-c/tres-formas-de-invertir-un-string/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 06:09:00 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[recursividad]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=261</guid>
		<description><![CDATA[Estos son algunos ejemplos para que vean que en la programación hay muchas formas de hacer las cosas, aunque siempre hay una que es la más eficiente, aunque casi nunca es muy evidente.
Veamos como invertir un string de tres formas &#8230; <a href="http://www.puntopeek.com/codigos-c/tres-formas-de-invertir-un-string/">seguir leyendo &#187;</a></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/estructuras-de-c-pila-stack/' rel='bookmark' title='Permanent Link: Estructuras de C#. Pila (Stack)'>Estructuras de C#. Pila (Stack)</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>Estos son algunos ejemplos para que vean que en la programación hay muchas formas de hacer las cosas, aunque siempre hay una que es la más eficiente, aunque casi nunca es muy evidente.</p>
<p>Veamos como invertir un <a href="http://www.puntopeek.com/tutoriales-c/la-clase-string-en-c/">string</a> de tres formas distintas. Por ejemplo, si tenemos el string &#8220;puntopeek&#8221;, el método devolvería &#8220;keepotnup&#8221;.</p>
<p>Veamos el primer ejemplo, es el que casi todos conocemos, y es muy fácil de implementar, vamos recorriendo la palabra desde el ultimo caracter hasta el primero y vamos guardando cada letra en un nuevo string, que es el que devolverá el método. 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;">public</span> <span style="color: #FF0000;">string</span> Invertir<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> s<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
<span style="color: #FF0000;">string</span> aux <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//Recorremos el string en orden inverso</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> s.<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;">&amp;</span>gt<span style="color: #008000;">;=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i<span style="color: #008000;">--</span><span style="color: #000000;">&#41;</span>
aux <span style="color: #008000;">+=</span> s<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//retornamos la nueva cadena</span>
<span style="color: #0600FF;">return</span> aux<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Otra opción (pero hay que <a href="http://www.puntopeek.com/programacion/estructuras-de-c-pila-stack/">conocer que es una pila</a>), es ir guardando cada letra en una pila (stack), y luego cuando esten todas las letras las sacamos de la pila. Noten que en esta estructura, el primer elemento que entra, es el último en salir, por eso nos sirve también para invertir un string. El código sería este:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Invertir2<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> s<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
<span style="color: #008080; font-style: italic;">//Declaramos una pila usando genericidad.</span>
<span style="color: #008080; font-style: italic;">//Esto se puede hacer con el framework 2.0</span>
Stack stack <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Stack<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//Recorremos el string y vamos metiendo en la pila</span>
<span style="color: #008080; font-style: italic;">//cada caracter</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;">&amp;</span>lt<span style="color: #008000;">;</span> s.<span style="color: #0000FF;">Length</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
stack.<span style="color: #0000FF;">Push</span><span style="color: #000000;">&#40;</span>s<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #FF0000;">string</span> aux <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//Vamos sacando de la pila los caracteres y los</span>
<span style="color: #008080; font-style: italic;">//ponemos uno a uno en un nuevo string</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;">&amp;</span>lt<span style="color: #008000;">;</span> s.<span style="color: #0000FF;">Length</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
aux <span style="color: #008000;">+=</span> stack.<span style="color: #0000FF;">Pop</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">return</span> aux<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Ahora veremos la versión recursiva del problema. Si lo analizan paso a paso, verán que hace practicamente lo mismo que Invertir2. Como verán, este método no necesita almacenar ningun caracter, ni copiar, <a href="http://www.puntopeek.com/tutoriales-c/recursividad-con-c-1/">la recursividad</a> se encarga de todo. En realidad la recursividad funciona como una pila (Invertir2) pero no hay que declarar variables ni nada de eso. A veces algunos métodos recursivos parecen mágicos, pero una vez dominemos esta técnica dominaremos el arte de programar. Al menos lo esencial. Veamos el código:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Invertir3 <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> s, <span style="color: #FF0000;">int</span> lenght<span style="color: #000000;">&#41;</span>
<span style="color: #008080; font-style: italic;">//El parametro lenght es el tamaño del string s</span>
<span style="color: #000000;">&#123;</span>
<span style="color: #008080; font-style: italic;">//Condicion de parada</span>
<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>lenght <span style="color: #008000;">==</span> <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>
<span style="color: #0600FF;">return</span> s<span style="color: #008000;">;</span>
<span style="color: #0600FF;">else</span>
<span style="color: #008080; font-style: italic;">//Llamado recursivo</span>
<span style="color: #0600FF;">return</span> Invertir3 <span style="color: #000000;">&#40;</span>s.<span style="color: #0000FF;">Substring</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, s.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>, lenght <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>
<span style="color: #008000;">+</span> s<span style="color: #000000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">ToString</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>Para que se den cuenta de lo que hace el método, es necesario que le hagan un debug paso a paso, y vayan viendo como se transforman las variables locales. Si tienen alguna otra solución de como Invertir un string pueden ponerla en los comentarios. Y hasta aquí este post, espero escribir un poco más seguido, pero estoy con muchos proyectos en la universidad y mucho trabajo. Han oido hablar del WinZip o el WinRar? Proximamente estaremos hablando del Algoritmo de Huffman, que se utiliza mucho en el compactación de texto y archivos.</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/estructuras-de-c-pila-stack/' rel='bookmark' title='Permanent Link: Estructuras de C#. Pila (Stack)'>Estructuras de C#. Pila (Stack)</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/tres-formas-de-invertir-un-string/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

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

